Классы 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');