Поведение CakePHP Translate не работает с Containable

Я внедрил поведение перевода CakePHP, и все прошло довольно гладко, но теперь я заметил, что мои переведенные данные из таблицы i18n не существуют, когда я contain() модели, которая должна быть переведена.

Поведение перевода не работает для автономных моделей? Если да, то не устраняет ли это почти полностью какую-либо полезность такого поведения? (Или, может быть, это только я - но я использую Containable практически для всего).

Есть ли другой «CakePHP-способ» для довольно легкого выполнения переводов, если я планирую много использовать Containable?


person Dave    schedule 05.11.2012    source источник


Ответы (2)


Я столкнулся с подобной проблемой, прочитал десятки страниц в Google, но не нашел простого решения своей проблемы. После некоторой отладки я создал этот фрагмент обходного пути. Пожалуйста, примите во внимание, что это всего лишь взлом. В основном это было написано для Croogo, поэтому соответствующие модели будут отображаться на сайте в переводе. Но я просмотрел поведение Translate, и оно должно работать и для него. В основном вставьте его в свой класс AppModel. Это для Cake 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;
    }
person johhniedoe    schedule 05.04.2013
comment
В настоящее время я не в состоянии проверить это, но отметил как ответ в надежде, что это поможет другим людям найти способ управления. Спасибо. - person Dave; 05.04.2013

Судя по всему, это распространенная проблема. В кулинарной книге CakePHP есть несколько советов, как с этим справиться:

http://book.cakephp.org/2.0/en/core-libraries/behaviors/translate.html

person Leonel Sanches da Silva    schedule 06.11.2012
comment
Где у него есть подсказки о том, как с этим справиться? Помимо упоминания о том, что мне нужно использовать массив fields(), который, похоже, не влияет. - person Dave; 06.11.2012
comment
Ну, я нашел еще одно длинное обсуждение этой проблемы с дополнительными рекомендациями о том, как обойти эту проблему здесь: ссылка - person Leonel Sanches da Silva; 06.11.2012