Вывод фото всех вариаций товара на странице

Раздел форума: 

Доброго времени суток.

Магазин одежды на Drupal 7.  Есть страница Product Display, к ней привязано несколько товаров Commerce, у каждого товара есть несколько фото и атрибут цвет.

Подскажите как в ноде product display вывести фото всех привязанных к ней товаров в виде галереи(большое фото и несколько маленьких), чтобы при выборе цвета  фото менялось.

Например product display футболка, связанные товары: футболка красная(1 фото), футболка синяя(1 фото). На странице ноды должно отображаться обе фотографии, а при выборе атрибута цвет первым должно становиться фото товара свыбранным цветом.

Похожих вопросов очень много, но нигде нет ответа. Такое вообще возможно реализовать на Commerce?

 

 

 

 

 

Добавить комментарий

Войти, используя Loginza Google Account Yandex Mail.ru Vkontakte Facebook

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
Прикрепить
Максимальный размер файла: 128 МБ.
Разрешённые типы файлов: txt doc docx rar zip xls xlsx pdf odf odt jpg jpeg gif png psd rtf.

Это стандартный функционал

Это стандартный функционал 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-refere...

Только помимо этого еще нужно добавить первому изображению из продуктов класс наподобии 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) {

}

Этот хук изменяет вывод ноды продукт-дисплей, его нужно добавить в свой модуль. Почитайте про написание своих модулей:
http://drupalbook.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

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';

Имя поля которое в коммерцевском продукте

Проверьте, подставьте ваши значения названия типов материалов и полей.

В очередной раз спасибо!

В очередной раз спасибо!

ничего не работало из-за названия функции.  теперь посыполась целая куча ошибок типа:

  • Notice: Undefined index: und в функции chudo_entity_prepare_view() (строка 28 в файле...)
  • Warning: Invalid argument supplied for foreach() в функции chudo_entity_prepare_view() (строка 28 ...)

Если я правильно понимаю проблема в языке, точнее в его неопределенности. Товары и дисплеи импортируются через 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, если это конечно возможно.

 

 

Спасибо за помощь!!!

Спасибо за помощь!!!

В конечном итоге заработал такой код:

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.