Создание новых действий операций массового просмотра (VBO) для пользовательских типов сущностей


У меня есть следующий код, и я создал представление для своего пользовательского типа сущности. Я просто хочу создать новую кнопку действия, чтобы иметь возможность изменить текст поля на что-то другое. Я не уверен, почему это пользовательское действие не отображается. Под каким окном я должен его увидеть? Выполнить произвольный php или изменить несколько значений сущностей?

Где хороший пример кода для выполнения пользовательского действия? Есть ли готовый пример действия VBO, который я могу просто скачать, чтобы посмотреть, как это сделано?

/**
 * Implements hook_action_info().
 */
function rubik_custom_action_info() {
  return array(
    'hideit' => array(
      'type' => 'entity',
      'label' => t('Custom Action'),
      'configurable' => FALSE,
      'triggers' => array('any'),
      'behavior' => array('changes_property'),
      'vbo_configurable' => FALSE,
      'pass rows' => TRUE,
    ),
  );
}

/**
 * Action function for MY_ACTION_NAME.
 */
function hideit(&$entity, $context = array()) {
  drupal_set_message('ok it works');
}
Author: kiamlaluno, 2015-10-20

4 answers

В самом модуле VBO есть несколько примеров VBO. Возьмем, к примеру, delete.action.inc, который позволяет удалять любую сущность. Я не вижу ничего явно неправильного в вашем коде, но я настоятельно рекомендую вам следовать соглашению и переработать его, чтобы он выглядел как другие реализации hook_action_info():

/**
 * Implements hook_action_info().
 */
function MYMODULE_action_info() {
  $actions['MYMODULE_custom_action'] = array(
    'type' => 'node', // Here come's the name of your custom entity type
    'label' => t('Custom Action'),
    'configurable' => FALSE,
    'triggers' => array('any'),
    'behavior' => array('changes_property'),
    'vbo_configurable' => FALSE,
    'pass rows' => TRUE,
  );

  return $actions;
}

function MYMODULE_custom_action($entity, $context) {
  // Your action here.
}

Имя вашей функции rubik_custom_action_info. Вы же не пытаетесь определить это в рамках темы, не так ли? Не делай этого. Поместите его в отдельный модуль. Темы не место для этот.

Еще одним модулем, который может помочь, является песочница Commerce Bundle Helper. Он не только объявляет действия VBO, но и показывает, как вы можете автоматически добавить его в представление, которое уже существует, изменив конфигурацию VBO.

 4
Author: nvahalik, 2018-03-05 02:17:38

После определения действия его можно добавить в пользовательский интерфейс представлений в разделе Выбранные массовые операции в настройках поля Массовые операции . Это будет отдельный флажок рядом с другие действия, такие как , Выполняют произвольный PHP-скрипт и т.д. После выбора он должен отображаться как опция выбора или кнопка действия (в зависимости от того, как настроено поле VBO).

Руководство по разработке VBO на d.o. является хорошим примером работы код для определения действия, добавления необязательной формы глобальной/массовой настройки и создания обработчика действий.

Вот очень простой пример:

//Will add a "User Action" option to Bulk Operations: User field in Views UI
function MYMODULE_action_info() {
  return array(
    'MYMODULE_user_action' => array(
      //Can be other entities used in a view (e.g. 'node')
      'type' => 'user',              
      'label' => t('User Action'),
      'behavior' => array('changes_property'),
      'triggers' => array('any'),

      //Set to true if you an intermediate options form for your action
      //'configurable' => true,      

      //Set to true if you want additional globaloptions
      //'vbo_configurable' => true,
    ),
  );
}

function MYMODULE_user_action(&$entity, $context){
  //$entity is the current entity being modified; it can
  //  modified directly to perform the action on the entity

  //$context is an array of contextual information about the 
  //  current state of bulk processing  (e.g. items remaining) 
  //  It also contains configurable options values if any were set (see below)
}

//If 'configurable' => true in hook_action_info() item this trio of functions 
// will add/process an intermediate form just like any Drupal form
function MYMODULE_user_action($settings, &$form_state){
 //$settings['settings'] will contains settings set in 
 //  MYMODULE_user_action_views_bulk_operations_form
}
function MYMODULE_user_action_validate($form, $form_state) {
}
function MYMODULE_user_action_submit($form, $form_state) {
  //return an array of values usable by MYMODULE_user_action
}

//If 'vbo_configurable' => true, in hook_action_info() this presents 
// additional configurable options for the  VBO action. 
// It returns a Drupal form array
function MYMODULE_user_action_views_bulk_operations_form($options) {
}
 4
Author: Shawn Conn, 2015-10-28 19:39:33

При реализации hook_action_info() вам нужно написать имя вашего пользовательского типа сущности, а не просто entity. Например; node, user, comment, taxonomy_term, field_collection_item и т.д. Действие будет доступно до тех пор, пока базовая таблица для вашего представления будет соответствовать типу данной сущности в hook_action_info().

/**
 * Implements hook_action_info().
 */
function rubik_custom_action_info() {
  return array(
    'hideit' => array(
      'type' => 'node', // Here come's the name of your custom entity type
      'label' => t('Custom Action'),
      'configurable' => FALSE,
      'triggers' => array('any'),
      'behavior' => array('changes_property'),
      'vbo_configurable' => FALSE,
      'pass rows' => TRUE,
    ),
  );
}
 1
Author: Елин Й., 2015-10-26 10:04:22

Потребовалось некоторое время, чтобы понять это, но это работает. У меня есть пользовательская сущность под названием office, и мне нужно было создать новую видимую кнопку переключения vbo.

Я поместил этот код в модуль custom office. Первоначально я поместил это в тему template.php файл для тестирования, но по какой-то причине он не сработал, так как я предполагаю, что он срабатывает слишком поздно в процессе загрузки drupal.

/**
* Views Bulk Operation Custom Visible Toggle Button
*/
function office_action_info() {  //office was my module name
  return array(
    'action_off' => array(  //name of your function call
      'type' => 'entity',  //targets all entities on the site
      'label' => t('Toggle Visible'),
      'configurable' => FALSE,
      'behavior' => array('changes_property'),  //set the behavior type
      'triggers' => array('any'),
    ),
  );
}

function action_off($entity, $context = array()) {

  //Populate the variable using entity_load of the associated id.
  $eload = entity_load('office', array($entity->office_id));

  //Changes the field value for the entity. In this case its the Visible field
  $eload[$entity->office_id]->visible = ($eload[$entity->office_id]->visible == 1 ? 0 : 1);

  //After editing the entity array, save it. Used current() to get 1st result.
  entity_save('office', current($eload));

  //not exactly sure what this does, but its to clear the entity cache?
  entity_get_controller('office')->resetCache(array($entity->office_id)); 
}

enter image description here

 0
Author: Patoshi パトシ, 2015-11-03 03:15:05