Magento 2製品の編集/管理フォームのカスタムセクションの追加


9

UIコンポーネントを学習しています。

製品編集/バックエンドフォームにカスタムセクションを追加したいので、

以下のファイルを作成しました。

vendor / module / view / adminhtml / ui_component / product_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>

Vendor \ 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'))
         );
     }
}

それは私が望んだように適切にバックエンドに表示されていますが、製品を保存しようとすると、このフィールド値は保存されません。

属性「monday_time_group」を作成する必要がありますか?これを行う適切な方法はありますか?製品のフロントエンドでこれの値を取得するにはどうすればよいですか?

更新:

属性monday_time_groupを作成しましたが、まだ機能しません。


誰か助けてもらえますか?
Kaushal Suthar 2017

他のフィールドの値が保存されたかどうか?
Suresh Chikani 2017

@SHPatel:他のデフォルトのMagentoフィールドは正常に機能しています。これらの2つのフィールド値のみが保存されません。
Kaushal Suthar

これらの属性をバックエンドから作成しましたか?
Suresh Chikani 2017

1
プラグインを使ってみます。di.xmlでは、次のように記述できます。<type name = "Magento \ Catalog \ Model \ ResourceModel \ Product"> <plugin name = "AddFilter" type = "Namespace \ Modulename \ Model \ ResourceModel \ Product" />次に、devdocs.magento.com/guides/v2.0/extension-dev-guide/…makeおよびafterSave関数への参照として、データをフェッチして保存するロジックをそこに配置します。完璧ではありませんが、動作するはずです。

回答:


7

さて、私はこれを自分で解決しました。ここに私のモジュールの完全なコードがあります...

registration.php

<?php

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

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

Setup / 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'))
         );
     }
}

view / adminhtml / ui_component / product_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>

上記のコードを使用して、データを適切に保存します。現在直面している問題は、これらの属性が「テストグループ」である作成済みのカスタムセクションにも一般セクションに表示されることです。 CSS。


既存のセクションにフィールドを追加する方法は?たとえば、製品の詳細セクションにテキストフィールドを追加する必要があります。どうすればできますか?
jafar pinjar 2018年

2

ここで私が見るものから、あなたの属性について特別なことは何もありません。
普通のものです。
あなたは、単に属性を追加することができmonday_design_frommonday_design_fromかつ別のグループに配置します。
手動ではなくコードを使用することをお勧めします。これは、これらの属性にロジックがあると想定しているためです。

これを行う方法の例を次に示します。https//magento.stackexchange.com/a/162115/146

属性を別のセクションに表示する場合に変更する必要があるのは、構成配列にこれを追加することだけです。

'group' => 'Time',

♦返信ありがとうございます。はい、属性について特別なことは何もありません。カスタムセクションに表示したいのですが、「Set New Design From」属性にあるように、2つは同じグループにある必要があります。同じ行、そのように属性を表示したいと思います。作成する属性は合計16個あり、2つの属性はカスタムセクションの同じグループにあるため、合計8行になり、各行に1つのラベルと2つのドロップダウン属性があります。私の要件を理解していただければ幸いです。スクリーンショットを共有したい場合はお知らせください...
Kaushal Suthar

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.