Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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 :
<?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 ces derniers eux, utilisent bien des prefix aux tables</aparté>
donc dans un config.ini j'ai defini :
[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
$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
protected $_name = MY_DB_PREFIX.'pt_articles';
mais bien evidement on retrouve avec une erreur
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
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() :
<?php class Articles extends Zend_Db_Table { public function init () { $this->_name = MY_DB_PREFIX.'pt_articles'; } }
A+
Hors ligne
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é
ca devrais corriger l'erreur de synthax.
Hors ligne
la fonction init n'est pas utilisée dans le model
<?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";
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
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
Dernière modification par foxmask (18-05-2008 16:33:43)
Hors ligne
Hello,
Désolé je me suis trompé, c'est setup() pas init() :
<?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
Dernière modification par mikaelkael (18-05-2008 16:37:55)
Hors ligne
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 :
$db = Zend_Db_Table_Abstract::getDefaultAdapter(); $select = $db->select(); $select->from('CLIENT',array('nomDuClient'));
Donneront :
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
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
class LibPerso_Db_Adapter_Oracle extends Zend_Db_Adapter_Oracle { public function select() { return new LibPerso_Db_Select($this); } }
3) application/configs/application.ini
resources.db.params.adapterNamespace = "LibPerso_Db_Adapter"
4) public/index.php
define('_TABLE_PREFIX', 'monPrefix_');
Bien sure, il faut que l'espace de nom LibPerso soit déclaré :
application/configs/application.ini
autoloadernamespaces[] = "LibPerso_"
Dernière modification par julienD (05-10-2010 14:11:03)
Hors ligne