Программные представления в Drupal 7 - PullRequest
0 голосов
/ 12 апреля 2011

Я пытаюсь создать два представления.

View-1 - список узлов.

View-2 - это галерея изображений, связанная с каждым узлом.

Я хочу передать заголовок узла из View-1 в программный View-2, чтобы каждая строка в View-1 загружала View-2 (с результирующим набором, отфильтрованным по заголовку View-1!) .

Я запутался в подходе. Должно ли это произойти в пользовательском модуле, функциях предварительной обработки или какой-либо их комбинации?

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

Я понимаю, что вопрос немного общий, но мне любопытно, как люди с большим опытом подойдут к этой проблеме.

Ответы [ 3 ]

1 голос
/ 27 сентября 2011

Я делал это раньше на D6, где в основном я просто создаю пару файлов шаблона tpl.php для моего View-1.

Внутри моего шаблона View-1 для Display Output (views-view--default.tpl.php в D7 сейчас) Я бы просто программно нашел значение, переданное или возвращенное View-1 для этой строки.

В вашем случае в каждой строке вы будете проверять, какой узел возвращается View-1, а затем я добавлю код в шаблон View-1 для программной загрузки View-2 на основе текущей строки View-1 (т. Е. Узла в вашем случае.)

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

ОБНОВЛЕНИЕ :Только что сделал это на моей новой установке D7.В качестве примера я объясню, как это связано с моей реализацией Ubercart.

У Ubercart, при установке, есть главная страница «домашнего» магазина, расположенная по адресу mysite.com/catalog

Эта страница при загрузке, вызывает представление, созданное Ubercart, с именем uc_catalog_terms.Это представление на основе таксономии, и все, что он делает, - это захватывает все категории таксономии каталога и отображает их.

Например

Как магазин одежды, когда вы переходите к mysite.com/catalog, все, что вам нужнона этой странице вы увидите структуру сетки, такую ​​как:

свитера, рубашки, джинсы

Мое требование состояло в том, что мне нужно было показать категории / термины каталога магазина на этой странице, но ТАКЖЕ показать 3 случайных продукта (изображения) из этой категории / термина ниже каждой категории каталога.

Например

Свитера
Случайный свитер № 1 - Случайный свитер № 2 - Случайный свитер #3

Джинсы
Случайный Жан # 1 - Случайный Жан № 2 - Случайный Жан # 3

Как это достигается?

Я создал свой собственный брендновый пользовательский вид (без страницы или блокировки, только по умолчанию), который захватывает 3 случайных изображения товара на основе аргумента идентификатора таксономического термина и отображает 3 связанных изображения товара.Я назову этот пользовательский вид random_catalog_items.Если 15 является идентификатором термина для свитеров, то при вызове этого представления с аргументом 15 будет отображаться только 3 случайно связанных изображения продуктов свитера.

Теперь я вернулся к представлению uc_catalog_terms и создалфайл шаблона views-view-fields--uc-catalog-terms.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; ?>

ИЗМЕНЕННАЯ ВЕРСИЯ СТАНОВИТСЯ:

<?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
        $title = str_replace('/','-',strtolower($field->raw));
        print '<img src="'.drupal_get_path('theme','my_theme').'/images/catalog/'.$title.'-header.png" />';
        print '<hr style="width: 100%; background: #000; height: 2px; margin-top: 3px;"/>';
        // get the taxonomy term ID 
        $tid = $row->tid;
        // render the 3 random items
        if ($random_products = views_get_view('random_catalog_items' )) {
            print $random_products->execute_display('default', array($tid));
        }

    ?>
  <?php print $field->wrapper_suffix; ?>
<?php endforeach; ?>

