Pull to refresh

Comments 37

Мне кажется, вы напрасно так эксплуатируете светлый образ jQuery не имея к оному ни малейшего отношения… (ну в смысле да, вы его используете, но это отдельный продукт, и лого с названием вводят в заблуждение)
Изначально префикс «j» означает «javascript»/«jaguarsoft», был введен потому, что возникало некоторое отклонение от базового пакета HTML_QuickForm2.
Про лого — согласен, уберу обязательно, шапка для сайта делалась на скорую руку, большее внимание уделялось функционалу и документации.
А по-моему вообще не оправданный союз. Зачем тратить время на изучение всего этого API под девизом «Ленивым программистам посвящается», чтобы впоследствии извращаться, пытаясь заточить это под конкретный проект, когда можно это время потратить на изучение Жучки и Пых-Пыха в отдельности, и потом в 3-15 создавать любые формы, и не только…
Николай, не собираюсь никого уговаривать, но изучать практически ничего и не придется, бОльшую часть потребностей можно без знания API использовать, работает автокомплит в IDE — никаких вызовов магических функций с непонятными параметрами.

Если Вы свои нужды покрываете «Жучкой и Пых-Пыхом» — значит Вам это не нужно, только и всего!

Топик для тех, кому это нужно — я просто поделился еще одним вариантом работы с формами, который НЕ претендует на звание единственно правильного решения.
Ну чтож, каждому своё, и своё не каждому…
Кстати, за фидбэк: сейчас заглянул опять на твой сайт, там в примерах на «минимум» выбираю все 3 цвета, а он все равно говорит «Надо выбрать хотя бы два цвета». Наверно надо поправить.
jquickform.ru/?page=rules_min
мда… вместо формы использовать вот это Г… Код неочевиден, значения определяются в контроллере, а не шаблоне, либо код перезжает в шаблон. спасибо, нинада
«Ведь порой столько времени теряешь на запуск какой то новой штуки, так как автор не позаботился о быстром старте.» — люди 100% потеряют больше времени, пытаясь выковырять из «дистрибутива» необходимые части и не удалить случайно нужное. А я на безопасно настроенном сервере потратил час на попытки запустить хотя бы ваш бандл и в результате плюнул, потому что после того, как исправил все &lt? на &lt?php, выяснилось, что у вас ещё и пути прописаны так, что не позволяют запустить сайт не из корня.

Не делают так. Дистрибутив должен быть отдельно, примеры отдельно, а сайт целиком вообще никому не нужен.

Спасибо за отзыв, учту в следующих версиях — добавлю конфигуратор, чтобы запускалось из любого места.
>то уже во второй версии появилась возможность делать только клиентскую проверку.
Сильный ход. Можно поинтересоваться — зачем?
Отвечает автор HTML_QuickForm2 — Sad Spirit:
«ну это на случай если проверка на клиенте и на сервере будет СИЛЬНО разная»
Может у него и пример есть наготове? А то я что-то придумать не смог…
Отвечу сам:
проверка электронного адреса на клиенте — регекспом
проверка электронного адреса на сервере — filter_var()

Правильнее было бы поризводить AJAX-валидацию, но дать такую возможность (добавление ТОЛЬКО клиентского правила) следовало, мало ли что может понадобиться разработчику.
Зачем так много кода? Особенно в шаблоне? Аж 6 действий для вывода формы.
Это дает возможность не заморачиваться тем, что в шаблоне будут постоянно подключенные, абсолютно не нужные стили и скрипты, а подключать их по мере необходимости частями, т.е. генерировать на лету.
Это дает возможность легко забыть что-нибудь написать, допустить очепятку и т.п. и т.д. Сложно было сделать всего лишь два метода?
Пожалуй, соглашусь — внес изменения, сейчас будет так для Коханы:
<?
$this->template = new View('module/page');
$this->template->jquickform->css = Jaguar::css()->getAll();
$this->template->jquickform->js = Jaguar::js()->getAll();
$this->template->jquickform->form = $form;
?>

Разделять эти вещи все равно требуется, так как стили должны быть в HEAD, форма внутри BODY, а скрипты перед закрывающимся BODY.
Когда я вижу всякие такие чудесные генераторы форм, всегда интересует вопрос — а как они дружат с формами, когда выбор последующих данных зависит от выбора предыдущих? Тем более если они вовсю используют jQuery. У вас можно сделать, чтобы при выборе в select-e производителя автомобилей в следующий сразу же подгружались все марки этого производителя, а в — третий, допустим, все возможные цвета? И без уличной магии, желательно. И что мне делать, если есть уже сверстанная очень красивая и удобная форма в HTML, и мне надо просто прикрутить валидацию и фильтры?
Да, вещь неплохая. Но в данном случае мне доступна только клиентская валидация, серверную придется либо реализовывать самому, либо выпиливать напильником из того же jQuickForm. Интересней было бы все таки описывать правила валидации на сервере, чтобы если ушлый посетитель отключил JS, форма отвалидировалась и на сервере. Да и все эти зависимости переключения полей там же, чтобы потом JS либа просто прошлась по всем полям и навесила обработчики самостоятельно.

