В предыдущих двух частях мы создали альтернативный шаблон для формы  обратной связи «Задать вопрос» и добавили в него позицию. Создали и проект самой формы в панели управления Chronoforms 6, полностью настроили его и протестировали.

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

Передача заголовка и ссылки материала Joomla для форм Chronoforms 6 с помощью шоткодов

На данный момент в Chronoforms 6 существуют две команды chrono syntax, как раз подходящие для нашей цели — {page:url} и {page:title}.

Эти два шоткода гарантируют нам выполнение именно нашей задачи. Других параметров у {page:} нет.

Дело в том, что в более ранних версиях Chronoforms 6 в списке шоткодов эти команды присутствовали. А сейчас же разработчики убрали их по неизвестной нам причине из данного списка, но функционал для них в файле www\libraries\cegcore2\admin\extensions\chronofc\helpers/parser.php остался и работает.

Думаю, не нужно объяснять, почему с каждым дальнейшим обновлением компонента Chronoforms 6 целесообразно следить за этой частью содержимого файла или, по крайней мере, за работой самих форм, в которых используются команды {page:}.

Мы также будем отслеживать этот момент и уже добавили команду {page:} и ее описание в статью «Шоткоды» раздела «Документация». Если она перестанет работать, мы сообщим об этом на сайте и произведем в статьях раздела «Документация» соответствующие изменения.

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

Переходим во вкладку «Конструктор», выбираем и размещаем в области секции формы два элемента «Hidden field» из группы «Extras». Я разместила их сверху, но местоположение этих элементов для нашей задачи значения не имеет.

Размещение скрытых полей hidden во вкладке Конструктор на форме CF6

Рис. 1

Настройка обоих  (field_hidden9 и field_hidden9) сводится к размещению в их полях «Значение»  кода соответствующей команды {page:}. В итоге, должно получиться так:

Получение и вывод параметров текущего материала Joomla на форме Chronoforms 6 с помощью команд chrono syntax

Рис. 2

Немного о том, почему мы использовали дополнительные элементы на форме:

Дело в том, что функция, вызываемая кодом вставки {page:url} получает текущую ссылку страницы, а при наступлении события «submit» к этой ссылке добавляются все текущие параметры формы (т. е. знак «?» и все то, что после него). Это нас решительно не устраивает, поэтому нужно текущий url-адрес материала Joomla получать при загрузке страницы и где-то хранить его в неизменном виде.

Заголовок же материала, полученный с помощью {page:url}, остается неизменным, независимо от событий формы и результатов их обработки прочими скриптами. Его добавление на форму и хранение значения вообще некритично. Это сделано исключительно «для порядка».

Со вкладкой «Конструктор» закончили. Сохраняем текущие изменения, переходим во вкладку «Настройка» и открываем для редактирования функцию «Email» (элемент «email7»).

Здесь остается только подставить значения ({data:hidden9} — заголовок статьи и {data:hidden10} — ссылку на статью) в поля «Тема» и «Тело документа» соответственно.

Должно получиться следующее:

Подстановка значений команд chrono syntax в поля функции Email в CF6

Рис. 3

Все сохраняем и закрываем редактор формы.

Осталось только протестировать отправку и получить сообщение с сайта.

Сообщение с сайта от формы Chronoforms 6 с параметрами текущей статьи Joomla

Рис. 4

Я открыла статью в списке «подопытной» категории, кликнула по кнопке «задать вопрос», заполнила все поля и получила такой результат (см. рис. 4).

И заголовок, и ссылка на текущую статью соответствуют действительности. А это значит, что нашу задачу можно считать полностью выполненной.

Но для тех, кто хочет получить больше параметров статьи, будет интересно продолжение «экспериментов». Поэтому рекомендую:

  • сделать резервную копию «на память» нашей формы «Задать вопрос» в ее текущем состоянии, 
  • затем удалить поля hidden9 и hidden10 во вкладке «Конструктор»,
  • удалить все, что мы добавляли в тело документа в обработчике «Email» с именем «email7» (см. рис. 3 этой статьи)

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

Извлечение параметров текущей статьи Joomla для формы CF6 из базы данных сайта

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

Чтобы оценить весь масштаб работы по извлечению параметров текущей статьи Joomla из БД, для начала, откроем базу данных нашего сайта в phpmyAdmin.

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

  • «title» — это поле хранит заголовки всех статей сайта (за исключением тех, что могут храниться в таблицах прочих расширений, например, virtuemart, CjBlog и т. п.);
  • «publish_up» — поле со всеми соответствующими датами публикации материалов;
  • «metadesc» — краткое описание содержимого статей Joomla, которое включается в поле метатега «description»;
  • «hits» — общее количество просмотров материала с момента его создания.

Ссылку на текущую страницу мы также получим, но другим методом.

А для нашего списка полей получается вот такой запрос к базе данных:

    SELECT title,publish_up,metadesc,hits FROM `xxxxx_content` WHERE id=идентификатор_статьи

Можно протестировать этот запрос к базе данных сайта с помощью phpmyadmin во вкдалке «SQL», подставив идентификатор любой существующей статьи вместо «идентификатор_статьи» и префикс своей БД вместо xxxxx в имя таблицы `xxxxx_content`. Если все сделано правильно, то база данных отдаст одну строку, содержащую все требуемые значения:

Результат выборки по простому запросу MySQL из базы данных сайта в phpmyadmin

Рис. 5

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

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

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

Итак, мы уже «очистили» форму от манипуляций, связанных с применением предыдущего приема, и теперь приступаем к реализации способа извлечения параметров текущего материала Joomla из базы данных сайта в редакторе компонента Chronoforms6.

Первое, что нужно — это получение текущего ID статьи.

Для этого пригодится элемент «PHP» из группы «Logic» во вкладке «Настройка», который мы разместим в самом верху (!!!) области события «load» формы.

В поле «Код» нужно разместить следующие строчки:

    $view = JRequest::getVar('view');
    $article_id = null;
    
    if ($view == "article") {
    $article_id = JRequest::getInt('id');
    }
    return $article_id;

Таким образом, с помощью Joomla API и php-кода мы получим идентификатор текущей страницы, где расположена форма обратной связи.

Теперь главный элемент, с которого начинается любая работа, связанная с манипуляциями данными в формах обратной связи Chronoforms 6 — функция-обработчик «Read Data». В большинстве случаев он должен находиться в теле кода обработчика события «load». Наша форма — не исключение, поэтому поместим эту функцию ниже (!!!) функции «PHP», и сразу же произведем некоторую предварительную настройку.

Открываем элемент «read_data9» для редактирования и переходим во вкладку «События».

Добавление события в функцию Read Data в CF6

Рис. 6

Здесь нужно поставить галочку на событии успешной выборки данных.

Поясню, для чего это нужно.

Мы проделывали достаточно большой объем работ единственно для того, чтобы получить параметры текущего материала Joomla для нашей формы обратной связи. Поэтому логично было бы сделать так: «нет параметров — нет формы». Посему предлагаю отображать форму по событию успешной выборки из базы данных и переместить элемент-функцию «display-section1» в тело собственного, добавленного уже в ходе вышеописанной настройки, события «found» элемента «read_data9».

Теперь содержимое события «load» формы будет включать две функции:

Cодержимое события «load» формы CF6 на текущем шаге

Рис. 7

Запрос SQL в нашем случае — простой, поэтому настройка функции «Read Data» также не представит сложностей. Она будет включать всего одну модель (таблицу базы данных).

Настройка функции Read Data для  формы CF6

Рис. 8

