Automatisation des vues
By Geoffrey on Wednesday 30 August 2006, 13:17 - Coding - Permalink
Le rebutement principal que j'ai eu au début avec le Zend Framework était l'impossibilité (a priori) d'automatiser le rendu des vues en fonction du controlleur et de l'action appelés. Mes pérénigrations webesques m'ont finalement fait entrevoir la solution.
EDIT: mes nouvelles pérégrinations dans les sources du Zend Framework m'ont fait entrevoir une meilleure solution :-)
Tout se passe dans le destructeur du controlleur, et nous allons voir ici une version édulcorée de celle disponible dans le lien sus-cité. L'astuce qui sauve, c'est de savoir que l'objet Controller possède un membre _action, qui lui même propose (entre autres) deux méthodes bien utiles: getControllerName et getActionName. Il suffit donc de récupérer ces informations pour construire dynamiquement le chemin de la vue à utiliser pour un controlleur donné:
abstract class My_Controller_Action extends Zend_Controller_Action {
public function __destruct() {
$view = Zend::registry('view');
$controller = $this->_action->getControllerName();
$action = $this->_action->getActionName();
$viewPath = sprintf('%s/%s.php', $controller, $action);
try {
echo $view->render($viewPath);
} catch (Exception $e) {
trigger_error('Unable to render view: ' . $e->getMessage(), E_USER_ERROR);
}
}
}
Ce controlleur requiert que vous ayez instancié, configuré et enregistré Zend_View au préalable. Il ira, lors de sa destruction, chercher la vue dont le nom correspond à controller/action.php, c'est à dire:
- pour une URL du type
http://example.com/foo/bar/,foo/bar.php, - pour
http://example.com/,index/index.php, - pour
http://example.com/foo/,foo/index.php.
Pour une raison obscure, on ne peut pas laisser trainer l'éventuelle exception générée par Zend_View dans le cas d'une vue inexistante. Cela entre en conflit avec une autre Exception qui traine, j'essayerai de tirer ça au clair :-)