Итак, как вы можете видеть в первом представлении, для каждой отображаемой строки я получаю текущий идентификатор термина таксономии, показываемый через доступный объект результата строки - $row->tid, а затем я просто вызываю свое созданное представление для каждой строки., передавая этот термин ID в качестве аргумента для него.Я оставляю там много кода по умолчанию, но в моих конфигурациях вида LABELS и т. Д. Установлены на HIDDEN , поэтому они даже не отображаются в любом случае.

В вашем случае это должно бытьочень легко приспосабливаемый, чтобы просто передать NID узла вместо ID термина таксономии.

VOILA, ЭТО ВСЕ РАБОТАЕТ!Посмотреть в представлении!Надеюсь, это поможет:)

Это поможет загрузить модуль Devel с тех пор, внутри этих шаблонов просмотра вы можете отлаживать и видеть, какие переменные доступны вам через что-то вроде print krumo($row).

0 голосов
/ 13 апреля 2011

Звучит как хорошая возможность использовать обратный вызов ajax. Вы могли бы иметь свой основной вид на части страницы, как обычный, и вторичный вид в пользовательском блоке или что-то еще. когда фокус попадает на основной элемент (в виде нажатия кнопки, наведения или чего-то еще), вы можете использовать обратный вызов ajax, чтобы заменить содержимое вашего пользовательского блока вторичным представлением, используя аргумент.

вы используете для этого друпал 6 или 7? Насколько я понимаю, они делают это по-разному.

0 голосов
/ 12 апреля 2011

Лично я бы вообще избегал просмотров.

Простой модуль, использующий hook_menu для определения пунктов меню и две простые menu-callback-функции , работающие с необходимыми параметрами.

Альтернативой было бы сделать все пользовательские параметры и пользовательскую фильтрацию запросов и таблицы известными представлениям.

Мое эмпирическое правило:

  • Если вы уверены, что вы будете использовать код несколько раз в будущих проектах, аддон просмотра стоит вложений.
  • Если вы будете использовать интерфейс представлений для более чем однократной настройки (общее использование), например, для определения или изменения представлений в рабочем процессе редакторов / веб-мастеров, это имеет смысл.

Основы этого на самом деле просты и, скорее всего, гораздо меньше кода и разработки, чем написание расширений представлений.

/** Implementation of hook_menu().
 */
function gallery_menu() {
  $items = array();

  $items['gallery'] = array(
    'title'            => 'Gallery',
    'page callback'    => '_gallery_list',
    'access arguments' => array('access content'),
  );

  $items['gallery/%gallery'] = array(
    'title'            => 'For dynamic titles, see title_callback documentation',
    'page callback'    => '_gallery_view',
    'access arguments' => array('access content'),
  );

  return $items;
}

/** Load a gallery from database. Name follows %parameter_load hook.
 */
function gallery_load($id) {
  return db_query("SELECT * FROM {galleries} WHERE id = %d", $id);
}

/** Render a list of galleries.
 */
function _gallery_list() {
  $html = "";
  $galleries = pager_query("SELECT * FROM {galleries}", 10);

  foreach($galleries as $gallery) {
    $html .= check_plain($gallery->title); //You would actually build vars here and push them to theme layer instead.
  }
  $html .= theme("pager");
  return $html;
}

/** Load a gallery from database. Name follows %parameter_load hook.
 */
function gallery_load($id) {
  return db_query("SELECT * FROM {galleries} WHERE id = %d", $id);
}

/** Render a list of galleries.
 */
function _gallery_view($gallery) {
  $html = "";
  $images = pager_query("SELECT * FROM {images} WHERE gallery_id = %d", 10, $gallery->id);

  foreach($images as $image) {
    $html .= check_plain($image->title); //You would actually build vars here and push them to theme layer instead.
  }
  $html .= theme("pager");
  return $html;
}

Очевидно, что, как указано в комментариях, вы быдополнительно создайте несколько функций темы для обработки рендеринга: 1) избегайте использования жестко запрограммированного spagetty-HTML во всем модуле и б) позволяйте создателям оставаться в своей теме при создании HTML.

...