Класс Model
и функция upgrade
превращают массив в объект ArrayObject
.
Класс Model
предназначен для обозначения разного рода данных, не привязанных к таблице в базе данных (некая абстрактаная сферическая модель в вакууме).
Он может решать, например, следующую задачу:
Допустим, при помощи сложных (или не очень) запросов был получен массив данных (массив ассоциативных массивов) следующего типа:
$myarr = array(
array('title'=>'Подшипник', 'color'=>'Металлик', 'catalog_id'=>17),
array('title'=>'Болт 28мм', 'catalog_id'=>18),
array('title'=>'Гайка металлическая', 'catalog_id'=>18),
array('title'=>'Соединитель', 'color'=>'Синий', 'catalog_id'=>35),
array('title'=>'Крышечка пластмассовая', 'color'=>'Красный', 'catalog_id'=>7)
);
Это вполне может быть корзина товаров в интернет-магазине, которая хранится в $_SESSION
.
Его хочется вывести в foreach
. Но при этом написать поменьше кода, вывести каталог по его идентификатору и т.д. В случае с ActiveRecord всё просто - массив является одновременно и объектом (ArrayObject), что позволяет магически запрашивать другие таблицы, переопределять свойства и т.д.
Класс Model
выполяет эту задачу - делает из массива объект.
Например, для предыдущего случая, мы можем сделать так:
d()->products = d()->Model($myarr);
И вывести в шаблоне следующий код:
<foreach products>
<div>
<b>Название:<b> {.title}, <b>Раздел каталога:</b> {this.catalog.title}
</div>
</foreach>
{this.catalog.title}
обратится к каталогу автоматически также, как это делает ActiveRecord.
Альтернативный способ определить объект следующий:
d()->products = upgrade($myarr);
Допустим, мы хотим переопределить поле color
. Для это мы создаём класс, допустим, Basketproduct
:
<?php
class Basketproduct extends Model
{
function color()
{
if($this->get('title')==''){
return 'Цвет не задан';
}
return $this->get('color');
}
}
И в нужном месте контроллера просто пишем:
d()->products = d()->Basketproduct($myarr);
Сам класс Model
не обращается к базе данных, однако он наследуется от оригинального ActiveRecord
. Поэтому он имеет
такой метод, как to_array
, преобразующий объект обратно в массив.
То же самое касается остальных методов, например, d()->products->sort_by('title');
позволит отсортировать данные по алфавиту.
Вот примеры использования:
$_SESSION
) в массив-объект со связанными товарами.