2013-08-05 80 views
0

我正在寻找更好的解决方案使用Translate Behavior/i18n的相关模型(hasOne,hasMany或HABTM)。 CakePHP 1.x和2.x不支持这个。CakePHP翻译行为与相关模型

我的解决方案是非常难看,但工作:

if(Configure::read('Config.language') !== DEFAULT_LANGUAGE) { 
     $this->{$this->modelClass}->locale = array(Configure::read('Config.language'), DEFAULT_LANGUAGE); 

     if(is_array($this->{$this->modelClass}->belongsTo)) { 
      foreach($this->{$this->modelClass}->belongsTo as $relation => $model) { 
       $this->{$this->modelClass}->$model['className']->locale = array(Configure::read('Config.language'), DEFAULT_LANGUAGE); 
      } 
     } elseif(is_array($this->{$this->modelClass}->hasOne)) { 
      foreach($this->{$this->modelClass}->hasOne as $relation => $model) { 
       $this->{$this->modelClass}->$model['className']->locale = array(Configure::read('Config.language'), DEFAULT_LANGUAGE); 
      } 
     } elseif(is_array($this->{$this->modelClass}->hasMany)) { 
      foreach($this->{$this->modelClass}->hasMany as $relation => $model) { 
       $this->{$this->modelClass}->$model['className']->locale = array(Configure::read('Config.language'), DEFAULT_LANGUAGE); 
      } 
     } 
    } else { 
     $this->{$this->modelClass}->locale = DEFAULT_LANGUAGE; 
    } 

也许你有更好的解决方案,你能告诉我:)

回答

2

这是我想出了一个解决方案。

// app/Model/AppModel.php 
public function afterFind($results, $primary = false) { 
    // if getting associated data 
    if($primary === false) { 
     // check for translate behavior 
     foreach(array_keys($this->actsAs) as $behavior) { 
      if(preg_match('/^(T|t)ranslate$/', $behavior)) { 
       // set locale to lookup translation 
       $currentLanguage = Configure::read('Config.language'); 
       if($currentLanguage !== DEFAULT_LANGUAGE) { 
        $this->locale = array($currentLanguage, DEFAULT_LANGUAGE); 
       } else { 
        $this->locale = $currentLanguage; 
       } 
       // if multi-dimensional array 
       if(count($results) != count($results, COUNT_RECURSIVE)) { 
        foreach($results as &$model) { 
         if(is_array($model)){ 
          // if multiple models 
          if(isset($model[$this->name][0])) { 
           foreach($model[$this->name] as &$associatedModel) { 
            // get model with translations 
            $res = $this->find('first', array(
             'conditions' => array("{$this->alias}.{$this->primaryKey} = ".$associatedModel[$this->primaryKey]), 
             'contain' => false 
            )); 
            // add translated fields to results 
            $diff = array_diff_assoc($res[$this->name], $associatedModel); 
            if(count($diff)) { 
             $associatedModel = array_merge($associatedModel, $diff); 
            } 
           } 
          } else if(!empty($model[$this->name])) { 
           // get model with translations 
           $res = $this->find('first', array(
            'conditions' => array("{$this->alias}.{$this->primaryKey} = ".$model[$this->name][$this->primaryKey]), 
            'contain' => false 
           )); 
           // add translated fields to results 
           $diff = array_diff_assoc($res[$this->name], $model[$this->name]); 
           if(count($diff)) { 
            $model[$this->name] = array_merge($model[$this->name], $diff); 
           } 
          } 
         } 
        } 
       } else { 
        // get model with translations 
        $res = $this->find('first', array(
         'conditions' => array("{$this->alias}.{$this->primaryKey} = ".$results[$this->primaryKey]), 
         'contain' => false 
        )); 
        // add translated fields to results 
        $diff = array_diff_assoc($res[$this->name], $results); 
        if(count($diff)) { 
         $results = array_merge($results, $diff); 
        } 
       } 
      } 
     }   
    } 
    return $results; 
} 
+0

它看起来好多了,我会测试。 – kicaj

+0

此代码正在为每个记录执行SQL查询,并不好。 –

0

我在我的插件appmodel用这个一个afterFind方法,但有没有差异

这是在我的控制我的admin_index功能:

$this->Certificate->locale = $this->Session->read('Config.language'); 
    $this->Certificate->CertificateType->locale = $this->Session->read('Config.language'); 
    $this->Certificate->recursive = 0; 
    $this->set('certificates', $this->paginate()); 

但属于模型(CertificateType)没有翻译!它在这几天让我发疯。