Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 01-07-2008 13:34:32

cortex
Membre
Date d'inscription: 22-05-2008
Messages: 33

Une rowClass différentes par ligne

Bonjour,

Je suis tombé sur un point de design qui me gène un peu dans le framework concernant Zend_Db_Table_Abstract et Zend_Db_Table_Rowset_Abstract. En effet, il y a du code redondant pour instancier une Zend_Db_Table_Row_Abstract dans Table::fetchRow et Rowset::current.

La ou ça me gène, c'est que c'est le rowset qui prend la responsabilité de créér une ligne et de lui affecter sa table. Du coup, si je veux avoir une rowClass différente en fonction des data de la ligne courante, il faut que je modifie (dérive donc) des deux classes.
Il y a une fonction pour instancier une row sans donnée provenant de la base, Table::CreateRow mais pas pour des données venant de la base. Or à mon sens, celà aurait été tout aussi bien, et le Rowset aurait tout simplement alors délégué cette tache à sa table.

Ce que j'ai fait.

J'ai rajouté une fonction à ma classe Table

Code:

public function createDbRow(array $data)
    {
        @Zend_Loader::loadClass($this->_rowClass);
        return new $this->_rowClass($data);
    }

J'ai modifié le fetchRow pour qu'une fois le tableau $data initialisé, il y ait un appel à cette méthode

Code:

 public function fetchRow($where = null, $order = null)
    {
       // code not shown....
 
        $data = array(
            'table'   => $this,
            'data'     => $rows[0],
            'readOnly' => $select->isReadOnly(),
            'stored'  => true
        );
        
        return $this->createDbRow($data);
    }

J'ai modifié le current() du rowset dans le meme sens

Code:

public function current()
    {
        if ($this->valid() === false) {
            return null;
        }

        // do we already have a row object for this position?
        if (empty($this->_rows[$this->_pointer])) {
            $this->_rows[$this->_pointer] = $this->_table->createDbRow(
                array(
                    'table'    => $this->_table,
                    'data'     => $this->_data[$this->_pointer],
                    'stored'   => $this->_stored,
                    'readOnly' => $this->_readOnly
                )
            );
        }

        // return the row object
        return $this->_rows[$this->_pointer];
    }

Pourquoi tout ça, c'est simple, maintenant, je peux surcharger createDbRow et modifier la valeur de rowClass sur ma table en fonction de $data['data']. Ainsi en fonction, d'une valeur de colonne, je pourrais avoir une définition de classe appropriée.

Code:

public function createDbRow(array $data)
    {
        $this->_rowClass = $data['data']['classname'];
        return parent::createDbRow(array $data);
    }

Votre avis ?

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages