Получение базового пути из представления в zend framework
Случай: вы разрабатываете сайт с Zend Framework и нуждаетесь в относительных ссылках на папку, в которую развертывается webapp. I.e. mysite.com/folder
онлайн и localhost:8080
в разработке.
В диспетчерах, независимо от развернутого местоположения, хорошо работает следующее:
$this->_helper->redirector->gotoSimple($action, $controller, $module, $params);
И следующее внутри viewcript, т.е. index.phtml:
<a href="<?php echo $this->url(array('controller'=>'index', 'action' => 'index'), null, true); ?>">
Но как мне получить правильный базовый путь при ссылке на изображения или таблицы стилей? (например, в файле layout.phtml):
<img src='<?php echo WHAT_TO_TYPE_HERE; ?>images/logo.png' />
и
$this->headLink()->appendStylesheet( WHAT_TO_TYPE_HERE . 'css/default.css');
WHAT_TO_TYPE_HERE
следует заменить чем-то, что дает
<img src="/folder/images/logo.png />` on mysite.com and `<img src="/images/logo.png />
на локальном хосте
Ответы
Ответ 1
Вы можете получить базовый url из Front Controller Zend_Controller_Front::getInstance()->getBaseUrl();
. Я обернуваю это в помощник вида
class My_View_Helper_BaseUrl
{
/**
* Get base url
*
* @return string
*/
public function baseUrl()
{
return rtrim(Zend_Controller_Front::getInstance()->getBaseUrl(),'/');
}
}
Итак, в html-разметке у вас есть что-то вроде <img src="<?php echo $this->baseUrl();?>/images/logo.png"/>
. Конечная косая черта исключена в помощнике, так что, когда приложение не запускается в подпапке (в этом случае baseUrl пуст), путь все равно будет работать,
Ответ 2
В случае, если кто-то хочет узнать лучший способ и не хочет тратить 2 часа на поиск Zend/Google. Для этого есть помощник вида.
$this->view->serverUrl();
Ответ 3
Если вы хотите присвоить имя хоста в своем файле layout
, чтобы распечатать его и получить имя HOST
:
echo $this->serverUrl().$this->baseUrl()
Ответ 4
Это мой помощник 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";
}
}
Ответ 5
<?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 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;
}
}
Ответ 6
Это сработало для меня:
echo $this- > serverUrl(). $This- > URL()