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

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

 
Посетитель
small user social cms
Сообщений: 29
В исходниках Instant 2 версии бнаружил следующий текст:
Код PHP:
  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", чтобы, например, вывести два-три списка (или других элемента) в одной строке?

Заранее спасибо всем ответившим!
Редактировалось: 3 раз (Последний: 11 ноября 2014 в 16:11)
Сергей-Водолей
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 3600
Да, он используется в настройках виджета "Список контента"
Реклама
cms
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 3600
Aquarius:
Как, в рамках объектной модели "от Instant", переключением одного списка повлиять на items другого?
Не нашёл "фирменного" способа реагировать на события элементов форм.
Я не гуру, но отвечу: "фирменного" нет. Сам себе ваял "отсебятину", на примере того что есть "от Instant"
Aquarius:
Допустимы ли в парадигме Instant 2 сразу две независимых формы в одном окне компонента?
Насчёт двух форм не представляю, а вот несколько "зависимых полей" с независимыми селектами и их отдельными обработками событий вполне
Aquarius:
вывести два-три списка (или других элемента) в одной строке?
Тут \templates\default\assets\ui\form.tpl.php формы рисуются.
Посетитель
small user social cms
Сообщений: 5
Здравствуйте!
Две формы на одной странице отобразить можно без проблем, но вот обработать сразу две никак, единственный вариант это наверное массив где каждым элементом будет одна форма.
Посетитель
small user social cms
МедальКубок зрительских симпатийАвторитет форума
Сообщений: 1164
А зачем обрабатывать две формы? В смысле, на "выполнение" формы есть Submit который обрабатывает непосредственно свою форму, и этого вполне должно быть достаточно)))
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 3600
Val, по существующей схеме
Код PHP:
  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>
при нажатии на кнопку "отправить" одной из форм отправляются данные всех форм. Они обрабатываются и если нет ошибок, то и отрабатывают корректно, а если есть ошибки то данные возвращаются в первую по ходу форму, даже если были отправлены из третьей.
Посетитель
small user social cms
МедальКубок зрительских симпатийАвторитет форума
Сообщений: 1164
Loadырь, я с такой ситуацией никогда не встречался. Считаю, если требуется за раз обработать несколько форм, нужно менять логику)) возможно что-то можно придумать более логичным и юзер-дружелюбным...
Еще раз уточню, я имею ввиду, что на странице может быть много форм одновременно, но обрабатываться единовременно должна только одна IMHO =)
Посетитель
small user social cms
Сообщений: 5
Мне кажется под двумя формами тут может иметься ввиду такой же механизм как например в phpMyAdmin при вставке записей в таблицу, когда можно вставить несколько записей сразу.
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 3600
Val, а я столкнулся, можете глянуть тут. При выводе инпуты submit имеют одинаковое название и на них динамически навешано событие типа onclick. Соответственно, при клике на одну кнопку срабатывают все. И вся проблема заключается в определении какая именно кнопка была нажата, чтобы отправить нужную форму.
InstantCMS Team
small user social cms
МедальКубок зрительских симпатийАвторитет форума
Сообщений: 1343
Евгений Колегов:
Две формы на одной странице отобразить можно без проблем, но вот обработать сразу две никак
Абсолютно верно. Нельзя одновременно отправить 2 разные формы и обработать их. Но это никогда и не требуется. Вывести же две разные формы на одну страницу и обрабатывать их отдельно одним и тем же экшеном - запросто. Просто внутри экшена нужна проверять какая именно из форм пришла в данный момент.
Loadырь:
при нажатии на кнопку "отправить" одной из форм отправляются данные всех форм
Нет, при отправке одной формы отправляется одна форма.
Loadырь:
данные возвращаются в первую по ходу форму
Тоже нет, данные возвращаются туда, куда вы им скажете вернуться
Loadырь:
При выводе инпуты submit имеют одинаковое название
Они могут иметь и разные названия. Но формы можно различать не только по инпутам. Можно, например, добавить hidden-поле c каким-то id формы. Или этот же id передавать экшену-обработчику через URL в атрибуте action формы.
Loadырь:
И вся проблема заключается в определении какая именно кнопка была нажата, чтобы отправить нужную форму
Проблема заключается не в том, какую форму отправить на клиенте, а в том как на сервере определить какая из форм пришла на обработку. В вашем примере у всех форм одинаковый action (равный текущему URL), поэтому вам тяжело понять что именно пришло. Добавляйте id формы скрытым полем в каждую форму и проблема решена.
Редактировалось: 1 раз (Последний: 21 ноября 2014 в 18:04)
Посетитель
small user social cms
Медаль
Сообщений: 352
r2:
Добавляйте id формы скрытым полем в каждую форму и проблема решена.
Скрытое поле можно также использовать для передачи и обработки , переменных пришедших из url адресной строки.
Посетитель
small user social cms
МедальКубок зрительских симпатийАвторитет форума
Сообщений: 1164
Loadырь, хотел вам ответить но не успел)) Также хотел предложить вам использовать id, клик вы обрабатываете через ява-скрипт, так что обработать данные не представляется сложным))
И еще раз хочу акцентировать внимание, что возможно стоит пересмотреть задачи и найти более интересное/оптимальное решение и не выводить одинаковую форму на странице несколько раз.
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 3600
Aquarius:
Допустимы ли в парадигме Instant 2 сразу две независимых формы в одном окне компонента?
Да - в парадигме допустимы, но чтобы реально работали нужно, что-то решить с капчёй. У меня reCaptcha выводится только один раз на странице. Тут или искать вариант с другой капчёй или отключить ее вообще (не рекомендую). Пробовал добавить action с id формы, столкнулся с тем, что при ошибке меня редиректило с сайта на страницу компонента с формой, что мне совсем не понравилось. Вникать долго в это не стал, возможно обработчик так направлял. Перепилил свой компонент iForms (в файлах пока не обновлял) - добавил в формы скрытое поле с id формы. Теперь данные в случае ошибки возвращаются в нужную форму и ошибочные поля подсвечиваются там же.
Val:
И еще раз хочу акцентировать внимание, что возможно стоит пересмотреть задачи и найти более интересное/оптимальное решение и не выводить одинаковую форму на странице несколько раз.
Куда ещё интереснее и оптимальнее, чем полноценный конструктор форм, подобный тому, что есть в первой ветке, но по моему во второй он более гибкий в плане количества вариантов вывода на сайте?
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 3600
r2, столкнулся ещё с такой проблемой:
когда на странице форма одна и нажата кнопка отправки, то я проверяю это действие так как в документации:
Код PHP:
  1. $is_submitted = $this->request->has('submit');
