Chỉnh sửa sản phẩm Magento 2 / Thêm phần tùy chỉnh mẫu quản trị


9

Tôi đang học thành phần UI.

Tôi muốn thêm phần tùy chỉnh trong chỉnh sửa sản phẩm / thêm hình thức phụ trợ để làm điều đó

Tôi đã tạo các tệp sau.

nhà cung cấp / mô-đun / lượt xem / adminhtml / ui_component / sản phẩm_form.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
        <fieldset name="mobile">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Time</item>
                    <item name="provider" xsi:type="string">product</item>
                    <item name="dataScope" xsi:type="string">data.product</item>
                    <item name="sortOrder" xsi:type="number">2</item>
                    <item name="collapsible" xsi:type="boolean">true</item>
                    <item name="opened" xsi:type="boolean">false</item>
                    <item name="ns" xsi:type="string">product_form</item>
                </item>
            </argument>
            <container name="monday_time_group">
                <argument name="data" xsi:type="array">
                    <item name="type" xsi:type="string">group</item>
                    <item name="config" xsi:type="array">
                        <item name="additionalClasses" xsi:type="string">admin__control-grouped-date</item>
                        <item name="component" xsi:type="string">Magento_Ui/js/form/components/group</item>
                        <item name="label" xsi:type="string" translate="true">Monday</item>
                        <item name="required" xsi:type="boolean">false</item>
                        <item name="sortOrder" xsi:type="number">220</item>
                        <item name="breakLine" xsi:type="boolean">false</item>
                        <item name="scopeLabel" xsi:type="string">[STORE VIEW]</item>
                    </item>
                </argument>
                <field name="monday_design_from">
                    <argument name="data" xsi:type="array">
                        <item name="options" xsi:type="object">Vendor\Module\Model\Config\Source\TimeSetup</item>
                        <item name="config" xsi:type="array">
                            <item name="label" xsi:type="string" translate="true">Monday</item>
                            <item name="additionalClasses" xsi:type="string">admin__field-date</item>
                            <item name="sortOrder" xsi:type="number">230</item>
                            <item name="dataType" xsi:type="string">string</item>
                            <item name="formElement" xsi:type="string">select</item>
                        </item>
                    </argument>
                </field>
                 <field name="monday_design_to">
                    <argument name="data" xsi:type="array">
                        <item name="options" xsi:type="object">Vendor\Module\Model\Config\Source\TimeSetup</item>
                        <item name="config" xsi:type="array">
                            <item name="additionalClasses" xsi:type="string">admin__field-date</item>
                            <item name="sortOrder" xsi:type="number">240</item>
                            <item name="dataType" xsi:type="string">string</item>
                            <item name="formElement" xsi:type="string">select</item>
                        </item>
                    </argument>
                </field>
            </container>
        </fieldset>
    </form>

Nhà cung cấp \ Module \ Model \ Config \ Source \ TimeSetup.php

<?php
namespace Vendor\Module\Model\Config\Source;

class TimeSetup extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource
{

    protected $_optionsData;

    /**
     * getAllOptions
     *
     * @return array
     */
    public function getAllOptions()
    {
        if ($this->_options === null) {
            $this->_options = [
                ['value' => 'one', 'label' => __('one')],
                ['value' => 'two', 'label' => __('two')]
            ];
        }
        return $this->_options;
    }
    final public function toOptionArray()
    {
         return array(
            array('value' => 'one', 'label' => __('one')),
            array('value' => 'two', 'label' => __('two'))
         );
     }
}

Nó hiển thị trong phần phụ trợ đúng như tôi muốn nhưng khi cố gắng lưu sản phẩm thì nó không lưu giá trị trường này.

Tôi có cần tạo Thuộc tính " monday_time_group " không? Đây có phải là cách thích hợp để làm như vậy? Làm cách nào tôi có thể nhận được giá trị này ở frontend cho Sản phẩm?

CẬP NHẬT:

Tôi đã tạo thuộc tính monday_time_group nhưng vẫn không hoạt động.


có ai giúp được không?
Kaushal Suthar

Các giá trị trường khác được lưu hay không?
Suresh Chikani

@SHPatel: Các trường Magento mặc định khác đang hoạt động tốt, Chỉ hai giá trị trường này không được lưu.
Kaushal Suthar

