Zend Framework. Универсальный путь к вашему приложению. baseUrl

Zend Framework. Универсалынй путь к вашему приложению. baseUrl

Здравствуйте уважаемые читатели блога gavnokod.com.

Недавно при разработке приложения на Zend Framework столкнулся с ситуацией, когда css файлы стилей и js файлы не всегда подгружались, и всё оформление сайта ломалось.

Файлы стилей у меня были прописаны у меня прямо в файле скрипта макета — lauout.html в таком виде:


<script type="text/javascript" src="js/jquery-1.7.2.min.js"></script>

Для Zend приложения я создал виртуальный хост в Apache, и при открытии по адресу http://zf.web/ сайт отлично работал.

Но когда у меня возникла необходимость открыть свой сайт на другом компьютере, оказалось что сайт не находит файлы стилей, и выглядит просто ужасно.

Причиной этого было то, что я с удалённого компьютера открывал свой сайт по адресу http://мой-ip/zf/zfdemo/public/, а браузер искал css стили по адресу http://мой-ip/css/.

Тогда я начал искать решение этой проблемы. Кроме этого я прочитал информацию о помощниках видов в Zend_View (HeadLink, HeadScript и HeadMeta), которые используются для более красивого и простого подключение всех необходимых стилей и js-файлов, а так-же вывода meta информации.

Решение оказалось достаточно простым.

Для корректной работы вашего сайта на Zend Framework необходимо компоненту View задавать baseUrl и basePath, где хранятся пути к приложению.

Для того, что-бы браузер всегда находил файлы стилей и скриптов, необходимо указывать путь к ним, в зависимости от текущего пути к проекту. Текущий путь к проекту можно получить, используя компонент Zend_Controller_Request_Http. Для этого в классе Bootstap создал функцию _initRequest(), которая при каждом запуске приложения присваивает переменные baseUrl и basePath(), которые я в дальнейшем использую для задания правильного пути к подключаемым файлам.

<?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
    protected function _initRequest()
    {
        $request = new Zend_Controller_Request_Http();
        $view = $this->bootstrap("view")->getResource("view");
        $view->baseUrl = $request->getBaseUrl();
        $view->basePath = $request->getBasePath();
        return $request;
    }

    ……

}
?>

А для инициализации подключения css файлов стилей и JS файлов я добавил еще одну функцию _initLayoutResources() в класс Bootstap, листинг которой представлен ниже:

bootstrap("view")->getResource("view");

        $auth = Zend_Auth::getInstance();

        if ( Zend_Auth::getInstance()->hasIdentity())
        {
            $view->headLink()->appendStylesheet($view->baseUrl."/css/cssweb.css");

            $view->headLink(array(
                "rel"   => "stylesheet",
                "href"  => $view->baseUrl."/css/my.css",
                "type"  => "text/css",
                "media" => "screen",
            ));
            $view->headLink(array(
                "rel"   => "stylesheet",
                "href"  => $view->baseUrl."/css/menu.css",
                "type"  => "text/css",
                "media" => "screen",
            ));

            $view->headScript()->appendFile( $view->baseUrl."/js/jquery-1.7.2.min.js" );
        } else {
            $view->headLink(array(
                "rel"   => "stylesheet",
                "href"  => $view->baseUrl."/css/form.css",
                "type"  => "text/css",
                "media" => "screen",
            ));
        }

    }
….
}
?>

Подключение стилей можно производить несколькими способами. Либо передавая в функцию headLink(array $params) массив с параметрами нового подключаемого файла, либо с помощью такого выражения headLink()->appendStylesheet(путь к файлу), тогда будут использованы настройки по умолчанию.

Подключение скриптов так-же можно производить разными способами. Наиболее простой —

headScript()->appendFile( $view->baseUrl + путь к файлу от корня приложения). 

Теперь секция в моём файле скрипта макета выглядит таким образом:


        <?php echo $this->headMeta(); ?>

        <?php echo $this->headLink(); ?>

        <?php echo $this->headScript(); ?>

После этого мой проект на Zend фреймворке отлично работает, независимо от того, открывается он локально, либо удалённо.