Значения по умолчанию для опций составного поля — различия между версиями
Материал из Umicms
Stexe (обсуждение | вклад) |
Stexe (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
[[category:Написание кастомных макросов]] | [[category:Написание кастомных макросов]] | ||
− | '''Задача:''' Реализовать функционал автоматического заполнения цен опций поля типа "Составное", если они не указаны. | + | '''Задача:''' Реализовать функционал автоматического заполнения цен опций поля типа "Составное", если они не указаны. <br /> |
'''Реализация:'''<br /> | '''Реализация:'''<br /> |
Версия 09:55, 26 февраля 2014
Задача: Реализовать функционал автоматического заполнения цен опций поля типа "Составное", если они не указаны.
Реализация:
Для полей типа "Составное" используется справочник. В модуле "Шаблоны данных" на вкладке "Типы данных" находим тип данных (справочник) для поля типа "Составное" и при его редактировании, добавляем поле типа "Цена" с названием "Цена опции по умолчанию" и идентификатором "option_price". Теперь, для элементов этого справочника помимо названия, можно указать цену по умолчанию.
В директории classes\modules\catalog\ создаем файл custom_events.php, если он еще не создан, со следующим содержанием:
<?php
new umiEventListener("systemModifyElement", "catalog", "setOptionsPrice");
new umiEventListener("systemCreateElement", "catalog", "setOptionsPrice");
?>
В файл classes\modules\catalog\__custom_adm.php добавляем код обработчика событий:
public function setOptionsPrice($event)
{
if ( $event->getMode() == 'after' )
{
$objectColl = umiObjectsCollection::getInstance();
$objectTypesColl = umiObjectTypesCollection::getInstance();
$element = $event->getRef('element');
$object = $element->getObject();
$typeId = $object->getTypeId();
$type = $objectTypesColl->getType($typeId);
$allFields = $type->getAllFields(true);
if ( !is_array($allFields) )
{
return;
}
foreach( $allFields as $umiField )
{
$fieldDataType = $umiField->getFieldType()->getDataType();
if ( $fieldDataType == 'optioned' )
{
$fieldName = $umiField->getName();
$fieldValue = $object->getValue($fieldName);
$i = 0;
foreach ( $fieldValue as $option )
{
if ( (isset($option['float']) && $option['float'] == 0) || (!isset($option['float'])) )
{
$guideObjectId = $option['rel'];
$guideObject = $objectColl->getObject($guideObjectId);
if ( $guideObject instanceof iUmiObject )
{
$optionDefVal = floatval($guideObject->getValue('option_price'));
if ( $optionDefVal > 0)
{
$fieldValueNew = $fieldValue;
$fieldValueNew[$i]['float'] = $optionDefVal;
$object->setValue($fieldName, $fieldValueNew);
}
}
}
++$i;
}
}
}
}
}