Extra Block Types (EBT) - New Layout Builder experience❗

Extra Block Types (EBT) - styled, customizable block types: Slideshows, Tabs, Cards, Accordions and many others. Built-in settings for background, DOM Box, javascript plugins. Experience the future of layout building today.

Demo EBT modules Download EBT modules

❗Extra Paragraph Types (EPT) - New Paragraphs experience

Extra Paragraph Types (EPT) - analogical paragraph based set of modules.

Demo EPT modules Download EPT modules

Scroll

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

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

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

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

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

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

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

 

 

 

 

 

1 answer
votes: 1296
Answer

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

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

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


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

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

  • 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, если это конечно возможно.

 

 


Тогда должно быть $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.