IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

nestedset et I18n [1.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 100
    Par défaut nestedset et I18n
    bonjour,

    je souhaite stocker dans ma base de données une table qui correspond à mes menus, il y a une paternité et du multilangue.
    j'ai donc rajouté les behavior nestedset et i18n pour tout simplifier.

    j'ai le schéma suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Menu:
      tableName: menu
      actAs:
        NestedSet:
          hasManyRoots: true
          rootColumnName: root_id
        I18n:
          tableName: menu_translation
          fields:  [name_menu, is_activated]
      columns:
        name:         { type: string(255) }
        name_menu:    { type: string(255) }
        is_activated: { type: boolean, notnull: true, default: true }
    le name est un nom de référence pour le listing dans le backoffice, le name_menu sera visible par l'utilisateur et est donc internationnalizé.

    pour la gestion du nestedset dans le back office j'utilise la mise en place via Jquery (http://redotheoffice.com/?p=74, http://www.lexik.fr/sfblog/?p=135).

    dans mon MenuForm.class.php j'ai donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    public function configure()
      {
       unset($this['root_id'], $this['lft'], $this['rgt'], $this['level']);
        $this->widgetSchema['parent_id'] = new sfWidgetFormDoctrineChoice(array(
          'model' => 'menu',
          'add_empty' => '~ (object is at root level)',
          'order_by' => array('root_id, lft',''),
          'method' => 'getIndentedName'
          ));
        $this->validatorSchema['parent_id'] = new sfValidatorDoctrineChoice(array(
          'required' => false,
          'model' => 'Menu'
          ));
     
        $this->setDefault('parent_id', $this->object->getParentId());
        $this->widgetSchema->setLabel('parent_id', 'Child of');
     
        $this->embedI18n(array('en', 'fr'));
        $this->widgetSchema->setLabel('en', 'English');
        $this->widgetSchema->setLabel('fr', 'French');
     
      }
    et là c'est le drame.
    en voulant créer le widget parent_id, une requete est faite a la BDD avec un select name, name_menu, is_activated FROM MENU .... Or, les champs name_menu et is_activated ne sont pas dans cette table mais bien dans la table menu_translation (remember i18n). DONC ça plante en disant "column name_menu" doesn't exist..

    bref j'ai testé plein de truc et , dans mon Menu.class.php , si je surcharge la method setTableDefinition en enlevant les champs qui posent pb, j'otbiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public function setTableDefinition()
      {
          $this->setTableName('menu');
          $this->hasColumn('name', 'string', 255, array('type' => 'string', 'length' => '255'));
     
      }
    là tout marche nickel (nestedset et i18n) SAUF quand je fais un doctrine:build_all_reload, mes champs name_menu et is_activated ne sont pas regénérés dans ma BDD, normal...

    quelqu'un aurait-il une idée?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 100
    Par défaut
    J'ai trouvé une réponse qui consiste a créer le listing des parents_id à la main plutot que de passer par la méthode donnée

    donc dans mon menuForm.class.php j'ai remplacé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    public function configure()
      {
       unset($this['root_id'], $this['lft'], $this['rgt'], $this['level']);
     
        $choices = Doctrine::getTable('Menu')->getChoicesFromMenu();
     
        $this->widgetSchema['parent_id'] = new sfWidgetFormChoice(array('choices'=>$choices));
        $this->validatorSchema['parent_id'] = new sfValidatorDoctrineChoice(array(
          'required' => false,
          'model' => 'Menu'
          ));
     
        $this->setDefault('parent_id', $this->object->getParentId());
        $this->widgetSchema->setLabel('parent_id', 'Child of');
     
        $this->embedI18n(array('en', 'fr'));
        $this->widgetSchema->setLabel('en', 'English');
        $this->widgetSchema->setLabel('fr', 'French');
     
     
      }
    où ma fonction getChoicesFromMenu me retourne un tableau ordonné avec en clé les id et en valeur le nom .
    comme ça ça marche, juste un tit problème si je veux définir une nouvelle racine.. "invalid"

    si quelqu'un à une autre solution je suis tout ouïe.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 100
    Par défaut
    Bon je suis deg..
    apparement tout marche, jsute uen erreur de majsucule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $this->widgetSchema['parent_id'] = new sfWidgetFormDoctrineChoice(array(
          'model' => 'Menu',
          'add_empty' => '~ (object is at root level)',
          'order_by' => array('root_id, lft',''),
          'method' => 'getIndentedName'
          ));
    et non pas 'model' => 'menu',

    donc ça marche c'est joli..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [1.x] nestedset dans du I18N
    Par estampille dans le forum Symfony
    Réponses: 3
    Dernier message: 17/06/2010, 00h42
  2. Réponses: 5
    Dernier message: 01/10/2006, 16h55
  3. [i18n][utf8] Outils pour convertir iso8859-1 en unicode/utf8
    Par co2 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 07/11/2005, 09h56
  4. [I18N] Conseil pour l'architecture
    Par Alec6 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 11/10/2005, 23h49
  5. Réponses: 5
    Dernier message: 02/09/2005, 07h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo