Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: xFormer. Класс для генерации форм.
Форумы портала PHP.SU » PHP » Пользовательские функции » xFormer. Класс для генерации форм.

Страниц (3): [1] 2 3 »
 

1. Vinyl - 09 Мая, 2013 - 22:09:49 - перейти к сообщению
Здравствуйте, коллеги.
Одним из самых нелюбимых мною дел в web является составление форм. Немного поискав класс для их генерации, я понял, что удобного для меня в природе ещё нет. Решил написать сам.

Встречайте, xFormer Радость :

Жирным будут выделены обязательные аргументы

setTabs (Отобразить)


setSpaces (Отобразить)


setXhtm (Отобразить)


formStart (Отобразить)


formEnd (Отобразить)


getText (Отобразить)


getHidden (Отобразить)


getTextarea (Отобразить)


getPassword (Отобразить)


getCheckbox (Отобразить)


getRadio (Отобразить)


getSelect (Отобразить)


getButton (Отобразить)


getReset (Отобразить)


getSubmit (Отобразить)


getFile (Отобразить)


Пример 1:

PHP:
скопировать код в буфер обмена
  1. $form = new xFormer();
  2. $form->setTabs(2);
  3. $form->setXhtml();
  4.  
  5. echo $form->formStart($_SERVER['REQUEST_URI'].'?go');
  6. echo $form->getText('text1');
  7. echo $form->getPassword('pwd1');
  8. echo $form->getTextarea('textarea1');
  9. echo $form->getSubmit('Сохранить','ok');
  10. echo $form->formEnd();

↓↓↓

CODE (html):
скопировать код в буфер обмена
  1.                 <form  action="/xFormer.php?go" method="POST" enctype="application/x-www-form-urlencoded" target="_self">
  2.                 <input type="text" name="text1" />
  3.                 <input type="password" name="pwd1" />
  4.                 <textarea name="textarea1"></textarea>
  5.                 <input type="submit" value="Сохранить" id="ok" />
  6.                 </form>


Пример 2:

PHP:
скопировать код в буфер обмена
  1. $p['s1']['name'] = 'Селект 1';
  2.                
  3. $p['s2']['name'] = 'Селект 2';
  4. $p['s2']['disabled'] = 1;
  5.  
  6. $p['s3']['name'] = 'Селект 3';
  7.  
  8. $p['s4']['name'] = 'Селект 4';
  9. $p['s4']['selected'] = 1;
  10.  
  11. $p['s5']['name'] = 'Селект 5';
  12.  
  13. $p['s6']['name'] = 'Селект 6';
  14.                
  15. $form = new xFormer();
  16. $form->setTabs(1);
  17.  
  18. echo $form->formStart($_SERVER['REQUEST_URI'].'?go');
  19. echo $form->getSelect('sel1',$p);
  20. echo $form->getSubmit('Сохранить','ok');
  21. echo $form->formEnd();

↓↓↓

CODE (html):
скопировать код в буфер обмена
  1.         <form  action="/xFormer.php?go" method="POST" enctype="application/x-www-form-urlencoded" target="_self">
  2.         <select name="sel1">
  3.                 <option value="s1">Селект 1</option>
  4.                 <option value="s2" disabled>Селект 2</option>
  5.                 <option value="s3">Селект 3</option>
  6.                 <option value="s4" selected>Селект 4</option>
  7.                 <option value="s5">Селект 5</option>
  8.                 <option value="s6">Селект 6</option>
  9.         </select>
  10.         <input type="submit" value="Сохранить" id="ok">
  11.         </form>