Это хорошо, когда разработчик и JS, и HTML, и PHP знает, а порой то пэхапе кодер норовит при виде HTML+JS в обморок упасть, то верстальщик и программист — 2 разных человека. То есть хочется: программер описал форму, дал верстальщику один файлик JS, который тот в прописал, и все. Верстальщик форму как хочет сам верстает, придерживаясь только выданных названий полей (ну или просит программера, тот вставляет один вызов генерации формы и та плюет готовый HTML).
>>У вас можно сделать, чтобы при выборе в select-e производителя автомобилей в следующий сразу же подгружались все марки этого производителя,
>>а в — третий, допустим, все возможные цвета? И без уличной магии, желательно.
В принципе можно, в базовом пакете HTML_QuickForm2 есть такой элемент, добавил пример использования jquickform.ru/?page=elements_hierselect

Специально для Вас сделал пример, в котором ЧЕТЫРЕ связанных селекта:
<?
  $form = new jQuickForm('simple');
  Jaguar::js()->addJs('/js/quickform-hierselect.js');
  $fieldset = $form->insertFieldset('Варианты использования text');

  $select1[0]    = 'Toyota';
  $select2[0][0]  = 'Corolla';
  $select3[0][0][0] = 'Красный';
  $select4[0][0][0][1] = 'Дизель';

  $select3[0][0][1] = 'Синий';
  $select4[0][0][1][0] = 'Карбюратор';
  $select4[0][0][1][1] = 'Дизель';

  $select2[0][1]  = 'Mark II';
  $select3[0][1][0] = 'Зеленый';
  $select4[0][1][0][0] = 'Карбюратор';

  $select3[0][1][1] = 'Красный';
  $select4[0][1][1][0] = 'Карбюратор';

  $select3[0][1][2] = 'Синий';
  $select4[0][1][2][0] = 'Дизель';

  $select1[1]    = 'ВАЗ';
  $select2[1][0]  = '2101';
  $select3[1][0][0] = 'Зеленый';
  $select4[1][0][0][0] = 'Карбюратор';

  $select2[1][1]  = '2109';
  $select3[1][1][0] = 'Синий';
  $select4[1][1][0][0] = 'Карбюратор';

  $select1[2]    = 'ГАЗ';
  $select2[2][1]  = '31029';
  $select3[2][1][0] = 'Зеленый';
  $select4[2][1][0][0] = 'Карбюратор';

  $select3[2][1][0] = 'Красный';
  $select4[2][1][0][0] = 'Карбюратор';

  $select3[2][1][2] = 'Синий';
  $select4[2][1][2][0] = 'Карбюратор';

  $sel = $fieldset->addElement('hierselect', 'auto')->setLabel('Выбор автомобиля:')->addClass('col4');
  $sel->loadOptions(array($select1, $select2, $select3,$select4));
  $fieldset->insertInputSubmit('Post!','save');
?>


* This source code was highlighted with Source Code Highlighter.


На следующей неделе выпущу обновление, он там появится — пока вручную добавил на сайт пример, еще даже в SVN нет.
Это примерно то, о чем Вы спрашивали? Или нужна AJAX-подгрузка в зависимые элементы? тут все в inline-javascript собирается
Ну вообще, в общем случае, да Ajax.
Про AJAX-формы я еще думаю как лучше, но в планах это есть. В принципе, API QuickForm2 это достаточно легко позволит, но такого решения абстрактного как описал выше сделать скорее всего не получится.
Но идею Вашу я уловил, буду думать, возможно ли это сделать.
Так вроде ничего такого сложного нет. В принципе то, какие данные в какой селект подставлять определяет сам разработчик, поэтому вам для связи достаточно просто указать для связанных элементов шаблоны запросов к серверу. То есть, как я это вижу:
Допустим, есть родительский селект (parent) и подчиненный ему второй(child), и предположим, что данные для child-а сервер выдает по запросу www.site.com/get_child_values.php?parent_value=Toyota|VAZ|etc
Тогда связь можно описать в виде
{
'parent'=>'developer',
'child'=>'model',
'method'=>'ajax',
'url'=>' www.site.com/get_child_values.php?parent_value=#value#', // представляем URL в виде шаблона, где вместо #value# будет подставляться value parent-а
}
разобрать связь такого вида и описать в виде обработчиков на JS — плевое дело. Единственно, что при смене содержимого child-а надо на него генерировать событие onChange чтобы если на нем висят другие зависимые поля — они тоже вызвались, этакая каскадная загрузка зависимых данных получается.

