Wie würde ich einer Bestellung in Magento ein benutzerdefiniertes Attribut hinzufügen? Es scheint für Produkt und Kunde klar zu sein, aber ich kann keine Informationen zum Hinzufügen zusätzlicher Attribute zu Bestellungen finden.
Wie würde ich einer Bestellung in Magento ein benutzerdefiniertes Attribut hinzufügen? Es scheint für Produkt und Kunde klar zu sein, aber ich kann keine Informationen zum Hinzufügen zusätzlicher Attribute zu Bestellungen finden.
Antworten:
Erstellen Sie Ihr eigenes Modul und erstellen Sie das 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);
}
}
Sie können dieselbe Struktur auch verwenden, um Elementen ein neues Attribut zuzuweisen. @ RiccardoT auch für Sie
Bearbeiten: So fügen Sie Werte in die neuen Attribute ein (ich verwende dies in meiner Model / Orders.php, die ein Cron-Job ist):
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();
}
}
Auf diese Weise erhalten Sie im Allgemeinen Zugriff auf eine Bestellung und können Werte für Attribute festlegen.