Foren / National / Russian / Тех. поддержка / Как подключить функции к полям форм?

Macik
#38809 26. Dezember 2013, 00:06

Если коротко, то не возможно. Т.к. (в обычном случае) не «шаблон управляет кодом», а «код формирует страницу на основе шаблона».Т.е. просто дополнив шаблон не возникнит код, который будет его обрабатывать.

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

[Далее теория применительно к формам и их использованию, просто чтобы понимать всю механику работы…]

Как работают формы? У нас есть клиентская часть (html-форма), которую может частично или полностью генерить сервер и серверная (плагин или модуль), код который будет обрабатывать данные из формы. 
Если мы пишем 
полностью свой плагин — тут (условно) проблем нет. Делаем любую форму и программируем любую фукнкциональность. Это оптимальный вариант для расширения. Другое дело, если мы хотим использовать чать функциональности уже готового плагина, расширив его. 

 

Задача распадается на две составляющие: расширение html кода формы (клиентской части) и расширение серверной части по обработке данных. Для начала  надо определить, что именно будем расширять и какой плагин или модуль использовать.  

 

Расширение кода форм

Откуда берется код формы? Тут несколько вариантов:

  1. код формы полностью генерируется в коде php или вшит как строчные данные в код php. — в Котонти это практически не применяется и так делать не надо.
  2. код формы содержится в шаблоне (tpl) в исходном виде (в виде html) — пример `ratings.tpl`
  3. код формы содержится в шаблоне (tpl) в виде тегов для каждого из полей формы — пример `contact.tpl`

Как расширить? 

Первый вариант не рассматриваю, т.к. это «oldschool» и «bad practice» для Котонти.
Второй и третий варианты можно расширить за счет изменения шаблона. 
Т.е. добавляем свои доп.поля в виде «голого» html-кода. Правим либо шаблон плагина (менее предпочтительно), либо делаем копию шаблона правим ее, размещая в папке `themes/your_theme/plugins/plugin_name/plugin_name.tpl` или `themes/your_theme/plugins/plugin_name.tpl` (более предпочтительный вариант). 

Еще более предпочтительный метод расширения форм (но работает только для части плагинов третьего пункта) — это использование экстра-полей плагина. Это облегчает работу, т.к. надо только добавить тег экстраполя в шаблон, а движок сам возьмет на себя заботу о том, чтобы создать дополнительное поле в форме, а потом созранить данные в базе данных.

Но надо с этими данными еще что-то делать. Тут мы переходим ко второй части…

Расширение серверного кода

[Теория] Плагины в рамках Котонти используют различные подходы к проектированию: 

  • standalone, когда код плагина вызывается только при запросе пользователем конкретной страницы и берет на себя «полное управление» включая вывод шаблонов (отрисовку содержимого страницы). Вызвать такой код из другого места программы или другой страницы практически невозможно. Например плагин `contact`.
  • функциональный подход заключается в использовании набора функций реализующих часть функционала. Такой код можно (при определенных условиях) вызывать из любого места скрипта (любой страницы). Этот подход в полной мере реализуют «плагины-виджеты», например `attach2`, когда вызывая функцию мы получаем часть клиентского кода (в данном случае виджет загрузки файлов) и можем включить его в произвольное место своей страницы.
  • смешанный подход, реализующий в себе оба предыдущих варианта. Такой подход используют многие модули, например модель `page`.

Как расширить функционал? 

Глобально есть 2 метода расширения плохой и хороший: 
Плохой — это взять код готового плагина и расширить/изменить под свои нужды. Плох он тем, что будет трудно поддерживать совместимость при выходе новых версий плагина или системы.
Хороший — создать свое расширение (маленький плагин) дополняющий функции текущего плагина (если есть соотв. хуки).

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

......................................................

Теперь, когда общая схема ясна, посмотрим предметно на задачу «форма обратной связи + регистрация». 

Это плагины `contact` и модуль `users`. И тот и другой модуль позволяют создать экстраполя это хорошо. Но не дают в полной мере использовать свой код из другого плагина. В модуле есть хуки, но в плагине их совсем нет. Т.е. нет «простого варианта», создать свой модуль и просто вызвать две функции («регистрация пользвоателя» и «отправка обратной связи»).

Тем не менее Котонти гибок и всегда есть варианты (описываю кратко суть):

  1. Пишем свой плагин полностью, копируя кусками код `contact` и `users`. (громоздко и потребует поддержки при изменении механизмов регистрации или отправки писем).
  2. Пишем свой плагин, вешая его на `users.registe.*` хук(и). расширяем форму регистрации формой обратной связи. вызываем код `contact` внутри своей ф-и обертки. 
  3. расширяем форму регистрации формой обратной связи. Пишем клиентский скрипт (на JS), который перед отправкой данных для регистрации пользователя будет делать AJAX запрос на отправку письма обратной связи, если все ок отправлять форму (как если бы пользователь просто регистрировался), если нет выводить ошибки в соотв. полях.

 

https://github.com/macik
правильный хостинг — https://goo.gl/fjCa1F