Значения по умолчанию для опций составного поля

Материал из Umicms
Перейти к:навигация, поиск


Задача: Реализовать функционал автоматического заполнения цен опций поля типа "Составное", если они не указаны.

Реализация:
Для полей типа "Составное" используется справочник. В модуле "Шаблоны данных" на вкладке "Типы данных" находим тип данных (справочник) для поля типа "Составное" и при его редактировании, добавляем поле типа "Цена" с названием "Цена опции по умолчанию" и идентификатором "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, будут установлены соответствующие значения цен по умолчанию.