Magento 2 Benutzerdefinierte Spalte im Produktraster hinzufügen?


Antworten:


8

Danke an @Dhrumin.

Mein Arbeitscode hier:

app/code/[Vendor]/[Module]/registration.php

<?php

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    '[Vendor]_[Module]',
    __DIR__
);

app/code/[Vendor]/[Module]/etc/module.xml

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
    <module name="[Vendor]_[Module]" setup_version="0.0.1"/>
</config>

app/code/[Vendor]/[Module]/etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Sales\Block\Adminhtml\Order\Create\Search\Grid" type="[Vendor]\[Module]\Block\Adminhtml\Order\Create\Search\Grid" />
</config>

app/code/[Vendor]/[Module]/Block/Adminhtml/Order/Create/Search/Grid.php

<?php

namespace [Vendor]\[Module]\Block\Adminhtml\Order\Create\Search;

class Grid extends \Magento\Sales\Block\Adminhtml\Order\Create\Search\Grid
{
    /**
     * Grid constructor.
     * @param \Magento\Backend\Block\Template\Context $context
     * @param \Magento\Backend\Helper\Data $backendHelper
     * @param \Magento\Catalog\Model\ProductFactory $productFactory
     * @param \Magento\Catalog\Model\Config $catalogConfig
     * @param \Magento\Backend\Model\Session\Quote $sessionQuote
     * @param \Magento\Sales\Model\Config $salesConfig
     * @param array $data
     */
    public function __construct(
        \Magento\Backend\Block\Template\Context $context,
        \Magento\Backend\Helper\Data $backendHelper,
        \Magento\Catalog\Model\ProductFactory $productFactory,
        \Magento\Catalog\Model\Config $catalogConfig,
        \Magento\Backend\Model\Session\Quote $sessionQuote,
        \Magento\Sales\Model\Config $salesConfig,
        array $data = []
    )
    {
        $this->_productFactory = $productFactory;
        $this->_catalogConfig = $catalogConfig;
        $this->_sessionQuote = $sessionQuote;
        $this->_salesConfig = $salesConfig;
        parent::__construct($context, $backendHelper, $productFactory, $catalogConfig, $sessionQuote, $salesConfig, $data);
    }

    /**
     * Prepare collection to be displayed in the grid
     *
     * @return $this
     */
    protected function _prepareCollection()
    {
        $attributes = $this->_catalogConfig->getProductAttributes();
        /* @var $collection \Magento\Catalog\Model\ResourceModel\Product\Collection */
        $collection = $this->_productFactory->create()->getCollection();
        $collection->setStore(
            $this->getStore()
        )->addAttributeToSelect(
            $attributes
        )->addAttributeToSelect(
            'sku'
        )->addStoreFilter()->addAttributeToFilter(
            'type_id',
            $this->_salesConfig->getAvailableProductTypes()
        )->addAttributeToSelect(
            'gift_message_available'
        );

        $collection->joinField(
            'barcode_qty',
            'cataloginventory_stock_item',
            'qty',
            'product_id=entity_id',
            '{{table}}.stock_id=1 AND {{table}}.website_id=0',
            'left'
        );

        $this->setCollection($collection);

        $p = get_parent_class($this);
        $pp = get_parent_class($p);
        return $pp::_prepareCollection();
    }

    /**
     * Prepare columns
     *
     * @return $this
     */
    protected function _prepareColumns()
    {
        $this->addColumn(
            'entity_id',
            [
                'header' => __('ID'),
                'sortable' => true,
                'header_css_class' => 'col-id',
                'column_css_class' => 'col-id',
                'index' => 'entity_id'
            ]
        );

        $this->addColumn(
            'barcode_qty',
            [
                'header' => __('Quantity'),
                'type' => 'number',
                'index' => 'barcode_qty'
            ]
        );

        $this->addColumn(
            'name',
            [
                'header' => __('Product'),
                'renderer' => \Magento\Sales\Block\Adminhtml\Order\Create\Search\Grid\Renderer\Product::class,
                'index' => 'name'
            ]
        );
        $this->addColumn('sku', ['header' => __('SKU'), 'index' => 'sku']);
        $this->addColumn(
            'price',
            [
                'header' => __('Price'),
                'column_css_class' => 'price',
                'type' => 'currency',
                'currency_code' => $this->getStore()->getCurrentCurrencyCode(),
                'rate' => $this->getStore()->getBaseCurrency()->getRate($this->getStore()->getCurrentCurrencyCode()),
                'index' => 'price',
                'renderer' => \Magento\Sales\Block\Adminhtml\Order\Create\Search\Grid\Renderer\Price::class
            ]
        );

        $this->addColumn(
            'in_products',
            [
                'header' => __('Select'),
                'type' => 'checkbox',
                'name' => 'in_products',
                'values' => $this->_getSelectedProducts(),
                'index' => 'entity_id',
                'sortable' => false,
                'header_css_class' => 'col-select',
                'column_css_class' => 'col-select'
            ]
        );

        $this->addColumn(
            'qty',
            [
                'filter' => false,
                'sortable' => false,
                'header' => __('Quantity'),
                'renderer' => \Magento\Sales\Block\Adminhtml\Order\Create\Search\Grid\Renderer\Qty::class,
                'name' => 'qty',
                'inline_css' => 'qty',
                'type' => 'input',
                'validate_class' => 'validate-number',
                'index' => 'qty'
            ]
        );

        $p = get_parent_class($this);
        $pp = get_parent_class($p);
        return $pp::_prepareColumns();
    }

}

