1

I'm creating an extension and I'm wondering how to add a new menu item to a product view next to "Content", "Configuration", "Product Reviews", "Images and Vidoes" etc. enter image description here

I've been studying the code in /vendor/magento/module-catalog/view/adminhtml/layout/catalog_product_form.xml to create a catalog_product_form.xml in my module's view/adminhtml/layout directory, but the new menu item never shows.

I've added new columns to the admin product grid, and new configuration items via the system.xml file, so I think I understand how the DOM merging should work, but what am I don't wrong with this product menu item? Here's the code in my module's catalog_product_form.xml:

<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_layout.xsd">
    <referenceContainer name="product_form">
        <block name="gallery" class="Magento\Catalog\Block\Adminhtml\Product\Helper\Form\Gallery">
            <arguments>
                <argument name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">My experiment</item>
                    <item name="collapsible" xsi:type="boolean">true</item>
                    <item name="opened" xsi:type="boolean">false</item>
                    <item name="sortOrder" xsi:type="string">22</item>
                    <item name="canShow" xsi:type="boolean">true</item>
                    <item name="componentType" xsi:type="string">fieldset</item>
                </argument>
            </arguments>
            <block class="Magento\Catalog\Block\Adminhtml\Product\Helper\Form\Gallery\Content" as="content">
                <arguments>
                    <argument name="config" xsi:type="array">
                        <item name="parentComponent" xsi:type="string">product_form.product_form.block_gallery.block_gallery</item>
                    </argument>
                </arguments>
                <block class="Magento\ProductVideo\Block\Adminhtml\Product\Edit\NewVideo" name="new-video" template="Magento_ProductVideo::product/edit/slideout/form.phtml"/>
            </block>
        </block>
    </referenceContainer>
</layout>
Joseph Hovik
  • 581
  • 1
  • 6
  • 19
  • this might help you. http://magento.stackexchange.com/questions/103642/add-new-tab-in-product-edit-page-in-admin-magento-2 – Abhishek Panchal Mar 22 '17 at 21:33
  • Thanks Abhishek, that post does work. However, I inserted a select element with some options, and when I save the product, it doesn't save my selection. Is there another way to add a fieldset to a product (similar to adding a group and field to system.xml)? – Joseph Hovik Mar 23 '17 at 16:07
  • In which phtml file you put your code? – Abhishek Panchal Mar 23 '17 at 16:11
  • Vendor/Module/view/adminhtml/templates/catalog/product/edit/welcome.phtml. Just like the tutorial said. I'm trying a very simple test (<select><option value="mytest1">mytest1</option><option value="mytest2">mytest2</option></select>). My selection isn't saved in the database. – Joseph Hovik Mar 23 '17 at 16:26

1 Answers1

0

I've found what I was looking for by studying some of the core Magento 2 code. First add a <fieldset> element to 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">
    <argument name="data" xsi:type="array">
        <item name="buttons" xsi:type="array">
            <item name="product_button" xsi:type="string">Vendor\Module\Block\Adminhtml\Product\Edit\Button\UploadButton</item>
        </item>
    </argument>
    <fieldset name="my_fieldset">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="label" xsi:type="string" translate="true">My New Tab</item>
                <item name="collapsible" xsi:type="boolean">true</item>
                <item name="sortOrder" xsi:type="number">10</item>
            </item>
        </argument>
        <container name="my_group">
            <field name="my_field">
                <argument name="data" xsi:type="array">
                    <item name="options" xsi:type="object">Vendor\Module\Block\Adminhtml\Product\Edit\Tab\ProfileSelect</item>
                    <item name="config" xsi:type="array">
                        <item name="label" xsi:type="string" translate="true">My test menu</item>
                        <item name="sortOrder" xsi:type="number">230</item>
                        <item name="dataType" xsi:type="string">string</item>
                        <item name="dataScope" xsi:type="string">value</item>
                        <item name="formElement" xsi:type="string">select</item>
                        <item name="source" xsi:type="string">category</item>
                    </item>
                </argument>
            </field>
        </container>
    </fieldset>
</form>

Second, create a source class to populate your field. Mine is Vendor\Module\Block\Adminhtml\Product\Edit\Tab\ProfileSelect.php.

<?php

namespace Vendor\Module\Block\Adminhtml\Product\Edit\Tab;

use Magento\Framework\Data\Form\Element\AbstractElement;

class ProfileSelect extends \Magento\Config\Block\System\Config\Form\Field implements \Magento\Framework\Option\ArrayInterface
{
    /**
    * @var \Magento\Framework\App\Config\ScopeConfigInterface
    */
    protected $_scopeConfig;

    public function __construct(
        \Magento\Backend\Block\Template\Context $context,
        array $data = []
    ) {
        parent::__construct($context, $data);
        $this->_scopeConfig = $context->getScopeConfig();
    }

    /**
    * Disables the communities if no token is present
    */
    public function _getElementHtml(AbstractElement $element)
    {
        return $element->getElementHtml();
    }

    /**
    * Return options array
    *
    * @return array
    */
    public function toOptionArray()
    {
       return [
            ['value' => 'theducksflyatmidnight', 'label' => 'theducksflyatmidnight'],
            ['value' => 'newenglandclamchowder', 'label' => 'newenglandclamchowder']
        ];
     }
}

Clear the cache and run setup:di:compile, and the new menu item containing the new field will show.

enter image description here

Joseph Hovik
  • 581
  • 1
  • 6
  • 19