- Как создаются шорткоды? Пример простого шорткода
- Итак, как же создаются шорткоды?
- Давайте пройдем все эти шаги создания шорткода
- Делаем все по аналогии с любым другим кодом
- BitrixFramework: берем все в свои руки
- Для начала расставим все точки над ‘i’
- Знакомьтесь, Juggernaut!
- Зачем это надо?
- Компоненты
- Виджет
- Роутер
- Автозагрузка классов
- ActiveRecord
- Hermitage
- Безопасность
- UrlManager
- События
- Что дальше?
- Заключение
Как создаются шорткоды? Пример простого шорткода
Здравствуйте! Сегодня, как и обещал техническая часть использования шорткодов. Применение шорткодов дает возможность, прописав в редакторе одно слово, сопоставить с ним большой код.
Таким образом, можно быстро выводить рекламные баннеры, форму подписки и другие заготовленные вами шаблоны. Это может быть, как код html, так и скрипты.
Итак, как же создаются шорткоды?
Я покажу сам процесс на примере вывода строчки подписи. А вы уже по аналогии сможете создавать и добавлять другие свои шорткоды.
Итак, процесс состоит из 3 этапов:
- Подготавливается код блока, который нужно выводить в теле поста.
- Прописывается функция в файле functions.php вашей темы
- Вставка конструкции (кодовое слово)
Давайте пройдем все эти шаги создания шорткода
Подготовка кода. Например, вот код подписи html.
Его можно просто вставить в статью, как это и делается обычно или править в визуальном редакторе. Но наша задача вывести текст подписи с помощью шорткода.
Следующий шаг я сначала объясню, а потом сделаем его.
Итак, находим свою тему и в ней файл functions.php. Это можно сделать локально или из админки блога (Внешний вид — редактор).
Если не уверены, как обращаться с functions.php — делайте сначала локально (или прежде сохраните исходный functions.php.)
Открываем файл functions.php. В самом конце кода файла, перед закрывающим тегом php, имеющим вот такой вид ?> прописываем новую функцию, которая будет выводить наш шорткод.
Вот как она выглядит.
То есть, просто добавляем этот код в functions.php. Затем сохраните измененный файл functions.php, а в админке в визуальном редакторе пропишите слово avtor, заключенное в квадратные скобки. Вот так.
У вас должна после обновления страницы появится фраза «здесь ваш html код или скрипт». Если есть, значит сделали все правильно. Значит саму суть вы уже уловили.
Но нам ведь нужно вывести код подписи html? А в последствии любой другой. Не так ли?
Поэтому давайте вникнем в саму суть этой функции:
Если вы сейчас разберетесь, что за что отвечает, вы сможете создавать свои шорткоды. В данном случае, считайте, что это и есть своеобразный шаблон шорткода.
Все что нужно делать — это менять текст в одинарных кавычках, прописывать новое название для функции вывода и кодовое слово.
Первая часть функции:
Эта и есть сама функция, которая выводит заданный между одинарными кавычками текст «здесь ваш html код или скрипт».
Сама функция имеет название «my» (название вы даете сами, я назвал «my»), затем идет стандартный синтаксис кода php, (скобки) и в одинарных кавычках текст, который будет выводиться в теле поста.
Вторая часть функции:
Это параметры вывода: avtor – кодовое слово, my – как вы уже знаете, название функции.
То есть, в нашем случае, как все работает? Вы обновили файл functions.php с уже прописанной новой функцией и прописали в редакторе админки в квадратных скобках слово avtor.
И вот, в теле поста появилась строчка «здесь ваш html код или скрипт»
Еще раз давайте уясним этот момент. У нас есть функция «my», при обращении к которой с помощью слова «avtor», в теле поста всегда появится то, что прописано в одинарных кавычках.
Вот такой принцип. Теперь по аналогии, чтобы нам вывести подпись, нужно в одинарные кавычки вставить код.
Сохраняем functions.php, обновляем.
В визуальном редакторе, в нужном месте прописываем слово avtor в квадратных скобках. Функция в теме прописана и команда для вывода текста дана.
Делаем все по аналогии с любым другим кодом
Теперь по аналогии можно сделать шорткод для вывода, например, рекламы google или Яндекс. Нам нужен будет код рекламы, затем дать название функции вывода и задать кодовое слово.
Внимание! Для нового шорткода дается новое название функции и новое кодовое слово.
- Для этого идете в админку google adsense или profit-partner , забираете код рекламного блока.
- Опять открываете functions.php, добавляете перед закрывающим тегом новый шорткод. Можете скопировать уже имеющийся и сделать его правку.
- В одинарные кавычки нужно вставить рекламный код.
- Вместо функции «my» придумываете новую, например «google», меняете дважды в первой части кода и во второй.
- Затем придумываете кодовое слово «googlereklama».
- Сохраняете functions.php, обновляете (если локально делаете изменения).
- Пишете в теле поста в googlereklama и у вас появляется реклама.
Qwertypay-Заработок в партнёрках!
Qwertypay – Агрегатор партнерских программ. Регистрируйся и зарабатывай!
specialist.qwertybiz.com
Итак, по аналогии, все что вы придумаете. Например, форму подписки, баннер партнерки, форму Смартреспондера .
В этом деле самая сложная часть – это 1 шаг, а дальше все по шаблону. Даете название функции вывода, текст вывода (код) и кодовое слово.
Цель моего поста показать, как работает шорткод в его простейшей форме, потому что функции могут быть и посложнее. Но саму суть вы должны были уловить.
А я своим подписчикам сделаю подарок. 15% скидку на курс Евгения Попова.
В момент оформления заказа, на последнем шаге, вам будет предложено ввести купон скидки. Вводите SKIDKA_9B8 и будет сделан перерасчет с учетом 15% скидки. Дерзайте! Свой блог я сделал, благодаря этому курсу. У вас также получится.
На этом у меня все. Подписывайтесь на обновления блога .
Превращаем буквы в деньги! — Научитесь зарабатывать, читая статьи в Интернете!
Заработок — это продажи! — Психология продаж в 7 подкастах! Уберите свой страх и внутреннее сопротивление
Источник
BitrixFramework: берем все в свои руки
Очередная суицидальная статья от меня на тему Битрикс, надеюсь в этот раз хабраобщество будет более снисходительно, т.к. здесь все по факту, с кодом, схемками, никакого холивара и все по-честному.
В статье я рассмотрю альтернативу BitrixFramework, которая призвана облегчить жизнь разработчика и как-нибудь повлиять на развитие CMS Битрикс в нужном направлении.
Акция для хейтеров: если напишите комментарий с нормальной критикой и по теме + к карме лично отправлю ;-). Вот вам Вольфыча для затравки, все интересное внутри…
Для начала расставим все точки над ‘i’
Все что написано ниже лично мое мнение и может быть спокойно закидано тапками, но я уверен, что я прав:
- «У Битрикс миллион строк говнокода» — да, бесспорно. Вся проблема заключается в том, что Битрикс поддерживает обратную совместимость (якобы обновив версию 12.0 до 16.5 все будет нормально работать). Зачем они это делают я не знаю (мне кажется никто не знает). Если же говорить про исходники стандартных компонентов (2К строк кода для вывода элементов инфоблока – в порядке вещей), то здесь ребята решили облегчить работу конечным юзерам и предусмотрели все что можно было предусмотреть (и то не факт), при чем все полностью это очень редко когда нужно. Ну и в догонку, на недавнем семинаре разработчик Битрикс сообщил свое отношение к PSR: «Ну что этот PSR, читал я его, собрались какие-то ребята и написали какую-то фигню» (не точная цитата). Так что код будет пахнуть всегда.
- «У Битрикс ужасная структура» — не совсем. Битрикс основан на файлах, и понимание MVC отличается от общепринятого, а для многих «не MVC» = «ужас-ужас какая структура». Так что это весьма спорный и спорный вопрос. И с Битриксовой структурой можно жить.
- «BitrixFramework никогда не будет развиваться» — это уже мое мнение и вот почему: с каждым релизом Битрикс дорабатывает только модуль «Магазин», делают какие-то правки, но все они направлены на магазин. На остальное им откровенно наплевать. Развитие BF начнется, когда они откажутся от обратной совместимости и начнут заниматься не только модулем «Магазин».
Знакомьтесь, Juggernaut!
Наверняка многие знакомы с этим персонажем (из Marvel, не из Dota), которого «невозможно остановить». Слегка пафосное название, на самом деле отражает суть данного проекта: абсолютно безразлично как развивается Битрикс, какие новшества он вводит и что он делает, все равно библиотека будет жить и процветать.
Bitrix нацелен на пользователей. Juggernaut нацелен на разработчиков.
Зачем это надо?
Потому что это надо! Все на самом деле очень логично:
- Битрикс разрабатывают новое ядро (good), но документировать вообще не хотят (bad);
- Битрикс разрабатывают новый функционал (good), но только для магазина (bad);
- Битрикс разрабатывают новые компоненты (good), но от их кода кровь из глаз (bad);
- Битрикс запатентовали «новую» технологию «Композитный сайт» (bad).
Битрикс нужно было с версии 14 просто закончить поддержку старого ядра и сделать основной упор на новом, но нет, «заботятся о клиентах». Бред. Это тоже самое если бы Yii2 поддерживал и обратно совмещал Yii1.
Раз Битрикс никакие подвижки не делает, то их будет делать сообщество (вместо того чтобы ныть, писать в сервис «Идея», и как-то выкручивать используя стандартные компоненты).
Поругали Bitrix, теперь можно приступить и к обзору Juggernaut. Далее начнется обзор составляющих частей библиотеки и краткое описание их использования.
Компоненты
Компоненты – это кирпичи из которых строиться сайт на Битрикс. Компоненты условно разделены на 2 категории: виджеты и роутеры (в нотации Битрикс: «обычный» и «комплексный»).
Виджет
Виджет – это компонент, который тупо делает одну элементарную задачу (выводит форму, список, информацию). Виджет получает на вход данные и каким-либо образом их преобразует. Больше делать он ничего не должен. Виджеты не управляют маршрутизацией, но могут ее использовать.
Порядок выполнения компонента по умолчанию:
По порядку:
- init — инициализирует начальные данные. Преобразует входные параметры ($arParams) в свойства класса;
- onBefore — проводит проверку возможности проведения действия;
- isCachedTemplate — флаг, определяющий есть ли кешированная копия. Если есть — выводит данные кеша, если нет — формирует их (в коде это выглядит несколько иначе, на схеме указано так для простоты);
- initResult — формирует данные для представления ($arResult);
- run — функция непосредственного исполнения виджета. В ней определяется что необходимо сделать с данными ($arResult);
- onBeforeRender — проводит проверку возможности вывода шаблона и выполняет какие либо преобразования (аналог result_modifier.php, хотя можно и им пользоваться);
- render — непосредственный вывод шаблона компонента;
- onAfter — выполнение действия после отработки виджета (аналог component_epilog.php).
Чаще всего достаточно переопределить метод initResult и накидать шаблон компонента.
Ниже представлен пример класса компонента (class.php), который выводит список элементов инфоблока. На вход он получает массив параметров ($params), которые используются для фильтра и сортировки данных.
Роутер
Задача роутера – это сбор виджетов воедино. Роутер — представляет из себя контроллер, который на основе запроса пользователя (REQUEST_URI), вызывает соответствующее действие. Действие может быть либо страницей с информацией (в том числе виджетами), либо содержать какую-либо логику.
Порядок выполнения компонента по умолчанию:
По порядку:
- init — инициализирует начальные данные. Преобразует входные параметры ($arParams) в свойства класса;
- initUrlManager — заполняет UrlManager данные маршрутов (aliases). Это действие необходимо для выполнения маршрутизации по действием и дальнейшей генерацией URL адресов;
- parseRequest — производится разбор запроса UrlManager и определяется какое действие запрошено пользователем;
- existBeforeAction — проверка наличия персонального обработчика onBefore. Если есть действие ‘index’ и есть метод ‘onBeforeIndex’, то будет вызван именно он, иначе будет вызван общий ‘onBefore’;
- onBefore — проводит проверку возможности проведения действия;
- run — функция непосредственного исполнения компонентв. В ней определяется что необходимо сделать с данными ($arResult);
- existMethodAction — проверка на наличие обработчика действия. Если запрошено действие ‘index’ и есть метод ‘actionIndex’, то будет вызван этот метод, иначе роутер попытается вывести представление с именем ‘index’;
- onBeforeRender — проводит проверку возможности вывода шаблона и выполняет какие либо преобразования (в параметрах передается имя действия, поэтому можно настроить персональную проверку);
- render — непосредственный вывод шаблона компонента;
- onAfter — выполнение действия после отработки виджета (аналог component_epilog.php). Работает аналогично с методом ‘onBefore’: если для действия ‘index’ существует метод ‘onAfterIndex’, то будет вызван он, иначе общий ‘onAfter’.
Ниже представлен пример компонента, которые реализует каталог:
- список элементов,
- список разделов
- детальная карточка элемента.
Автозагрузка классов
По данному вопросу много говорить не буду, потому что и так ясно что это очень нужная вещь, просто опишу все работает.
Как реализовано в Juggernaut:
В папке «lib» вы должны соблюдать следующую структуру: имена файлов классов, идентичны именам пространства имен, не включая расширение и верхнего пространства имен. Например, классу «Iblock\Property\Table» будет соответствовать файл «…/modules/Iblock/lib/Property/Table.php».
Вызывать «includeModule» больше не нужно, т.к. при необходимости все классы подгрузятся автоматически из нужных директорий.
Если директория модуля отличается от названия пространства имен, или в любой другой ситуации, можно вручную задать соответствие пространства имен и директории:
У Битрикс тоже реализована автозагрузка, но формирует она путь несколько иначе:
Класс «Olof\Catalog\Tools\File» транслируется как «/Olof.Catalog/lib/Tools/File.php».
Если Вам нужен класс «Olof\Catalog» — то извините, руками указывайте его наличие (см.ниже). Директория модуля у Вас должна быть именно с разделителем «.» иначе гуляйте лесом. При чем директория «olof.catalog.iblock» — является некорректной.
Господа из Битрикс на самом деле сделали нормальную штуку: позаботились об указании вендора в имени модуля, но я считаю это лишнее условие именования директории.
Автозагрузка неявно реагирует на классы вида «ElementTable» удаляя постфикс, транслируя их в файлы «element.php». Собственно, из-за этого, вы не можете создать класс с именем Table.
Также загрузить классы из модулей, которые в данный момент не подключены (includeModule) – нельзя.
Рассмотрим пример работы Битриксового варианта: имеем модуль «olof.iblock» и соответствующий файл include.php:
Слишком много неявностей и условий на мой взгляд. Да и никто не знает, какую глупость Битрикс завтра придумают. А придумать им стоит указание директории для префикса пространства имен (как в PSR-4) и тогда будет круто. А пока есть Juggernaut 😉
ActiveRecord
Для удобства работы с сущностями, а в частности с инфоблоками, реализован шаблон ActiveRecord. На данный момент AR базируется (по факту является надстройкой) на битриксовых DataMapper’ах, в дальнейшем планируется полный перенос на независимый ORM / DAO.
Ниже представлен пример работы с инфоблоками через AR, охвачены практически все, имеющиеся на данный момент, методы.
Методы: getPrimary, getRow, getRowByField, getList, getListByField — идентичны для всех ActiveRecord.
Функционал AR на данный момент достаточно беден (например, нет перекрестного поиска по таблицам), но т. к. они являются оберткой над стандартными функциями, в методах «getList» и «getRow» можно использовать Битриксовые плюшки. После создания / заимствования нормального DAO, этот момент будет допилен.
Hermitage
Сильной стороной Битрикс, и я думаю многие согласятся, является его пользовательский интерфейс a.k.a. «Эрмитаж». Он очень удобен и гибок.
Ниже представлен пример работы с Эрмитажем:
Так похвалил и так мало написал)) На самом деле этого достаточно для взаимодействия с пользователем. Очень много нужно реализовать касаемо административного интерфейса, но это уже не Эрмитаж, и это все в планах.
Безопасность
В Битрикс на сколько я знаю (а в данном вопросе, скрывать не буду, я особо не ковырялся), с безопасностью сайта (именно в коде) вообще грустно (только защита от SI). В будущем данный раздел будет содержать в себе инструменты для защиты от различных атак и вредоносных действий (XSS, генерация случайных данных, различные крипто-функции, валидация форм, работа с паролями, …). На данный момент реализован только инструментарий для защиты от CSRF:
После каждой проверки (удачно или неудачной) – токен из сессии удаляется, таким образом проверить токен можно только один раз.
UrlManager
Маршрутизация в Битрикс, не сказал бы что на высоте, поэтому и эта область затронута в Juggernaut. Данный класс позволяет динамически создавать и использовать URL маршруты (используется в компонентах-роутерах).
Рассмотрим пример парсинга и генерирования URL:
В дальнейшем планируется также подвязаться и к urlRewrite.php.
События
Данный класс является просто оберткой над функциями D7, с более удобным использованием.
Что дальше?
Планы на ближайшее будущее:
- нормальный QueryBuilder
- нормальное кеширование
- нормальный AssetsManager
- набор компонентов для создания и работы с административным интерфейсом
- нормальная маршрутизация (завязанная на HttpException)
Заключение
Много чего задумано, много чего не сделано. Библиотека развивается по мере моей необходимости, поэтому очень зависит от текущих заказов (которое очень часто однотипны) и свободного времени.
Как я уже сказал вначале, проект будет развиваться несмотря ни на что, от количества ее авторов и заинтересованных лиц зависит лишь скорость развития. Так что выбор только за вами:
- ныть, ждать и подстраиваться под Bitrix (а развитие BitrixFramework явно не в приоритете);
- взять все в свои руки и помочь в развитии Juggernaut.
Помочь может каждый желающий филантроп (а иначе никак), для этого нужно:
- поделиться идеей
- рефакторить то что есть
- сделать что-нибудь своими ручками
Проект лежит на GitHub, так что править, добавлять, комментировать и спрашивать может любой желающий.
Спасибо за внимание! Конструктивная критика очень даже приветствуется 🙂
Источник