Répertoire de codes source

Aide de vue pour chemin relatif
déposé par JEDI_BC
le 18/06/2009
nombre de visites : 4234

edité le 18/06/2009
par JEDI_BC

Parfois, la déclaration de liens/images/ressources/etc... via un chemin absolu grace à baseUrl ne fonctionne pas. En effet, en utilisant un reverse proxy avec des sous-répertoires cela ne fonctionne plus.

Exemple : http://mon_portail/demo/ qui est proxyé vers http://mon_appli_mvc

Dans la page, http://mon_appli_mvc/controller/action/ il y a une image dont le chemin absolu est /images/test.png. Sauf que coté client, le même chemin est utilié et le navigateur essaye de trouver http://mon_portail/images/test.png au lieu de http://mon_portail/demo/images/test.png

Mon petit helper, via $this->relativeUrl('/images/test.png') renverra ../../images.png

<?php
class Zend_View_Helper_RelativeUrl extends Zend_View_Helper_Abstract{
 
    protected static $_depth = null;
 
    public function RelativeUrl($url = null)
    {
 
        // On supprime le / initial
        if (substr($url, 0, 1) == '/') $url = substr($url, 1);
 
        if (null == self::$_depth)
        {
 
            // On parse REQUEST_URI pour n'avoir que les répertoires
            $urlData = @parse_url($_SERVER['REQUEST_URI']);
            if (false === $urlData) return $url;
            $urlPath = $urlData['path'];
 
            // On enlève la partie baseUrl en trop
            $front = Zend_Controller_Front::getInstance();
            $urlPath = substr($urlPath, strlen($front->getBaseUrl()));
 
            // On calcul la profondeur exacte du chemin relatif
            $pos = strrpos($urlPath, '/');
            if ((false !== $pos) && (0 !== $pos))
            {
                $urlPath = substr($urlPath, 1, $pos-1);
                self::$_depth = count(explode('/', $urlPath));
            } else {
                self::$_depth = 0;
            }
        }
 
        return str_repeat('../', self::$_depth) . $url;
    }
}
 
Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages