Как сгрупировать характеристики товара на витрине?

[10 ноября 2016 г.]    Российская сборка Magento 2.49.12
Magento 2: модули и услуги
#1 Игорь
  • Группа: Гости

10.05.2010 12:59

Добрый день, меня интересует как можно решить след. проблему
При огромном кол-ве аттрибутов создаются атрибут - сеты для их группировки, но
при рендеринге в шаблоне след. код возвращает массив в котором не указано к какому аттрибут сету относится конкретный аттрибут
(шаблон вывода аттрибутов /httpdocs/app/design/frontend/base/default/template/catalog/product/view/attributes.phtml)
<?php if($_additional = $this->getAdditionalData()): ?>
<?php foreach ($_additional as $_data): ?>
	...
            <tr>
                <th class="label"><?php echo $this->htmlEscape($this->__($_data['label'])) ?></th>
                <td class="data"><?php echo $_helper->productAttribute($_product, $_data['value'], $_data['code']) ?></td>
            </tr>
...
        <?php endforeach; ?>
....


какие есть возможности сгруппировать аттрибуты по сетам , не перебирая все сеты.

например товар Материнская плата



Основные
Тип памяти -DDR II
Графический процессор - NVIDIA GeForce 8400 GS на базе G86
Чипсет - GeForce 8400GS
Объем памяти - 512Mb
Разрядность шины памяти - 64 bit

Максимальное разрешение - 2560x1600

Частота
Частота RAMDAC - 400 МГц
Частота чипа/памяти - 560MHz/ 800MHz
Разъемы и выходы
Дополнительные функции -
DVI, D-Sub, TV-out, YPrPb, поддержка HDCP
Комплектация
Упаковка - BOX

#2 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

10.05.2010 16:50

Просмотр сообщенияИгорь (10.05.2010 12:59) писал:

При огромном кол-ве аттрибутов создаются атрибут - сеты для их группировки


Боюсь, вы путаете attribute set и attribute group.
Для группировки атрибутов служат attribute group.
attribute set служат для описания свойств некоторого класса объектов предметной области.
В вашем примере всё множество атрибутов материнской платы можно вынести в отдельный attribute set.
А потом уже этот attribute set разбить на группы.

#3 Гость
  • Группа: Гости

10.05.2010 17:41

cогласен , но вопрос не в этом. как получить название группы атрибута т.к. приведенный код выше в шаблоне возвращает многомерный массив всех аттрибутов в виде
[mb_shl_sata] => Array
(
[label] => SATA интерфейсный/питание, устройств
[value] => 1/1
[code] => mb_shl_sata
)
,
[mb_per_com] => Array
(
[label] => COM
[value] => 1/-/-
[code] => mb_per_com
)

без разделения на группы, в данном случае mb_per_com,mb_shl_sata находятся в разных группах и группировка вывода изза этого затруднена

#4 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

10.05.2010 17:56

Просмотр сообщенияГость (10.05.2010 17:41) писал:

как получить название группы атрибута


Программный код получения названия группы атрибута приведён в сообщении №6 данной темы.
Чтобы решение было проще находить, выношу его в отдельную тему: как в Magento получить название группы атрибута

#5 Игорь
  • Группа: Гости

10.05.2010 18:11

Ok) Как тогда в этом шаблоне узнать $setId )

#6 Игорь
  • Группа: Гости

10.05.2010 18:13

$_product->getAttributeSetId();

#7 Гость
  • Группа: Гости

10.05.2010 18:28

Просмотр сообщенияИгорь (10.05.2010 18:13) писал:

$_product->getAttributeSetId();


давайте по порядку
- в админке давайте у нас так - Изображение


- на странице Изображение

SATA интерфейсный/питание, устройств - это и есть mb_shl_sata
т.е. все выводится , но как получить доступ к значению группы, как узнать название группы каждого аттрибута (mb_shl_sata - группа sata)

Теперь в шаблоне у нас есть $_product , можем получить attribute set ( $_setId = $_product->getAttributeSetId(); )
код $groupId = $this->getData('attribute_set_info/' . $_setId . '/group_id');
var_dump($groupId ); показывает null

#8 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

10.05.2010 18:41

Какому классу принадлежит объект $this?

