Помогите с QuickForm_Controller

Julik

Guest
Помогите с QuickForm_Controller

История очень простая.

У меня форма из двух страниц. Я хочу добиться следующего функционала:

1. Если значение одно из полей на первой странице совпадает с заданным, то вторую страницу показываем (и валидируем), только потом вызываем Process action.

2. Если значение не соответствует заданному, то вторую страницу мы просто пропускаем (даже без дефолтных значений, она может просто передавать пустые массивы) и сразу выполняем Process action.

Пока что натворил такой Action (все ненужное пропускаю):
PHP:
class PageFirstHandler extends HTML_QuickForm_Action_Next {
    function perform(&$page, $actionName) 
    {
      // save the form values and validation status to the session
        $page->isFormBuilt() or $page->buildForm();
        $pageName =  $page->getAttribute('id');
        $data     =& $page->controller->container();
        $values = $page->exportValues();
        $valid  = $page->validate();
		
        // Modal form and page is invalid: don't go further
        if ($page->controller->isModal() && !$valid) {
            //this calls the action defined in the controller
            return $page->handle('display');
        }

        $nextPageId = $this->_nextPageId;
        $nextPage = &$page->controller->getPage ($nextPageId);
        
        //тут я делаю свою проверку значений
        if ( $this->CompareValues ($values) ) {
			$nextPage->handle ('display');
		} else {
			//freeze all and get export values
			$nextPage->handle ('process');
        }
    }
...
Этот Action назначается первой странице в качестве next, второй в качестве next назначается process.
PHP:
$page1->addAction('next', new PageFirstHandler());
$page2->addAction('next', new ActionProcess());
Вроде как работает, но вторая страница почему-то сразу выполняет Process. Для нее что-ли надо сделать в качестве Next отдельный Action, наследующий от Process который каким-то образом вызывает $page->validate() и если что-то не так делает $page->display()?

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

В примере statemachine разобраться как следует не смог, времени не хватает.

Помогай, Sad Spirit.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Re: Помогите с QuickForm_Controller

Автор оригинала: Julik
В примере statemachine разобраться как следует не смог, времени не хватает.

Помогай, Sad Spirit.
Две эти фразы вместе звучат как "напиши за меня скрипт, у тебя наверное больше свободного времени".

Для перехода между страницами формы надо делать
PHP:
$nextPage->handle ('jump');
а не
PHP:
$nextPage->handle ('display');
.
 

Julik

Guest
ты не прав

вместе они звучат как "ткни меня носом в мою ошибку, поскольку ты - lead этого компонента"

или я ошибся? ;-)

все равно спасибо, сегодня вечером попробую

-~{}~ 01.09.04 15:34:

Спасибо, в итоге все получилось.

Понадобилось (как ты и говорил) слегка подправить Next первой страницы. То есть фактически на мою ошибку ты и ткнул :)

Медленно оно все работает правда, но очень уж практично.

Кстати (на правах оффтопа) - методы доступа к конфигурации виджета у вас не планируются (чтобы мне в рендерере можно было не делать из содержимого поля ввода text node а выводить его своим способом)?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Re: ты не прав

Автор оригинала: Julik
Кстати (на правах оффтопа) - методы доступа к конфигурации виджета у вас не планируются (чтобы мне в рендерере можно было не делать из содержимого поля ввода text node а выводить его своим способом)?
Не очень понимаю вопрос. Поясни.
 

Julik

Guest
поясняю

есть QuickForm Renderer. Я его наследую и создаю свой, в котором реализованы те же методы, которые в переданном конструктору дереве DOM-документа создают узлы и атрибуты (в духе <widget label='Введите имя' qf-type='text'>...</widget>)

Зачем? У меня XSL-шаблон, я хитро вывожу им форму. Я не могу быть уверен что обычный XHTML- render будет выводить well-formed код.

Но загвоздка в том что все рендереры, на которые я смотрел, для вывода непосредственно элемента формы используют $element->getHTML(), что мне не подходит. А способа как-то цивильно (через public методы-свойства) получить сам тег формы (как он называется, какие у него дети и пр.) я не нашел; Могу конечно вхакнутья например в private var $_options для select, но вот проидет полгода - и он останется? Поскольку он private - не уверен.

Пока я цепляю getHTML() и кладу его в DOM внутри текстового узла, а потом вынимаю в XSL через disable output escaping. А количество невалидного XML надо сокращать, потому как иначе нельзя наложить несколько XSL подряд.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
получить атрибуты тега можно через публичный метод getAttributes(), всякие options --- по-моему никак.

но вообще-то весь генерируемый HTML должен быть well-formed, если где-то не так --- открывай баг-репорт.
 

Julik

Guest
ок,

тогда нужно парсить каждый кусочек этого XML в DOM, что отнимает немеряно времени и памяти :) ладно, в порядке эксперимента выключу output-escaping, посмотрим что из этого выйдет. Жалко что нету в официальном ДОМе опции innerXML :)
 
Сверху