Hangi Symfony'de () DoSave sonra olay dinleyicisi olan?

3 Cevap php

Ben bu olay dinleyicileri sayfa http://www.doctrine-project.org/documentation/manual/1_1/pl/event-listeners bakarak oldum ve ben BaseModelForm.class.php DoSave () yönteminden sonra bir değişiklik yapmak için kullanmak zorunda dinleyici olduğu emin değilim.

// 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;
}

Ne yapmak istediğiniz yeni bir yer atalarının 'adı ile özel bir sümüklü böcek yapmaktır. Ben "San Francisco" ekleyerek Yani, sülük "usa-california-san-francisco" olacaktır

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

Sorun için üst bir referans ile yeni bir nesne ekleme olmam. Kaydedilene sonra, ağaca takın. Yani o zamana kadar sülük değiştiremezsiniz.

Bir İşlem dinleyici işe yarayabilir düşünüyorum, ama ben şu anda göremiyorum daha iyi bir yolu yoktur kullanım değilim.

teşekkürler!

3 Cevap

Kod yanlış parçasına bakıyor. Benlumley tarafından belirtildiği gibi, değil formda, modelde doğrudan sümüklü böcek yönetmek gerekir. Eğer (özyinelemeli sülük) istediklerini elde etmek oldukça kolaydır öğretinin Sluggable davranışını kullanıyor. Bunu davranış tarafından çağrılır böylece modeli bir getUniqueSlug() uygulamak (otomatik var) ve orada da sülük OZGÜLLÜKLERÍ ele almak gerekir:

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

Burada yaptığımız şey, temelde (bir nesnenin üst almak için kullanmak ne olursa olsun yöntemi ile getParent() olarak değiştirin geçerli nesnenin tüm ataları hareket ve yolda salyangozlar append.

Öncelikle, ben formu yerine modeli içine koymak istiyorum - bu şekilde nesne hiç düzenlenirse / güncellenen davranış hala olur.

Olsa formunda, ben updateObject kullanmak istiyorum:

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

Modelde (sen doktrinini kullanarak gibi görünüyor ...) ben (postSave içine) yöntemini bu koymak istiyorum. Dediğim gibi, ben form daha var onun daha iyi düşünüyorum.

Ben aynı sorunları vardı ve Doctrine_Record :: postInsert (Doctrine_Event $ olay) yöntemi benim için işe yaramadı. Gerçekten de düğüm henüz sulu değildir.

Ben böyle sfFormObject :: DoSave yöntemi üzerine yazmak zorunda kaldım:

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();
    }
}