Здравствуйте.
Создал кастомный модуль, наследующийся от VBO. В нем в src/Plugin/Action создал файл ViewsBulkOperationManufacturerProductAction.php
В этом файле происходит описание метода смены производителя товара (смена значения поля field_brand)
<?php
/**
* @file
* Contains \Drupal\my_action\Plugin\Action\ViewsBulkOperationProductAction.
*/
namespace Drupal\ap_vbo_product_actions\Plugin\Action;
use
Drupal\views_bulk_operations\Action\ViewsBulkOperationsActionBase;
use Drupal\views_bulk_operations\Action\ViewsBulkOperationsPreconfigurationInterface;
use Drupal\Core\Plugin\PluginFormInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountInterface;
/**
* Action description.
*
* @Action(
* id = "ap_vbo_product_specify_manufacturer",
* label = @Translation("Указать производителя"),
* type = "",
* confirm = TRUE
* )
*/
class ViewsBulkOperationManufacturerProductAction extends ViewsBulkOperationsActionBase implements ViewsBulkOperationsPreconfigurationInterface, PluginFormInterface {
/**
* {@inheritdoc}
*/
public function execute($entity = NULL) {
if ($entity instanceof \Drupal\node\NodeInterface){
$entity->set('field_brand', $this->configuration['product_manufacturer']); //указание производителя
$entity->save();
}
}
public function
executeMultiple(array $entities) {
foreach ($entities as $entity) {
$this->execute($entity);
}
}
/**
* {@inheritdoc}
*/
public function buildPreConfigurationForm(array $form, array $values, FormStateInterface $form_state) {
}
/**
* Configuration form builder.
*
* If this method has implementation, the action is
* considered to be configurable.
*
* @param array $form
* Form array.
* @param Drupal\Core\Form\FormStateInterface $form_state
* The form state object.
*
* @return array
* The configuration form.
*/
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
$form['product_manufacturer'] = [
'#type' => 'textfield',
'#title' => t('Производитель'),
];
return
$form;
}
/**
* Submit handler for the action configuration form.
*
* If not implemented, the cleaned form values will be
* passed directly to the action $configuration parameter.
*
* @param array $form
* Form array.
* @param Drupal\Core\Form\FormStateInterface $form_state
* The form state object.
*/
public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
$this->configuration['product_manufacturer'] = $form_state->getValue('product_manufacturer');
}
/**
* {@inheritdoc}
*/
public function access($object, AccountInterface $account = NULL, $return_as_object = FALSE) {
if ($object->getEntityType() === 'node') {
$access = $object->access('update', $account, TRUE)
->andIf($object->status->access('edit', $account, TRUE));
return $return_as_object ? $access : $access->isAllowed();
}
return
TRUE;
}
}
?>
Добавил в представление своего списка товаров Массовые операции, выбрал необходимые действия.
Перехожу в список товаров, отмечаю чекбокс "Выбрать все страницы", выбираю действие "Указать производителя" и "Применить".
По итогу выдается ошибка:
Возникла AJAX HTTP ошибка.
Полученный код HTTP: 200
Следует отладочная информация.
Путь: /batch?id=1006&op=do_nojs&op=do
Текст Состояния: OK
Текст Ответа: Error: Call to a member function getOffset() on null in Drupal\views_bulk_operations\Service\ViewsBulkOperationsActionProcessor->getPageList() (line 241 of /var/www/html/web/modules/contrib/views_bulk_operations/src/Service/ViewsBulkOperationsActionProcessor.php).