Hi
I've been trying hard to make the attribute set selector readonly on the product edit page but without success.
Making it not visible is not that hard. I was able to edit the Meta data in ModifyMeta function under 'Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\AttributeSet' but there's no such thing as making it readonly.
Does anyone have an idea on how to do this?
Kind regards
Tristan
<?php
/**
* Copyright © 2013-2017 Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Catalog\Ui\DataProvider\Product\Form\Modifier;
use Magento\Catalog\Api\Data\ProductAttributeInterface;
use Magento\Catalog\Model\Locator\LocatorInterface;
use Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory;
use Magento\Store\Model\StoreManagerInterface;
use Magento\Framework\UrlInterface;
use Magento\Ui\Component\Form\Field;
/**
* Add "Attribute Set" to first fieldset
*/
class AttributeSet extends AbstractModifier
{
/**
* Sort order of "Attribute Set" field inside of fieldset
*/
const ATTRIBUTE_SET_FIELD_ORDER = 30;
/**
* Set collection factory
*
* @var CollectionFactory
*/
protected $attributeSetCollectionFactory;
/**
* @var UrlInterface
*/
protected $urlBuilder;
/**
* @var LocatorInterface
*/
protected $locator;
/**
* @param LocatorInterface $locator
* @param CollectionFactory $attributeSetCollectionFactory
* @param UrlInterface $urlBuilder
*/
public function __construct(
LocatorInterface $locator,
CollectionFactory $attributeSetCollectionFactory,
UrlInterface $urlBuilder
) {
$this->locator = $locator;
$this->attributeSetCollectionFactory = $attributeSetCollectionFactory;
$this->urlBuilder = $urlBuilder;
}
/**
* Return options for select
*
* @return array
*/
public function getOptions()
{
/** @var \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\Collection $collection */
$collection = $this->attributeSetCollectionFactory->create();
$collection->setEntityTypeFilter($this->locator->getProduct()->getResource()->getTypeId())
->addFieldToSelect('attribute_set_id', 'value')
->addFieldToSelect('attribute_set_name', 'label')
->setOrder(
'attribute_set_name',
\Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\Collection::SORT_ORDER_ASC
);
return $collection->getData();
}
/**
* {@inheritdoc}
*/
public function modifyMeta(array $meta)
{
if ($name = $this->getGeneralPanelName($meta)) {
$meta[$name]['children']['attribute_set_id']['arguments']['data']['config'] = [
'component' => 'Magento_Catalog/js/components/attribute-set-select',
'disableLabel' => true,
'filterOptions' => true,
'elementTmpl' => 'ui/grid/filters/elements/ui-select',
'formElement' => 'select',
'componentType' => Field::NAME,
'options' => $this->getOptions(),
'visible' => 1,
'required' => 1,
'label' => __('Attribute Set'),
'source' => $name,
'dataScope' => 'attribute_set_id',
'filterUrl' => $this->urlBuilder->getUrl('catalog/product/suggestAttributeSets', ['isAjax' => 'true']),
'sortOrder' => $this->getNextAttributeSortOrder(
$meta,
[ProductAttributeInterface::CODE_STATUS],
self::ATTRIBUTE_SET_FIELD_ORDER
),
'multiple' => false,
];
}
return $meta;
}
/**
* {@inheritdoc}
*/
public function modifyData(array $data)
{
return array_replace_recursive($data, [
$this->locator->getProduct()->getId() => [
self::DATA_SOURCE_DEFAULT => [
'attribute_set_id' => $this->locator->getProduct()->getAttributeSetId()
],
]
]);
}
}
Hi @klimaplus,
What if you try the UI Component.
I've made something similar with Customer (Adminhtml) form.
This is what I've did:
app/code/VENDOR/MODULE/view/adminhtml/ui_component/customer_form.xml
Into that file my XML has this content:
<?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="customer">
<field name="ATTRIBUTE_NAME">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="disabled" xsi:type="string">disabled</item>
</item>
</argument>
</field>
</fieldset>
</form>
I guess you should try the same (with the right references) for products.
This solution does not work. The field "attribute set" is a special UI component and does not have "disabled" support. Will keep looking for an answer...