View source
<?php
class views_menu_children_argument extends views_handler_argument_numeric {
var $operator;
var $value;
function option_definition() {
$options = parent::option_definition();
$options['target_menu'] = array(
'default' => '',
);
$options['filter_disabled_items'] = array(
'default' => '0',
);
return $options;
}
function options_form(&$form, &$form_state) {
parent::options_form($form, $form_state);
$form['default_action']["#options"]['root_nodes'] = t('Display root nodes only.');
unset($form['not']);
unset($form['break_phrase']);
self::buildMenuSelectForm($form, $form_state, $this->options['target_menu']);
$form['filter_disabled_items'] = array(
'#type' => 'checkbox',
'#title' => t('Hide nodes whose menu link is disabled?'),
'#return_value' => "1",
'#default_value' => !empty($this->options['filter_disabled_items']),
);
}
public static function buildMenuSelectForm(&$form, &$form_state, $default_menu) {
foreach (menu_load_all() as $menu) {
$menus[$menu['menu_name']] = $menu['title'];
}
asort($menus);
$form['target_menu'] = array(
'#type' => 'select',
'#title' => t('Target menu'),
'#description' => t('Select the menu to scan for child nodes.'),
'#default_value' => $default_menu,
'#required' => TRUE,
'#options' => array_merge(array(
'' => t('-- Select menu --'),
), $menus),
);
}
function title() {
return parent::title();
}
function title_query() {
return $this->value;
}
function query($group_by = FALSE) {
$this
->ensure_my_table();
$menu_name = $this->options['target_menu'];
self::joinMenuLinksTableToNode($this->query, $menu_name);
if (!empty($this->options['break_phrase'])) {
views_break_phrase($this->argument, $this);
}
else {
$this->value = array(
$this->argument,
);
}
$page_identifier = reset($this->value);
if (is_numeric($page_identifier) && $page_identifier != "0") {
$page_identifier = "node/{$page_identifier}";
}
self::filterByParentPage($page_identifier, $menu_name, $this->query);
$this
->filterDisabledNodesLinks($this->query);
}
public function filterDisabledNodesLinks(\views_plugin_query $query) {
if (!empty($this->options['filter_disabled_items'])) {
$query
->add_where_expression(0, 'menu_links.hidden <> 1', array());
}
}
public static function filterByParentPage($page_identifier, $menu_name, \views_plugin_query $query) {
if (empty($page_identifier)) {
$parent['mlid'] = 0;
}
else {
$page_identifier = drupal_get_normal_path($page_identifier);
$parent = menu_link_get_preferred($page_identifier, $menu_name);
if ($parent === FALSE) {
$parent['mlid'] = -1;
}
}
$query
->add_where_expression(0, 'menu_links.plid = :parent_lid', array(
':parent_lid' => $parent['mlid'],
));
}
public static function joinMenuLinksTableToNode(\views_plugin_query $query, $menu_name, $allow_duplicate_join = false) {
if (!$allow_duplicate_join && isset($query->tables['node']['menu_links'])) {
return;
}
$join = new views_menu_children_join();
$join->prefixes[] = 'node/';
drupal_alter('views_menu_children_filter_join', $join->prefixes, $menu_name, $query);
$query
->queue_table("menu_links", "node", $join);
$query
->add_where_expression(0, "menu_links.menu_name = :targetmenu", array(
':targetmenu' => $menu_name,
));
}
function has_default_argument() {
return $this->options['default_action'] == 'root_nodes' ? true : parent::has_default_argument();
}
function get_default_argument() {
if ($this->options['default_action'] == 'root_nodes') {
return '0';
}
return parent::get_default_argument();
}
}