Parus16.ru

Парус №16
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

ORM в D7 1c-bitrix. Первый подход к снаряду

ORM в D7 1c-bitrix. Первый подход к снаряду

d7

Реализация ORM в ядре D7 — очередная интересная, перспективная, но как обычно плохо документированная разработка от 1с-Битрикс 🙂 Призвана она абстрагировать разработчика от механики работы с таблицами на уровне запросов к БД, введя понятие сущности и поля сущности. На зимней партнерской конференции Алексей Кирсанов провел мастер-класс по созданию модуля с применением ORM для выборки данных из своей таблицы. После чего я решил провести небольшое исследование на предмет возможности построения более сложных, чем в примере, запросов.

Интересовало меня как общее устройство системы и принцип постороения кода, так и частные случаи запросов. Например, можно ли с помощью ORM использовать HAVING, DISTINCT и разные типы JOIN’ов. Забегая вперед, получилось далеко не все, но в общем конструктор эффективен и относительно прост.

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

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

Лайвхак: автоматически сгенерировать класс с описанием любой таблицы можно на странице Производительность-Таблицы, добавив параметр &orm=y в адрес.

Тренироваться будем на таблицах типов инфоблока, самих инфоблоков и элементов. Для них описаны сущности TypeTable, IblockTable и ElementTable, их можно посмотреть в исходниках модуля iblock. Операции добавления, удаления и выборки данных по первичному ключу (getById) нас не интересуют, будем строить обычные getList-запросы произвольного вида через цепочку вызовов методов класса Query.

Пример #1

Выберем 10 первых элементов из инфоблока >

Пример #2

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

Читайте так же:
Бесплатные приложения для продвижения инстаграм

Пример #3

В запросах можно использовать агрегатные функции mysql. Для это служит метод registerRuntimeField, регистрирующий новое поле на время выполнения запроса.

Подсчитаем количество элеметов с группировкой по имени.

Пример #4

Допустим, нам нужно в предыдущем примере ограничить выборку только теми названиями, которые встречаются более 5 раз. Написав фильтр по агрегатному runtime-полю, битрикс автоматически переносит его в условие having! Причем в параметрах группировки не обязательно указывать поле, к которому применяется агрегатная функция.

Будет сгенерирован запрос вида:

Пример #5

Через сущность «элемент» можно выбирать или ставить условия на поля связанной сущности «инфоблок». Связанная таблица по умолчанию присоединяется с помощью left join. Вспомним reference-поле IBLOCK в описании ElementTable и выберем название инфоблока с через таблицу с элементами:

Пример #6

Runtime- может быть не только вычисляемое поле, но и ссылка на другую сущность. Т.е. в функции getMap мы можем не описывать связь, а сформировать ее прямо в запросе. Например, создадим объект Query для сущности IblockTable, свяжем ее с ElementTable и выберем элемент с >

Небольшая особенность — в setSelect нужно обязательно указывать runtime-поле, что добавляет в select все поля связанной таблицы.

Пример #7

В определении runtime-reference-поля можно указывать тип join’a, а в фильтре использовать сложную логику как в CIblockElement::GetList():

Пример #8

Если несколько таблиц в описании сущностей (не через runtime-поля!) связаны по цепочке, то их можно использовать в запросе через символ «.». Например, выберем ID типа инфоблока для элемента с >

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

GetElementById как работает пример

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

Читайте так же:
База данных для автосервиса

Давайте в самом начале определим, «Что такое GetElementById«.

GetElementById — это метод, с помощью которого можно обратиться к элементу страницы по его идентификатору «id»

Как переводится GetElementById

«By» — из(в контексте), «id» — идентификатор селектора .

Итого получилось перевод – «GetElementById» — получить элемент из идентификатора.

Синтаксис getElementById:

Если мы сможем обратиться к тегу, то далее можем с ним и его внутренностями и внешностями делать все, что нам вздумается!

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

Для того, чтобы показать работу метода GetElementById сделаем див(div) с id example и текстом внутри

Далее нам нужна кнопка при нажатии на которую должно срабатывать событие onclick

Сооружаем такую конструкцию, пишем document.getElementById, во внутрь кавычек помещаем наше название id-> example. И нам например нужно получить все содержание между тегами данного ид добавляем с точкой innerHTML. Полученную конструкцию оборачиваем скобками и выведем на экран результат получения данных с помощью getElementById

Соберем весь код вместе:

<button onclick="foo();">Получи данные с помощью GetElementById</button>

<script> function foo() <

Живой пример получения данных с помощью GetElementById:

Получение value с помощью GetElementById

Как отправить данные с помощью GetElementById

Для того, чтобы отправить данные в тег, как мы уже неоднократно говорили нужно обратиться к тегу, мы на данной странице используем для этого GetElementById

Нам в очередной раз понадобится тестовый блок/элемент с id:

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

Соберем весь код вместе:

<button onclick="foo_2();">Нажми на меня 3</button>

Живой пример передачи данных в тег с помощью getElementById

Получить название класса через GetElementById

Мы хотим получить название класса внутри тега!

У нас есть элемент/блок с id

Нам нужна кнопка, чтобы увидеть получения названия класса вживую:

onclick сделаем немного по другому:

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

Соберем весь код вместе:

<div блок с классом = example_class"</div>

<button название класса через GetElementById</button>

Читайте так же:
Вконтакте моя страница вход восстановить

id_example . onclick = function()<

Живой пример получения названия класса с помощью GetElementById

Многие темы перекликаются между собой.

