От слов к делу — начнём потихоньку заполнять пробелы в необходимых знаниях по Битрикс программированию …
На последнем моём собеседовании с веб студией Слон один из вопросов технического директора компании ко мне был — есть ли у Вас опыт по разработке модулей в Битриксе?
К сожалению тут я немного присел в лужу, т.к оного у меня не было.
Для освоения ядра D7 знакомство с модулями я начну стразу, собственно используя стиль программирования нового ядра.
Подход к всему новому у меня всегда один — от простого к сложному. Для начала я решил найти самый простой шаблон модуля, просто чтобы запустить своими руками без какой либо конкретной задачи — обозначить пространство для вставки полезного кода в шаблоне, так же освежил знания из курса Разработчик Bitrix Framework и вооружился официальной документацией по D7
За основу я взял статейку с сайта веб студии BRAINKIT 1С:Битрикс пример создания модуля D7
Всё бы ничего, но видимо никто из компании не удосужился проверить работоспособность выложенного на гите модуля (и хорошо — хоть поковырялся, так сказать минизадача по правке работоспособности модуля).
Итак, прочитав статью, я сразу пошел по ссылке в гит, клонировал проект bitrix-d7-module и закинул его в ./local/modules/ файловой структуры сайта.
Далее интересней — идём в Доступные решения для установки модуля — там пусто!
Пора и заглянуть в код 🙂
В include.php
1 2 3 4 5 6 7 |
<?php Bitrix\Main\Loader::registerAutoloadClasses( «brainkit.d7», array( «Brainkit\\D7\\Test» => «lib/test.php», ) ); |
в параметрах registerAutoLoadClasses видим «Brainkit\\D7\\Test»
в файлах /lib/php.* пространство имён задано namespace Brainkit\D7;
да и в проверочном файле модуль подключается CModule::IncludeModule(«brainkit.d7»)
Переименовываем bitrix-d7-module в brainkit.d7 — появился модуль «Пример модуля D7 (brainkit.d7)» — то что нужно!
Устанавливаем и вызываем проверочный скрипт.
1 2 3 4 5 6 7 8 9 |
[Bitrix\Main\DB\SqlQueryException] Mysql query error: (1146) Table ‘db.brainkit_test’ doesn‘t exist (400) SELECT `brainkit_d7_data`.`ID` AS `ID`, `brainkit_d7_data`.`TITLE` AS `TITLE`, `brainkit_d7_data`.`SORT` AS `SORT`, `brainkit_d7_data`.`CREATED` AS `CREATED` FROM `brainkit_test` `brainkit_d7_data` ... |
Табличка не существует!
Посмотрел базу в PHPMyAdmin — реально такой таблицы нет!
Изучаем папочку install, а точнее индексный файл этой папки
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
<? IncludeModuleLangFile(__FILE__); use \Bitrix\Main\ModuleManager; Class Brainkit_D7 extends CModule { var $MODULE_ID = «brainkit.d7»; var $MODULE_VERSION; var $MODULE_VERSION_DATE; var $MODULE_NAME; var $MODULE_DESCRIPTION; var $errors; function __construct() { //$arModuleVersion = array(); $this->MODULE_VERSION = «1.0.0»; $this->MODULE_VERSION_DATE = «20.03.2016»; $this->MODULE_NAME = «Пример модуля D7»; $this->MODULE_DESCRIPTION = «Тестовый модуль для разработчиков, можно использовать как основу для разработки новых модулей для 1С:Битрикс»; } function DoInstall() { $this->InstallDB(); $this->InstallEvents(); $this->InstallFiles(); RegisterModule(«brainkit.d7»); return true; } function DoUninstall() { $this->UnInstallDB(); $this->UnInstallEvents(); $this->UnInstallFiles(); UnRegisterModule(«brainkit.d7»); return true; } function InstallDB() { global $DB; $this->errors = false; $this->errors = $DB->RunSQLBatch($_SERVER[‘DOCUMENT_ROOT’] . «/bitrix/modules/brainkit.d7/install/db/install.sql»); if (!$this->errors) { return true; } else return $this->errors; } function UnInstallDB() { global $DB; $this->errors = false; $this->errors = $DB->RunSQLBatch($_SERVER[‘DOCUMENT_ROOT’] . «/local/modules/Brainkit.D7/install/db/uninstall.sql»); if (!$this->errors) { return true; } else return $this->errors; } function InstallEvents() { return true; } function UnInstallEvents() { return true; } function InstallFiles() { return true; } function UnInstallFiles() { return true; } } |
в методе InstallDB класса Brainkit_D7 запускается скрипт создания таблички, с абсолютным указанием места его расположения /bitrix/modules/brainkit.d7/install/db/install.sql
у нас то модуль лежит в /local/ !
Забавно, что в UNnstallDB в том же скрипте расположение MYSQL скрипта уже в local! /local/modules/brainkit.d7/install/db/install.sql
То есть даже если мы бы закинули модуль в /bitrix/modules/ — он бы установился, но удалить бы мы его не смогли (таблица всё равно осталась бы в базе).
добавим свойство класса
var $MODULE_PATH;
и в конструкторе определим его
$this->MODULE_PATH = dirname(__DIR__);
после чего правим в двух местах код заменяя $_SERVER[‘DOCUMENT_ROOT’] . «/local/modules/Brainkit.D7» на $this->MODULE_PATH
устанавливаем модуль заново, запускаем тестовый скрипт — ошибок нет, но и ничего не выдал!
Тут всё в рамках логики — в статьи и было написано, что в табличку нужно внести хоть одну строчку.
Вносим руками с помощью PHPMyAdmin или запросом с админки
1 |
INSERT INTO `brainkit_test` (`ID`, `TITLE`, `SORT`, `CREATED`) VALUES (NULL, ‘TITLE’, ‘500’, CURRENT_TIMESTAMP); |
Запускаем, и вуаля — результат на лицо, а точнее на экран!
Итак, первичное знакомство с созданием своих модулей закончено — шаблон рабочий, далее погружаемся в логику и идём от простого к сложному.
Ещё один шаг, который мне необходимо «пощупать» для удалённой работы в веб студиях — это система контроля версий.
Собственно, на этом простеньком примере можно и потренироваться — результаты отпишу.
PS
Brainkit особое спасибо за хорошую статью и возможность отладить кривой модуль 🙂
Для отладки модуля я использовал
Bitrix\Main\Diag\Debug::dumpToFile();
Дебаг в файл, по умолчанию пишет в /__bx_log.log
лучше с псевдонимом, чтобы покороче 🙂
use Bitrix\Main\Diag\Debug;
Debug::dumpToFile();
Ещё неплохой мануал по созданию своего модуля на примере кнопки «Наверх» (тут поглубже — уже используется страничка с настройками модуля, и функционал соответственно уже рабочий).
Но и тут не без «косяков» — модуль в мануале назвывается scrollup (без точки!) соответственно, он распознаётся как системный — поэтому я его в админке в установленных решениях сразу не нашел, т.к. он лежит в «модули» (как системный).
PPS
Пока разбирался с модулями (искал какой-нибудь маленький на МаркетПлейсе для анализа), нашел хороший бесплатный модуль «прокрутка вверх» с неплохим функционалом, который сразу и воткнул на сайт по фотообоям (можно затестить в онлайн режиме).
PPPS
Уфф, если я на каждое подобное изыскание буду пост писать, чувствую до вершин программирования я очень долго буду добираться — писанина время жрёт, ужас 🙁
Вот ещё, нашел отличный курс по созданию собственных модулей от Битрикс!