Настроек у элемента-функции «read_data9» получается всего пять. Рассмотрим их подробнее:

  1. «Таблица БД» — здесь нужно выбрать таблицу «content» в списке, куда подгружаются названия всех таблиц базы данных сайта.
  2. «Имя модели». Значение этого поля генерируется по умолчанию, но его необходимо исправить. Каждая таблица БД является моделью и имя модели должно полностью соответствовать имени таблицы, которая подключается при настройке этой самой модели.
  3. «Условие выборки» (where). Это поле настроек отвечает за фильтрацию считываемых записей по указанному параметру. В нашем, предварительно созданном SQL-запросе это вся правая часть после слова «where». Здесь ограничение устанавливается по идентификатору, в соответствие которому ставится значение текущего id статьи (его мы получили в результате выполнения функции с именем «php8»).
  4. «Тип выборки» отвечает за формирование структуры массива выходных данных. В данном случае известно, что результатом будет всего одна запись, поэтому нецелесообразно создавать лишнюю нагрузку и продолжать выборку после получения результата. Устанавливаем в этом поле значение «Первая совпадающая запись».
  5. «Поля для считывания» — многострочный список полей таблицы БД из нашего SQL-запроса (title, publish_up, metadesc, hits), где каждому элементу отводится одна строка. Синтаксис элемента списка такой: имя_модели.имя_поля.

Заканчивая с настройкой функции «read_data9», мы полностью сконструировали наш предварительный SQL-запрос к базе данных сайта.

Если неправильно настроить обработчик «Read Data», то при обновлении страницы на сайте, она сразу же отдаст соответствующую ошибку. Но если все в порядке, форма будет отображена на сайте.

Таким образом, извлекли все необходимые параметры текущей статьи Joomla из базы данных сайта для нашей формы. Но эти данные нужно где-то хранить. И теперь мы знаем, что с этим делать — снова воспользуемся полями с типом «hidden».

Здесь следует отметить, что элементы «hidden» используются именно для условий данного примера (или могут применяться в любых подобных случаях). Но цели и структуры проектов форм обратной связи Chronoforms могут серьезно отличаться друг от друга. В ряде случаев временное хранение результатов выборки из БД может вообще не потребоваться. Они будут сразу загружаться в целевые элементы (например, «options» в полях «dropdown», «checkboxes», «radio», любые одиночные поля и т. п.).

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

Переходим во вкладку «Конструктор» и добавляем скрытые (hidden) поля, необходимые для хранения результатов выборки из базы данных. Их должно быть столько, сколько полей таблицы БД мы получили при выборке по запросу. У нас таких полей четыре,  плюс одно поле для ссылки.

Как-либо настраивать элементы «hidden» не нужно. Их значения оставляем пустыми.

Размещение новых полей на форме Chronoforms 6 во вкладке Конструктор

Рис. 9

Снова открываем вкладку «Настройка». Значения выборки из базы данных для полей «hidden» будем передавать здесь.

Для этого возьмем функцию «Custom code» из группы «Basic» и поместим ее в тело обработчика события «load» формы, ниже (!!!) функции «read_data9». Таким образом, событие «load» будет включать:

Содержимое события load формы CF6 на текущем шаге

Рис. 10

Настраиваем функцию-обработчик «Custom code» (вкладка «Настройка») для передачи данных в  скрытые поля:

Результаты выборки из базы данных передаются с помощью шоткодов в поля формы Chronoforms 6

Рис. 11

Как видно на рисунке, все результаты выборки из базы данных переданы с помощью тех же команд chrono syntax (шоткодов). Они сократили нам время и трудоемкость процесса.

Значение ссылки мы получили с помощью простого php-кода, а сам URL-адрес статьи передадим в поле уже с помощью Chronoforms API.

    <?php
              //  протокол => имя сервера => адрес страницы
      $link = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
              //  отправляем ссылку в поле hidden13
      $this->data('hidden13', $link, true);
    ?>

Этот код является php-альтернативой команде {data:}.

Когда все необходимые данные текущего материала Joomla собраны и переданы в соответствующие поля, остается только применить их в коде функции «Email».

Открываем обработчик «Email» для редактирования и вставляем в соответствующих местах содержимое полей «hidden». Информации для нашей формы теперь стало больше, поэтому можно переверстать html-код шаблона сообщения.

Вот что получилось:

