Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour à tous,
Je tente actuellement d'utiliser Zend_View_Helper_HeadStyle dans le but d'afficher des éléments <style> dans mon layout. Je rencontre un problème pour l'utilisation d'un media composé du style media="screen tv projection".
<?php $this->headStyle()->captureStart(Zend_View_Helper_Placeholder_Container_Abstract::APPEND, array('media' => 'screen print projection tv')) ?> @import url(<?php echo $this->baseUrl() ?>/css/generic.css); @import url(<?php echo $this->baseUrl() ?>/css/global.css); @import url(<?php echo $this->baseUrl() ?>/js/lib/jquery-ui-1.5.2/jquery-ui-themeroller.css); img.ui-datepicker-trigger{position:relative; left:-21px; top:2px;} <?php $this->headStyle()->captureEnd(); $this->headStyle()->captureStart(Zend_View_Helper_Placeholder_Container_Abstract::APPEND, array('media' => 'print')) ?> @import url(<?php echo $this->baseUrl ?>/css/print.css); <?php $this->headStyle()->captureEnd(); echo $this->headStyle(); ?>
En effet, la méthode chargée de convertir chaque "container" en xhtml implémente un petit bout de code stupide qui empèche l'utilisation de plusieurs medias :
class Zend_View_Helper_HeadStyle extends Zend_View_Helper_Placeholder_Container_Standalone { // .................. public function itemToString(stdClass $item, $indent) { $attrString = ''; if (!empty($item->attributes)) { foreach ($item->attributes as $key => $value) { if (!in_array($key, $this->_optionalAttributes)) { continue; } if ('media' == $key) { if (!in_array($value, $this->_mediaTypes)) { continue; } } $attrString .= sprintf(' %s="%s"', $key, htmlspecialchars($value)); } } $html = '<style type="text/css"' . $attrString . '>' . PHP_EOL . $indent . '<!--' . PHP_EOL . $indent . $item->content . PHP_EOL . $indent . '-->' . PHP_EOL . '</style>'; return $html; } }
Le bug a été reporté ici.
Ne pouvant attendre uen correction, j'ai cherché à instancier mon propre helper héritant de celui ci et surchargant la fonction posant problème. Or, je n'arrive pas à spécifier à Zend_View d'utiliser mon helper plutot que celui par défaut (je me suis rendu compte au passage qu'énormément de méthodes/propriétés de Zend_View étaient privées ).
Sauriez vous m'indiquer comment instancier mon helper à la place de celui ci ?
Dernière modification par SandRock (04-09-2008 21:14:05)
Hors ligne
Bonjour,
si ton application suit le modèle MVC, je crois qu'il suffit de le mettre dans un répertoire helpers dans le répertoire views (au même niveau que le dossier scripts)
sinon
http://framework.zend.com/manual/fr/zen … pers.paths
Dernière modification par grandlap (04-09-2008 11:38:50)
Hors ligne
Bonjour,
Oui en effet, j'avoue avoir mal saisi le principe de ce setHelperPath() pendant un moment (sachant que c'est codé d'une façon incohérente avec la philosophie de ZF). Merci pour l'info.
Pour l'utilité publique, voilà la class "recodée" :
<?php /** * * @author SandRock * @version */ require_once 'Zend/View/Helper/HeadStyle.php'; /** * HeadStyle helper * * @uses helper Zend_View_Helper */ class App_View_Helper_HeadStyle extends Zend_View_Helper_HeadStyle { /** * Convert content and attributes into valid style tag * * @param stdClass $item Item to render * @param string $indent Indentation to use * @return string */ public function itemToString(stdClass $item, $indent) { $attrString = ''; if (!empty($item->attributes)) { foreach($item->attributes as $key => $value) { if (!in_array($key, $this->_optionalAttributes)) { continue; } if ('media' == $key) { if (is_string($value) && preg_match('/^[\w ]+$/', $value)) { $value = explode(' ', $value); } if (is_array($value)) { $stringValue = ''; $separator = ''; foreach ($value as $mediaType) { if (!in_array($mediaType, $this->_mediaTypes)) { continue; } $stringValue .= $separator.$mediaType; $separator = ' '; } $value = $stringValue; } else { if (!in_array($value, $this->_mediaTypes)) { continue; } } } $attrString .= sprintf(' %s="%s"', $key, htmlspecialchars($value)); } } $html = '<style type="text/css"' . $attrString . '>' . PHP_EOL . $indent . '<!--' . PHP_EOL . $indent . $item->content . PHP_EOL . $indent . '-->' . PHP_EOL . '</style>'; return $html; } }
Elle peut être utilisée en passant un array ou un string avec valeurs séparées par des espaces. Elle est bien sur tout à fait compatible avec Zend_View_Helper_HeadStyle.
$this->headStyle()->captureStart(Zend_View_Helper_Placeholder_Container_Abstract::APPEND, array('media' => array('screen', 'print', 'projection', 'tv'))); $this->headStyle()->captureStart(Zend_View_Helper_Placeholder_Container_Abstract::APPEND, array('media' => 'screen print projection tv'));
Merci encore
Hors ligne
Pages: 1