Bonjour la communauté.

Alors voilà, j'ai développé un site internet avec CakePHP et tous marche pour le mieux.

Sauf que maintenant on m'a demandé de l'internationaliser! J'ai donc suivit le tuto de Grafikart qui est très bien d'ailleurs. Sauf que j'ai un problème!

J'ai une table pages avec son Model, Controller, et ses Views quand je mets en place la table i18n, et que je veux pouvoir lister mes pages dans l'administration, il ne trouve rien car il ne cherche pas forcément dans la table pages mais dans la jointure des deux table. Le problème c'est que les éléments ne sont pas encore dedans car je n'ai pas encore remplis l'internationalisation! Du coup je suis dans l'obligation de recréer toutes mes tables! Que dois-je faire pour éviter ça? Créer une fonction dans l'AppModel?

Maintenant, si je veux éditer une page, c'est la même choses, il ne trouve rien car il veux qu'il y est une présence dans la table i18n et dans toutes les langue que je veux...

J'ai grand besoin d'aide! Merci d'avance.

10 réponses


Tu peux créer une fonction beforeFilter() dans ton AppModel : Tu choisis d'aller recuperer tes pages dans la langue choisie si elles existent (dans la table i18n) sinon tu va les récupérer dans table par défaut qui est remplie (pages).

C'est pas faisable ça ?

Ciloe
Auteur

Et bien oui c'est faisable, mais le problème c'est qu'en mettant le actsAs il va faire ses propres recherches...

Avec le actsAs, si tu fais un $this->read(), il fait se qu'il doit faire, en cherchant dans les deux tables... Donc il faudrait utiliser des options ou autres chose. De plus, ça changera avec la Pagination. Donc il faudra que je refasse une fonction Pagination?

Je sais pas trop, je vais quand même essayer se que tu as dis.

Et mettre des conditions autour du actsAs ?

Ciloe
Auteur

Oui pourquoi pas, mais je ne trouve rien sur internet.

Grafikart a mis en place l'internationalisation sur Mattrunks, j'imagine qu'il a du avoir le même problème, ou non, mais moi je sèche grave....

Je t'avoue ne jamais m'y être penché dessus mais ça doit pas être simple effectivement.

Ciloe
Auteur

Dans le tuto vidéo avec Cake 1.2 ça marche nikel mais pour la 2.0, il y a du y avoir du changement dans le traitement.

Comment pouvoir lui dire:

Récupère les informations de la table de base, récupère en suite les info de la table i18n, si tu en trouve echange avec celle de base, et si non tu utilise celles de base pour le langage de base...

Et ça que ça soit en read ou en pagination.

Et apreès faire le traitement inverse pendant une sauvegarde: Met à jour la table i18n, et met dans la table de base les éléments renseignés dans la langue de base.

Je suis sur que ça peut se faire, mais j'arrive pas à trouver comment instaurer ces règles...

Peux-tu me montrer ce que tu as déjà codé j'aurais peut être moins de mal à inventer ... ;)

Ciloe
Auteur

Hummmmm ça va être chaud... disons que j'ai suivit le tuto jusque à la minute 16 en faisant pareil, et là cake affiche se qu'il veut pour lui et moi tableau vide Je vais essayer d'organiser ça pour cet aprem

Je suis aussi en train de développer un site en Multilingue et j'ai beaucoup de mal à faire ce que je veux.

En ce qui te concerne, j'ai trouvé deux solutions, pas forcément les meilleurs mais on fait avec ce qu'on a ^^

  • Si tu as déjà du contenu, tu peux créer une fonction qui repassera sur tous tes posts pour les ajouter dans la table i18n de façon à ce que tes requêtes ne soient pas vide :

    function regenerate()
    {
    $this->Article->Behaviors->disable('Translate');
    $out = $this->Article->find('all', array('recursive'=>-1, 'order'=>'id'));
    $t = $b = 0;
    foreach($out as $v){
    $title'locale'] = 'aze';
    $title'model'] = 'Article';
    $title'foreign_key'] = $v'Article']'id'];
    $title'field'] = 'title';
    $title'content'] = $v'Article']'title'];
    if($this->Article->I18n->create($title) && $this->Article->I18n->save($title)){
    $t++;
    }
    $body'locale'] = 'aze';
    $body'model'] = 'Article';
    $body'foreign_key'] = $v'Article']'id'];
    $body'field'] = 'body';
    $body'content'] = $v'Article']'body'];
    if($this->Article->I18n->create($body) && $this->Article->I18n->save($body)){
    $b++;
    }
    }
    }

  • Sinon, de mon coté, j'ai crée un Behavior qui check chaque requete pour voir s'il trouve une traduction, sinon, il retourne le champs par défaut. C'est encore en béta, n'hésitez pas à m'aider à le peaufiner ;)

    <?php
    class CheckTranslateBehavior extends ModelBehavior{

    public function setup(Model $model,$options = array()) {
            if (Configure::read('Config.i18n_active') == true) {
                $model->Behaviors->load('Translate', $options'fields']);
            }
    }
    
        public function afterFind(Model $model, $data) {
    
            if (!$model->Behaviors->enabled('Translate') && Configure::read('Config.i18n_active') == true) {
                // Tell it to start doing so
                $model->Behaviors->enable('Translate');
            }
    
            return $data;
    
        }
    
       public function checkTranslate(Model $model, $id) {
    
            if (Configure::read('Config.i18n_active') == false) {
                $model->Behaviors->unload('Translate'); 
                return false;
            }
    
            $count = $model->find('count', array(
                'conditions' => array($model->name.'.id' => $id)
            ));
    
            if ($count == 0) {
                $model->Behaviors->disable('Translate'); 
                return false;
            } else {
                return true;
            }
    
        }

    }

Donc dans mon model Post, je fais un ActsAs de cette façon :

var $actsAs = array(
            'CheckTranslate' => array(
                'fields' => array('title', 'slug', 'body', 'meta_description', 'meta_keywords')
            ),

        );

Et dans mon PostsController.show(), avant le find, j'appel :

$this->Post-> checkTranslate($id);

Voilà voilà, j'espère être assez clair :)

Si tu as des idées pour mon post, n'hésites pas !!!
http://www.grafikart.fr/forum/topic/5649

Ciloe
Auteur

C'est super se que tu as fais!

Je vais tester tous ça merci ^^