symfony 1.4: создание действия «Копировать»

#php #symfony1 #copy #action #models

#php #symfony1 #Копировать #Экшен #Модели

Вопрос:

Мне нужно создать действие «Копировать» для листинга модели. Он должен принимать все значения из некоторой модели, заполнять их в формах, вы могли бы отредактировать всего несколько полей и после нажатия «сохранить» создать НОВУЮ модель. На данный момент я думал об объединении редактирования и новых действий таким образом:

 public function executeListCopy(sfWebRequest $request)
  {
  # EDIT
  # $this->offer = $this->getRoute()->getObject();
  # $this->form = $this->configuration->getForm($this->offer);

  # NEW
  # $this->form = $this->configuration->getForm();
  # $this->offer = $this->form->getObject();

  # COPY
  <..>
   }
  

Раздел РЕДАКТИРОВАНИЯ показывает, какие команды symphony выполняет, когда я нажимаю кнопку редактирования.
СОЗДАТЬ так же, как редактировать, просто создает новую модель.

я закончил с этим:

 $this->form = $this->configuration->getForm($this->getRoute()->getObject());
$this->job_offer = $this->form->getObject();
  

И у меня не получилось. Это присваивает форме идентификатор модели, а поскольку идентификатор предопределен — он редактирует, а не создает модель.

Как я должен это сделать?

Ответ №1:

Вот пример:

 //routing
job:
  class: sfDoctrineRouteCollection
  options:
    model: Job
    module: job
    object_actions: {copy: get, updatecopy: post}
  

Создайте 2 действия (на основе редактирования и обновления)

 class jobActions extends sfActions
{
  public function executeCopy(sfWebRequest $request)
  {
    $this->form = new JobCopyForm($this->getRoute()->getObject());

    $this->setTemplate('copy');
  }
  public function executeUpdatecopy(sfWebRequest $request)
  {
    $this->form = new JobCopyForm($this->getRoute()->getObject());

    $this->processForm($request, $this->form);

    $this->setTemplate('copy');
  }
}
  

Шаблон copySuccess такой же, как editSuccess, за исключением того, что вам нужно указать форме, куда отправлять данные:

 <form action='<?php echo url_for('job_updatecopy', $form->getObject()) ?>' method='post'>
  

Создайте и настройте форму, переопределите doSave

 class JobCopyForm extends BaseJobForm
{
  public function configure()
  {
  }

  public function doSave($conn = null)
  {
    //update object values from form values
    $this->updateObject();
    //clone object
    $job = $this->getObject()->copy();
    //save a clone
    $job->save();

  }
}
  

Приветствия!

Комментарии:

1. Последние два шага немного не соответствуют инструкциям. Все, что я могу найти в шаблоне успеха, — это импорт с настройками и где именно модели перезаписывают формы? это библиотека / форма / аддон? Если да, то под каким именем? Я не могу найти эту часть нигде в документах.

2. editSuccess включает только часть формы. Для простоты я просто скопировал содержимое form partial в copySuccess. В качестве альтернативы вы можете создать, например, часть form_copy и включить ее в copySuccess.