Всем доброго времени суток. Мы продолжаем работать над наследованием в CMS RS-MINI. Контроллеры теперь умеют перемещаться из одного объекта класса page.class.php в другой подобный объект. Осталось сделать приблизительно тоже самое и для параметров этих самых контроллеров.
Отвечать за слияние параметров будет метод unionParams() набросок которого сейчас уже существует в классе controller.class.php. Давайте немного поговорим о логике этого метода, а то в данной статье совсем не будет текста
Вообще такое бывает очень редко, так как будет принято для каждого подключенного контроллера вписывать хотя бы один системный параметр (это я про параметр active). Но все же у нас должен быть предусмотрен и такой вариант развития ситуации.
В этом случая в свойство paramList, копии объекта контроллера, будет помещен присланный, через параметры метод unionParams(), массив без всяких проверок.
В задачу метода будет входить поиск присланного параметра среди уже существующих параметров контроллера. Если поиск увенчается успехом, то параметр не будет переписан. Если же параметр не будет найден, то он сохранится в свойстве paramList текущего контроллера.
Для того что бы проверить работу нашего нового метода (код которого чуть ниже) нам понадобится для второй нашей страницы (страницы с псевдонимом test_alias) подключить тот же самый контроллер, но уже с измененными параметрами.
В статье «Наследования контроллеров» я приводил пример в котором на главной странице у контроллера pub.test.intro были вот такие параметры:
А у страницы /about/ (она же test_alias) был тот же самый контроллер но вот с такими параметрами:
В общем вот sql запрос на подключение того же контроллера но с другими параметрами
INSERT INTO
`rs_connect`
(
`connect_id`,
`map_id`,
`connect_value`,
`controller_id`,
`connect_block`,
`connect_inherit`,
`connect_position`
)
VALUES
(
NULL,
'2',
'active: enable\nparam2: value3',
'1',
'top',
'true',
'1'
)
;
Теперь давайте в файле controller.class.php напишем вот такой код: (файл лежит в папке /rs-mini/core/)
/*
* метод перезаписывает существующие параметры
*
* @access - public
*
* @param array params - массив с унаследованными параметрами
*/
public function unionParams($params)
{
// если параметров у контроллера нет
if (empty($this->paramList)) {
// просто сохраняем то что прислали
$this->paramList = $params;
return;
}
// если параметры есть, то листаем присланные
foreach($params as $inheritName => $inheritValue) {
// переменная для определения есть ли уже такой параметр
// у контроллера
$found = FALSE;
// листаем параметры контроллеров и сравниваем имена
foreach ($this->paramList as $name => $value)
// если имена равны
if ($inheritName == $name)
// переключаем переменную в состояние "найдено"
$found = TRUE;
// если присланный параметр небыл найден у контроллера
if ($found == FALSE)
// сохраняем его
$this->paramList[$inheritName] = $inheritValue;
}
}
Теперь если перейти на страницу http://mini.test.ru/about/ то мы увидим вот такую картинку:
Я отобразил лишь кусочек дампа, а именно список контроллеров второй страницы. Обратите внимание на свойство paramList. Ключ param2 теперь имеет значение value3 вместо значения value2 (как на главной странице). Это говорит нам о том, что объединения параметров работает как надо, и на второй странице у нас, помимо существующих параметров (взятых из базы данных), теперь есть параметр param1 перекочевавший с главной страницы. По идеи мы теперь получаем возможность переписывать параметры наследуемых контроллеров + создавать новые параметры для этих контроллеров.
Если у Вас есть какие-либо вопросы, пишите их в комментариях. Результат работы можно скачать в конце статьи.
Всего Вам наилучшего, на сегодня все!
Какие то сложные вещи пошли))))
Сложные, значит интересные) все интересное новое, а значит и сложное_)))))) Алексей, а макет магазина будет как всегда минималистичен?) или придумали уже что то интересное?)