Получить содержание style через GetElementById

Для того, чтобы получить значение атрибута style, нам понадобится очередной блок/элемент с id:

Нам опять понадобится кнопка для получения теперь уже данных из атрибута attribute style

Скрипт абсолютно аналогичный, см.выше.

Внутри скрипта, чуть изменим содержание добавим после скобок style.cssText:

Соберем весь код вместе

<div style="display:block">Здесь блок с style="display:block"</div>

Статьи 1С Битрикс | Пример создания компонента

В этой статье предпринята попытка пошагово описать процесс создания простого компонента для 1С Битрикс с минимальным использованием функционала старого ядра и максимально близко к принципам написания кода на D7.

Репозиторий примера можно посмотреть тут

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

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

В папке /bitrix/components можно создавать свои папки, в терминах битрикса это называется “пространством имен”, так например при установке модулей из Маркетплейс модули партнеров скопируют свои компоненты именно в эту папку, предварительно создав в ней свое “пространство имен”.

Не путайте термин “пространства имен” в рамках Битрикса и пространства имен PHP этот термин остался в Битриксе исторически и нам придется с этим мириться.

Так же компоненты можно разместить в каталоге /local/components в этой папке нужно так же создать свое “пространство имен” в виде отдельного каталога в котором и разместить свой компонент.

Для размежения локальных компонентов, которые пишутся под конкретный проект, а так же для кастомизации стандартных компонентов Битрикса нужно использовать именно папку /local/components

Для нашего примера будем использовать папку ‘example’ в качестве “пространства имен”, а назовем компонент compsimple таким образом итоговый путь к файлам разрабатываемого компонента будет таким: /local/components/example/compsimple .

Читайте так же:
База данных клиентов банка

Структура файлов и папок компонента

Основной файл компонента к которому происходит обращение при подключении компонента на странице и в котором находится точка входа в логику работы компонента class.php .

Следующий по важности файл .description.php он содержит описание компонента и путь для его отображения в интерфейсе системы.

Принято выносить языкозависимые тексты в языковые файлы поэтому нам нужна папка lang в которой будут находиться папки с кодами языков, в нашем случае только ru в ней должен быть еще один файл .description.php , а он уже содержит массив с переводами текстов.

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

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

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

Итоговая структура файлов и папок используемых в примере выглядит так:

class.php

В файле class.php должен располагаться класс компонента унаследованный от CBitrixComponent .

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

Пример содержимого нашего файла:

.description.php

В принципах описания компонента ничего не меняется почи с времен появления БУС. Тут относительно подробное описание структуры файла.

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

  • Разместить компонент в ветке на ровне с остальными основными ветками

Результат:

Разместить компонент в ветке на ровне с остальными основными ветками

  • Разместить компонент в дочернюю ветку

Результат:

Разместить компонент в дочернюю ветку

Пример файла языковых констант lang/ru/.description.php :

.parameters.php

Для отображения полей для передачи параметров в форме настроек компонента предназначен файл .parameters.php. Он содержит в себе массив с определением типа и значений входных параметров компонента.

Читайте так же:
Быстрый плеер для просмотра видео

Языковой файл lang/ru/.parameters.php

Шаблон компонента

Компонент может содержать множество шаблонов. Шаблон по умолчанию находится в папке .default и именно он отрабатывает, если приподключении компонента оставить имя шаблона пустым.

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

Передача лидов с сайта в CRM BITRIX 24

Нужно передать данные формы сайта в лиды Crm Bitrix24. Форма отправляется методом POST. Язык сайта:PHP.

ПолеПеременная
Имя$_POST[“NAME_CALLBACK”]
Телефон$_POST[“PHONE_CALLBACK”]
Электронная почта$_POST[“EMAIL_CALLBACK”]
Метка UTM_SOURCE$_POST[“UTM_CALLBACK”]

Передачу будем организовывать через функцию php curl_exec()- выполнение запроса cURL .

Вариант 1

Сперва сделал через crm/configs/import/lead.php

[ИМЯ].bitrix24.ru – Имя СРМ Битрикс 24

[логин]– логин пользователя в CRM

[пароль]– пароль пользователя в CRM

TITLE– Название лида (обязательное)

PHONE_WORK– Рабочий телефон лида

EMAIL_WORK– Рабочая почта лида

ASSIGNED_BY_ID – ид отвественного

SOURCE_ID= Источник лида, здесь SOURCE_ID=WEB – веб сайт

UTM_SOURCE – метка UTM_source

К недостаткам этого варианта можно отнести небезопасность – в запросе передаются данные пользователя СРМ . У пользователя должны быть права только на добавление лида.

Также не предаются метки UTM, поэтому пришлось воспользоваться вебхуком.

Вариант 2 ВЕБХУК

В CRM Bitrix 24 выбираем Приложения, вкладка Вебхуки, добавить ВебХук – Входящий

Вводим название, описание и отмечаем галку CRM. После сохранения появится код вебхука и пример URL, который нужно использовать при отправке данных в СРМ Битрикс24.

На основании полученного кода вебхука и примера формируем запрос к Битрикс24:

$Url = ‘https://[ИМЯ].bitrix24.ru/rest/[id пользователя]/[код вебхука]/crm.lead.add.json‘;

При тестировании данного способа выявилось, что некоторые поля поменялись. PHONE_WORK и EMAIL_WORK теперь нужно передавать как маcсивы PHONE и EMAIl

В итоге код PHP по отправки лидов СРМ Битрикс 24 выглядит следующим образом:

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector