JLayer - прослойка для JohnCMS, которая позволяет писать модули используя MVC.
В теории JLayer может поддерживать все версии JohnCMS начиная с третьей ветки. Но ориентироваться будет на последнии версии.
На данный момент поддержка осуществляется только для версии 5.0.1 и в будущем с выходом новых версий JohnCMS, будет обновляться.
Как использовать JLayer в своем модуле и какие преимущества это даёт вы можете узнать в данном мануале.
Установка и настройка
Для установки нам необходимо лишь скопировать директорий в корень вашего сайта.
Что касается настройки, тот тут тоже ничего сложного.
В файле /jlayer/jlayer.php находим следующие константы:
Константа FILES_DIR отвечает за директорий файлов по умолчанию. Используется она в плагине upload.
По умолчанию указана папка files вашего модуля.
Jl_EXP_PATH отвечает за вывод необработанных исключений. Если установить в 0, то вывод будет осуществляться в браузер, иначе в лог.
Директорий расположения логов устанавливается в константе JL_LOGS
По умолчанию логи пишутся в /jlayer/jl/logs при желании вы можете изменить путь.
Остальные константы трогать не рекомендуется.
Первые шаги
Для того, чтобы подключить JLayer нам необходимо:
Создать директорий модуля в корне директория с движком. Пусть это будет test
В созданном директории создаем файл index.php со следующим содержимым:
/** Path to module's directory */
define('JL_MODULE_DIR', rtrim(dirname(__FILE__), '\\/') . DIRECTORY_SEPARATOR);
/** Prefix for tables in database */
define('JL_TABLES_PREFIX', 'test');
/** Default controller */
define('JL_DEFAULT_CONTROLLER', 'index');
/** Default action */
define('JL_DEFAULT_ACTION', 'index');
/** JohnCMS version */
define('JOHNCMS_VERSION', '5.0.1');
require '../jlayer/jlayer.php';
Константа JL_MODULE_DIR содержит абсолютный путь к директорию нашего модуля.
Константа JL_TABLES_PREFIX содержит префикс для таблиц базы данных.
Константа JL_DEFAULT_CONTROLLER содержит имя контроллера, вызываемого по умолчанию.
Константа JL_DEFAULT_ACTION содержит имя метода контроллера, который будет вызываться по умолчанию. Её изменять не рекомендуется.
Константа JOHNCMS_VERSION содержит номер версии используемого движка.
Создаем .htaccess в этом же директории. RewriteEngine On
RewriteBase /test
RewriteRule ^(?:controller|model|lang|view)\b.* index.php/$0 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php/$0 [PT]
В строке RewriteBase /test - /test - это путь к директорию модуля.
Если вы решили назвать ваш модуль по другому, замените test на имя директория вашего модуля.
Строка RewriteRule ^(?:controller|model|lang|view)\b.* index.php/$0 [L]
Перенаправляет запросы с существующих директорий на index.php
Создаем директории:
controller - для контроллеров
model - для моделей
lang - для языковых файлов
view - для шаблонов оформления
Это не полный перечень директорий.
Вам так же могут понадобиться helpers для помощников и config для конфигурационных файлов.
Если вы их создадите, то незабудьте указать их в .htaccess для перенаправления на index.php
В директории контроллеров создаем дефолтный контроллер, который определили в JL_DEFAULT_CONTROLLER
В нашем случае - это index, значит создаем файл index.php со следующим содержимым:
Метод action_index обязательно должен присутствовать в каждом контроллере, т.к. он определен абстрактным в родительском классе.
В директории lang создаем файл с именем языка по умолчанию и расширением json со следующим содержимым:
{
"test": "Тест"
}
В итоге у нас должен получится файл /test/lang/ru.json
Где ru - язык установленный по умолчанию в панели управления.
Если у вас в пользовательских настройках системы (не в панели управления) стоит другой язык, значит нужно будет создать языковой файл и для него.
Вобщем имя файла должно соответствать имени директория с языковыми файлами в /incfiles/languages
Теперь можем перейти по адресу http://ваш_сайт/директорий_модуля
Должны увидеть слово Тест
Если страница пустая, проверьте логи в директории /jlayer/jl/logs
Предопределённые константы и Функции
Константы
JL_MODULE_DIR
Абсолютный путь к директорию модуля
JL_TABLES_PREFIX
Префикс для таблиц базы данных, используемых в модуле
JL_DEFAULT_CONTROLLER
Контроллер модуля, вызываемый по умолчанию
JL_DEFAULT_ACTION
Метод контроллера модуля, вызываемый по умолчанию
JOHNCMS_VERSION
Версия JohnCMS
DIR_SEP
Краткая запись php-константы DIRECTORY_SEPARATOR
JL_DIR
Директорий, в котором располагается JLayer
ENGINE_DIR
Директорий системных файлов JohnCMS. На данный момент это incfiles
FILES_DIR
Директорий, предназначенный для загрузки файлов. Должен распологаться в директории модуля
JL_EXP_PATH
Путь вывода исключений: 0 - в браузер; 1 - в лог
JL_LOGS
Директорий для хранения логов исключений
JL_DB_WRAPPER
Обработчик SQL запросов.
HTTP_HOST
Адрес сайта со слешем на конце
Все эти константы доступны в JLayer и контроллерах, моделях, хелперах и шаблонах оформления модуля.
Функции
Все функции располагаются в пространстве имен jl\
По этому для их вызова к их названию слева необходимо добавлять название пространства имен.
Используется для вывода внутренней ссылки.
В качестве первого аргумента принимает URI
Если передан аргумент $title заключает ссылку в html тег <a>
Для того чтобы добавить дополнительные параметры к html тегу, используйте третий аргумент.
Например:
Используется для обработки не перехваченных исключений.
В качестве единственного аргумента принимает объект класса \Exception $exception
В зависимости от значения константы JL_EXP_PATH выводит исключение в браузер или в лог.
Завершает работу скрипта с кодом 1.
Эта функция регистрируется в качестве обработчика неперехваченных исключений с помощью set_exception_handler в JLayer.
Получает uri изображения. Преобразует его в абсолютную ссылку и заключает в html тег <img />
В качестве первого аргумента принимает URI изображения.
Для передачи дополнительных опций тегу img используйте второй аргумент.
Третьим необязательным аргументом можно передать URI для заключения изображения в ссылку.
Примеры:
Осуществляет редирект по заданному URI и завершает работу скрипта.
Контроллеры и их окружение
Контроллеры.
Контроллеры распологаются в директории controllers, который расположен в директории вашего модуля.
Для примера создадим директорий test в директории движка. Это и будет директорий модуля. Подключим JLayer и создадим необходимые директории.
Как это сделать, описано в разделе Первые шаги.
Создаем в директории контроллеров файл test.php
Заносим в него следующий код:
class Controller_Test extends jl\Controller {
public function action_index($arg1 = 0, $arg2 = 1) {
var_dump($arg1, $arg2); }
public function action_test() {
return 'test' }
}
Контроллер представляет собой класс c именем, состоящим из префикса Controller_ и следующим после него
именем файла с заглавной буквы без расширения .php
Класс контроллера должен наследоваться от абстрактного класса jl\Controller и
обязательно иметь метод action_index(), т.к. в классе jl\Controller он объявлен абстрактным.
Методы контроллера, которые имеют префикс action_ доступны для вызова через URL,
методы не имеющие этот префикс доступны для вызова через URL не будут.
Давайте перейдем по адресу http://адрес_вашего_сайта/test/test/index/
Мы должны увидеть результат работы метода action_index
Для того, чтобы увидеть результат работы метода action_test нужно
перейти по адресу http://адрес_вашего_сайта/test/test/test/
Видите разницу? В первом случае мы увидили результат работы функции var_dump()
без каких-либо еще элементов на странице.
Во втором случае были подключены "шапка" и "ноги" движка.
Это всё из-за того, что впервом случае метод ничего не возвращает, а во втором метод возвращает строку.
Принцип, думаю, понятен.
Что касается аргументов методов, то их также можно передавать через URL.
Перейдите по адресу http://адрес_вашего_сайта/test/test/index/arg1/arg2
Увидите, что значения аргументов изменились на arg1 и arg2
Тут важно отметить, что вы всегда должны определять значения по умолчанию для аргументов,
иначе если этого не сделать, будет сгенерировано уведомление о неопределенной переменной.
Теперь переходим к свойствам контроллёра.
Контроллер имеет три protected свойства:
jl - объект класса jl\Jlayer
Используется для связи с JohnCMS
Поля объекта:
string $error_page - URI страницы ошибки.
Имеет следующие методы: int get_id() Получает идентификатор текущего пользователя. Если пользователь не авторизован, возвращает 0.
int get_rights() Получает права доступа текущего пользователя. Если пользователь не авторизован, возвращает 0.
Права доступа в соответствии с текущей версией JohnCMS могут иметь следующие значения:
0 - обычный пользователь
3 - Модератор форума
4 - Модератор загруз-центра
5 - Модератор библиотеки
6 - Старший модератор
7 - Администратор
9 - Супервайзор
mixed get_data([string $key]) Получает данные авторизованного пользователя. Если аргумент $key не передан, возвращает весь массив данных.
array get_infringements() Получает список активных банов авторизованного пользователя.
mixed get_settings([string $key]) Получает настройки системы авторизованного пользователя. Если аргумент $key не передан, возвращает весь массив данных.
string get_table() Получает имя таблицы, в которой хранятся данные пользователей.
Имеет следующие методы: mixed get_settings([string $key = '']) Получает системные настройки. Если аргумент $key не передан, возвращает весь массив.
int|string get_ip([boolean $format = false])
Возвращает IP адрес текущего пользователя.
Если аргумент $format имеет значение true, метод вернет строковое представление IP адреса, иначе вернет int
int|string get_ip_via_proxy([boolean $format = false]) Получает IP адрес текущего пользователя за PROXY-сервером.
Если аргумент $format имеет значение true, метод вернет строковое представление IP адреса, иначе вернет int
string get_user_agent() Получает User-Agent текущего пользователя.
boolean is_mobile() Определяет, является ли браузер текущего пользователя мобильным.
boolean|int anti_flood() Проверяет сколько времени прошло с момента отправки пользователем последнего поста.
Возвращает false, если времени прошло достаточно много, иначе возвращает кол-во секунд,
которых необходимо подождать пользователю, перед тем как отправить сообщение.
Этот метод используется совместно с методом set_last_post_time(), описание которого вы може найти чуть ниже.
string bb_panel(string $form, string $field); Возвращает html код панели BB-кодов.
string $form - имя формы;
string $field - имя текстового поля, в которое будет осуществлятся вставка бб-кодов с панели.
boolean check_captcha($code) Проверяет, верно ли введен проверочный код с картинки.
Этот метод используется вместе с методом get_captcha(), описание которого вы можете найти чуть ниже.
string check_in($string) Фильтрует строку. Избавляется от невидимых символов.
string check_out(string $string[, int $nl = 0[, int $bb_tags = 0[, int $smileys = 0]]]) Обрабатывает строку перед выводом.
string $string - строка для обработки.
int $br - обработка переносов строк:
0 - Не обрабатывать (по умолчанию).
1 - Заменять на <br />
2 - Заменять на пробелы.
int $bb_tags - обработка BB-кодов:
0 - Не обрабатывать (по умолчанию).
1 - Заменять на их html эквиваленты.
2 - Вырезать.
int $smileys - обработка смайлов:
0 - не обрабатывать (по умолчанию).
1 - обрабатывать.
string confirm_message(string $title, string $message, string $ok, string $cancel[, string $action = '']) Возвращает html код формы подтверждения.
string $title - Заголовок формы
string $message Сообщение
string $ok Надпись на кнопке подтверждения
string $cancel Надпись на кнопке отмены
string $action Адрес скрипта обработчика. Необязательный аргумент.
string count_time(int $timestamp) Пересчет на дни или часы.
string display_date(int $timestamp) Форматирует вывод даты с учётом временного сдвига. В качестве единственного аргумента принимает временную метку
string display_message(array|string $message[, int $level = 0]) Подготавливает сообщение к выводу.
array|string $message - Строка сообщения или массив сообщений.
int $level - уровень сообщения: 0 - уведомление. 1 - предупреждение.
string display_user(int|array $user[, boolean $last_visit = false[, boolean $status = true[, boolean $ips = true[, boolean $ip_history = true[, string $header = ''[, string $body = ''[, string $sub = ''[, string $footer = '']]]]]]]]); int|array $user - Данные пользователя. Если данные отстутствуют передайте 0.
boolean $last_visit Показывать дату последнего визита
boolean $status Скрыть статус
boolean $ips Скрыть юзер-агент и IP адрес
boolean $ip_history Показать ссылку на историю IP
string $header Строка для отображения возле ника пользователя
string $body Строка для отображения под ником пользователя
string $sub Строка для отображения в области sub
string $footer Строка для отбражения в самом низу блока
string do_translit(string $string) Транслитерация текста. Переводит кириллические символы в их латинские эквиваленты.
string do_smileys(string $string[, boolean $adm = false]) Обработка смайлов.
string $string - Строка для обработки
boolean $adm - Включить обработку смайлов, предназначенных для администрации.
string do_untranslit(string $string) Детранслитерация текста. Преобразует латинские символы в их кириллические эквиваленты.
string get_captcha(string $field_name[, string $error = '']) Возвращает html код, содержащий изображение капчи, форму ввода и сообщение об ошибке, если присутствует.
Используется совместно с методом check_captcha(), описание которого вы можете найди выше.
string $field_name - Имя поля ввода.
string $error - Сообщение об ошибке, если есть.
array get_user(string|int $id[, string $by = 'id']) Получает данные пользователя по его ID или никнейму.
string|int $id - ID или никнейм пользователя.
string $by - По какому полю искать: id - для поиска по ID, name для поиска по никнейму.
boolean valid_ip(string $ip) Определяет, валиден ли IP адрес.
boolean set_last_post_time(int $user_id) Фиксирует время оправки последнего поста пользователем.
В качестве единственного аргумента принимает ID пользователя для которого нужно обновить время.
Используется совместно с методом anti_flood(), описание которого вы можете найти выше.
Методы объекта:
jl\Model model(string $name) Загружает модель.
Модели располагаются в директории model директория модуля.
Если модели не существует, выбрасывает исключение jl\Exception
Если модель была загружен ранее, вернет объект уже загруженной модели.
jl\Plugin plugin(string $name) Загружает плагин.
Если плагина не существует, выбрасывает исключение jl\Exception
Если плагин был загружен ранее, вернет объект уже загруженного плагина.
boolean helper(string $name) Загружает хэлпер.
Хелперы загружаются из директория helpers, который расположен в директории модуля.
Если директория не существует, создайте его.
array load_config(string $name[, string $from = 'module']) Загружает конфигурационный файл.
string $name - Имя конфигурационного файла.
string $from - Путь, откуда следует загружать конфигурационный файл.
Если метод вызывается из контроллера, то передавать какое-либо значение этому аргументу не нужно ни в коем случае.
Конфигурационные файлы будут загружаться из директория config директория модуля.
Если же метод вызывается из плагина, то нужно передать значение plugin/имя_плагина
В этом случае конфиг будет загружаться из директория config, который расположен в директори плагина.
Конфигурационные файлы должны представлять из себя json файлы, с расширением json.
lng - объект класса jl\Language
Используется для работы с языковым файлом.
Языковой файл должен распологаться в директории lang директория модуля.
Если в системе более одного языка, то для каждого языка желательно создать по файлу.
Хотя в этом нет особой необходимости и скрипт сможет работать и с одним файлом.
Главное, чтобы этот файл соответствовал установленному в системе языку по умолчанию.
Языковой файл представляет собой файл формата json.
В качестве имени файла используйте код языка и расширение json
Код необходимого языка вы можете узнать в директории incfiles/languages
Например фразы русского языка располагаются в директории incfiles/languages/ru
Значит имя нашего файла должно быть ru.json
Доступ к фразам в контроллере осуществляется через $this->lng->ключ_фразы
Если элемента с заданным ключем в языковом файле не существует, то на выходе вы получите имя ключа, заключенное в символы #
tpl - объект класса jl\Template
Используется для работы с шаблонами оформления.
Шаблоны оформления располагаются в директории view директория модуля.
Представляют собой файлы с расширением php.
Для удобства добавляйте к именам шаблонов префиксы имен в методов и контроллеров, в которых они используются.
Рассмотрим методы объекта шаблонизатора:
string|null get_title()
Получает строку заголовка страницы. Если заголовок страницы не был установлен, вернет null
string load(string $name[, array $data = array()])
Загружает шаблон
string $name - имя шаблона
array $data - ассоциативный массив, содержимое которого при загрузке шаблона будет извлечено с помощью функции extract() без использования префиксов.
void output()
Выводит данные в браузер
void set_output(string $data[, $priority = null])
Устанавливает данные для вывода
string $data - строка для вывода.
int|null $priority - приоритет данных. Если передать null, будет задан самый низкий приоритет.
Чем больше число, тем ниже приоритет.
Важно отметить, что под каким бы вы приоритетом не установили шаблон в контроллере, всегда самым последним будет выводится шаблон, отвечающий за "ноги" страницы.
Так же не стоит задавать нулевой приоритет для ваших шаблонов. Это место тоже зарезервировано.
Модели предназначены для работы с таблицами базы данных.
Располагаются они в директории model директория модуля.
Для создания модели нужно создать файл с именем необходимой модели и расширением php
В созданном файле определить класс с именем Model_Имя_файла_с_заглавной_буквы
Класс должен наследоваться от jl\Model
Модель по умолчанию имеет два protected свойства:
jl\Db $db - Объект класса jl\Db предназначенный для работы с базой данных
string $table_name - Имя таблицы базы данных, с которой будет работать модель.
Имя таблицы устанавливается с помощью метода string set_table_name()
К имени таблицы установленному с помощью этого метода автоматически добавляется префикс указанный в константе JL_TABLES_PREFIX
Конечно вы можете и не использовать метод string set_table_name() и указывать в запросах непосредственно имя таблицы с префиксом JL_TABLES_PREFIX
Например:
$this->db->query("SELECT * FROM `" . JL_TABLES_PREFIX . "_sometable`");
Символ нижнего подчеркивания между префиксом и названием таблицы обязателен.
int affected_rows()
Возвращает количество полей, затронутых предыдущей MySQL операцией.
mixed connect(string $host, string $user, string $password)
Открывает соединение или получает ссылку на существующее соединение, если соединение с такими же параметрами уже открыто.
string $host - Хост
string $user - Имя пользователя
string $password - Пароль
int errno()
Возвращает код ошибки из предыдущей MySQL операции.
string errno()
Возвращает строку сообщения об ошибке из предыдущей MySQL операции.
string escape_string(string $string)
Экранирует специальные символы в строке для использования в SQL выражении.
array fetch_assoc(mixed $result)
Получает строку в виде ассоциативного массива и сдвигает указатель.
mixed $result - Результат запроса, полученный из метода query()
mixed fetch_object(mixed $result)
Получает строку в виде объекта и сдвигает указатель
mixed $result - Результат запроса, полученный из метода query()
array fetch_row(mixed $result)
Получает строку в виде нумерованного массива и сдвигает указатель.
mixed $result - Результат запроса, полученный из метода query()
boolean free(mixed $result)
Освобаждает результат.
mixed $result - Результат запроса, полученный из метода query()
int insert_id()
Возвращает последний вставленный идентификатор из предыдущей MySQL операции.
mixed num_fields(mixed $result)
Возвращает кол-во полей в результате.
mixed $result - Результат запроса, полученный из метода query()
int num_rows(mixed $result)
Возвращает кол-во строк в результате
mixed $result - Результат запроса, полученный из метода query()
mixed query(string $statement)
Осуществляет MySQL запрос.
string $statement - SQL выражение. Входящие данные должны быть обработаны с помощью метода escape_string()
int result(mixed $statement[, int $row[, int $field]])
Возвращает результат запроса.
mixed $statement - Результат запроса, полученный из метода query() или SQL выражение.
int $row - Номер строки из полученного результата. Нумерация строк начинается с 0.
int $field - Имя поля или сдвиг для его извлечения.
boolean select_db(string $name)
Выбирает базу данных.
Класс jl\Db является абстрактным. Реализация этих методов осуществляется с помощью класса наследуемого от jl\Db
На данный момент доступна всего одна реализация jl\Db - это jl\wrappers\db\Mysql
Вы можете добавить свою реализацию. Для этого создайте необходимый класс в директории jlayer\jl\wrappers\db
Чтобы использовать свой обработчик, задайте его имя в константе JL_DB_WRAPPER, которая объявлена в файле jlayer\jlayer.php
В абстрактном классе jl\Db определен деструктор, который при завершении работы сохраняет в лог все обнаруженные ошибки при работе с базой данных.
Логи, как уже упоминалось ранее хранятся в директории jlayer/jl/logs
Логи с постфиксом -database как раз те логи, что пишет jl\Db
array get(int|string $id[, string $by = ''])
Получает объект.
int|string $id - Идентификатор объекта
string $by - Имя поля, содержащего идентификатор
array get_list([int $start = 0[, int $end = 0[, string|int|null $id = null[, string|null $by = null[, string $order = '']]]]])
Получает список объектов
int $start - Начальная позиция
int $end - Конечная позиция
string|int|null $id - Идентификатор родительского объекта
string|null $by - Имя поля, которое содержит идентификатор родительского объекта
string $order - Сортировка. Например: `field_name` DESC и т.п.
int|string save(array $data[, string|int|null $id = null[, string|null $by = null]])
Сохраняет объект. Если объект с заданным идентификатором существует, обновляет его.
Возвращает идентификатор сохранённого объекта.
array $data - Массив данных, где ключ - имя поля, значение - значение поля.
Экранировать специальные символы ненужно.
Метод, в зависимости от типа значения, сам определяет каким образом нужно фильтровать элемент.
string|int|null $id - Идентификатор родительского объекта.
string|null $by - Имя поля, содержащего идентификатор родительского объекта.
int remove(int|string $id[, string $by = ''])
Удаляет объект.
int|string $id - Идентификатор объекта
string $by - Имя поля, содержащего идентификатор
Плагины
Загрузка плагина в контроллёре осуществляется через метод plugin объекта класса jl\Jlayer
$this->jl->plugin('имя_плагина');
Если плагин загружается в первые, то будет создан объект этого плагина и помещен во временное хранилище.
При повторной загрузке плагина, метод вернет объект созданного ранее плагина.
JLayer имеет следующий набор плагинов:
Сразу после загрузки плагина необходимо вызвать метод init(), передав ему соответствующие аргументы:
$comments = $this->jl->plugin('comments');
$comments->init('uri', 'title_of_page', 'table_with_comments', array(9), 'object_table', $object_id, 'object_id_field', 'counter_field');
Рассмотрим аргументы метода init()
void int(string $uri, string $title, string $comments_table[, array $access[, string $object_table[, string $object_id[, string $object_field[, string $counter_field]]]]])
string $uri - URI контроллера, в котором загружается плагин
string $title - Заголовок страницы со списком комментариев
string $comments_table - Имя таблицы базы данных предназначенной для комментариев (без префикса).
array $access - Контроль доступа.
string $object_table - Имя таблицы базы данных комментируемого объекта.
int $object_id - Идентификатор комментируемого объекта
string $object_field - Имя поля содержащего идентификатор комментируемого объекта в таблице содержащей объект
string $counter_field - Имя поля счетчика комментариев в таблице комментируемого объекта
URI контроллера - полный путь к контроллеру без адреса сайта. Например: module/controller/method
Метод нужно указывать обязательно, иначе корректная работа плагина не гарантируется.
Так же если присутствуют дополнительные аргументы, то их тоже следует указывать.
Заголовок страницы со списком комментариев. Ну тут вроде всё понятно.
С именем таблицы тоже всё ясно.
Контроль доступа. Нумерованный массив элементами которого являются числа. Опредляет кому открывать доступ к редактированию и удалению комментариев.
Например array(7, 9) - Доступ будет открыт только для администраторов и SV.
Полный список возможных значений смотрите в описании метода display_user в разделе "Контроллеры и их окружение".
Имя таблицы комментируемого объекта и все последующие аргументы указывать не нужно, если вам не требуется комментировать какие-либо объекты.
После того как мы вызвали метод init()
Необходимо вызвать метод string display_list([int $arg = 0[, string $arg_type = '']])
Этот метод возвращает список комментариев, готовый для представления его пользователю.
Аргумент int $arg в зависимости от значения аргумента string $arg_type может трактоваться как номер страницы списка комментариев, если аргументу $arg_type передать пустую строку. Если аргументу arg_type передать строку содержащую edit или remove, то аргумент arg трактуется как ID комментария.
Это нужно только для понимания принципа работы плагина. Вам достаточно лишь передать значения аргументов в метод.
Полный листинг метода контроллера предназначенного для работы с плагином:
Стоит отметить, что плагин сам проверяет наличие комментируемого объекта в таблице, потому делать проверку нет необходимости.
Если комментируемый объект отсутствует, то плагин перенаправит пользователя на страницу ошибки.
Как вы наверное заметили, в URI передавать $arg и $arg_type ненужно.
Для удаления всех комментариев комментируемого объекта используйте метод void remove_comment(int $id, string $by = 'id', boolean $update_counter = true)
Аргументу $id нужно передать ID комментируемого объекта.
Аргументу $by нужно передать строку содержащую значение sub_id
Если нужно обновить счетчик комментариев, то аргументу $update_counter передайте true, иначе false.
После того, как вы создали контроллер, вам необходимо создать таблицу для комментариев в базе данных.
Таблица должна содержать следующие поля:
`id`
int(11)
unsigned
NOT NULL
AUTO_INCREMENT
ID комментария
`sub_id`
int(11)
unsigned
NOT NULL
DEFAULT 0
ID комментруемого объекта
`owner_id`
int(11)
unsigned
NOT NULL
ID автора комментария
`owner_name`
varchar(50)
NOT NULL
Имя автора комментария
`message`
TEXT
NOT NULL
Текст сообщения
`time`
int(11)
unsigned
NOT NULL
Время отправления комментария
Полю `id` нужно задать первичный ключ.
Для работы плагина необходима библиотека GD.
Загрузка плагина осуществляется всё так же через метод jl->plugin()
$this->jl->plugin('image');
boolean load(string $path)
Загружает изображение.
string $path - Путь к изображению.
Метод возвращает true при удачной загрузке и false при неудаче.
resource resize(int $width = 0, int $height = 0)
Изменяет размеры изображения.
Возвращет ресурс изображения. При этом загруженное изображение остается прежним.
int $width - Новая ширина изображения в пикселях.
int $height - Новая высота изображения в пикселях.
Если вызвать метод без аргументов, то будут использованы значения по умолчанию, определенные в константах плагина.
Ширина по умолчанию - 240 пикселей.
Высота по умолчанию - 320 пикселей.
void output(null|int $type = null, resource|null $image = null, string $path = '')
Выводит изображение в браузер или файл.
null|int $type - тип изображения: встроенные константы IMAGETYPE_PNG, IMAGETYPE_GIF, IMAGETYPE_JPEG.
resource|null $image - ресурс изображения.
string $path - путь для вывода.
Если первым двум аргументам передать null, то будет использовано загруженное ранее изображение с помощью метода load()
Если изображение не было загружено и значения первых двух аргументов - null, метод выбросит исключение jl\exception\Exception
Если значение аргумента $type - null и аргументу $image передан ресурс, то скрипт так же выбросит исключение.
Если же указать тип и не передавать ресурс, будет определен тип загруженного изображения.
Если аргументу $path передать пустую строку, то изображение будет выведено в браузер.
В остальных случаях метод проверяет наличе пути в файловой системе. Если директорий не существет, выбросит исключение.
Постраничная навигация.
void prepare(string $base_url, int $total_rows, int $current_page[, int $per_page = 0])
Инициализация плагина.
string $base_url - Абсолютный URL списка. Без номера страницы.
int $total_rows - Общее количество элементов списка.
int $current_page - Номер текущей страницы.
int $per_page - Кол-во элементов на странице. 5 по умолчанию.
string create_links()
Возвращает оформленный список ссылок на страницы.
array get_position()
Возвращает ассоциативный массив с двумя элементами:
int start - Начальная позиция для отбора элементов.
int end - Конечная позиция.
void init([string $path = ''[, array|string $ext = ''[, array $mime = array()[, int $size = 0]]]])
Инициализация плагина.
string $path - Путь к директорию, в который будет загружен файл. Значение по умолчанию берется из константы FILES_DIR
array|string $ext - Список разрешенных расширений. Можно передать либо сразу массив, либо строку. В качестве разделителя в строке используйте любой спецсимвол.
array $mime - Список разрешенных MIME-типов. Этот аргумент, как и предыдущий необязательный. Значения по умолчанию берутся из конфигурационного файла плагина.
int $size - Максимальный размер файла в килобайтах. Значение по умолчанию берется из настроек системы.
string|array check(array $data)
Проверяет файл перед загрузкой
array $data - Массив данных файла, полученный из глобального массива $_FILES
При неудаче возвращает строку с сообщением об ошибке, иначе массив с данными файла, содержащий следующие элементы:
string tmp_name - Путь к файлу во временной папке.
name - Отфильтрованное имя файла. Имя может содержать только латинские символы в нижнем регистре, цифры и символ нижнего подчеркивания.
ext - Расширение файла.
boolean upload(string $location, string $name, string $ext[, string $upload_dir = ''])
Загружает файл. Возвращает true при удачной загрузке и false при неудаче.
string $location - Текущее расположение файла во временной папке.
string $name - Новое имя файла.
string $ext - Новое расширение файла.
string $upload_dir - Путь к директорию для загрузки. Значение по умолчанию берется из константы FILES_DIR
string display_form([string $label = ''[, string $field_name = ''[, string $error = ''[, string $title = ''[, string $submit = false]]]]])
Возвращает html-код формы для загрузки файла.
string $label - Надпись над полем ввода.
string $field_name - Имя поля ввода. По умолчанию file.
string $error - Сообщение об ошибке, если существует.
string $title - Заголовок страницы. Если передать пустую строку, то метод вернёт только поле ввода с надписью и сообщением об ошибке, иначе полноценную страницу, готовую для показа.
boolean|array $submit - Кнопки отправки формы. false - непоказывать кнопки, true - показывать со значениями по умолчанию, array - свои параметры для кнопок:
ok => array('имя_поля', 'значение_поля'), // Кнопка отправки
cancel => array('имя_поля', 'значение_поля'), // Кнопка отмены
Этот плагин является адаптированной библиотекой фреймворка CodeIgniter. Функционал остался прежним.
Ознакомиться с документацией на английском языке вы можете на ellislab.com
Этот плагин, как и все остальные, загружается с помощью метола jl->plugin()
После загрузки плагина необходимо вызвать метод init();
void add_dir(mixed $directory)
Добавление директория
Даёт вам возможность создать виртуальный директорий в архиве, в котором вы сможете разместить файлы.
mixed $directory Имя директория. Может быть строкой или массивом. Массив может содержать несколько элементов, для создания нескольких директорий сразу.
void add_data(mixed $filepath, string|null $data = NULL)
Добавляет данные к архиву
Даёт вам возможность добавлять файлы в архив. Если путь включен
в имя файла, файл будет размещен вместе с директорием.
Вы можете использовать массив, для того чтобы разместить несколько файлов:
$data = array(
'mydata1.txt' => 'A Data String!',
'mydata2.txt' => 'Another Data String!'
);
$this->loader->plugin('zip')->add_data($data);
bool read_file(string $path, bool $preserve_filepath = FALSE)
Считывает данные файла и добавляет их к архиву.
Передайте true аргументу $preverse_filepath для того, чтобы сохранить расположение файла в архиве.
bool read_dir(string $path, bool $preserve_filepath = TRUE, bool $root_path = NULL)
string $path Путь к исходному директорию
Считывает директорий и добавляет его в архив.
Этот метод рекурсивно прочитывает папки и всё, что содержится в них (включая подпапки)
и на основе этого создает ZIP. Независимо от структуры каталогов
оригинальный путь к файлу будет пересоздан в архиве.
string get_zip()
Получает архив. Этот метод возвращает двоичные данные архива в виде строки.
bool archive(string $filepath)
Сохраняет архив в указанный директорий.
void download(string $filename = 'backup.zip')
Отдаёт архив в браузер.
string $filename - имя файла
void clear_data()
Инициализирует данные.
Удаляет текущие данные архива из памяти. Этот метод полезно использовать,
если вам нужно создать несколько архивов с различными данными.
Создание собственных плагинов.
Все плагины располагаются в директории jlayer/jl/plugins
Для создания плагина создайте директорий с именем плагина в указанном выше директории.
В созданном директории создайте php файл c тем же именем.
В файле объявите класс с тем же именем и заключите его в пространство имен jl\plugins
Класс должен наследоваться от класса jl\Plugin
Окружение плагина:
Свойства:
jl\Db $db - Предназначено для работы с базой данных.
jl\Template $tpl - Обработчик шаблонов.
jl\Jlayer $jl - Взаимодействие с JohnCMS
jl\Language $lng - Работа с языковыми файлами.
Свойства и методы представленных выше объектов уже рассматривались, поэтому нет нужды повторять все тоже самое еще раз.
Для использования шаблонов создайте в директории плагина директорий view
Для работы с языками нужен директорий lang
Для работы с конфигурационными файлами - директорий config
Если ничего из этого вам в вашем плагине не понадобится, то создавать директории нет необходимости.
Адаптация под другие версии JohnCMS
После загрузки всех необходимых классов и проведения проверок Jlayer загружает конфигурационный файл
и обертку для функций движка из директория jlayer/jl/wrappers/johncms
Для адаптации jlayer под иную версию создайте в указанном директории директориий с названием поддерживаемой версии.
Например если планируется добавить поддержку версии 3.2.2 то путь к директорию должен выглядеть следующим образом:
jlayer/jl/wrappers/johncms/3.2.2/
В созданном директории создайте файл config.php и файл functions.php
Если необходимо использовать шаблоны оформления, то так же создайте директорий view
Файл config.php должен возвращать ассоциативный массив со следующими элементами:
'network' => array(
'ip' => 0, // IP адрес текущего пользователя
'ip_via_proxy' => 0, // IP адрес текущего пользователя за PROXY сервером
'user_agent' => 'Not Recognised', // User-Agent текущего пользователя
'is_mobile' => false, // Является ли браузер текущего пользователя мобильным?
),
'system_settings' => array(), // Настройки системы
'user' => array(
'data' => array(), // Данные пользователя
'settings' => array(), // Настройки пользователя
'infringements' => array(), // Список нарушений пользователя
'table_name' => 'users', // Имя таблицы базы данных, которая содержит данные пользователей
),
'language' => '', // Язык системы
'db' => array( // Данные MySQL соединения.
'host' => '', // Хост
'user' => '', // Имя пользователя
'password' => '', // Пароль
'name' => '', // Имя базы данных
),
'output' => array( // Данные для вывода
'head' => '', // Header
'end' => '', // Footer
),
'error_page' => '', // URI страницы ошибки
В файле functions.php объявите класс Functions унаследуйте его от класса jl\Functions и заключите в пространство имен jl\wrappers\johncms
После чего, реализуйте абстрактные методы класса jl\Functions