Значения по умолчанию для опций составного поля — различия между версиями
Материал из Umicms
Stexe (обсуждение | вклад) |
Stexe (обсуждение | вклад) |
||
Строка 4: | Строка 4: | ||
'''Реализация:'''<br /> | '''Реализация:'''<br /> | ||
− | Для полей типа "Составное" используется справочник. В модуле "Шаблоны данных" на вкладке "Типы данных" находим тип данных (справочник) для поля типа "Составное" и при его редактировании добавляем поле типа "Цена" с названием "Цена опции по умолчанию" и идентификатором "option_price". Теперь, для элементов этого справочника помимо названия, можно | + | Для полей типа "Составное" используется справочник. В модуле "Шаблоны данных" на вкладке "Типы данных" находим тип данных (справочник) для поля типа "Составное" и при его редактировании, добавляем поле типа "Цена" с названием "Цена опции по умолчанию" и идентификатором "option_price". Теперь, для элементов этого справочника помимо названия, можно указать цену по умолчанию.<br /> |
+ | В директории classes\modules\catalog\ создаем файл custom_events.php, если он еще не создан, со следующим содержанием: | ||
+ | <source lang="php"> | ||
+ | <?php | ||
+ | new umiEventListener("systemModifyElement", "catalog", "setOptionsPrice"); | ||
+ | new umiEventListener("systemCreateElement", "catalog", "setOptionsPrice"); | ||
+ | ?> | ||
+ | </source> | ||
+ | В файл classes\modules\catalog\__custom_adm.php добавляем код обработчика событий: | ||
+ | <source lang="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; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | } | ||
+ | } | ||
+ | </source> |
Версия 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;
}
}
}
}
}