Главное меню
все форумы все темы форума добавить тему
Нововведения в 5.10
Решил немного описать что же сделано в этой версии и как с этим работать.
 
1. Изменилась логика метода set класса Factory. Если раньше он задавал название класса для указанного ключа, то теперь он будет это делать только если этот ключ еще не определен. Для изменения существующего ключа предназначен метод overload.
PHP

Factory::set('class', 'default_class');
$obj=Factory::create('class');// экземпляр класса default_class
 
Factory::set('class', 'my_class');
$obj=Factory::create('class');// снова экземпляр класса default_class
 
Factory::overload('class', 'my_class');
$obj=Factory::create('class');// экземпляр класса my_class
 
2. Вторая важная вещь - это хуки.
Хуками называются события в коде, на которые можно "повесить" выполнение своего кода. Событиями, по сути, считается все, что считает таковым разработчик. Пока что я добавил события перед началом исполнения каждого модуля (но после его инициализации).
Например, при помощи хука можно поменять настройки модуля на лету или переопределить используемые классы.
Синтаксис у хуков довольно простой:
PHP

Hook::add($tag, $function, $priority, $count_args);
/* Где:
$tag - идентификатор хука
$function - имя функции, которую надо вызвать
$priority -  порядок вызова функций, если их несколько. Параметр опциональный.
По умолчанию значение 10. Если будет несколько функций с одинаковым приоритетом,
то исполнятся они будут в порядке добавления
$count_args - количество параметров передаваемых функции.
Опциональный. По умолчанию 1.
*/

 

3. Подключаемый пользовательский код.
Собственно то, ради чего делалось все предыдущее. Чем неприятно самостоятельное внесение изменения в функционал? Тем, что приходится быть крайне внимательным при обновлении версий, чтобы не перезатереть внесенные изменения. Ну либо вовсе воздерживаться от изменений, что еще хуже. В идеале, надо все изменения вынести в отдельное место так, чтобы они работали, но не являлись частью обновляемого кода.
Теперь такое место есть и находится оно тут:
Text
kernel/custom_files/index.php

Все что вы хотите изменить в коде, добавить свои хуки, классы или настройки, можно вносить (подключать) в этот файл. Он подключается в самом начале генерации страницы, так что имеет приоритет почти над всем что будет подключаться познее.
 
При желании, сюда же можно вносить собственные плагины для smarty, но так же для них предусмотрен каталог
Text
kernel/custom_files/smarty_plugins/

Он так же имеет приоритет над стандартным каталогом плагинов smarty, так что помещая туда собственные плагины, есть возможность переопределять имеющиеся не удаляя их.
Теперь попробую показать на примере для чего же все это может пригодиться.
Предположим, имеется модуль "module", функционал которого мы хотим расширить путем добавления метода "my_method" к классу "classname".
В файле
Text
kernel/custom_files/index.php

добавляем следующее:
PHP

Factory::set('classname', 'my_classname');
// этот класс для удобства стоило бы вынести в отдельный файл
//в этом случае третьим параметром Factory::set() необходимо передать путь к файлу
class my_classname extends classname {
   function my_method() {...}
}
 

В результате, когда модуль в начале своей работы будет определять классы:
PHP
Factory::set('classname', 'classname');

эта строчка будет проигнорирована и вместо classname будет использоваться наш my_classname
Теперь пример использования хуков:
PHP

Hook::add('module_pre', 'my_func', 10, 0);
 
function my_func()
{
  //переопределяем настройки модуля
  config::set('key', 'value');
}
 

теперь когда в начале модуля произойдет вызов хука:
PHP

Hook::call('module_pre');
 

произойдет вызов функции my_func();
Loki:
2. Вторая важная вещь - это хуки. ....Пока что я добавил события перед началом ....

Да я всё про скин админки:  Т.е. теперь, чтобы для админки сделать свой скин - достаточно было бы прописать свои хуки.
Но они в модулях перед .... Может поменять местами, эти две строчки в админ.модулях?  :
Или я что то не так понял ?
PHP

 
Hook::call('admin_dumper_before');
LabCMS::i()->setSkin('default');
 
 

Вы все правильно поняли. Беда в том, что строчка
PHP
LabCMS::i()->setSkin('default');

Является временным костылем, который нужен был только для отладки. В настоящий момент я переписываю эти места. Будет что-то вроде:
PHP
LabCMS::i()->setSkin(config::get('core.admin_skin'));

где admin_skin будет задаваться либо в настройках сайта, либо можно будет его жестко забить в подключаемых пользовательских файлах:
PHP
config::set('core.admin_skin', 'my_skin');

Так что если у вас есть возможность потерпеть день-два, то я выложу обновления. Если же нет - можете самостоятельно исправить эту строчку на любой удобный скин.
А.а.а.а.....а !! Караул..
Text
Fatal error: Call to undefined method LabCMS::getSkinKey() in .../kernel/modules/login/class.profile.php on line 591

И ещё несколь таких же.
Пробовал "читую" установку новейшей скачанной версии.
Я понимаю, что Новый год ... может пока отложить нововведения ?
Нет уж Надо подарки до нового года приготовить
Внес исправления.
А это снова я
Если вдруг надоем - Вы скажите, но ...
кудато пропал слеш, после {$base} в шаблонах - скрипты не грузятся.
Сам найти не сумел, потому решил побеспокоить ещё раз.
И "в догонку" - с переходом на шаблон "Bootstrap" - нету модуля проверки версии. Может это так задумано?
Слеш в конце base - это было раздражающее наследие. Все адреса в системе указываются без завершающего слеша, а этот тащился с ним для обратной совместимости. Но раз уж все равно большие переделки в шаблонах, то и от него пора избавиться. Шаблоны я поправил.
 
нету модуля проверки версии. Может это так задумано?

Не задумано. Просто еще не сделано. Я, как буриданов осел, долго размышлял проверять ли обновления на серверной или на клиентской части. В результате до сих пор не сделал ни так ни эдак.
А "невтему" можно?
Я просто ...балдею - какая скорость ответов !! Сутра общаюсь с тех.поддержкой одного "уважаемого" хостинга. Задаю вопрос - ответ через 3 с лишним часа.
А здесь - вопрос-ответ, вопрос-готовое решение...
От души: благодарю. И CMS Ваша нравится, и люди..
steller:
Сутра общаюсь с тех.поддержкой одного "уважаемого" хостинга. Задаю вопрос - ответ через 3 с лишним часа.

Ну не совсем честно сравнивать с хостингом: они все же работают за деньги, а мы за "плюсик в карму", так что и приоритеты немного разные