Bạn đã tạo các thuộc tính này từ phụ trợ chưa?
Suresh Chikani

1
Tôi sẽ thử sử dụng một plugin. Trong di.xml, bạn có thể đặt một cái gì đó như: <type name = "Magento \ Catalog \ Model \ ResourceModel \ Product"> <plugin name = "AddFilter" type = "Namespace \ Modulename \ Model \ ResourceModel \ Product" /> Sau đó sử dụng devdocs.magento.com/guides/v2.0/extension-dev-guide/ khuyên làm tham chiếu để thực hiện và chức năng afterSave và đưa logic vào đó để lấy dữ liệu và lưu dữ liệu. Không hoàn hảo nhưng nên làm việc.

Câu trả lời:


7

Được rồi cuối cùng tôi đã tự mình giải quyết vấn đề này ở đây là toàn bộ mã của mô-đun của tôi ...

đăng ký.php

<?php

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Vendor_Module',
    __DIR__
);

vv / 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="1.0.0"></module>
</config>

Cài đặt / InstallData.php

<?php

namespace Vendor\Module\Setup;

use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;

class InstallData implements InstallDataInterface
{
    private $eavSetupFactory;
    public function __construct(
        EavSetupFactory $eavSetupFactory
    )
    {
        $this->eavSetupFactory = $eavSetupFactory;
    }

    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
        $eavSetup->addAttribute(
          \Magento\Catalog\Model\Product::ENTITY,
          "testone",
          [
          'group' => "",
          'label' => "Test One",
          'is_html_allowed_on_front' => true,
          'default' => '1',
          'note' => '',
          'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE,
          'visible' => true,
          'required' => false,
          'user_defined' => false,
          'searchable' => false,
          'filterable' => false,
          'comparable' => false,
          'visible_on_front' => true,
          'visible_in_advanced_search' => false,
          'unique' => false,
          "frontend_class" => "",
          "used_in_product_listing" => true,
          "input" => "select",
          "type" => "varchar",
          "source" => "Vendor\Module\Model\Config\Source\TimeSetup",
          'backend' => 'Magento\Eav\Model\Entity\Attribute\Backend\ArrayBackend'
          ]
      );
        $eavSetup->addAttribute(
          \Magento\Catalog\Model\Product::ENTITY,
          "testtwo",
          [
          'group' => "",
          'label' => "Test Two",
          'is_html_allowed_on_front' => true,
          'default' => '1',
          'note' => '',
          'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE,
          'visible' => true,
          'required' => false,
          'user_defined' => false,
          'searchable' => false,
          'filterable' => false,
          'comparable' => false,
          'visible_on_front' => true,
          'visible_in_advanced_search' => false,
          'unique' => false,
          "frontend_class" => "",
          "used_in_product_listing" => true,
          "input" => "select",
          "type" => "varchar",
          "source" => "Vendor\Module\Model\Config\Source\TimeSetup",
          'backend' => 'Magento\Eav\Model\Entity\Attribute\Backend\ArrayBackend'
          ]
      );
    }
}

Model \ Config \ Source \ TimeSetup.php

<?php
namespace Vendor\Module\Model\Config\Source;

class TimeSetup extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource
{

    protected $_optionsData;

    /**
     * getAllOptions
     *
     * @return array
     */
    public function getAllOptions()
    {
        if ($this->_options === null) {
            $this->_options = [
                ['value' => 'one', 'label' => __('one')],
                ['value' => 'two', 'label' => __('two')]
            ];
        }
        return $this->_options;
    }
    final public function toOptionArray()
    {
         return array(
            array('value' => 'one', 'label' => __('one')),
            array('value' => 'two', 'label' => __('two'))
         );
     }
}

xem / adminhtml / ui_component / sản phẩm_form.xml

