Views. Часть первая - изменение параметров "на лету"

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

Аватар пользователя Dan Dan 17 ноября 2006 в 14:08

Посвящается jerboa7 и Natalie Smile

Периодически сталкиваюсь с проблемами использования views, после решения которых
охота поделиться полученным опытом. Но вот времени как обычно не хватает. Попробую
исправиться и рассказать о паре приёмов, которыми пользуюсь довольно часто.

Потребность в написании возникла после диалога с jerboa7 в теме o CCK.

Итак, дано:
На сайте расположены биографии писателей. Биография каждого писателя - на отдельной
странице. Страница содержит: вводную информацию, список произведений этого писателя,
список его статей, список интервью и т.д. и т.п.
Количество писателей может быть достаточно большим.
Задача:
Дабы не плодить огромное количество списков: список произведений, список статей,
список интервью и т.д. для **каждого** писателя, необходимо создать универсальные
списки, которые будут на странице писателя отображать его статьи, произведения и т.д.

Приступим.

  1. Установим Drupal и модуль views. Для последующих действий нам большего не потребуется.
  2. Создадим категорию "Писатели". Необходимо отметить типы материала, в которых надо
    использовать этот словарь, поставьте галочки на 'page' и 'story'. В категории
    создадим термины (писателей):
  • Пушкин
  • Лермонтов
  • Кобо Абэ
  • Создадим личные страницы писателей (воспользуемся типом page). Названим пусть
    будет фамилия писателя, тело статьи пока пустое и не забудьте проставить нужные
    термины из категории писателей (для страницы "Пушкин" термин должен быть "Пушкин")
  • Создадим статьи о писателях, воспользовавшись типом 'story'. Допустим три статьи
    на каждого писателя, итого - девять Smile Название: "Статья -- Кобо Абэ 1", "Статья
    -- Кобо Абэ 2" и т.д. Не забываем в каждой статье проставлять нужные термины.
  • Строим вид. Я привожу только те параметры, которые я изменял, остальные - по умолчанию.
    • Имя(name) - test; Галочка на "Provide Page View" (показывать на странице);
    • Тип (View Type) - List view (список).
    • Фильтры (filters):
      Тип материала (Node: Type) - 'story' (Is Onу of - story)
      Один из терминов словаря "Писатели" (Taxonomy: Terms for Писатели) - Кобо Абэ (Is Onу of - Кобо Абэ)
    • Поля (Fields)
      Заголовок (Node: Title)
    • Изменяем личные страницы писателей. В теле страницы, после вводного тек текста
      необходимо вписать нижеследующий код (отметьте фильтр "PHP code"). Комментарии
      включать не обязательно.
    • <?php
      // имя вида
      $view_name = 'test';
      // получаем объект
      $view = views_get_view($view_name);
      // очищаем запрос
      // Это надо прокомментировать. Дело в том, что модуль views составляет
      // запрос к БД только один раз - в момент, когда вы сохраняете вид.
      // Нам этот вариант не подходит, т.к. параметры вида у нас изменяются,
      // соответственно должен изменяться и запрос. У модуля есть проверка на
      // пустой запрос - в этом случае он создаётся заново. Именно этот хак
      // мы и используем. Для маньяков - оптимизаторов (хотя таковые views и
      // не используют, наверное) - можно сохранять запрос после радактирования
      // вида и вставлять его здесь, но не думаю что этот способ имеет право на
      // жизнь.
      $view->query = $view->countquery = "";
      // получаем термин, к которому относится данная страница.
      // Функция arg(1) возвращает номер материала, то есть если у нас путь к
      // статье /node/25, то ф-я возвратит 25
      // Последняя цифра в данном выражении (1) - номер словаря, его можно
      // узнать на странице редактирования словарей (admin/taxonomy/), наведя
      // указатель мыши на категорию (в нашем случае это будет номер 1.
      // Внимание!
      // функция taxonomy_node_get_terms_by_vocabulary возвращает массив терминов
      // в нащем случае одна статья не может принадлежать двум и более терминам,
      // но если такое произойдёт, будет взят первый из списка (ф-я array_shift)
      $tid = array_shift(taxonomy_node_get_terms_by_vocabulary(arg(1), 1));

      // просматриваем все фильтры нашего вида и ищем нужный (один из терминов
      // словаря). Это будет фильтр с идентификатором term_node_N.tid, где N -
      // номер словаря.
      // напоминаю, что $tid->tid содержит номер термина (писателя) данного материала
      foreach($view->filter as $num => $item )
      if($item['id'] === 'term_node_1.tid')
      $view->filter[$num]['value'][0]=$tid->tid;

      // отобразить вид
      print views_build_view('embed', $view, array(), FALSE, $limit);
      ?>

      7. На сегодня всё Smile Проверяйте.

    Комментарии

    Аватар пользователя Dan Dan 17 ноября 2006 в 18:17

    C модулем Category всё по другому, не удивлюсь, если всё это можно сделать стандартными средствами этого модуля. Например там ноду саму можно сделать категорией и привязать к ней другие ноды, чем не решение?
    Но использовать его пока не хочу - сырой.

    Аватар пользователя jerboa7 jerboa7 17 ноября 2006 в 19:21

    Я даже фотку на радостях сменила. Теперь я вот такая - со счастливыми глазами. Smile
    Сейчас буду это всё осуществлять.
    Вы просто не представляете, как мне помогли.

    Аватар пользователя seaji seaji 18 ноября 2006 в 1:16

    Простите, а в чем сырость Category?
    На drupal.org в "issues" активней мелькает CCK чем Category.
    ЗЫ. "issues" - это где делают баг репорты, запрашивают новые фичи, и постят патчи.

    Аватар пользователя Dan Dan 18 ноября 2006 в 2:07

    Это потому, что его больше юзают.
    Да и на количество багов посмотрите (CCK-Category):
    критических: 5 -8
    нормальных: 17 - 57
    Но дело не в количестве багов дело, я скорее говорю о личных впечатлениях.
    При моём последнем знакомстве он был... как бы это сказать... непредсказуем. Одна и таже последовательность действий приводила иногда к разным результатам. Плюс не очень хорошее знание принципов его работы. Вобчем на боевой сайт ставить его пока точно не буду, а баловаться пока нет времени.
    Может в ближайшем времени его снова попробую.

    Аватар пользователя palych063 palych063 21 ноября 2006 в 9:06

    Спасибо за статью, действительно здорово =). Только вот taxonomy_dhtml не правильно работает с таким словарем, обидно. Может у кого есть идеи как можно сделать хлебные крошки? Ну или просто меню?

    Аватар пользователя jerboa7 jerboa7 23 ноября 2006 в 15:10

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

    Аватар пользователя Natalie Natalie 19 января 2007 в 5:31

    Спасибо, Дан, очено полезное руководство!

    Раз уж ты у нас заделался спецом по Views, такой вопрос - как сделать специальный вид нод для какого-то конкретного словаря? Views может переписать дефолтный taxonomy/term, но это будет действовать на все категории, а если мне нужно только на какие-то определенные? Я так понимаю, что это надо делать через аргументы, но как именно?

    ---
    ---
    All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.

    Аватар пользователя Dan Dan 19 января 2007 в 17:56

    Ох уж мне эти аргументы! По их поводу могу сказать одно: "тема аргументов не раскрыта" Sad
    Я не удивлюсь, если всё описанное мною тут можно сделать с их помошью....

    Вообще вторую часть я собирался писать про аргументы. Давай попробуем асилить это вместе?
    Мне нужно:
    - более подробное описание твоей задачи (с примерами).
    - подборка ссылок на drupal.org об аргументах - в англ. я не очень (медленно читаю), но если есть хорошая документация/пример, то - не проблема.

    (я не много хочу? Smile

    Аватар пользователя Natalie Natalie 20 января 2007 в 1:20

    В том-то и дело, что нормальной документации "для чайников" по аргументам нет. Народ что-то творит, а объяснять не может или не хочет Smile У меня задача такая: допустим, есть словарь "Новости", в котором ноды показываются в стандартном обратном хронологическом порядке. Соответственно, его мы не трогаем. И есть словарь "Энциклопедия", в котором нужно показать ноды в алфвитном порядке. Как мне сделать вид для этого словаря, чтобы он не затрагивал остальные? Чтобы при заходе на любой термин этого словаря ноды показывались в алфитном порядке. Все это достаточно просто сделать через Category, но увы, cat vies глючит, и мне надоело ждать, пока Джаза разберется с этими и другими багами. Я уже даже заплатить готова, но не знаю, найдутся ли желающие Smile
    ---
    ---
    All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.

    Аватар пользователя Dan Dan 22 января 2007 в 23:48

    Ну вобчем так.
    Создал вид:
    Fields:
    Name -- Node: Title
    Sortable -- Yes
    Default Sort -- Descending
    Filters
    Field -- Taxonomy: Term
    Operator -- Is All Of
    Value -- XXXXX: YYYYYYY
    Arguments
    В "Argument Handling Code" помещаем следующий код:
    <?php
    $view->query = $view->countquery = "";

    foreach($view->field as $num => $item )
    if($item['id'] == 'node.title')
    $view->field[$num]['defaultsort']=arg(2);// второй аргумент: ASC или DESC

    foreach($view->filter as $num => $item )
    if($item['id'] == 'term_node.tid')
    $view->filter[$num]['value'][0]=arg(1); // первый аргумент (номер терма)
    ?>
    И делаем URL какой-нить, например term_test

    И теперь путь "term_test/1/asc" вывод всех нод, привязанных к терму номер 1 в порядке Ascending (возрастания), а "term_test/1/DESC" - в порядке Descending (убывания).

    Можно развить функциональность, например если задан термин номер 7, то порядок сортировки - возрастание, иначе - убывание; код для первого foreach измениться на следующий:
    <?php
    .....
    foreach($view->field as $num => $item )
    if($item['id'] == 'node.title')
    $view->field[$num]['defaultsort']=((arg(2)==7)?' ASC' : 'DESC');
    .....
    ?>
    Использование: "term_test/1" или "term_test/7" и т.д.

    То что надо?

    Аватар пользователя Dan Dan 22 января 2007 в 23:51

    Вообще аргументы, как я понял, не для этого делались, но хак, думаю полезный. В принципе отпадает необходимость в коде, который я привёл в самом начале темы, да и удобней стало - не надо заводить отдельную страницу с PHP-кодом.

    Аватар пользователя Natalie Natalie 29 января 2007 в 22:12

    Дан, спасибо, полезная идея. Это не совсем то, что мне нужно, но все рвно пригодится, я думаю.
    ---
    ---
    All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.

    Аватар пользователя korj korj 1 февраля 2007 в 2:14

    а можно на страницах views делать фильтры изменяемые пользователем? (например, трекер с выбором нужных терминов и возраста нод)

    Аватар пользователя Natalie Natalie 25 февраля 2007 в 0:59

    Здрасьте, это опять я Smile
    Нужна модификация первого примера, с nodereference вместо терминов.
    Имеется: страница автора (один тип материала) и несколько страниц произведений (другой тип материала), которые ссылаются на автора через nodereference. Нужно, чтобы на странице писателя отображались все произведения, для которых он автор (то бишь, ссылаются на него через nodereference).
    Требуется унивесальный view и универсальный код, который можно вставить в шаблон писателя с тем, чтобы это работало для всех сразу Smile
    ---
    ---
    All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.

    Аватар пользователя Natalie Natalie 25 февраля 2007 в 19:09

    Вроде сама разобралась, там не так сложно было.
    ---
    ---
    All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.

    Аватар пользователя vadbars@drupal.org vadbars@drupal.org 25 февраля 2007 в 19:15

    Несложно для "Мастера Views", Natalie :). Может кратенько напишете, что сделали?
    "Что там было, как ты спасся?" (с) Высоцкий


    Я ставлю строчку "php_value error_reporting 7" в файл .htaccess, а вы? Smile Полный русский перевод Drupal 5.x и еще некоторых модулей.

    Аватар пользователя Natalie Natalie 25 февраля 2007 в 19:34

    Несложно, в смысле программировать не надо, а стащить сниппеты с drupal.org Smile

    В виде выбрать аргумент нужный nodereference, а в поле для кода вставить

    $args[0] = arg(1);

    В шаблон вставить

    <?php
    //Загружаем вид, view_name - уникальное имя вашего вида
    $view = views_get_view('view_name');
    //Это просто заголовок
    print t("
    ");
    print t("

    Заголовок для view

    ");
    //вставляем вид в страницу
    print views_build_view('embed', $view );
    ?>
    ---
    ---
    All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.

    Аватар пользователя edhel edhel 23 апреля 2007 в 12:37

    ААА гемор-то какой! Уж лучше я без views сделаю страницу, чем разбираться с аргументами и проч! Wacko

    Например, каталог партнеров по странам в виде ноды типа page:

    Текст-текст-текст.......

    <h2>Наши партнеры</h2>

      <?php
      // список ссылок на страны
      $country = (int)$_GET['country'];
      $contries = taxonomy_get_children(119); // все страны (из таксономии)
      foreach ($contries as $c) {
      $count = taxonomy_term_count_nodes($c->tid);
      if ($count) {
      $link = $c->tid == $country ? $c->name : "tid") ."'>$c->name";
      echo "
    • $link
    • ";
      }
      }
      ?>

    <?php
    // список партнеров в выбранной стране
    if ($country) {
    print taxonomy_render_nodes(taxonomy_select_nodes(array($country)));
    }
    ?>

    Аватар пользователя kiev1 kiev1 23 апреля 2007 в 12:39

    views очень полезная штука, без него в друпале сложно, пример как работать с аргументами можно подсмотреть в модуле галереи acidfree

    Аватар пользователя kiev1 kiev1 23 апреля 2007 в 19:30

    так для того и модули и сделаны что-бы не писать все вручную, для того и друпал сделали, но то такое дело - а вот скажите - где взять типа api.drupal.org но что-б там были api от всех модулей а не только от ядра, возможно-ли такое?

    Аватар пользователя Dan Dan 23 апреля 2007 в 19:42

    2kiev: да, возможно. ставишь модуль локально и он индексирует все установленные в системе модули. я делал. работает Smile

    Аватар пользователя kiev1 kiev1 14 мая 2007 в 8:15

    измучался я с этими видами. Мне надо очень просто: подсчитать сколько в результате нод получается при моем views 'protocols' с аргументом 433 - сколько на drupal.org не копался - так примера и не нашел

    сделал наугад вот так:

    <font color="#000000"><font color="#0000bb"><br>$view </font><font color="#007700">=&nbsp; </font><font color="#0000bb">views_get_view</font><font color="#007700">(</font><font color="#dd0000">'protocols'</font><font color="#007700">);<br></font><font color="#0000bb">$view_args </font><font color="#007700">= array(</font><font color="#0000bb">0 </font><font color="#007700">=&gt; </font><font color="#0000bb">433</font><font color="#007700">);<br></font><font color="#0000bb">views_build_view</font><font color="#007700">(</font><font color="#dd0000">'embed'</font><font color="#007700">, </font><font color="#0000bb">$view</font><font color="#007700">, </font><font color="#0000bb">$view_args</font><font color="#007700">, </font><font color="#0000bb">false</font><font color="#007700">);<br>print </font><font color="#0000bb">$view</font><font color="#007700">-&gt;</font><font color="#0000bb">num_rows</font><font color="#007700">;<br></font><font color="#0000bb"></font></font>


    но чувствую что это полное ламерство - непонятно как посредине вызванное views_build_view влияет на конечный результат - подскажите - как правильно?

    Аватар пользователя gorr gorr 22 мая 2007 в 18:55

    Привет всем! У меня такая проблема:
    Есть тип контента сборник и тип контента композиция.
    Некий пользователь создает сборник, а в нем есть возможность для других пользователей вставлять композиции, то есть в сборнике присутствует ссылка "добавить композицию", при переходе по которой открывается страница для создания композиции, причем эта композиция уже автоматически относится к данному сборнику.И кроме того сборник должен содержать список всех относящихся к нему композиций.
    Если кто может расписать по пунктам какие действия требуется сделать,пожалуйста ответьте!

    Аватар пользователя Dan Dan 22 мая 2007 в 19:24

    Может не заморачиваться? Smile

    Есть сборник, пользователь его может редактировать, так?
    Если надо запретить редактировать отдельные поля, это можно задать модулем (как называется не помню field permission или как-то так). Внутри сборника есть поле node_reference, с множественным выбором. Вуаля!

    Для отображения списка, можно с помощью view создать блок и в разрешениях показа проставить что-то типа node/*/edit (не знаю, сработает ли, но можно и "руками" парсить путь)

    Аватар пользователя gorr gorr 22 мая 2007 в 20:38

    Прости ,Дан, я что то не могу понять до конца твой совет. Напишу как понял:
    1) создаем 2 типа нодов а) сборник и б) композиция
    2) добавляем ссылку в нод сборник под названием "добавить композицию",которая ведет на http://mysite/node/add/composition ,то есть на страницу создания композиции
    3)вопрос в следующем: эта композиция должна автоматически добавиться в список композиций данного сборника и пользователь не должен выбирать сборник к которому должна относится данная композиция,потому что сборники могу иметь одинаковые названия,и пользователь их не сможет отличить. Он просто добавляет в сборник в котором он кликнет на ссылку "добавить композицию".

    Аватар пользователя gorr gorr 22 мая 2007 в 20:54

    nod_reference до конца не понятно как сделать , какие аргументы вписать? Или сам вью списка композиций как то нужно задать? Буду благодарен за помощь.

    Аватар пользователя Dan Dan 23 мая 2007 в 10:21

    Хм, я по другому видел задачу:
    - Существует энное количество "композиций". Они являются самостоятельными материалами и ни с чем не связаны.
    - Также есть материалы типа "сборник", они являются сборником ссылок на композиции. Поэтому и предложил добавить в этот тип материала поле типа "Node Reference" с множественным выбором.

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

    Аватар пользователя sas@drupal.org sas@drupal.org 23 мая 2007 в 11:05

    Типичный подчиненный материал !
    1) В материале "сборник" создать поле editview (выбрать views настроенную для отображения композиций - настраивается передача аргумента nid parent);
    2) В материале "сборник" создает computedfield в виде сслылки на создание "композиции" ( node/add/compositions?nid=$nid ) где nid - parent ID;
    3) В материале композиция поле computedfield вычиляет при создании материала методом $_GET значение parent ID (PID);
    Smile

    Аватар пользователя sas@drupal.org sas@drupal.org 23 мая 2007 в 15:51

    Спасибо, за оценку комментария. А магистр случайно не знает как бы подчиненный материал без открытия новой формы реадктировать, например во viewfiеld ("по месту", "на лету") ? Заранее благодарен.

    Аватар пользователя Dan Dan 23 мая 2007 в 17:42

    Алексей, не скажу - почему-то с первого раза завести связку editview+viewfield не удалось - апач валился с ошибкой. К сожалению нет времени разбираться нет. Если руки дойдут - отпишусь.

    Аватар пользователя Atl Atl 27 мая 2007 в 1:35

    А можно со скриншотами описать в чем суть идеи и как она реализовывается?

    Что-то не совсем понятно и не получается не "плодить списки писателей".
    ------------------------------------------------------------------------------------------------------------
    Вот встречаешь частенько некоторые обучалки (типа этой, хотя совершенно из другой области) и душа радуется - все ясно. И программёру, и начинающему юзеру. Любому!

    Аватар пользователя Dan Dan 4 ноября 2007 в 1:00

    2ii: хоть и запоздалый ответ, но всёж...

    Для какого сайта делал не помню, но сейчас это делается легко с помощью аргументов (во время написания статьи они или криво работали или простоя с ними не разобрался).

    PS: может спросить у jerboa7?

    Аватар пользователя achadidi achadidi 27 декабря 2007 в 1:32

    попыталась сделать по Вашей инструкции, поставила фильтр "PHP code", в тело скопировала код, отправила, в результате получилась текстовая страничка с цветным тексом, код не исполняется. проверила доступ, все ок.
    не подскажете как заставить код исполняться?

    Аватар пользователя SaBoNim SaBoNim 27 декабря 2007 в 2:51

    Какой вы используете визуальный редактор?
    Нужно этот код вставлять именно в html (для FCKeditor кнопка "источник"), а не в окошко редактора (не относится к bueditor)

    Аватар пользователя achadidi achadidi 27 декабря 2007 в 22:07

    ой8-)) наверное никакой...ничего специально не ставила. не знала. ставила скрипт туда же где текст. спасибо, попробую FCKeditor

    Аватар пользователя SaBoNim SaBoNim 27 декабря 2007 в 22:31

    Нет-нет. Не в FCKeditor дело.. Не ставьте его понапрасну, он увесистый. Если туда же где текст, то все должно работать. Не могу вам помочь.

    Аватар пользователя jerboa7 jerboa7 28 декабря 2007 в 0:36

    Напишите подробнее, как делаете.
    Во-первых, напишите названия словарей и их номера.
    Во-вторых, подробную последовательность действий.
    Например, я делаю так.
    Есть словарь "Храмы" - номер словаря 1.
    В словаре термины Всехсвятская, Александро-Невский, Свято-Николаевский и др.
    В настройках словаря ставим галку у page и story.
    Создаю вид, как описано у Дэна.
    Ставим галочки доступа для зарегистрированных и незарегистрированных пользователей!!!
    Обязательно is one of в фильтрах.

    Создаю парочку статей по тематике Всехсвятской церкви как story.
    Создаю справочную информацию о Всехсвятской церкви - page, категория Всехсвятская.
    Вписываю код. Смотрю в категориях - у словаря храмы номер 1. оставляю все как у Дэна.
    Ставлю в код название виды links
    ($view_name = 'links';)
    режим php code.
    Наслаждаюсь результатом.
    http://www.blagoslovi.ru/predstav/chepetsk/act/vseh_svyat_hram

    У самой мозгов нет, буду благодарить умную голову Дэна без устали.

    Аватар пользователя achadidi achadidi 28 декабря 2007 в 18:28

    а нужно что бы у словарей были номера? а где их проставить?
    я делала тупо по инструкции Пушкин, Блок и Мао и по 3 странички story с названиями 1, 2, 3 и указаниями на авторов
    в настройках галки проставила
    а когда вставила в страницу Мао php код, он у меня в текстовом виде и появился, не смотря на включенную опцию php
    чего то я напутала, наверно....
    да, сложен друпал временами, а при моем никаком английском вообще как темный лес, но думаю мозги у меня временем нарастут%))
    распечатаю пост буду заново пробовать

    Аватар пользователя dd dd 26 мая 2008 в 7:34

    achadidi wrote:
    а когда вставила в страницу Мао php код, он у меня в текстовом виде и появился, не смотря на включенную опцию php
    чего то я напутала, наверно....

    <?php
    ....
    ?>
    Аватар пользователя jerboa7 jerboa7 29 декабря 2007 в 12:35

    Номера словарей смотрите в "Категориях".
    У Вас должен быть создан словарь "Писатели", а в нем термины Пушкин, Блок, Мао.
    Так вот при наведении курсора на "edit vocabulary", "list terms" (редактировать словарь и вывести список терминов) вы увидите номер словаря, например taxonomy/vocabulary/1 или 2 или другая цифра.
    Так вот эту самую цифру вставляем в код в этих местах:
    $tid = array_shift(taxonomy_node_get_terms_by_vocabulary(arg(1), 1));
    foreach($view->filter as $num => $item )
    if($item['id'] === 'term_node_1.tid')
    $view->filter[$num]['value'][0]=$tid->tid;

    Вид, надеюсь, создали без проблем?

    Аватар пользователя achadidi achadidi 1 января 2008 в 21:30

    С новым годом!
    спасибо Вам за помощь, но я совсем запуталась, у меня еще перименовалось все через pathavto, вернусь к vews, когда поумнею:))
    пока пошла более простым путем, сделав обязательную сортировку по терминам, и поставив ссылку на них на странице подшивки. не так элегантно, но все находится%)

    Аватар пользователя fasdalf@fasdalf.ru fasdalf@fasdalf.ru 17 января 2008 в 17:20

    Можете обзывать меня хардкодером, но как от views получить то же, что дает код

      if ((integer)(arg(1))>0 and arg(0)=='node' and !arg(2))
        {
          $query = "select n.nid, n.title from {image_attach} i_a join {node} n on i_a.nid=n.nid where i_a.iid=".arg(1);
          $q_res = db_query($query);
          while ($q_str = db_fetch_array($q_res))
          {
            echo l($q_str['title'],'node/'.$q_str['nid'])."<br />";
          }
        }

    Тоесть список всех нод, к которым аттачена показанная картинка. Естественно исользуется image и image_attach.
    Я бы оставил тупо код в блоке, но очень лениво дописывать кучу where и order by к запросу.
    Сделал вид, к виду добавил filter attached image и код обработки аргументов

    $view->query = $view->countquery = "";
    foreach($view->filter as $num => $item )
      if ($item['table']=='image_attach')
         $view->filter[$num]['value']=arg(1);

    Мне не помогло. Упорно использует IID как логическое значение. Добавить фильтр "ручками" в "коде обработки аргументов" не дал, так что я лучше допишу запрос.

    Аватар пользователя Dan Dan 18 января 2008 в 0:25

    Можете обзывать меня хардкодером, но как от views получить то же, что дает код

    А использовать в аргументах номер текущего материала не получается? (лень ставить и проверять Smile

    зато у views внутреннее кеширование есть

    - а армяне лучше, чем грузины!
    - чем лучше-то?!
    - чем грузины...

    Smile

    Аватар пользователя fasdalf@fasdalf.ru fasdalf@fasdalf.ru 10 апреля 2008 в 11:39

    >> А использовать в аргументах номер текущего материала не получается? (лень ставить и проверять Smile
    Мне было не лень, но не вышло ничего хорошего - views гребет все ноды с изображениями, что бы я ни делал.

    Аватар пользователя Roof Roof 15 марта 2010 в 13:32

    Попробую задать свой вопрос еще и в этой древней и почтенной теме Smile

    Есть два словаря (неожиданно, правда?): Товары и Города. Есть тип материалов Товары, каждый материал этого типа имеет один термин из первого словаря и один или несколько из второго. Создаю вид и пытаюсь получить им табличку нод, удовлетворяющих выбранным терминам из обоих словарей. Если делать два аргумента ID термина, то все работает отлично, если же делать два аргумента Имя термина, то в результате всегда пустая страница (ни одной ноды, удовлетворяющей условию).
    Ответ искал тут долго достаточно, пробовал варианты с офф. сайта, не помогает. Подскажите куда мне идти?

    Аватар пользователя Zanuda Zanuda 28 июля 2008 в 13:17

    Уважаемый Даниэль! Спасибо вам огромное за эту статью - мне она очень пригодилась.
    Хочу только добавить, что в моем конкретном случае (Drupal 5.7+Views 1.6) мне пришлось строчку

    $view->query = $view->countquery = "";

    заменить на

    $view->is_cacheable=0;

    а строчку

    $view->filter[$num]['value'][0]=$tid->tid;

    на

    $view->filter[$num]['value'][0]=$tid->name;

    И настало мне счастье))

    Аватар пользователя Dan Dan 22 августа 2008 в 22:01

    "Roof" wrote:
    Если делать два аргумента ID термина, то все работает отлично, если же делать два аргумента Имя термина, то в результате всегда пустая страница (ни одной ноды, удовлетворяющей условию).

    Возможно аргументы не работают с юникодными строками. Попробуй поэкспериментировать, задавая аргументы прямо в виде (в"Argument Handling Code")

    "Zanuda" wrote:
    Хочу только добавить, что в моем конкретном случае (Drupal 5.7+Views 1.6) мне пришлось строчку $view->query = $view->countquery = ""; заменить на $view->is_cacheable=0;

    Да, лучше так. В той версии, которую я использовал этой переменной ещё не было.

    "Zanuda" wrote:
    а строчку $view->filter[$num]['value'][0]=$tid->tid; на $view->filter[$num]['value'][0]=$tid->name;

    Это ты в фильтре вместо идентификатора термина использовал его имя. Можно и так.

    "irbis_78" wrote:
    а как показать во вьюсах пятерку самых читаемых писателей (ну допустим по скачиваниям)?

    А в чём проблема? Фильтр по писателям, сортировка по кол-ву скачиваний убывающая, количество - пять.

    Аватар пользователя irbis_78 irbis_78 4 декабря 2008 в 7:42

    Dan wrote:

    "irbis_78" wrote:
    а как показать во вьюсах пятерку самых читаемых писателей (ну допустим по скачиваниям)?

    А в чём проблема? Фильтр по писателям, сортировка по кол-ву скачиваний убывающая, количество - пять.

    Получится пятерка самых скачиваемых произведений писателя, а нужно пятерка самых скачиваемых писателей. Чувствуете разницу?

    Аватар пользователя aStudent aStudent 13 марта 2010 в 20:26

    Прошу прощения за "некро пост", но проблема всё ещё актуальна. Сделал так, как описано выше, получил:

    Fatal error: Call to undefined function views_build_view() in /home/virtwww/w_ustyany-176_ef505941/http/includes/common.inc(1685) : eval()'d code on line 47

    В указанном файле, указанная строка выглядит так:

    #45 if (!is_null($region) && !is_null($data)) {
    #46 $content[$region][] = $data;
    #47 }
    #48 return $content;
    #49 }

    Был так рад, увидев готовое решение, а тут такое...

    Аватар пользователя Dan Dan 14 марта 2010 в 0:08

    Просмотрел топик ещё раз... это же миллион лет назад было! Smile

    Кстати концентрация девушек в топике весьма плотная. Что-то мы всех дам разогнали с форума...

    Аватар пользователя aStudent aStudent 14 марта 2010 в 15:40

    Было давно, да )
    Кстати, за "некро пост" извинялся выше.
    Забыл дописать - в друпале я 4 с лишним недели. Пхп не владею чуть больше, чем полностью... однако проблема всё актуальнее и актуальнее с каждым днём )
    Версия подопытного 6.15, версия views 1.6.
    Превратностями судьбы было мне суждено решать проблему типа: 6 одноимённых подпунктов для 16 разных пунктов. Решил топорно - сделал 16 представлений.
    ВНЕЗАПНО, превратностями на этот раз заказчика, подпункты обрели свои подпункты, т.е. количество представлений грозит вырасти вдвое, а по полученным только что сведениям, и того больше.

    Каким-то шестым чувством понял, что спасти меня может только следующее: Зная термин страницы, "передаём" этот самый термин представлению, отображённому на этой странице.

    Гугль слабо помог, но благодаря ему я и попал на ваш, Dan, блог. Буду сердечно благодарен любому подспорью.

    Аватар пользователя Dan Dan 14 марта 2010 в 17:47

    "aStudent" wrote:
    Версия подопытного 6.15, версия views 1.6.

    1.6 это для Drupal 5, для 6-ки версия 2.8

    Скорее всего, как и сказал penexe помогут аргументы. Для боле точного ответа нужна более точная постановка задачи.

    Аватар пользователя Dark_kz Dark_kz 8 апреля 2010 в 10:44

    У меня вопрос по аргументам. Всё создал через них, всё работает.
    Посоветуйте как организовать фильтр, т.е. чтобы пользователь сам мог выбрать доступные параметры аргументов. Например в виде фильтра блогов по пользователю или по дате (месяц или год).

    Аватар пользователя Dark_kz Dark_kz 9 апреля 2010 в 11:18

    Спасибо Dan! Вот бы еще найти где их темизировать, там по-умолчанию выводится строка для ввода с автопоиском, мне бы выпадающий список. А можно как-то написать туда свой php код для фильтрации? я бы собрал бы все аргументы и кинул в нужный мне

    Аватар пользователя Dan Dan 9 апреля 2010 в 15:00

    "Dark_kz" wrote:
    Вот бы еще найти где их темизировать,

    Темизация - это изменение оформления, внешнего вида.
    Внешние фильтры - это формы. Изменять их можно с помощью hook_form_alter. Или хуки самого views.