Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 18-05-2008 09:05:02

foxmask
Membre
Date d'inscription: 18-05-2008
Messages: 13
Site web

[résolu] prefix des tables

Bonjour,
je debarque sur le framework donc probablement que je suis passé à coté de cela mais voici ce qui me préoccupe.

dans les models on a par exemple :

Code:

<?php 
class Articles extends Zend_Db_Table
{
    protected $_name = 'pt_articles';
}

mais ma table peut s'appeler differement selon le prefix que l'utilisateur (du logiciel) aura decidé.
<aparté>c'est le cas par exemple quand on installe un portail qui se greffe à punbb/fluxbb wink ces derniers eux, utilisent bien des prefix aux tables</aparté>

donc dans un config.ini j'ai defini :

Code:

[database]
db.adapter = PDO_MYSQL
db.params.host = localhost
db.params.username = foxmask
db.params.password = foxmask
db.params.dbname = foxmask
db.params.dbprefix = pun_

mais je ne trouve aucun moyen d'utiliser le prefix


donc j'ai essayé ceci dans le bootstrap

Code:

$config = new Zend_Config_Ini('../PHP-INF/config.ini', 'database');
$registry = Zend_Registry::getInstance();
$registry->set('config', $config);

define('MY_DB_PREFIX',$config->db->params->dbprefix);

et dans le model un

Code:

protected $_name = MY_DB_PREFIX.'pt_articles';

mais bien evidement on retrouve avec une erreur

Code:

Parse error: syntax error, unexpected '.', expecting ',' or ';' in ........models\Articles.php on line 4

Auriez vous une idée sur la façon de procéder afin qu'un prefix soit definissable ?
Cordialement

Dernière modification par foxmask (18-05-2008 22:02:01)

Hors ligne

 

#2 18-05-2008 12:02:03

lethak
Membre
Lieu: France
Date d'inscription: 05-04-2008
Messages: 168

Re: [résolu] prefix des tables

question bête mais... a tu vérifié que dans ton model, MY_DB_PREFIX existe et retourne la bonne valeur ?


IT Dev @Twitter

Hors ligne

 

#3 18-05-2008 12:09:11

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [résolu] prefix des tables

Hello,

De mémoire, tu ne peux pas faire de concaténation dans la définition de l'élément. Mais tu as la fonction init() :

Code:

<?php 
class Articles extends Zend_Db_Table
{
    public function init ()
    {
        $this->_name = MY_DB_PREFIX.'pt_articles';
    }
}

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#4 18-05-2008 13:00:43

lethak
Membre
Lieu: France
Date d'inscription: 05-04-2008
Messages: 168

Re: [résolu] prefix des tables

mikaelkael a écrit:

Hello,
De mémoire, tu ne peux pas faire de concaténation dans la définition de l'élément. Mais tu as la fonction init() :

Exact ! je suis passé a coté wink
ca devrais corriger l'erreur de synthax.


IT Dev @Twitter

Hors ligne

 

#5 18-05-2008 16:13:39

foxmask
Membre
Date d'inscription: 18-05-2008
Messages: 13
Site web

Re: [résolu] prefix des tables

la fonction init n'est pas utilisée dans le model hmm

Code:

<?php 
class Articles extends Zend_Db_Table
{
    public function init ()
    {
die("coucou");
        $this->_name = MY_DB_PREFIX.'pt_articles';
    }
}

j'ai une exception et pas le "coucou";

Code:

Fatal error: Uncaught exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'foxmsk.articles' doesn't exist' in D:\wamp\www_zend\library\Zend\Db\Statement\Pdo.php:238 Stack trace: #0 D:\wamp\www_zend\library\Zend\Db\Statement.php(283): Zend_Db_Statement_Pdo->_execute(Array) #1 D:\wamp\www_zend\library\Zend\Db\Adapter\Abstract.php(405): Zend_Db_Statement->execute(Array) #2 D:\wamp\www_zend\library\Zend\Db\Adapter\Pdo\Abstract.php(205): Zend_Db_Adapter_Abstract->query('DESCRIBE `Artic...', Array) #3 D:\wamp\www_zend\library\Zend\Db\Adapter\Pdo\Mysql.php(136): Zend_Db_Adapter_Pdo_Abstract->query('DESCRIBE `Artic...') #4 D:\wamp\www_zend\library\Zend\Db\Table\Abstract.php(604): Zend_Db_Adapter_Pdo_Mysql->describeTable('Articles', NULL) #5 D:\wamp\www_zend\library\Zend\Db\Table\Abstract.php(533): Zend_Db_Table_Abstract->_setupMetadata() #6 D:\wamp\www_zend\library\Zend\Db\Table\Abstract.php(268): Zend_Db_Table_Abstract->_setup() #7 D:\wamp\www_zend\PHP-INF\controllers\ in D:\wamp\www_zend\library\Zend\Db\Statement\Pdo.php on line 238

Hors ligne

 

#6 18-05-2008 16:22:15

foxmask
Membre
Date d'inscription: 18-05-2008
Messages: 13
Site web

Re: [résolu] prefix des tables

tiens amusant si je mets protected function init zend la trouve mais me dit qu'il faut que init soit publique.
en tout cas dès que la fonction est publique ; elle n'est pas utilisée ; meme vide ; l'erreur persiste.

init est appelée apres

http://framework.zend.com/manual/en/zend.db.table.html

doc a écrit:

the init() method (, which ) is called after all Table metadata has been processed.

CQFD sad

Dernière modification par foxmask (18-05-2008 16:33:43)

Hors ligne

 

#7 18-05-2008 16:35:43

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [résolu] prefix des tables

Hello,

Désolé je me suis trompé, c'est setup() pas init() :

Code:

<?php 
class Articles extends Zend_Db_Table
{
    protected function _setup()
    {
        $this->_name = MY_DB_PREFIX.'pt_articles';
        parent::_setup();
    }
}

En fait init() arrive trop tard.

A+

PS : je crois que nos messages se croisent smile

Dernière modification par mikaelkael (18-05-2008 16:37:55)


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#8 18-05-2008 16:38:01

foxmask
Membre
Date d'inscription: 18-05-2008
Messages: 13
Site web

Re: [résolu] prefix des tables

merci mille fois wink
bon ben je suis prêt à pondre du code au km big_smile

Hors ligne

 

#9 05-10-2010 11:49:07

julienD
Membre
Date d'inscription: 12-07-2010
Messages: 13

Re: [résolu] prefix des tables

Peut être une autre solution pour éviter de placer ton préfixe a chaque déclaration de table :
de fait, a chaque clause from ou assimilé (join ...) de l'object SELECT la table que tu passe serra remplacée par le préfixe:  monPrefix_

Exemple :
- Avec oracle (mais c'est pareil pour les autre sgbd)

Toutes les commandes de type :

Code:

$db = Zend_Db_Table_Abstract::getDefaultAdapter();
$select = $db->select();

$select->from('CLIENT',array('nomDuClient'));

Donneront :

Code:

 select "monPrefix_CLIENT".nomDuClient from "monPrefix_CLIENT" ...

il faut :
1) créer une classe Db_Select qui étend Zend_Db_Select :
   1.1)  copier la private function _uniqueCorrelation
   1.2) copier et modifier protected function _join
2) créer une classe Db_Adapter_Oracle qui étend Zend_Db_Adapter_Oracle qui retourne le nouveau Db_Select
3) définir dans le fichier de config ton nouvel adapterNamespace.
4) créer une constante qui contient le libellé du préfixe


1) library/LibPerso/Db/Select.php

Code:

class LibPerso_Db_Select extends Zend_Db_Select
{
 
   private function _uniqueCorrelation($name) {
        
            
        if (is_array ( $name )) {
            $c = end ( $name );
        } else {
            // Extract just the last name of a qualified table name
            $dot = strrpos ( $name, '.' );
            $c = ($dot === false) ? $name : substr ( $name, $dot + 1 );
        }
        for($i = 2; array_key_exists ( $c, $this->_parts [self::FROM] ); ++ $i) {
            $c = $name . '_' . ( string ) $i;
        }
        return $c;
    }

protected function _join($type, $name, $cond, $cols, $schema = null) {
        $prefix = NULL;
        
        if (defined ( '_TABLE_PREFIX' ))
            $prefix = _TABLE_PREFIX ;
        
    ...
        
        if (empty ( $name )) {
            $correlationName = $tableName = '';
        } else if (is_array ( $name )) {
            // Must be array($correlationName => $tableName) or array($ident, ...)
            foreach ( $name as $_correlationName => $_tableName ) {
                if (is_string ( $_correlationName )) {
                    // We assume the key is the correlation name and value is the table name
                    $tableName = $prefix . $_tableName;
                    $correlationName = $_correlationName;
                } else {
                    // We assume just an array of identifiers, with no correlation name
                    $tableName = $prefix . $_tableName;
                    $correlationName = $this->_uniqueCorrelation ( $tableName );
                }
                break;
            }
        } else if ($name instanceof Zend_Db_Expr || $name instanceof Zend_Db_Select) {
            $tableName = $prefix . $name;
            $correlationName = $this->_uniqueCorrelation ( 't' );
        } else if (preg_match ( '/^(.+)\s+AS\s+(.+)$/i', $name, $m )) {
            $tableName = $prefix . $m [1];
            $correlationName = $m [2];
        } else {
            $tableName = $prefix . $name;
            $correlationName = $this->_uniqueCorrelation ( $tableName );
        }
        
        ...
    }
}

2) library/LibPerso/Db/Adapter/Oracle.php

Code:

class LibPerso_Db_Adapter_Oracle extends Zend_Db_Adapter_Oracle
{
 public function select()
    {
        return new LibPerso_Db_Select($this);
    }
}

3) application/configs/application.ini

Code:

resources.db.params.adapterNamespace = "LibPerso_Db_Adapter"

4) public/index.php

Code:

define('_TABLE_PREFIX', 'monPrefix_');

Bien sure, il faut que l'espace de nom LibPerso soit déclaré :
application/configs/application.ini

Code:

autoloadernamespaces[] = "LibPerso_"

Dernière modification par julienD (05-10-2010 14:11:03)

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