Конструктор форм iForms. Добавление записи в типы контента гостем. 2.X

2565
С момента моей прошлой записи на эту тему прошло больше двух лет. За это время двойка претерпела немало изменений. Поэтому возникла необходимость обновить тот хук и расписать более подробно, как можно используя конструктор форм дать возможность не авторизованным пользователям создавать записи в типах контента.

Итак, для начала нужно установить хук.
Скачать его можно у меня в файлах (файл с названием hook_iforms_guest_publicate). В архиве лежат два файла - один файл манифеста system\controllers\iforms\manifest.php, второй - сам хук system\controllers\iforms\hooks\iforms_guest_publicate.php. Файл хука просто копируется в папку system\controllers\iforms\hooks вашего сайте. Файл манифеста, также можно скопировать в папку system\controllers\iforms, но только в том случае, если вы ранее в него не вносили правки. В противном случае в этот файл на сайте необходимо внести строку
Код PHP:
  1. 'iforms_guest_publicate',
по аналогии с файлом из архива.

В 2.7.2, чтобы новый хук заработал, необходимо зайти в админку сайта, в раздел "Компоненты" - "Управление событиями" и нажать кнопку "Обновить".

Теперь необходимо создать форму и привязать её к этому хуку. Форма должна содержать поля с системными именами такими же как и в типе контента, куда будет производится запись.
Обычно, через конструктор заполняют тип контента похожий на "Отзывы" или "Гостевая книга", но это простые примеры, так как там обычно используются поля, без свойств и с малым уровнем вложенности категорий. Рассмотрим более глобальный пример - Добавление объявления.

Для примера будем использовать дефолтный тип контента "Объявления". Заходим в настройки типа контента, в раздел "Поля" и смотрим какие системные имена и типы полей используются.
Спойлер
После этого создаём форму у которой во вкладке "События" выбираем наш хук. Рекомендую установить хук после валидации формы или после отправки формы. В первой случае можно прекратить выполнение и отправку самой формы, после создания записи.
Спойлер
Остальные настройки формы - на ваше усмотрение.

Создаём поля в этой форме.
Спойлер
Вообще, для создания записи в типе контента обязательно нужно указать системное имя этого типа контента в поле - ctype_name, id категории в которой будет выводится запись - category_id, заголовок записи - title, id авторизованного пользователя в качестве автора - user_id.

В файле используемого хука ctype_name указано по умолчанию - "board", можно изменить его прямо в файле для всех форм использующих данный хук, а можно создать скрытое поле в форме с системным именем ctype_name и предустановленным значением нужного типа контента, например для новостей "news" и т.п.

category_id - можно указать также скрытым полем, можно создать тип поля "Категории типа контента" с системным именем - "category_id".
Спойлер
Также можно использовать тип поля список с предустановленным значением в виде "ключ | значение" "id категории | Название категории"
Конечно, если не указать в этом поле ничего, то category_id будет соответствовать корневой категории данного типа контента.

title - Заголовок записи берется из двух полей, если есть явно указанное поле с систменым именем "title", то используется его значение, если нет, то ищется поле с системным именем "name", если и оно не найдено, то подставится просто текущая дата.

user_id - тут вообще вариантов может быть много. Можно создать пользователя с никнеймом "Гость" и скрытым полем указать его id или не создавать, а указать уже существующего пользователя. Можно сделать полем список для выбора, от чьего имени авторизованного пользователя будет выводится запись.
Можно, зарегистрировать гостя на сайте shock и выслать ему сгенерированный случайный пароль с приглашением авторизоваться на сайте. Для регистрации пользователя, обязательно нужны поля в форме с системными именами "name" или "nickname" и "email". Также для регистрации можно указать поле "user_groups" - группа пользователей и поле с загрузкой изображения "user_avatar" - аватар пользователя. Если необходимо после регистрации гостя на сайте отправить ему письмо со случайным паролем, то надо заполнить поле "Шаблон автоуведомления", в настройках формы, во вкладке "Внешняя почта".
Если гость уже зарегистрирован на сайте, то новая запись будет осуществляться от имени зарегистрированного пользователя. А если каким-то образом авторизованный пользователь решит заполнить форму, то запись будет публиковаться от его имени.
Если user_id не определён явно, то запись будет опубликована от лица администратора с id = 1.

По умолчанию регистрация гостя отключена. Активировать регистрацию гостя можно скрытым полем 'with_user_register' = 0 - без регистрации, 1 - с регистрацией. Или в файле хука в 49 строке заменить 0 на 1. Все изменения в файле хука будут влиять на все формы, использующие данный хук. Конечно, если этот хук использует только одна форма, то лучше все изменения внести в самом файле, это упростит форму.

На этом обязательные поля закончились, создаём остальные поля такие же, как в самом типе контента.

На этом можно и закончить заполнение полей в типе контента используя конструктор форм. В хуке по умолчанию прописано, что запись будет публиковаться сразу после проверки модератором. Изменить условия публикации можно скрытыми полями
'is_pub' = 0 - не публиковать, 1 - публиковать.
'is_approved' = 0 - отправить на модерацию, 1 - не отправлять.
Также можно задать срок публикации записи скрытым полем 'pub_days' = 15 - количество дней публикации записи.
Указанные значения прописываются в настройках поля в предустановленных значениях.

Можно сразу завершить работу конструктора форм скрытым полем 'redirect_back' = 0 - продолжать выполнять отправку формы, после обработки хука, 1 - прекратить отправку формы, после обработки хука.

