Как многие уже не раз замечали/жаловались формат "модуль" часто не удобен для различных мелких удобных плюшечек (валидаторы форм, новые поля инфоблоков и т.п.). В связи с этим предлагаю ввести новое понятие, и новый, удобный формфактор для таких вот плюшечек - Гем.
Хочется сказать, что родилось это не из ниоткуда, а в результате долгих душевных страданий вида "ну удобно же, но в модуль оборачивать лень". И сейчас вполне успешно используется на паре-тройке моих проектов. Хотелось бы, чтобы эта "пара-тройка" расползлась и на ваши проекты
По поводу дальнейших планов на развитие можно посмотреть на форуме и в специально отведенном разделе TODO.
Как обещал, выкладываю свой псто о VCS и Битрикс. На истину в последней инстанции он не тянет, но толика здравого смысла в нем, надеюсь есть.
Для самых нетерпеливых: Битрикс повержен
Для менее нетерпеливых: все было не совсем просто, но в итоге система укрощена, а разработанная схема с успехом используется на значительном количестве боевых проектов компании
И да. Цель наших махинаций - получить комбинацию Битрикс+Система Контроля Версий удобную для активной разработки проекта. Подчеркиваю - для разработки, не для бекапов или чего нить еще хитрого
Да не сильно на самом деле. Тут просто дело практики. Задачи то в основном типовые абсолютно: создать инфоблок, создать вебформу, поправить поле в инфоблоке и т.п. Ессно все они делались сто раз и необходимый код уже давно есть и используется копипастой с простой заменой названий/типов полей.
Но в начале - да. Тормозили бывало. Пока раскуришь как через апи сменить какое то поле, или родить инфоблок со списочными полями и т.п. Но теперь таких проблем, а бенефиты миграций - есть
Сейчас на одном большом проекте у нас параллельно работают три разработчика, что вполне себе достижение, ИМХО
А мы создали .hgignore, который поместили над проектом. Таким образом ничего никуда перемещать не нужно - и можно спокойно работать, не затрагивая ядро Файл такого содержания (для редакции Стандарт): syntax:glob bitrix/cache/ bitrix/components/bitrix/ bitrix/image_uploader/ bitrix/images/main/ bitrix/images/install bitrix/images/search bitrix/images/fileman bitrix/js/main/ bitrix/js/fileman/ bitrix/managed_cache/ bitrix/modules/main/ bitrix/modules/bitrix.siteinfoportal/ bitrix/modules/fileman/ bitrix/modules/iblock/ bitrix/modules/blog/ bitrix/modules/forum/ bitrix/modules/photogallery/ bitrix/modules/form/ bitrix/modules/security/ bitrix/modules/search/ bitrix/modules/vote/ bitrix/modules/mobileapp/ bitrix/modules/perfmon/ bitrix/modules/subscribe/ bitrix/modules/socialservices/ bitrix/modules/clouds/ bitrix/modules/seo/ bitrix/modules/translate/ bitrix/modules/bitrixcloud/ bitrix/modules/compression/ bitrix/tmp/ bitrix/panel/main/ bitrix/wizards/bitrix/ upload/blog/ upload/iblock/ upload/resize_cache/ upload/tmp/
Не слишком замудрено? И к тому же у Вас попадает папочка php_intrface вместе с файлами dbconn.php. Учитывая, что в случае неосторожности можно забыть закрыть папку .hg для http доступа, то можно вытащить доступ к Вашей БД.
Я у себя так прописал:
syntax: regexp # не отcлеживаем папку bitrix исключая некоторые папки ^bitrix\/(?!(templates|components|php_interface)) # за папкой components/bitrix следить не надо ^bitrix\/components\/bitrix\/
Может громоздко, но придумать нормально работающей регулярки не вышло. Сейчас советуют все наработки складывать в папку local, но зачастую попадают сайты, где все сложено в папке bitrix.
Всем привет Сразу к делу. На одном проекте у заказчика возникло требование, чтобы на каждой второй странице списка элементов/товаров вместо одного из товаров отображалась реклама.
Т.е. если на каждой странице у нас должно отображаться по три элемента списка, то на каждой четной странице будет отображаться два элемента + 1 рекламный блок, замаскированный под товар.
Естественно возник вопрос как это сделать не сильно ломая Битрикс и не теряя никаких элементов при пагинации.
На чистом SQL задача решается довольно просто: корректной установкой LIMIT. Но на первый взгляд Битрикс в своем GetList не дает возможности установить LIMIT самим. Можно только указать сколько тебе элементов надо и текущую страницу.
Я уже было приуныл, но все таки решил поковырять ядро на авось. И авось оправдался
В недрах CDBResult был найден вот такой кусочек кода:
Битрикс проверяет наличие некоего (недокументированного ) параметра SubstitutionFunction передаваемого и если он есть, то доверяет составление пагинации и нашего заветного LIMIT ему. Ихххаа!!1
Далее дело за малым: написать свою функцию пагинации по нехитрому алгоритму. На каждой второй странице у нас по сути добавляется один элемент. На каждой второй странице = каждый шестой элемент - фейковый. Т.е. по сути у нас добавляется (Общее количество элементов / 5) элементов. Т.е.
//Пересчитываем общее количество записей с учетом того, что на каждой четной странице у нас стоит один фейк элемент
$oResult->NavRecordCount = ( floor( $oResult->NavRecordCount / ($oResult->NavPageSize+$oResult->NavPageSize-1) ) + $oResult->NavRecordCount );
Ну и надо еще высчитать правильное смещение в LIMIT. Оно считается тоже очень просто:
Дальше просто копируем весь оставшийся код CDBResult::NavQuery в нашу функцию после того как мы переопределили все нужные нам параметры. Ну и собственно все. Теперь нашу функцию (назовем ее SD_OneFakeElementOnEverySecondPage) нужно всего лишь передать в любой GetList и она отстроит нам правильную пагинацию и выведет корректное число элементов на страницах.
или я не совсем понял тему, или зачем такие манипуляции? Разе не достаточно было установить количество товаров на страницу -1 и просто добавлять один из похожих по стилю рекламных блоков прямо в массив $arResult?
Как то так получилось, что по моему основному месту работы меня попросили провести презентацию для коллег по цеху. Сказано - сделано. Провели небольшой вебинарчик и все это действо записали "шоб було". Ну и я решил чтоб добро не пропадало выложить его. Авось еще кому пригодится
В видео словами рассказано практически все то же самое, что есть на сайте, с небольшими дополнениями и "вопросами из зала". Так же, в конце есть небольшой мануал по самостоятельному написанию гема.
Всем привет После долго затишья (работа, однако) выпустил новый релиз BitrixGems (1.2.1).
Основной плюшкой этого релиза стала возможность разграничения прав доступа к гемам. Теперь если гем предоставляет административную страницу (метод needAdminPage()), то доступ к его странице можно предоставить определенным группам пользователей, а не только админам. И для этого не требуется никакой модификации гемов! Все берет на себя модуль. Так что если ваш гем выводит административные странички стандартным методом, то у него автоматически появляется эта фича.
Стояла ли перед вами хоть раз задача вывести какое нибудь служебное сообщение пользователю один раз? Например - уведомление об успешности какого либо действия (установка модуля, компонента, фильтра, получение письма и т.п.). Т.е. чтобы сообщение появилось один раз на страничке и больше ни разу.
Если такая задача стояла, то вы наверняка знаете, что по дефолту в Битриксе такого механизма нет. Зато есть в Symfony и других фреймворках. Называется - FlashMessage.
Везде есть, а в Битриксе нет. Печально Т_Т Но благодаря гемам и Александру Клименкову у нас теперь тоже есть такая полезная плюшечка - FlashMessage (неожиданное название, правда?).
Гем, помимо удобного API, предоставляет также и простейший компонент для публичной части сайта для вывода этих сообщений.
Также, гем предоставляет обычную функцию-шорткат для добавления флэш-сообщения:
function BG_AddFlashMessage( $sMessage, $sType = 'OK', $sArea = 'ADMIN' )
Как вы уже могли догадаться гем работает как в публичной, так и в административной части. Из коробки. И не надо никаких танцев с бубнами.
Клево же?
Ну и немножко про релиз.
В этом релизе модуля проведено небольшое обновление административной части модуля (доработан фильтр гемов) и произведено разбиение гемов на три типа: "новый функционал", "компонент" и "сборка".
Новый функционал - это уже знакомые вам гемы, добавляющие крупинку нового в ваш любимый Битрикс.
Компонент - это обертка над компонентом для распространения своего компонента в виде гема через уже знакомый вам модуль (Пока что сыренько - будет доработано в ближайшее время)
Сборка - еще один небольшой синтаксический сахар на обычными гемами. База гемов потихоньку растет и уже сейчас становится ясно, что необходим какой то способ для установки/удаления пачки гемов в один клик. Эту задачу и призван решить новый тип гема - сборка. (Under construction )
Вот как то так.
Впереди еще много интересных нововведений, stay tuned!
Да, есть админка для редактирования материалов (новости, статические страницы, загрузка фоток) и управление каталогом (в простейшей форме пока - свойства, значения свойств, древовидные разделы). Я скоро все это покажу.
разделы сайта (меню на 1-2-3 уровня, можно хоть 10) статические страницы, новости, анонсы, комментарии, контакты, всякие блоки типа вопрос-ответ, настройка прав доступа(если надо), какие-нибудь формы - обратная связь, что-то еще. Иногда каталог товаров (без корзины и валют). Если остается время, можно еще выполнить какие то другие пожелания, например что то сделать на javascript.
В стане гемов - пополнение. На этот раз очень полезный гем от Сергея Лещенко - UserTypeFields_IBlockPack.
Этот гем добавляет в ваш Битрикс пользовательские свойства главного модуля "Связь с элементом" и "Связь с элементом в виде списка".
Вообще эту наработку Сергей довольно давно опубликовал в блогах Битрикса, а я, с его любезного разрешения, обернул ее в гем, потому как сам иногда использую ее и копипастить надоело
ЗЫ: Stay tuned, на выходных полезных гемов поприбавится И в качестве разработчика гемов дебютирует новый человек (не все же мне строгать )
---
Блог группы никак не хочет попадать в общую ленту сообщений, поэтому - кросспост
В новой версии модуля значительно расширено API гемов, а также положено начало созданию автоматических страничек конфигурации гемов.
В API появилась возможность очень удобно и просто биндить свой функционал на стандартные ивенты (events) Битрикс. Достаточно просто внутри гема создать метод с именем event_<Название Модуля>_<Название события>_<Произвольное название метода гема>
public function event_main_OnProlog_SetRules(){}
и гем сам навесит обработчик на событие. Также добавлено RAPID-создание админок для гемов и многое другое. Подробнее опишу в документации чуть позже.
Так же в каталог добавлено два гема по заявкам трудящихся: гем позволяющий управлять файловым меню админки Битрикс (FileStructureMenuBuilder) и гем, реализующий Maintanance mode для админки (AdminAreaRestricter).
-----
Чтобы незамусоривать эту группу сообщениями про BitrixGems, создал спецгруппу - BitrixGems. Собственно этот пост скросспосчен из бложека группы чтобы заинтересованные лица не пропустили В дальнейшем новости проекта буду постить в специализированную группу.
-----
Кстати рекомендую посмотреть код AdminAreaRestricter. Там есть интересный кусочек кода, с помощью которого я внедрил служебное сообщение на все странички админки, не модифицируя при этом ядро
Выпустил новое обновление модуля BitrixGems, немножко упрощающее жизнь разработчикам и бонусом к нему пошел гем SimpleWatermark.
Как понятно из названия гем не уммет ничего, кроме проставления водяного знака. На картинки анонса и/или детального описания элемента инфоблока. Так же можно выбрать положение водяного знака и прозрачность. Естесственно можно задавать неограниченное количество водяных знаков на любые инфоблоки и т.п.
Вчера понадобилось по работе и оформил в гем. Может кому еще пригодится
ЗЫ: скоро функционал базового гема будет еще расширен на предмет упрощения написания обычных гемов и также выведу phpDocumentor на морду сайта и будет всегда актуальная документация ^_^
В свежем обновлении как раз добавил класс с хелперами для админки, который будет расширяться в дальнейшем, в сторону упрощения.
Так не бывает. Со временем АПИ вашей админки разростется до приличных объемов, что новичку помимо битриксового придется разбираться и вашем, затем писать свои хелперы и надстройки, чтобы ему стало проще и т.д. А вы ведь не этого хотите, правда?
Абсолютно не хочу. Не совсем ясно выразился. Это хелперы вида - кошерный GetIBlockDropdown и т.п. Т.е. они не АПИ в нормальном смысле этого слова, а действительно хелперы. То как должны бы были работать стандартные функции.
Ну и тут еще момент тот, что эти хелперы нужны прежде всего мне, а не разработчику гема. Потому что разработчику гема для создания простой страницы конфигурации уже достаточно просто указать конфигурационный массив в специальном методе.
К примеру админка гема AdminAreaRestricter выглядит в геме как:
public function needAdminPage(){
return true;
}
protected function getDefaultOptions(){
return array(
'enabled' => array(
'name' => 'Ограничение доступа включено',
'type' => 'checkbox',
'value' => 'N',
'options' => array('Y' => 'Включено'),
),
'errorText' => array(
'name' => 'Текст выводимого сообщения',
'type' => 'textarea',
'value' => 'Администратор сайта временно запретил доступ к админиcтративному разделу.',
),
'allowedUserGroups' => array(
'name' => 'Доступ разрешен следующим группам пользователей',
'type' => 'select|usergroup',
'multiple' => true,
'value'=> array(),
),
);
}
И все. Админка автогенерится по указанному массиву. А чтобы работали типы свойств вида 'type' => 'select|usergroup' мне и нужны эти хелперы.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».