Ich hoffe es hilft.


1
DU BIST MEIN HELD DANKE GUT Übrigens verstehe ich nicht, dass das Magento-Team noch nie über diese Funktion nachgedacht hat. Ich denke, diese Funktion ist eine der Funktionen, die viele Magento-Benutzer praktisch benötigen. Ihr Vorschlag war großartig. Es war der häufigste Fehler, der ein vollständiges Objekt nicht mit dem ursprünglichen Objekt verkettet.
3CE

Ein großes Dankeschön geht an PHP docs get_parent_class : D
hayatbiralem

Übrigens, haben Sie eine Idee, wie Sie das benutzerdefinierte Feld dort sortieren können, wo ich es platzieren möchte? Ich wollte gerade view / adminhtml / ui_component überschreiben, konnte es aber nicht finden. Vielen Dank
3CE

Ich habe die _prepareColumnsFunktion aktualisiert . Wir haben die gesamte Kontrolle über Folgendes übernommen: D Sie müssen hier also keine ui_component überschreiben.
Hayatbiralem

5

Ja, ich finde die Lösung für meine Frage. Öffnen Sie die folgende Datei für den Pfad und überschreiben Sie sie in Ihrem benutzerdefinierten Modul.

vendor/magento/module-sales/Block/Adminhtml/Order/Create/Search/Grid.php

Und fügen Sie den folgenden Code in der _prepareCollection()Funktion hinzu:

$collection->joinField(
                'qty_in_stock',
                'cataloginventory_stock_item',
                'qty',
                'product_id=entity_id',
                '{{table}}.stock_id=1',
                'left'
        );

Fügen Sie nun den folgenden Code in die _prepareColumnsFunktion ein.

$this->addColumn(
                'qty_in_stock',
                [
                'header' => __('Quantity In Stock'),
                'type' => 'number',
                'index' => 'qty_in_stock'
                ]
        );

Hoffe es hilft dir.


Es funktioniert nicht bei M2.1.9
3CE

Vielen Dank! Es funktioniert auf M2.2.0. @ 3CE Entschuldigung. Mein vorheriger Vorschlag macht keinen Sinn. Ich denke, Sie müssen Ihren Code sehr sorgfältig prüfen, da ich viele Fehler gemacht habe. Zum Beispiel habe ich zuerst die falsche Klasse erweitert.
Hayatbiralem

@ Hayatbiralem Ja, ich denke du hast recht. Ich frage mich wirklich, warum mein Modul gerade nicht funktioniert. Könnten Sie einen Blick darauf werfen? Ich werde meinen Code aktualisieren.
3CE

@hayatbiralem Ich habe gerade meinen Code aktualisiert. Könnten Sie es sich ansehen? Vielen Dank!
3CE

Ja, ich habe es mir angesehen und das Problem gesehen, weil ich das gleiche Problem hatte. Überprüfen Sie meine Antwort :)
Hayatbiralem

0

Mithilfe von können wir eine neue benutzerdefinierte Spalte im Admin-Produktraster hinzufügen product_listing.xml.

Erstellen wir eine Datei view\adminhtml\ui_component\product_listing.xmlmit folgendem Inhalt:

<?xml version="1.0"?>

