• урок
  • pantey

Выводим свои любые значения в таблицу корзины в ubercart 3

29.01.2014

Продолжаем изучение темизации, а в частности такого модуля как ubercart, для тех кто не в курсе – это модуль электронной коммерции, который очень часто использовался в Drupal 6, и реже стал использоваться в Drupal 7, в силу сильного конкурента Commerce. Если вы помните в прошлом уроке, мы с вами темизировали кнопку «удалить» на странице корзины (можно почитать здесь ), а сегодня затронем не мало важную тему, как добавление в эту самую таблицу своих любых значений. Итак, давайте начнем с исходных данных, мы имеем:

  • Drupal 7
  • Стандартный шаблон bartik
  • Ubercart 3

Для начала посмотрим, как выглядит эта самая форма по умолчанию:

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

  1. Зарегистрировать (добавить) вывод нового поля в таблицу
  2. Подгрузить текущую ноду
  3. Выбрать и вывести информацию, в данном случае артикул, в таблицу

Для решения первой задачи воспользуемся хуком

  1. <?php theme_form_uc_cart_view_form_alter();?>

Данный хук позволит нам добавить новую ячейку в корзину, - открываем файл template.php текущей темы, в данном случае это bartik, и пишем следующий код:

  1. <?php
  2. /**
  3.  * Implements theme_form_uc_cart_view_form_alter().
  4.  */
  5. function bartik_form_uc_cart_view_form_alter(&$form, &$form_state) {
  6. $form['items']['#columns']['remove']['weight'] = 6;
  7. $form['items']['#columns']['total']['weight'] = 5;
  8. $form['items']['#columns']['qty']['weight'] = 4;
  9. $form['items']['#columns']['model'] = array( 'cell' => t('Model'), 'weight' => 3, );
  10. }
  11. ?>

Теперь, необходимо очистить кеш сайта и посмотреть, что у нас получилось:

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

  1. <?php theme_tapir_table_alter();?>

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

  1. <?php
  2. /**
  3. * Implements hook_tapir_table_alter().
  4. */
  5. function bartik_tapir_table_alter(&$table, $table_id) {
  6. if ($table_id == 'uc_cart_view_table') {
  7. foreach (element_children($table) as $key) {
  8. if (!empty($table['#parameters'][1][$key]['nid'])) {
  9. $node = node_load($table['#parameters'][1][$key]['nid']['#value']); //подгрузили текущую ноду
  10. $table[$key]['model'] = array( '#markup' => '<span>' . $node->model . '</span>', ); //вывели артикул
  11. $table[$key]['model']['#cell_attributes']['class'] = 'model_sku'; //добавили свой класс для поля
  12. }
  13. }
  14. }
  15. }
  16. ;?>

Теперь, опять же чистим кеш сайта и смотрим, что получилось:

Как теперь мы видим, все у нас получилось, таким образом мы можем вывести абсолютно любые данные, которые привязаны к ноде. С задачей справились.

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

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

Profile picture for user 1541
mozh
27.03.2014

