0

引用 cakephp 书(1.3 版):

请注意,只有您直接在其上执行的模型的字段find才会被翻译。通过关联附加的模型不会被翻译,因为当前不支持在关联模型上触发回调。

有没有人为此提出解决方案?

如果没有,您能否就以下简单场景给我一些指示。

我有 2 个模型:

项目,类别。
项目 HABTM 类别

我已经正确设置了 i18n 表,并且在 db 中有一些条目,全部已翻译。当我检索一个项目时,它确实检索了翻译但不是翻译的类别,因为正如它在通过关联附加的 cakephp 书籍模型中所说的那样,不会被翻译。

4

4 回答 4

3

我有另一种解决方法;我不知道它在性能或风格方面是否更好或更差,只是它适合“胖模型,瘦控制器”目标:

应用模型.php

public function getTranslatedModelField($id = 0, $field) {

        $res = false;

        $db = $this->getDataSource();
        $tmp = $db->fetchAll('SELECT content from s2h_i18n WHERE model = ? AND locale = ? AND foreign_key = ? AND field = ? LIMIT 1',
            array($this->alias, Configure::read('Config.language'), $id, $field)
        );      
        if (!empty($tmp)) {
            $res = $tmp[0]['s2h_i18n']['content'];
        }
        return $res;
}

SomeModel.php

   public function afterFind($results, $primary = false) {

        foreach ($results as $key => $val) {
            if (isset($val['SomeOtherModel']) && isset($val['SomeOtherModel']['id'])) {
                $results[$key]['SomeOtherModel']['name'] = 
    $this->SomeOtherModel->getTranslatedModelField($val['SomeOtherModel']['id'], 'name');
            }
            // other possible queries for other models and/or fields
         }

        return $results;
    }
于 2012-10-26T18:13:40.593 回答
0

好的,我找到了解决方案。这主要是一种解决方法。我早该想到的。

我正在做的是以下内容。我正在查找所有项目并递归地查找与项目相关的所有类别。现在,由于 cakephp 不翻译类别,我正在使用初始查询的结果,并且我只对类别执行第二个,但使用我在第一个查询中找到的类别 id 值。现在 cakephp 翻译类别,因为我只是在搜索它们,我可以翻译它们的数据。

目前我对这个解决方案没有意见,但如果第一个 cakephp 使翻译行为准备好开箱即用,或者其次如果有人有一个可以支持检索相关模型上的翻译的行为,那就太好了。

于 2010-03-26T14:45:49.243 回答
0

我稍微概括了这afterFind部分,以便它自动从关联模型的actsAs["Translate"]数组中获取要翻译的字段,并使用关联模型的数组来(可能)翻译:

public function afterFind($results, $primary = false){

    $modelsToTranslate = array("SomeModel", "AnotherModel");

    foreach ($results as $key => $val){
        foreach($modelsToTranslate as $mtt){
            if (isset($val[$mtt])){
                foreach($val[$mtt] as $fieldname => $fieldval){
                    foreach ($this->$mtt->actsAs["Translate"] as $fieldToTranslate){
                        $results[$key][$mtt][$fieldname][$fieldToTranslate] = $this->$mtt->getTranslatedModelField($val[$mtt][$fieldname]['id'], $fieldToTranslate);
                    }
                }            
            }               
        }
    }
    return $results;
}
于 2013-05-03T13:27:43.750 回答
0

我采用了上述解决方案并稍微概括了这两个函数,现在它需要与翻译行为一起使用,并且两个函数都需要进入 model.php - 其他一切都应该自行工作:

public function getTranslatedModelField($id = 0, $field) {
    $res = false;
    $translateTable = (isset($this->translateTable))?$this->translateTable:"i18n";

    $db = $this->getDataSource();
    $tmp = $db->fetchAll(
        "SELECT content from {$translateTable} WHERE model = ? AND locale = ? AND foreign_key = ? AND field = ? LIMIT 1",
        array($this->alias, Configure::read('Config.language'), $id, $field)
    );
    if (!empty($tmp)) {
        $res = $tmp[0][$translateTable]['content'];
    }
    return $res;
}   

public function afterFind($results, $primary = false) {

    if($primary == false && array_key_exists('Translate', $this->actsAs)) {
        foreach ($results as $key => $val) {
            if (isset($val[$this->name]) && isset($val[$this->name]['id'])) {
                foreach($this->actsAs['Translate'] as $translationfield) {  
                    $results[$key][$this->name][$translationfield] = 
                    $this->getTranslatedModelField($val[$this->name]['id'], $translationfield);
                }
            } else if($key == 'id' && is_numeric($val)) {
                foreach($this->actsAs['Translate'] as $translationfield) {  
                    $results[$translationfield] = 
                    $this->getTranslatedModelField($val, $translationfield);
                }                   
            }
         }
    }

    return $results;
}   
于 2013-09-02T22:28:04.103 回答