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

+45
5.10K
Просматривая форумы заметил часто возникающие вопросы у пользователей, типа: “Как гостям добавлять новости?” Или: “Как не авторизованным, писать на стене в группе или в профиле пользователей?”.

Пока «гости» в двойке ограничены в своих действиях на вашем сайте. Поэтому я решил, немного описать возможности конструктора форм iForms.
Не зависимо, от того какой версией вы пользуетесь — платной или бесплатной, эти возможности доступны в каждой, с небольшой разницей. О разнице я расскажу в конце, но в этом посте, я буду использовать платную версию. Так как она мне больше нравится.



Создаём профиль для наших "гостей".

Выбираем группу пользователей с наименьшим набором прав или создаём новую. Создаём в ней нового пользователя с именем “Гость”. Придумываем ему емаил и пароль. У меня это guest@krivo.pro и шесть жирных точек.

Иллюстрация
Иллюстрация
В списке он у меня появляется с id = 2. Эту цифру можно временно запомнить.

Иллюстрация
Теперь у нас на сайте гости имеют свой профиль, в котором мы можем менять аватар и другие настройки на своё усмотрение.

Иллюстрация
Иллюстрация
Рассмотрим вариант добавления новостей.

Смотрим какие поля есть у нашего типа контента — «Новости» и какие есть категории.

Иллюстрация
Иллюстрация
Открываем наш компонент «Конструктор форм iForms» и создаём форму


Иллюстрация
Иллюстрация
Иллюстрация
Иллюстрация
Затем в этой форме создаём поля, у которых системные имена, совпадают с системными именами полей типа контента.

Иллюстрация
Иллюстрация
Если поле по типу совпадает с другими уже настроенными полями формы, то можно скопировать такое поле с его настройками
Иллюстрация
И создать на его основе новое поле, заполнив только системное имя и заголовок
Иллюстрация
Далее оставшиеся поля

Иллюстрация
Иллюстрация
Теперь добавим "технологические поля", которые не связаны с полями типа контента, но понадобятся нам в дальнейшем.

Добавляем поле список со списком доступных пользователю категорий в поле «предустановленные значения». В виде: название_категории | название_категории.
Системное имя поля со списком категорий будет у нас использоваться, поэтому запомните его название. Можно назвать, как угодно, у меня это category_name.

Иллюстрация
Иллюстрация
Добавляем скрытое поле с системным именем, которое потом нам потребуется. У меня это ctype_name, но вы можете использовать другое. Название поля можно указать, оно всё равно не выведется.

Иллюстрация
В предустановленых значениях этого поля прописываем системное имя контента

Иллюстрация
Автора записи можно обойти созданием нового строкового поля. А стандартное поле автор просто снять с публикации.

Иллюстрация
Иллюстрация
В итоге должно получиться примерно такое

Иллюстрация
Выводим нашу форму в нужном месте.

Сделаем это в виджете на всех страницах с новостями под выводом основного контента.

Иллюстрация
Иллюстрация
Иллюстрация
Иллюстрация
Смотрим на сайте, что получилось.

Иллюстрация
Теперь у нас есть форма, есть желающий ее заполнить, но как определить, что эта форма должна добавить новость?
Для этого в системе есть хук (hook) (не путать с хак).

Дальше — самое страшное в этом посте – надо писать код.
Сперва создаём файл в каталоге \system\controllers\content\hooks\ с названием iforms_after_validate.php
В нём прописываем код. Я в комментариях расписал, что, к чему и зачем. Поэтому, можно просто скопировать.

  1.  
  2. <?php
  3.  
  4. class onContentIformsAfterValidate extends cmsAction {
  5.  
  6. public function run($form_data){
  7.  
  8. // получаем данные введёные пользователем (гостем)
  9. $user_data = $form_data[0];
  10. $error = $form_data[1];
  11.  
  12. // если есть ошибки в заполнении формы, возвращяемся для их устранения
  13. if ($error) {return $form_data;}
  14.  
  15. // если есть поле с системным именем 'ctype_name' заносим данные в бд,
  16. // иначе возвращаем данные
  17. if (isset($user_data['ctype_name'])){
  18.  
  19. $ctype_name = $user_data['ctype_name'];
  20. if (!$ctype_name) { return false; }
  21.  
  22. $user = cmsUser::getInstance();
  23.  
  24. // далее указываем id пользователя из системы. Если пользователь не определён, то подставляем нашего системного гостя с id=2.
  25. $user_data['user_id'] = $user->id ? $user->id : 2;
  26. $category = $this->model->getCategoryBySLUG($ctype_name, lang_slug($user_data['category_name']));
  27.  
  28. $user_data['category_id'] = isset($category) ? $category['id'] : 1;
  29.  
  30. // удалаем лишние поля перед сохранением в базе
  31. unset($user_data['ctype_name']);
  32. unset($user_data['category_name']);
  33.  
  34. // заносим данные в базу
  35. $id = $this->model->insert('con_' . $ctype_name, $user_data);
  36.  
  37. if ($id){
  38. // возвращаем сообщение об успешности операции
  39. $user->addSessionMessage('Ваша новость будет добавлена после модерации', 'success');
  40. }
  41.  
  42. // обновляем данные на то что нам надо.
  43. $this->model->update('con_' . $ctype_name, $id, array(
  44. 'slug' => $id . '-' . lang_slug($user_data['title']), // вставляем url записи по примеру {id}-{title} из настроек типа контента.
  45. 'seo_keys' => string_get_meta_keywords($user_data['content']), // Добавляем ключевые слова
  46. 'seo_desc' => string_get_meta_description($user_data['content']), // и описание для СЕО
  47. 'date_last_modified' => null, // делаем вид, что запись новая и ни разу не обновлялась.
  48. 'is_pub' => 0 // 0 - если ждём модерации, если публикуем сразу, то ставим 1.
  49. ));
  50.  
  51. // и возвращам данные для оповещения модерторов
  52. return $form_data;
  53.  
  54. }
  55.  
  56. // Передаем входящие данные дальше
  57. return $form_data;
  58. }
  59. }
  60.  
  61.  
