0  /  36

Маркетплейс Bitrix Framework

Содержание

Создание собственных модулей

  Создание модуля

Цитатник веб-разработчиков.

Sergey Leshchenko: Если код часто используется повторно, то его лучше вынести в модуль. Потратить на это лишние час-два, но зато не ловить потом фатальные баги сразу на всех проектах одновременно, когда кто-то, по случайности или не знанию, внес какие-то специфические изменения в этот код. И модуль вынести в маркетплейс, чтобы накатывать апдейты удобнее было.

Партнерские модули отличаются от стандартных модулей следующим:

  • ID модуля - полный код партнерского модуля, который задается в формате: код_партнера.код_модуля.

    Часть код_партнера постоянна для партнера (задается в карточке партнера). Часть код_модуля вводится партнером при добавлении нового модуля. Эти коды должны быть алфавитно-цифровыми, но первым символом не может быть цифра, и код неким образом должен соответствовать сути модуля. Например, для модуля форума желательно задать код forum. Тогда полный код будет mycompany.forum. Использование точки для разделения кода партнера и кода модуля необходимо, иначе ваш модуль не будет виден в списке установленных решений Marketplace, а попадет в список системных модулей, что является некорректной ситуацией.

    Важно! Код модуля обязательно должен быть задан в нижнем регистре, иначе не будет работать метод IncludeModule.

    Код не должен начинаться с цифры - это может помешать установке модуля. Также запрещается использование подчеркивания "_".

  • В файле /install/index.php кроме той информации, которая задается в любом стандартном модуле, необходимо еще указать:
  • $this->PARTNER_NAME = "Имя партнера - автора модуля"; 
    $this->PARTNER_URI = "http://www.mysite.ru";

    У клиента эта информация будет доступна в списке модулей.

Внимание! Модуль необходимо создавать в кодировке windows-1251, при установке его на сайт с кодировкой UTF-8 происходит автоматическая перекодировка.

Помните, что в Bitrix Framework принято, что версия не может быть равной 0, то есть 0.0.1 - минимальный номер версии.

Помните, что только языковые файлы из папки /ru/ конвертируются в кодировку сайта.

Примечание: Допускается наличие [ds]обфусцированных[/ds][di] Обфускация (или запутывание кода) — приведение исходного кода или исполняемого кода программы к виду, сохраняющему её функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции.

Подробнее...[/di] частей кода, при этом в описании модуля должна присутствовать информация о наличии такого кода.

  Инфоблоки или таблицы БД?

Цитатник веб-разработчиков.

Максим Месилов: Инфоблоки отлично подходят для прототипирования и макетирования функционала. На уровне своего приложения (модуля) делаете прослойку, которая отвечает за хранение данных и начинаете использовать инфоблоки.

Если вы упрётесь в производительность или особенности работы ИБ, то просто смените самый нижний уровень. В моей практике такого пока не случалось.

При создании собственных модулей у разработчиков часто возникает вопрос: при написании собственного модуля что целесообразнее: использование инфоблоков или собственные таблицы? Ответ на этот вопрос зависит от решаемой задачи. Наличие в Bitrix Framework инфоблоков не означает обязательности их использования для реализации своих модулей.

Инфоблоки - это универсальность. По этой причине:

  • Инфоблоки часто избыточны по своим возможностям;
  • При использовании инфоблоков разработчик может работать с модулем как с обычным компонентом, не нужно дорабатывать API (и описывать его).

Собственные таблицы - это прежде всего производительность. Используя свои таблицы, разработчик:

  • может сделать модуль куда более быстродействующим, чем если бы делал модуль со стандартным API;
  • при разработке собственного API, принимает на себя всю ответственность по безопасной работе своего модуля;
  • должен подумать о том, что с его кодом будут работать другие разработчики: комментарии и документация.

  Документация по теме


Структура полной сборки модуля

  Структура полной сборки

Полная сборка модуля предназначена для первоначальной установки модуля (когда этого модуля ещё нет у клиента или партнера).

Полная сборка должна содержать следующую структуру обязательных файлов модуля:

  • /install/index.php - файл с описанием модуля, содержащий инсталлятор/деинсталлятор модуля.
  • /install/version.php - файл с номером версии модуля. Версия не может быть равной нулю. В файле можно использовать только двойные кавычки, одинарные работать не будут.
  • /include.php – подключаемый файл (файл подключается при подключении модуля во время выполнения скриптов сайта), в нем должны находиться включения всех файлов с библиотеками функций и классов модуля. В этом файле также объявляются используемые модулем константы, если они общие. Если же константы относятся к какому-либо классу модуля, то они объявляются в самом классе.

Все остальные файлы могут быть включены в модуль, если это необходимо.

Примечание: подробная информация о структуре файлов модуля.

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

  • Создайте папку /.last_version.

    Примечание: если разработка ведётся на компьютерах Mac, то название архива должно быть без точки.

  • Скопируйте в неё все файлы для полной сборки.
  • Заархивируйте папку /.last_version в формат .zip или .tar.gz

В итоге должен получиться архив с именем .last_version.zip (.last_version.tar.gz). Для типичного модуля полная сборка может иметь следующую структуру каталогов и файлов:

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

Полная сборка не влияет на обновление модуля и вообще не используется для этого. Она нужна только для первичного скачивания и установки нового модуля. Если в силу каких-то причин необходимо запретить загрузку обновлений для каких-то пользователей (через оплаченный период, например, или при новой версии), то достаточно отвязать клиента от модуля. Модуль у него останется, но обновляться он не сможет.

  Полезные методы

WizardServices::SetFilePermission($path, $permissions) по сигнатуре эквивалентен $APPLICATION->SetFileAccessPermission($path, $permissions), но с более правильной логикой добавления прав доступа (не затирает существующие права).
WizardServices::AddMenuItem($menuFile, $menuItem, $siteID) добавление пункта меню
WizardServices::IncludeServiceLang($relativePath, $lang = false, $bReturnArray = false) подключает произвольный языковой файл сервиса
ImportIBlockFromXML($xmlFile, $iblockXmlID, $iblockType, $siteID, $permissions = Array()) импорт инфоблока.

Если метод используется более чем в одном месте, выносите его в класс WizardServices.

  Инсталлятор и деинсталлятор

Инсталлятор и деинсталлятор размещаются в файле /local/modules/ID модуля/install/index.php. В нем должен быть описан класс, название которого совпадает с ID модуля. Например, так:

01	<?
02	Class mymodule extends CModule
03	{
04	    var $MODULE_ID = "mymodule";
05	    var $MODULE_NAME;
06	 
07	    function DoInstall()
08	    {
09	        global $DB, $APPLICATION, $step;
10	        $APPLICATION->IncludeAdminFile(GetMessage("FORM_INSTALL_TITLE"),
                                               $_SERVER["DOCUMENT_ROOT"]."/local/modules/mymodule/install/step1.php");
11	    }
12	 
13	    function DoUninstall()
14	    {
15	        global $DB, $APPLICATION, $step;
16	        $APPLICATION->IncludeAdminFile(GetMessage("FORM_INSTALL_TITLE"), 
                                               $_SERVER["DOCUMENT_ROOT"]."/local/modules/mymodule/install/unstep1.php");
17	 
18	    }
19	}
20	?>

Примечание: При описании модуля нужно наследоваться именно от CModule, потому что при добавлении ведущего слеша с CModule загрузка не пройдет по маске.

Метод DoInstall будет вызываться при нажатии на кнопку Установить в списке модулей административной панели. Соответственно, DoUninstall – при нажатии на кнопку Удалить.

Также в папке /install находятся файлы step1.php и unstep1.php. Если нужен многошаговый установщик, то следует создать файлы step1.php, step2.php и т.д. Задача установщика – зарегистрировать модуль в системе. На самом деле, для этого достаточно вызвать всего лишь одну функцию:

1	RegisterModule("mymodule");

Однако скорее всего для модуля понадобятся свои таблицы в БД и файлы. В таком случае, следует создать их в шагах инсталлятора (step1.php, step2.php и т.д.). Аналогично, в деинтсталляторе нужно сделать противоположные действия (удалить таблицы и файлы).

В качестве примера можно рассмотреть инсталляторы штатных модулей. Наиболее наглядный установщик у модуля Веб-Формы.

Примечание:
  • Подчеркивание в ID модуля использовать нельзя. При добавлении модуля система проверяет допустимые символы в коде модуля. Можно использовать латинские буквы + цифры. Учтите, что если название модуля начинается с цифр, то работать не будет (в PHP функция/класс не могут начинаться с цифр). Также не стоит использовать смешанный регистр в коде модуля.
  • Название класса модуля формируется аналогично ID модуля, с заменой точки на подчёркивание. Например, если ID модуля alexey.mycar, то класс будет: Class alexey_mycar .

  Сторонние библиотеки

Использование сторонних библиотек возможно, если соблюдаются все лицензионные ограничения разработчиков библиотек. Если используется сторонняя библиотека, то необходимо проверить, чтобы имена объектов/классов/функций не совпадали с системными.

Библиотеку не стоит размещать в папке /local/modules/. Необходимые для работы модуля файлы лучше положить в ваш модуль, для удобства последующего обновления. Пользовательские же файлы с подобными файлами обычно кладутся в /local/php_interface/.

  Пункт в меню админки

Если необходимо добавить в меню административной части системы пункты вашего модуля, то необходимо использовать событие OnBuildGlobalMenu.

Пример использования события для добавления собственного пункта в Список пользователей:

AddEventHandler("main", "OnBuildGlobalMenu", "MyOnBuildGlobalMenu"); 
function MyOnBuildGlobalMenu(&$aGlobalMenu, &$aModuleMenu) 
{ 
   foreach($aModuleMenu as $k => $v)
   { 
      if($v["parent_menu"] == "global_menu_settings" && $v["items_id"] == "menu_users")
      { 
         $aModuleMenu[$k]["items"][] = Array(
               "text" => "Кастомный пункт пользователей",
               "url" => "user_custom.php?lang=".LANG,
               "title" => "Своя страница пользователей"
            ); 
      } 
   } 
}

Задание демо-режима для модулей

Платный модуль может быть представлен в демо-режиме для изучения пользователем его возможностей перед приобретением.

В модуле могут быть заданы следующие ограничения:

  • Файлы include.php и install/index.php будут обфусцированы.

    Примечание: В файле include.php нужно обязательно закрывать php теги, так как в демо-режиме модуля будет ошибка примерно такая: [ParseError]
    syntax error, unexpected '<', expecting end of file (0) /mnt/c/Users/user/web/modules/bitrix-firstsite/bitrix/modules/techdir.redirector/include.php:19

  • В файл include.php будет добавлен код проверки триального режима и его срока.
  • В файл install/index.php будет добавлен код, который будет устанавливать дату установки модуля для дальнейших проверок. В файле обязательно должна быть функция InstallDB хотя бы с пустым содержимым и она обязательно должна вызываться.

Кроме этого, для подключения модулей можно использовать функцию CModule::IncludeModuleEx($module_name). Отличие ее от стандартной CModule::IncludeModule в том, что она в качестве результата может возвращать:

  • MODULE_NOT_FOUND (0) - модуль не найден (например скопировали ваши компоненты из модуля, а модуль удалили);
  • MODULE_INSTALLED (1) - модуль установлен и подключен;
  • MODULE_DEMO (2) - модуль работает в демо-режиме (например можно вывести сообщение, что вы можете купить версию без ограничений);
  • MODULE_DEMO_EXPIRED (3) - срок работы демо-режима модуля истек.

Если ваш модуль содержит только компоненты, то рекомендуется часть их функционала вынести в include.php, чтобы компоненты не работали без модуля.

Внимание! В систему встроена защита от повторной установки демо-версии. То есть пользователь не имеет возможности удалить и поставить заново модуль и вновь пользоваться им в демо-режиме.

Обновления модулей

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

  Структура обновления модуля

Файлы папки с обновлением:

  • /install/version.php - файл содержит номер версии обновления и дату его выпуска. Обязательный файл.
  • description.* - содержит описание обновления, где * - идентификатор языка в системе. Например, описание обновления модуля на русском языке будет содержаться в файле description.ru, на английском - description.en. Обязательный файл.
    В описании допустимо использование html тегов: <b>,<i>,<u>,<li>,<ul>,<span>, <br>
  • updater.php – файл запускается при установке обновления. С помощью этого файла выполняются действия для обновления на новую версию. Необязательный файл.
  • version_control.txt - служит для организации связи между версиями модулей. Файл содержит ссылки на версии модулей, от которых зависит данное обновление. Например, файл может содержать iblock,13.8.0. Это означает, что данное обновление будет установлено, если в системе установлен модуль Информационные блоки версии не ниже 13.8.0. Либо модуль Информационные блоки не установлен вообще. Необязательный файл.

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

  • Создайте каталог с названием версии обновления. Например, 0.0.2, 0.0.5 и т.д.
  • Скопируйте в созданную папку файлы и каталоги обновления модуля.
  • Заархивируйте папку в формат .zip или .tar.gz.

В результате должно получиться, например, 0.0.2.zip, 0.0.5.zip. Например, папка с обновлением может иметь следующую структуру:

  updater.php

Структура апдейтера

Апдейтер может создаваться в двух формах. При этом в каждом конкретном обновлении может присутствовать только какая-то одна.

  • Файл /updater.php в корне папки с обновлением. Этот файл будет запускаться на выполнение в качестве апдейтера.
  • Папка /updater в корне папки с обновлением. В качестве апдейтера будет запускаться файл index.php в ней.

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

Описание

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

В каждом обновлении может быть только один updater.php. Но может и не быть ни одного, если требуется обновить только ядро.

Апдейтер может выполнить PHP-код. При этом есть набор архитектурных ограничений, которые необходимо учитывать.

Ограничения

  • Обновления устанавливаются на все модули, которые входят в лицензию и [dw]присутствуют на сайте[/dw][di]Установлен модуль или нет, не имеет значения[/di]. Это надо учитывать при написании кода апдейтера.
  • Обновления могут переустанавливаться несколько раз. Соответственно код апдейтера должен учитывать возможность многократного запуска.
  • Апдейтер выполняется один раз непосредственно перед копированием файлов обновления из папки обновления в ядро на одном хите. Если за один хит обновляются несколько версий одного модуля, то их апдейтеры выполняются последовательно в соответствии с их версиями. Если за один хит обновляются несколько модулей, то выполняются апдейтеры всех этих модулей, но межмодульный порядок их выполнения не определен.
  • АПИ текущего обновления [dw]недоступен на хите обновления[/dw][di]В случае использования нового кода в апдейтере будет получена ошибка: Class 'Имя\Класса' not found[/di]. А если есть циклические межверсионные зависимости, которые связывают несколько версий одного модуля, то будет недоступен АПИ всех этих обновлений. Использование нового АПИ в коде updater.php невозможно. Использование любого АПИ в коде апдейтера возможно, но не рекомендуется.
  • При выполнении апдейтера доступен и он, и вся папка с обновлением.

  Обновление

Примечание: [dwi include_kernel]Ядро[/dwi] обновляется системой обновлений автоматически при установке обновлений. Другие же части сайта, включая базу данных, автоматически не обновляются.

Все файлы обновления просто копируются как есть в папку модуля. И если ваш модуль полностью расположен в этом каталоге, то обновление завершено. Если же по логике работы модуля требуется чтобы часть файлов была вне ядра, в какой-либо другой папке, то с помощью updater.php нужно перенести их в нужное место.

Механизм апдейтеров (updater.php) служит именно для того, чтобы применить необходимые изменения к тем частям сайта, которые не являются ядром. С помощью этого механизма можно привести структуру базы данных, системные и публичные файлы в соответствие с текущей версией ядра.

Если возникла необходимость скопировать файлы в обновлении самостоятельно, то нужно использовать:

$updater->CopyFiles("install/classes", "modules/quintura.search/classes");

В этом случае файлы из папки /install/classes, находящиеся в папке обновления, скопируются в папку /local/modules/quintura.search/classes.

При выпуске последующих обновлений может возникнуть потребность установить его зависимость от новых модулей. Ссылки на версии модулей, от которых зависит данное обновление, содержатся в файле version_control.txt. Но необходимо помнить, что само обновление с зависимостью не будет по умолчанию требовать установки указанных модулей. В этом случае возможны два варианта:

  1. Обновление всё равно устанавливать, проверять присутствие нужного модуля уже в функционале модуля.
  2. Добавить в код обновления проверку на нужный модуль, и при его отсутствии выводить ошибку пользователю. Обновление не будет установлено, если присвоить переменной $errorMessage строку сообщения.

Примечание: При создании архива с решением/обновлением через консольную утилиту tar в MacOS, нужно предварительно выставлять переменную окружения: export COPYFILE_DISABLE=true


Размещение модуля в партнерской системе обновлений

  Предварительные настройки

Чтобы выполнить установку модуля через партнерскую систему обновлений необходимо:

  • в карточке партнера указать Код партнера, который будет использоваться как код для собственных модулей, и Лицензионный ключ, который будет использоваться для тестирования альфа-версий обновлений, доступных только автору модуля по этому ключу.
  • собрать и загрузить на сервер компании "1С-Битрикс" дистрибутив модуля и обновления.
  • установить модуль (либо его обновление).

  Загрузка модуля

Для загрузки модуля выполните следующее:

  • Перейдите на страницу Ваши решения.
  • На странице перейдите по ссылке Добавить решение, и в открывшейся форме

    заполните следующие поля:
    • Код - в поле обязательно указывается полный код партнерского модуля в формате код_партнера.код_модуля. Часть код_партнера постоянна для партнера (задается в карточке партнера). Часть код_модуля вводится партнером при добавлении нового модуля. Эти коды должны быть алфавитно-цифровыми с первым алфавитным символом, и код неким образом должен соответствовать сути модуля. Например, для модуля можно задать код mycar. Тогда полный код будет alexey.mycar. Пример класса модуля, в котором этот код модуля используется, содержится в приложении.
    • Активность - при отмеченной опции модуль будет отображаться в списке модулей.
    • Бесплатное решение - при отмеченной опции модуль будут бесплатным, то есть доступным всем. При снятом флажке появятся дополнительные поля, в которых надо отобразить:
      • Наличие триального периода;
      • Срок действия триального периода;
      • Цену модуля.

        Примечание: Если необходимо сменить текущую цену, то, поменяв значение цены, вы фактически отправляете уведомление в Партнерский отдел «1C-Битрикс», который активирует новую цену.

      • Разрешить партнерские скидки. При установленной опции другим партнерам будет разрешено покупать ваш модуль со скидками соответствующими статусу партнера.
    • Логотип – с помощью кнопки Выберите файл укажите путь к изображению, которое будет отображаться в списке модулей. (В разных браузерах выглядит по разному.)
    • Редакции, с которыми работает решение (обязательный) – в списке выберите редакции для которых предназначено решение.
    • Решение включает в себя – в списке обязательно указываются сущности, которые имеются в модуле: Компоненты, Мастер создания, Модуль, Переводы или Шаблоны сайта.
    • Адаптивность – указывается поддерживает ли решение возможность работать на разных типах устройств.
    • Поддержка композита – устанавливается флажок, если решение поддерживает технологию Композитный сайт.
    • Совместимо с Сайты24 – содержит блоки или шаблоны для Сайтов24.
    • Совместимо с PHP8 – решение работает на актуальной версии языка, поддерживаемой платформой.
    • Категория – указывается категория, к которой относится решение. Если вам не хватает категорий, то вы можете написать в техподдержку компании «1С-Битрикс» с просьбой добавить необходимую категорию.
    • Архив с полной сборкой решения – сюда вы загружаете архив со своим решением.

      Примечание: система обновлений автоматически переводит языковые файлы из Win-1251 в UTF-8, если у клиента выбрана кодировка сайта UTF-8. Если разница в версиях только в кодировке языковых файлов, то размещать надо только Win-1251 версию. Если разница в коде, то рекомендуется вынести эту разницу в языковые файлы.

    • CRM-виджет Битрикс24 – скопируйте и вставьте URL из кода CRM-виджета в вашем Битрикс24, чтобы клиент мог бы вам написать прямо с витрины.
    • Описание решения на Русском языке – в данной секции задаются значения следующих полей:
      • Юридическое название продукта – юридически значимая часть лицензионного договора и сопутствующих бухгалтерских документов. Изменение названия происходит только через процедуру модерации.
      • Опциональное название лицензии – конкретная версия решения.
      • Маркетинговое название – оно выводится на витрине. Если не заполнено, то на витрине будет выводиться юридическое название.
      • Описание решения – описание решения;
      • Описание установки решения – описание установки решения;
      • Описание техподдержки и контактных данных – индивидуальные контактные данные для техподдержки решения. Если поле не заполнено, то пользователям будут показаны реквизиты из карточки партнера.
      • Ссылка на демо-версию – ссылка на сайт с демо-версией;
      • Пользовательское соглашение от разработчика – укажите собственный текст соглашения для клиентов, с которым он соглашается при установке. При пустом поле будет выводиться стандартное соглашение.
      • Видео – указывается путь к [dw]видеоролику[/dw][di]Ссылки в формате https://www.youtube.com/embed/NX6d6v3U6cA[/di].
      • Вебинары – ссылки на ваши вебинары по загружаемому решению.
      • Скриншоты – можно загрузить скриншоты решения. (5 скриншотов)
      • Счётчик Google Analytics – подключение счетчика в карточку своего решения, будут фиксироваться просмотры карточки.
      • Подключить Я.Метрику – можно подключить Яндекс.Метрика (Необходимо указание идентификатора.)
  • Сортировка среди своих модулей – значение, установленное в этом поле, определит порядок приложения в списке ваших приложений.
  • Сохраните внесенные изменения.

В результате модуль будет добавлен в список ваших персональных модулей.

  Загрузка обновлений

Для загрузки обновлений выполните следующее:

  • Перейдите на страницу Ваши решения.
  • Перейдите по ссылке Обновления в колонке действий. Откроется страница Версии решения:
  • Чтобы загрузить обновление воспользуйтесь ссылкой Загрузить новую версию. На странице Загрузка обновления для решения «название_решения» с помощью кнопки Выберите файл укажите путь к архиву с обновлением.
  • Нажмите кнопку Загрузить.
  • После загрузки архива на странице Обновления модуля «название_модуля» в поле Тип укажите тип обновления:
    • Альфа – альфа-версия обновления, доступная для загрузки только копии продукта с ключом, который указан в карточке партнера, предназначена для тестирования обновления;
    • Бета - бета-версия обновления, которая может быть установлена, если включена соответствующая опция в настройках Главного модуля;
    • Стабильное - окончательная стабильная версия обновления:
  • Нажмите кнопку Сохранить.

  Расшифровка ошибок

При загрузке модуля (или обновления) в Marketplace выдается сообщение: Неверное содержимое архива с обновлением. Возможные причины:

  • В файле /install/version.php не задана версия модуля;
  • В файле /install/index.php не указан $MODULE_ID;
  • В файле /install/index.php не указан PARTNER_NAME (Название партнера, разработчика модуля);
  • В файле /install/index.php не указан PARTNER_URI (Адрес партнера, разработчика модуля);
  • В файле /install/index.php не верно указано имя класса.

Размещение модуля в административном меню

Размещение собственного модуля в меню административного раздела осуществляется точно так же, как и размещение меню штатного модуля. Кроме того, можно использовать механизм Событий.

  Иконки

В качестве параметра иконки для страницы и пункта меню класс CSS.

"icon" => "mnu_my_module",
"page_icon" => "my_module",

Стили прописываются в файле /local/modules/my_module/install/themes/.default/my_module.css

Пример файла:
/*Menu icon*/
#fcmch_menu_icon {background-image:url(icons/my_module/mnu_my_module.gif);}
#fcmch_page_icon {background-image:url(icons/my_module/my_module.gif);}

Сами иконки необходимо загрузить в папку модуля /local/modules/my_module/install/themes/.default/icons/my_module/. При установке модуля содержимое папки /themes модуля должно быть скопировано в папку /local/themes/ и удалено оттуда при деинсталяции модуля.

  Кастомизация меню с помощью Событий

Вариант кастомизации административного меню - это создать свой обработчик события OnBuildGlobalMenu. Так можно вставить новые разделы, пункты или секции с подпунктами. Или изменить что угодно в уже сформированном меню. Обработчик можно прописать например в файл /local/php_interface/init.php.

Пример:
// DOC: http://dev.1c-bitrix.ru/api_help/main/events/onbuildglobalmenu.php
AddEventHandler("main", "OnBuildGlobalMenu", "DoBuildGlobalMenu");

function DoBuildGlobalMenu(&$aGlobalMenu, &$aModuleMenu) {

   // пример формирования меню можно подсмотреть: /bitrix/modules/[module]/admin/menu.php
   // системные варианты parent_menu: global_menu_desktop, global_menu_content, global_menu_services, 
   //global_menu_store, global_menu_statistics, global_menu_marketplace, global_menu_settings

   // это на случай добавления новых пунктов или секций с подпунктами
   $aModuleMenu[] = array(
      "parent_menu" => "global_menu_settings", 
      "icon" => "default_menu_icon",
      "page_icon" => "default_page_icon",
      "sort"=>"900",
      "text"=>"APC Opcode Cache",
      "title"=>"APC INFO",
      "url"=>"/local/admin/apc.php",
      "more_url"=>array(),
   );

   // а это на случай вклинивания в уже существующей секции
   foreach($aModuleMenu as $key => $menu) :

      // наверно достаточно идентифицировать только по $menu["items_id"]
      if ($menu["parent_menu"] == "global_menu_settings" && $menu["section"]=="TOOLS" && $menu["items_id"]=="menu_util") :
         // пункт добавится в конец списка существующих пунктов в секции
         $aModuleMenu[$key]["items"][] = array(
            "text" => "APC Opcode Cache",
            //"title" => "APC INFO",
            "url" => "/bitrix/admin/apc.php",
            "more_url" => array(),
         );
      endif;
      
   endforeach;


   /*
   // пример своего глобального раздела меню

   // нужен хотя бы один пункт в глобальном разделе, иначе раздел не появится
   $aModuleMenu[] = array(
      "parent_menu" => "global_menu_custom",
      "icon" => "default_menu_icon",
      "page_icon" => "default_page_icon",
      "sort"=>"100",
      "text"=>"Custom Item Text",
      "title"=>"Custom Item Tille",
      "url"=>"/bitrix/admin/custom_item.php",
      "more_url"=>array(),
   );

   // если нужно добавить глобальный раздел меню, то его можно отдать тут или заранее выше добавить в $aGlobalMenu
   $arRes = array(
      "global_menu_custom" => array(
         "menu_id" => "custom",
         "page_icon" => "services_title_icon",
         "index_icon" => "services_page_icon",
         "text" => "Custom text",
         "title" => "Custom title",
         "sort" => 900,
         "items_id" => "global_menu_custom",
         "help_section" => "custom",
         "items" => array()
      ),
   );

   return $arRes;
   */

} // function DoBuildGlobalMenu

  Сохранение настроек модуля

