Какой прослушиватель событий после doSave () в Symfony? - PullRequest
1 голос
/ 23 февраля 2010

Я смотрю на эту страницу слушателей событий http://www.doctrine -project.org / Documentation / manual / 1_1 / pl / event-listeners и я не уверен, какой слушатель использовать для внесения изменений после метода doSave () в BaseModelForm.class.php.

// PlaceForm.class.php
protected function doSave ( $con = null )
{
  ...
  parent::doSave($con);
  ....

  // Only for new forms, insert place into the tree
  if($this->object->level == null){

    $parent = Place::getPlace($this->getValue('parent'), Language::getLang());
    ...
    $node = $this->object->getNode();
    $method = ($node->isValidNode() ? 'move' : 'insert') . 'AsFirstChildOf';
    $node->$method($parent); //calls $this->object->save internally
  }

  return;
}

То, что я хочу сделать, это сделать нестандартный слаг с именем предка этого нового места. Так что, если я вставлю «Сан-Франциско», слаг будет «США-Калифорния-Сан-Франциско»

public function postXXXXXX($event)
{
  ...
  $event->getInvoker()->slug = $slug;
}

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

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

спасибо!

Ответы [ 3 ]

1 голос
/ 25 февраля 2010

Вы смотрите не на тот кусок кода. Как утверждает Бенлумли, вы должны управлять своим слагом непосредственно в модели, а не в форме. Добиться того, чего вы хотите (рекурсивный слаг), довольно просто, используя доктрина Sluggable. Вам нужно внедрить getUniqueSlug() в вашу модель, чтобы он вызывался поведением (это автоматически) и обрабатывал ваши специфические особенности слагов:

public function getUniqueSlug()
{
  $slug = '';                                                                                                                                                                       
  $parent = $this->getParent();
  if ($parent->exists())
  {   
    $slug = $this->getParent()->getUniqueSlug().'-';
  }   
  return $slug.$this->getName();
}

То, что мы здесь делаем, - это в основном обход всех предков текущего объекта и добавление слагов на ходу (замените getParent() на любой метод, который вы используете для извлечения родителя объекта.

0 голосов
/ 24 августа 2010

У меня были такие же проблемы, и метод Doctrine_Record :: postInsert (Doctrine_Event $ event) у меня не работал. Действительно, узел еще не гидратирован.

Мне пришлось переписать метод sfFormObject :: doSave следующим образом:

protected function doSave($con = null)
{
    $is_new = $this->isNew();
    parent::doSave($con);
    $this->doSaveNestedSet($con);

    $service = $this->getObject();
    if( $is_new and ! $service->getClientId() and $parent = $service->getParent())
    {
        $service->setClient($parent->getClient());
        $service->save();
    }
}
0 голосов
/ 24 февраля 2010

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

В форме я бы использовал updateObject:

function updateObject($values = array()) {
  parent::updateObject($values);
  // do your stuff
}

В модели (похоже, вы используете доктрину ...) я бы поместил это в метод postSave (). Как я уже сказал, я думаю, что там лучше, чем форма.

...