При написании листинга столкнулся с проблемой: как создать massAction с тем же справочником, с которым выводится определенная колонка в гриде (в моем случае это был статус отзыва review_status)
Если указывать статически, то никаких проблем:
<massaction name="listing_massaction" component="Magento_Ui/js/grid/tree-massactions">
<action name="change_status">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="type" xsi:type="string">status</item>
<item name="label" xsi:type="string" translate="true">Change Status</item>
</item>
</argument>
<argument name="actions" xsi:type="array">
<item name="0" xsi:type="array">
<item name="type" xsi:type="string">pending</item>
<item name="label" xsi:type="string" translate="true">Pending</item>
<item name="url" xsi:type="url" path="local_comments/comment/massChangeStatus">
<param name="status">2</param>
</item>
</item>
<item name="1" xsi:type="array">
<item name="type" xsi:type="string">approved</item>
<item name="label" xsi:type="string" translate="true">Approved</item>
<item name="url" xsi:type="url" path="local_comments/comment/massChangeStatus">
<param name="status">1</param>
</item>
</item>
<item name="2" xsi:type="array">
<item name="type" xsi:type="string">not_approved</item>
<item name="label" xsi:type="string" translate="true">Not approved</item>
<item name="url" xsi:type="url" path="local_comments/comment/massChangeStatus">
<param name="status">3</param>
</item>
</item>
</argument>
</action>
</massaction>
Здесь мы описали справочник статусов со значеняим из колонки
Но я хотел, чтобы статусы брало само именно из справочника из модуля Magento_Review
В этом случае сделал так:
<action name="change_status">
<settings>
<type>change_status</type>
<label translate="true">Change Status</label>
<actions class="Vendor\Module\Ui\Component\MassAction\Status\AssignOptions" />
</settings>
</action>
Дальше нужно реализовать класс Vendor\Module\Ui\Component\MassAction\Status\AssignOptions и прописать его в di.xml
<type name="Vendor\Module\Ui\Component\MassAction\Status\AssignOptions">
<arguments>
<argument name="data" xsi:type="array">
<item name="urlPath" xsi:type="string">route/controller/massChangeStatus</item>
<item name="paramName" xsi:type="string">status</item> <!-- это поле добавит в url, его потом нужно обработать в контроллере -->
<item name="confirm" xsi:type="array">
<item name="title" xsi:type="string" translatable="true">Change Status</item>
<item name="message" xsi:type="string" translatable="true">Are you sure to change the status of selected review(s)?</item>
</item>
</argument>
</arguments>
</type>
И сам класс:
<?php
namespace Vendor\Module\Ui\Component\MassAction\Status;
use Magento\Framework\UrlInterface;
use Laminas\Stdlib\JsonSerializable;
use Magento\Review\Helper\Data as ReviewHelper;
class AssignOptions implements JsonSerializable
{
/** @var array */
private $options;
/** @var array */
private $data;
/** @var UrlInterface */
private $urlBuilder;
/** @var string */
private $urlPath;
/** @var string */
private $paramName;
/** @var array */
private $additionalData = [];
/** @var ReviewHelper */
private $reviewHelper;
/**
* @param UrlInterface $urlBuilder
* @param ReviewHelper $reviewHelper
* @param array $data
*/
public function __construct(
UrlInterface $urlBuilder,
ReviewHelper $reviewHelper,
array $data = []
) {
$this->urlBuilder = $urlBuilder;
$this->reviewHelper = $reviewHelper;
$this->data = $data;
}
/**
* Get action options
*
* @return array|mixed
*/
public function jsonSerialize(): mixed
{
if ($this->options === null) {
$options = $this->reviewHelper->getReviewStatusesOptionArray();
$this->prepareData();
foreach ($options as $optionCode) {
$this->options[$optionCode['value']] = [
'type' => 'status_' . $optionCode['value'],
'label' => $optionCode['label'],
];
if ($this->urlPath && $this->paramName) {
$this->options[$optionCode['value']]['url'] = $this->urlBuilder->getUrl(
$this->urlPath,
[$this->paramName => $optionCode['value']]
);
}
$this->options[$optionCode['value']] = array_merge_recursive(
$this->options[$optionCode['value']],
$this->additionalData
);
}
$this->options = array_values($this->options);
}
return $this->options;
}
/**
* Prepare addition data for subactions
*
* @return void
*/
protected function prepareData()
{
foreach ($this->data as $key => $value) {
switch ($key) {
case 'urlPath':
$this->urlPath = $value;
break;
case 'paramName':
$this->paramName = $value;
break;
default:
$this->additionalData[$key] = $value;
break;
}
}
}
}
Здесь статусы отзывов получает хэлпером из модуля Magento_Review и подготоваливает для UI Conmponent
Дальшу нужно почистить кэш
php bin/magento cache:clean
php bin/magento cache:flush
php bin/magento setup:static-content:deploy -f
Должно получиться примерно так: