Как скрыть меню страницы просмотра, если в нем нет содержимого?


Я использую модуль просмотров (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, даже если должны быть результаты.

Author: DRUPWAY, 2016-06-21

2 answers

Есть несколько вариантов сделать это, но все они, похоже, требуют специального кодирования.

Возможно Скрытие вкладки, когда представление пустое или Как программно определить, есть ли у представления результат, прежде чем отображать все представление целиком? дайте представление о том, как это сделать. Оба они в основном посвящены Drupal 6, но применяются одни и те же принципы.

Я бы, вероятно, использовал какую-нибудь функцию hook_preprocess или theme, загрузил представление с помощью views_get_view(), выполнил бы это со всеми необходимыми аргументы, если таковые имеются, затем проверьте количество результатов и, если оно пустое, удалите ссылку меню со страницы. Эта последняя часть описана в Как скрыть пункты меню, не полагаясь на разрешения [РЕШЕНО] и Настройка вывода ссылок меню

Обновление: Итак, в вашем примере вы могли бы сделать:

$view = views_get_view('news');
$view->execute();
$link['#access'] = count($view->result) > 0;
 1
Author: berliner, 2017-04-13 12:46:59

Хотя приведенный выше ответ полезен, я не нашел его неполным. Лично я предпочел вместо настройки вывода динамически изменять доступ к конкретным пунктам меню.

  • 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;
        }
      }
    }
 1
Author: shaneonabike, 2018-04-17 11:32:38