Выбор вывода через views

Главные вкладки

Аватар пользователя morgusha morgusha 30 мая 2018 в 15:32

Подскажите пожалуйста ! Не могу найти как сделать так чтобы на странице каталога можно было бы делать выбор его отображения. Во views есть вывод: grid и table вот надо кнопку типа отобразить grid или отобразить table !
Как легче реализовать ?
Может можно скопировать шаблон вывода по умолчанию в рабочий каталог и там поставить условие при котором бы подгружался иной шаблон ?! Вопрос как подгружать программно шаблоны в drupal7 !
Но это просто мысли !

Комментарии

Аватар пользователя morgusha morgusha 31 мая 2018 в 13:02

Хочу попробывать сделать так !
Скопировал в папку с шаблоном файл views-view-table--uc-catalog--catalog.tpl.php ну короче переопределил вывод шаблона views.
Код такой вот :

<?php<table <?php if ($classes): ?> class="<?php print $classes?>"<?php endif ?><?php print $attributes?>>
   <?php if (!empty($title) || !empty($caption)): ?>
     <caption><?php print $caption $title?></caption>
  <?php endif; ?>
  <?php if (!empty($header)) : ?>
    <thead>
      <tr>
        <?php foreach ($header as $field => $label): ?>
          <th <?php if ($header_classes[$field]): ?> class="<?php print $header_classes[$field]; ?>"<?php endif; ?> scope="col">
            <?php print $label?>
          </th>
        <?php endforeach; ?>
      </tr>
    </thead>
  <?php endif; ?>
  <tbody>
    <?php foreach ($rows as $row_count => $row): ?>
      <tr <?php if ($row_classes[$row_count]): ?> class="<?php print implode(' '$row_classes[$row_count]); ?>"<?php endif; ?>>
        <?php foreach ($row as $field => $content): ?>
          <td <?php if ($field_classes[$field][$row_count]): ?> class="<?php print $field_classes[$field][$row_count]; ?>"<?php endif; ?><?php print drupal_attributes($field_attributes[$field][$row_count]); ?>>
            <?php print $content?>
          </td>
        <?php endforeach; ?>
      </tr>
    <?php endforeach; ?>
  </tbody>
</table>?>

Теперь вот хочу в файл этого же шаблона вставить код шаблона views-view-list.tpl.php
С таким вот кодом:

<?php print $wrapper_prefix?>
  <?php if (!empty($title)) : ?>
    <h3><?php print $title?></h3>
  <?php endif; ?>
  <?php print $list_type_prefix?>
    <?php foreach ($rows as $id => $row): ?>
      <li class="<?php print $classes_array[$id]; ?>"><?php print $row?></li>
    <?php endforeach; ?>
  <?php print $list_type_suffix?>
<?php 
print $wrapper_suffix?>

В итоге на странице выводится основное представление ,а вот вывод второго шаблона через код выдаёт такое вот :
Array
Array
Array
Array

как верно встаивть код ещё одного вывода views в этот шаблон ?