Выводим форму виджетом в нужном месте, и смотрим результат
Спойлер
Этот вариант подходит для большинства случаев заполнения типов контента гостями. Так как используются только поля, а поля для всех категорий одинаковые. В случае с использование свойств категорий, нужно исходить из конкретной ситуации. Например, если все свойства уникальны для каждой категории, то можно использовать зависимость полей в конструкторе форм и выводить нужные свойства для заполнения в зависимости от выбранной категории. В нашем примере свойства могут быть привязаны к нескольким категориям. Например, свойство "Тип предложения" в категории недвижимость, привязано ещё и в категории "Квартиры".
В конструкторе форм все поля в пределах одной формы должны иметь уникальные системные имена, поэтому в данном случае на каждую категорию необходимо создавать отдельную форму и размещать их на страницах этих категорий crazy
Но не пугайтесь в конструкторе 3.4 теперь есть кнопка копирования формы, которая копирует все настройки и поля формы.

Вернёмся к свойствам. Как узнать id свойства я рассказывал 2 года назад, за это время ничего не поменялось. Цифра после последнего слэша "/" в url-адресе редактирования свойства типа контента и есть нужный нам id.
В форме конструктора создаём поле с системным именем "props_{id}", где вместо {id} прописываем id нужного свойства. Например, у свойства "Тип предложения" id = 7, пишем "props_7".
Спойлер
В итоге получим такую форму
Спойлер
Заполняем форму гостем, отправляем данные, заходим под админом/модератором, разрешаем публикацию.

Спойлер
Редактор разметки iTiny | Конструктор форм iForms: онлайн калькулятор
Комментарии (18)
Def 7 мая 2017 в 09:55 0
круто!!!
Jestik 7 мая 2017 в 10:51 0
Кстати, в связи с новым законом о обработке персональных данных. в состав компонента было бы неплохо включить поле "Чекбокс с ссылкой" типа соглашение, как на многих сайтах соглашение с правилами
Loadырь 7 мая 2017 в 11:10 +1
На выбор два варианта:
1. Чекбокс, обязательный для заполнения.
2. Описание, после всех полей формы.
Оба варианта есть тут. Причём ссылки можно указать с классом для открытия в модальном окне.
Loadырь 7 мая 2017 в 11:11 0
Забыл добавить, текст естественно произвольный, настраивается в настройках для каждой формы.
Def 7 мая 2017 в 12:09 0
возможно ли вывести в модальном окне страницу с другого сайта?
Loadырь 8 мая 2017 в 14:53 0
Возможно, если CORS позволит.
Capitan 7 мая 2017 в 13:09 0
все хорошо, но! это все как всегда до очередного обновления, а потом все опять переделывать :(
Loadырь 8 мая 2017 в 14:58 +2
Таки да, "печалька" есть везде и всегда. Но все ждут, все надеются, что в коробке когда-то...
Oleg_z75 10 мая 2017 в 09:35 0
Если будет в коробке конструктор, тогда не будет оригинальности, будет просто стандарт с обрезанными функциями по самое нехочу... Как то так.
Loadырь 10 мая 2017 в 10:45 +2
Конструктор в коробке, будет однозначно. В офф. документации даже встречал фразы о нём.
Все ждут и надеются, что когда-то гости смогут писать контент на сайте и это будет в коробке, без лишних хаков, хуков и прочей "нечисти". Вот только пока одни ждут, другие пользуются.
Скела 26 ноября 2017 в 09:47 0
Возможно ли сделать, чтобы при нажатии на кнопку ошибки в форме или уведомление выходило без перезагрузки страницы?
Ставил "разное"-"способ доставки"-"ajax", думал что это связано, но там поля формы вообще не выводятся.
Loadырь 26 ноября 2017 в 10:22 0
Поставьте галочку проверки полей с помощь jquery
Скела 26 ноября 2017 в 12:22 0
Оказалось проблема в стилях шаблона bootstrap стиль .modal (удаляем и все нормально работает)
Огромное спасибо. Компонент супер..
Jestik 14 июля 2018 в 23:19 0
Буду благодарен если ответите на несколько вопросов,
- На 2.10.1 Работает? Кто то пробовал?
- Как реализовать заполнение тегов? Сделать поле "tags"? И наверно "предлагать" во время ввода теги не будет?
- Что нужно что бы показывать эту форму для зарегистрированных пользователей? Там же по идее хук не нужен этот..
Loadырь 15 июля 2018 в 10:32 0
Jestik:
На 2.10.1 Работает? Кто то пробовал?
На 2.10.0 работает, на 2.10.1 не пробовал, но тоже должно работать.
Jestik:
Как реализовать заполнение тегов? Сделать поле "tags"? И наверно "предлагать" во время ввода теги не будет?
Создать поле tags. Предлагать варианты не будет.
Jestik:
Что нужно что бы показывать эту форму для зарегистрированных пользователей?
Вывести виджет с формой для всех, но есть ли смысл? Хук нужен в любом случае, так как это форма имеет свой обработчик.
Jestik 15 июля 2018 в 11:10 0
Спасибо!
Def 15 июля 2018 в 19:09 +1
одна опция не работает - почему то система в админке не может отчистить уведомления о заполненных формах. Версия 3.5 форм и версия 2.10.1 инстанта
Loadырь 15 июля 2018 в 20:59 +1
Система не может очистить сообщения, которые имеют действия. В случае с конструктором форм, сообщение имеет действие, в виде перехода на страницу, откуда была отправлена форма.