2015-01-09 4 views
1

나는 다국어 게시물을 작업 중입니다. 나는 그래서 내가 기능을 다음과 쓴 사용자가 다른 언어로 게시물을 복제 할 수 있도록하기 위해 현재 언어Cakephp 3 : 특정 쿼리에 대한 beforefind를 무시하는 방법?

public function beforeFind(Event $event, Query $query) { 

    $query->where(['Posts.locale' => I18n::locale()]); 
} 

에 대한 게시물을 나열 할 수 있습니다 PostsTable에 beforefind()를 추가 한 :

public function duplicate(){ 
    $this->autoRender = false; 
    $post_id= $this->request->data['post_id']; 

    $post = $this->Posts 
      ->findById($post_id) 
      ->select(['website_id', 'category_id', 'locale', 'title', 'slug', 'body', 'image', 'thumb', 'meta_title', 'meta_description', 'other_meta_tags', 'status']) 
      ->first() 
      ->toArray(); 

    foreach($this->request->data['site'] as $site) { 
     if($site['name'] == false) { 
      continue; 
     } 
     $data = array_merge($post, [ 
      'website_id' => $site['website_id'], 
      'locale' => $site['locale'], 
      'status' => 'Draft', 
      'duplicate' => true 
     ]); 


     $pageData = $this->Posts->newEntity($data); 

     if($this->Posts->save($pageData)) { 
      $this->Flash->success(__('Post have been created.'));; 
     } else{ 
      $this->Flash->error(__('Post is not created.')); 
     } 

    } 

    return $this->redirect(['action' => 'edit', $post_id]); 
} 

확인하기 위해서 게시물이 이미 복제 된 경우

$languages = TableRegistry::get('Websites')->find('languages'); 

    foreach($languages as $language) 
    { 
     $exists[] = $this->Posts 
        ->findByTitleAndWebsiteId($post['title'], $language['website_id']) 
        ->select(['locale', 'title', 'website_id']) 
        ->first(); 
    } 
    $this->set('exists',$exists); 

을하지만 beforefind로()는 위의 질의에 쿼리를 추가한다 : 나는 '편집'functino에 체크를하고있는 중이 야. 나는 결과를 얻지 못하고있다. 내가 cerrtain 쿼리에 대해 beforefind()를 무시할 수있는 방법이 있습니까? 나는 아래 엔티티를 사용해 보았습니다 :

public function beforeFind(Event $event, Query $query) { 

    if(isset($entity->duplicate)) { 
     return true; 
    } 
    $query->where(['Posts.locale' => I18n::locale()]); 
} 

행운은 없습니다. 아무도 나를 안내 할 수 있을까요? 읽어 주셔서 감사합니다. $options 인수가 :

답변

3

이 처리하는 여러 가지 방법이 있습니다, 하나는

$query->applyOptions(['injectLocale' => false]) 
public function beforeFind(Event $event, Query $query, ArrayObject $options) 
{ 
    if(!isset($options['injectLocale']) || $options['injectLocale'] !== false) { 
     $query->where(['Posts.locale' => I18n::locale()]); 
    } 
} 

경고 당신이 당신의 콜백에서 확인 할 수있는 옵션을 설정 Query::applyOptions()을 활용하는 것입니다 현재 배열로 전달되는 동안 ArrayObject (#5621)

+0

감사합니다. 감사합니다. 도움이되었습니다. – Invincible

0

Callback methods의 인스턴스는 다음을 사용하여 무시할 수 있습니다.

$this->Model->find('all', array(
    'conditions' => array(...), 
    'order' => array(...), 
    'callbacks' => false 
)); 
+0

감사합니다. Mr. felix :) 나는 이것을 시도 할 것입니다. – Invincible