Наверх

Кастомизация

Класс для внедрения пользовательских разработок – Custom – определен в файле includes/custom.php.

Этот класс позволяет подключить файл из текущей темы, если он там есть. Кроме того, класс обеспечивает частичную кастомизацию, которая позволяет веб-мастеру выносить свои доработки из файла, который он изменяет.

Методы

void init ([string $name = '']) – Обнуляет внутрений кэш класса.

  • string $name

Пример:

// инициация класса Custom сразу после подключения
include_once ABSOLUTE_PATH.'includes/custom.php';
Custom::init();

string add (string $name) – Добавляет название примененной темы.

  • string $name

string del ([string $name = '']) – Исключает название примененной темы.

  • string $name

array names () – Возвращаяет названия примененных тем.

void inc (string $path) – Подключает PHP-файл.

  • string $path: путь до файла относительно корня сайта

Пример:

// подключаем файл includes/sms.php или файл
// custom/my_theme/includes/sms.php, если файл существует
// и тема my_theme является текущей
Custom::inc('includes/sms.php');

boolean exists (string $path_to_file) – Проверяет существует ли файл.

  • string $path_to_file: путь до файла относительно корня сайта

Пример:

if(Custom::exists('includes/sms.php'))
{
    echo
'ok';
}
else
{
    echo
'fail';
}
// выведет ok, если файла есть в основном хранилище скриптов
// или в текущей теме

string path (string $path_to_file) – Возвращает путь до файла.

  • string $path_to_file: путь до файла относительно корня сайта

Пример:

echo Custom::path('includes/sms.php');
// выведет:
// custom/my_theme/includes/sms.php, если такой файл существует
// и тема my_theme является текущей
// или includes/sms.php в ином случае

// заменяем Custom::inc('includes/sms.php');
// если нужно, чтобы переменные, определенные файл были доступны
// в контексте файла, в котором идет подключение
include_once(Custom::path('includes/sms.php'));

array read_dir (string $path) – Читает директорию.

  • string $path: путь до директории относительно корня сайта

Пример:

// читает папку modules в основом хранилище файлов и добавляет
// файлы и директории из текущей темы
$rows = Custom::read_dir('modules');
print_r($rows);
/* выведет:
Array
(
    [0] => ab
    [1] => admin
    [2] => attachments
    ...
    [45] => wishlist
)
*/

string version_core () – Возвращает версию сборки.

Частичная кастомизация

Частичная кастомизация позволяет выносить доработки из файла, который изменяется. Для этого все доработки нужно размещать в файле с таким же названием, но суффиксом .custom.

Пример:

Для файла modules/news/news.model.php кастомизированный файл modules/news/news.model.custom.php.

В файле частичной кастомизации можно переопределить классы, свойства и функции классов. Также можно добавить код в начало или конец.

Для этого в кастомизированном файле определяется класс с аналогичным оригиналу именем. В классе определяются свойства и функции.

Свойства могут иметь следующие приставки:

  • replace – переопределение свойства;
  • new – новое свойство.

Функции могут иметь следующие приставки:

  • replace – переопределение функции;
  • new – новая функция;
  • before – добавить код в начало функции;
  • after – добавить код в конец функции.

Пример:

Дорабатываем файл modules/users/users.inc.php. Для этого создаем файл modules/users/users.inc.custom.php.

следующего содержания:

class Users_inc extends Model
{
    
// делаем свойство класса публичными и задаем ему значение по умолчанию
    
replace public $user = NULL;

    
// добавляем новое свойство класса
    
new public $age;

    
// добавляем код в начало функции set()
    
before public function set ($user)
    {
        
$current_user_id = $user->id;
    }

    
// заменяем функцию logout()
    
replace public function logout ()
    {
        return
true;
    }

    
// добавляем код в конце функции _log()
    
after private function _log()
    {
        
$_SESSION["user_log"] = true;
    }

    
// добавляем новую функцию check
    
new private function check()
    {
        
$_SESSION["check"] = true;
    }
}

