Программирование форм в InstantCMS 2.x.x

Разработка на базе объектной модели InstantCMS 2.x.x

#1 11 ноября 2014 в 16:08
В исходниках Instant 2 версии бнаружил следующий текст:
  1. <?php if ($parent){ ?>
  2. <?php $p_id = str_replace(':', '_', $parent['list']); ?>
  3. <script>
  4. $('#<?php echo $p_id; ?>').on('change', function(){
  5. icms.forms.updateChildList('<?php echo $field->id; ?>', '
  6. <?php echo $parent['url']; ?>',
  7. $(this).val());
  8. });
  9. </script>
  10. <?php } ?>
Значит есть механизм "родитель-дитя" у списков?
Попытки обнаружить этот механизм, чтобы в нём покопаться, не удались (видимо, не там и не так искал).

Частный вопрос к гуру:
Как, в рамках объектной модели "от Instant", переключением одного списка повлиять на items другого?
Не нашёл "фирменного" способа реагировать на события элементов форм.

Отсюда – более общие 2 вопроса:
Допустимы ли в парадигме Instant 2 сразу две независимых формы в одном окне компонента?

Где можно "пошевелить" шаблон формы "от Instant", чтобы, например, вывести два-три списка (или других элемента) в одной строке?

Заранее спасибо всем ответившим!
#2 11 ноября 2014 в 16:23
Да, он используется в настройках виджета "Список контента"
#3 11 ноября 2014 в 16:33

Как, в рамках объектной модели "от Instant", переключением одного списка повлиять на items другого?
Не нашёл "фирменного" способа реагировать на события элементов форм.

Aquarius
Я не гуру, но отвечу: "фирменного" нет. Сам себе ваял "отсебятину", на примере того что есть "от Instant"

Допустимы ли в парадигме Instant 2 сразу две независимых формы в одном окне компонента?

Aquarius
Насчёт двух форм не представляю, а вот несколько "зависимых полей" с независимыми селектами и их отдельными обработками событий вполне

вывести два-три списка (или других элемента) в одной строке?

Aquarius
Тут \templates\default\assets\ui\form.tpl.php формы рисуются.
#4 21 ноября 2014 в 11:37
Здравствуйте!
Две формы на одной странице отобразить можно без проблем, но вот обработать сразу две никак, единственный вариант это наверное массив где каждым элементом будет одна форма.
#5 21 ноября 2014 в 12:21
А зачем обрабатывать две формы? В смысле, на "выполнение" формы есть Submit который обрабатывает непосредственно свою форму, и этого вполне должно быть достаточно)))
#6 21 ноября 2014 в 12:55
Val, по существующей схеме
  1. <div class="buttons">
  2. <?php echo html_submit( $submit['title'] ); ?>
  3. <?php if ($cancel['show']) { echo html_button($cancel['title'], 'cancel', "location.href='{$cancel['href']}'"); } ?>
  4. </div>
при нажатии на кнопку "отправить" одной из форм отправляются данные всех форм. Они обрабатываются и если нет ошибок, то и отрабатывают корректно, а если есть ошибки то данные возвращаются в первую по ходу форму, даже если были отправлены из третьей.
#7 21 ноября 2014 в 13:46
Loadырь, я с такой ситуацией никогда не встречался. Считаю, если требуется за раз обработать несколько форм, нужно менять логику)) возможно что-то можно придумать более логичным и юзер-дружелюбным...
Еще раз уточню, я имею ввиду, что на странице может быть много форм одновременно, но обрабатываться единовременно должна только одна IMHO =)
#8 21 ноября 2014 в 14:41
Мне кажется под двумя формами тут может иметься ввиду такой же механизм как например в phpMyAdmin при вставке записей в таблицу, когда можно вставить несколько записей сразу.
#9 21 ноября 2014 в 14:51
Val, а я столкнулся, можете глянуть тут. При выводе инпуты submit имеют одинаковое название и на них динамически навешано событие типа onclick. Соответственно, при клике на одну кнопку срабатывают все. И вся проблема заключается в определении какая именно кнопка была нажата, чтобы отправить нужную форму.
#10 21 ноября 2014 в 18:03

Две формы на одной странице отобразить можно без проблем, но вот обработать сразу две никак

Евгений Колегов
Абсолютно верно. Нельзя одновременно отправить 2 разные формы и обработать их. Но это никогда и не требуется. Вывести же две разные формы на одну страницу и обрабатывать их отдельно одним и тем же экшеном — запросто. Просто внутри экшена нужна проверять какая именно из форм пришла в данный момент.

при нажатии на кнопку "отправить" одной из форм отправляются данные всех форм

Loadырь
Нет, при отправке одной формы отправляется одна форма.

