Hello,
Pour ce qui est de partager le code exact, je peux pas mais je peux préciser le principe qui s'appuie sur le design pattern délégation et donner quelques extraits.
J'ai défini une interface de table traductible avec les méthodes devant être partagées «I18n_interface», dedans j'ai une méthode joinI18n qui reçoit un Zend_Db_Select et doit y rajouter les clauses pour joindre les trads.
function joinI18nModel(Zend_Db_Select $select, $fields = '*');
Ensuite j'ai créé une classe «I18n_delegate» qui implémente l'interface «I18n_interface».
Cette classe reçoit le nom de la table de trad et une instance d'une Zend_Db_Table dans son construct.
1 2 3 4 5 6 7 8 9
| /**
* @param string $model
* @param Zend_Db_Table_Abstract $master
*/
public function __construct($model, Zend_Db_Table_Abstract $master)
{
$this->__model = new $model;
$this->__master = $master;
} |
Enfin pour chaque table que je veux traductible, je dis qu'elle implémente aussi «I18n_interface», dans son construct je crée un «I18n_delegate».
1 2 3 4 5 6 7 8 9 10 11
| static protected $_i18nDelegate;
public function __construct($config = array())
{
parent::__construct($config);
// si ma classe n'a pas encore de délégué, je le crée
if (null == self::$_i18nDelegate) {
self::$_i18nDelegate = new I18n_Delegate($this->_i18nModelName, $this);
}
} |
Ensuite pour chaque méthode de l'interface, la table ne fait que sous appeler le délégué.
Par exemple :
1 2 3 4 5
|
public function joinI18nModel(Zend_Db_Select $select, $fields = '*')
{
return self::$_i18nDelegate->joinI18nModel($select, $fields);
} |
Et dans le délégué tu as le vrai code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public function joinI18nModel(Zend_Db_Select $select, $fields = '*')
{
$i18nTable = $this->__model->info(Zend_Db_Table_Abstract::NAME);
$masterTable = $this->__master->info(Zend_Db_Table_Abstract::NAME);
$masterPks = $this->__master->info(Zend_Db_Table_Abstract::PRIMARY);
$joinConds = array();
foreach ($masterPks as $masterPk) {
$joinConds[] = $masterTable . '.' . $masterPk . ' = ' . $i18nTable . '.' . $masterPk;
}
$joinConds = implode(' AND ', $joinConds);
$select->join($i18nTable, $joinConds, $fields);
} |
Partager