Аватар пользователя postgres postgres 31 мая 2018 в 14:14
  • "><?php print $row; ?>
  • Вы же выводите все строку, которая array - вот и получаете ...
    сделайте

    <?php
    <li class="<?php print $classes_array[$id]; ?>"><?php print_r($rowTRUE); ?></li>
    ?>

    увидите в каких ключах что лежит и выведите их потом...

    Аватар пользователя morgusha morgusha 31 мая 2018 в 14:33

    [quote=postgres]

  • "><?php print $row; ?>
  • Вы же выводите все строку, которая array - вот и получаете ...

    сделайте

    <?php
    <li class="<?php print $classes_array[$id]; ?>"><?php print_r($rowTRUE); ?></li>
    ?>

    Вообще просто пусто тогда !
    Вот ссылка

    Аватар пользователя fairrandir fairrandir 31 мая 2018 в 16:19
    1

    В смысле догадайтесь? Что почему так?

    print_r($var); - вывести переменную в человекочитаемом виде.
    print_r($var, TRUE); - вернуть строку, содержащую переменную в человекочитаемом виде.
    echo print_r($var, TRUE); - вывести строку, которую вернул print_r, которая содержит переменную в человекочитаемом виде.

    Это приблизительно как вместо того, чтобы сделать ксерокопию - отсканировать и сразу распечатать.

    Аватар пользователя postgres postgres 31 мая 2018 в 16:38

    Короче оформляя вывод print_r как возвращаемую строку я хотел обратить внимание, намекнуть на то, что

    1. Вывести сырой $row можно прямо во view через глобальный php, тогда return print_r($row, TRUE);
    2. в шаблоне twig нельзя print_r без параметра return = TRUE (исключительно ради форматирования конечно)

    3. Если предположить, что все знают о наличии второго параметра у print_r, ровно как и о наличии второго параметра json_decode, то это избыточный код. Но не извращенный, обращаю на это внимание.

    Аватар пользователя fairrandir fairrandir 31 мая 2018 в 16:48
    2

    postgres wrote:
    Короче оформляя вывод print_r как возвращаемую строку я хотел обратить внимание, намекнуть на то, что
    1. Вывести сырой $row можно прямо во view через глобальный php, тогда return print_r($row, TRUE);
    2. в шаблоне twig нельзя print_r без параметра return = TRUE (исключительно ради форматирования конечно)
    3. Если предположить, что все знают о наличии второго параметра у print_r, ровно как и о наличии второго параметра json_decode, то это избыточный код. Но не извращенный, обращаю на это внимание.

    1. Глобальный php доступен только при наличии php-фильтра, который есть зло. А в контексте шаблона вообще непонятно, причём тут пхп-фильтр.
    2. В шаблоне твиг вообще нельзя print_r, там dump(). И речь о семёрке.
    3. ИМХО, ненужная избыточность есть одна из форм извращений.

    Аватар пользователя postgres postgres 31 мая 2018 в 18:22

    глобальный фильтр не зло о добро, чушь собачья про зло.
    dump работает только в режиме отладки, тебя за деньги научу как работать print_r.
    Твое имхо тут избыточно, в этом топике.
    Ты чего хочешь, двойной солянки?

    Аватар пользователя morgusha morgusha 31 мая 2018 в 15:29

    <?php echo print_r($rowTRUE); ?>
    Опа ! офигеть первый раз такую конструкцию вижу "echo print_r" хмммм
    Хочу сделать js переключение просто вывода !

    Аватар пользователя postgres postgres 31 мая 2018 в 15:37

    внимание, из документации...
    Помните, что print_r() перемещает указатель массива в конец. Используйте reset() для возврата его в начало.
    Если вы хотите сохранить результат, используйте второй параметр return. Когда TRUE, print_r() возвратит информацию, а не будет печатать его.

    Аватар пользователя fairrandir fairrandir 31 мая 2018 в 18:16
    2

    Вообще причём тут print_r, шаблоны и иже с ними? Сейчас уже не могу найти обсуждений, но есть навскидку несколько вариантов:
    1. Выводить одну и ту же разметку, с помощью js переключать класс, который меняет отображение.
    2. Третий коммент в этом же топике
    3. Ещё вариант, как можно настроить
    4. Вообще по хардкору, отдельные урлы под отдельные вьюмоды, выводить вкладками.

    Аватар пользователя OldWarrior OldWarrior 1 июня 2018 в 0:00

    fairrandir wrote:

    Ещё вариант, как можно настроить

    Имхо, это лучше всего.
    У Андеда обычно хорошо отработанные решения, с минимумом правок, бери и используй.

    PS. Есть, кстати, ещё <?php print var_export($variableTRUE); ?>

    Аватар пользователя OldWarrior OldWarrior 2 июня 2018 в 0:14

    loup54 wrote:

    Не знаю чей это сайт, но там много интересного и по этой теме есть простой вариант с js - http://stinto.ru/diy/drupal-view-grid-to-list, автор даже спрайты прилагает)

    Это по сути реализация вот этого (только с куками):

    fairrandir wrote:

    1. Выводить одну и ту же разметку, с помощью js переключать класс, который меняет отображение.

    Аватар пользователя VasyOK VasyOK 2 июня 2018 в 22:49

    Мой предыдущей пост был скорее шуточным.

    Автор. возможно вам поможет модуль https://www.drupal.org/project/views_modes

    Если нет то надо 2 кнопочки сделать, по нажатию на которые меняется класс у вывода (на jquery). В зависмости от класса формируем записи вьюхи клетками и строками. Класс можно в куках хранить.

    К сожалению код не могу скинуть т.к. клента с подобным сайтом кризис скосил.

    Аватар пользователя morgusha morgusha 5 июня 2018 в 13:53

    Вообще ничего не понимаю !
    Сделал файл:
    views-view-fields--uc-catalog--catalog.tpl.php

    туда внёс такой вот код:

    <?php foreach ($fields as $id => $field): ?>
      <?php if (!empty($field->separator)): ?>
        <?php print $field->separator?>
      <?php endif; ?>

      <?php print $field->wrapper_prefix?>
        <?php print $field->label_html?>
        <?php print $field->content?>
      <?php print $field->wrapper_suffix?>
    <?php 
    endforeach; ?>

    <table <?php if ($classes): ?> class="<?php print $classes?>"<?php endif ?><?php print $attributes?>>
       <?php if (!empty($title) || !empty($caption)): ?>
         <caption><?php print $caption $title?></caption>
      <?php endif; ?>
      <?php if (!empty($header)) : ?>
        <thead>
          <tr>
            <?php foreach ($header as $field => $label): ?>
              <th <?php if ($header_classes[$field]): ?> class="<?php print $header_classes[$field]; ?>"<?php endif; ?> scope="col">
                <?php print $label?>
              </th>
            <?php endforeach; ?>
          </tr>
        </thead>
      <?php endif; ?>
      <tbody>
        <?php foreach ($rows as $row_count => $row): ?>
          <tr <?php if ($row_classes[$row_count]): ?> class="<?php print implode(' '$row_classes[$row_count]); ?>"<?php endif; ?>>
            <?php foreach ($row as $field => $content): ?>
              <td <?php if ($field_classes[$field][$row_count]): ?> class="<?php print $field_classes[$field][$row_count]; ?>"<?php endif; ?><?php print drupal_attributes($field_attributes[$field][$row_count]); ?>>
                <?php print $content?>
              </td>
            <?php endforeach; ?>
          </tr>
        <?php endforeach; ?>
      </tbody>
    </table>?>

    В итоге работает ток вывод в виде списка ! В виде таблицы вообще ничего не выводится на страницу....в чем проблема ?

    Аватар пользователя VasyOK VasyOK 16 июня 2018 в 8:52

    Значит возможное решение
    1) подключаем jquery библиотеку для работы с куки
    template.php темы добавить строчку
    drupal_add_library('system', 'jquery.cookie');

    2) определяем 2 кнопки переключения классов t-strokami t-kletkoi и область и которой будет меняться класс t-content
    переписываем шаблон вьюхи
    Тема: Информация - и первая же ссылка даст код и название файла типа views-view--[имя вьюхи].tpl.php
    там где
    <?php if ($rows): ?>
    меняем код на

     <?php if ($rows): ?>
        <div class="switch">
          <div class="t-strokami">Строками</div>
          <div class="t-kletkoi">Клеткой</div>
        </div>
        <div class="t-content strokami">
          <?php print $rows; ?>
        </div>
      <?php elseif ($empty): ?>
        <div class="view-empty">
          <?php print $empty; ?>
        </div>
      <?php endif; ?>

    3) скрипт подключаем его в info файле темы

    (function ($) {
     Drupal.behaviors.slineTheme = {
      attach: function(context, settings) {                            
           
        function setMyCookie() {
          myCookieVal = $('.t-content').hasClass('strokami') ? 'isActive' : 'notActive';
          $.cookie('myCookieName', myCookieVal, { path: '/' });                
        }

        if ($.cookie('myCookieName') == 'isActive') {
            $('.t-content').addClass('strokami');    
            $('.t-content').removeClass('kletkoi');
        } else {
            $('.t-content').addClass('kletkoi');    
            $('.t-content').removeClass('strokami');
        }  
       
        $(".t-strokami").click(function(){
            $(".t-content").toggleClass("kletkoi",false);        
            $(".t-content").toggleClass("strokami",true);
            setMyCookie();
        });

        $(".t-kletkoi").click(function(){
            $(".t-content").toggleClass("kletkoi",true);
            $(".t-content").toggleClass("strokami",false);          
            setMyCookie();
        });        
           
      }
     };
     
    })(jQuery);  

    4. CSS-им

    .t-content.strokami .views-row {
    width: 100%;
    }
    .t-content.kletkoi .views-row {
    width: 33.33%;
    }

    Както-так Smile