Здравствуйте. Установил модуль Views Bulk Operations.
Создал кастомный модуль, наследующийся от VBO. В нем в src/Plugin/Action создал файл ViewsBulkOperationManufacturerProductAction.php
В этом файле происходит описание метода смены производителя товара (смена значения поля field_brand)
При выборе в списке товаров вручную(одного или несколько) данное действие работает.
А при использовании чекбокса VBO "Выбрать все страницы" по сути товары не выбираются и действие ни к чему не применяется.
Читал про существование метода executeMultiple(array $entities). Но что в нем прописать, не понимаю.
Может кто подскажет?
<?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();
}
}
/**
* {@inheritdoc}
*/
public function buildPreConfigurationForm(array $form, array $values, FormStateInterface $form_state) {
}
public function
buildConfigurationForm(array $form, FormStateInterface $form_state) {
$form['product_manufacturer'] = [
'#type' => 'textfield',
'#title' => t('Производитель'),
];
return
$form;
}
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;
}
}
?>
Комментарии
Дописал так, но не срабатывает
<?php public function executeMultiple(array $entities) {
foreach ($entities as $entity) {
if ($entity instanceof \Drupal\node\NodeInterface) {
$entity->set('field_brand', $this->configuration['product_manufacturer']);
$entity->save();
}
}
}?>
У меня есть представление, в котором добавлен VBO и фильтр по производителю. Я выбираю определенного производителя и выбираю все страницы с ним. Применяю данное кастомное действие.
Но происходит ajax-ошибка:
Возникла AJAX HTTP ошибка.
Полученный код HTTP: 200
Следует отладочная информация.
Путь: /batch?id=990&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).
А если не выбирать фильтр по производителю, а применить действие вообще ко всем товарам, то запускается что-то очень долгое
Processed 400 of 7910 entities.
5%Processing, estimated time left: 3 часа 36 мин., elapsed: 11 мин. 49 сек
При этом все еще не появилось товаров с указанным производителем