#9 Гость
  • Группа: Гости

10.05.2010 18:57

Mage_Catalog_Block_Product_View_Attributes

#10 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

10.05.2010 19:07

Тогда посмотрите внимательно сообщение №6 данной темы.

#11 Игорь
  • Группа: Гости

10.05.2010 19:48

он используется для отображения аттрибутов но не наследуется от Mage_Eav_Model_Entity_Attribute_Abstract

#12 Наташа
  • Группа: Гости

14.05.2010 09:27

Все привет, так что кто-то знает как решить эту проблему ?

#13 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

14.05.2010 09:59

Какую конкретно проблему?

#14 Наташа
  • Группа: Гости

14.05.2010 10:47

Mage_Eav_Model_Entity_Attribute_Abstract
он используется для отображения аттрибутов но не наследуется от Mage_Eav_Model_Entity_Attribute_Abstract

вопрос остается открытым

#15 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

14.05.2010 10:53

Цитата, которую вы привели - по правилам русского языка является утвердительным предложением, а не вопросительным.
Поэтому какой конкретно вопрос для вас остается открытым - непонятно.

#16 Наташа
  • Группа: Гости

14.05.2010 11:22

Просмотр сообщенияДмитрий Федюк (08.05.2010 19:50) писал:

$groupId = $this->getData('attribute_set_info/' . $setId . '/group_id');
$group = Mage::getModel ("eav/entity_attribute_group");
$group->load ($groupId);
$groupName = $group->getAttributeGroupName ();


$this - класс-потомок от Mage_Eav_Model_Entity_Attribute_Abstract
$setId - идентификатор требуемого множества атрибутов (attribute set). Атрибут в разных множествах атрибутов может находиться в разных группах.


как получить $groupName в обїекте класса Mage_Catalog_Block_Product_View_Attributes (которsq не является потомком от Mage_Eav_Model_Entity_Attribute_Abstract) и которій отвечает за вывод аттрибутов

#17 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

14.05.2010 11:30

Пусть $block - объект класса Mage_Catalog_Block_Product_View_Attributes.
Тогда объект-товар можно получить так: $block->getProduct ()
Далее, у объекта-товара присутствует метод getAttributes.
Поэтому программный код $block->getProduct ()->getAttributes () вернет коллекцию атрибутов товара, причем элементы коллекции являются потомками класса Mage_Eav_Model_Entity_Attribute_Abstract.

#18 Борис
  • Группа: Гости

19.05.2010 09:58

На самом деле я бы не советовал оформлять код таким образом
$block->getProduct()->getAttributes() - этот код на самом деле уже выполняется вызывать его опять нет смысла
Правильно будит переопределить класс Mage_Catalog_Block_Product_View_Attributes и изменить в нем метод getAdditionalData так, чтобы он добавлял в коллекцию данных также и данные о группе.

переопределение класса ядра нужно специальным образом описать в xml файле (папка /app/etc/modules/)
скажем класс будит называться MyStore_Catalog_Block_Product_View_Attributes
тогда создаем в папке /app/etc/modules/ файл MyStore_Catalog_Block_Product_View_Attributes.xml

<?xml version="1.0"?>
<config>
	<modules>
		<MyStore_Catalog_Block_Product_View_Attributes>
			<active>true</active>
			<codePool>local</codePool>
		</MyStore_Catalog_Block_Product_View_Attributes>
	</modules>
	
	<global>
		<blocks>
			<core>
				<rewrite>
					<block_product_view_attributes>MyStore_Catalog_Block_Product_View_Attributes</block_product_view_attributes>
				</rewrite>
			</core>
		</blocks>
	</global>
</config>


а в классе /httpdocs/app/code/local/MyStore/Catalog/Block/Product/View/Attributes.php
пишем
class MyApp_Catalog_Block_Product_View_Attributes extends Mage_Catalog_Block_Product_View_Attributes
{
   
  
    public function getAdditionalData(array $excludeAttr = array())
{
 //TODO: пишем все тут
}



Для новичков возможно подход не очень понятен, но зато он правильный с точки зрения расширения системы , не нагромождает логику в шаблонах и дает возможность спокойно обновляться до следующих версий магазина , не боясь что код будет потерян

Поделиться темой: