Сниппет вывода самых популярных товаров - Drupal 6
С помощью данного сниппета можно получить подобное отображение блока самых популярных товаров, естественно применив CSS:
Как вывести блок самых популярных товаров Drupal 6.
Данное решение, возможно, не совсем корректно именно с точки зрения программирования под Drupal 6, но т.к. для PHP и MySql вполне корректно, то на Drupal работает на ура (надеюсь понятно, что я хотел этим сказать).
Итак, передо мной стояла задача создания каталога товаров и вывод блока самых просматриваемых товаров (один просмотр = одна сессия). Для реализации подобного решения мной был выбран модуль Ubercart, и необходимые для работы этого модуля дополнительные компоненты:
Ubercart
Ubercart - ядро
- Conditional Actions
- Order
- Product
- Store
Ubercart - core (optional)
- Attribute
- Catalog
- Reports
CCK, Views, filefield, imagefield, imageapi, thickbox, imagecache.
Statistics advanced settings - который требуется для того, чтобы не накручивались счетчики просмотра нод, то есть чтобы было так: один просмотр = одна сессия.
А теперь разберем код для вывода блока товаров:
$type = 'product'; // Тип нод
$num_nodes = '10'; // Количество выводимых нод
/*
Запрос к БД
Здесь следует пояснить, что мы выбираем из базы:
node_counter.totalcount - количество просмотров ноды из таблицы node_counter;
node.type - тип ноды;
node.title - название ноды;
uc_products.sell_price - в моем случае я не стал замарачиваться с ubercart и выводил на сайт именно значение SELL_PRICE, т.к. оно обязательно для заполнения.
content_type_product.field_bigimg_fid - значение field_bigimg_fid из таблицы content_type_product, равняется значению fid из таблицы files, это нам понадобится для формирования запроса для вывода превью.
*/
$sql = "SELECT node.nid,
node_counter.nid,
node_counter.totalcount,
node.type,
node.title,
uc_products.nid,
uc_products.sell_price,
content_type_product.nid,
content_type_product.field_bigimg_fid
FROM node
LEFT JOIN node_counter ON node.nid = node_counter.nid
LEFT JOIN uc_products ON node.nid = uc_products.nid
LEFT JOIN content_type_product ON node.nid = content_type_product.nid
WHERE node.type in ('product')
ORDER BY node_counter.totalcount DESC";
$result = db_query_range($sql, $type, 0, $num_nodes);
while ($n = db_fetch_array($result)) {
$n_nid = $n['nid'];
$n_title = $n['title'];
$n_price = $n['sell_price'];
$file_fid = $n['field_bigimg_fid'];
// Запрос на выбор из базы файла - превью
$sql_fid = "SELECT fid, filepath FROM files WHERE fid ='".$file_fid."'";
$result_fid = db_query($sql_fid);
$n_fid = db_fetch_array($result_fid);
$filepath = $n_fid['filepath'];
$n_price_row = strpos($n_price, ".");
$n_price = substr($n_price, 0, $n_price_row);
print '<div class="right-block">';
print '<a class="right-img" href="/product/'.$n_nid.'"><img src="/'.$filepath.'" alt="'.$n_title.'"></a>';
print '<div class="right-title"><a href="/product/'.$n_nid.'">'.$n_title.'</a></div>';
print '<div class="sticker-little"><span class="sticker-span">'.$n_price.'</span></div>';
print '</div>';
// Если счетчик меньше 10, то hr не выводится. Для эстетики.
$countx++;
if($countx < 10) print '<hr>';
};
Для корректной обрезки тайтла до определенного количества символов нужно воспользоваться функцией mb_substr (substr() для UTF-8).
В итоге у нас будет следующий вывод информации, а что из этого можно сделать, можно увидеть на картинке выше: