14 заметок с тегом

1С-Битрикс

Консоль, «Битрикс» и непрерывная интеграция

И снова вести с полей открытого кода. В начале года я опубликовал «Консольный Джедай» для «1С-Битрикса». Он содержит широкий набор консольных команд, позволяет легко подружить сайт с системной непрерывной интеграции, а так же писать нормальные агенты для «Битрикса». «Джедай» построен на компоненте «Симфони-консоль»: аккуратный код, хорошая функциональность и широкий выбор сторонних консольных команд гарантирован.

Коротко о том, почему стоит начинать разработку проекта с установки «Джедая»:

  1. Управляйте настройками окружений, в котором может работать сайт.
  2. Оперируйте мощным, удобным АПИ для создания агентов.
  3. Используйте инструменты для подключения к системе непрерывной интеграции.
  4. Концентрируйтесь на логике приложения, а не index.php-портянках с нетривиальным подключением ядра.

На «Бэксе» есть вводная статья, а на «Ютубе» видео доклада с вебинара «Опенсорс-решений для „1С-Битрикса“ — 2016». Эти материалы и документация помогут лучше познакомиться с библиотекой.


«Джедай» уже используют в бою: агентство «Нотамедия», студии «Артикул-медиа», «Максимастер» и «Цитрус», порталы «Новый Калининград» и «Главная дверь».


composer require notamedia/console-jedi

Репозиторий

Интернационализация инфоблоков

Недавно я сделал модуль интернационализации инфоблоков «1С-Битрикса». В интерфейсе панели управления появляется кнопка создания элемента на другом языке. При этом, все записи одного элемента разных языковых версий будут иметь один и тот же публичный идентификатор, что позволит сделать на сайте переключалку между языковыми версиями материалов.

Для того, что бы инфоблок стал интернационализированным, его необходимо сконвертировать с помощью АПИ модуля:

<?php

use Bitrix\Main\Loader;
use Notamedia\i18n\Iblock\Converter\IblockManager;

// 1. Installation module notamedia.i18n

// 2. Convertion info block
if (Loader::includeModule('notamedia.i18n')) {
    $iblockId = 1; // ID of your info block

    $manager = new IblockManager($iblockId);
    $manager->convert('PUBLIC_ID', 'LANG', 'ru');
}

«Битрикс» я стараюсь не использовать, а его «инфоблоки» и подавно, но появилась задача довольно быстро и просто сделать интернационализацию инфоблока с небольшим объёмом данных. Поэтому, у модуля отсутствует интерфейс для конвертации инфоблоков, нет юнит-тестов. Возможно, кто-то будет использовать модуль для решения подобной задачи и даст ему второе дыхание.


composer require notamedia/bitrix-i18n

Репозиторий

Конвертацию инфоблоков рекомендую производить через миграции БД.

2016   1С-Битрикс   веб-разработка

«Композер» или непростой путь к ядру «Битрикса»

Выпустил версию 1.0.24 «Композер-установщиков». Полный список изменений вы можете найти в отчёте о релизе, но остановлюсь подробнее на двух обновлениях:

  1. Силами Роба Лоача библиотека переписана под ПСР-4.
  2. В «Битриксе» «Композер» теперь может находиться в корне проекта, даже если каталог с ядром находится глубже:
s1/
     bitrix/
          components/<name>
          modules/<name>
          templates/<name>
vendor/
composer.json
composer.lock

Для этого нужно всего лишь указать в composer.json вашего проекта путь к ядру:

{
     "extra": {
          "bitrix-dir": "s1/bitrix"
     }
}

По-умолчанию без этой настройки установщик клонирует пакеты в каталог bitrix/*.

2016   1С-Битрикс   веб-разработка   Композер
2016   1С-Битрикс   веб-разработка

Генератор админок «Битрикса»

Несколько лет назад я начал делать сайты на «Битриксе». У меня были проекты СМИ, которым требовались нестандартные интерфейсы, но не было инструментов для их разработки. Тут и там нужно было сделать страницу в админке: то для простого редактирования данных, то с навороченным интерфейсом и функционалом документооборота. Матёрый читатель наверняка уже досадно хмыкнул, читая эти строки, ведь в «Битриксе» это делается с помощью большой портянки в виде ПХП-скрипта, содержащего логику всех КРУД-операций страницы, вперемежку с ХТМЛ-кодом, ЦСС и ЯС. Пример — любая админская страница любого модуля «Битрикса».

ООП?

Генерация административного интерфейса — головная боль битриксоида. Кто-то мирится с этим досадным фактом и идёт по пути написания скриптов-портянок. Другие выносят «генератор» админских страниц в компоненты. Третьи разрабатывают различные обёртки, позволяющие хоть немного привести доработку панели управления «Битрикса» к ООП. Но тем не менее, каким бы решением вы не пользовались, речи об ООП быть не может, и вам так же придётся повсюду вставлять типовые куски кода: подключение ядра, связанных классов и т. п.

Автоматизация?

В «Битриксе» в принципе отсутствует роутинг страниц, основанный на единой точке входа. Под каждую новую страницу на сайте нужно создавать новый ПХП-файл. Тоже самое касается и админки. Сделали новую страницу для админки? Даже не думайте, что этим всё закончится! «Битрикс» не умеет забирать админские страницы из модуля. Ваш модуль при установке или обновлении должен создать эту страницу в каталоге bitrix/admin.

Решение есть!

Мой товарищ — Алексей Волков из «Цифровой палки» — летом прошлого года опубликовал бета-версию генератора админских страниц с немудрёным названием «Админ-хелпер».

Модуль реализует подход шаблона проектирования МВЦ в создании страниц для панели управления «Битрикса». Если у вас есть модель, написанная на ОРМ «Битрикса», вы за считанные минуты сможете сделать раздел для управления данными этой модели, ничем не уступающему по своим возможностям и внешнему виду интерфейсу управления элементами инфоблоков.

Стоит сразу же оговориться: единственный недостаток генератора на данный момент — отсутствие бизнес-процессов и документооборота. А теперь перечислю его преимущества:

  • объектно-ориентированный подход,
  • пара минут уходит на создание админки под КРУД-операции с моделью,
  • данные могут храниться где угодно: в отдельной таблице или другой БД,
  • неограниченные возможности по кастомизации интерфейса,
  • нет необходимости копировать ПХП-скрипты в bitrix/admin.

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

  • менеджер сущностей, сохраняющий данные в связанные модели,
  • совместный вывод и управление записями и категориями этих записей,
  • новые виджеты (файлы, элементы инфоблоков, записи из ОРМ, УРЛ, пользователи, визуальный редактор),
  • возможность создания интерфейсов, не завязанных на ОРМ-моделях,
  • объектно-ориентированное описание интерфейса админки.

Ближе к телу

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

Подключите «Админ-хелпер» к своему проекту через «Композер»:

Подключение генератора.

composer require digitalwand/digitalwand.admin_helper

Примера ради, представим, что у вас есть модуль: local/modules/demo.adminhelper. Как вы помните, все классы должны начинаться с неймспейса Demo\AdminHelper, что бы работала автозагрузка классов.

Структура модуля.

В каталоге lib вашего модуля создайте каталог под сущность новостей: demo.adminhelper/lib/news. В нём мы будем размещать всё, что так или иначе связано с сущностью новостей. А всё относящееся к интерфейсу панели управления «Битрикса» — в каталог demo.adminhelper/lib/news/admininterface.

Создадим модель. Подразумевается, что с ОРМ «Битрикса» вы знакомы. Модель предельно простая:

Модель новостей.

<?php

namespace Demo\AdminHelper\News;

use Bitrix\Main\Entity\DataManager;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Type\DateTime;

Loc::loadMessages(__FILE__);

/**
 * Модель новостей.
 */
class NewsTable extends DataManager
{
    /**
     * {@inheritdoc}
     */
    public static function getTableName()
    {
        return 'd_ah_news';
    }

    /**
     * {@inheritdoc}
     */
    public static function getMap()
    {
        return array(
            'ID' => array(
                'data_type' => 'integer',
                'primary' => true,
                'autocomplete' => true,
            ),
            'DATE_CREATE' => array(
                'data_type' => 'datetime',
                'title' => Loc::getMessage('DEMO_AH_NEWS_DATE_CREATE'),
                'default_value' => new DateTime()
            ),
            'CREATED_BY' => array(
                'data_type' => 'integer',
                'title' => Loc::getMessage('DEMO_AH_NEWS_CREATED_BY'),
                'default_value' => static::getUserId()
            ),
            'MODIFIED_BY' => array(
                'data_type' => 'integer',
                'title' => Loc::getMessage('DEMO_AH_NEWS_MODIFIED_BY'),
                'default_value' => static::getUserId()
            ),
            'TITLE' => array(
                'data_type' => 'string',
                'title' => Loc::getMessage('DEMO_AH_NEWS_TITLE')
            ),
            'TEXT' => array(
                'data_type' => 'text',
                'title' => Loc::getMessage('DEMO_AH_NEWS_TEXT')
            ),
            // Для всех полей, используемых визивигом, нужно создавать в таблице атрибут с суффиксом _TEXT_TYPE.
            // В нём будет храниться информация о типе сохранённого контента (ХТМЛ или обычный текст).
            'TEXT_TEXT_TYPE' => array(
                'data_type' => 'string'
            ),
            'SOURCE' => array(
                'data_type' => 'string',
                'title' => Loc::getMessage('DEMO_AH_NEWS_SOURCE')
            ),
            // Хранением файлов занимается Битрикс (хотя это вовсе необязательно, вы можете описать свою логику).
            // В атрибуте таблицы будет хранится идентификатор файла.
            'IMAGE' => array(
                'data_type' => 'integer',
                'title' => Loc::getMessage('DEMO_AH_NEWS_IMAGE')
            ),
        );
    }

    /**
     * {@inheritdoc}
     */
    public static function update($primary, array $data)
    {
        $data['MODIFIED_BY'] = static::getUserId();

        return parent::update($primary, $data);
    }

    /**
     * Возвращает идентификатор пользователя.
     *
     * @return int|null
     */
    public static function getUserId()
    {
        global $USER;

        return $USER->GetID();
    }
}

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

Описание интерфейса.

<?php

namespace Demo\AdminHelper\News\AdminInterface;

use Bitrix\Main\Localization\Loc;
use DigitalWand\AdminHelper\Helper\AdminInterface;
use DigitalWand\AdminHelper\Widget\DateTimeWidget;
use DigitalWand\AdminHelper\Widget\FileWidget;
use DigitalWand\AdminHelper\Widget\NumberWidget;
use DigitalWand\AdminHelper\Widget\StringWidget;
use DigitalWand\AdminHelper\Widget\UrlWidget;
use DigitalWand\AdminHelper\Widget\UserWidget;
use DigitalWand\AdminHelper\Widget\VisualEditorWidget;

Loc::loadMessages(__FILE__);

/**
 * Описание интерфейса (табок и полей) админки новостей.
 *
 * {@inheritdoc}
 */
class NewsAdminInterface extends AdminInterface
{
    /**
     * {@inheritdoc}
     */
    public function fields()
    {
        return array(
            'MAIN' => array(
                'NAME' => Loc::getMessage('DEMO_AH_NEWS'),
                'FIELDS' => array(
                    'ID' => array(
                        'WIDGET' => new NumberWidget(),
                        'READONLY' => true,
                        'FILTER' => true,
                        'HIDE_WHEN_CREATE' => true
                    ),
                    'TITLE' => array(
                        'WIDGET' => new StringWidget(),
                        'SIZE' => '80',
                        'FILTER' => '%',
                        'REQUIRED' => true
                    ),
                    'TEXT' => array(
                        'WIDGET' => new VisualEditorWidget(),
                        'HEADER' => false
                    ),
                    'SOURCE' => array(
                        'WIDGET' => new UrlWidget(),
                        'HEADER' => false
                    ),
                    'IMAGE' => array(
                        'WIDGET' => new FileWidget(),
                        'IMAGE' => true,
                        'HEADER' => false
                    ),
                    'DATE_CREATE' => array(
                        'WIDGET' => new DateTimeWidget(),
                        'READONLY' => true,
                        'HIDE_WHEN_CREATE' => true
                    ),
                    'CREATED_BY' => array(
                        'WIDGET' => new UserWidget(),
                        'READONLY' => true,
                        'HIDE_WHEN_CREATE' => true
                    ),
                    'MODIFIED_BY' => array(
                        'WIDGET' => new UserWidget(),
                        'READONLY' => true,
                        'HIDE_WHEN_CREATE' => true
                    ),
                )
            )
        );
    }

    /**
     * {@inheritdoc}
     */
    public function helpers()
    {
        return array(
            '\Demo\AdminHelper\News\AdminInterface\NewsListHelper',
            '\Demo\AdminHelper\News\AdminInterface\NewsEditHelper'
        );
    }
}

Обратите внимание на описание полей (секция FIELDS). Каждое поле — это какой-то виджет. Виджеты представляет собой класс, занимающийся выводом представления поля, а так же предобработкой данных перед сохранением модели (но увлекаться этим не стоит, управлением данных должна заниматься модель). Виджеты имеют настройки, с помощью которых ими можно управлять. А если настроек недостаточно, вы без труда можете создать свой или расширить существующий виджет.

Далее нужно создать хелперы, которые будут заниматься «отрисовкой» страниц в панели управления. Хелпер списка новостей:

Страницы в панели управления.

<?php

namespace Demo\AdminHelper\News\AdminInterface;

use DigitalWand\AdminHelper\Helper\AdminListHelper;

/**
 * Хелпер описывает интерфейс, выводящий список новостей.
 *
 * {@inheritdoc}
 */
class NewsListHelper extends AdminListHelper
{
	protected static $model = '\Demo\AdminHelper\News\NewsTable';
}

И хелпер формы редактирования новости:

<?php

namespace Demo\AdminHelper\News\AdminInterface;

use DigitalWand\AdminHelper\Helper\AdminEditHelper;

/**
 * Хелпер описывает интерфейс, выводящий форму редактирования новости.
 *
 * {@inheritdoc}
 */
class NewsEditHelper extends AdminEditHelper
{
    protected static $model = '\Demo\AdminHelper\News\NewsTable';
}

Как видите, всего за пару минут мы написали простую админку управления новостями.

Пример рассмотренного модуля вы можете найти у меня на «Гитхабе». Помните о редакторах, делайте хорошие, удобные интерфейсы в админке, ведь теперь это просто!

2016   1С-Битрикс   веб-разработка

Про «Битрикс-эксперт»

В начале года мы с Игорем Цупко начали работу над проектом под названием «Битрикс-эксперты». Точнее всего его предназначение отражает цитата с нашего сайта:

В сети опубликовано не так много ценной технической информации о «Битриксе».
Наш проект посвящён технологиям, решениям и людям, которые с работают с платформой.
Повышайте свой уровень знаний, присоединяйтесь к экспертам!

Выполняю обещание, рассказываю подробности. Наша цель — объединить экспертов, поделиться накопленными знаниями и повысить технический уровень сообщества, использующего по тому или иному стечению обстоятельств «Битрикс».

Мы публикуем обучающие статьи и проводим встречи сообщества:

На «Гитхабе» есть наша организация с лучшими открытыми решениями для «1С-Битрикса»:

Немного лирики

У меня проект вызывает двоякие чувства. По техническим характеристикам «Битрикс» не способен конкурировать с другими фреймворками (да, компания «1С-Битрикс» позиционирует свой продукт именно как фреймворк), и он затормаживает развитие ПХП-разработчика: я неоднократно сталкивался с тем, что хороший ПХП-стажёр (на «Йии», «Симфони» или др. популярном фреймворке) находится на одном уровне с начинающим ведущим «битриксоидом». Но «Битрикс» имеет большую долю на отечественном рынке ЦМС и, как следствие, тысячи разработчиков, по разным причинам начинающих работать с ним. Так случилось и со мной: «Битрикс» — система (к счастью, не единственная), на которой мне посчастливилось делать отличные, полезные сайты, работая в «Нотамедии».

Кто-то говорит, что «Битрикс» — отстой, на нём ничего нормального не сделаешь, он не следует общепринятым стандартам, а решения, реализованные даже в новом ядре, вызывают чувства ужаса и полного разочарования в платформе. Что ж, иногда я так же думаю и говорю коллегам. Это правда, но это не означает, что вы должны застрять на уровне функционального, не следующего популярным шаблонам проектирования, кода. Всё в ваших руках: изучайте ООП, шаблоны проектирования, технические решения в популярных фреймворках. Совершенствуйте свои знания и проекты. Используйте современные технологии разработки ПО. Не ограничивайте свой кругозор одним лишь «Битриксом» — иначе в вас умрёт программист и вы будете простым кодером.

Присоединяйтесь!

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

2015   1С-Битрикс   веб-разработка

Bex\Tools

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

Откровенно говоря, сейчас этот инструмент является красивым «костылём», если вдуматься в архитектуру инфоблоков «Битрикса» :-) Но работать без него невозможно (идентификаторы записей отличаются на разных площадках: бой, тест, дев и т. д.).

А недавно я выпустил версию 1.x. Концепт и задачи, которые решает Bex\Tools, остались теми же, но появились новые возможности и более удобное АПИ:

  • получение идентификаторов групп пользователей по символьному коду (и наоборот),
  • предварительная генерация кеша, сразу же после внесения изменений в редактируемую запись,
  • запрет на создание инфоблоков и групп пользователей без символьных кодов (выводится человекопонятное сообщение об обязательности этого поля),
  • настройка времени жизни и каталога хранения кеша,
  • удобное АПИ:
<?php
use Bex\Tools\IblockTools;
use Bex\Tools\GroupTools;

// Инфоблоки
$iblockFinder = IblockTools::find('iblock_type', 'iblock_code');
$iblockId = $iblockFinder->id();
$propEnumId = $iblockFinder->propEnumId('PROP_CODE', 'VALUE_XML_ID');

// Группы пользователей
$groupId = GroupTools::findById(3)->code();

Подключить Bex\Tools к проекту проще всего, если у вас установлен «Композер»:

Техтребования
1. ПХП версии 5.4 или старше.
2. «Битрикс» версии 15.0.2 или старше.
3. «Композер».

composer require bitrix-expert/tools

В вики «Гитхаба» находится документация с описанием техтребований, особенностей и возможностей библиотеки.

2015   1С-Битрикс   веб-разработка

Релиз первой версии ББК

cover

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

Нововведения

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

В документации описаны главные особенности проекта и приведены примеры решения ряда типовых и не очень задач. Раздел «Возможности» ознакомит впервые пришедших с ключевыми фичами ББК. «Архитектура» расскажет о структуре сборки и том, как её «готовить». «Примеры» наглядно покажут, как красиво, используя ББК, можно решать задачи по разработке компонентов.

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

Документация хранится на «Гитхабе» в виде маркдаун-файлов. Если вы найдёте неточность или сможете дополнить её, пожалуйста, форкнитесь и сделайте пул-реквест.

Битрикс-эксперты

Относительно недавно мы с Игорем Цупко запустили бета-версию проекта «Битрикс-эксперты», о котором я расскажу вам позже. ББК стал частью этого проекта, что повлекло за собой два изменения: появилась приставка Bex\ в неймспейсах и сайт размещается на платформе «Бекса».

Продолжение следует…

Тем временем, продолжается работа над ББК 2.0. Забегая вперёд скажу, что уже многое сделано и все интересующие могут найти рабочие исходники в соседних ветках на «Гитхабе». Основной особенностью второй версии станет уход от трейтов, на смену котороым придут плагины — классы, подключаемые и выполняемые параллельно с компонентом, но изолированно от него.

ББК — открытый, не имеющий аналогов в битрикс-сообществе проект. Я приглашаю всех желающих принять участие в его развитии. Если вы хотите получить ценный опыт, если вам надоела техническая несостоятельность «Битрикса» — пишите мне на почту: nik@samokhvalov.info. Вместе мы выведем битрикс-разработку на новый уровень качества.

2015   1С-Битрикс   ББК   веб-разработка

Нововведения и правки «Композер-инсталлера»

Недавно поработал над «Композер-инсталлером»: исправил ошибку в «битриксовом» установщике и добавил доступ к консоли. Что характерно, последняя доработка потребовалась для первой.

Доступ к консоли

В Composer\Installers\BaseInstaller добавлено свойство $io, реализация IOInterface. Отныне можно в консоль выводить уведомления, сообщения об ошибках и даже реагировать на действия пользователя. Парочка примеров:

class BitrixInstaller extends BaseInstaller
{
     protected function templatePath($path, array $vars = array())
     {
          $this->io->writeError('<error>Не хочу устанавливаться!</error>');

          while (true) {
                switch ($this->io->ask('<info>Нажми на клаву [y,n,?]</info> ', '?')) {
                    case 'y':
                        // Пользователь ввёл «y»
                        break 2;

                    case 'n':
                        // Пользователь ввёл «n»
                        break 2;

                    case '?':
                    default:
                        // Пользователь ввёл фиг знает что
                        break;
                }
     }
}

Исправления «битриксового» установщика

Для «Композера» существует установщик «битриксовых» пакетов, который умеет размещать в нужные каталоги сайта модули, компоненты и шаблоны. В первой версии установщика «косяк», нарушающий идеологию «Композера»: пакеты размещались в каталоге local/. Почему это неправильно — расскажу чуть ниже.

Пару дней назад я исправил это, добавив ко всему поиск пакетов-дубликатов в local/. «Композер» любезно сообщит и предложит удалить пакеты из старых путей:

И зачем?..

Вообще-то, на сайте «Композера» об этом написано, но всё равно довольно часто слышу и читаю подобные вопросы. Идеология менеджера пакетов такова, что устанавливаемые библиотеки не должны находится под версионным контролем проекта («Гит», «Меркуриал» и пр.), менеджер сам будет управлять ими и отслеживать их изменение. В проекте должны версионироваться только конфигурационные файлы, в случае «Композера» — это composer.json и composer.lock.

С внедрением в «Битрикс» поддержки отдельной директории local/ для собственных разработок, каталог bitrix/ стал аналогом каталога vendor/. bitrix/ должен использоваться для системных файлов и сторонних модулей, пакетов, тем и пр. Чаще всего, он размещается в .vcsignore проекта.

2015   1С-Битрикс   веб-разработка   Композер

«Адреса сайтов»: перезагрузка

«Адреса сайтов» показали себя с лучшей стороны в боевых условиях: с момента создания ещё альфа-версии я применил их на нескольких многосайтовых проектах, что просто отлично легло на инфраструктуру с разработческими, тестовыми и боевыми серверами. К тому же, хелперы для кешированных выборок данных по сайтам ни раз пригодились для всевозможных проверок и перехватчиков событий.

Но с сегодняшнего дня модуль скрыт из публичной части маркетплейса и уже больше никогда не будет опубликован, и на то есть свои архитектурные причины. На смену ему придёт «Сайтовод» — улучшенная и дополненная версия. Следите за новостями.

P. S. Поддержка «Адресов сайтов» по-прежнему продолжается.

2015   1С-Битрикс   веб-разработка
Ранее Ctrl + ↓