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 :

surcharger la méthode save() de la classe du modèle [1.x]


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 32
    Par défaut surcharger la méthode save() de la classe du modèle
    Bonjour,

    J'ai tout essayé, j'en peux plus:
    _j'ai une table rubrique créée avec Nestedset (avec colonnes "lft" et "rgt").
    _une table article sur laquelle j'ai rajouté les colonnes "lft" et "rgt".

    Lors de la création d'un article, je veux initialiser les colonnes article.lft et articles.rgt avec la valeur des colonnes rubrique.lft et rubrique.rgt grâce à la méthode save() de la classe Article.

    Voila ma classe Article ainsi que les fichiers nécessaires à votre compréhension:
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    class Article extends BaseArticle
    {
     
    	public function save(Doctrine_Connection $conn = null)
    	 {
    		if ($this->isNew())
    		{
     
    		 if (!$this->getLft())
    			{
    				$nom = Doctrine_Core::getTable('Rubrique') 
    					 ->createQuery('r')
    					 ->select('r.lft')
    					 ->where('r.id = ?', $this->getIdRubrique)
    					 ->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
    				$lft = Doctrine_Inflector::urlize($nom);
    				$this->setLft($lft);
    			}
     
    		  if (!$this->getRgt())
    			{
    				$nom = Doctrine_Core::getTable('Rubrique') 
    						 ->createQuery('r')
    						 ->select('r.rgt')
    						 ->where('r.id = ?', $this->getIdRubrique())
    						 ->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
    				$rgt = Doctrine_Inflector::urlize($nom);
    				$this->setRgt($rgt);
    			}
     
    		}
     
    		return parent::save($conn);
    	}
     
    }
    Schema.yml:
    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
     
    Rubrique:
      actAs: 
        Timestampable: ~ 
        NestedSet:
          hasManyRoots: true
          rootColumnName: root_id
      columns:
        nom: { type: string(255), notnull: true}
     
    Article:
      actAs: { Timestampable: ~ }
      columns:
        id_rubrique: { type: integer, notnull: true }
        designation: { type: string(80), notnull: true }
        description: { type: string(4000), notnull: true }
        lft: { type: integer, notnull: true }
        rgt: { type: integer, notnull: true }
      relations:
        Rubrique: { onDelete: CASCADE, local: id_rubrique, foreign: id, foreignAlias: Rubrique1 }
    Jeux fixtures:
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    Rubrique:
     arbre:
      nom: Arbre
      children:
       collections_et_collectors:
        nom: Collections et Collectors
       dvd_vhs_et_cinema:
        nom: DVD, VHS et Cinéma
       informatique_et_pda:
        nom: Informatique et PDA
        children:
         pc_de_bureau:
          nom: PC de Bureau
         pc_portables:
          nom: PC Portables
         pda:
          nom: PDA
     
    Article:
     pc_gamer:
       Rubrique: pc_de_bureau
       designation: PC HP Pentium 233
       description: |
           PC HP Pentium 233
           PC Hewlett Packard P233 MMX
           RAM 64Mb, DD 2Gb, disquette, lecteur CD
           Windows 98, office.
           Vendu avec écran, clavier, souris.
     ipod:
      Rubrique: pda
      designation: nokia
      description: |
          super portable
    Quand je vérifie ma table article tous les champs lft et rgt sont à 0!
    Pour finir, ce code fonctionnait à un moment, mais plus maintenant, je ne comprends rien!

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 32
    Par défaut
    help

  3. #3
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Tu as postés plusieurs sujet, j'y ai répondu. Il me semblait que la réponse à celui-ci était la suite logique des autres.

    Les champs lft et rgt sont utilisé en interne par la classe, pour retrouver les enfants et les parents. Rien ne garanti qu'ils existeront ainsi sur tous les moteurs de la base de données, rien ne garanti qu'il existeront ainsi sur les prochaines versions de Doctrine.

    Il faut utiliser les méthodes de parcours et de liaison objets documentées pour manipuler ces données. La voie que tu utilises est vouées à l'échec, à plus ou moins brève échéance.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/11/2014, 16h00
  2. template class & surcharge de méthode
    Par Gébix dans le forum C++
    Réponses: 2
    Dernier message: 27/12/2011, 00h38
  3. Surcharger la méthode save() d'un objet
    Par Herode dans le forum ORM
    Réponses: 11
    Dernier message: 10/01/2011, 21h11
  4. Surcharger les méthodes d'une class mère
    Par Djobird dans le forum Langage
    Réponses: 8
    Dernier message: 06/06/2008, 16h54
  5. [Reflection] Exécuter une méthode donnée d'une classe
    Par schousso dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 03/06/2004, 10h35

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