В общем, только сегодня его написал, в бою ещё не был. Кстати, всех с Великим Днем Победы! Всем мирного неба над головой!
2. esterio - 10 Мая, 2013 - 09:04:31 - перейти к сообщению
с того чьо заметил - обичный вивод форм. меня же более интересует их обработка - проверка токена, рефера, капча например. также автоматическое разширение - календарь, плейсхолдеры, автокомплит. для админкы подойдет стандарный шаблон например. ну короч хотелось бы полного фарша
3. DeepVarvar - 10 Мая, 2013 - 09:05:56 - перейти к сообщению
Vinyl пишет:
echo $form->
Ненене, так не пойдет. Никаких эхо (эчо), только буферизация!
И только в шаблоне, либо getGeneratedHTML() либо реализуй __toString(), тогда будет просто echo $form;
Мало ли где я захочу форму вывести, после того как в контроллере например её сформировал.
Ну и соответственно с таким подходом все геттеры переименовать в сеттеры.

Щас исходник гляну - откаменчу тоже.
(Добавление)
esterio пишет:
хотелось бы полного фарша
Тогда еще один типа совет - для желаемого esterio фарша добавить возможность прицеплять плагины.
Так например чем текстария не плагин?
Ну и далее..

Еще пока не забыл - очень важно, это декораторы.
Бывает из-за верстки нужно обернуть элемент например в див(-ы).
(Добавление)
Псмотрел исходник.
Да, а что, разве нельзя сделать красиво через DOMDocument (или что там еще есть)?
Я не осуждаю - я спрашиваю.
Конкатенация как-то не кошерно выглядит, оно полюбому быстрее будет генерить встроенными средствами нежели конкатенацией.
4. esterio - 10 Мая, 2013 - 09:21:48 - перейти к сообщению
думаю от использования DOMDocumrnt мы не получим существеного вииграша. лучше файл шаблона обгорнутый в ob_*
5. DeepVarvar - 10 Мая, 2013 - 09:25:07 - перейти к сообщению
esterio пишет:
не получим существеного вииграша

DeepVarvar пишет:
полюбому быстрее будет генерить встроенными средствами нежели конкатенацией
6. Vinyl - 10 Мая, 2013 - 09:51:10 - перейти к сообщению
esterio пишет:
с того чьо заметил - обичный вивод форм
Мне только это и нужно было. Для валидации существует множество различных решений.

DeepVarvar пишет:
Ненене, так не пойдет. Никаких эхо (эчо), только буферизация!
Я для примера использовал, дабы показать, что выводится. Мог конечно собрать все в переменную, потом echo {переменная}, только вот в примере не вижу смысла.

DeepVarvar пишет:
Мало ли где я захочу форму вывести, после того как в контроллере например её сформировал.
Дык пожалуйста, собирайте внутри контроллера форму в переменную, потом передавайте её в вид.

DeepVarvar пишет:
добавить возможность прицеплять плагины.
Мне не совсем понятно, что именно Вы имеете ввиду. Тут трактовать можно по-разному. То ли плагин к классу, то ли JS-плагин к textarea.

DeepVarvar пишет:
Так например чем текстария не плагин?
xFormer генерит textarea. Если нужно что-то кастомное добавить в атрибуты, есть параметр $string, если внутрь textarea, для этого есть $text. Или я Вас опять не понял?

DeepVarvar пишет:
Еще пока не забыл - очень важно, это декораторы.
Бывает из-за верстки нужно обернуть элемент например в див(-ы).
Ну в том же контроллере
PHP:
скопировать код в буфер обмена
  1. $content = '<div ... >'.$t=form->getText('text1').'</div>'


DeepVarvar пишет:
Да, а что, разве нельзя сделать красиво через DOMDocument (или что там еще есть)?
Я, признаться, никогда им не пользовался.

DeepVarvar пишет:
Конкатенация как-то не кошерно выглядит
Чего-то все последнее время на конкатенацию бочку катят)) Не знаю, по мне так норм. Хотя если Вы пишете, что DOMDocument будет быстрее работать, то это весомый аргумент, спасибо.
7. DeepVarvar - 10 Мая, 2013 - 10:49:33 - перейти к сообщению
Vinyl пишет:
Ну в том же контроллере
Это то какраз не верно, мы тут мух с котлетами попутаем сразу. Разделяли, разделяли (вид от логики) и тут на тебе - теги в контроллере..

И я имел виду что форма сама должна уметь хранить свое состояние.
Я не должен заботиться о том, что мне надо какую-то переменную заводить лишнюю для того, чтобы хранить состояние экземпляра формы в данной области видимости.
Может я её (форму) по ссылке захочу передать куда-то еще, чтобы забить еще тридцатью полями.
Не передавать же туда недозаконкатенированную строку формы?
А там, на новом месте создавать еще один экземпляр формы?


Так, если экземпляр будет хранить свое состояние, то:

1) Можно передать его куда угодно и дозабить там данными.
2) Не будет проблемы, сгенерили мы "шапку" формы или нет, надо ли нам закрывающий тег формы или нет - генерация строки только в самом конце, когда попросят.
3) Полная инкапсуляция данных в конкретном эккземпляре.
4) Можно добавить возможность "на лету" изменять установленные ранее значения опшнов, чекбоксов etc..
5) Никаких лишних внешних переменных-хранилищ для тех или иных промежуточных результатов.

А иначе это и не ООП по сути, или - ООП ради ООП, или как я раньше писал статьи для новичков с названием "ООП где-то рядом", где рассматривались лишь сами принципы описания классов и создания объектов, но не их применение, где почему так и зачем.
8. LIME - 10 Мая, 2013 - 10:50:30 - перейти к сообщению
а чем http://pear.php.net/package/HTML_QuickForm2 не подходит?
9. DeepVarvar - 10 Мая, 2013 - 10:54:47 - перейти к сообщению
DeepVarvar пишет:
прицеплять плагины
Я имел виду абсолютно кастомные поля.
Так например хидден-поле, а внешне, тот же календарь, который хотел esterio, или вот мне нужна ссылка для открытия нового окна с полем загрузки файла, где после успеха, в родительское окно возвращается в это хидден-поле строка с именем загруженного файла.
10. Vinyl - 10 Мая, 2013 - 11:03:02 - перейти к сообщению
LIME пишет:
а чем http://pear.php.net/package/HTML_QuickForm2 не подходит?
ИМХО, абсолютно не удобен, тяжеловат в плане изучения.

DeepVarvar, Вы абсолютно правы. Я сразу не понял, о чем Вы. Теперь как будет время, перепишу.
11. LIME - 10 Мая, 2013 - 11:04:50 - перейти к сообщению
что там изучать??
достаточно пример посмотреть
12. Vinyl - 10 Мая, 2013 - 11:09:29 - перейти к сообщению
LIME пишет:
достаточно пример посмотреть
Смотрим пример:
PHP:
скопировать код в буфер обмена
  1. $form = new HTML_QuickForm2('tutorial');
  2.  
  3. // Set defaults for the form elements
  4. $form->addDataSource(new HTML_QuickForm2_DataSource_Array(array(
  5.     'name' => 'Joe User'
  6. )));
  7.  


Мне хватает new HTML_QuickForm2_DataSource_Array, передаваемого в качестве аргумента, чтобы отказаться от HTML_QuickForm2. Опять же, лично мне.
13. DelphinPRO - 10 Мая, 2013 - 11:21:44 - перейти к сообщению

Блин, крайне интересно посмотреть код, но вот скачивать лень Улыбка
Почему на гитхаб не положить?
14. caballero - 10 Мая, 2013 - 11:29:16 - перейти к сообщению
не очень понял чем это проще вместо накидать форму каким нибудь дримвьювером.

и как быть с отделением дизайна от кода?
15. LIME - 10 Мая, 2013 - 11:29:54 - перейти к сообщению
бегло глянул
PHP:
скопировать код в буфер обмена
  1. $this->checkedTag = ' checked="checked"';
а если завтра еще какой-нибудь атрибут придумают...класс править будем?
предлагаю типа
PHP:
скопировать код в буфер обмена
  1. setAttr( ' checked="checked"');
только это все нафиг никому не надо без инкапсулированного обработчика

 

Powered by ExBB FM 1.0 RC1