2

I want to create one custom tab in the admin product section for all products and I want to display a custom message. How can I do this?

1

2 Answers 2

5

Update:

I apologize, this answer is working only for version 2.1 +. I won't delete it, perhaps it can helps somebody (who is using the version 2.1 or greater).


Add the modifier in app/code/Vendor/Module/etc/adminhtml/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">
    <virtualType name="Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\Pool">
        <arguments>
            <argument name="modifiers" xsi:type="array">
                <item name="custom-tab-with-content" xsi:type="array">
                    <item name="class" xsi:type="string">Vendor\Module\Ui\DataProvider\Product\Form\Modifier\CustomTab</item>
                    <item name="sortOrder" xsi:type="number">10</item>
                </item>
            </argument>
        </arguments>
    </virtualType>
</config>

Create corresponding class Vendor\Module\Ui\DataProvider\Product\Form\Modifier\CustomTab in app/code/Vendor/Module/Ui/DataProvider/Product/Form/Modifier/CustomTab.php:

<?php
namespace Vendor\Module\Ui\DataProvider\Product\Form\Modifier;

use Magento\Catalog\Model\Locator\LocatorInterface;
use Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\AbstractModifier;
use Magento\Framework\Stdlib\ArrayManager;
use Magento\Framework\UrlInterface;
use Magento\Ui\Component\Container;
use Magento\Ui\Component\Form\Fieldset;

class CustomTab extends AbstractModifier
{

    const CUSTOM_TAB_INDEX = 'custom_tab';
    const CUSTOM_TAB_CONTENT = 'content';

    /**
     * @var \Magento\Catalog\Model\Locator\LocatorInterface
     */
    protected $locator;

    /**
     * @var ArrayManager
     */
    protected $arrayManager;

    /**
     * @var UrlInterface
     */
    protected $urlBuilder;

    /**
     * @var array
     */
    protected $meta = [];

    /**
     * @param LocatorInterface $locator
     * @param ArrayManager $arrayManager
     * @param UrlInterface $urlBuilder
     */
    public function __construct(
        LocatorInterface $locator,
        ArrayManager $arrayManager,
        UrlInterface $urlBuilder
    ) {
        $this->locator = $locator;
        $this->arrayManager = $arrayManager;
        $this->urlBuilder = $urlBuilder;
    }

    public function modifyData(array $data)
    {
        return $data;
    }

    public function modifyMeta(array $meta)
    {
        $this->meta = $meta;
        $this->addCustomTab();

        return $this->meta;
    }

    protected function addCustomTab()
    {
        $this->meta = array_merge_recursive(
            $this->meta,
            [
                static::CUSTOM_TAB_INDEX => $this->getTabConfig(),
            ]
        );
    }

    protected function getTabConfig()
    {
        return [
            'arguments' => [
                'data' => [
                    'config' => [
                        'label' => __('Custom Tab'),
                        'componentType' => Fieldset::NAME,
                        'dataScope' => '',
                        'provider' => static::FORM_NAME . '.product_form_data_source',
                        'ns' => static::FORM_NAME,
                        'collapsible' => true,
                    ],
                ],
            ],
            'children' => [
                static::CUSTOM_TAB_CONTENT => [
                    'arguments' => [
                        'data' => [
                            'config' => [
                                'label' => null,
                                'formElement' => Container::NAME,
                                'componentType' => Container::NAME,
                                'template' => 'ui/form/components/complex',
                                'content' => __('You can write any text here, ') .
                                    ' or html: ' . 
                                    '<h3>Text</h3>' . 
                                    ', or blocks html (using toHtml method).',
                                'sortOrder' => 10,
                            ],
                        ],
                    ],
                    'children' => [],
                ],
            ],
        ];
    }
}

Now you can add your content inside the 'content' section. You can call a block and add its html to the content (using the toHtml method). Change it as you wish.

PS: do not forget to change the vendor name (Vendor) and module name (Module) to corresponding own names.

4
  • Can i call product grid in this new tab? Commented Apr 18, 2017 at 13:27
  • @chiragdodia Sure, you can load in this tab any content you want Commented Apr 18, 2017 at 14:39
  • Can you please tell me how i can load product grid over there? Commented Apr 19, 2017 at 6:04
  • I have asked the same question here magento.stackexchange.com/questions/170620/… But i didn't get any answer can anybody help me? :( Commented Apr 19, 2017 at 6:05
1

Just a message? Then you could create a dummy attribute within a new attribute group and use the frontend type "label" to make it not editable.

Or use a custom input renderer, this way you can use your own template and put whatever you like there.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.