<?xml version="1.0" encoding="UTF-8"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <fieldset name="testingproduct">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="label" xsi:type="string" translate="true">Testing Group</item>
                <item name="provider" xsi:type="string">product</item>
                <item name="dataScope" xsi:type="string">data.product</item>
                <item name="sortOrder" xsi:type="number">2</item>
                <item name="collapsible" xsi:type="boolean">true</item>
                <item name="opened" xsi:type="boolean">false</item>
                <item name="ns" xsi:type="string">product_form</item>
            </item>
        </argument>
        <container name="testing_group">
            <argument name="data" xsi:type="array">
                <item name="type" xsi:type="string">group</item>
                <item name="config" xsi:type="array">
                    <item name="formElement" xsi:type="string">container</item>
                    <item name="component" xsi:type="string">Magento_Ui/js/form/components/group</item>
                    <item name="label" xsi:type="string" translate="true">Testing Group</item>
                    <item name="required" xsi:type="boolean">false</item>
                    <item name="sortOrder" xsi:type="number">220</item>
                    <item name="breakLine" xsi:type="boolean">false</item>
                    <item name="scopeLabel" xsi:type="string">[STORE VIEW]</item>
                </item>
            </argument>
            <field name="testone">
                <argument name="data" xsi:type="array">
                    <item name="options" xsi:type="object">Vendor\Module\Model\Config\Source\TimeSetup</item>
                    <item name="config" xsi:type="array">
                        <item name="label" xsi:type="string" translate="true">Testing Row</item>
                        <item name="sortOrder" xsi:type="number">230</item>
                        <item name="dataType" xsi:type="string">string</item>
                        <item name="formElement" xsi:type="string">select</item>
                    </item>
                </argument>
            </field>
             <field name="testtwo">
                <argument name="data" xsi:type="array">
                    <item name="options" xsi:type="object">Vendor\Module\Model\Config\Source\TimeSetup</item>
                    <item name="config" xsi:type="array">
                        <item name="sortOrder" xsi:type="number">240</item>
                        <item name="dataType" xsi:type="string">string</item>
                        <item name="formElement" xsi:type="string">select</item>
                    </item>
                </argument>
            </field>
        </container>
    </fieldset>
</form>

Sử dụng mã ở trên, Lưu dữ liệu đúng cách, Chỉ có vấn đề tôi gặp phải bây giờ là các thuộc tính này cũng xuất hiện trong phần Chung cũng như trong phần tùy chỉnh được tạo của tôi là "Nhóm thử nghiệm" vì vậy hiện tại tôi đã ẩn chúng khỏi phần Chung bằng cách sử dụng CSS.


Làm thế nào để thêm một lĩnh vực vào phần hiện có? ví dụ tôi cần thêm một trường văn bản vào phần chi tiết sản phẩm. Làm thế nào nó có thể được thực hiện?
jafar pinjar

2

Từ những gì tôi thấy ở đây không có gì đặc biệt về thuộc tính của bạn.
Họ là những người thường xuyên.
Bạn chỉ có thể thêm các thuộc tính monday_design_from, monday_design_fromvà đặt chúng trong một nhóm riêng biệt.
Tôi khuyên bạn nên làm điều đó thông qua mã chứ không phải thủ công vì tôi cho rằng bạn sẽ có logic trên các thuộc tính này.

Dưới đây là một ví dụ về cách bạn có thể làm điều đó: https://magento.stackexchange.com/a/162115/146

Điều duy nhất bạn cần thay đổi nếu bạn muốn các thuộc tính của mình xuất hiện trong một phần riêng biệt là thêm vào mảng cấu hình này

'group' => 'Time',

♦ Cảm ơn bạn đã trả lời, Có, không có gì đặc biệt về các thuộc tính, tôi muốn hiển thị chúng vào phần tùy chỉnh nhưng hai nên nằm trong cùng một nhóm như chúng ta thấy trong thuộc tính "Đặt thiết kế mới từ" trong đó có hai hộp ngày trong cùng một hàng, tôi muốn hiển thị thuộc tính của mình theo cách đó. Có tổng số 16 thuộc tính tôi muốn tạo và hai thuộc tính sẽ nằm trong cùng một nhóm của phần tùy chỉnh của tôi, do đó sẽ có tổng số 8 hàng và trong mỗi hàng sẽ có một nhãn và hai thuộc tính thả xuống. Tôi hy vọng bạn hiểu yêu cầu của tôi, Hãy cho tôi biết nếu bạn muốn chia sẻ cho tôi ảnh chụp màn hình của nó ...
Kaushal Suthar

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.