Код сохранения настроек модуля, передаваемый в запросе, должен располагаться перед кодом вывода формы полей настроек модуля. Иначе параметры модуля не выведутся сразу после сохранения. Пример, код:

<?//Save form
if($request->isPost() && $request["save"] && check_bitrix_sessid()){
    foreach($aTabs as $aTab){
        if(count($aTab['OPTIONS'])) {
            __AdmSettingsSaveOptions($module_id, $aTab["OPTIONS"]);
        }
    }
}?>

должен стоять перед выводом формы:

<!-- FORM TAB -->
<?php
$tabControl = new CAdminTabControl("tabControl", $aTabs);
?>
<? $tabControl->Begin(); ?>
<form method="post" action="<?=$APPLICATION->GetCurPage();?>?mid=<?=htmlspecialcharsbx($request["mid"]);?>&lang=<?=LANGUAGE_ID?>" name="<?=$module_id;?>">
    <? $tabControl->BeginNextTab(); ?>
        <?
        foreach ($aTabs as $aTab)
        {
            if(count($aTab['OPTIONS'])) {
                //$tabControl->BeginNextTab();
                __AdmSettingsDrawList($module_id, $aTab['OPTIONS']);
            }
        }
        ?>

    <? $tabControl->BeginNextTab(); ?>

        <?require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/admin/group_rights.php");?>

    <? $tabControl->Buttons(array('btnApply' => false, 'btnCancel' => false, 'btnSaveAndAdd' => false)); ?>

    <?=bitrix_sessid_post(); ?>
</form>
<? $tabControl->End(); ?>
<!-- X FORM TAB --> 

Решения типовых сайтов

Кроме модулей в Marketplace возможна реализация решений типовых сайтов партнеров.

  Мастер установки

Примерный порядок создания мастера установки решения:

  • Создайте папку мастера, и его базовые файлы с папками. Они почти одинаковые для каждого мастера, можно взять готовые и внести в них.
  • Скопируйте файлы публички в папку /public, шаблоны в папку /templates. Основная логика установки должна быть описана в файле services/.services.php. Массив $arServices содержит описание последовательности запуска файлов из соответствующих подкаталогов services.

На сами файлы никаких ограничений нет, можно, например, создать файл events.php для установки почтовых событий и написать в нем вызов API для их создания в случае, если они уже не были созданы.

В качестве примера можно рассмотреть уже готовые мастера установки решений, имеющиеся в дистрибутивах продуктов на Bitrix Framework. Например: Мастер создания интернет-магазина в «1C-Битрикс: Управление сайтом», расположенный в папке: /bitrix/wizards/bitrix/eshop.

  Особенности

Особенности, которые необходимо учитывать:

В публичной части инсталлятора файл index.php должен именоваться как _index.php - иначе будет ошибка при инсталляции. Такого именования достаточно, что бы мастер автоматом в конце установки заменил текущий index.php на ваш.

Все файлы с кодировкозависимыми символами должны располагаться внутри папки ~/lang/[ru|en]/ и должны быть созданы в языковых сообщениях, когда это требуется. Система обновлений для партнерских модулей перекодирует все файлы, путь к которым содержит /lang/. Например, для файла ./portal/site/services/.services.php путь должен быть таким: ./portal/lang/[ru|en]/site/services/.services.php. Для установщика сервиса (подключается автоматически) ./portal/site/services/папка_сервиса/установщик.php путь такой: ./portal/site/services/папка_сервиса/lang/[ru|en]/установщик.php.

  Переустановка сайта

При создании мастера важно также учитывать момент "переустановки сайта", когда пользователь будет запускать мастер повторно. Нужно разложить все сущности на те, которые следует переустановить (шаблоны, например) и те, которые следует сохранить (включаемые области, инфоблоки и т.д.)

В установочных скриптах необходимо проверять на существование создаваемую сущность. Если сущность уже установлена – пропускать установку. В установочных файлах можно делать return. Пример:

<?
if (!CModule::IncludeModule("iblock"))
return;
$typeResult = CIBlockType::GetByID("news");
if ($typeResult->Fetch()) //Установлен тип Новости? Пропускаем установку
return;
//Создание типа инфоблока
?>

  Инфоблоки, блоги и прочее

Чтобы прописать ID инфоблоков в файлы публичной части, надо запускать после копирования файлов публички и установки инфоблока метод CWizardUtil::ReplaceMacros, где первый параметр - это путь к файлу, а второй - массив подстановок, например, чтобы заменить #NEWS_IBLOCK_ID# на число, нужно сделать так:

CWizardUtil::ReplaceMacros(WIZARD_SITE_PATH."/news/index.php", array("NEWS_IBLOCK_ID" => $iblockID));

Пример вывода настроек инфоблока:

$iblockID = 2;
$result = CUserOptions::GetOption("form", "form_element_".$iblockID); var_export($result); 
echo "<br><br>"; 
CModule::IncludeModule("iblock");
 $arFields = CIBlock::getarraybyid($iblockID);
 foreach ($arFields["FIELDS"] as $id => $arField) unset($arFields["FIELDS"][$id]["NAME"]); var_export($arFields["FIELDS"]); 

  Многосайтовость

При создании решения, если он должен быть установлен в директорию первого сайта (многосайтовость на одном домене), то ссылки должны учитывать директорию (поле SITE_DIR в настройках сайта).

  Включаемые области

Файлы с включаемыми областями, которые подключаются в шаблоне и хранятся в папке с шаблоном сайта (/local/templates/имя_шаблона/includes/), при установке сайта мастером, не перекодируются в UTF-8. Правильно будет разместить файлы с шаблонами включаемых областей в папке /includes/ в корне.

Примечание: Включаемые области в мастере могут отсутствовать вообще, а значения по умолчанию для них хранятся в LANG файле, соответственно, перекодируются и заносятся в форму настроек решения (или берутся из областей, если решение уже было установлено раньше и файлы областей существуют в папке целевого сайта). При установке файлы включаемых областей создаются мастером на основе данных из формы настроек решения.

  Другие моменты

  • Чтобы мастер установки решения запускался сразу из Marketplace, после загрузки модуля, необходимо чтобы он лежал по адресу: /local/modules/модуль/install/wizards/партнер/мастер/.
  • Во всех исполняемых файлах, не находящихся в публичной части, первая строка должна выглядеть так:
    if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
  • В установочных файлах можно пользоваться глобальными объектами $DB, $DBType, $APPLICATION, $USER;
  • Пользователь, запускающий мастер, будет авторизован как администратор (ID=1).
Некоторые константы
WIZARD_SITE_ID идентификатор сайта
WIZARD_TEMPLATE_ID идентификатор выбранного шаблона
WIZARD_TEMPLATE_RELATIVE_PATH путь к выбранному шаблону в мастере относительно корня сайта
WIZARD_TEMPLATE_ABSOLUTE_PATH полный путь к выбранному шаблону в мастере
WIZARD_THEME_ID идентификатор выбранной темы
WIZARD_THEME_RELATIVE_PATH путь к выбранной цветовой схеме в мастере относительно корня сайта
WIZARD_THEME_ABSOLUTE_PATH полный путь к выбранной цветовой схеме в мастере
WIZARD_ABSOLUTE_PATH полный путь к мастеру
WIZARD_RELATIVE_PATH путь к мастеру относительно корня сайта
WIZARD_SERVICE_ABSOLUTE_PATH полный путь к директории, где находится установщик сервиса
WIZARD_SERVICE_RELATIVE_PATH путь к директории установщика сервиса относительно корня сайта
WIZARD_SITE_PATH абсолютный путь к корню сайта
WIZARD_REINSTALL_DATA путь к мастеру удаления демо-данных


Установка модуля

Внимание! Установить модуль и активировать купон можно только на активную лицензию.

  Бесплатный модуль

Для его установки необходимо выполнить следующее:

  • В кабинете партнера в списке решений выбрать нужный модуль.
  • На вкладке Тестирование нажать кнопку Установить и указать во всплывающем окошке адрес сайта, на который будет установлен модуль:
  • Нажмите на рисунок, чтобы увеличить

  • После этого в новой вкладке браузера откроется страница вида http://адрес_сайта/bitrix/admin/update_system_partner.php?addmodule=код_партнера.код_модуля и будет произведена установка модуля..

Этот вариант также подходит и для установки платного модуля в демо-режиме.

  Платный модуль

Для установки платного модуля вы можете использовать 2 варианта:

  1. Через активацию купона.
    • На вкладке Тестирование в карточке решения выписать купон указав ФИО, e-mail (на него будет отправлен купон с подробной инструкцией, если проставлена соответствующая галочка), решение, на которое выписывается купон.

      Использовать опцию Продление при первой установке не нужно. Для уведомления клиента установите флажок в Отправить купон покупателю.

    • Клиенту в административной панели сайта в разделе Marketplace > Обновление решений на вкладке Активация купона ввести купон в специальном поле. Нажать Установить и следовать инструкциям.

  2. Через привязку лицензионного ключа
    • Клиенту в административном разделе сайта в раздел Marketplace > Обновление решений и скопировать код лицензионного ключа.

    • В карточке модуля в разделе Клиенты (http://partners.1c-bitrix.ru/personal/modules/clients.php?ID=<код_модуля>) добавьте клиента и укажите его код лицензионного ключа в соответствующем поле. Остальные поля необязательны для заполнения: информация добавится автоматически после установки модуля.
    • После этого в административном разделе на сайте клиента в разделе Обновление решений появится модуль, готовый к загрузке и установке.

  Установка решения и обновлений

Установка стороннего решения и получение обновлений по нему описана в курсе Установка и настройка


Частые ошибки

Цитатник веб-разработчиков.

Максим Месилов: Всегда проверяйте свои разработки на последних стабильных версиях PHP.

Ошибки при создании модулей

Не запускается мастер после установки продукта

Проблема: После установки продукта не происходит запуск мастера.

Решение: Проверить наличие строк в файле .description.php в корне мастера (файл с описанием модуля):

10     "START_TYPE" => "WINDOW",
11     "WIZARD_TYPE" => "INSTALL",

В состав модуля не добавляется файл с указанием версии

Примерное содержание файла /install/version.php:

<?
$arModuleVersion = array(
    "VERSION" => "11.0.4",
    "VERSION_DATE" => "2011-11-17 14:00:00"
);
?>

Пример класса для модуля

Пример класса для модуля alexey.mycar

Class alexey_mycar extends CModule
{
	var $MODULE_ID = "alexey.mycar";
	var $MODULE_VERSION;
	var $MODULE_VERSION_DATE;
	var $MODULE_NAME;
	var $MODULE_DESCRIPTION;
	var $MODULE_CSS;
	var $MODULE_GROUP_RIGHTS = "Y";

	function __construct()
	{
		$arModuleVersion = array();

		$path = str_replace("\\", "/", __FILE__);
		$path = substr($path, 0, strlen($path) - strlen("/index.php"));
		include($path."/version.php");

		$this->MODULE_VERSION = $arModuleVersion["VERSION"];
		$this->MODULE_VERSION_DATE = $arModuleVersion["VERSION_DATE"];
		$this->PARTNER_NAME = "Partner name";
		$this->PARTNER_URI = "http://www.1c-bitrix.ru/";

		$this->MODULE_NAME = GetMessage("MYCAR_MODULE_NAME");
		$this->MODULE_DESCRIPTION = GetMessage("MYCAR_MODULE_DESCRIPTION");
	}

	function InstallDB()
	{
		RegisterModule("alexey.mycar");
		//RegisterModuleDependences("search", "OnReindex", "alexey.mycar", "CMyCarSearch", "OnSearchReindex");
		return true;
	}

	function UnInstallDB()
	{
		//UnRegisterModuleDependences("search", "OnReindex", "alexey.mycar", "CMyCarSearch", "OnSearchReindex");
		UnRegisterModule("alexey.mycar");
		return true;
	}

	function InstallEvents()
	{
		return true;
	}

	function UnInstallEvents()
	{
		return true;
	}

	function InstallFiles()
	{
		CopyDirFiles(
			$_SERVER["DOCUMENT_ROOT"]."/local/modules/alexey.mycar/install/components/",
			$_SERVER["DOCUMENT_ROOT"]."/alexey/components",
			true, true
		);

		CopyDirFiles(
			$_SERVER["DOCUMENT_ROOT"]."/local/modules/alexey.mycar/install/admin/",
			$_SERVER["DOCUMENT_ROOT"]."/local/admin",
			true, true
		);
		CopyDirFiles(
			$_SERVER["DOCUMENT_ROOT"]."/local/modules/alexey.mycar/install/themes", 
			$_SERVER["DOCUMENT_ROOT"]."/local/themes", true, true
		);
		return true;
	}

	function UnInstallFiles()
	{
		DeleteDirFiles($_SERVER["DOCUMENT_ROOT"]."/local/modules/alexey.mycar/install/admin", $_SERVER["DOCUMENT_ROOT"]."/bitrix/admin");
		DeleteDirFiles($_SERVER["DOCUMENT_ROOT"]."/local/modules/alexey.mycar/install/themes/.default/",
                       $_SERVER["DOCUMENT_ROOT"]."/local/themes/.default");//css
		DeleteDirFilesEx("/local/themes/.default/icons/alexey.mycar/");//icons

		return true;
	}

	function DoInstall()
	{
		global $APPLICATION;

		if (!IsModuleInstalled("alexey.mycar"))
		{
			$this->InstallDB();
			$this->InstallEvents();
			$this->InstallFiles();
		}
	}

	function DoUninstall()
	{
		$this->UnInstallDB();
		$this->UnInstallEvents();
		$this->UnInstallFiles();
	}
}

Примечание: При описании модуля нужно наследоваться именно от CModule, потому что при добавлении ведущего слеша с CModule загрузка не пройдет по маске.

Пример создания модуля

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

Визуально модули в Bitrix Framework для пользователя представляют собой лишь список на странице, где можно инсталлировать или деинсталлировать модуль в системе.

Поставим себе задачу сделать модуль, который бы просто при инсталляции ставил компонент. Возьмем компонент, который выводит текущую дату и время. Мы создали его в одном из предыдущих уроков. Имя компонента было dv:date.current.

Начнем с определения тех файлов и папок, которые нам нужно создать. Очевидно, что нам не нужно инсталлировать картинки, шаблоны, для решения нашей задачи не нужны административные скрипты и скрипты, которые вызывают административные, также не нужны.

Таким образом, структура модуля будет такой:

  • /install/
    • /components/
      • /dv/
        • /date.current/
          • /templates/
            • /.default/
              • template.php
          • component.php
          • .description.php
          • .parameters.php
    • index.php
    • step.php
    • unstep.php
    • version.php

Вся эта структура должна располагаться в папке /local/modules/dv_module, таким образом dv_module будет являться папкой создаваемого модуля.

Основной файл, код которого отвечает собственно за инсталляцию/деинсталляцию модуля — это /install/index.php. Код его приведен ниже:

<?

Class dv_module extends CModule
{
var $MODULE_ID = "dv_module";
var $MODULE_VERSION;
var $MODULE_VERSION_DATE;
var $MODULE_NAME;
var $MODULE_DESCRIPTION;
var $MODULE_CSS;

function __construct()
{
$arModuleVersion = array();

$path = str_replace("\\", "/", __FILE__);
$path = substr($path, 0, strlen($path) - strlen("/index.php"));
include($path."/version.php");

if (is_array($arModuleVersion) && array_key_exists("VERSION", $arModuleVersion))
{
$this->MODULE_VERSION = $arModuleVersion["VERSION"];
$this->MODULE_VERSION_DATE = $arModuleVersion["VERSION_DATE"];
}

$this->MODULE_NAME = "dv_module – модуль с компонентом";
$this->MODULE_DESCRIPTION = "После установки вы сможете пользоваться компонентом dv:date.current";
}

function InstallFiles()
{
CopyDirFiles($_SERVER["DOCUMENT_ROOT"]."/local/modules/dv_module/install/components",
             $_SERVER["DOCUMENT_ROOT"]."/bitrix/components", true, true);
return true;
}

function UnInstallFiles()
{
DeleteDirFilesEx("/local/components/dv");
return true;
}

function DoInstall()
{
global $DOCUMENT_ROOT, $APPLICATION;
$this->InstallFiles();
RegisterModule("dv_module");
$APPLICATION->IncludeAdminFile("Установка модуля dv_module", $DOCUMENT_ROOT."/local/modules/dv_module/install/step.php");
}

function DoUninstall()
{
global $DOCUMENT_ROOT, $APPLICATION;
$this->UnInstallFiles();
UnRegisterModule("dv_module");
$APPLICATION->IncludeAdminFile("Деинсталляция модуля dv_module", $DOCUMENT_ROOT."/local/modules/dv_module/install/unstep.php");
}
}
?>

В этом файле декларируется новый класс — класс нашего модуля dv_module как потомок CModule. Далее идет определение конструктора dv_module(), в которой происходит определение переменных для вывода информации о модуле в списке модулей Bitrix Framework.

Метод DoInstall() вызывается при установке модуля из Панели управления, метод DoUninstall(), соответственно, при деинсталляции модуля. В методах этого класса вызываются так или иначе файлы /install/step.php, /install/unstep.php и /install/version.php. Первые два файла — это файлы, которые показываются при установке и деинсталляции модуля, соответственно. Вспомогательный файл version.php содержит информацию о версии модуля. Коды файлов:

  • /install/step.php
    <?if(!check_bitrix_sessid()) return;?>
    <?
    echo CAdminMessage::ShowNote("Модуль dv_module установлен");
    ?>
  • /install/unstep.php
    <?if(!check_bitrix_sessid()) return;?>
    <?
    echo CAdminMessage::ShowNote("Модуль успешно удален из системы");
    ?>
  • /install/version.php
    <?
    $arModuleVersion = array(
    "VERSION" => "1.0.0",
    "VERSION_DATE" => "2010-06-03 17:00:00");
    ?>
Совет от Коваленко Алексея: Если вы осуществляете в модулях какие то операции с обработкой данных или действия, на которые готовы доверить "допуск" к корректировке данных, заложите свои события в системе. И те специалисты, которые будут внедрять ваши решения будут вам за это благодарны.

Сборка обновлений собственного модуля

Введение

Предлагаемый вашему вниманию скрипт является больше примером для оптимизации разработки и экономии времени, чем готовым решением. Скрипт разработан сотрудниками ТП "1С-Битрикс" для облегчения рутинных операций по сборке обновлений модулей.

Примечание: Предлагаемый вариант не единственный, но он обладает большими возможностями в плане "тонкой" настройки сборки обновлений. Если не нужна избыточная гибкость в настройках, то лучше воспользоваться более удобным методом сборки обновлений.

Скачать скрипт.

Предположим, что вы уже создали свой модуль и выложили в Marketplace. Теперь у вас стоит задача совершенствовать его и выкладывать обновления.

Возможно для кого-то это покажется простой и интересной задачей, но для других она кажется рутинной и постоянно бегать по директориям в поисках нужного файла и так пофайлово собирать обновления довольно утомительно.

  Настройки

Код модуля:

$arSettings["MODULE_ID"] = 'mail';

Директория относительно корня сайта куда будут складываться обновления:

$arSettings["U_PATH"] = '/iupdate/';

Массив директорий содержимое которого будет прочитано, но глубже чтение не будет проводиться:

$arSettings["DIR_READ_NOFOLLOW"] = array(
    $arSettings["MODULE_PATH"].'lang/',
);

Массив директорий, имя которых будет добавлено, но не будет произведено чтение их содержимого:

$arSettings["DIR_NOFOLLOW"] = array(
    $arSettings["MODULE_PATH"].'install/db/',
    $arSettings["MODULE_PATH"].'install/images/',
    $arSettings["MODULE_PATH"].'install/themes/',
);

Массив директорий, которые будут пропущены при чтении (построении списка):

$arSettings["DIR_SKIP"] = array();

Массив игнорируемых имен:

$arSettings["FILE_NAME_SKIP"] = array(
    '.',
    '..',
    '.hg',
    '.hgignore',
    '.svn',
    '.csv',
);

Массив игнорируемых файлов:

$arSettings["FILE_SKIP"] = array(
    $arSettings["MODULE_PATH"].'install/version.php',
    $arSettings["MODULE_PATH"].'version_control.txt',
);

Массив для updater.php, при наличии необходимых директорий на основании этих данных будет построен файл обновления:

$arSettings["UPDATER_COPY"] = array(
    "install/js" => "js/main/core",
    "install/components" => "components",
);

  Что же скрипт умеет?

  • Собирать обновления с необходимым набором файлов;
  • Создавать файл описания на основании введенного текста;
  • Создавать файл version.php с номером версии указанной в поле ввода и время создания обновления;
  • Создание updater.php на основании файлов обновления и настроек
  • Создание архива собранного обновления


Дополнительно

  Уведомления

Начиная с версии ядра 11.5.6 в Bitrix Framework появляется возможность уведомлять администраторов о важных действиях, например что необходимо произвести конвертацию данных. Администратор увидит стикер под панелью инструментов, как в административном интерфейсе, так и в публичной части. Если одновременно должно вывестись несколько уведомлений, то они выведутся одно над другим.

Уведомления есть двух типов: первые администратор может закрыть, вторые уйдут только после выполнения действия (например полной конвертации).

Для использования этой возможности в собственных модулях используйте методы класса CAdminNotify.

Начиная с версии 12.0.0 класс CAdminNotify дает возможность создавать уведомления, зависящие от языка. Т.е. чтобы текст сообщения менялся при переключении языка. Для использования этой возможности при вызове CAdminNotify::Add добавьте ключ LANG.

  Пример

$arFields = array(
   'MODULE_ID' => 'catalog',
   'TAG' => 'VWS',
   'MESSAGE' => '123 ENGLISH 123',
   'LANG' => array(
      'ru' => 'Русский',
      'de' => 'Deutsch'
   )
);

$intID = CAdminNotify::Add($arFields);

Для русского и немецкого языков будут показано соответственно Русский и Deutsch. Для всех остальных языков будет показано сообщение 123 ENGLISH 123.

Основное применение - создание сообщений из обновлений, когда заранее неизвестно какой язык может потребоваться.


Подсказки пользователям

  Подсказки пользователям в интерфейсе

С версии модуля Библиотека интерфейсов (UI) 17.6.3 рекомендуется использовать js-расширение ui.hint, показывающее всплывающие подсказки пользователям на странице.

Подключение на PHP-странице:

\Bitrix\Main\UI\Extension::load("ui.hint");

  Как использовать библиотеку

В html-коде достаточно указать у элемента атрибут data-hint c текстом:

<span data-hint="Моя первая подсказка"></span>

В js-коде необходимо инициализировать подсказку. Будут созданы подсказки для всех дочерних элементов контейнера:

BX.UI.Hint.init(BX('container'));

Пример:

<?
\Bitrix\Main\UI\Extension::load("ui.hint");
?>

<script type="text/javascript">
    BX.ready(function() {
        BX.UI.Hint.init(BX('my-container'));
    })
</script>

<div id="my-container">
   <div>
        Подсказка 1  
        <span data-hint="<?=Loc::getMessage('MY_HINT_1')?>"></span>
    </div>

    <div>
        Подсказка 2 
        <span data-hint="<?=Loc::getMessage('MY_HINT_2')?>"></span>
    </div>
</div>

  Использование в JavaScript

При формировании верстки в js, можно получить элемент для вставки из текста:

containerElement.appendChild(
    BX.UI.Hint.createNode("Моя вторая подсказка.")
);


Тестирование разработчиком решений для Marketplace

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

Ниже даны необходимые требования, типичные ошибки и основные пункты тестирования разработчиком своего решения перед подачей на публикацию в Marketplace.

Совет: Рекомендуется перед началом тестирования изменить параметр главного модуля Режим вывода ошибок (error_reporting) с Только ошибки (вариант по умолчанию, в том числе при установке пробной версии) на Ошибки и предупреждения. (Закладка Настройки, группа Системные настройки.)


  • Решение должно корректно устанавливаться на все поддерживаемые решением редакции продуктов «1С-Битрикс».
  • При тестировании должно быть как минимум 2 установки: CP-1251 и на UTF-8, все страницы - публичные и административные - должны иметь текст в корректной читаемой кодировке.
  • Если это типовой сайт - необходимо тестировать также 2 типа установки решения: установка из административной части вызовом мастера установки, а также установка из публичной части по кнопке Протестировать новое решение.

    Это очень распространенная ошибка, когда один из мастеров работает с ошибками, или не работает вообще:

  • Обязательная установка типового сайта вторым сайтом. Очень часто типовой сайт затирает первый, либо появляются ошибки компонентов, или путаются инфоблоки.
  • Если это какой-либо Интернет-Магазин, то решение должно содержать присущие интернет-магазину основные функции:
    • работа с ценами;
    • работа с каталогом товаров;
    • возможность настройки каталога товаров;
    • возможность работы с SKU;
    • оформление заказа;
    • работа с корзиной;
    • отсылка уведомление на почту клиентам и администраторам магазина.
  • Необходимо следить, чтобы не появлялись лишние пункты в меню Настройки (также очень частая ошибка):

  • Несоответствие названия в карточке решения названию в административном разделе после установки, или вместо названия в списке установленных выводится код:
  • Решение не должно нарушать имеющийся функционал продуктов «1С-Битрикс» и сайты, установленные по первому и второму способу многосайтовости.
  • Решение при установке не должно удалять или изменять имеющиеся пользовательские данные без ведома администратора сайта.
  • Решение должно корректно работать на поддерживаемых продуктами «1С-Битрикс» базах MySQL.
  • Все публичные страницы и диалоговые окна должны корректно отображать верстку во всех поддерживаемых браузерах или мобильных устройствах (если есть их поддержка).
  • Не должно быть страниц с ошибкой 404 not found.
  • Не должно быть отсутствующих картинок.
  • Желательно включить в решение демо-данные.
  • Картинки в демо-данных (если такие есть) должны быть небольшого размера, до 100 Кбайт.
  • Не должно быть JavaScript ошибок на всех страницах решения, а также во всем новом функционале решения.
  • Не должно быть ошибок базы данных, warning-сообщений, синтаксических ошибок на всех страницах решения.
  • Все шаблоны всех компонентов должны присутствовать (не должно быть ошибок на страницах типа can not find.*template with page).
  • Все необходимые компоненты должны присутствовать на страницах (не должно быть ошибок типа someComponent is not a component).

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

Конструктор модулей для Marketplace

Mpbuilder - модуль для создания простого модуля из любого скрипта или компонентов с целью дальнейшей публикации в каталоге решений Marketplace. Автоматически конвертирует файлы в нужную кодировку, извлекает языковые фразы и собирает обновления.

Скачать и установить Конструктор модулей для Marketplace можно с сайта или в Административной части сайта (Marketplace > Каталог решений).

Работа с конструктором

Модуль Mpbuilder позволяет начинать разработку модуля как «с нуля», так и выпускать обновление уже готового модуля для Marketplace.

  Шаг 1. Создание модуля из скрипта

На первом шаге заполняются необходимые информация:

  • Заполняются группы полей данные о разработчике и данные о новом модуле;

    Внимание! Код партнера должен строго соответствовать тому, что выводится в карточке партнера. Код модуля заполняется латиницей. Название и описание будут выводиться в списке модулей. Все это подробно описано в документации для разработчиков.

  • Опция Переписать существующие файлы означает, что необходимо перезаписать информацию, если такой модуль уже установлен в системе;
  • При необходимости в группе настроек Компоненты модуля выбираются компоненты для включения в дистрибутив создаваемого модуля, т.е они должны быть установлены на текущей установке в папке /bitrix/components/. Эти компоненты будут скопированы в папку /install/ нового модуля. При установке автоматически скопируются из этой папки в /bitrix/components/, и соответственно удалятся при деинсталляции.

    Внимание! Все пользовательские компоненты должны находиться в папке /bitrix/components/. Системные компоненты находятся в папке /bitrix/components/bitrix/, содержимое которой обновляется системой обновлений и не должно изменяться пользователями. Об это подробно описано в документации по созданию компонентов 2.0.

  • Если у модуля имеются административные страницы, то с помощью кнопки Обзор... можно их включить в дистрибутив, они попадут в папку /admin/ нового модуля. При установке будут созданы ссылки на эти страницы в папке /bitrix/admin/. Кроме того, они появятся в основном административном меню.
  • Для перехода к следующему шагу служит кнопка Продолжить, после нажатия которой модуль появится в списке решений, и можно продолжать его разработку уже в ядре:

  Шаг 2. Выделение языковых фраз

На данном шаге происходит:

  • Сканирование всех php-файлов модуля, если в коде нового модуля имеются кириллические символы, то выводится список этих страниц.

    Система автоматически определяет кодировку utf8 или cp1251. В дальнейшем скрипты будут автоматически перекодированы в кодировку сайта (а перед архивацией - в cp1251, как требует документация).

  • Языковые фразы сохраняются в соответствующий lang-файл, а вместо фраз в код страниц модуля вставляется вызов GetMessage. В качестве ключа используется транслитерация исходной фразы - это позволяет в автоматическом режиме создавать понятные ключи:

    Будьте осторожны! В процессе такой работы исходный файл переписывается. При разборе учитывается html, php, js, css, \.

  • Языковой файл создается автоматически:

    • Если файл был редактирован, то новые фразы дописываются в конец.
    • Если фразы были в исходном файле (или ранее по коду), то они используются повторно.
    • Если ключи совпадают, в конце дописывается цифра.
    • Для скриптов папки /admin/ в самое начало скрипта дописывается код подключения ядра, если не был найден. Это необходимо для работы языковых функций.

    Таким образом, скрипт можно постоянно дорабатывать и применять выделение фраз повторно.

Примечание: Шаги 2-4 можно повторять сколько угодно раз в процессе разработки и обновления модулей.

  Шаг 3. Создание архива

На данном шаге:

  • Все скрипты модуля будут сконвертированы в кодировку cp1251, затем будет создан архив .last_version.tar.gz в папке /bitrix/tmp/<название.модуля>/:

    Здесь можно изменить версию модуля в одноименном поле.

  • Далее файл .last_version.tar.gz необходимо загрузить в карточке партнера Marketplace.
  • После пробуем установить себе созданный модуль и дожидаемся, когда решение будет отмодерировано.

Примечание: Шаги 2-4 можно повторять сколько угодно раз в процессе разработки и обновления модулей.

  Шаг 4. Сборка обновления

Данный шаг автоматизирует сборку обновлений любого модуля: все файлы модуля, измененные после даты, которая хранится в install/version.php, попадают в архив обновления. Также сборка обновлений проверяет дату изменения файлов в установленных компонентах, копирует их в папку модуля, затем помещает в архив с обновлением. В обновлении лежит файл updater.php, который обновляет компоненты на сайтах клиентов. Перекодировка файлов из cp1251 в utf8 и обратно происходит автоматически.

  • Если включить опцию Обновить дату и версию в ядре модуля, то исходный файл модуля будет переписан и следующие обновления будут собираться от текущей версии.
  • В поле Описание обновления добавляется текстовая информация по изменениям в обновлении.
  • В поле Скрипт обновления updater.php добавляется сам пользовательский скрипт обновления. По умолчанию в этом поле дан пример скрипта.
  • После нажатия кнопки Продолжить будет создан архив с обновлением /bitrix/tmp/<модуль>/<версия_модуля>.tar.gz, который необходимо будет загрузить в карточке партнера Marketplace.

Примечание: Шаги 2-4 можно повторять сколько угодно раз в процессе разработки и обновления модулей.


Сборка обновлений модуля

  Пример

У Конструктора модулей (bitrix.mpbuilder) для Marketplace есть возможность собирать обновления для своих модулей. При этом не важно, созданы они были при помощи Конструктора или "руками".

Например, имеем некий модуль, который предоставляет компоненты.

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

Выделенный серым фрагмент кода был добавлен. Обратите внимание, что слово Да уже присутствовало ранее в языковом файле.

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

  Выделение языковых фраз

Для этого открываем Шаг 2 "Выделение языковых фраз" и выбираем свой модуль в списке. Он показывает список файлов (за пределами /lang), которые содержат кириллические символы.

Нажмите Продолжить. Теперь языковые фразы оказались в языковом файле шаблона. Старые фразы были использованы, а новые дописаны в конец.

Примечание: Ваши компоненты могут лежать или непосредственно в /intall/components, или в /install/components/<мое пространство имен>. Поиск языкового файла идет автоматически на основе стандартной структуры компонента 2.0 (комплексные компоненты также поддерживаются).

  Сборка обновления

Перейдите к Шагу 4 через меню (третий шаг сборки архива модуля пропустите). Он использует дату и версию модуля из файла /install/version.php для сборки обновления.

Если включить соответствующую опцию Версия обновления, эти данные будут обновлены автоматически.

Если были изменены уже установленные компоненты модуля в /bitrix/components, на этом этапе можно автоматически скопировать изменения в модуль. Тут есть два варианта:

  • если компоненты модуля лежат без указания пространства имен (как в моем примере), то надо указать пространство имен для синхронизации изменений (оно же подставится в код updater.php).
  • в противном случае ничего указывать не надо (например, /install/components/bestpartner/news.line).

Обратите внимание, если разработка компонентов велась в публичной части, а языковые фразы не выделены, то порядок немного другой. Надо сначала перейти на шаг 4, собрать обновление без изменения файла version.php, а потом выделить языковые фразы на шаге 2. И уже после этого вернуться на шаг 4 для окончательной сборки обновления. Если что-то пошло не так, руками измените дату и версию модуля в файле /install/version.php.


Создание типовых решений

В настоящее время можно выделить два направления в разработке типовых решений:

  • Разработка самостоятельного, независимого решения.
  • Разработка решения для Bitrix Marketplace.

Решение для Bitrix Marketplace представляет собой модуль со встроенным в него мастером создания сайта. Установка решения происходит через систему Bitrix Marketplace. Соответственно, оно может устанавливаться как в качестве первого сайта, так и в качестве дополнительного к уже имеющемуся, что накладывает определенные ограничения.

Итогом разработки самостоятельного решения должен быть полный дистрибутив, включающий себя требуемую по ТЗ/концепции редакцию CMS, модуль и мастер создания сайта. Модуль является хоть и не обязательной, но крайне желательной частью решения, так как он позволит в будущем выпускать обновления через систему Site Update. Мастер создания сайта устанавливается по умолчанию сразу после шага создания администратора.

Такое решение выпускается как отдельный продукт, в качестве примера можно назвать решения для государственных организаций и здравоохранения, представленные в разделе Готовые решения «1С-Битрикс».

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

Создание мастера создания сайта

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

Существует 2 модели поведения мастера:

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

Мастер может содержать следующий набор шагов:

  • Приветствие - первый шаг мастера;
  • Лицензионное соглашение - выводит текст лицензионного соглашения и обязует пользователя с ним согласиться; данный шаг определяется файлом license.php;
  • Выбор типа сайта - предлагает выбрать один тип сайта из списка, определяется файлом .sites.php;
  • Выбор группы шаблонов; - предлагает выбрать одну группу шаблонов сайта из списка, определяется файлом .templates.php;
  • Выбор шаблона сайта - предлагает выбрать один шаблон сайта из списка, определяется файлом .templates.php и директорией /templates, находящейся в папке мастера;
  • Выбор сервисов - предлагает выбрать устанавливаемые на сайт сервисы, определяется файлом .services.php;
  • Готовность к установке - промежуточный шаг между шагами выбора и шагами установки, суммирует все данные, установленные пользователем в шагах выбора;
  • Установка сайта - выполняет копирование файлов, зависящих от выбранного типа сайта;
  • Установка шаблона - копирует выбранный шаблон в директорию /bitrix/templates/, регистрирует его в системе как шаблон по умолчанию для сайта по умолчанию, копирует дополнительные файлы, зависящие от выбранного шаблона;
  • Установка сервисов - копирует файлы выбранных сервисов;
  • Установка завершена является конечным шагом мастера;
  • Установка прервана является конечным шагом мастера, переход на этот шаг осуществляется по нажатию кнопки "Отмена" в шагах выбора.

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

Список ссылок по теме:

Файлы описания

Всего можно выделить четыре типа файлов описания:

  • .description.php — файл описания мастера создания сайта;
  • .templates.php — файл описания шаблонов сайта;
  • .services.php — файл описания сервисов сайта;
  • .sites.php — файл описания типов сайта.

Файл .description.php содержит название, описание, а также ряд других характеристик мастера. Этот файл должен всегда присутствовать в папке мастера.

Языковой файл подключается автоматически (должен лежать в папке /lang/ID языка/.description.php относительно папки мастера).

Пример файла описания стандартного мастера demo_personal (bitrix.sitepersonal):

<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
if(!defined("WIZARD_DEFAULT_SITE_ID") && !empty($_REQUEST["wizardSiteID"])) 
	define("WIZARD_DEFAULT_SITE_ID", $_REQUEST["wizardSiteID"]); 

$arWizardDescription = Array(
	"NAME" => GetMessage("PORTAL_WIZARD_NAME"), 
	"DESCRIPTION" => GetMessage("PORTAL_WIZARD_DESC"), 
	"VERSION" => "1.0.0",
	"START_TYPE" => "WINDOW",
	"WIZARD_TYPE" => "INSTALL",
	"IMAGE" => "/images/".LANGUAGE_ID."/solution.png",
	"PARENT" => "wizard_sol",
	"TEMPLATES" => Array(
		Array("SCRIPT" => "wizard_sol")
	),
	"STEPS" => (defined("WIZARD_DEFAULT_SITE_ID") ? 
		Array( "SelectTemplateStep", "SelectThemeStep", "SiteSettingsStep", "DataInstallStep" , "FinishStep" ) : 
		Array("SelectSiteStep", "SelectTemplateStep", "SelectThemeStep", "SiteSettingsStep", "DataInstallStep" , "FinishStep"))
);
?>

Если мастер создания сайта содержит файл wizard.php, то необходимость остальных файлов описания определяется логикой шагов мастера. Стандартный мастер wizard_sol использует только файл .services.php по пути /site/services/ игнорируя остальные файлы описания.

Стандартно подключается языковой файл /lang/ID языка/site/services/.services.php относительно папки мастера.

При работе мастера создания сайта без файла wizard.php в файле .services.php определяется массив $arWizardServices.

Если же мастер работает с использованием файла wizard.php, то в файле .services.php определяется массив $arServices вида:

$arServices = array(
	"ID сервиса" => Array(
  	"NAME" => имя сервиса,
			"STAGES" => Array(
				"файл шага установки",
				"файл шага установки",
			),
	),
);

ID сервиса является также названием папки, где будут искаться описанные для него файлы шагов. Набор сервисов и шагов их установки нигде строго не регламентирован, но обычно используется такая структура:

$arServices = array(
	"main" => Array(
  	"NAME" => Настройки сайта,
			"STAGES" => Array(
				"создание сайта",
				"копирование системных файлов и публичной части",
				"установка шаблона дизайна",
				"установка цветовой схемы",
				"создание групп пользователей",
				"настройка сайта",
			),
	),
	"iblock" => Array(
  	"NAME" => Установка демо-данных,
			"STAGES" => Array(
				"создание типов инфоблоков",
				"установка 1 инфоблока",
				"установка 2 инфоблока",
				……………………………
				"установка N инфоблока",
			),
	),
);

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

Пример файла описания сервисов стандартного мастера demo_personal (bitrix.sitepersonal):

<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

$arServices = Array(
	"main" => Array(
		"NAME" => GetMessage("SERVICE_MAIN_SETTINGS"),
		"STAGES" => Array(
			"site_create.php", // Create site
			"files.php", // Copy bitrix files
			"template.php", // Install template
			"theme.php", // Install theme
			"settings.php",
		),
	),

	"iblock" => Array(
		"NAME" => GetMessage("SERVICE_IBLOCK"),
		"STAGES" => Array(
			"types.php", //IBlock types
			"user_photogallery.php",
		),
	),

	"blog" => Array(
		"NAME" => GetMessage("SERVICE_BLOG"),
		"STAGES" => Array(
			"index.php", 
		),
	),
);
?>

Структура мастера установки

Типичная структура маcтера создания сайта, используемая в стандартных мастерах Bitrix Framework:

  • /images/ID языка/box.jpg — изображение коробочного решения, во время установки обычно показывается над блоком шагов установки.
  • /images/ID языка/logo.gif – обычно стандартный логотип 1С:Битрикс
  • /images/ID языка/solution.png — уменьшенная версия скриншота одного из шаблонов решения — показывается в списке «Выберите решение для установки» при первичной установке, либо при создании дополнительного сайта. Для самостоятельных решений при первичной установке этот шаг пропускается.
  • /lang/ID языка/
  • /scripts/ - папка дополнительных скриптов, использующихся при создании сайта. Например, файл собственного шаблона мастера создания сайта.
  • /site/ - содержит все сервисы, шаблоны, публичную часть и т.п.
  • /site/public/ID языка/ - содержит публичную часть
  • /site/services/ - содержит набор сервисов для сайта
  • /site/services/.services.php – файл описания сервисов
  • /site/templates/ - содержит набор шаблонов сайта
  • .description.php — файл описания мастера создания сайта
  • wizard.php — файл с шагами мастера создания сайта

Кодировки

  Кодировки

Установка сайта на основе Bitrix Framework возможна в двух кодировках на выбор: cp1251 и UTF-8. При установке в UTF-8 система автоматически конвертирует файлы в нужную кодировку.

Конвертацию проходят все языковые файлы (находящиеся внутри папок /ID языка/ как в самом модуле, так и в мастере.

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

  Возможные ошибки

Если вы тестируете установку решения под ОС Windows, необходимо учитывать следующую особенность: файлы, начинающиеся с точки, в UNIX подобных системах считаются скрытыми. И Windows при копировании таких файлов с ftp, сетевого диска (может быть и в других случаях) ставит этим файлам атрибут «скрытый». При этом все файлы с таким атрибутом при установке в Windows обычно не находятся веб-сервером. Отсюда могут появляться ошибки:

  • Установщик не находит файл .access.php (или другой системный файл), хотя тот физически присутствует на диске в нужном каталоге
  • Установщик не меняет кодировку файлов .description.php, .parameters.php.

Решение этой проблемы очень просто — необходимо снять флаг скрытости у всех файлов проекта. Достаточно быстрый способ — зайти в свойства корневой папки проекта, установить флаг «скрытый» и применить только для этой папки. После чего снять флаг «скрытый» и применить уже не только к папке, но и ко всем вложенным файлам. Такую процедуру желательно производить также перед сборкой итогового архива с решением, чтобы избежать подобных проблем после распаковки.

Еще один вариант решения этой проблемы — изначально назвать файлы без точки в начале и переименовать их во время установки. Недостатки: большой риск забыть переименовать какой-либо файл, а также некоторое увеличение времени установки за счет дополнительных обращений к файловой системе.


Настройка шаблона мастера установки

Для подстановки своего шаблона мастеру создания сайта служит ключ TEMPLATES. Значением этого ключа должен быть массив, элементами которого должен быть массив, имеющий следующие ключи:

  • CLASS – имя класса, описывающего шаблон;
  • SCRIPT – путь к файлу, в котором определён класс шаблона относительно папки мастера;
  • STEP – ID шага, для которого определяется шаблон. Если ключ STEP не указан, шаблон будет определён для всех шагов мастера.

Это позволяет нам создать свой уникальный вид любого шага мастера создания сайта.

Если ключ TEMPLATES не указан, подставляется стандартный шаблон. При использовании файла wizard.php это обычно шаблон стандартного мастера установки, находящегося в каталоге \local\modules\main\install\wizard_sol\.

Простейший пример использования шаблона — скопировать стандартный шаблон и в языковых файлах заменить название решения «1C-Битрикс: Управление сайтом» на свое.

Пример кода:

$arWizardDescription = Array(
	…......................................
	"TEMPLATES" => Array(
		 Array('SCRIPT' => 'scripts/template.php', 'CLASS' => 'WizardTemplate')
	),
);

Шаг за шагом

Как было отмечено ранее, установщик представляет собой набор стандартных шагов. Они могут генерироваться автоматически на основе файлов описаний или быть заданы в виде классов в файле wizards.php. Рассмотрим второй случай более подробно.

Файл wizards.php представляет собой набор шагов установки, которые могут как вызывать шаги стандартного мастера, так и переопределять их. Файл должен начинаться с подключения стандартного мастера:

require_once($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/main/install/wizard_sol/wizard.php");

Сами шаги представляют собой классы, наследующиеся от классов стандартного мастера. Минимальная запись выглядит так:

class SelectTemplateStep extends CSelectTemplateWizardStep {
}

Эта запись означает, что при установке присутствует шаг Выбор шаблона, со стандартной реализацией.

Для переопределения какого-либо шага необходимо перегрузить соответствующий метод.

class SelectThemeStep extends CSelectThemeWizardStep {
	function InitStep() {
	…....................
	}
	function OnPostForm() {
	…....................
	}
	function ShowStep() {
	…....................
	}
}

В соответствии с названиями, эти методы отвечают за инициализацию, показ шага и обработку результатов шага после перехода по кнопке Далее.

Для вызова шага родителя в этом случае используется объект parent.

Пример стандартного шага выбора темы с установкой своего подзаголовка:

class SelectThemeStep extends CSelectThemeWizardStep {
	function InitStep() {
		parent::InitStep();
		$this->SetSubTitle(GetMessage('SELECT_THEME_SUBTITLE'));
	}
}

Важно! Если определение шагов мастера создания сайта делается через файл wizard.php, то поиск и обработка файлов описания .template.php, .service.php, .site.php не происходит, если это не реализовано вами, либо в стандартном классе соответствующего шага. Таким образом, чтобы реализовать сортировку шаблонов через файл .template.php, нужно перегрузить метод ShowStep() шага CSelectTemplateWizardStep, сделать собственную реализацию метода WizardServices::GetTemplates из файла \bitrix\modules\main\install\wizard_sol\utils.php.

Также можно не использовать файл .template.php, а указать значение сортировки в файле описания шаблона.

Публичная часть

При создании мастера с использованием файла wizard.php публичная часть обычно располагается в каталоге /site/public/ID языка/. Такое расположение позволяет достаточно быстро ее найти, а также не заботиться о кодировках.

Есть варианты, когда решение содержит сразу несколько вариантов устанавливаемого сайта с частично разной структурой и демо-данными. Например, [dw]в решении[/dw][di] С 1 февраля 2023 года продажа данного решения прекращена. [/di] «Официальный сайт государственной организации» существует 8 видов сайта, от управления ЗАГС, до сайта правительства области. В этом случае можно поступить следующим образом:

  • Внутри каталога /site/public/ID языка/ создается каталог /common, содержащий общие для всех файлы (картинки, видео, общие разделы и т.п.).
  • Для каждого вида сайта создается свой каталог с заранее определенным названием, позволяющим однозначно отнести его к одному из типов сайта. Например, это ID типа сайта, запоминаемый на соответствующем шаге установки.
  • Отдельно выносится папка /bitrix с дополнительными файлами, копируемыми в ядро (.default шаблон и т.п.). Эта папка не должна содержать файлов, заменяющих стандартные файлы ядра. Копирование следует делать без перезаписи файлов.

Примечание: Если тип сайта только один, то дополнительные каталоги создавать не обязательно.

В идеале публичная часть не должна содержать никакой логики сайта, только вызовы компонентов с соответствующими шаблонами. Иначе высок риск, что пользователь нарушит работу таких страниц.

Если используются ссылки, ведущие от корня сайта (например, ссылка /about/contacts.php), то первый слеш должен заменяться макросом, например, #SITE_DIR#. Это правило обязательно должно соблюдаться для решений, поддерживающих многосайтовость. Решения для Bitrix Marketplace должны поддерживать многосайтовость по умолчанию.

Все прямые ссылки на ID инфоблоков (например, 'IBLOCK_ID' => 16 при вызове компонента) также должны заменяться макросами. Обычно макрос пишется по названию инфоблока с приставкой IBLOCK_ID ('IBLOCK_ID' => #MY_IBLOCK_ID#).

Таким же образом должны заменяться все ссылки на то, что может измениться в процессе установки решения (ID форумов, блогов, ID свойств инфоблоков, ID значений свойств типа «список», и т.п.).

Макросы заменяются на этапе установки сервисов.

Если предполагается использовать два варианта главной страницы (например, выбор между главной на основе компонентов и на основе гаджетов), то лучше создать несколько файлов index.php и при установке копировать нужный в корневую папку сайта с именем _index.php, в котором и производить замену макросов.

Внимание! В публичной части для решений Bitrix Marketplace не должно содержаться системных файлов и каталогов, которые могут переписать уже существующие у клиента ( /upload/, urlrewrite.php, шаблон .default и т.п.).

В самостоятельных решениях это допускается, но тоже не желательно.

Настройка сайта

  Настройка сайта

Настройка сайта проводится на этапе установки сервисов и включает в себя следующие шаги:

  1. Создание сайта (если он еще не создан).
  2. Копирование публичной части.
  3. Копирование выбранного шаблона дизайна и регистрация его в объекте сайта.
  4. Копирование выбранной цветовой схемы.
  5. Установка настроек модулей и подстановка пользовательских данных, введенных на шаге настройки сайта.

Копирование данных проводится стандартной функции CopyDirFiles.

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

Лучше всего при копировании шаблона добавить к нему суффикс с ID сайта (template_s1), это позволит на разных сайтах иметь одинаковые шаблоны, но с разными цветовыми схемами. Либо просто не затереть одноименные шаблоны другого сайта.

На этом же этапе копируются и подставляются все вторичные шаблоны (шаблон для печати, шаблон мобильной версии, шаблон версии для ЛОВ).

Для установки настроек модулей используется стандартный класс COption. Замена макроса директории сайта (обычно #SITE_DIR#) делается с помощью функции WizardServices::ReplaceMacrosRecursive(WIZARD_SITE_PATH, Array("SITE_DIR" => WIZARD_SITE_DIR)), где:

  • WIZARD_SITE_PATH — константа полного пути к сайту,
  • WIZARD_SITE_DIR — константа директории сайта.

  Подстановка данных пользователя

Подстановка данных пользователя может выполняться двумя способами:

  • Установка соответствующих опций своего модуля, если в шаблоне данные вставляются через них. Такой способ позволяет легко получать текущие данные при повторном запуске мастера, а также централизованно менять эти данные на странице настройки модуля.
  • Замена соответствующих макросов. При этом способе данные пользователя обычно выносятся в виде макросов во включаемые области, которые уже вставляются в шаблон. Недостатком этого способа можно считать необходимость менять данные во всех включаемых областях, где они используются, а также возможные проблемы с версткой в режиме правки.

Импорт демо-данных

  Порядок установки

Импорт демо-данных осуществляется на шаге установки сервисов. Порядок установки ничем заранее не оговаривается, кроме внутренних зависимостей. Обычный порядок следующий:

  1. Создание самого сайта и установка его настроек.
  2. Копирование публичной части сайта и рекурсивная замена макроса #SITE_DIR#.
  3. Копирование выбранного на этапе установки шаблона сайта
  4. Копирование выбранной на этапе установки темы сайта поверх шаблона, с перезаписью.
  5. Создание всех типов инфоблоков.
  6. Создание инфоблоков и подстановка замена соответствующих макросов функцией CwizardUtil::ReplaceMacros(Путь к файлу, array("Имя макроса без #" => Значение на замену)). Так как второй параметр - массив, то в одном файле можно произвести сразу несколько замен.
  7. Настройка блогов, форумов, статистики, рабочего стола и прочее.
  • Пользователи
  • Инфоблоки
  • Шаблоны
  •   Пользователи

    Импорт заранее подготовленного набора пользователей используется редко. В случае необходимости используется стандартный класс CSVUserImport, входящий в состав модуля main.

      Инфоблоки

    Данные инфоблоков в мастере создания сайта хранятся в виде xml файлов, сформированных с помощью стандартного экспорта инфоблоков Bitrix Framework. Эти файлы, а также папки с дополнительными файлами, получающиеся в результате экспорта, обычно помещаются в каталог /xml/ID языка/. В самом простом случае файл установки инфоблока включает следующий код:

    if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)
    	die();
    if(!CModule::IncludeModule("iblock"))
    	return;
    
    $iblockID = WizardServices::ImportIBlockFromXML(
    	 WIZARD_SERVICE_RELATIVE_PATH."/xml/".LANGUAGE_ID."/feedback.xml", 
    	 "iblockCode", 
    	 "iblockType", 
    	 WIZARD_SITE_ID, 
    	 $permissions = Array(
    		 "1" => "X",
    		 "2" => "R",
    	 )
    );
    
    if ($iblockID < 1)
     return;
    
    CWizardUtil::ReplaceMacros(WIZARD_SITE_PATH."/feedback/new.php", array("FEEDBACK_IBLOCK_ID" => $iblockID));

    Функция

    WizardServices::ImportIBlockFromXML
      (function ImportIBlockFromXML
         ($xmlFile, 
          $iblockCode, 
          $iblockType, 
          $siteID, 
          $permissions = Array()
         )
    ) 
    WizardServices::ImportIBlockFromXML (function ImportIBlockFromXML($xmlFile, $iblockCode, $iblockType, $siteID, $permissions = Array())) проверяет наличие инфоблока с символьным кодом $iblockCode, типом $iblockType для сайта $siteID. Если инфоблок не найден, то он устанавливается из файла $xmlFile. Путь к файлу указывается с подстановкой стандартной константы WIZARD_SERVICE_RELATIVE_PATH.

    Примечание: При импорте торгового каталога, метод не создаст элементы этого каталога. Необходимо разделить xml-файл на 2. В первом описывается обычный инфоблок без цен, во втором - непосредственно цены.

    В случае поддержки многосайтовости (или просто решения для Bitrix Marketplace) к символьному или внешнему коду инфоблока после его установки следует добавить и ID сайта. Следует заметить, что в функцию ImportIBlockFromXML подставляется код инфоблока без добавления ID сайта, само добавление происходит уже потом через создание метод Update класса CSite.

      Шаблоны

    При создании мастера с использованием файла wizard.php шаблоны располагаются в каталоге /site/templates/. Для уменьшения проблем с кодировками можно помещать их в каталог /site/templates/ID языка/, но лучше помещать русский текст в языковые файлы и вставлять через GetMessage. Кроме стандартных файлов каталог шаблона должен содержать следующие файлы:

    • description.php — файл описания шаблона, содержит массив $arTemplate. Обычно содержит два ключа: NAME для названия шаблона и DESCRIPTION для его описания. Набор ключей можно расширить, например, сортировкой, и установкой шаблона по умолчанию, если вы реализовали это переопределив метод WizardServices::GetTemplates.
    • screen.png — скриншот шаблона в нормальном размере. Обычно нигде не отображается.
    • preview.png — скриншот шаблона в уменьшенном размере, отображается на шаге выбора шаблона.
    • /themes/ - каталог с цветовыми схемами данного шаблона. Имеет ту же структуру, что и каталог самого шаблона, но содержит лишь зависящие от цветовой схемы файлы. Обычно это файлы стилей, screen.png и preview.png темы, а также некоторые шаблоны компонентов.

    Примечание: Расширение и расположение файлов screen.png и preview.png задается конкретной реализацией шагов установки шаблона и темы в файле wizard.php.


    Сборка дистрибутива решения

    Выбор редакции и сборка дистрибутива

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

    При сборке решения для Bitrix Marketplace в архив необходимо поместить только ваш модуль. Мастер создания сайта помещается внутрь модуля в каталог …/install/wizards/пространство_имен/ID_мастера/.

    При сборке самостоятельного решения в архив включается также необходимая редакция Bitrix Framework. Таким образом, для полной сборки решения необходимо:

    1. Поместить в каталог решения нужную редакцию Bitrix Framework.
    2. Удалить демо-мастер (/bitrix/wizards/bitrix/demo).
    3. Удалить стандартные модули типовых сайтов (с 11 версии они начинаются с префикса bitrix., например, bitrix.sitepersonal. В более ранних версиях этот префикс отсутствует, и нужно смотреть по началу названия: site***).
    4. Отредактировать файлы license.html и readme.html на соответствие вашему решению.
    5. Отредактировать файл install.config. В частности прописать строку <demoWizardName> пространство_имен_мастера: название_мастера </demoWizardName>, например, так: <demoWizardName>bitrix:government</demoWizardName>.

      Это позволит вашему мастеру создания сайта запуститься сразу после шага настройки администратора. Конечно, при условии, что нет других мастеров с возможностью установки.

    6. Поместить ваш модуль в каталог /local/modules/.
    7. Поместить ваш мастер создания сайта в каталог /bitrix/wizards/пространство_имен/ID_мастера/. Именно в этом каталоге будет производиться поиск мастера для установки при выполненной настройке из 5 пункта.

    Если сайт установлен в UTF-8, а файлы мастера - в windows-1251, то перекодировка произойдёт в момент установки модуля.


    Уменьшение размеров дистрибутива

       Проблема дублирования и ее решение

    Дублирование — одна из самых явных проблем, которая может привести к следующим последствиям:

    • Увеличение размера дистрибутива.
    • Некоторое увеличение времени установки за счет копирования и обработки продублированных файлов.
    • Сильное увеличение временных затрат на внесение изменений, так как приходится вносить их во все копии файлов.
    • Повышение вероятности ошибки за счет не внесенного изменения в одну из копий.

    Хорошим примером проблемы дублирования является [dw]решение[/dw][di] С 1 февраля 2023 года продажа данного решения прекращена. [/di] «Официальный сайт государственной организации», версия от 03.08.2010. Это решение включает себя 8 различных видов сайта, частично отличающихся как своей структурой, так и набором демо-данных. А также четыре шаблона дизайна, которые можно использовать для любого вида сайта.

    Отбросим файлы самой редакции платформы Bitrix Framework и оставим для анализа только модуль gossite и мастер установки bitrix:government. Вместе они имеют размер 274 МБ и состоят из 13 867 файлов и 7 940 каталогов. Эти цифры не назовешь маленькими.

    Рассмотрим основные случаи дублирования в этом решении:

    1. В модуле gossite есть каталог установки следующих кастомизированных и собственных компонентов: desktop, header, iblock.wizard, menu, support.ticket.list. В то же время в папке /public мастера установки bitrix:government можно увидеть папку /bitrix, содержащую набор компонентов и гаджетов. Сравнив список компонентов, мы увидим те же самые названия, и дополнительный компонент structure.visual. Все они копируются на этапе установки сервисов в скрипте /wizards/bitrix/government/site/services/files/bitrix.php следующим кодом:
      CopyDirFiles( 
      	WIZARD_ABSOLUTE_PATH."/site/public/".LANGUAGE_ID."/bitrix/",
      	WIZARD_SITE_PATH."/bitrix/",
      	$rewrite = false, 
      	$recursive = true
      );
      Исходя из кода, копирование проводится без перезаписи, поэтому актуальными являются компоненты, устанавливаемые вместе с модулем.
    2. Публичная часть мастера содержит папку /common для общих файлов, а также папки для каждого из типов сайта. По логике установки сервисов первым копируется содержимое папки выбранного вида сайта, а потом поверх него содержимое папки с общими файлами.

      При беглом осмотре можно заметить, что каталог /video (15,7 МБ) из общих файлов дублируется также в четырех видах сайта, причем видеофайлы идентичны. А содержимое папки /upload из общих файлов частично дублируется для сайта прокуратуры.

      В папке /upload/ сайта прокуратуры присутствует каталог /iblock, дублирующий файлы для установки инфоблоков.

      Также в каталогах разных типов сайтов были другие полностью дублирующиеся файлы и каталоги, которые можно вынести в /common.
    3. В базовом шаблоне дизайна (modern) в цветовых схемах продублировано много шаблонов компонентов из самого шаблона. Часть из них дублируются полностью, для части есть несколько отличающихся файлов. В последствии очень легко не внести изменения в какую-либо из цветовых схем и в итоге запутаться, где находится актуальная версия. Да и объем работы при правке этих шаблонов возрастает в несколько раз (по числу цветовых схем в шаблоне). Поэтому все дублирующиеся части из них лучше удалить.
    4. В каталоге установки сервисов для каждого типа сайта создан отдельный набор данных для инфоблоков. Выбор, какой именно набор ставить производился в файле описания сервисов .services.php. С одной стороны это удобно, но с другой стороны дублирование информации сильно увеличивается за счет дополнительных файлов инфоблоков. Например, при одинаковых альбомах в фотогалерее, или одинаковых наборах документов.

    Решением этой проблемы стало объединение общих инфоблоков в один каталог. При каких-либо отличиях в настройках или содержании инфоблоков для каждого типа сайта сохранялся свой xml файл с добавлением префикса по типу сайта, но все они использовали уже общий набор дополнительных файлов. Выбор что устанавливать стал проводиться в скрипте установки инфоблока.

    Над последней версией дистрибутива решения были проведены работы по устранению указанных выше проблем. В конечном итоге после замены двух шаблонов дизайна новыми, дополнения демо-данных и прочих плановых доработок, совокупный размер мастера и модуля уменьшился до 141 МБ, а количество файлов и каталогов уменьшились до 8 889 и 4 588 соответственно.

      Другие советы по уменьшению размера дистрибутива

    1. Не используйте в дистрибутиве большие видео/аудио файлы.
    2. Исключайте из дистрибутива все кастомизированные шаблоны компонентов, которые в ходе разработки перестали где-либо использоваться
    3. Выносите общие для всех дизайнов шаблоны компонентов в отдельный каталог. Для самостоятельных решений их можно просто вынести в .default шаблон сайта. В решениях для Bitrix Marketplace их стоит вынести в отдельный каталог и копировать на шаге установки шаблона дизайна (тем самым опять же уменьшая дублирование).
    4. Для самостоятельных решений выносите мастер создания сайта из модуля в каталог /bitrix/wizards/. Это позволит избежать либо дублирования, либо дополнительного копирования мастера при установке решения.

    Тестирование дистрибутива

    Чек-лист локального тестирования решения для Bitrix Marketplace:

    1. Проверьте код публичной части, чтобы все ссылки от корневого каталога в меню и других местах (/about/) дополнены макросом директории сайта (#SITE_DIR#about/).
    2. Проверьте, что все ID инфоблоков, разделов, свойств, форумов и подобных элементов в публичной части заменены на макросы.
    3. Проверьте, что в ваших шаблонах и компонентах нет прямого обращения к инфоблокам, разделам и подобным элементам по их ID. ID должен либо вычисляться в компоненте/шаблоне, либо подставляться при вызове через параметры.
    4. Проверьте, что весь русский текст перенесен в языковые файлы.
    5. Если у вас нет развернутого тестового сайта с нужной редакцией Bitrix Framework, то создайте его. Можно сразу, перед установкой, поместить свой модуль в /local/modules/, чтобы он установился вместе с решением.
    6. Если ваш модуль еще не перенесен на тестовый сайт, то скопируйте его и установите через административную панель.
    7. Выберите Протестировать новое решение на панели управления, либо создайте новый сайт, проверьте, что ваш мастер установки есть в списке и имеет верный скриншот.
    8. Пройдите все шаги мастера, убедитесь, что все формы такие, как должны быть, все настройки присутствуют, все изображения соответствуют, при установке данных не возникают ошибки с предложением повтора/пропуска шага
    9. После установки убедитесь, что все внутренние ссылки ведут на подкаталог сайта. То есть, что все макросы директории сайта заменены корректно.
    10. Убедитесь, что все макросы ID инфоблоков, свойств и прочих вещей заменились корректно.
    11. Проверьте, что все данные из настроек мастера (если при установке можно вводить, например, название, адрес и телефон организации) подставились.
    12. Проверьте, что при установке решения не пострадали данные ранее установленных решений.
    13. Попробуйте вызвать мастер настройки решения и поменяйте таким образом шаблон или цветовую схему. Проверьте, что они установились для нужного сайта.

    Советы

      Кодировки и языковые файлы

    1. Всегда выносите русский текст в языковые файлы, иначе в будущем возможны проблемы с кодировками. Например, при установке модуля внутри него смена кодировки происходит только для языковых файлов. Таким образом, устанавливая сайт в utf-8 и оставив русский текст в файле /install/components/пространство имен/имя компонента/templates/.default/template.php вы в итоге получите набор иероглифов.
    2. При разработке/тестировании в Windows предварительно снимите флаг скрытости у всех файлов. При копировании файлов, начинающихся с точки (такие файлы считаются скрытыми в Unix подобных ОС) с сетевого диска Windows ставит им флаг «скрытый». При наличии этого флага при установке сайта под Windows файлы не обрабатываются. Перед сборкой архива с дистрибутивом желательно также предварительно проверить файлы на флаг скрытости.
    3. При создании решения проверяйте соответствие кодировки файла .htaccess в вашем решении и в системе. При установке решения может произойти затирание этого файла, созданного системой. В результате этого могут не создаваться инфоблоки. Решения лучше создавать в Windows-1251, как и сам Bitrix Framework.

      Ядро Bitrix

    1. При разработке решения для Bitrix Marketplace не оставляйте в публичной части системные файлы, которые могут перезаписать уже имеющиеся файлы у клиента. К ним относятся:
      • файл urlrewrite.php;
      • папка /upload;
      • любые системные файлы из папки /bitrix, в том числе шаблон .default;
      • Компоненты/гаджеты вне собственного пространства имен.
      Если есть необходимость все же добавить что-либо в системную папку, то разместите эти файлы отдельно и делайте предварительно проверку на существование.
    2. При разработке самостоятельного решения с поддержкой многосайтовости выносите добавляемое в папку /bitrix в отдельную папку и копируйте вручную без перезаписи. Иначе при переносе публичной части при установке второго сайта у вас получится лишний набор файлов в /папка_сайта/bitrix/.
    3. При разработке самостоятельного решения не добавляйте никаких файлов в ядро Bitrix Framework напрямую. Если все же необходимо внести дополнительные файлы в ядро (например, свой шаблон бизнес-процесса), то такой файл нужно поместить внутри мастера создания сайта и переносить через копирование. В противном случае при переносе решения на более новую редакцию Bitrix Framework есть вероятность потери добавленных файлов.

      Инфоблоки, пользователи и свойства

    1. Никогда напрямую не используйте ID инфоблока (пользователя, группы, значения свойства типа «список») где-либо, кроме файлов публичной части. В противном случае возможна ситуация, когда компонент/шаблон/метод класса обращается к данным по одному ID, а получает либо совершенно другие данные, либо их полное отсутствие. Возможные варианты решения:
      • Для компонентов и шаблонов передавать ID используемых инфоблоков/пользователей/групп/свойств через параметры вызова (описываются в файле .parameters.php)
      • Для собственных классов передавать необходимые ID инфоблоков/пользователей/групп/свойств либо при создании объекта класса, либо в качестве параметров его методов.
      • Если ID нигде не передается, то определять их по каким-либо признакам (обычно это символьный код (CODE) или внешний код (XML_ID)).
    2. Внутри мастера установки проверяйте, что все прямые использования ID инфоблоков (пользователей, групп, значений свойств типа «список») заменены макросами. Макросы имеют вид #имя_макроса# и должны заменяться на этапе установки инфоблоков.
    3. Убедитесь, что все макросы заменяются во время установки решения. Для замены можно использовать следующие функции:
      • CWizardUtil::ReplaceMacros(путь_к_файлу, Array("имя_макроса" => значение_для_замены));
      • WizardServices::ReplaceMacrosRecursive(путь_к_корневой_папке, Array("имя_макроса" =>значение_для_замены));

      Многосайтовость

    Если предполагается возможность установки вторым/N-ным сайтом, то в начале всех абсолютных путей необходимо либо подставлять системную константу SITE_DIR, либо макрос (например, #SITE_DIR#), заменяемый в процессе установки решения.

    Шаблоны

    1. Если решение включает несколько шаблонов, следите, чтобы названия шаблонов компонентов в них были одинаковыми. Публичная часть одна и не известно какой из шаблонов сайта выберет пользователь.
    2. Для уменьшения итогового размера решения выносите все одинаковые шаблоны компонентов в некоторую общую папку. В самостоятельном решении это может быть шаблон .default. В решении для Bitrix Marketplace — просто отдельная папка, из которой общие шаблоны компонентов должны быть скопированы на этапе установки шаблона сайта.

      Шаблон Битрикс24 и фрейм

    При разработке приложений на основе шаблона Битрикс24, учтите, что этот шаблон нельзя открывать во фрейме.


    Установка иконки мастера настройки сайта

    Иконку мастера настройки сайта лучше всего добавлять в файле модуля include.php. Для этого в класс нужно добавить функцию (пример из модуля bitrix.sitepersonal):

    function ShowPanel()
    {
    	if ($GLOBALS["USER"]->IsAdmin() && COption::GetOptionString("main", "wizard_solution", "", SITE_ID) == "personal")
    	{
    		$GLOBALS["APPLICATION"]->AddPanelButton(array(
    		    "HREF" => "/bitrix/admin/wizard_install.php?lang=".LANGUAGE_ID."&wizardName=bitrix:demo_personal&wizardSiteID=".SITE_ID."
                         &".bitrix_sessid_get(),
    			"ID" => "demo_personal_wizard",
    			"ICON" => "bx-panel-site-wizard-icon",
    			"MAIN_SORT" => 2500,
    			"TYPE" => "BIG",
    			"SORT" => 10,					
    			"ALT" => GetMessage("SPER_BUTTON_DESCRIPTION"),
    			"TEXT" => GetMessage("SPER_BUTTON_NAME"),
    			"MENU" => array(),
    		));
    	}
    }

    Как видно из кода, сначала проверяется наличие администраторских прав и параметр wizard_solution из модуля main для конкретного сайта (должен устанавливаться в мастере создания сайта). Если условие проходит, то вызывается стандартный метод AddPanelButton. Ссылка в параметре HREF содержит пространство имен и название мастера, который нужно запустить для текущего сайта (параметр wizardName=bitrix:demo_personal). Из параметров можно отметить:

    • "TYPE" => "BIG" – иконка большая, занимающая всю высоту панели управления. Если не установлен, то иконка занимает лишь одну из трех строк.
    • "ICON" => "bx-panel-site-wizard-icon" – подставляет стандартную картинку, в данном случае для большой иконки мастера. Альтернатива параметру SRC. Для маленькой иконки можно использовать значение "icon-wizard".
    • "TEXT" => GetMessage("SPER_BUTTON_NAME") – подпись рядом либо под иконкой (зависит от ее типа).

    Приложение

    Список констант шага установки сервисов в стандартном мастере wizard_sol:

    WIZARD_SITE_ID
    WIZARD_SITE_ROOT_PATH
    WIZARD_SITE_DIR
    WIZARD_SITE_PATH
    WIZARD_RELATIVE_PATH
    WIZARD_ABSOLUTE_PATH
    WIZARD_TEMPLATE_ID
    WIZARD_TEMPLATE_RELATIVE_PATH
    WIZARD_TEMPLATE_ABSOLUTE_PATH
    WIZARD_THEME_ID
    WIZARD_THEME_RELATIVE_PATH
    WIZARD_THEME_ABSOLUTE_PATH
    WIZARD_SERVICE_RELATIVE_PATH
    WIZARD_SERVICE_ABSOLUTE_PATH
    WIZARD_IS_RERUN
    WIZARD_SITE_LOGO
    WIZARD_INSTALL_DEMO_DATA
    WIZARD_FIRST_INSTAL

    Документация к собственным разработкам

      Почему нужна собственная документация

    При разработке собственных решений, а также созданию проектов на Bitrix Framework с интеграцией с различными сервисами, с нестандартным специфическим функционалом крайне рекомендуется ведение собственной документации. И чем нетипичнее, крупнее, длительнее, сложнее и объёмнее проект, чем больше исполнителей над ним работает, тем более необходима документация и более обширной и разноплановой должна она быть.

    Какие проблемы решает собственная документация:

    1. Трудности с подключением нового разработчика. Требуется довольно много времени на то, чтобы ему разобраться с уже реализованным функционалом.
    2. Трудности с донесением изменений по архитектурной и функциональной части до других разработчиков.
    3. Иногда могут возникать ошибки из-за использования устаревших функций, написанных другим разработчиком, но при беглом взгляде другого вроде решающих его задачу и так далее.
    4. Сложности при планировании новых функциональных блоков.
    5. Проблемы с поддержкой собственных решений в Маркетплейс.

    Проблема комплексная, так как требует не только документирования исходного кода, но и написания документации для администраторов и пользователей. Другими словами, требуется сделать всё то, что делает вендор.

      Пользовательская и администраторская документация

    Самое простое в этом комплексе - это создание администраторской и пользовательской документации. Причём с администраторской документацией всё может быть ещё проще, так как есть штатная возможность системы использовать подсказки к полям компонентов.

    Считается, что пользовательская документация требуется не всегда, но это не так. Нужно исходить из того, что работать с вашим проектом будут не только квалифицированные или, хотя бы, пытливые люди, но и безразличные ко всему неумёхи, которым надо всё показывать "от и до". Ну, а в больших проектах с "навороченным" нештатным функционалом от неё вообще никуда не деться.

    Создание такой документации не представляется сложным этапом в работе. Её в состоянии выполнять сотрудники с уровнем "продвинутого пользователя". Здесь больше вопрос ресурсов, оплаты их труда, многие студии пренебрегают этим этапом.

      Документация для разработчиков

    Сложность создания документации для разработчиков имеет объективные и субъективные основания. Объективные:

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

    Субъективная причина одна: психологическое неприятие разработчиком необходимости писать документацию.

    Объективные трудности должны преодолеваться за счёт правильной организации процесса разработки. Субъективные - за счёт постоянной разъяснительной работы, терпеливого убеждения.

    Типовые возражения программистов по поводу написания комментариев

    При разработке своих классов и функций разработчик должен их документировать в формате PHPdoc или сходном диалекте. Это позволяет:

    • осуществить показ человеческих подсказок по коду на уровне IDE;
    • иметь возможность посмотреть описание чужого класса и быстро с ним разобраться;
    • иметь возможность генерации списков todo на следующую итерацию или для себя.

    В качестве инструментов можно использовать:

    При использовании любого инструмента придётся разбираться с кодировками. Это особенность, связанная с Bitrix Framework: при выставленном в настройках проекта UTF-8, в коде ядра портятся комментарии.


    Скрипт для автоматической работы с клиентами модуля

      Скрипт и входные параметры

    Создатель модуля имеет возможность автоматической работы с клиентами своего модуля. Функционал в полном объёме доступен только для платных модулей. Для бесплатных модулей есть возможность получать информацию о клиенте после их установки клиентом (метод action=list).

    Реализуется функционал с помощью специального скрипта: http://partners.1c-bitrix.ru/add_client.php.

    Входные параметры
    partner_id ID партнера на нашем сайте (обязательный)
    module_id код модуля (обязательный)
    key хэш ключа (передается вам клиентом)
    name название клиента
    email email клиента
    site_url адрес сайта клиента
    contact_person контактное лицо
    phone телефон клиента
    comments произвольные комментарии (метод оплаты, описание клиента и т.п.)
    action действие:
    • add - добавить клиента;
    • delete - удалить клиента (отвязать решение от ключа);
    • update - обновить клиента;
    • check - проверка, что решение доступно для указанного ключа
    • list - получить список клиентов указанного решения
    Если действие не задано, то происходит добавление нового клиента.
    hash подпись запроса, формируется следующим образом:
    $md5 = md5($partner_id."|".$module_id."|".$key."|".$action."|".$salt);
    $salt "Пароль для подписи данных", задается в карточке партнера
    is_utf если значение "Y", то все входные параметры будут перекодированы из UTF-8 в кодировку нашего сайта (windows-1251)

      Результат работы

    Скрипт возвращает два типа ответа (в текстовом формате):

    OK
    сообщение об успешно совершенном действии
    ERROR
    текст ошибки

      Примеры использования

    //Добавим нового клиента
    http://partners.1c-bitrix.ru/add_client.php?partner_id=&module_id=&key=&action=add&name=Anton%20Ezhkov&email=anton@bitrix.ru&site_url=www.1c-bitrix.ru&contact_person=Anton%20Ezhkov&phone=123123123&comments=Оплатил безналом&is_utf=Y&hash=
    //Изменим информацию о клиенте
    http://partners.1c-bitrix.ru/add_client.php?partner_id=&module_id=&key=&action=update&name=Антон Ежков&email=anton@bitrix.ru&site_url=www.1c-bitrix.ru&contact_person=Антон Ежков&phone=123123123&comments=Оплатил безналом, помогал в техподдержке&is_utf=Y&hash=
    //Удалим ключ из клиентов модуля
    http://partners.1c-bitrix.ru/add_client.php?partner_id=&module_id=&key=&action=delete&hash=
    //Получим список клиентов указанного платного модуля
     http://partners.1c-bitrix.ru/add_client.php?partner_id=&action=list&module_id=&hash=