• invisionbyte
    Одним из основных путей реализации cross-application интеграции с IPS4 является использование расширений. Проще говоря, расширение необходимо для реализации конкретного функционала в определенных частях форума. Например, есть расширение, которое позволяет указать приложению, каким образом его содержимое будет обрабатывается системой поиска, или позволяет построить элементы для отображения на странице "Изменить пользователя" в админцентре. Если у вашего приложения есть расширение, то оно будет автоматически подгружено в соответствующих местах.
    Создание расширений
    Расширения создаются в центре разработчиков в AdminCP. IPS4 будет автоматически генерировать файл классов в соответствующем каталоге вашего приложения; вам будет предложено ввести имя класса для расширения при его создании.
     
    Каждое расширение требует различных методов, в зависимости от того, что делает расширение. Для получения дополнительной информации  обратитесь к  документации или отдельным исходным файлам в каталоге /extensions вашего приложения.
     
    What is an extension?
    One of the fundamental ways of implementing cross-application integration with the IPS4 framework is the concept of extensions. Put simply, an extension is a way for an application to implement specific behavior in specific parts of the suite. For example, there's an extension that allows an application to specify how its content is handled by the search system, and another that allows the application to build elements to be displayed on the "Edit Member" screen in the AdminCP. If your application provides an extension, it will be automatically loaded in the appropriate places.
     
    Creating an extension
    Extensions are created in the Developer Center for your application in the AdminCP. IPS4 will automatically generate the class file in the appropriate extension directory within your application; you'll be prompted to enter a classname for your extension when creating it.
    Each extension requires different methods, depending on what the extension does. Refer to this documentation or the individual source files in the /extensions directory of your application for more information.
     
    Типы расширений
    /core
    AdvertisementLocations
    Позволяет определить новые места рекламы в вашем приложении
    Announcements
    Облегчает контроль объявлений внутри приложения (например, позволяя пользователю определять отдельные категории)
    BBCode
    Добавляет дополнительные теги BBCode для IPS4, которые  будет обрабатывать ваше приложение
    Build
    Запуск дополнительного кода
    BulkMail
    Позволяет приложению использовать  дополнительные теги замены для массовой рассылки
    CommunityEnhancements
    Добавляет новые сторонние улучшения в секции в AdminCP
    ContactUs
    Добавление дополнительных полей для  формы “контакты”  с нами форма и обеспечить контроль над данными отправляемыми из этой формы
    ContentRouter
    Используется для указания элементов контента, используемых  вашим приложением
    CreateMenu
    Добавление новых записей в меню "+ Создать",  в заголовке
    Dashboard
    Добавить новые блоки на приборной панели в  AdminCP
    EditorLocations
    Управляет определение авторских прав на файлы загруженные через WYSIWYG редактор в вашем приложении.
    EditorMedia
    Добавляет новые источники в  "Вставить медиа" в WYSIWYG редактор
    FileStorage
    Определяет типы файлов которые могут быть загружены вашим приложением
    FrontNavigation
    Позволяет добавить вкладки и меню в панель навигации
    GroupForm
    Позволяет определить параметры для добавления к форме настроек группы
    GroupLimits
    Определяет, как групповые настройки обрабатываются для вторичных групп
    IncomingEmail
    Определяет способы обработки входящей почты для вашего приложения
    IpAddresses
    Указывает области в вашем приложении, где регистрируются IP-адреса
    LiveSearch
    Добавляет поддержку AdminCP Live Search для вашего приложения
    MFAArea
    Определяет  область, для защиты  многофакторной аутентификацией
     MemberFilter
    Позволяет установить новые способы фильтрации пользователей (например  на форме массовой рассылки)
    MemberForm
    Позволяет установить новые настройки на форме изменения информации о пользователе
    MemberSync
    Выполняет пользовательский код, когда аккаунт пользователя создается, редактируется или удаляется
    ModCp
    Добавляет секции к панели модератора
    ModCpMemberManagement
    Добавляет фильтры на страницу  настройки прав доступа  модераторов
    ModeratorPermissions
    Определяет новые права доступа модераторв
    Notifications
    Добавляет типы уведомлений которые будет отправлять ваше приложение.
    OutputPlugins
    Определяет новые тэги шаблона приложения которые будет использовать ваше приложение
    Permissions
    Устанавливает группы разрешений для интеграции с вашим приложением
    Profile
    Добавляет новые поля к профилю пользователей
    Queue
    Определяет фоновые задачи необходимые для вашего приложения
    Sitemap
    Добавляет поддержку карты сайта вашим приложением
    Uninstall
    Указывает какой код должен будет выполнен после удаления вашего приложения 
    /nexus
    Item
    Позволяет продавать предметы с Commerce интеграцией
     
    Павел
    Это руководство продемонстрирует как шаг за шагом создать простой в использовании плагин. Здесь вам будет показано, как создать плагин, отображающий сообщение в верхней части каждой страницы форума.
    Шаг 1: Создание плагина
    Для начала, вам нужно активировать режим разработчика. После того как режим разработчика будет активирован, в админпанели на странице Система --> Возможности --> Плагины появится кнопка "Создать плагин" . Нажмите на нее для того чтобы перейти в Plugin Developer Center.
    Шаг 2: Создание хуков темы
    Самый простой способ отображения сообщение в верхней части каждой страницы это создание хука темы. Хуки тем позволяют изменять содержимое шаблона. Мы будем менять шаблон "globalTemplate", который находится в "global" шаблонах, местоположении "front", приложения "core".
    На вкладке "Hooks", создайте новый хук и выберите " core --> front: global"  в качестве группы шаблонов. После создания, нажмите кнопку  “Изменить”, а затем выберите "globalTemplate" в меню слева.
    Выберите "Select Element", чтобы вывести содержимое шаблона и выбрать точку, которую вы хотите зацепить – хорошим местом будет <DIV ID="ipsLayout_mainArea">, а затем выберите пункт "Вставить содержимое внутри выбранного элемента (ов), в самом начале".
    Теперь нужно указать содержимое вручную:
    <div class="ipsMessage ipsMessage_information">Это глобальное сообщение</div> После сохранения вы можете перейти на главную страницу, и сразу увидите сообщение, которое вы только что создали.
    Поздравляем, вы только что создали простой плагин! Далее показано, как расширить этот функционал.
    Шаг 3: Использование шаблонов
    Удобно хранить весь HTML в шаблонах. Хотя этот подход работает отлично, HTML контент находится внутри кода вашего плагина, так что если кто-то после его установки захочет изменить в нем что-то (возможно, изменить CSS классы), ему будет трудно сделать это.
    К счастью, создать HTML шаблон очень легко. Если вы посмотрите в директории на вашем компьютере/сервере, где установлен IPS Community Suite, вы увидите папку "plugins"  -  внутри вы найдете каталог вашего плагина с именем, которое вы указали на шаге 1. Внутри есть папка dev/html. Внутри этой папки, файлы, создаваемые вами, будут доступны в виде шаблона.
    Создайте файл с именем globalMessage.phtml добавьте в него следующее:
    <ips:template parameters="" /> <div class="ipsMessage ipsMessage_information"> Теперь используется шаблон! </div> В первой строке просто указываются любые параметры, которые будут переданы в шаблон (в нашем случае не нужны). После того, как файл был создан, отредактируйте хук темы и изменить его содержимое используя данный код:
    {template="globalMessage" group="plugins" location="global" app="core"} Это тэг шаблона, который подгружает содержимое шаблона. Все шаблоны, созданные с помощью плагинов создаются в группе "plugins" в "global", в приложении "core".
    Как только это будет сделано, вы должны увидеть сообщение:  "Теперь используется шаблон!".
    В дополнение скажем, что если вы хотите добавить CSS код, вы можете просто добавить CSS файлы в папку dev/css, и они будут автоматически подключены. CSS файлы плагина компилируются вместе с внутренними CSS файлами IPS4 таким образом, чтобы они были доступны на каждой странице.
    Шаг 4: Настройки и языковые строки
    Теперь у вас есть глобальное сообщение - но сейчас нет никакого способа, чтобы настроить то, что оно отображает. Было бы удобно, если бы плагин имел простое меню настройки в админпанели, чтобы администратор мог использовать его для изменения содержимого.
    Чтобы создать его, перейдите на вкладку "Настройки" в центре разработчика для вашего плагина и добавьте параметры. Для ключа, используйте globalMessage_content, и установите значение по умолчанию какое вам нравится. Очень важно убедиться, что ваш плагин начинает работать сразу после установки, до того как администратор его настроит, поэтому не оставляйте значения по умолчанию пустыми.
    Создание настроек здесь выделяет пространство для них в базе данных, но вам все еще нужно создать форму, где администратор может редактировать функции плагина. Чтобы сделать это, опять же смотрим в папку вашего плагина в файловой системе; вы увидите файл под названием settings.rename.php. Во-первых, нужно его переименовать в settings.php затем открыть. Он уже содержит пример кода, чтобы вам было понятно. Измените первую строку кода ($form->add(...)) на это:
    $form->add( new \IPS\Helpers\Form\Editor( 'globalMessage_content', \IPS\Settings::i()->globalMessage_content, FALSE, array( 'app' => 'core', 'key' => 'Admin', 'autoSaveKey' => 'globalMessage_content' ) ) ); Этот код использует помощника форм.
    Теперь в разделе Плагины в админпанели, вы увидите новую кнопку "Изменить" рядом с плагином. При нажатии на нее всплывает форма с полем, где пользователь может заполнить сообщение.
    Существует, однако, одна небольшая проблема. Ярлык для установки такой: "globalMessage_content" - очевидно, что его нужно изменить на что-то более понятное, для чего вам понадобиться языковая строка. Языковые строки в IPS4 простые пары key/value, хотя языковые строки могут использовать более сложные функции, такие как строки замены и плюрализацию.
    Чтобы создать её, откройте в папке вашего плагина файл dev/lang.php. Он  содержит только пустой массив. Добавьте элементы в этот массив:
    $lang = array( 'globalMessage_content' => "Сообщение", ); Теперь ярлык будет называться  "Сообщение".
    И, наконец, вам нужно сделать выбранное пользователем отображение сообщения. Чтобы сделать это, откройте файл globalMessage.phtml, созданный на шаге 3 и измените его содержимое:
    <ips:template parameters="" /> {{if settings.globalMessage_content}} <div class="ipsMessage ipsMessage_information"> {setting="globalMessage_content"} </div> {{endif}} Это добавляет некоторую логику шаблона, которая определяет, есть ли значение настроек и отображает сообщение только если оно есть, и тег шаблонов, который получает значение нашего параметра.
    Шаг 5: Внесение изменений в базу данных
    Идём далее, мы можем  добавить кнопку "Закрыть" к сообщению, что позволит пользователям отключить сообщение, как только они прочитали его. Закрыл ли данный пользователь сообщение или нет, информация должна быть сохранена в базе данных.
    Откройте папку dev/setup в каталоге вашего плагина. Здесь вы найдете файл под названием install.php. Этот файл запускается, если ваш плагин установлен. Если вам необходимо сделать последующие изменения базы данных в будущих версиях вашего плагина, вы можете создавать новые версии в центре разработчика, и файл будет создан для каждой версии, которую вы создаете. Вы должны убедиться, что любые ваши изменения сохранялись в файл install.php и соответствующий файл обновления.
    Откройте install.php и добавьте этот код в метод шага 1:
    \IPS\Db::i()->addColumn( 'core_members', array( 'name' => 'globalMessage_dismissed', 'type' => 'BIT', 'length' => 1, 'null' => FALSE, 'default' => 0, 'comment' => 'Если значение 1, пользователь закрыл сообщение' ) ); return TRUE; Этот код добавляет новый столбец в таблицу core_members в базе данных, которая представляет собой таблицу, содержащую информацию о всех пользователях. Поле в столбце имеет тип BIT (что означает, что он может хранить только 1 или 0) - 0 будет указывать что пользователь не отключил сообщение (и оно будет показываться) а 1 укажет, что он закрыл его. Значение по умолчанию устанавливается равным 0.
    Но нужно убедиться, что этот код создаст столбец при установке плагина. Для этого вам необходимо выполнить запрос на локальной базе данных. Выполните этот SQL запрос, используя любую предпочтительную систему для управления базами данных данных:
    ALTER TABLE core_members ADD COLUMN globalMessage_dismissed BIT(1) NOT NULL DEFAULT 0 COMMENT 'If 1, the user has dismissed the global message'; Если пользователь закрыл сообщение, то его выбор необходимо будет сбросить, если администратор изменит содержимое сообщения. Для того, чтобы справиться с этим, добавьте эту строку в файл settings.php в каталоге плагина, сразу после вызова $form->saveAsSettings();.
    \IPS\Db::i()->update( 'core_members', array( 'globalMessage_dismissed' => 0 ) );  
    Шаг 6: Создание хука кода
    Теперь, когда  вы выделили пространство в базе данных, где будет храниться флаг, вам нужно написать код, который будет устанавливать значение, и свяжет его с шаблоном.
    Вам нужно добавить метод к контроллеру, который будет обрабатывать щелчок пользователя. Общий контроллер, предназначенный для такого рода событий доступен в \IPS\core\modules\front\system\plugins - хотя теоретически, можно добавить метод к любому контроллеру.
    В центре разработчика, создаем хук кода на этот класс, открываем его (либо в админпанели, либо открыв файл, который был создан в каталоге хуков в каталоге плагина) и добавляем следующий код внутрь класса:
    public function dismissGlobalMessage() { \IPS\Session::i()->csrfCheck(); if ( \IPS\Member::loggedIn()->member_id ) { \IPS\Member::loggedIn()->globalMessage_dismissed = TRUE; \IPS\Member::loggedIn()->save(); } else { \IPS\Request::i()->setCookie( 'globalMessage_dismissed', TRUE ); } \IPS\Output::i()->redirect( isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : \IPS\Http\Url::internal( '' ) ); } Важно точно понять что делает эта функция:
    Сначала она выполняет проверку CSRF. Поскольку это метод контроллера, он выполняется автоматически при доступе  к соответствующему  URL. Потому, что это влияет на пользователя (она изменяет предпочтение) крайне важно, чтобы она имела CSRF проверку. Если проверка не проходит, то выполнение будет остановлено автоматически. Она проверяет, является ли текущий пользователь зарегистрированным пользователем. \IPS\Member::loggedIn() возвращает объект \IPS\Member для текущего пользователя - если пользователь является гостем (не вошел на сайт) member_id будет равен 0. Если пользователь вошел в систему, она устанавливает свойство  globalMessage_dismissed в TRUE и сохраняет элемент. Если пользователь залогинен, то она изменит столбец таблицы, созданный на шаге 5 для соответствующей строки в базе данных. Если пользователь не вошел в систему, она создает куки, таким образом  пользователи, которые не вошли в систему, смогут скрыть сообщение. Затем она перенаправляет пользователя обратно на страницу где они были, или, если сервер не может предоставить ссылку, домашнюю страницу. Теперь, когда событие создано, необходимо настроить шаблон, чтобы добавить кнопку сброса.
    Изменим шаблон, созданный на шаге 3:
    <ips:template parameters="" /> {{if settings.globalMessage_content and !member.globalMessage_dismissed and !isset( cookie.globalMessage_dismissed )}} <div class="ipsMessage ipsMessage_information"> <a href="{url="app=core&module=system&section=plugins&do=dismissGlobalMessage" csrf="1"}" class="ipsMessage_code ipsType_blendlinks ipsPos_right"><i class="fa fa-times"></i></a></span> {setting="globalMessage_content"} </div> {{endif}}  
    Шаг 7: Добавление Javascript
    Теперь у нас есть полностью функциональный плагин, который отображает сообщение всем пользователям, и которое они могут закрыть. Теперь можно добавить немного улучшений. Можно сделать так, чтобы сообщение закрывалось с помощью AJAX запроса, вместо перезагрузки страницы. Важно добавлять JavaScript только после того как уже готов весь основной функционал, чтобы пользователи, у которых отключен JavaScript, могли использовать ваш плагин, и поисковые системы могли получить доступ к контенту вашего плагина.
    Для этого необходимо создать контроллер JavaScript. В директории dev/js в каталоге вашего плагина, создайте файл globalMessageDismiss.js со следующим кодом:
    ;( function($, _, undefined){ "use strict"; ips.controller.register('plugins.globalMessageDismiss', { initialize: function () { this.on( document, 'click', '[data-action="dismiss"]', this.dismiss ); }, dismiss: function (e) { e.preventDefault(); var url = $( e.currentTarget ).attr('href'); var message = $(this.scope); ips.getAjax()(url).done(function(){ ips.utils.anim.go( 'fadeOut', message ); }).fail(function(){ window.location = url; }); } }); }(jQuery, _));  
    Этот код выполняет следующее:
    Все, кроме содержания функций initialize и dismiss, требуется для JavaScript контроллера. Строка ips.controller.register указывает имя контроллера. Когда элемент с присоединенным JavaScript контроллером подгружается, запускается функция initialize. Лучше всего  настроить обработчики событий здесь один раз и обрабатывать события в других функциях. Мы создаем здесь событие чтобы она срабатывала, при щелчке на какие-либо элементы, у которых есть селектор [data-action="dismiss"]. Функция dismiss предотвращает первоначальное событие которое было задано по умолчанию (переход по щелчку на заданный URL), а затем определяет необходимые переменные (URL-адрес, куда ведет клик по кнопке, и окно сообщения). Затем он посылает AJAX запрос к указанному URL. Если это удается, окно сообщения исчезает, а если не удается, перенаправляет пользователя туда так, как если бы не было никакого JavaScript. При неудачном переходе к первоначальному URL, пользователь увидит фактическую ошибку. Чтобы это все работало, вам нужно указать, что ваше сообщение должно использовать данный контроллер. В шаблоне, добавьте data-controller="plugins.globalMessageDismiss" к элементу “div”, а data-action="dismiss" к элементу “a”.
    Для полноты картины, мы должны несколько скорректировать действия AJAX запроса. Хотя это не обязательно, если этого не сделать то, возможно, что если редирект перенаправит пользователя на страницу с ошибкой, AJAX расценит как неудавшийся запрос. Откройте файл action.php созданный на шаге 6 и измените строку редиректа:
    if ( \IPS\Request::i()->isAjax() ) { \IPS\Output::i()->sendOutput( NULL, 200 ); } else { \IPS\Output::i()->redirect( isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : \IPS\Http\Url::internal( '' ) ); } После это сообщение будет плавно исчезать вместо перезагрузки страницы, при клике на кнопку “закрыть”.
     
    Шаг 8: Загрузка вашего плагина
    Поздравляем, вы только что создали свой первый плагин! Теперь можно установить его на другие сайты.
    Global_Message.xml
     
    Тимофей
    IPS Community Suite  поддерживает несколько языков и инструментов перевода таких как визуальный редактор языков. Весь текст который используется вашим плагином должен быть приведен к языковой строке.
    Языковые строки определяются key/value парами. Чтобы добавить строку языка, просто откройте файл /plugins/<ваш_плагин>/dev/lang.php и добавьте элемент в массив. Затем чтобы использовать языковые строки, используйте их в контроллере:
    \IPS\Member::loggedIn()->language()->get( 'KEY' ); Или вот так в шаблоне:
    {lang="KEY"}  
    Тимофей
    Плагины поддерживают внешние ресурсы такие, как изображения, JavaScript, CSS файлы и шаблоны.
    HTML шаблоны
    HTML файлы становятся шаблонами в группе core -> global -> plugins. Другими словами, вы получите содержание HTML-файлов, созданных с помощью этого кода в контроллерах, где filename = имя вашего шаблона:
    \IPS\Theme::i()->getTemplate( 'plugins', 'core', 'global' )->filename( ... ); Или следующий код из других шаблонов:
    {template="filename" group="plugins" location="global" app="core"} Вы должны создавать свои файлы, используя расширение ".phtml". Первая строка файла должна иметь следующий тег:
    <ips:template parameters="$example1, $example2" /> Заменить $example1, $example2 переменными, которые вы хотите передать. Можно и не передавать параметры. В этом случае атрибуты параметров должны быть просто пустой строкой.
    Вы можете использовать логику шаблонов и теги шаблонов. Обратите внимание, что если какой-либо код в шаблоне вызывает исключение (что может произойти, если вы используете особенно сложную логику шаблона/теги без четких определений), содержимое шаблона будет игнорироваться, и будет возвращаться пустая строка.
    CSS/Javascript файлы
    Любые CSS и JavaScript файлы, которые вы создадите, будут скомпилированы с остальной частью CSS и JavaScript автоматически, поэтому вам не нужно ничего делать, кроме создания файлов. Убедитесь, что вы создаете файлы с нужным расширениями в соответствующем каталоге вашего плагина.
    Изображения
    При запуске плагина, изображения будут размещены в core -> global, в папке плагинов. Другими словами, вы будете отображать изображения, которые вы разместили в папке "IMG" с помощью  кода в шаблонах:
    <img src='{resource="plugins/example.jpg" app="core" location="global"}'> Вы должны поместить все изображения непосредственно в каталоге "IMG", не создавая подкаталоги.
     
    Тимофей
    Для запуска кода изменения базы данных при установке вашего плагина, откройте файл /plugins/<ваш_плагин>/dev/setup/install.php и следуйте инструкциям в комментариях.
    Обновления
    Плагины поддердивают систему контроля версий. Всякий раз, когда вы выпускаете новую версию своего плагина, вам необходимо добавить новую версию в Plugin Developer Center. При добавлении версии, необходимо указать идентификационный номер (например, "10000", "10001" и т.д.), а также удобную для восприятия пользователем строку (например, "1.0.0", "1.0.1", и т.д.). Конкретного стандарта на то, как должен быть отформатирован идентификационный номер, нет, но необходимо увеличить номера для более новых версий. Строка для пользователя должна быть в формате "x.y.z".
    В файле, который находится в каталоге /plugins/<your plugin>/dev/setup, вы можете указать код, который будет выполняться при обновлении до этой версии (см комментарии в файле для более подробной информации).
    Важно отметить, что при установке, будет выполнена только установка, поэтому, когда вы вносите изменения, как правило, необходимо добавить их как к установщику, так и в соответствующий файл обновления для этой версии.
     
    Тимофей

    От Тимофей, в Плагины,

    Задачи – это скрипты, которые выполняются через определенные промежутки времени. Они полезны для выполнения вспомогательных процессов, которые должны выполняться регулярно. Важно отметить, однако, что на них не всегда можно полагаться - хотя IPS Community Suite обеспечивает возможность выполнения задач для администраторов, используя cron, он может быть выключен, и в этом случае задачи могут быть выполнены только тогда, когда пользователь запустит скрипт на сайте.
    Вы можете создавать задачи в Plugin Developer Center. При создании задачи, файл вашей задачи автоматически будет создан в /plugins/<ваш_плагин>/task. Комментарии в этом файле объяснят, как реализовать поставленную задачу.
    Изучите  руководство по выполнению задач для получения дополнительной информации о их написании.
     

    Тимофей

    От Тимофей, в Плагины,

    Как и полноценные приложения, плагины могут иметь системные настройки, которые позволяют администраторам настраивать их. Например у вас могут быть настройки, которые включают/выключают какую-то часть вашего функционала, или полей, которые могут принимать некоторые значения аутентификации, используемые в какой-либо другой системы. Если вашему плагину требуется кастомизация пользователем, настройки - идеальный инструмент для реализации этого.
    Выделение места в IPS\Settings
    \IPS\Settings является хранилищем для пар данных key/value - оно делится между всеми приложениями и плагинами и доступно отовсюду. Есть также ярлыки для быстрого доступа к его содержимому, которое находится в шаблонах. Его основная цель предназначена для хранения настроек, которые задает администратор в админпанели.
    Для того, чтобы использовать это, необходимо ввести ключи, которые вы хотите выделить для вашего плагина и значения по умолчанию в Plugin Developer Center. Ключи не находятся в пространстве имен, поэтому рекомендуется выбирать ключи, которые вряд ли будут использоваться другими приложениями или плагинами.
    Создание страницы параметров
    Ваш плагин может иметь одну страницу настроек, которая будет отображаться когда администратор нажимает на кнопку "изменить" рядом с плагином. В большинстве случаев это будет просто обычная форма которая создается с помощью помощника форм. Несмотря на то, что помощник очень гибкий (может создавать вкладки, боковые панели и широкий спектр типов ввода), вы не ограничены им и можете отображать настройки, как вам нравится.
    В каталоге  /plugins/<ваш_плагин> вы найдете файл под названием "settings.rename.php" – переименуйте его в "settings.php". В нем будет содержаться код, который запускается, когда пользователь открывает вашу страницу настроек. Файл-пример создан помощником, и все что вам нужно сделать для его использования, это добавить дополнительные поля ввода. Если вы хотите использовать кастомный интерфейс, вам просто нужно возвращать либо строку (с контентом для отображения) или TRUE, для пропуска страницы настроек. Ваш код будет обработан и, поэтому, вам не нужно использовать <?PHP тег  - включите его в начальный файл чтобы подсветка синтаксиса работала как нужно, но нельзя забывать что он должен быть закомментирован.
     
    Тимофей

    От Тимофей, в Плагины,

    Хуки тем позволяют изменять шаблоны HTML. Шаблоны HTML в IPS Community Suite структурированы по группам, месту расположения и приложениям. У каждого приложения по меньшей мери 3 местоположения:
    front (шаблоны используемые для фронт-энда) admin (шаблоны используемые для администратора) global (шаблоны которые используются для обоих) Хотя некоторые приложения могут иметь больше, для конкретных целей (например, приложение core имеет другое место для установки/обновления - setup). Каждое местоположение может содержать любое количество групп - группы являются наборами шаблонов, например, приложение core имеет одну группу (в front) называется messaging, который содержит все шаблоны для создания и просмотра личных бесед.
    Один хук тем действует в одной группе шаблонов.
    Вы можете создать хуки тем в Plugin Developer Center. При создании есть два способа использования хуков тем - каждый из которых работает по-разному и поэтому будет уместен при различных потребностях.
    CSS селекторы
    При редактировании ваших хуков тем в Plugin Developer Center, будет отображаться панель, показывающая все шаблоны в этой группе:

    При выборе любого шаблона появляется интерфейс с вкладками, показывающий изменения которые ваш хук делает в этом шаблоне, и позволяют создавать еще.

    Чтобы модифицировать выбранный шаблон, вам нужен CSS селектор  - вы можете использовать любой из селекторов, поддерживаемых JQuery (стоит отметить, что Jquery не участвует в создании вашего хука, это просто чтобы показать, что поддерживаемые селекторы одинаковы). Самый простой способ выбрать селектор в "Select Element", который запустит модель отображения шаблона позволяет просто нажать на элемент, который вы хотите использовать:

    Важно отметить, что при использовании функции "Select Element", используется наиболее специфический селектор CSS для выбранного элемента, однако, селектор может также соответствовать другим элементам, так что вам, возможно, потребуется настроить его.
    При работе с контентом, в дополнение к переменным, которые доступны для шаблона (которые показаны рядом с редактором) вы также можете использовать любые переменные, доступные в этом пункте в шаблоне (например, если вы вставили код в цикл foreach, вы можете использовать переменные, созданные им). Вы можете также использовать логику шаблонов и теги шаблонов IPS4.
    Режим PHP
    Под капотом, каждый шаблон группы скомпилирован в PHP класс, с помощью метода для каждого шаблона. Вы можете расширить этот класс вручную отредактировав файл, который будет создан в /plugins/<your plugin>/hooks.
    Важно отметить, что при использовании этого режима, когда вы перегружаете группы скомпилированных шаблонов, возвращаемое значение будет в виде HTML-кода, который будет отображаться, без какой-либо логики шаблонов или тэгов шаблона.
    Все те же  соображения, что и для хуков кода (см "Важные моменты которые нужно помнить при создании хуков") также применимы и здесь.
     
    Тимофей

    От Тимофей, в Плагины,

    Хуки кода позволяют расширить любой класс в IPS Community Suite, или функционал установленного приложения. Вы можете создавать хуки кода в  Plugin Developer Center.
    Как вы могли заметить, в коде классы при определении начинаются с подчеркивания, а вызывается без него. Например, в /system/Member/Member.php  определение следующее:
    namespace IPS; class _Member extends \IPS\Patterns\ActiveRecord Уже в коде класс вызывается так \IPS\Member а не \IPS\_Member. При создании хука  определите класс который вы хотите расширить без подчеркивания. Когда вы редактируете код будет следующая надпись "extends _HOOK_CLASS_" –это из-за того что класс который он расширяет может варьироваться, если несколько хуков перегружают один и тот же класс.
    Вы можете редактировать хуки как в Plugin Developer Center так и вручную, путем изменения файла, находящегося в /plugins/<ваш_плагин>/hooks. Использовать Plugin Developer Center удобнее так как все свойства и методы класса которые вы расширяете показаны в боковой панели и щелчок на любой из них вставит выражение в редактор.
    Важные моменты которые нужно помнить при создании хуков:
    Первая строчка в классе, который вы создаете, должна быть такой: //<?php – это если вы хотите править файл вручную в редакторе, чтобы подсветка синтаксиса работала верно, так или иначе  тэг <?php не должен применяться без комментариев. Ваш хук определится как расширение  _HOOK_CLASS_ - синтаксически это неверно, но это нельзя менять. Система сама изменит это на нужный класс который может изменяться в зависимости от того сколько на нем хуков. Если ваш код создает PHP ошибку или выдает RuntimeException, ваш хук будет проигнорирован и система вернется к исходному классу. Если вы хотите намеренно создать исключение, добавьте объект соответствующего класса в исключение. При переопределении метода НЕОБХОДИМО вызвать родительский метод. Идеально если вы вставите его в начало или конец метода. Это необходимо для работы нескольких хуков на один метод. При переопределении метода, вам НЕ СЛЕДУЕТ копировать код оригинального метода в ваш хук. Необходимо убедиться, что ваш хук не будет конфликтовать с багфиксами или изменениями оригинального класса в будущих версиях. Кроме того, это противоречит условиям лицензии IPS Community Suite на иньекции в него кастомного кода.  

    Тимофей
    “Плагины” позволяют разработчикам  изменять или расширять функциональность приложений в  IPS Community Suite.
    Это руководство подробно описывает различные функции, доступные при использовании “Плагинов”. Описание многих функций доступно в Plugin Developer Center - чтобы получить доступ к нему нужно активировать режим разработчика. После того как будет активирован режим разработчика, кнопка "Создать плагин" появится в админпанели в разделе Систем --> Возможности --> Плагины. Используйте ее, чтобы создать свой плагин, после чего вы будете перенаправлены в Plugin Developer Center.
    Назначение плагинов
    Плагины отличаются от приложений тем, что они предназначены для расширения функционала существующих приложений. Есть хуки кода и хуки тем, которые позволяют подключиться к существующему коду в других приложениях и манипулировать им - отличный вариант для расширения функционала. Если вы поняли что хотите добавить качественно отличающиеся функции которые не пересекаются с существующими, вы можете создать новое приложение.
    Выпуск плагинов
    В режиме разработчика ваши плагины создаются в виде файлов в файловой системе. Когда ваш плагин готов к публикации, IPS4 скомпилирует его в виде отдельного XML файла, которым можно поделиться и который может быть установлен другими, например, в нашем файловом архиве или официальном IPS Marketplace. Просто скачайте файл XML из Plugin Developer Center.