Новый файл сгенерируется и запишется в кэш. Подключается файл из кэша с той же скоростью, что и обычный PHP-файл, поэтому кастомизация не отразится на скорости генерирования страницы. Файл генерируется каждый раз, если включен режим разработки в параметрах сайта.

Если на сайте используется несколько примененных тем, то порядок подключения файлов частичной кастомизации соответствует дате подключения тем. То есть сначала на основной файл накладывается файл частичной кастомизации из первой примененной темы. Затем на сгенерированный файл накладывается файл частичной кастомизации из второй примененной темы. Таким образом при приставки after, before могут быть использованы в двух темах и код будет учитываться из обоих тем. А приставка replace из последней применной темы заменит код, перекрыв изменения из предыдущих тем.

Ваши комментарии и дополнения

Тема с таким вариантом тоже не жизнеспособна:
Код

echo '
<script asyncsrc="'.BASE_PATH.File::compress(Custom::path('js/script.js'), 'js').'" type="text/javascript" charset="UTF-8"></script>';
echo '
<script asyncsrc="'.BASE_PATH.File::compress(Custom::path('js/script.responsive.js'), 'js').'" type="text/javascript" charset="UTF-8"></script>';
Ещё не понятно как быть со сторонними иконками, я кладу их в папку /img/
, после генерации темы, переносятся только те которые были заменены под прежним названием, если было новое название типо: icon_cart2.png - не переносятся в тему....
Если Вы делаете тему, сознательно для того, чтобы ее потом переносить на другой сайт, то почему бы кастомные файлы сразу не располагать в папке темы в custom? Это и Вам удобнее и сразу видно как тема работает и не нужно даже ничего генерировать.

Здесь нужно учитывать одну особенность генерирования темы - в тему переносяться только измененные файлы, которые существуют в DIAFAN.CMS. Это сделано для того, чтобы все сторонние скрипты, работающие напрямую, не через DIAFAN.CMS, файлы, загруженные специально для скачивания по прямой ссылке, изображения, тоже используемые для сторонних решений или для прямого использования не переносились в папку custom и корректно работали.

В первом случае пути прописаны верно.
Код
<script type="text/javascript" src="'.BASE_PATH.'js/script.js" charset="UTF-8"></script>

На сайте они работать будут, но в тему не попадут. Корректно прописывать их как во втором примере
Код
echo '
<script asyncsrc="'.BASE_PATH.File::compress(Custom::path('js/script.js'), 'js').'" type="text/javascript" charset="UTF-8"></script>';

Но сразу же загружать в папку темы в custom.
Ну и так же решается проблема с изображениями.
если есть строка вида: "начало строки{$array['key']}конец строки"
"генератор" затыкается на {}
Для админки частичная кастомизация не работает?
Кастомизация не работает для файлов, которые подключены напрямую (перед подключением кастомизации) через функцию include_once. Их можно посмотреть в index.php и в конструкторе includes/init.php (также для админки adm/index.php и adm/includes/init.php). Все остальные файлы подключаются через функцию Custon::inc() и для них кастомизация и частичная кастомизация работают.
Очень интересно. Смотрите есть шаблоны 403, 404, 503. Естественно они будут кастомизированы думаю с этим никто спорить не будет. Для корректного отображения требуется JS ну без него никак конструкция типа
Код
<script type="text/javascript" src="'.BASE_PATH.'js/script.js" charset="UTF-8"></script>
ну не будет обращаться к скрипту расположенному в папке custom
А конструкция
Код

echo '
<script asyncsrc="'.BASE_PATH.File::compress(Custom::path('js/script.js'), 'js').'" type="text/javascript" charset="UTF-8"></script>';
пригодна для файла подключения JS и тут встаёт делема как-то не особо хочется подключать всю портянку скриптов для этих страниц на которых ничего толком не происходит кроме того что блоки надо по местам расставить и анимацию на объект навесить. Как быть?
Тоже самое собственно и к CSS относится хотя там как-то более менее нагляднее выглядит.
На худой конец параметр files="" бы добавить к show_js чтобы наглядно в шаблоне было, аналогично show_css.
Зарегистрируйтесь или авторизируйтесь для того, чтобы оставить комментарий.