За основу статьи взят текст для Drupal 6 на английском (http://viziontech.co.il/tutorial2),
который был переведен на русский и адаптирован для Drupal 7.

(Примечание переводчика: Объект "View" оставлен без перевода для упрощения восприятия. Понятие "Display" в контексте View переведено как "Представление".)

Это руководство продолжает серию материалов о "Drupal & Ajax". Предыдущая часть Drupal & Ajax - базовое руководство описывает пошаговую реализацию основ Ajax в Drupal. В этом руководстве мы реализуем динамическое обновление Вашей страницы с результатами View. Так что если Вы не читали предыдущую статью, самое время сделать это сейчас, т.к. здесь мы будем усовершенствовать код предыдущего руководства.

Что мы попытаемся добавить в этом руководстве:

  1. Загрузку существующего view.
  2. Настройку параметров view для выполнения.
  3. Выполнение view.
  4. Загрузку темизированного view в объект JSON и выдачу его.

Как Вы увидите, нет больших различий между выдачей простого статического списка категорий (как это было в базовом руководстве) и выдачей результатов view. В конечном счете, и тот и другой являются HTML потоком, который загружается в объект JSON, возвращаемый клиенту.

Замечание: Если у Вас уже есть view, который Вы хотите искользовать, то можете пропустить шаги с 1 по 3 и использовать свой собственный view (перейти к Шагу 4).

Шаг 1 - Создание типа материала "Simple Product"

Давайте определим новый тип материала. Он будет использоваться для создания материалов, с которыми мы будем работать в этом руководстве.

Назовем наш новый тип материала "Simple Product". Определим для него следующие поля:

  • Description
  • Price
  • Category

Для простоты этого примера ограничимся таким набором полей. Тип для всех полей задайте "simple text".

Шаг 2 - Создаем материал

Сейчас самое время создать несколько материалов типа "Simple Product" для формирования списка продуктов (по меньшей мере 6 штук).
Значение поля "Category" для каждого продукта задайте "books" или "movies" (по 3 продукта на категорию). Эти значения помогут нам позднее формировать список продуктов по категориям.

Шаг3 - Создаем view

Теперь нам нужно создать view. Обучение созданию View выходит за рамки данного руководства, так что если Вы не знакомы с модулем Views, настоятельно рекомендую почитать об этом прежде чем продолжить.
Итак, создаем новый View следующим образом:

  • Имя нового view - "products_by_category".
  • Определяем поля, которые Вы хотите видеть в результате.
  • Определяем аргументы view (тип должен быть Content:Category).
  • Тестируем Ваш View для проверки, выдаются ли продукты в соответствии с заданной в аргументах категорией.

Шаг 4 - Выполнение view

Если Вы помните, в оригинальном коде .module, создан статический список, который загружался в объект JSON и возвращался в качестве результата работы функции:

<?php
function dynamic_products_get_by_category_id($cat_id){
 
$items = '';
  switch(
$cat_id){
    case
12:
    
$items = '<ul><li>Product 1</li><li>Product 2</li></ul>';
     break;
    case
20:
    
$items = '<ul><li>Product 3</li><li>Product 4</li></ul>';
     break; 
  }
// создание объекта JSON. Объект будет содержать свойство с именем “products” которое задается переменной $items.
 
return drupal_json_output(array('products'=>$items));
  exit;
}
?>

Следующий же код вызывает View, который мы хотим загрузить и в возвращает результат:

<?php
function dynamic_products_get_by_category_id($category){

 

$viewName = 'products_by_category'; // Имя нашего view

 

$args = array($category);  // Массив аргументов для view. В данном примере только один аргумент. Ваш реальный View может требовать дополнительных аргументов, которые Вам тогда необходимо будет задать
 
$displayId = 'page'; // ID представления для view.

  //Вызов функции views_embed_view для возврата темизированной выдачи view
 

$res = views_embed_view($viewName, $displayId, $args);

// Создаем объект JSON. Этот объект будет содержать свойство по имени “products”, которое будет задаваться с помощью темизированного результата, выполненного view.
 
return drupal_json_output(array('products'=>$res));
  exit;
}
?>

Несколько замечаний по коду:

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

<?php
$args
= array($category);
?>
<?php
$res
= views_embed_view($viewName, $displayId, $args);

return

drupal_json_output(array('products'=>$res));
?>

Функция views_embed_view, подробнее о которой можно посмотреть здесь, вызывается для возврата темизированного результата.
Во входных параметрах функция принимает имя view, id представления (т.е. default, page, block, etc.) и массив аргументов для view.
На выходе функции html, содержащий результирующий view. Этот view любой темой по вашему желанию, если она была загружена динамически.
После того, как view получен, мы загружаем его в объект JSON, который будет возвращаться в качестве ответа на запрос AJAX.

Шаг 5 - Код обновленной страницы

Последнее изменение, которое необходимо сделать, - обновить код страницы. В прошлом руководстве наш HTML выглядел так:

<div id="”topDiv”">
    <a class="categoryLink" href="/products/get/12">Cat. 1</a>
    <a class="categoryLink" href="/products/get/20">Cat. 2</a>
</div>
<div id="divProducts">&nbsp;</div>

Мы должны изменить его так, чтобы передать корректную категорию, которую определили на шаге 2 ("books" или "movies"):

<div id="”topDiv”">
    <a class="categoryLink" href="/products/get/books">Books</a>
    <a class="categoryLink" href="/products/get/movies">Movies</a>
</div>
<div id="divProducts”>&nbsp;</div>

Это все. Теперь нужно сохранить и протестировать Ваш код.

Рубрики: 

Ярлыки: