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

Итак после первых плагинов для ВордПресс и джумла пришла пора сделать что-то похожее в Битрикс.

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

И вот так получилось, что свежие мозги прошлись по ВордПрессу, Джумла и теперь взялись за Битрикс.

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

Главное отличие отечественной CMS — оплата вперед

Итак не нужные проблемы у Битрикс начинаются уже на этапе установки, разработчики как бы говорят вам — нафига ты сюда лезешь (это наша корова и мы сами доить ее будем).

Проблемы с установкой

Имеется ввиду, что так называемая демо версия (на месяц) виснет при установке и до конца ну никак не доходит.

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

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

В нашем случае установка падала в файле random.php в функции getStringByCharsets:

Скрытый текст

public static function getStringByCharsets($length, $charsetList)
{
	$charsetVariants = strlen($charsetList);
	/*$randomSequence = static::getBytes($length); // 117 строчка$result = '';
    for ($i = 0; $i < $length; $i++)
    {
    	$randomNumber = ord($randomSequence[$i]);
    	$result .= $charsetList[$randomNumber % $charsetVariants];
    }*/
  return "sdfdsfsdfdsfd";//$result;
}

Как видно выше мы тупо закомментировали почти весь код и просто возвращаем теперь не рандомную какую-то последовательность символов, а просто от балды константу «sdfdsfsdfdsfd».

И это сработало установка прошла далее гладко. О чем это говорит? Тестирование своих продуктов в битрикс «оставляем желать лучшего».

Но как мы знаем любая CMS это просто набор файлов php и некоторых других типов файлов, расписанных по разным каталогам по задуманной разработчиками какой-то их субъективной логике.

Таким образом мы копируем один рабочий сайт на Битриксе к себе на локалхост. Он заводится в целом без проблем, мы его обновляем из админки, все пока хорошо.

Огромное количество файлов

Но вот, что бросается в глаза, в чем отличие Битрикс, это огромное количество файлов и каталогов, у нас при скачке получилось около 230 тысяч. Соответственно это заняло не просто большое количество времени, а огромное. Пришло дома , где интернет 100МБс, скачать на диск и уже на работе с диска устанавливать. Это я к тому, что с джумлой и вордпресс у вас таких проблем не возникает.

Огромное количество таблиц в базе данных

Но без базы данных ничего не работает (как мы знаем) и это отдельная проблема, так как в Битрикс и количество таблиц в базе данных очень много, больше 200. И нам пришлось скачивать базу частями по несколько таблиц, так как phpmyadmin например не мог загрузить сразу всю базу целиком из файла sql. По другому мы не знали как, но это возможно от не знания, как можно.

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

Переходим к изучению как устроен битрикс

Сразу выясняем, что есть новое ядро D7 и есть старое и вроде как живут они вместе.

Есть каталог bitrix где все, что относится к ядру Битрикс и там лучше не располагать свои самопальные компоненты и модули ибо они затрутся при обновлении Битрикс. А где располагать тогда? Лучше во вновь придуманном каталоге local. Так мы и сделаем.

Много сайтов — один движок, одна база данных

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

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

Нюансы установки и удаления модулей в битрикс

Итак в битрикс надо писать инсталлятор модуля самому (в отличии от вордпресс и джумла например). А именно для этого создается каталог install (как часть состава вашего модуля), где вы и управляете логикой установки и удаления модуля, сами пишете какие файлы в какие папки копировать. То есть вы можете скопировать куда и что угодно и это как-то не есть правильно (безконтрольно).

События

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

init.php

Отличие Битрикс от ВордПресса и джумлы ещё в том, что часть своего кода приходится писать в общих разделяемых файлах, а именно у нас конкретно в local\php_interface\init.php. Как я понял init.php предназначен для подключения своих модулей и компонент.

Таким образом нет полной изоляции от действий других разработчиков, то есть другой разработчик также открывает init.php, добавляет свой код, видит ещё наш код, думает: не из-за него ли глючит его сайт и конечно же удаляет наш код или временно отключает…

Надо учитывать, что если вы создадите init.php каталоге local/php-interface, то в bitrix/php_interface он вызываться уже не будет.

В init.php нам пришлось добавить строчку кода:

require_once( $_SERVER['DOCUMENT_ROOT'] . '/local/modules/paymentacceptance/autoload.php');

Заказ, а админке

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

cc62da93892685975bf6f92e47fe1a23.png/local/modules/paymentacceptance/autoload.php

addJs('/local/modules/paymentacceptance/js/jquery-ui.js');
$loaded = Bitrix\Main\Page\Asset::getInstance()->addJs('/local/modules/paymentacceptance/js/bit_drv_kkt.js');

$APPLICATION->SetAdditionalCSS("/local/modules/paymentacceptance/css/bit_drv_kkt.css");


\Bitrix\Main\EventManager::getInstance()->addEventHandler("main", "OnAdminSaleOrderViewDraggable", array("PaymentAcceptance123", "onInit"));


class PaymentAcceptance123
{
	public static function onInit()
	{

		return array("BLOCKSET" => "PaymentAcceptance123",
			"getScripts"  => array("PaymentAcceptance123", "mygetScripts"),
			"getBlocksBrief" => array("PaymentAcceptance123", "mygetBlocksBrief"),
			"getBlockContent" => array("PaymentAcceptance123", "mygetBlockContent"),
			);
	}
		
	public static function mygetBlocksBrief($args)
		{
			$id = !empty($args['ORDER']) ? $args['ORDER']->getId() : 0;

			return array(
				'payments_pickup' => array("TITLE" => "Оплата заказа при самовывозе")
			);
		}
	
	public static function mygetScripts($args)
	{
		$BIT_KKT_TOKEN = COption::GetOptionString('paymentacceptance', 'BIT_KKT_TOKEN');
		if( $BIT_KKT_TOKEN != "")
			$BIT_KKT_TOKEN = "\nvar BIT_KKT_TOKEN='$BIT_KKT_TOKEN';";

		$BIT_BNK_TRM_TOKEN = COption::GetOptionString('paymentacceptance', 'BIT_BNK_TRM_TOKEN');
		if( $BIT_BNK_TRM_TOKEN != "")
			$BIT_BNK_TRM_TOKEN = "\nvar BIT_BNK_TRM_TOKEN='$BIT_BNK_TRM_TOKEN';";

		$BIT_PROG_URL = COption::GetOptionString('paymentacceptance', 'BIT_PROG_URL');
		if( $BIT_PROG_URL != "")
			$BIT_PROG_URL = "\nvar BIT_PROG_URL='$BIT_PROG_URL';";

		$ORDER = $args["ORDER"];

		$orderID = $ORDER->getId();
		if($orderID>0)
			$orderID = "\nvar orderID=$orderID;";
						
		return '';
	}
		
	public static function mygetBlockContent($blockCode, $selectedTab, $args)
	{
		$result = '';
		$id = !empty($args['ORDER']) ? $args['ORDER']->getId() : 0;
		
		if ($selectedTab == 'tab_order')
		{
			$mdl = Loader::includeModule('paymentacceptance');
			
			if ( ! $mdl )
			{

			}

			if ($blockCode == 'payments_pickup')
			{
				$jsn = [];

				$ORDER=$args['ORDER'];

				$sum= $ORDER->getPrice();
				$isPaid = $ORDER->isPaid();
				$basket = $ORDER->getBasket();

				//$basket = $ORDER->getBasketItems();

				$id = \Bitrix\Main\Engine\CurrentUser::get()->getId();
				$bb = \Bitrix\Main\Engine\CurrentUser::get()->isAdmin();
				$login = \Bitrix\Main\Engine\CurrentUser::get()->getLogin();
				$fio = \Bitrix\Main\Engine\CurrentUser::get()->getFullName();
				
				$purchases=[];
				foreach( $basket as $kk => $itm)
				{
					$item=[];
					$item["productName_1030"]= $itm->getField('NAME');
					$item["price_1079"]= $itm->getPrice();
					$item["qty_1023"]= $itm->getQuantity();
					//$item["getWeight"]= $itm->getWeight();
					$item["getVatRate"] = $itm->getVatRate();
					$item["unit_2108"]=0;
					$item["paymentFormCode_1214"]=2;
					$item["productTypeCode_1212"]=3;
					$item["tax_1199"]= 6;
					//$item["additionalAttribut_1191"] = "что-то дополнительное";
					
					$purchases[] = $item;
				}
				$jsn ["purchases"] = $purchases;


				$jsn ["cashierInn_1203"] = $fio;
				$jsn ["taxationType_1055"] = 5;
				$jsn ["receiptType_1054"] = 1;
				//$jsn ["sendToEmail_1008"] = "";
				$jsn ["electronically"] = false;

				$json_data = json_encode($jsn ,JSON_PRETTY_PRINT| JSON_UNESCAPED_UNICODE);
				$result = 'Заказ № '.$id.'
Сумма к оплате: '.$sum.' 

'; } } $aaaa= 123; return $result; } }

У нас тут реализовано например оплата наличными или по карте при самовывозе.

На гитхабе мы как обычно выложили этот модуль для битрикс, можно скачать, установить и даже пользоваться https://github.com/PavelDorofeev/API-receipt-fiscalization-for-CMS-and-CRM.

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

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

Вопрос знатокам:

  1. Можно ли не редактировать init.php, а как-то добавить из админки старт своего модуля, чтобы он автоматически загружался?

© Habrahabr.ru