хм, а как сделать вывод своего поля под заголовком?
function pearls_tapir_table_alter(&$table, $table_id) {
if ($table_id == 'uc_cart_view_table') {
foreach (element_children($table) as $key) {
if (!empty($table['#parameters'][1][$key]['nid'])) {
$node = node_load($table['#parameters'][1][$key]['nid']['#value']); //подгрузили текущую ноду
$table[$key]['desc'] = array( '#markup' => '

' . $node->title . '
'. $node->field_short['und'][0]['value'].'

', );
$table[$key]['desc']['#cell_attributes']['class'] = 'desc';
}
}
}
}
так не выходит, ругается на und в поле $node->field_short['und'][0]['value']. И заголовок перестаёт быть ссылкой

Profile picture for user pantey
pantey
27.03.2014

так потому, что это D7, и вывод полей должен быть, как например:

<?php print render($content['field_name']);?>

или если уж совсем по правилам Drupal, через функцию:

<?php field_view_field('node', $node, 'field_name');?>
Profile picture for user 1541
mozh
27.03.2014

в первом случае ничего не выводит, а во втором выводит array
$table[$key]['desc'] = array( '#markup' => field_view_field('node', $node, 'field_short'), );
Не понимаю, что не так

Profile picture for user pantey
pantey
28.03.2014

поле у вас какой тип имеет - ссылка на термин?
то вот для него код:

<?php
/**
* Implements hook_tapir_table_alter().
*/
function themeName_tapir_table_alter(&$table, $table_id) { 
  if ($table_id == 'uc_cart_view_table') { 
    foreach (element_children($table) as $key) {
      if (!empty($table['#parameters'][1][$key]['nid'])) {
        $node = node_load($table['#parameters'][1][$key]['nid']['#value']); //подгрузили текущую ноду
		$result_tid = $node->field_name['und'][0]['tid']; //получили tid термина
		$result_tax = taxonomy_term_load($result_tid); //подгрузили термин
        $table[$key]['model'] = array( '#markup' => '<span>' . $node->model . '</span>', );  //вывели артикул
        $table[$key]['model']['#cell_attributes']['class'] = 'model_sku'; //добавили свой класс для поля
		$table[$key]['tags'] = array('#markup' => $result_tax -> name); //вывели название термина
      } 
    } 
  } 
} 
?>
Profile picture for user 1541
mozh
28.03.2014
function pearls_tapir_table_alter(&$table, $table_id) { 
  if ($table_id == 'uc_cart_view_table') { 
    foreach (element_children($table) as $key) {
      if (!empty($table['#parameters'][1][$key]['nid'])) {
        $node = node_load($table['#parameters'][1][$key]['nid']['#value']); //подгрузили текущую ноду
		$field_short = $node->field_short['und'][0]['value'];
        $table[$key]['desc'] = array( '#markup' => '
'.l($node->title, 'node/'.$node->nid).'
'.$field_short.'
', ); $table[$key]['desc']['#cell_attributes']['class'] = 'desc'; } } } }

Поле Текстовое, хранит краткое описание товара. Сделал так как выше но ругается Notice: Undefined index: und в функции pearls_tapir_table_alter() .
Отключение вывода ошибок наверное не вариант. Вывод полей с помощью строк со второго коммента не выходит. Спасибо за вашу помощь!

Profile picture for user pantey
pantey
28.03.2014

для текстового поля так:

<?php
/**
* Implements hook_tapir_table_alter().
*/
function themeName_tapir_table_alter(&$table, $table_id) { 
  if ($table_id == 'uc_cart_view_table') { 
    foreach (element_children($table) as $key) {
      if (!empty($table['#parameters'][1][$key]['nid'])) {
        $node = node_load($table['#parameters'][1][$key]['nid']['#value']); //подгрузили текущую ноду
	$field_tek = render(field_view_field('node', $node, 'field_name'));	//отрендерели  поле
        $table[$key]['model'] = array( '#markup' => '<span>' . $node->model . '</span>', );  //вывели артикул
        $table[$key]['model']['#cell_attributes']['class'] = 'model_sku'; //добавили свой класс для поля
	$table[$key]['tags'] = array('#markup' => $field_tek); //вывели текстовое поле
      } 
    } 
  } 
}
?>
Profile picture for user 1541
mozh
28.03.2014

Спасибо большое! У Вас замечательный ресурс

Profile picture for user 1541
Asun
16.07.2014

Спасибо большое за статью долго искал такой материал, только вопрос возник...
Как в хуке убрать вывод определенного столбца и его значение из таблицы корзины?

Profile picture for user pantey
pantey
16.07.2014

примерно так:

unset($form['items']['#columns']['ваше поле']);
Profile picture for user 1541
Asun
16.07.2014

Очень логично, спасибо)
И тут же созрел следующий, удалился столбец а значение кнопка удалить переехала под таблицу. Ситуация в том что мне ее нужно вставить по макету с фото товаром и названием в одну колонку, а так же input количество товара нужно поместить с описанием товара и ссылкой правка в другой колонке.

Как мне удалить input - ы из выдачи и при этом их добавить (или перенести) в требуемые колонки?

Profile picture for user pantey
pantey
16.07.2014

так же удаляете через unset и хук

hook_tapir_table_alter()

Не очень понял по темизации, но думаю вам свю функцию темизации необходимо написать.

Profile picture for user 1541
Asun
16.07.2014

Скриншот

На скриншоте есть под таблицей кнопка удалить красная и под ней текстовый input.
Столбцы я удалил так

unset($form['items']['#columns']['remove']);
unset($form['items']['#columns']['qty']);

кнопка и поле почему то не ушли, и еще добавил свой текстовый input он в таблице, но почему то когда я ввожу туда число то количество в массиве товара остается прежним. Если число ввожу в input под таблицей то значение обновляется.

Посмотрел в консоли network запрос уходит правильно с 1 - й разнице что добавляется 2 значения name, тоесть в форме 2 одинаковых input - а "qty", предполагаю если удалить тот что внизу спрятался то верхний будет работать. Только вот пока не пойму как это сделать.

Помогите если понимаете о чем я..)

Profile picture for user 1541
Asun
16.07.2014

https://yadi.sk/i/TZuUerBgWjgxh

Прошу прощения вот скриншот

Profile picture for user 1541
Asun
16.07.2014

items[0][qty]
Это поле для количества, обновляется только второе значение

Profile picture for user pantey
pantey
17.07.2014

ну так с ходу вам не скажу, предустановлена uber нет. Я бы писал свою ф-ю темизацию. А так вам devel в помощь, смотрите откуда, что приходит и в каком виде.