Тут главное, чтобы системные имена полей формы совпадали с системными именами полей типа контента. Если будет хоть одно разногласие (например вы изменили системное имя поля), то записи в базе не появятся. Выпадет ошибка и белый экран.

Чтобы система знала, что ей делать при появлении данного «события» необходимо прописать в файле \system\controllers\content\manifest.php наш новый хук
'iforms_after_validate', чтоб стало так

Иллюстрация
Вот пожалуй и всё. Проверяем:
Заполняем форму не авторизованным пользователем – гостем

Иллюстрация
отправляем и получаем такое сообщение

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

Иллюстрация
Возвращаемся во фронт сайта и видим нашу новость.

Иллюстрация
Иллюстрация
Что мы имеем в итоге.

Наши гости стали немного активнее вести себя на сайте, при этом мы изменили всего одну строчку системного файла движка (\system\controllers\content\manifest.php) и добавили свой один файл-обработчик. По аналогии, возможно сделать многое.

Что касается бесплатной версии конструктора форм, то в нем делается это таким же образом, как описано выше, с той разницей, что в файле \system\controllers\iforms\frontend.php после строки (приблизительно 69 строка):

  1. $errors[$fname] = $form->validate(cmsCore::getController('iforms', $inCore->request), $user_data);
надо прописать это
  1.  
  2. // Вызов хука для дополнительной проверки и обработки данных формы
  3. list($user_data, $errors[$fname]) = cmsEventsManager::hook('iforms_after_validate', array($user_data, $errors[$fname]));
  4.  
Вот и всё.

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

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

Спасибо, что дочитали до сюда.
0
Реклама Реклама #
+6
qwest qwest 6 лет назад #
Loadырь вы как всегда на высоте.
Сразу все не осилил но однозначно плюс. На досуге еще поизучаю.
+3
Bubble Gumoff Bubble Gumoff 6 лет назад #
Спасибо Вам, вас всегда приятно читать, а главное всегда полезно!
+2
Олег Васильевич я Олег Васильевич я 6 лет назад #
К гадалке не ходите...
Спойлер
+2
Loadырь Loadырь 6 лет назад #
вполне приличный премиум-компонент
Так ведь, уже в коробке с конструктором компонент рассылки файлов, обновлений, сообщений, уведомлений. А с подобными обработчиками событий из типов контента легко делаются компоненты вопросы-ответы, отзывы и предложения, гостевые книги, даже слабое подобие форума можно замутить. Просто пока мало, кто это всё разглядеть может.
0
SpaceSel SpaceSel 6 лет назад #
Лодырь, значит тебе не нравится бесплатный конструктор форм? &#128516;
+2
Loadырь Loadырь 6 лет назад #
SpaceSel , читайте внимательно, там про платный написано
мне больше нравится
. А чем вам пользоваться, выбирать вам.
+3
jorgovich jorgovich 6 лет назад #
Бесплатный конструктор это так сказать урезанная версия, платный просто бомба, который при наличии фантазии позволяет очень - очень много интересных вещей сделать. Но нельзя сказать что бесплатный хуже, он просто облегченная версия..
0
виталя виталя 6 лет назад #
Согласен, платная версия - вещь! Тоже купил !
Спасибо автору что помог с отправкой с формы(были проблемы с хостом).
0
виталя виталя 6 лет назад #
Можно ли в платной версии привязать форму к определённому типу контента?
Чтоб пользователь не выбирал при добавлении записи , а форма уже автоматом появлялась после создания контента.
+1
Loadырь Loadырь 6 лет назад #
Полем вывести не получится. Оно выводится для конкретной записи - конкретная форма. Можно поставить виджет (в сайд бар или после записи контента) на страницы типа контента и в нём вывести нужную форму. Только с отображением заголовков (виджета, формы, кнопки) надо продумать чтоб не задваивались.
0
виталя виталя 6 лет назад #
Оно выводится для конкретной записи - конкретная форма. - Это понятно. А можно как -то сделать чтоб для конкретного типа конттента - конкретная форма? Может есть какое решение помимо виджета?
+1
Loadырь Loadырь 6 лет назад #
Помимо виджета, пока решения нет. Могу рассмотреть, как поле можно привязать ко всему типу контента.
0
Djes Djes 6 лет назад #
Загрузил, поставил - все классно! Спасибо!
+2
Loadырь Loadырь 6 лет назад #
Пожалуйста!
0
Lancelot Lancelot 5 лет назад #
Добрый день.
У меня ошибка. Критичная? Как быть?
0
Loadырь Loadырь 5 лет назад #
Тут немного другая тема обсуждается,
Lancelot:
Критичная?
Нет.
Lancelot:
Как быть?
Вариантов масса - от приобретения версии конструктора, имеющей техническую поддержку, до отключения режима отладки в настройках сайта.
тут в последних комментариях я уже ответил на подобный вопрос.
0
Lancelot Lancelot 5 лет назад #
Я планирую купить ваш компонент, но сперва хотелось бы потестить бесплатную версию для определения подойдёт ли данный компонент для решения моей задачи. Спасибо за скорый ответ.
-1
No Name No Name 5 лет назад #
купил платную форму, делаю всё по инструкции как в предустановленных значениях прописать категории, если есть например Недвижимость и в ней продать, как этот правильно прописать?
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.