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

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