Вывод фото всех вариаций товара на странице
Доброго времени суток.
Магазин одежды на Drupal 7. Есть страница Product Display, к ней привязано несколько товаров Commerce, у каждого товара есть несколько фото и атрибут цвет.
Подскажите как в ноде product display вывести фото всех привязанных к ней товаров в виде галереи(большое фото и несколько маленьких), чтобы при выборе цвета фото менялось.
Например product display футболка, связанные товары: футболка красная(1 фото), футболка синяя(1 фото). На странице ноды должно отображаться обе фотографии, а при выборе атрибута цвет первым должно становиться фото товара свыбранным цветом.
Похожих вопросов очень много, но нигде нет ответа. Такое вообще возможно реализовать на Commerce?
Это стандартный функционал commerce kickstart:
https://www.drupal.org/project/commerce_kickstart
https://drupalcommerce.org/commerce-kickstart-2
Вы можете его повторить с помощью модуля commerce fancy attributes:
https://www.drupal.org/project/commerce_fancy_attributes
Вот видео о том как его настроить:
https://vimeo.com/44308580
Спасибо за ответ.
Но это не совсем то. Наверно я не очень понятно объяснил. Попроую еще раз.
Есть страница pdroduct display(фотболка), с ней связаны 3 товара: футболка синяя, футболка красная и футболка белая. У каждого товара есть фото(минимум одно).
Так вот мне нужно, чтобы на странице product display выводились сразу изображения всех трех связанных с ним товаров в виде галереи(одно большое изображение, а остальные превью), а при выборе атрибута цвет(например синий) фото синей футболки выводилось большим, а остальные оставались превьюшками.
Я понимаю, что это легко сделать, если поле фото товара находится в ноде, а не в товаре коммерса, но в таком случае при выборе цвета не будет меняться фото и не правильно будет работать импорт.
вот тут работает имеено так как нужно: http://www.bonprix.ua/style/dzhinsy-shirokij-uzkij-obem-253358/?type=image&return=ref
Нашел еще несколько тем с похожими вопросами, но без решения:
https://drupalcommerce.org/discussions/3038/displaying-all-images-referenced-products-product-display-node
http://www.drupal.ru/node/107854
Заранее благодарю за помощь.
Видимо придется использовать кастом как здесь:
https://drupalcommerce.org/discussions/3038/displaying-all-images-referenced-products-product-display-node
Только помимо этого еще нужно добавить первому изображению из продуктов класс наподобии start-photo-product-id, на которое будет становиться галерея при переключение товаров. Например здесь:
<?php foreach($product->{$photos_field_name}[$photos_field_language] as $image) { $product_field_language = field_language($product_display_entity_type, $display, $photos_field_name); $display->{$photos_field_name}[$product_field_language][] = $image; } ?>
Но скорее всего так просто во вьюс не получится отдельному row добавить такой класс и нужно будет выводить изображения кастомным образом, а не через Views.
Также еще нужно добавить и продукт поле фотографий, если нужно чтобы были одинаковые фотографии для продуктов, но не привязанные к конкретному продукту, а к нескольким.
Спасибо!
Я пока новичок в Drupal, да и в принципе в веб-разработке. Подскажите, как именно это использовать.
Страница продукт-дисплей выводится без views, обычным шаблоном tpl.php + display suite ds-reset.
Насколько я понимаю этот код нужно встроить в шаблон, и при этом заранее загрузить все связанные фото всех связанных товаров.
/** * Implements hook_entity_prepare_view(). */ function HOOK_entity_prepare_view($entities, $type) { }
Этот хук изменяет вывод ноды продукт-дисплей, его нужно добавить в свой модуль. Почитайте про написание своих модулей:
https://drupalbook.org/ru/content/razrabotka-modulei-dlya-drupala
В этом коде нужно будет поменять
$product_display_type = 'dishes_product_display';
На имя вашего дисплея, скорее всего это full.
$photos_field_name = 'field_product_photos';
На имя вашего поля, которое в продукте.
Доброго времени суток.
Прочитал, посмотрел, до сих пор победить так и не получилось. Подскажите куда смотреть и где искать.
Создал модуль, вставил туда этот код:
<?php /** * Implements hook_entity_prepare_view(). */ function HOOK_entity_prepare_view($entities, $type) { $product_display_entity_type = 'node'; $product_display_type = 'product_display'; foreach($entities as $display) { if($type == $product_display_entity_type && $display->type == $product_display_type){ $product_entity_type = 'commerce_product'; $product_field_name = 'field_product_display_products'; $photos_field_name = 'field_product_photo'; $product_field_language = field_language($product_display_entity_type, $display, $product_field_name); $field_product = $display->{$product_field_name}[$product_field_language]; foreach($field_product as $product_id) { $product = commerce_product_load($product_id['product_id']); $photos_field_language = field_language($product_entity_type, $product, $photos_field_name); foreach($product->{$photos_field_name}[$photos_field_language] as $image) { $product_field_language = field_language($product_display_entity_type, $display, $photos_field_name); $display->{$photos_field_name}[$product_field_language][] = $image; } } } } }
После включения модуля ничего не меняется, ни ошибок ни предупреждений, ничего:(
Может существует какой-нибудь модуль или софтина для пошаговой отладки?
function HOOK_entity_prepare_view($entities, $type) {
HOOK нужно заменить на имя своего модуля.
$product_display_type = 'product_display';
Контент тип проверьте возможно у вас product
$product_field_name = 'field_product_display_products';
Поле связи которое у вас в контент типе на коммерцовский продукт.
$photos_field_name = 'field_product_photo';
Имя поля которое в коммерцевском продукте
Проверьте, подставьте ваши значения названия типов материалов и полей.
В очередной раз спасибо!
ничего не работало из-за названия функции. теперь посыполась целая куча ошибок типа:
Если я правильно понимаю проблема в языке, точнее в его неопределенности. Товары и дисплеи импортируются через Feeds, вот только у дисплеев значение ru, а у товаров или ' ' или und(при пересохранении). В настройках feeds и там и там язык установлен русский.
Подскажите в каком направлении искать решение?
У вас несколько языков на сайте? Если нет, то переключайте все на und (неопределенный язык). Если несколько языков то нужно вместо und писать $node->language, тогда префикс будет выставляться автоматически.
Добрый день!
Так и не получается реализовать вывод всех фото.
Язык один. Очистил весь контент, создал пару товаров и продуктдисплей для них(без feeds). У товаров язык - und, у продуктдисплея - ru. Ошибки ушли, но фото так и не работают, точнее отображаются как обычно.
Может я что-то упустил и в код модуля что-то еще нужно добавить?
Последовательность действий была такая:
1) Создал chudo.info
2) Создал chudo.module
вставил в него этот код:
<?php /** * Implements hook_entity_prepare_view(). */ function chudo_entity_prepare_view($entities, $type) { $product_display_entity_type = 'node'; $product_display_type = 'product_display'; // create product display gallery with all referenced product images foreach($entities as $display) { if($type == $product_display_entity_type && $display->type == $product_display_type){ $product_entity_type = 'commerce_product'; $product_field_name = 'field_product_display_products'; $photos_field_name = 'field_product_photo'; // get products ID's $product_field_language = field_language($product_display_entity_type, $display, $product_field_name); $field_product = $display->{$product_field_name}[$product_field_language]; // get products image fields foreach($field_product as $product_id) { $product = commerce_product_load($product_id['product_id']); $photos_field_language = field_language($product_entity_type, $product, $photos_field_name); // merge produts images with product display images foreach($product->{$photos_field_name}[$photos_field_language] as $image) { $product_field_language = field_language($product_display_entity_type, $display, $photos_field_name); $display->{$photos_field_name}[$product_field_language][] = $image; } } } } }
3) поменял значения на свои
4) активировал модуль и почистил кэш
Если язык один, то можете использовать LANGUAGE_NONE, код станет меньше.
$photos_field_name я правильно понял, что у вас поля картинок называются одинаково в product display и commerce product?
Мне кажется нужно записывать в переменную $entity, сейчас так:$display
->{
$photos_field_name
}[
$product_field_language
][] =
$image
;
Попробуйте добавлять в $entity:
$entity
->{
$photos_field_name
}[
$product_field_language
][] =
$image
;
Нет,
в commerce product - field_product_photo
а в product display - field_photo
Но я бы не хотел использовать в product display поле фото. То есть чтобы оно было только в commerce product, если это конечно возможно.
Тогда должно быть $entity->field_photo.
Спасибо за помощь!!!
В конечном итоге заработал такой код:
function mymodule_entity_prepare_view($entities, $type) { $product_display_entity_type = 'node'; $product_display_type = 'product_display'; // create product display gallery with all referenced product images foreach($entities as $display) { if($type == $product_display_entity_type && $display->type == $product_display_type){ $product_entity_type = 'commerce_product'; $product_field_name = 'field_product_display_products'; $photos_field_name = 'field_product_photo'; $photos_disp_field_name = 'field_photo'; // get products ID's $field_product = $display->{$product_field_name}[LANGUAGE_NONE]; // get products image fields foreach($field_product as $product_id) { $product = commerce_product_load($product_id['product_id']); // merge produts images with product display images foreach($product->{$photos_field_name}[LANGUAGE_NONE] as $image) { $display->{$photos_disp_field_name}[LANGUAGE_NONE][] = $image; } } } } }
Но выяснилось что гораздо проще сделать тоже самое через Views.