web-dev-qa-db-ja.com

カスタムエンティティタイプの新しい一括ビュー操作(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');
}
3

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 sandbox です。 VBOアクションを宣言するだけでなく、VBO構成を変更することにより、既存のビューにそれを自動的に追加する方法を示します。

4
nvahalik

アクションを定義したら、一括操作フィールド設定の選択した一括操作の下のビューUIに追加できます。別のチェックボックスになりますalongsideなどのその他のアクションPHP scriptなど。選択すると、選択オプションまたはアクションボタンとして表示されます(VBOフィールドの構成方法によって異なります)。

VBO開発ガイド on 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
Shawn Conn

hook_action_info()の実装により、entityだけでなく、カスタムエンティティタイプの名前を記述する必要があります。例えば; nodeusercomment、_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
Елин Й.

これを理解するのに少し時間がかかりましたが、機能しています。 officeというカスタムエンティティがあり、新しいvbo表示トグルボタンを作成する必要がありました。

このコードをカスタム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