Классы ElementItem

Задача, которую мы хотим решить - это кэширование данных модели. Если мы получим объект модели и попытаемся сохранить его в кеше, мы получим ошибку «Сериализация« Закрытие не разрешено »».

Вы можете проверить это, запустив следующий код:

            
    $obProduct = \Lovata\Shopaholic\Models\Product::firs();
    \Cache::set'product_first', $obProduct,600);

Чтобы решить эту задачу, мы создали классы ElementItem, которые хранят данные модели в виде массива. Объект класса ElementItem позволяет получать кэшированные значения из массива так же, как при получении данных из объекта модели.

            
    //Get product name from model object
    $obProduct = Product::find(1);
    echo $obProduct->name;

    //Get product name from item object
    $obProductItem = ProductItem::make(1);
    echo $obProductItem->name;

Логическая схема

Логическая схема инициализации нового объекта ProductItem и получения значения поля "name"

Список методов

make($iElementID, [$obElement = null])
  • iElementID - элемент ID
  • obElement - объект модели, необязательный параметр

Статический метод, используемый для создания нового объекта класса ElementItem. Массив данных элемента будет заполнен из объекта модели без использования кэша.

            
    $obItem = ElementItem::make(1);
makeNoCache($iElementID, [$obElement = null])
  • iElementID - элемент ID
  • obElement - объект модели, необязательный параметр

Статический метод, используемый для создания нового объекта класса ElementItem. Массив данных элемента будет заполнен из объекта модели без использования кэша.

            
    $obItem = ElementItem::makeNoCache(1);
clearCache($iElementID)
  • iElementID - элемент ID

Статический метод очистки кеша элемента.

            
    ElementItem::clearCache(1);
getObject()

Метод возвращает объект модели.

            
    $obItem = ElementItem::make(10);
    $obModel = $obItem->getObject();
isEmpty()

Метод возвращает значение true, если заполнение данных элемента из объекта или кэша не удалось.

            
    $obItem = ElementItem::make(10);
    if($obItem->isEmpty()) {
        return false;
    }
isNotEmpty()

Метод возвращает true, если заполнение данных элемента из объекта или кэша было успешно завершено.

            
    $obItem = ElementItem::make(10);
    if($obItem->isNotEmpty()) {
        //сделать что-то
    }
toArray()

Метод возвращает массив данных элементов.

            
    $obItem = ElementItem::make(10);
    return $obItem->toArray();
toJSON()

Метод возвращает строку данных массива элементов JSON.

            
    $obItem = ElementItem::make(10);
    return $obItem->toJSON();

Расширение

Вы можете добавить динамические методы и свойства в класс элементов с помощью расширяющих конструкторов. Это функция по умолчанию для OctoberCMS.

Вы можете добавить пользовательские поля в массив $cached класса модели

            
    ElementModel::extend(function($obModel) {
    $obModel->addCachedField(['field_1', 'field_2']);
    });

    ...

    $obItem = ElementItem::make(1);
    echo $obItem->field_1;

Вы можете добавить пользовательские поля в массив кэшированных данных, используя свой пользовательский метод. Вам нужно добавить динамический метод в класс ElementItem и добавить имя вашего метода в массиве $arExtendResult.

            
    ElementItem::extend(function($obItem) {

     $obItem->arExtendResult[] = 'addMyProperty';

     $obItem->addDynamicMethod('addMyProperty', function() use ($obItem) {

         $obModel = $obItem->getObject();
         $obItem->setAttribute('my_property', $obModel->my_property);
     });
});
...

$obItem = ElementItem::make(1);
echo $obItem->my_property;;

Определение метода доступа

Чтобы определить метод доступа, добавьте метод getFooAttribute к своему классу элементов, где Foo - это имя поля в поле «camel», к которому вы хотите получить доступ. В этом примере мы определим метод доступа для атрибута first_name. Метод доступа будет автоматически вызываться при попытке получить значение first_name.

            
    ElementItem::extend(function($obItem) {

     $obItem->addDynamicMethod('getFirstNameAttribute', function() use ($obItem) {

         $sValue = $obItem->getAttribute('first_name');
         $sValue .= 'test<';

         return $sValue;
     });
});

Интеграция с плагином Translate

Вы можете работать с переводимыми полями без дополнительных методов. Значение поля будет содержать значение активного языка.

            
    echo $obElementItem->name;

Вы можете использовать метод getLangAttribute, чтобы получить значения полей для неактивного языка.

            
    echo $obElementItem->getLangAttribute( 'name', 'ru');
© 2020 от Garikom