Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужен ваш мозг - PHP ООП CMS, Валидация данных форм, модули CMS и др. 
:(
    Опции темы
Akme
  Дата 14.3.2011, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 27.3.2010

Репутация: нет
Всего: нет



Добрый день, коллеги, гуру, начинающие и все, кто на заднем ряду!

Вероятно эта тема покажется вам странной, но всё же: побудьте, пожалуйста, моей доской!  ;) 
Предыстория: работал с людьми и, в процессе обсуждения проблем, рождалось много нового и интересного, сейчас работаю один и мой разум завел меня в некий тупик.

Сразу оговорюсь: всех кто хочет поспорить об изобретении велосипедов, о готовых решениях о чьей-либо некомпетентности и т.п., а также элементов, не умеющих формулировать вопросы, судить объективно и думать в принципе, прошу пока молча покурить в сторонке, пока взрослые разговаривают.

Итак, немного об общей задаче: разработка движка системы управления контентом (CMS). Есть полуготовое ядро системы, решает вопросы со страничками сайта, админкой, настройкми, базой и пр. Функционал системы дополняется модулями - точнее, так уж сложилось, пакетами расширения, которые могут включать в себя модули (отвечают за представление данных определенной страницы или страниц - основной контент), виджеты (размещаемые в произвольных местах "куски контента" представляющие ту или иную инфу) и плагины (название конечно не очень-то подходящее, но сие подключается при запуске системы, при выполнении определенных условий и производит НЕЧТО, что пользователь не видит).
Чтобы было понятнее приведу пример, ммм... допустим пакет "Новости" - есть модуль просмотра списка новостей постранично, модуль просмотра выбранной новости, модуль добавления новости - это все отдельные страницы (с отдельными адресами), типа /news/, /news/view/654/, /news/add/
Виджетом может быть блок типа "пять последних новостей" или "случайная новость"... думаю, понятно к чему я
Плагинов в пакете "новости" нет  smile

Великая цель, на данном этапе, сделать расширения функционала максимально независимым от реализации движка и максимально упрощенным, иными словами, хотелка требует, чтобы добавление модуля заключалось только в описании используемых свойств и реализации функционала. Конечно еще нужно решить вопрос с необходимыми таблицами в бд и некоторыми мелочами, но пока, этот вопрос считается решенным.
Приведу абстрактный примерчик того, как может выглядеть новый модуль, чтобы прояснить картинку:

Код
<?
   class pkgPacket_modMyModule extends clsModuleBase {

     function indexAction( $user, $request, &$data ) {
        ...
        $data['content'] = 'новости';
        $data['title'] = 'title';
     }

     function viewAction( $user, $request, &$data ) {
        ...
     }
   }
?>


Как-то так  smile 

На данный момент есть затык с формами, а точнее с их проверкой.
Т.е. по логике как происходит - форма отображена юзеру, он заполняет данные, данные проходят валидацию и либо отдаются обработчику формы (функция в модуле), либо постятся месаги об ошибке заполнения и снова отображается форма.

Так вот, не хочется по сто раз писать валидацию данных форм, но хочется и назначать полям "особые" валидаторы. С другой стороны не хочется, чтобы формы было запарно описывать, т.е. минимум движений (ах, мечты, мечты)

В общем у меня есть варианты: 
* описывать формы отдельными классами - тогда обработчик в себе, все связи и прочее, наследуем от базовой формы, которая имеет валидаторы для распространенных типов полей, но много возни с созданием класса, назначением обработчиков и пр. 
* делать регистрацию формы, т.е. при первом обращении - скармливаем описание - поля, типы, валидаторы и пр. 
* что-то было еще =)

По-сути, самое замороченное - это механизм определения что нам пришло и что с ним делать =)
Т.е. либо прописываем в самой форме откровенный изврат типа хиденнов - class=>clsMyForm 
либо учим движок узнавать формы или по странице или по ID
дальше надо как-то получить какие поля и как их проверять
и какому обработчику отдать на съедение

В общем, на этом моменте у меня закипает мозг, а интуиция молчит...
пока первое, что ближе всего крутится - это хранить ID форм в сессии, только если форма была хоть раз загружена и где-то рядом хранить определение этой формы...

Для чего я это всё написал и что я хочу получить?
Мне нужно живое обсуждение, надо расшевелить сознание =)
Спрашивайте, уточняйте, давайте советы, приводите свои подходы, рассказывайте как у вас получилось, а как нет, даже если вы ничего не поняли из того, что я написал smile
Очень нужна помощь! В долгу не останусь, участвующим и сочувствующим в благодарность помогу словом или делом, в зависимости от степени участия =)
PM MAIL   Вверх
Clickbeetle
Дата 17.3.2011, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Ну что ж, давайте пообщаемся smile . 
Я вот что предлагаю, сделать во-первых класс для формы:
Код