Html-код шаблона сообщения в Chronoforms 6

Рис. 12

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

И здесь мы познакомились с новым шоткодом — {date:d M Y$(data:hidden10)}. Это один из вариантов использования команды {date:}, который мы применили для форматирования дефолтной даты публикации статьи, полученной из базы данных. Подробнее узнать, что еще она может, можно здесь.

Итак, сохраняем форму и тестируем. Я получила от самой же себя вот такое красивое сообщение:

Сообщение от пользователя, переданное с помощью формы обратной связи Chronoforms 6

Рис. 13

Этот способ изучили.

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

Передача данных текущей страницы на форму обратной связи Chronoforms с помощью Joomla API

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

Для более сложных форм чаще всего в качестве входных значений нужны идентификаторы материала и/или категории. Получить доступ к ним можно так:

    <?php
        $view = JRequest::getVar('view');  // Подключаем view для проверки типа текущей страницы сайта
        $article_id = null;
        
        if ($view == "article") {          // Если страница - статья, то извлекаем ее идентификатор
            $article_id = JRequest::getInt('id');
            $category_id = JRequest::getInt('catid');
        }
                                          // Передача идентификаторов в поля text11 и text12 для хранения
        $this->data('text11', $article_id, true);
        $this->data('text12', $category_id, true);
    ?>

Непосредственно, для получения этих идентификаторов можно использовать и такой код:

    <?php  
        $article_id = JRequest::getVar('id');        // так тоже можно получить ID статьи
        $category_id = JRequest::getVar('catid');    // так тоже можно получить ID категории
    ?>

А вот пример с передачей данных из пользовательских полей материала Joomla:

    <?php
        $context = 'com_content.article';
                                    // Подключаем модель материала
        $article = JModelLegacy::getInstance('Article', 'ContentModel')->getItem();
                                    // Подключаем компонент пользовательских полей
        JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');
                                    // Получаем массив полей
        $customFields = FieldsHelper::getFields($context, $article);
    
        foreach($customFields as $i => $field) {
              $customFields[$i] = $field->value;
          }
                                   // Вывод выбранного значения элемента массива в одиночное поле
        $this->data('text12', $customFields[1], true);
    ?>

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

    <?php
        $doc = JFactory::getDocument(); // Подключаем  документ
        $title = $doc->getTitle();      // Получаем заголовок
        $link  = $doc->getBase();        // Получаем URL-адрес страницы целиком
        $desc  = $doc->getDescription(); // Получаем метатег description
    ?>

А для того, чтобы осуществить передачу на форму всех, рассмотренных выше, параметров текущей страницы Joomla нашего примера, ID материала потребуется обязательно. И если доступ к нему есть, то и эта проблема вполне решаема:

    <?php
        $id      = \JRequest::getInt('id', '');         // получаем id
        $article = \JTable::getInstance('content');     // подключаем компонент
        $article->load($id);                            // получаем объект article целиком
        $title      = $article->get('title', null);     // получаем заголовок
        $hits       = $article->get('hits', null);      // получаем просмотры
        $desc       = $article->get('metadesc', null);  // получаем метатег с описанием
                                                        // получаем и форматируем дату публикации
        $publish_up = date('d M Y', strtotime($article->get('publish_up', null)));
    ?>

Этих приемов достаточно для решения большинства задач, поставленных перед формами обратной связи, причем,  как при работе с CF6, так и для пятой версии.

Местоположение самого фрагмента кода так же имеет важное значение. Например, если нужно, чтобы полученные  данные передавались в качестве значений полей формы, то php-код должен быть размещен в теле обработчика события «load» формы (и желательно, перед функцией «Display Section»). Если же этот фрагмент скрипта должен срабатывать при отправке, тогда наоборот:  нужно поместить соответствующую функцию в тело обработчика события «submit». То же самое касается и пользовательских событий формы.

На этом работа по созданию формы обратной связи с получением данных из материала Joomla завершена. Теперь мы умеем:

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

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

 
Добавить комментарий