• урок
  • pantey

Темизация блока корзины Ubercart 3

17.10.2013

При создании интернет магазинов в связке Drupal 7 + Ubercart 3, часто встаёт вопрос темизации блока корзины. Особенно затрудняют эту задачу дизайнеры, которые все чаще и чаще стали отрисовывать какие-то не вероятные способы отображения информации. Для опытного разработчика, переписать блок корзины не составит особого труда, а вот для новичков – это настоящая проблема, хотя Ubercart так же предоставляет массу возможностей для переопределения практически чего угодно. Итак приступим к решению нашей задачи. Начнём с исходных данных, мы имеет связку Drupal 7 + Ubercart, в качестве шаблона используем Bartik. В качестве примера давайте реализуем возможность показывать ссылки корзины , а именно «Открыть корзину» и «Оформление заказа», только если количество отложенных товаров в корзину больше двух, ну и обернём эти ссылки в дополнительный блок. На первый взгляд кому-то может показаться, что задача не из простых, но это лишь на первый взгляд. Итак приступим, как вы наверное уже поняли для решения данной задачи мы будем использовать очередной хук

  1. <?php hook_uc_cart_block_summary($variables);?>

Полный код выглядит так:

  1. <?php function themename_uc_cart_block_summary($variables) {
  2. $item_count = $variables['item_count'];
  3. $item_text = $variables['item_text'];
  4. $total = $variables['total'];
  5. $summary_links = $variables['summary_links'];
  6.  
  7. $output = '<table class="cart-block-summary"><tbody><tr>'
  8. . '<td class="cart-block-summary-items">' . $item_text . '</td>'
  9. . '<td class="cart-block-summary-total"><label>' . t('Total:')
  10. . '</label> ' . theme('uc_price', array('price' => $total)) . '</td></tr>';
  11.  
  12. if ($item_count > 0) {
  13. $output .= '<tr class="cart-block-summary-links"><td colspan="2">'
  14. . theme('links', array('links' => $summary_links)) . '</td></tr>';
  15. }
  16.  
  17. $output .= '</tbody></table>';
  18.  
  19. return $output;
  20. }?>

Что бы его использовать нам необходимо открыть файл template.php вашей текущей темы (если нет, то его необходимо создать) и дописать в него следующее

  1. <?php function bartik_uc_cart_block_summary($variables) {
  2. $item_count = $variables['item_count'];
  3. $item_text = $variables['item_text'];
  4. $total = $variables['total'];
  5. $summary_links = $variables['summary_links'];
  6.  
  7. $output = '<table class="cart-block-summary"><tbody><tr>'
  8. . '<td class="cart-block-summary-items">' . $item_text . '</td>'
  9. . '<td class="cart-block-summary-total"><label>' . t('Total:')
  10. . '</label> ' . theme('uc_price', array('price' => $total)) . '</td></tr>';
  11.  
  12. if ($item_count > 0) {
  13. $output .= '<tr class="cart-block-summary-links"><td colspan="2">'
  14. . theme('links', array('links' => $summary_links)) . '</td></tr>';
  15. }
  16.  
  17. $output .= '</tbody></table>';
  18.  
  19. return $output;
  20. }?>

Не забываем изменить в названии функции -> название вашей темы, в моём случае это bartik. Далее чистим кеш сайта. Смотрим, что получилось на сайте

Видим, что ничего не изменило. Всё правильно, ведь мы использовали полный код, который итак Ubercart использует по умолчанию. Теперь давайте обернём ссылки корзины в дополнительный блок, ну допусти с классом «newLinkCart». Для этого переходим в нашу с вами функцию и допишем вывод нового оберточного div с новым классом:

  1. <?php
  2. function bartik_uc_cart_block_summary($variables) {
  3. $item_count = $variables['item_count'];
  4. $item_text = $variables['item_text'];
  5. $total = $variables['total'];
  6. $summary_links = $variables['summary_links'];
  7.  
  8. $output = '<table class="cart-block-summary"><tbody><tr>'
  9. . '<td class="cart-block-summary-items">' . $item_text . '</td>'
  10. . '<td class="cart-block-summary-total"><label>' . t('Total:')
  11. . '</label> ' . theme('uc_price', array('price' => $total)) . '</td></tr>';
  12.  
  13. if ($item_count > 0) {
  14. $output .= '<tr class="cart-block-summary-links"><td colspan="2">'
  15. .'<div class="newLinkCart">' . theme('links', array('links' => $summary_links)) .'</div>' . '</td></tr>';
  16. }
  17.  
  18. $output .= '</tbody></table>';
  19.  
  20. return $output;
  21. }
  22.  
  23. ?>

В результате чего, на сайте мы увидим, что все ссылки обёрнуты в новый блок

Теперь давайте реализуем возможность выводить данные ссылки, только если количество отложенных товаров в корзину больше 2х, тут еще проще. Просто необходимо изменить условие для вывода данных ссылок, по умолчанию они выводятся, если хотя бы один товар присутствует в корзине, т.е. больше нуля. Изменим эту часть кода на двойку, в результате должно получиться следующее:

  1. <?php
  2. function bartik_uc_cart_block_summary($variables) {
  3. $item_count = $variables['item_count'];
  4. $item_text = $variables['item_text'];
  5. $total = $variables['total'];
  6. $summary_links = $variables['summary_links'];
  7.  
  8. $output = '<table class="cart-block-summary"><tbody><tr>'
  9. . '<td class="cart-block-summary-items">' . $item_text . '</td>'
  10. . '<td class="cart-block-summary-total"><label>' . t('Total:')
  11. . '</label> ' . theme('uc_price', array('price' => $total)) . '</td></tr>';
  12.  
  13. if ($item_count > 2) {
  14. $output .= '<tr class="cart-block-summary-links"><td colspan="2">'
  15. .'<div class="newLinkCart">' . theme('links', array('links' => $summary_links)) .'</div>' . '</td></tr>';
  16. }
  17.  
  18. $output .= '</tbody></table>';
  19.  
  20. return $output;
  21. }
  22.  
  23. ?>

Теперь можно проверить, как это работает на сайте. Добавим 2 товара в корзину и видим, что наших ссылок нет:

А вот если 3 и более позиции в корзине, то ссылки появляются.

Теперь, думаю вы представляете каким образом темизировать корзину Ubercart. Через данный хук можно переписать любой элемент корзины в блоке, не путайте его со страницей корзины. На этом можно закончить.

-->
Узнавай о новых статьях сайта - первым. Просто подпишись на рассылку.

Комментарии (4)

Profile picture for user 1541
Юрий
22.09.2014

У меня ничего не поменялось, у меня шаблон bootstrap

Profile picture for user 1541
Андрей
19.10.2015

Тоже не работает.

Profile picture for user 1541
Андрей
19.10.2015

Нужно очистить кэш

Profile picture for user 1541
Дмитрий
08.04.2016

Добрый день Павел. Подскажите как вывести изображение товара в блоке корзины. Устанавливал модуль uc_pic_cart_block, сыпятся ошибки.
Буду благодарен за помощь.