0

関連モデル (hasOne、hasMany、または HABTM) に Translate Behavior/i18n を使用するためのより良いソリューションを探しています。CakePHP 1.x と 2.x はこれをサポートしていません。

私の解決策は非常に醜いですが、うまくいきます:

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

多分あなたはより良い解決策を持っているので、私に見せてもらえますか:)

4

2 に答える 2

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;
}
于 2013-08-26T17:56:36.953 に答える
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) は翻訳されていません! この頃は夢中になりました。

于 2013-09-12T09:42:51.950 に答える