Magento 2.1.1 Comment charger une commande avec un ID d'incrément à l'aide de l'objet OrderRepository


19

Quelle serait la dernière meilleure pratique pour charger Order en utilisant l'incrément ID (au lieu de Order ID) en utilisant OrderRepository


2
Pas un doublon - la réponse liée concerne la récupération de la commande par identifiant de commande, pas par identifiant d'incrément
Fabian Schmengler

ekk! Existe-t-il un moyen d'annuler la marque en double? Je voulais marquer la réponse ci-dessous comme la réponse à la solution.
frostshoxx

1
Trop tard, maintenant qu'il est déjà fermé. Mais j'ai proposé la réouverture de la question.
Fabian Schmengler du

Réponses:


32

Magento 2 utilise des contrats de service pour récupérer et enregistrer des objets. Dans Magento, cette couche est formée de référentiels, qui sont des gestionnaires get()et des save()méthodes. Cela éloigne le code utilisateur des appels du modèle. N'appelez pas les méthodes de modèle (comme load()ou save()ou loadByIncrementId()) directement, elles sont obsolètes car le code personnalisé doit utiliser les contrats de service. De plus, n'utilisez pas l'API depuis Magento comme Khoa le suggère, cela n'a pas de sens. L'API permet de connecter Magento à d'autres systèmes.

Injectez OrderRepository et SearchCriteriaBuilder dans votre constructeur:

private $orderRepository;
private $searchCriteriaBuilder;

public function __construct(
        \Magento\Framework\App\Helper\Context $context,
        \Magento\Sales\Model\OrderRepository $orderRepository,
        \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder
){
$this->orderRepository = $orderRepository;
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
parent::__construct($context);
}

Et dans votre fonction:

$searchCriteria = $this->searchCriteriaBuilder
    ->addFilter('increment_id', '000000001', 'eq')->create();
$orderList = $this->orderRepository->getList($searchCriteria)->getItems();

// $orderList is now an array of Orders with this incrementId, which is just one order obviously

/** @var \Magento\Sales\Model\Order $order */
$order = $orderList[0];
// Your logic here
$order = $this->orderRepository->save($order);

Guide officiel des développeurs PHP Magento sur magento.com

Code de Mulderea sur Github


Je reçois une erreur comme: Impossible d'utiliser un objet de type Magento \ Sales \ Model \ ResourceModel \ Order \ Collection comme tableau à $ order = $ orderList [0];
Ashish Raj

C'est étrange, j'ai un tableau. Sur quelle version êtes-vous? Mais avec une collection, vous pouvez simplement remplacer $order = $orderList[0]par $order = $orderList->getFirstItem()pour obtenir le premier (et le seul) élément de la collection.
Jacques

Je suis en version 2.1.3. et j'ai besoin de charger un objet de commande pour charger un objet de paiement .. J'ai fait $order = $orderList->getFirstItem(); $payment = $order->getPayment();Mais n'obtiens rien $payment Veuillez vérifier mon problème ici magento.stackexchange.com/questions/158935/…
Ashish Raj

1
J'ai eu un bug avec la réponse acceptée. Cela l'a résolu. Merci pour la bonne solution
CompactCode

Dans Magento 2.3.x, je dois obtenir la commande de cette façon:$order = $orderList['000000001'];
ph.dev

20

Pour autant que je sache, nous devrions utiliser \Magento\Sales\Api\Data\OrderInterface.

/** @var \Magento\Sales\Api\Data\OrderInterfaceFactory $order **/

protected $orderFactory;

public function __construct(
    \Magento\Sales\Api\Data\OrderInterfaceFactory $orderFactory,
    ......
) {
    $this->orderFactory = $orderFactory;

}

Charger l'objet de commande par ID d'incrément:

$this->orderFactory->create()->loadByIncrementId('00001952-42');

[EDIT] devrait essayer avec les contrats de service. Essayez la réponse de Jacco.


3
Veuillez ne pas utiliser de soulignements dans vos noms de variables. PHP a des modificateurs d'accès depuis PHP 5, qui a maintenant 12 ans. Vous devez utiliser des pratiques de programmation modernes, en particulier dans les réponses ici.
Jacques

1
Cette méthode ne doit pas être utilisée même si elle "fonctionne". Un: la di injection est un objet partagé à moins qu'il ne soit spécifié qu'il ne l'est pas; chaque fois que vous insérez OrderInterface, vous utiliserez exactement le même objet. Si vous voulez vraiment emprunter cette route, utilisez OrderInterfaceFactory puis appelez create (). Deuxièmement, vous devriez utiliser les contrats de service comme dans la réponse de Jacco.
Ian

2
version 2.2.2, utilisation \Magento\Sales\Api\OrderRepositoryInterfaceet sa get()méthode
LucScu

2
les contrats de service doivent être pris en considération.
Thiago Lima

1
@ThiagoLima oui, je suis d'accord avec toi! J'ai également voté la réponse aux contrats de service.
Khoa TruongDinh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.