CakePHP';s Translate行为不使用Containable

CakePHP';s Translate行为不使用Containable,cakephp,behavior,translate,containable,cakephp-2.3,Cakephp,Behavior,Translate,Containable,Cakephp 2.3,我已经实现了CakePHP的翻译行为,并且一切都进行得相当顺利,但是我现在注意到,当我contain()一个应该翻译的模型时,我从i18n表中翻译的数据不存在 转换行为是否不适用于包含的模型?如果是这样的话,那么这种行为是否几乎完全没有任何用处?(或者可能只有我一个人——但我几乎所有东西都使用Containable) 如果我计划大量使用Containable,是否有一种不同的“CakePHP方式”可以相当轻松地进行翻译?显然这是一个常见的问题。CakePHP食谱中有一些关于如何处理它的提示: 我

我已经实现了CakePHP的翻译行为,并且一切都进行得相当顺利,但是我现在注意到,当我
contain()
一个应该翻译的模型时,我从
i18n
表中翻译的数据不存在

转换行为是否不适用于包含的模型?如果是这样的话,那么这种行为是否几乎完全没有任何用处?(或者可能只有我一个人——但我几乎所有东西都使用Containable)


如果我计划大量使用Containable,是否有一种不同的“CakePHP方式”可以相当轻松地进行翻译?

显然这是一个常见的问题。CakePHP食谱中有一些关于如何处理它的提示:


我也遇到过类似的问题,从谷歌上读了几十页,但找不到解决问题的简单方法。经过一些调试后,我创建了这个变通代码段。请考虑到这只是一个黑客行为。它主要是为Croogo编写的,所以相关的模型将在网站上进行翻译。但我已经浏览了Translate behavior,它也应该适用于它。基本上,将其粘贴到AppModel类中。是给蛋糕2.x的

// DIRTY LITTLE HACKS, FORCING TRANSLATE BEHAVIOR AFTERFIND CALLBACK
    /**
     * Hacking the afterFind so it will call the afterFind() from 
     * behavior
     * Pase this in your AppModel Class
     * 
     * @param array $results
     * @param bool $primary
     * @return array 
     */
    public function afterFind(array $results, $primary = false) {
        parent::afterFind($results, $primary);
        # calling only if not primary model, as they get translated pretty well
        if (!$primary) {
            # iterating behaviors to look for one that has something to do
            # with translations ( Translate for cake general behavior, CroogoTranslate for Croogo based apps )        
            foreach ($this->Behaviors->enabled() as $behavior) {
                if (preg_match('/(.*)[T|t]ranslate(.*)/', $behavior)) {
                    # setting locale, not sure if it gets set on secondary models
                    $this->locale = Configure::read('Config.language');
                    # hacking the result set to match behaviours requirments
                    # so basically creating the result set to look like called from originated model
                    # $k => array('ModelAlias' => array $results)        
                    $results_tmp = array(
                        0 => array(
                            $this->alias => $results,
                        )
                    );
                    # if we find such behavior we force it's afterFind with prepared data
                    $results = $this->Behaviors->{$behavior}->afterFind($this, $results_tmp, true); # forcing true on primary - CroogoTranslate requires that
                    # restoring orginal structure like nothing ever happened     
                    $results = $results[0][$this->alias];
                    # not sure if should break or not ?
                    # on one hand what's the point of having multiple translate behaviors in one app ?
                    # on the other i've seen more weird stuff that multiple translate behaviors
                    break;
                }
            }
        }
        return $results;
    }

哪里有“关于如何处理它的提示”?除了提到我需要使用fields()数组之外,这似乎没有任何影响。好吧,我发现了关于这个问题的另一个长期讨论,并就如何解决这个问题提出了更多建议:我目前没有能力测试这个问题,但是,我们已经将其标记为答案,希望它能够帮助其他人找到管理的方法。谢谢