VBO создание своих кастомных действий

Главные вкладки

Аватар пользователя mmjmm mmjmm 10 января в 7:37

Здравствуйте. Установил модуль 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 ViewsBulkOperationsPreconfigurationInterfacePluginFormInterface {

    

/**
     * {@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 $valuesFormStateInterface $form_state) {

    }

    public function 

buildConfigurationForm(array $formFormStateInterface $form_state) {
        
$form['product_manufacturer'] = [
            
'#type' => 'textfield',
            
'#title' => t('Производитель'),
        ];

        return 

$form;
    }

    public function 

submitConfigurationForm(array &$formFormStateInterface $form_state) {
        
$this->configuration['product_manufacturer'] = $form_state->getValue('product_manufacturer');
    }

    

/**
     * {@inheritdoc}
     */
    
public function access($objectAccountInterface $account NULL$return_as_object FALSE) {
        if (
$object->getEntityType() === 'node') {
            
$access $object->access('update'$accountTRUE)
                ->
andIf($object->status->access('edit'$accountTRUE));
            return 
$return_as_object $access $access->isAllowed();
        }

        return 

TRUE;
    }

}

?>

Комментарии

Аватар пользователя mmjmm mmjmm 10 января в 8:00

Дописал так, но не срабатывает

<?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).

Аватар пользователя mmjmm mmjmm 10 января в 8:16

А если не выбирать фильтр по производителю, а применить действие вообще ко всем товарам, то запускается что-то очень долгое
Processed 400 of 7910 entities.
5%Processing, estimated time left: 3 часа 36 мин., elapsed: 11 мин. 49 сек

При этом все еще не появилось товаров с указанным производителем