данные возвращаются в первую по ходу форму

Loadырь
Тоже нет, данные возвращаются туда, куда вы им скажете вернуться

При выводе инпуты submit имеют одинаковое название

Loadырь
Они могут иметь и разные названия. Но формы можно различать не только по инпутам. Можно, например, добавить hidden-поле c каким-то id формы. Или этот же id передавать экшену-обработчику через URL в атрибуте action формы.

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

Loadырь
Проблема заключается не в том, какую форму отправить на клиенте, а в том как на сервере определить какая из форм пришла на обработку. В вашем примере у всех форм одинаковый action (равный текущему URL), поэтому вам тяжело понять что именно пришло. Добавляйте id формы скрытым полем в каждую форму и проблема решена.
#11 21 ноября 2014 в 18:22

Добавляйте id формы скрытым полем в каждую форму и проблема решена.

r2
Скрытое поле можно также использовать для передачи и обработки, переменных пришедших из url адресной строки.
#12 21 ноября 2014 в 18:25
Loadырь, хотел вам ответить но не успел)) Также хотел предложить вам использовать id, клик вы обрабатываете через ява-скрипт, так что обработать данные не представляется сложным))
И еще раз хочу акцентировать внимание, что возможно стоит пересмотреть задачи и найти более интересное/оптимальное решение и не выводить одинаковую форму на странице несколько раз.
#13 29 ноября 2014 в 20:35

Допустимы ли в парадигме Instant 2 сразу две независимых формы в одном окне компонента?

Aquarius
Да — в парадигме допустимы, но чтобы реально работали нужно, что-то решить с капчёй. У меня reCaptcha выводится только один раз на странице. Тут или искать вариант с другой капчёй или отключить ее вообще (не рекомендую). Пробовал добавить action с id формы, столкнулся с тем, что при ошибке меня редиректило с сайта на страницу компонента с формой, что мне совсем не понравилось. Вникать долго в это не стал, возможно обработчик так направлял. Перепилил свой компонент iForms (в файлах пока не обновлял) — добавил в формы скрытое поле с id формы. Теперь данные в случае ошибки возвращаются в нужную форму и ошибочные поля подсвечиваются там же.

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

Val
Куда ещё интереснее и оптимальнее, чем полноценный конструктор форм, подобный тому, что есть в первой ветке, но по моему во второй он более гибкий в плане количества вариантов вывода на сайте?
#14 1 декабря 2014 в 20:54
r2, столкнулся ещё с такой проблемой:
когда на странице форма одна и нажата кнопка отправки, то я проверяю это действие так как в документации:
  1. $is_submitted = $this->request->has('submit');
и дальше по условию
  1. // Если форма была отправлена
  2. if ($is_submitted) {
  3. // Получаем (request) и парсим (parse) данные из формы
  4. $data = $form->parse($this->request, $is_submitted);
  5. }
. В этом случае всё работает так: выводится страница с формой, нажимаем кнопку submit, идёт валидация формы и если ошибка, то возвращаются данные и ошибки в эту же форму без перезагрузки страницы и на странице есть переменная $this->request->has('submit') полученная ранее по нажатию кнопки.
Но когда форм больше одной (а у всех форм кнопка submit рисуется одинаковая), то при отправке одной формы, в случае ошибки, остальные формы вместе с отправленной рендерятся с учётом того, что событие нажатия на кнопку отправки каждой формы уже совершено, т. е.
  1. if ($is_submitted) {}
. — данное условие выполнимо для всех форм. Заметил это когда идёт проверка капчи. Сколько форм с капчёй на странице, столько и сообщений о неверной капче.

З.Ы. описал возможно криво.

Проблема решается если у инпута с типом submit в файле \templates\default\assets\ui\form.tpl.php в строке 188 можно было бы задать имя тегу name.
Т. е. вместо
  1. <?php echo html_submit( $submit['title'] ); ?>
задать так:
  1. <?php echo html_submit( $submit['title'], $submit['name'] ); ?>
тогда можно проверять какая именно кнопка была нажата
  1. $is_submitted = $inCore->request->has('название_нашей_кнопки_с_типом_submit');
#15 1 декабря 2014 в 21:11

Проблема решается если у инпута с типом submit в файле \templates\default\assets\ui\form.tpl.php в строке 188 можно было бы задать имя тегу name.

Loadырь
Так ведь можно.
  1.  
  2. <?php $this->renderForm($form, $data, array(
  3. 'method' => 'post',
  4. 'action' => '',
  5. 'submit' => array(
  6. 'title' => LANG_SUBMIT,
  7. 'name' => 'my_submit_button'
  8. )
  9. ), $errors);
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.