php - Obteniendo basepath de view en zend framework
zend-framework zend-view (6)
Caso: está desarrollando un sitio con Zend Framework y necesita enlaces relativos a la carpeta en la que se implementa la aplicación web. Es decir, mysite.com/folder
línea y localhost:8080
en desarrollo.
Lo siguiente funciona bien en controladores independientemente de la ubicación implementada:
$this->_helper->redirector->gotoSimple($action, $controller, $module, $params);
Y lo siguiente dentro de un viewcript, es decir. index.phtml:
<a href="<?php echo $this->url(array(''controller''=>''index'', ''action'' => ''index''), null, true); ?>">
¿Pero cómo obtengo el camino base correcto cuando se vincula a imágenes o hojas de estilo? (en un archivo layout.phtml, por ejemplo):
<img src=''<?php echo WHAT_TO_TYPE_HERE; ?>images/logo.png'' />
y
$this->headLink()->appendStylesheet( WHAT_TO_TYPE_HERE . ''css/default.css'');
WHAT_TO_TYPE_HERE
debe reemplazarse por algo que dé
<img src="/folder/images/logo.png />` on mysite.com and `<img src="/images/logo.png />
en localhost
Puede obtener la url base del controlador frontal Zend_Controller_Front::getInstance()->getBaseUrl();
. Lo envuelvo en una vista de ayuda
class My_View_Helper_BaseUrl
{
/**
* Get base url
*
* @return string
*/
public function baseUrl()
{
return rtrim(Zend_Controller_Front::getInstance()->getBaseUrl(),''/'');
}
}
Entonces en el marcado html tienes algo como <img src="<?php echo $this->baseUrl();?>/images/logo.png"/>
La barra inclinada final se elimina en el helper para que cuando el la aplicación no se ejecuta en una subcarpeta (baseUrl está en blanco en ese caso) la ruta seguirá funcionando.
<?php
/**
*
* @package TaMeR Library
* @copyright (C) 2010 Dennis T Kaplan
* @license GPL {@link http://www.gnu.org/licenses/gpl.html}
*
* @author Dennis T Kaplan
*/
/** @see Zend_View_Helper_Abstract */
require_once ''Zend/View/Helper/Abstract.php'';
class TaMeR_View_Helper_BaseUrl extends Zend_View_Helper_Abstract {
/**
* Returns site''s base url, or file with base url prepended
*
* $file is appended to the base url for simplicity
*
* @param string|null $file
* @return string
*/
public function baseUrl($file = NULL) {
$baseUrl = $domain = $subdomain = $protocol = $host = $port = NULL;
$host = array_reverse(explode(''.'', $_SERVER[''HTTP_HOST'']));
$domain = $host[1].''.''.$host[0];
$subdomain = (isset($host[2]) ? $host[2] : ''www'');
if(getenv("HTTPS") == ''on'') {
$protocol = ''https'';
$port = $_SERVER[''SERVER_PORT''] != 443 ? '':''.$_SERVER[''SERVER_PORT''] : '''';
}else{
$protocol = ''http'';
$port = $_SERVER[''SERVER_PORT''] != 80 ? '':''.$_SERVER[''SERVER_PORT''] : '''';
}
// Remove trailing slashes
if(NULL !== $file) {
$file = ''/'' . ltrim($file, ''///');
}else{
$file = rtrim(dirname($_SERVER[''SCRIPT_NAME'']), ''/'') . ''/'';
}
$baseUrl = $protocol.''://''.$subdomain.''.''.$domain.$port.$file;
return $baseUrl;
}
}
En caso de que alguien quiera saber la mejor manera y no quiera perder 2 horas buscando Zend / Google. Hay un asistente de vista para hacer eso.
$this->view->serverUrl();
Este es mi ayudante de baseUrl :
class Zend_View_Helper_BaseUrl extends Zend_View_Helper_Abstract {
public function baseUrl() {
$protocol = isset($_SERVER[''HTTPS'']) ? ''https'' : ''http'';
$server = $_SERVER[''HTTP_HOST''];
$port = $_SERVER[''SERVER_PORT''] != 80 ? ":{$_SERVER[''SERVER_PORT'']}" : '''';
$path = rtrim(dirname($_SERVER[''SCRIPT_NAME'']), ''///') . ''/'';
return "$protocol://$server$port$path";
}
}
Esto funcionó para mí:
echo $ this-> serverUrl (). $ this-> url ()
Si desea el nombre de host en su archivo de layout
, imprima esto y obtenga su nombre de HOST
:
echo $this->serverUrl().$this->baseUrl()