2013-10-22 4 views
0

내 응용 프로그램을 빌드하는 방법 때문에 beforeSaveAssociatedafterSaveAssociated에 대한 이벤트 처리기를 만들어야합니다. 이 수 있도록하기 위해, 나는 AppModel.php 다음과 같은 관련 코드가 포함하도록 업데이트했습니다 :이 모델 클래스 내에서 정의 된 모든 beforeSaveAssociated을 위해 잘 작동하지만 나는 행동을 정의 할 때마다,CakePHP : 동작에서 사용자 지정 이벤트 트리거

public function saveAssociated(array $data = null, array $options = array()) { 
    $this->after_save_options = NULL; 

    $event = new CakeEvent('Model.beforeSaveAssociated', $this, array(&$data, &$options)); 
    $this->after_save_options = NULL; 
    $this->getEventManager()->dispatch($event); 

    if (parent::saveAssociated($data, $options)) { 
     if (is_array($this->after_save_options)) { 
      $curData = $this->data; 
      $this->data = $this->_tempData; 
      $event = new CakeEvent('Model.afterSaveAssociated', $this, $this->after_save_options); 
      $this->after_save_options = NULL; 
      $this->getEventManager()->dispatch($event); 
      $this->data = $curData; 
     } 
     if ($this->_tempData) { 
      $this->_tempData = FALSE; 
     } 
     return TRUE; 
    } 
    return FALSE; 
} 

public function implementedEvents() { 
    return array_merge(parent::implementedEvents(), array(
     'Model.beforeSaveAssociated' => array(
      'callable' => 'beforeSaveAssociated', 
      'passParams' => TRUE, 
     ), 
     'Model.afterSaveAssociated' => array(
      'callable' => 'afterSaveAssociated', 
      'passParams' => TRUE, 
     ), 
    )); 
} 

을, 그것은 '아무튼 촉발 당한다. 위의 saveAssociatedModel.beforeSave (내장 이벤트)을 트리거하도록 업데이트하면 올바르게 작동하지 않으므로 문제가되지 않습니다.

어떤 도움이 크게 감사합니다

,

답변

3

내가이 있기 때문이라고 생각하여 AppModel을에서 만든 새로운 방법에 대해 알고하지 않기 때문에 BehaviorCollection은 (클래스에서 가져온) 이러한 이벤트를 듣고 :

public function implementedEvents() { 
    return array(
     'Model.beforeFind' => 'trigger', 
     'Model.afterFind' => 'trigger', 
     'Model.beforeValidate' => 'trigger', 
     'Model.afterValidate' => 'trigger', 
     'Model.beforeSave' => 'trigger', 
     'Model.afterSave' => 'trigger', 
     'Model.beforeDelete' => 'trigger', 
     'Model.afterDelete' => 'trigger' 
    ); 
} 

없음 행동은 이벤트하지만 컬렉션을 듣고 그들을 행동에 트리거합니다. 그것을 보지 않고 100 % 확실하지는 않지만 그것이 그것이 어떻게 작동하는지 생각합니다.

할 수있는 일은 이벤트를 수신하기 위해 이러한 이벤트를 직접 받아야하는 동작을 만드는 것입니다.

+0

사실, 동작을 모델에 첨부하면 문제가 해결되었습니다. 나는 이것을 행동의'setup' 메쏘드에 추가했다 : $ model-> getEventManager() -> attach (function (array & $ data, & $ options) use ($ model) {$ this-> beforeSaveAssociated ($ model, $ data , $ options);}, 'Model.beforeSaveAssociated', array ('passParams'=> TRUE)); – corrideat

0

나는 문제가 발생 생각하는 행동은 ModelBehavior를 확장하는 클래스를 사용하면

관련 문제