<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <columns name="product_columns" class="Magento\Catalog\Ui\Component\Listing\Columns">
       <column name="custom_field">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">text</item>
                    <item name="add_field" xsi:type="boolean">true</item>
                    <item name="label" xsi:type="string" translate="true">Custom Field</item>
                    <item name="sortOrder" xsi:type="number">75</item>
                </item>
            </argument>
        </column>
    </columns>
</listing>

Löschen Sie abschließend den Cache und überprüfen Sie die Ergebnisse.


0

BEARBEITEN

Schauen Sie sich @hayatbiralem Answer an. Danke


@ Hayatbiralem

Meine di.xml-Datei war gut, weil die leere Spalte gut erstellt wurde. Die Sache ist jedoch, dass keine Daten aus dem verbundenen Feld abgerufen werden konnten.

Geben Sie hier die Bildbeschreibung ein

<?php
/**
 * Created by -
 * Date: 13/05/2015
 * Time: 5:02 PM
 */
namespace Kbethos\Ordercreateqty\Block\Adminhtml;
use Magento\Framework\View\Element\Template;
class Grid extends \Magento\Sales\Block\Adminhtml\Order\Create\Search\Grid
{
    protected function _prepareCollection()
    {
        $attributes = $this->_catalogConfig->getProductAttributes();
        /* @var $collection \Magento\Catalog\Model\ResourceModel\Product\Collection */
        $collection = $this->_productFactory->create()->getCollection();



        $collection
        ->setStore(
            $this->getStore()
        )->addAttributeToSelect(
            $attributes
        )->addAttributeToSelect(
            'sku'
        )->addStoreFilter()->addAttributeToFilter(
            'type_id',
            $this->_salesConfig->getAvailableProductTypes()
        )->addAttributeToSelect(
            'gift_message_available'
        )->joinField(
                'qty_in_stock',
                'cataloginventory_stock_item',
                'qty',
                'product_id=entity_id',
                '{{table}}.stock_id=1',
                'left'
        );

        $this->setCollection($collection);
        return parent::_prepareCollection();
    }


    protected function _prepareColumns()
    {
        $this->addColumn(
            'entity_id',
            [
                'header' => __('ID'),
                'sortable' => true,
                'header_css_class' => 'col-id',
                'column_css_class' => 'col-id',
                'index' => 'entity_id'
            ]
        );
        $this->addColumn(
            'name',
            [
                'header' => __('Product'),
                'renderer' => 'Magento\Sales\Block\Adminhtml\Order\Create\Search\Grid\Renderer\Product',
                'index' => 'name'
            ]
        );
        $this->addColumn('sku', ['header' => __('SKU'), 'index' => 'sku']);
        $this->addColumn(
            'price',
            [
                'header' => __('Price'),
                'column_css_class' => 'price',
                'type' => 'currency',
                'currency_code' => $this->getStore()->getCurrentCurrencyCode(),
                'rate' => $this->getStore()->getBaseCurrency()->getRate($this->getStore()->getCurrentCurrencyCode()),
                'index' => 'price',
                'renderer' => 'Magento\Sales\Block\Adminhtml\Order\Create\Search\Grid\Renderer\Price'
            ]
        );

        $this->addColumn(
            'in_products',
            [
                'header' => __('Select'),
                'type' => 'checkbox',
                'name' => 'in_products',
                'values' => $this->_getSelectedProducts(),
                'index' => 'entity_id',
                'sortable' => false,
                'header_css_class' => 'col-select',
                'column_css_class' => 'col-select'
            ]
        );

        /*20171031 add show qty */
        $this->addColumn(
            'qty_in_stock',
            [
                'header' => __('Quantity In Stock'),
                'type' => 'number',
                'index' => 'qty_in_stock'
            ]
        );
         /*20171031 add show qty */

        $this->addColumn(
            'qty',
            [
                'filter' => false,
                'sortable' => false,
                'header' => __('Qty to Order'),
                'renderer' => 'Magento\Sales\Block\Adminhtml\Order\Create\Search\Grid\Renderer\Qty',
                'name' => 'qty',
                'inline_css' => 'qty',
                'type' => 'input',
                'validate_class' => 'validate-number',
                'index' => 'qty'
            ]
        );

        return parent::_prepareColumns();
    }
}

Hallo @ 3CE, schau dir meine Antwort an. Der schwierige Teil ist, dass return parent::_prepareCollection();Sie die Zeilen verwenden müssen, die mit$p = get_parent_class($this);
hayatbiralem
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.