Как получить доступ к связанному объекту в форме, отображаемой в Symfony 1.4 - PullRequest
1 голос
/ 20 мая 2011

Мне нужно отобразить форму для ввода сообщения в блоге на той же странице, на которой отображается новость. Пользователь вводит сообщение в блоге, связанное с историей.

В форме блога я сейчас делаю это, чтобы получить идентификатор отображаемой истории:

public function configure()
{
    $this->setWidget('image_filename', new sfWidgetFormInputFileEditable(array(
    'file_src'    => '/uploads/blogpost_images/thumbnails/thumb_'.$this->getObject()->image_filename, //displayed for existing photos
    'edit_mode'   => !$this->isNew(),
    'is_image'    => true,
    'with_delete' => false,

    )));

    $this->setValidator('image_filename', new sfValidatorFile(array(
      'mime_types' => 'web_images',
      'required' => $this->isNew(),
      'path' => sfConfig::get('sf_upload_dir').'/blogpost_images',
      'validated_file_class' => 'BlogPostValidatedFile',
    )));
    $this->setValidator('url', new sfValidatorUrl(array('required' => true)));
    $this->setValidator('title', new sfValidatorString(array('required' => true)));

    $this->setWidget('user_id', new sfWidgetFormInputHidden(array(),array(
        'value'=>sfContext::getInstance()->getUser()->getId())
            ));

    // get the request params to access the notice ID and pass it back to the form for
    // saving with the blog post

    $params = sfContext::getInstance()->getRequest()->getParameterHolder();

    $this->setWidget('notice_id', 
            new sfWidgetFormInputHidden(array(),array(
                'value'=>$params->get('id'))
                    ));

    $this->removeFields();


}

Есть ли более чистый способ сделать это? Чувствует себя хакером, принимая идентификатор уведомления (новости) из параметров запроса.

UPDATE

На самом деле я отправляю форму из модального диалога через ajax и пытаюсь сохранить значение note_id в запросах. Я связываю свои параметры с формой, прежде чем вернуть ее для отображения ошибок:

  public function executeModal(sfWebRequest $request) {

  if ($request->isXmlHttpRequest()) {
    //return $this->renderText('test'.$request->getParameterHolder()->getAll());
    $params = $request->getParameter('nb_blog_post');
    $form = new nbBlogPostForm(null,array('notice_id',$request->getPostParameter('notice_id')));

    $form->bind($params,$request->getFiles());


    if ($form->isValid()) {
      $nb_blog_post = $form->save();
      $this->getUser()->setFlash('notice', 'Your blog post was successfully created');
      $this->redirect('@noticeboard');

    } else {
      return $this->renderPartial('form',array('form'=>$form,'form_id'=>'blogpost'));
    }
  }


  }

Кажется, я не могу связать note_id с формой (это скрытое поле). Остальные значения являются обязательными.

I've also tried $form = new nbBlogPostForm(null,array('notice_id',$request->getPostParameter('nb_blog_post[notice_id]')));

ДОПОЛНИТЕЛЬНОЕ ОБНОВЛЕНИЕ

При первом прохождении через метод настройки формы полагается на то, что в запросе присутствует note_id, я думаю, что он устанавливал это значение в null, когда форма снова создавалась через ajax. Это исправляет это:

   $params = sfContext::getInstance()->getRequest()->getParameterHolder();
    if (($params->get('id'))) {
    $this->setWidget('notice_id', 
            new sfWidgetFormInputHidden(array(),array(
                'value'=>$params->get('id'))
                    ));
    } else {
          $this->setWidget('notice_id', 
            new sfWidgetFormInputHidden());

    }

Если у кого-то есть более чистый способ, пожалуйста, дайте мне знать.

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

Правильный путь:

$form = new YourForm(null,array('notice_id' => $notice_id));

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

UPDATE

С новой предоставленной информацией. У вас есть два варианта, первый:

Создайте новый метод внутри вашей формы следующим образом:

public function setNoticeId($id){
$this->getWidget('notice_id')->setAttribute('value'),$id);
}

Затем назовите его после создания формы в вашем действии:

$this->form = new Form();
$this->form->setNoticeId($id);

Второй - не устанавливать идентификатор уведомления при отображении формы, а передавать этот параметр в действии создания так, как я упоминал ранее:

public function executeCreate(sfWebRequest $request)
{
$this->form = new Form(null, array('notice_id'=>$id));
$this->processForm($request,$this->form);

}

Затем вы должны использовать его в вашем методе сохранения формы (в начале) и назначить его нужному полю следующим образом:

$this->values['notice_id'] = $this->getOption('notice_id');

Первый метод более понятен, но последний полезен, когда вам нужны данные, не относящиеся к вашему объекту, например, если вам нужно сохранить изображение с вашим постом в папке пользователя и вам нужно имя такого папка пользователя.

Надеюсь, это поможет.

1 голос
/ 20 мая 2011

Я думаю, что самый простой и удобный способ сделать это - передать значение по умолчанию для элемента формы при создании нового объекта формы.

Примерно так:

$form = new YourForm(array('notice_id' => $notice_id));

Это автоматически установит значение для вашего элемента формы.(А также работает для всех элементов формы.)

С уважением.

...