и дальше по условию
Код PHP:
  1. // Если форма была отправлена
  2. if ($is_submitted) {
  3. // Получаем (request) и парсим (parse) данные из формы
  4. $data = $form->parse($this->request, $is_submitted);
  5. }
. В этом случае всё работает так: выводится страница с формой, нажимаем кнопку submit, идёт валидация формы и если ошибка, то возвращаются данные и ошибки в эту же форму без перезагрузки страницы и на странице есть переменная $this->request->has('submit') полученная ранее по нажатию кнопки.
Но когда форм больше одной (а у всех форм кнопка submit рисуется одинаковая), то при отправке одной формы, в случае ошибки, остальные формы вместе с отправленной рендерятся с учётом того, что событие нажатия на кнопку отправки каждой формы уже совершено, т. е.
Код PHP:
  1. if ($is_submitted) {}
. - данное условие выполнимо для всех форм. Заметил это когда идёт проверка капчи. Сколько форм с капчёй на странице, столько и сообщений о неверной капче.

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

Проблема решается если у инпута с типом submit в файле \templates\default\assets\ui\form.tpl.php в строке 188 можно было бы задать имя тегу name.
Т. е. вместо
Код PHP:
  1. <?php echo html_submit( $submit['title'] ); ?>
задать так:
Код PHP:
  1. <?php echo html_submit( $submit['title'], $submit['name'] ); ?>
тогда можно проверять какая именно кнопка была нажата
Код PHP:
  1. $is_submitted = $inCore->request->has('название_нашей_кнопки_с_типом_submit');
InstantCMS Team
small user social cms
МедальКубок зрительских симпатийАвторитет форума
Сообщений: 1343
Loadырь:
Проблема решается если у инпута с типом submit в файле \templates\default\assets\ui\form.tpl.php в строке 188 можно было бы задать имя тегу name.
Так ведь можно.
Код PHP:
  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);
Редактировалось: 1 раз (Последний: 1 декабря 2014 в 21:11)
В начало страницы
Предыдущая темаСледующая тема Перейти на форум:
Быстрый ответ
Чтобы писать на форуме, зарегистрируйтесь или авторизуйтесь.