Добавление программ тематических предложений для представлений (ряды и поля)

Для сайта, который я сейчас создаю, у меня есть множество просмотров, все с несколькими режимами отображения для разных страниц.

Например, у меня есть представление venues, один блок называется listing, в котором перечислены все мои типы содержимого venues. У меня есть еще один блок, в котором есть несколько конкретных контекстных фильтров.

Моя проблема заключается в том, что этот другой блок имеет одинаковый стиль и имеет ту же разметку, что и мой блок listing, поэтому я не хочу дублировать шаблоны Twig для строк и полей для каждого режима отображения.

Какова была моя идея: добавить функцию в мой файл .theme, который позволит мне отображать режимы отображения для определенного вида, и добавьте одно предложение темы от этого. Таким образом, я могу переименовать свои шаблоны Twig и повторно использовать те же самые для уровня строк и полей на столько режимов отображения, сколько захочу.

Поскольку я не использую предложения по теме, измените привязку, я не уверен, как я действительно добавляю предложения тем.

Вот что я получил до сих пор:

/**
 * Theme suggestions for views.
*/
function spve_preprocess_views_view(&$variables) {
  $view = $variables['view'];
  $id = $view->storage->id();

  // Venues
  if($id === 'venues') {
    // Venues grid
    switch($view->current_display) {
      case 'single_occasion_type_listing':
        $suggestion = 'views-view--venues-grid';
        break;

      default:
        $suggestion = null;
        break;
    }
  }
}

Очевидно, мне нужно заменить либо $suggestion на правильную функцию, чтобы добавить предложение темы, либо добавить немного в конец моей функции, чтобы добавить предложение темы, основанное на моей переменной $suggestion.

4 голоса | спросил Daniel Dewhurst 6 FebruaryEurope/MoscowbMon, 06 Feb 2017 15:02:23 +0300000000pmMon, 06 Feb 2017 15:02:23 +030017 2017, 15:02:23

3 ответа


6

Итак, в итоге я придумал следующее решение. В основном я проверяю, является ли текущий $hook, а затем проверяя, является ли представление представлением, я хочу добавить предложения для , а затем проверяет как уровни строк, так и поля.

Если вы найдете /знаете лучшее решение, поделитесь им!

function spve_theme_suggestions_alter(array &$suggestions, array $variables, $hook) {

  /**
   * Venues Grid Twig Template Suggestions
   */
  // Firstly check it's a view
  if($hook === 'views_view') {
    // Check if it's the 'venue' view
    if($variables['view']->id() === 'venues') {
      // Check the display mode
      switch($variables['view']->current_display) {
        case 'listing':              
        case 'single_occasion_type_listing':
          $suggestions[] = 'views-view--venues-grid-rows';
          break;
        default:
          break;
      }
    }
  }

  // Firstly check it's a view field
  if($hook === 'views_view_field') {
    // Check if it's the 'venue' view
    if($variables['view']->id() === 'venues') {
      // Check the display mode
      switch($variables['view']->current_display) {
        case 'listing':              
        case 'single_occasion_type_listing':
          $suggestions[] = 'views-view--venues-grid-field';
          break;
        default:
          break;
      }
    }
  }
  /**
   * E/O Venues Grid Twig Template Suggestions
   */
}
ответил Daniel Dewhurst 6 FebruaryEurope/MoscowbMon, 06 Feb 2017 19:45:33 +0300000000pmMon, 06 Feb 2017 19:45:33 +030017 2017, 19:45:33
3

Ваше решение хорошее, но есть более чистый. Вы можете использовать hook_theme_suggestions_HOOK_alter, поэтому вам не нужно проверять, является ли это view или все, что вы хотите проверить.

В вашем случае это будет выглядеть так:

    function spve_theme_suggestions_views_view_alter(array &$suggestions, array $variables) {
        // If you want you can add a template suggestion for all views
        // based on their ID:
        $suggestions[] = sprintf('views_view__%s', $variables['view']->id());

        // Or you can check the ID, add suggestions, do whatever you want
        // ...
    }

    function spve_theme_suggestions_views_view_field_alter(array &$suggestions, array $variables) {
        // Check here the id, add suggestions, do whatever you want
        // ...
    }

Дополнительная информация в API-интерфейс Drupal

ответил btemperli 21 22017vEurope/Moscow11bEurope/MoscowTue, 21 Nov 2017 13:05:13 +0300 2017, 13:05:13
0

Просто чтобы добавить к Дэниэлсу ответ, что предложения должны быть отформатированы с подчеркиваниями, а не тире: $suggestions[] = 'views_view__venues_grid_rows';

ответил KalleVu 23 J000000Sunday17 2017, 15:34:42

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132