2013-06-24 4 views
0

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

Действие:

$id = $request->getParameter('id'); 
$deleteForm = new UserDeleteForm(); 
$choices = array(); 
$choices = $deleteForm->getWidgetSchema('user')->getAttribute('choices'); 
unset($choices[$id]); //I obviously don't want the user to be able to transfer to the user being deleted 
$this->deleteForm = $deleteForm; 

Форма:

$users = Doctrine_Core::getTable('sfGuardUser')->getAllCorpUsers()->execute(); 
$names = array(); 
    foreach($users as $userValue){ 
     $names[$userValue->getId()] = $userValue->getProfile()->getFullName(); 
    }; 
//  unset($names[$id]); //this works, but I can't figure out how to get $id here. 
    $this->widgetSchema['user'] = new sfWidgetFormChoice(array(
     'choices' => $names 
    )); 
    $this->validatorSchema['user'] = new sfValidatorChoice(array(
     'required' => true, 
     'choices' => $names 
    )); 
+0

Почему вы отметили его symfony2? – cheesemacfly

+0

Понятно, что пользователи symfony2 начали с 1.4. Я ищу как можно больше подверженности моему вопросу. – Patrick

+2

Вместо этого вы должны использовать [щедрость] (http://stackoverflow.com/help/bounty). Следует избегать добавления не связанных тегов к вопросу, чтобы получить видимость. – cheesemacfly

ответ

3

Понимание формы и действия:
Обычно мы будем настроить форму с полями, распечатать его в HTML и заполнить форму данными. Нажатие кнопки отправки формы отправит все данные методу, определенному в вашем виде action атрибут html.
Метод получит и получит $request с большим количеством параметров, а также формой с данными. Эти значения будут обработаны в действии.

Давайте посмотрим, как это точно работает в Symfony:

  • Определение и настройка форма Symfony, как тот, который вы показали выше. Распечатайте форму и в точке параметра действия к методу , который будет получать запрос представить:

    <form action="currentModuleName/update"

  • Symfony автоматически отправит запрос на action.class.php вашего модуля, и будет искать и отправить данные функции executeUpdate

    общественная функция executeUpdate (sfWebRequest $ запросу) {
    // ...
    $ this-> form = new TestForm ($ doctrine_record_found);
    $ this-> processForm ($ request, $ this-> form);
    }

  • После некоторых проверок, Symfony будет обрабатывать форму и установить в результате шаблон.

    processForm (sfWebRequest $ запрос, sfForm $ форма) {...}
    $ this-> setTemplate ('редактировать');

В processForm вашего модуля action.class.php, вы должны обработать все полученные значения (запрос) также с формой:

protected function processForm(sfWebRequest $request, sfForm $form) 
    { 
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName())); 
    if ($form->isValid()) 
    { 
     $formValues = $this->form->getValues(); 
     $Id = $formValues['yourWidgetName']; 
    } 
    } 


Вы можете проверить следующее link для примера как ваш, о том, как обрабатывать sfWidgetFormChoice.
И теперь, отвечая на реальный вопрос, чтобы выбрать удаленные пользователи, добавьте следующий код в действии:

//process the form, bind and validate it, then get the values. 
$formValues = form->getValues(); 
$choicesId = $formValues['choices']; 



переменной Pass от действия к форме:
извинить если я вообще не понимаю ваш вопрос, но если вам нужно передать некоторые параметры из вашего действия в форму, отправьте переменные инициализации в массив в конструктор формы:
Pass a variable to a Symfony Form
В вашем случае получите список пользователей, удалите пользователя, которого вы не хотите, и отправьте не удаленных пользователей в конструктор формы.
Вам нужно будет повторно добавить/перезаписать форму в функции configure(), чтобы вы могли изменить инициализацию формы. Скопируйте и вставьте тот же код в функцию configure() и прокомментируйте строку: // parent :: setup();

class TbTestForm extends BaseTbTestForm 
{ 
    public function configure() 
    { 
     //.. copy here the code from BaseTbTestForm 
     //parent::setup(); 
     $vusers = $this->getOption('array_nondeleted_users'); 
     //now set the widget values with the updated user array. 
    } 
} 
+0

Как это ответить на вопрос? –

+0

Жаль, что я отвечал при нажатии на отправку по ошибке, прежде чем закончил. Я все еще изменяю ответ. – xtrm

+0

Да, я вижу сейчас :) Я думаю, что последняя часть будет самой полезной для OP. –