Как скрыть меню страницы просмотра, если в нем нет содержимого?
Я использую модуль просмотров (7.x-3.14), и у меня есть новости , в котором отображаются все статьи на странице. У меня также есть меню с настройками Обычный, таким образом, добавляя Новости в мою навигацию.
Это работает, как и ожидалось; однако, если статьи не опубликованы, я бы хотел, чтобы ссылка Новости не добавлялась в мою навигацию. По сути, я хотел бы, чтобы Поведение без результатов для меню.
Является есть способ сделать это?
РЕДАКТИРОВАТЬ: Я использую Zurb_Foundation в качестве базовой темы, которая использует пользовательскую функцию для создания меню, вызываемого в preprocess_page
. То, что я пытался сделать, на данный момент удаляет Новости из меню.
function theme_links__topbar_main_menu(&$variables) {
// We need to fetch the links ourselves because we need the entire tree.
$links = menu_tree_output(menu_tree_all_data(variable_get('menu_main_links_source', 'main-menu')));
foreach ($links as $link){
if(is_array($link) && array_key_exists('#title', $link)) {
if($link['#title'] == 'News'){
$view = views_get_view('news');
echo count($view->result);
echo $view->total_rows;
}
}
}
$output = _zurb_foundation_links($links);
$variables['attributes']['class'][] = 'right';
return '<ul' . drupal_attributes($variables['attributes']) . '>' . $output . '</ul>';
}
count($view->results)
возвращает 0, а $view->total_rows
возвращает значение NULL, даже если должны быть результаты.
2 answers
Есть несколько вариантов сделать это, но все они, похоже, требуют специального кодирования.
Возможно Скрытие вкладки, когда представление пустое или Как программно определить, есть ли у представления результат, прежде чем отображать все представление целиком? дайте представление о том, как это сделать. Оба они в основном посвящены Drupal 6, но применяются одни и те же принципы.
Я бы, вероятно, использовал какую-нибудь функцию hook_preprocess или theme, загрузил представление с помощью views_get_view(), выполнил бы это со всеми необходимыми аргументы, если таковые имеются, затем проверьте количество результатов и, если оно пустое, удалите ссылку меню со страницы. Эта последняя часть описана в Как скрыть пункты меню, не полагаясь на разрешения [РЕШЕНО] и Настройка вывода ссылок меню
Обновление: Итак, в вашем примере вы могли бы сделать:
$view = views_get_view('news');
$view->execute();
$link['#access'] = count($view->result) > 0;
Хотя приведенный выше ответ полезен, я не нашел его неполным. Лично я предпочел вместо настройки вывода динамически изменять доступ к конкретным пунктам меню.
- Hook_menu_alter - Предоставляет доступные изменения для настройки новых разрешений доступа
- Access_callback - Это ваша личная функция обратного вызова доступа
- hook_module_implements_alter - Используйте это, чтобы переопределить порядок модулей, обрабатывающих пункты меню, разместите свой внизу после просмотров
/** * Implements hook_menu_alter() */ function yourmodule_menu_alter(&$items) { // Modify view access callback functions $items['viewpath']['access callback'] = 'yourmodule_access_callback'; } /** * Access callback function */ function yourmodule_access_callback($options = array()) { // Grab the default access callback function name, prepare the access // arguments, then see what the default access call back result is // according to views. $access_callback = $options[0]; $access_arguments = $options[1]; $access = call_user_func_array($access_callback, $access_arguments); // If the default access call back was false, then the user is not allowed // access. if (!$access) { return FALSE; } // So far the user is allowed access from the views' settings, let's now // determine if we want to customize the access to the tab. // Determine if the view has any result $view = views_get_view(yourview); $view->set_display(yourdisplay); $view->execute(); return (count($view->result) > 0); } /** * Implements hook_module_implements_alter(). */ function yourmodule_module_implements_alter(&$implementations, $hook) { // When the implementations of hook_menu_alter are called, we need our module // to be called after views, so let's remove it from the implementations then // add it to the end. if ($hook == 'menu_alter') { if (isset($implementations['yourmodule'])) { unset($implementations['yourmodule']); $implementations['yourmodule'] = FALSE; } } }