Правда может быть вариант, когда зависимых полей большей одного, тогда по хорошему надо создавать массив связей.
В принципе, в каком то моем велосипедном генераторе форм это было сделано, но там генератор был скрещен с ORM-ом, поэтому избыточного кода с описанием было очень мало, роль связей играли FOREIGN KEY-s, а URL для получения данных был один, просто в паттерн URL-а подставлялись не только значение родителя, но и названия полей, и скрипт на сервере уже сам разбирался какие данные надо было выплюнуть.
В таким контролах еще один интересный момент — что показывать при первом показе формы?
вариант 1, как это было сделано на мамбе по-моему:
«Тойота Королла Инжектор Синяя» это текст option в select, его значение с разделителями {mark}_{model}_{type}_{color}
последним option в select был «другой» при выборе которого появлялся попап, а уже в нем связанные селекты, и когда делался выор в последнем, это был город (после страны и области), то агрегированное значение страна_область_город вставлялось в исходный селект.
вариант 2 — загружать все связанные и заполненные поля

что думаете?
Ну по сути, 99% полей должны иметь значение при первой загрузке типа «выберите [страну|район|город|и т.д.]». Потому как подставлять какие то значения по умолчанию нехорошо (если конечно, мы не определили город посетителя по IP и вероятность того, что ему придется в них что то перевыбирать — очень мала). А если мы о человеке ничего не знаем — то он должен выбрать сам. Иначе, если там что то уже будет выбрано — то мы не сможем отвалидировать, действительно ли человек что либо ввел, либо это наши умолчательные значения и регистрация в этом случае будет фейковой.
Вопрос немного в другом: при первой загрузке виджета должен быть ОДИН агрегированный селект со значения типа "{mark}_{model}_{type}_{color}" у каждого элемента или сразу загружать и _показывать_ ВСЕ 4 селекта, пусть и пустыми.
Склоняюсь к первому варианту. а Вы?
Все равно, если честно, не понял :) Ведь если мы изначально в mark грузим список марок, но при этом не выбрана ни одна из них — то понятно, что во всех остальных селектах будет пусто. А если мы грузим какое то значение по умолчанию — то тут либо мы уже прямо на сервере в остальные селекты уже знаем что грузить и подставляем значения, либо чтобы все было проще — при загрузке формы выбираем значение по умолчанию JS-ом, тогда все остальные select-ы подгрузятся каскадно. Понятно, что в этом случае будут лишние AJAX запросы к серверу, но описание всего этого будет единообразно как для первого, так и для последующих показов формы.

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

Если вам удастся сделать такую вещь, и при этом не надо будет писать многокиллобайтной логики — то лично я с большим удовольствием бросил все свои велосипеды :)
>>Все равно, если честно, не понял :) Ведь если мы изначально в mark грузим список марок, но при этом не выбрана ни одна из них — то
>>понятно, что во всех остальных селектах будет пусто.
Вопрос в том, надо ли их вообще показывать?

>>Если вам удастся сделать такую вещь, и при этом не надо будет писать многокиллобайтной логики — то лично я с большим
>>удовольствием бросил все свои велосипеды :)
Думаю все-таки удастся, один момент — придется использовать нечто в качестве источника данных, а это уже не относится к генератору форм. Хотя, в принципе можно просто в качестве источника использовать callback-источник, возвращающий массив, а как именно он будет его формировать — дело лесятое.
В общем, записал в планы задачу, мне оно тоже надо.

+ еще одну фичу хочу, это совмещение «autocomplite-one» и группы чекбоксов, поясняю примером — задача в том, чтобы составить список модераторов для форума, вводим первые букву имени, выбранное значение добавляем в чекбокс группу.
вот, нашел иллюстрацию — wharsojo.wordpress.com/2008/02/18/jquery-facebook-autocomplete/
UFO just landed and posted this here
Не обязательно, в следующих версиях я планирую убрать лишние зависимости
UFO just landed and posted this here
$form = new jQuickForm('simple');
$form->addHidden('hidden_name');

как то так…
UFO just landed and posted this here
Only those users with full accounts are able to leave comments. Log in, please.