Comment ajouter un attribut personnalisé à une commande dans Magento. Cela semble clair pour le produit et le client, mais je ne trouve aucune information pour ajouter des attributs supplémentaires aux commandes.
Comment ajouter un attribut personnalisé à une commande dans Magento. Cela semble clair pour le produit et le client, mais je ne trouve aucune information pour ajouter des attributs supplémentaires aux commandes.
Réponses:
Créez votre propre module et créez le Setup /InstallData.php
<?php
namespace Own\Module\Setup;
use Magento\Customer\Model\Customer;
use Magento\Framework\Encryption\Encryptor;
use Magento\Framework\Indexer\IndexerRegistry;
use Magento\Framework\Setup\UpgradeDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Catalog\Setup\CategorySetupFactory;
use Magento\Quote\Setup\QuoteSetupFactory;
use Magento\Sales\Setup\SalesSetupFactory;
/**
* @codeCoverageIgnore
*/
class InstallData implements InstallDataInterface
{
/**
* EAV setup factory
*
* @var EavSetupFactory
*/
private $eavSetupFactory;
/**
* Category setup factory
*
* @var CategorySetupFactory
*/
protected $categorySetupFactory;
/**
* Quote setup factory
*
* @var QuoteSetupFactory
*/
protected $quoteSetupFactory;
/**
* Sales setup factory
*
* @var SalesSetupFactory
*/
protected $salesSetupFactory;
/**
* Init
*
* @param CategorySetupFactory $categorySetupFactory
* @param SalesSetupFactory $salesSetupFactory
*/
public function __construct(
SalesSetupFactory $salesSetupFactory
) {
$this->salesSetupFactory = $salesSetupFactory;
}
/**
* {@inheritdoc}
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*/
public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
/** @var \Magento\Sales\Setup\SalesSetup $salesSetup */
$salesSetup = $this->salesSetupFactory->create(['setup' => $setup]);
/**
* Remove previous attributes
*/
$attributes = ['NEW_ATTRIBUTE'];
foreach ($attributes as $attr_to_remove){
$salesSetup->removeAttribute(\Magento\Sales\Model\Order::ENTITY,$attr_to_remove);
}
/**
* Add 'NEW_ATTRIBUTE' attributes for order
*/
$options = ['type' => 'varchar', 'visible' => false, 'required' => false];
$salesSetup->addAttribute('order', 'NEW_ATTRIBUTE', $options);
}
}
Vous pouvez également utiliser la même structure pour attribuer un nouvel attribut aux éléments. @RiccardoT pour vous aussi
Edit: Comment insérer des valeurs sur les nouveaux attributs (j'utilise ceci sur mon Model / Orders.php qui est un travail cron):
use Magento\Directory\Model\Currency;
use Magento\Framework\Api\AttributeValueFactory;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Framework\Pricing\PriceCurrencyInterface;
use Magento\Sales\Api\Data\OrderInterface;
use Magento\Sales\Api\Data\OrderStatusHistoryInterface;
use Magento\Sales\Model\Order\Payment;
use Magento\Sales\Model\ResourceModel\Order\Address\Collection;
use Magento\Sales\Model\ResourceModel\Order\Creditmemo\Collection as CreditmemoCollection;
use Magento\Sales\Model\ResourceModel\Order\Invoice\Collection as InvoiceCollection;
use Magento\Sales\Model\ResourceModel\Order\Item\Collection as ImportCollection;
use Magento\Sales\Model\ResourceModel\Order\Payment\Collection as PaymentCollection;
use Magento\Sales\Model\ResourceModel\Order\Shipment\Collection as ShipmentCollection;
use Magento\Sales\Model\ResourceModel\Order\Shipment\Track\Collection as TrackCollection;
use Magento\Sales\Model\ResourceModel\Order\Status\History\Collection as HistoryCollection;
class Orders
{
/**
* @param \Magento\Sales\Model\Order $order
*/
public function __construct(
\Magento\Sales\Model\Order $order,
\Psr\Log\LoggerInterface $loggerInterface,
\Magento\Sales\Api\OrderRepositoryInterface $orderRepositoryInterface
) {
$this->order = $order;
$this->logger = $loggerInterface;
$this->orderRepository = $orderRepositoryInterface;
}
public function execute(){
$order = $this->order->loadByIncrementId($incrementId);
$order->setNewAttribute('NEW VALUE');
$order->save();
}
}
C'est en général comment accéder à une commande et définir des valeurs pour les attributs.