Значения по умолчанию для опций составного поля — различия между версиями
Stexe (обсуждение | вклад) |
Stexe (обсуждение | вклад) |
||
(не показаны 4 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
− | [[category:Написание кастомных макросов]] | + | [[category:Написание кастомных макросов]] [[category:Вопросы и уроки разработки сайтов на UMI.CMS]] |
− | '''Задача:''' Реализовать функционал автоматического заполнения цен опций поля типа "Составное", если они не указаны. | + | '''Задача:''' Реализовать функционал автоматического заполнения цен опций поля типа "Составное", если они не указаны. <br /> |
'''Реализация:'''<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> | ||
+ | |||
+ | При сохранении или создании страницы в административной панели для всех опций полей типа "Составное", у которых не указана цена или она равна 0, будут установлены соответствующие значения цен по умолчанию. |
Текущая версия на 10:04, 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;
}
}
}
}
}
При сохранении или создании страницы в административной панели для всех опций полей типа "Составное", у которых не указана цена или она равна 0, будут установлены соответствующие значения цен по умолчанию.