Давно меня мучила проблема - в стандартный вывод каталога Ubercart нельзя было вставить отображение дополнительных свойств товара сделанных с помощью CCK. Зато это можно легко сделать с Views.
Но если Видом переопределить стандартную страницу каталога - то терялась навигация по разделам каталога, а она в Ubercart сделана очень даже хорошо.
В общем от Вида хотелось взять настраиваемую таблицу вывода товаров, а от каталога Ubercart - навигацию по разделам и все это объединить.
После нескольких часов упорной работы мысли и чтения drupal.org нашел простое решение - вставить вывод Вида внутрь страницы каталога, еще час пошел на то, чтобы это сделать и отладить, в результате вышел вот такой код, который надо вставить в файл template.php темы. Предварительно нужно создать Вид, который будет отображать товары, добавить в него аргумент "Term ID" и назвать 'products'
<?php
/**
* Display a formatted catalog page.
*
* If the category has products in it, display them in a TAPIr table. Subcategories
* are linked along the top of the page. If it does not have products, display
* subcategories in a grid with their images and subcategories.
*
* param $tid
* Catalog term id from URL.
* return
* Formatted HTML of the catalog page.
*/
function phptemplate_uc_catalog_browse($tid = 0) {
drupal_add_css(drupal_get_path('module', 'uc_catalog') .'/uc_catalog.css');
$output = '';
$catalog = uc_catalog_get_page((int)$tid);
drupal_set_title(check_plain($catalog->name));
drupal_set_breadcrumb(uc_catalog_set_breadcrumb($catalog->tid));
$types = module_invoke_all('product_types');
$links = array();
$child_list = array();
foreach ($catalog->children as $child) {
if ($child->nodes) {
$links[] = array('title' => $child->name . (variable_get('uc_catalog_breadcrumb_nodecount', false) ? ' ('. $child->nodes .')' : ''), 'href' => uc_catalog_path($child),
'attributes' => array('rel' => 'tag'),
);
}
if ($child->image) {
$image = '
if (module_exists('imagecache')) {
$image .= l(theme('imagecache', 'category', $child->image['filepath']), uc_catalog_path($child), array(), null, null, false, true);
}
else {
$image.= l(theme('image', $child->image['filepath']), uc_catalog_path($child), array(), null, null, false, true);
}
$image .= '
';
}
else {
$image = '
';
}
$grandchildren = array();
$j = 0;
$max_gc_display = 3;
foreach ($child->children as $i => $grandchild) {
if ($j > $max_gc_display) {
break;
}
$g_child_nodes = 0;
foreach ($types as $type) {
$g_child_nodes += taxonomy_term_count_nodes($grandchild->tid, $type);
}
if ($g_child_nodes) {
$grandchildren[$i] = l($grandchild->name, uc_catalog_path($grandchild), array('class' => 'subcategory'));
$j++;
}
}
//$grandchildren = array_slice($grandchildren, 0, intval(count($grandchildren) / 2) + 1, true);
if ($j > $max_gc_display) {
array_push($grandchildren, l(t('More...'), uc_catalog_path($child), array('class' => 'subcategory')));
}
if ($child->nodes) {
//drupal_set_message('
'.print_r($child, true).'
');
//drupal_set_message('
'.uc_catalog_path($child).'
');
$cell_link = $image .''. l($child->name, uc_catalog_path($child)) .'';
if (variable_get('uc_catalog_show_subcategories', true)) {
$cell_link .= "
". implode(', ', $grandchildren) ."\n";
}
$child_list[] = $cell_link;
}
}
// Display table of child categories similar to an osCommerce site's front page.
$columns = variable_get('uc_catalog_category_columns', 3);
$cat_rows = array();
$row = array();
$i = 1;
foreach ($child_list as $cell) {
$row[] = array('data' => $cell, 'class' => 'category');
if ($i % $columns == 0) {
$cat_rows[] = $row;
$row = array();
}
$i++;
}
if (count($row) > 0 && count($row) < $columns) {
if (count($cat_rows) >= 1) {
$row = array_merge($row, array_fill(count($row), $columns - count($row), array('data' => ' ', 'class' => 'category')));
}
$cat_rows[] = $row;
}
/*
*
* вот здесь вместо стандартного вывода товаров - вставляем Вид
*/
if ($tid != 0) {
$view_name = 'products'; //а это название вида, который мы вставляем
$view_args = array($tid);
$view = views_get_view($view_name);
$view->url = $_GET['q'];
$catalog->products = views_build_view('embed', $view, $view_args, $view->use_pager, $view->nodes_per_page);
} else {
$catalog->products = '';
}
if ($catalog->products) {
if ($catalog->image) {
$output .= '
';
}
if ($catalog->description) {
$output .= '
';
}
$output .= theme('table', array(), $cat_rows, array('class' => 'category'));
$output .= $catalog->products;
} else {
if ($catalog->image && $catalog->description) {
$output .= '
';
$output .= '
';
}
$output .= theme('table', array(), $cat_rows, array('class' => 'category'));
}
return $output;
}
?>
Если кому-то пригодится - готов ответить на все интересующий вопросы!
Комментарии
Добрый день!
У меня стоит уберкарт, есть атрибуты товаров, я хочу добавить эти атрибуты к названию товара. Чтобы было видно какие размеры и цвета доступны. Ваш код решает этот вопрос?
Если Вы добавите атрибуты товара в поля Вида - тогда решает!
Я сам атрибутами не пользуюсь - предпочитаю вместо них создавать ССК-поля нужного мне типа, и их выводить в Вид.
Если можно демо до и после, а то убер не ставил пока. Спасибо.
Как выглядит Ubercart + Views - можно посмотреть здесь: http://disk-i-shina.com.ua/catalog/diski-alessio-arizona
На странице отображается раздел каталога, а список товаров сдела с помощью Вида
Спасибо, увидел- понял, понравилось!
Большое спасибо, очень полезно!
Однако пробую темизировать вид списка товаров при помощи wiews theme wizard и phptemplate,
и не могу добиться никакого результата.
Подскажите, в каком направлении копать?
апдейт:
прошу прощения, проблема решена. Вышеуказанный прекрасно совместим с темизацией.
Еще раз спасибо автору!
а чем сделан Подбор дисков и шин по авто как здесь ?
Для выезжающих списков использован http://drupal.org/project/hierarchical_select который темизирует фильтр по таксономии
Не могу найти, каким образом в ubercart вводится кол-во товара на складе!
Как вы организовали отображение есть в наличии и отсутствует на складе?
Большое спасибо.
Возможно ли убрать поля - список стран и список областей , или ограничить список областей?
Спасибо, очень помогло.
Не подскажите как в категории сделать так, что бы картинка была ссылкой на товар, а не ссылкой на картинку?
тут к примеру http://infit.com.ua/catalog/3/
Чем приглушили кнопки товаров,которых нет в наличии?
volocuga, вы у меня спрашивали? если да - немного вопроса не понял.
что то у меня по этой схеме Титлы не печатаются
Нет,у автора топика
Повторю вопросик, может кто услышит.
Нужно что бы в категории картинка булы ссылкой на товар. Как это сделать? Готов оплатить помощь.
если вы имеете ввиду в списке товаров картинки залинкованы были на товар то это вроди не есть проблема. Опишите вопрос внятнее???
Вопрос исчерпан, спасибо.
подскажите тут http://disk-i-shina.com.ua/catalog/diski-alessio
набор фото сделан с помошью представления? или ubercart настроили?
Если ubercart , то подскажите как настроили отображение фото?
Вопрос ко всем, кто это реализовал:
Какие у вас настройки views?
У меня послу вставки этого кода, вместо картинок(привязанных к термину), вот это -
<img src="http://mysite.ru/sites/default/files/imagecache/category/image1.jpg" alt="" title="" class="imagecache imagecache-category" />
Я переделал чуть под 6 друпал так как там views_build_view нет.
У меня таже проблема что и у cpu, но посидел и вроде разобрался вот код(может быть чуть кривоват) под drupal 6
Вообще код взят из модуля вывода самого ubercart и чуть подправил сам)
<?php
$output = '';
// Display table of child categories similar to an osCommerce site's front page.
/*
/**
* Display a formatted catalog page.
*
* If the category has products in it, display them in a TAPIr table. Subcategories
* are linked along the top of the page. If it does not have products, display
* subcategories in a grid with their images and subcategories.
*
* param $tid
* Catalog term id from URL.
* return
* Formatted HTML of the catalog page.
*/
function phptemplate_uc_catalog_browse($tid = 0) {
drupal_add_css(drupal_get_path('module', 'uc_catalog') .'/uc_catalog.css');
$catalog = uc_catalog_get_page((int)$tid);
drupal_set_title(check_plain($catalog->name));
drupal_set_breadcrumb(uc_catalog_set_breadcrumb($catalog->tid));
$types = uc_product_types();
$links = array();
$child_list = array();
foreach ($catalog->children as $child) {
if (!empty($child->nodes)) {
$links[] = array('title' => $child->name . (variable_get('uc_catalog_breadcrumb_nodecount', FALSE) ? ' ('. $child->nodes .')' : ''), 'href' => uc_catalog_path($child),
'attributes' => array('rel' => 'tag'),
);
}
if (!empty($child->image)) {
$image = '<div>';
if (module_exists('imagecache')) {
$image .= l(theme('imagecache', 'uc_category', $child->image['filepath']), uc_catalog_path($child), array('html' => TRUE));
}
else {
$image .= l(theme('image', $child->image['filepath']), uc_catalog_path($child), array('html' => TRUE));
}
$image .= '</div>';
}
else {
$image = '<div></div>';
}
$grandchildren = array();
$j = 0;
$max_gc_display = 3;
foreach ($child->children as $i => $grandchild) {
if ($j > $max_gc_display) {
break;
}
$g_child_nodes = 0;
foreach ($types as $type) {
$g_child_nodes += taxonomy_term_count_nodes($grandchild->tid, $type);
}
if ($g_child_nodes) {
$grandchildren[$i] = l($grandchild->name, uc_catalog_path($grandchild), array('class' => 'subcategory'));
$j++;
}
}
//$grandchildren = array_slice($grandchildren, 0, intval(count($grandchildren) / 2) + 1, TRUE);
if ($j > $max_gc_display) {
array_push($grandchildren, l(t('More...'), uc_catalog_path($child), array('class' => 'subcategory')));
}
if ($child->nodes) {
$cell_link = $image .'<strong>'. l($child->name, uc_catalog_path($child)) .'</strong>';
if (variable_get('uc_catalog_show_subcategories', TRUE)) {
$cell_link .= "<br/><span>". implode(', ', $grandchildren) ."</span>\n";
}
$child_list[] = $cell_link;
}
}
$columns = variable_get('uc_catalog_category_columns', 3);
$cat_rows = array();
$row = array();
$i = 1;
foreach ($child_list as $cell) {
$row[] = array('data' => $cell, 'class' => 'category');
if ($i % $columns == 0) {
$cat_rows[] = $row;
$row = array();
}
$i++;
}
if (count($row) > 0 && count($row) < $columns) {
if (count($cat_rows) >= 1) {
$row = array_merge($row, array_fill(count($row), $columns - count($row), array('data' => ' ', 'class' => 'category')));
}
$cat_rows[] = $row;
}
*
* вот здесь вместо стандартного вывода товаров - вставляем Вид
*/
if ($tid != 0) {
$view_name = 'cat'; //а это название вида, который мы вставляем
$view_args = array($tid);
$view = views_get_view($view_name);
$view->url = $_GET['q'];
//$catalog->products = views_build_view('embed', $view, $view_args, $view->use_pager, $view->nodes_per_page);
$catalog->products = views_embed_view($view_name, 'default', $tid);
//print $view_args;
//print $tid;
//print $view_args;
} else {
$catalog->products = '';
}
if (
$catalog->products) {if ($catalog->image) {
$output .= '<div class="uc-catalog-image">'. theme('imagecache', 'thumbnail', $catalog->image['filepath'], $catalog->name, $catalog->name, array('class' => 'category')) .'</div>';
}
if ($catalog->description) {
$output .= '<div class="uc-catalog-description">'. $catalog->description .'</div>';
}
$output .= theme('table', array(), $cat_rows, array('class' => 'category'));
$output .= $catalog->products;
} else {
if ($catalog->image && $catalog->description) {
$output .= '<div class="uc-catalog-image">'. theme('imagecache', 'thumbnail', $catalog->image['filepath'], $catalog->name, $catalog->name, array('class' => 'category')) .'</div>';
$output .= '<div class="uc-catalog-description">'. $catalog->description .'</div>';
}
$output .= theme('table', array(), $cat_rows, array('class' => 'category'));
}
return $output;
}
?>
Спасибо) Работает)
Такая вот мысль, вывести картинку принадлежащую термину в ubercart в строчке таблицы(которую рисует views).
Если создать тестовое поле CCK с фильтром php.
И вставить туда php код, выводящий картинку термина, которому пренадлежит нода.
Я верстальщик, php не знаю, кто-нибудь сможет помощь, какой код нужен?
В моем скрине я просто вставил
<img height="75" width="100" title="" alt="" src="http://drupal.site/sites/default/files/imagecache/uc_category/dead7.jpg"/>
А как реализовать вывод подкаталогов если таковые имеются?
Данная конструкция работает если нет сложенных каталогов.
Список подкаталогов прекрасно выводятся над самим видом силами самого Ubercart.
Если в виде для аргумента таксономии установить глубину 1 или 2, то можно сразу показывать товары из текщуего каталога и всех его вложенных подкаталогов
Значит я что то не так делаю.не выводится у меня каталоги.
Выводятся все товары данной категории включая товары из подкатегории.
А вот подкатегории не выводятся.
ЗЫ, понаписал так что сам ничего не понимаю.
Drupal 6 + Ubercart. Попробовал поставить код. все нормально - только не различает товар и категорию. либо картинок нет - либо View.
( в зависимости от того, catalog или products указать в Пути) Может кто подскажет - где м.б. ошибка)
Разобрался.
Создаем вид с названием указанным тут:
$view_name = 'cat'; //а это название вида, который мы вставляем
Или cat меняем на свое. и настраиваем дефолтный видон.
никаких страниц не добавляем!!!!
Добавляем сортировку: Таксономия: Term ID (with depth) (depth - можно установить глубину каталога.
Ну и добавляем нужные нам поля. вот и все!
Только в самой категории картинка та что с права вверху чето не отображается.
Еще в последнем коде небольшая ошибка с картинкой каталога:
Надо thumbnail на uc_thumbnail заменить.
Меня картинка эта бесила я вобще убрал.
По итогу:
<?php
$output = '';
// Display table of child categories similar to an osCommerce site's front page.
/*
function phptemplate_uc_catalog_browse($tid = 0) {
drupal_add_css(drupal_get_path('module', 'uc_catalog') .'/uc_catalog.css');
$catalog = uc_catalog_get_page((int)$tid);
drupal_set_title(check_plain($catalog->name));
drupal_set_breadcrumb(uc_catalog_set_breadcrumb($catalog->tid));
$types = uc_product_types();
$links = array();
$child_list = array();
foreach ($catalog->children as $child) {
if (!empty($child->nodes)) {
$links[] = array('title' => $child->name . (variable_get('uc_catalog_breadcrumb_nodecount', FALSE) ? ' ('. $child->nodes .')' : ''), 'href' => uc_catalog_path($child),
'attributes' => array('rel' => 'tag'),
);
}
if (!empty($child->image)) {
$image = '<div>';
if (module_exists('imagecache')) {
$image .= l(theme('imagecache', 'uc_category', $child->image['filepath']), uc_catalog_path($child), array('html' => TRUE));
}
else {
$image .= l(theme('image', $child->image['filepath']), uc_catalog_path($child), array('html' => TRUE));
}
$image .= '</div>';
}
else {
$image = '<div></div>';
}
$grandchildren = array();
$j = 0;
$max_gc_display = 3;
foreach ($child->children as $i => $grandchild) {
if ($j > $max_gc_display) {
break;
}
$g_child_nodes = 0;
foreach ($types as $type) {
$g_child_nodes += taxonomy_term_count_nodes($grandchild->tid, $type);
}
if ($g_child_nodes) {
$grandchildren[$i] = l($grandchild->name, uc_catalog_path($grandchild), array('class' => 'subcategory'));
$j++;
}
}
//$grandchildren = array_slice($grandchildren, 0, intval(count($grandchildren) / 2) + 1, TRUE);
if ($j > $max_gc_display) {
array_push($grandchildren, l(t('More...'), uc_catalog_path($child), array('class' => 'subcategory')));
}
if ($child->nodes) {
$cell_link = $image .'<strong>'. l($child->name, uc_catalog_path($child)) .'</strong>';
if (variable_get('uc_catalog_show_subcategories', TRUE)) {
$cell_link .= "<br/><span>". implode(', ', $grandchildren) ."</span>\n";
}
$child_list[] = $cell_link;
}
}
$columns = variable_get('uc_catalog_category_columns', 3);
$cat_rows = array();
$row = array();
$i = 1;
foreach ($child_list as $cell) {
$row[] = array('data' => $cell, 'class' => 'category');
if ($i % $columns == 0) {
$cat_rows[] = $row;
$row = array();
}
$i++;
}
if (count($row) > 0 && count($row) < $columns) {
if (count($cat_rows) >= 1) {
$row = array_merge($row, array_fill(count($row), $columns - count($row), array('data' => ' ', 'class' => 'category')));
}
$cat_rows[] = $row;
}
*
* вот здесь вместо стандартного вывода товаров - вставляем Вид
*/
if ($tid != 0) {
$view_name = 'uc_products'; //а это название вида, который мы вставляем
$view_args = array($tid);
$view = views_get_view($view_name);
$view->url = $_GET['q'];
//$catalog->products = views_build_view('embed', $view, $view_args, $view->use_pager, $view->nodes_per_page);
$catalog->products = views_embed_view($view_name, 'default', $tid);
//print $view_args;
//print $tid;
//print $view_args;
} else {
$catalog->products = '';
}
if (
$catalog->products) {if ($catalog->image) {
// $output .= '<div class="uc-catalog-image">'. theme('imagecache', 'uc_thumbnail', $catalog->image['filepath'], $catalog->name, $catalog->name, array('class' => 'category')) .'</div>';
}
if ($catalog->description) {
$output .= '<div class="uc-catalog-description">'. $catalog->description .'</div>';
}
$output .= theme('table', array(), $cat_rows, array('class' => 'category'));
$output .= $catalog->products;
} else {
if ($catalog->image && $catalog->description) {
// $output .= '<div class="uc-catalog-image">'. theme('imagecache', 'uc_thumbnail', $catalog->image['filepath'], $catalog->name, $catalog->name, array('class' => 'category')) .'</div>';
$output .= '<div class="uc-catalog-description">'. $catalog->description .'</div>';
}
$output .= theme('table', array(), $cat_rows, array('class' => 'category'));
}
return $output;
}
?>
Спасибо за код, использовать вьюшку вместо каталожного представления получилось.. НО! У меня этой вьюшкой выводятся все продукты, а не только той категории, которую вывожу. Что я делаю не так?
Сложно сказать.
Вот примерно такая вьюза у меня:
спасибо. я просто не добавил аргумент. Views - очень мощный инструмент, но понять его непросто. Я, например, как раз про аргументы и не понял - что это, для чего надо и как их использовать в путях.
http://www.drupal.ru/node/22321 - здесь нормально описано.
Eugef
опишите плз что за модули поиска - обычный и подбор по параметрам?
Все сделано на Views + фильтры
Всем привет.
Может кто-нибудь подробно расскажет (скажет где почитать) как сделана "Панель выбора параметров" на http://disk-i-shina.com.ua/search/disk и "Подбор диска по размеру" на http://disk-i-shina.com.ua/disk/6205.htm.
Заранее огромное спасибо.
Доброго
Данный код нужно вставлять с заменой всего содержимого файла template.php или добавлять ниже(серьезно, не понял)
Все сделал по шагам:
1.Установил УБЕРКАРТ, выставил блоки «карзина» и «catalog», добавил товар
2. В «представлениях» создал вид с типом «материал» и названием «oopstyle»
3. Поставил стиль «сетка»
4. В аргументах отметил «Таксономия: ID Термина (с глубиной)»..сохранил как было(может что и надо указать сдесь еще)
5. Вывел поле «Продукт: Buy it now button»…сохранил как было
6. В файл template.php вставил код из публикации Sywooch (заменил uc_products на oopstyle)
… Причем,код вставлял различными способами: вместо стандартного, после стандартного, после стандартного с удалением <?php во втором случае
7. Или белый экран, или без изменений(никакой сетки в каталоге)
Уже 4 дня парюсь.ПИКЕЦ(((
Помогите, пожалуйста
Код вставляете полностью, старое удалять не нужно.
template.php должен начинаться с
<?php
но закрываться не должен...Спасибо огромное!!! Но у меня почему-то весь товар на oopstyle.ru 2 раза выходит, это нормально? (ссылку дал для наглядности, сайт еще не доделан)
...
Обязуюсь, друзья, как только заработаю первую деньгу, помогу проекту...он незаменим!!!
Проблемы скорее всего в настройках представления которое цепляете к каталогу.
Спасибо за ценный пример.
В стандартоном advanced catalog если вставить в tamplate.php
function phptemplate_uc_catalog_browse($tid = 0) {
if (variable_get('uc_advanced_catalog', FALSE) && module_exists('uc_advanced_catalog')) {
return uc_advanced_catalog_browse($tid);
}
// default is ubercart handler
return theme_uc_catalog_browse($tid);
}
то будет сортировка по по цене...
После вставки кода автора сортировка исчезает, что делать? Помогите вернуть.
спасибо. очень полезный материал
а как добавить количество материалов после названия категории в сетке категорий?
Спасибо большое. Решил задачу. http://www.drupal.ru/node/60909
Но актуален вопрос чтобы именно при помощи Юк_каталога реализовать то что в вышеуказанной теме.
Подпишусь
В закладки
возникла небольшая проблема.
После переопределения каталога уберката, в странице товара есть список терминов
к примеру http://site/category/каталог/букеты/розы при клике открывается страница, с каталогом где все продукты данной категории отображены но без темизации.
у меня вопрос такой, можно ли переопределить ссылки терминов чтобы было на как выше а catalog/[tid]?
или же чтобы осталось как есть, но при клике открывалось тоже что при клике в блоке навигации по каталогу?
- вуд
"Предварительно нужно создать Вид, который будет отображать товары, добавить в него аргумент "Term ID" и назвать 'products'" -как это сделать? Работаю на друпале всего пару дней. Помогите пожалуйста
/admin/build/views - Тут нажать "ДОБАВИТЬ"
народ, а если в вьювсе применяю exposed filters - то после нажатия применить перехожу на другую страницу - можно ли form action как то в коде прописать?
Просто если в вьювсе сделать вид страница- то какой адрес страницы прописывать, чтобы после применения фильтров на этой странице дальше обрабатывались.
[Решение] Замена Ubercart, с помощью Views, вывода категорий, подкатегорий и списка товаров [Два метода]
Вот два метода решения
Метод 1 www.ArtReaktor.com
Метод 2 www.ArtReaktor.com
Надеюсь это сэкономит кому-то время!
В статьях
Замена Ubercart, с помощью Views 2, вывода категорий, подкатегорий и списка товаров.
В данных статьях описывается как заменить вывод категорий и подкатегорий и списка товаров Ubercart, с помощью Views.
Решение для системы Drupal 6.х (в данном случае испытывалось на версии 6.22)
Цель:
Более гибкий вывод списка товаров, а именно:
Корректное применение Views Exposed filters для списка товаров категории.
и другие приятные возможности Views
Решено вывод информации о подкаталогах (child term или дочерние термины)
------------------------------------------------------------
На мой взгляд минусы замены функции Ubercart:
нерешенный вопросом с Exposed filters, а именно - после применения фильтров возвращение на страницу где были, а не на какую-то.
Изменить url form action удалось только в модуле views.module. Есть функция - которая обрабатывает exposed form - проставил там $form['#action'] = $_SERVER["REQUEST_URI"]; вместо geturl(); Почти заменили url form action. После применения фильтра оставался на этой же странице и фильтры применялись к списку товаров именно той категории в которой находились в этот момент.
функция fix-а не маленькая.
Возможны обновления модуля - и тогда не будет совпадения функций, так как поидее мы переписываем полностью определенную функцию.
------------------------------------------------------------