仕様
- Viewsでコンテンツの一覧を表示する
- 上記の一覧では、DraggableViewsを使い、表示順を変更できる
- 表示順の変更後、「順番の保存」ボタン押下時に、Rulesで並び替えられたことを検知する
課題
DraggableViewsはRulesのイベントを定義しているので、
順番の変更が行われたことをRulesで検知することは容易。
ただし、何のコンテンツの順番が変更されたかを知る手段がない。
(複数画面でDraggableViewsを使い、コンテンツを並び替える機能がある場合、
どの画面で並び替えられたか検知できない)
機能実現
そこで、以下の実現手段を考えた。
MYMODULE.draggableviews.inc.php
/**
* Implements hook_draggableviews_handler_native_arguments_alter().
*/
function MYMODULE_draggableviews_handler_native_arguments_alter(&$arguments, $view, &$form_values) {
$node = node_load($view->nid);
rules_invoke_event_by_args('MYMODULE_rules_event_contact_list_sorted', $node);
}
MYMODULE.rules.inc.php
/**
* Implements hook_rules_event_info().
*/
function MYMODULE_rules_event_info() {
$items = array(
'MYMODULE_rules_event_contact_list_sorted' => array(
'label' => t('A contact list has been sorted'),
'group' => t('MYMODULE'),
'variables' => array(
'node' => array(
'type' => 'node',
'label' => t('node'),
),
),
),
);
return $items;
}
DraggableViewsのAPIで順番の変更をハンドリングし、
自前で作ったRulesのイベントを呼んであげる。
すると、Rulesの Condition と Action で ノード情報 が使えるため、
コンテンツタイプを判定することが可能となる。
おわりに
DraggableViewsとRulesとで機能実現を行った。
もっとスマートな実現方法があればご教示いただきたく。
後日談
フックのパラメータに$viewが無い場合、
views_get_page_view()を使えば、
$viewを取得し、利用できる。