Symfony admin генератор формы объекта - PullRequest
1 голос
/ 16 декабря 2010

Эй, ребята, я использовал Symfony admin generator для модуля.

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

Я мог бы сделать это сам, переопределив функции executeNew, executeCreate в myModuleActions.class.php (что расширяет myModuleAutoActions).

Но я надеялся на более точное решение?

Возможно, нужно переопределить один из классов конфигурации. Мне в основном нужно добавить текущий sf_user объект ($this->getUser) в качестве опции "sf_user" для формы, чтобы избежать использования sfContext в myModuleForm.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 17 декабря 2010

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

Я предполагаю, что вы используете sfPropelPlugin, довольно стандартно, если вы извлекаетекод, сгенерированный в кеше (примечание: этот код будет доступен после того, как вы попытаетесь открыть модуль из браузера, поэтому сначала попробуйте посмотреть на него, чтобы у нас не было проблем: P) вы можете увидеть что-то вроде:

cache/{application_name}(generally frontend or backend)/dev(enviromnemt)/autoModule_name( look here for the module)/:

  • lib
  • action

Папка action содержит файл action.class.php, который определяет все действия, сгенерированные генератором(executeNew, Edit, Create, Update и т. д.).Если вы посмотрите на реализацию executeNew и executeEdit, вы увидите, что они запрашивают конфигурацию для отображения фактической формы, вот пример:

  public function executeNew(sfWebRequest $request)
  {
    $this->form = $this->configuration->getForm();
    $this->PaymentOrder = $this->form->getObject();
  }

Вариант конфигурации содержит экземпляр класса конфигурацииопределенный в папке lib, о которой я упоминал ранее.Этот класс настраивает форму в соответствии с потребностями объекта (как правило, путем установки нового экземпляра объекта).

Итак, возникает волшебство, классы, которые вы видите в вашем модуле, расширяются по сравнению с классами в кеше, поэтому с помощью чистой логики,если вы модифицируете метод getForm() в папке main module / lib в соответствии с вашими потребностями, вам не придется взламывать формы, получая пользовательский оценщик там, где вы не должны.

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

1 голос
/ 28 июня 2012

, если модуль был создан с использованием администратора-генератора:

в apps/backend/modules/books/actions/actions.class.php

изменить: в

executeEdit(){

//leave rest unchanged

$values=array('activity_id'=>$activity_id, 'book_id'=>$book_id, 'todo_id'=>$todo_id, 'user_id'=>$this->getUser()->getGuardUser()->getId());


    $this->form = new TabelBooksForm($TabelBooks, $values);
}

изменить: в

executeNew(){

//leave rest unchanged

$values=array('activity_id'=>$activity_id, 'book_id'=>$book_id, 'todo_id'=>$todo_id, 'user_id'=>$this->getUser()->getGuardUser()->getId());

    $this->form = new TabelBooksForm(array(), $values);
}

в TabelBooksForm.class.php

public function configure()
  {

   if ($this->isNew()) {
    $this->setWidget('book_id', new sfWidgetFormInputHidden());
    $this->setDefault('book_id', $this->getOption('book_id'));    

    $this->setWidget('activity_id', new sfWidgetFormInputHidden());
    $this->setDefault('activity_id', $this->getOption('activity_id'));    

    $this->setWidget('todo_id', new sfWidgetFormInputHidden());
    $this->setDefault('todo_id', $this->getOption('todo_id'));  
  }
}
1 голос
/ 16 декабря 2010

Добро пожаловать в переполнение стека, jolly18.

Я бы просто использовал sfContext. Например, в моем приложении есть подчиненная форма, которая создает новый объект Note и назначает ему пользователя. В моей форме configure() у меня есть:

$new_note->setAuthor(sfContext::getInstance()->getUser()->getUsername());

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...