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
    ));
4

1 回答 1

3

了解表单和操作:
通常我们会设置一个带有字段的表单,将其打印在一个 html 页面中并用数据填充表单。按下提交表单按钮会将所有数据发送到表单actionhtml 属性中定义的方法。
该方法将接收并获得一个$request带有很多参数的 ,以及带有数据的表单。这些值将在操作中处理。

让我们看看它在 symfony 中是如何工作的:

  • 定义和设置一个 symfony 表单,就像上面显示的那样。打印表单并在动作参数中指向将接收请求的提交方法:

    <form action="currentModuleName/update"

  • Symfony 会自动将请求发送到action.class.php 你的模块,并会查找数据并将其发送到函数 executeUpdate

    public function executeUpdate(sfWebRequest $request){
    //...
    $this->form = new TestForm($doctrine_record_found);
    $this->processForm($request, $this->form);
    }

  • 经过一些检查后,symfony 将处理表单并设置结果模板。

    processForm(sfWebRequest $request, sfForm $form) { ... }
    $this->setTemplate('edit');

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'];
    }
  }


您可以查看以下链接以获取与您类似的示例,了解如何处理sfWidgetFormChoice.
现在回答真正的问题,为了选择已删除的用户,请在您的操作中添加以下代码:

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



将变量从动作传递到表单:
如果我完全不理解您的问题,请原谅,但如果您需要将一些参数从动作传递到表单,请将数组中的初始化变量发送到表单构造函数:
传递变量到 Symfony 表单
在您的情况下,获取用户列表,删除您不想要的用户并将未删除的用户发送到表单构造函数。
您将需要在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.
  }
}
于 2013-06-25T08:07:52.630 回答