Class form
{
    //Имя формы
    protected $form_name;
    // Массив элементов формы
    protected $form_elements;
    // Название кнопки HTML-формы
    protected $button_name;
    //Метод (POST/GET)
    protected $form_method;
    //Action формы
    protected $form_action;
       //Суда можно добавить стили и прочее
       
       public function __construct($form_name, .................)
       {
         $this->form_name = $form_ name;
         .
         .
         . 
         $this->form_elements = array();
       }
       //Метод добавляет элемент формы (текстовое поле,флажок, переключатели) к форме в зависимости от значения переменной $form_element_type;Метод  является по своей сути фабричным методом с параметром
       //Тут присутствует параметр $validation_function, если его оставить пустым, то в классе  элемента формы будет использоваться функция валидации по умолчанию, а можно передать имя пользовательской функции, тогда класс будет использовать ее
       public function add($form_element_type,$form_element_name,$form_element_value,$required,$validation_function = "")
       {
            switch($form_element_type)
            {
                   case "text" :
                   //Если например передано "text", создаем объект класса form_text_element
                   $this->form_elements[$form_element_type] = new form_text_element($form_element_name,$form_element_value,$required,$validation_function));
                   break;
                   .
                   .
                   .
            }
       }
       public fuction get_html()
       {
         //тут формируется html код формы
         $html = "<form>";
         .
         .
         .
         foreach($this->form_elements as form_element)
         {
           //У каждого объекта классов элементов форм получаем его html представление
           $html.= $form_element->get_html();
          }
          return $html;
       }
       public function validate_form()
       {
         foreach ($this->form_elements as form_element)
         {
           $error[] = $form_element->validate();
         }
         return $error;
       }
}

Ну и собственно остается создать абстрактный класс элементов форм
И от него унаследовать разные типы элементов форм.

Проблема с валидацией ,с моей точки зрения, решена. Если мы не передаем в функцию Add значение для $validation_function, то будет использоваться функция по умолчанию для конкретного класса элемента формы. Например для класса реализующего элемент "текстовое поле", логично по-умолчанию проверять просто на пустое значение. Но например если мы его используем для e-mail, тогда просто создаем глобальную функцию проверки e-mail и передаем ее название в функцию Add класса form.

Собственно мое виденье таково и эту идею я буду использовать в своем framework)
PM MAIL   Вверх
Akme
Дата 17.3.2011, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 27.3.2010

Репутация: нет
Всего: нет



Спасибо за участие, но немножко не то.
Остается очень много не решенных вопросов:
где и кем будут создаваться экземпляры класса form, кто и на основании чего будет производить вызовы метода "Add", как система узнает, что именно "эта" форма была получена на валидацию и пр.

В пределах простой страницы, да, такое решение прокатит, единственное, что я бы сделал более изящное описание полей - в виде массива, т.к. могут быть не только поля с name=>value, а есть и селекты, и чекбоксы и радио-кнопки, плюс могут сильно пригодиться и другие свойства формы

вот так у меня сделано на данный момент:
Код

  $form_par[] = array(
    'title'=>'Название (адрес)',
    'name'=>'nick',
    'type'=>'text',
    'value'=>'',
    'autocomplete'=>'off'
  );
  
  $form_par[] = array(
    'title'=>'Тип содержимого',
    'name'=>'type',
    'type'=>'select',
    'default'=>'content',
    'options'=>array( 'content'=>'Статья', 'module'=>'Модуль' )
  );


а валидатор, в принципе, может быть сборный. И функции валидаторов, мне кажется, дабы не нарушать инкапсуляцию, лучше не делать глобальными, а положить в тот же класс формы.
PM MAIL   Вверх
Clickbeetle
Дата 17.3.2011, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Так ну тогда давайте разбираться. У вас ведь функционал расширяется с помощью модулей, тогда почему нельзя создавать объект формы прямо в модуле, проверку выполнять там же, т.к функция проверки встроена в класс формы? Вообщем напишите поподробнее в чем ваша загвоздка и какие требования вы предъявляете к формам, чтобы мы понимали друг друга)
PM MAIL   Вверх
KLeonid
Дата 22.3.2011, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Entropy
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 5.7.2007
Где: Shpongleland

Репутация: 1
Всего: 1



Все, что вам нужно, и даже более того, можно найти в готовом виде. Symfony, а точнее его форм-фреймворк. Его можно использовать отдельно, а можно в составе системы. Что даст возможность большинство работы свести к работе с объектами. Т.е. через ORM (Doctrine) работать с БД, запись в базе - это объект, с которым можно работать без всяких SQL (в большинстве случаев), например так:
Код

//для создания
$user = new User(); 
//или для редактирования  
$user = Doctrine_Core::getTable('User')->find(array($request->getParameter('id'))));
//и далее...
$user->name = 'username'; // Возможно и через стандартные методы get/set : $user->setName('username');
$user->password = md5($salt.'userpass');
$user->salt = $salt;
$user->is_active = true;
$user->save();


А с формами тоже просто, вот как производится обработка полученной формы:
Код

protected function processForm(sfWebRequest $request, sfForm $form)
{
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
    if ($form->isValid())
    {
      if($this->user = $form->save()){
        return true;
      }
    }
    return false;
}


Ну а если все же хочется делать свое, то можно просто подсмотреть код и вообще правильную реализацию.

Это сообщение отредактировал(а) KLeonid - 22.3.2011, 02:23
PM MAIL   Вверх
comcon1
Дата 30.3.2011, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: нет
Всего: 17



На самом деле, вопрос весьма актуален. Я тоже веду разработку собственной CMS и вот как я решил это. Мне правда не особо нравится. Но все же.
У меня есть два типа модулей: модули-виджеты (блоки новостей, контента, товаров и пр.) и модули-акторы.

Было принято решение, что весь код формы рисуется в шаблоне, который отображается модулем-виджетом. Принятие формы осуществляется модулем-актором. То есть для каждой формы грубо говоря два модуля, если нужно. Иногда форму можно вставить прямо в шаблон какого-нибудь другого модуля и послать на обработку модулю-актору. Модуль-актор отрабатывает в режиме redirect или в режиме ajax, это неважно. Он посылает данные обработки формы: они выводятся в XML- или JSON-формате для ajax, либо рисуются на странице редиректа. В любом случае обработка происходит не на том же запуске кода, который собсно вырисовывает сайт.


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0707 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.