Phalcon: логика ControllerBase работает во всех представлениях, кроме index / index.volt

#php #phalcon

#php #phalcon

Вопрос:

Я решил запустить образец на своем собственном сервере, чтобы проверить любые проблемы при переходе с моего дорогого «localhost» на реальный сервер. Я столкнулся с проблемой, которую не могу решить со вчерашнего дня:

Я использую session variable «язык», который приводит к правильному использованию message.php (английский, французский или китайский в моем случае).

Все мои контроллеры расширяются от my ControllerBase , и это ControllerBase управляет логикой языка.

Идея проста: в каждом представлении у меня есть три флага (cn, fr и en), когда пользователь нажимает на один из этих флагов, текущая страница (и, в более общем плане, все страницы, которые будут исследованы) меняется на нужный язык.

В локальном каталоге это работает довольно хорошо… находясь на сервере, она фактически работает во всех представлениях, кроме индексного представления:

Индекс всегда будет сохранять свой исходный язык (английский при первом подключении, а затем будет адаптирован, если вы измените язык в другом представлении. Но нажатие флага в индексе никогда не изменит язык, несмотря на новый URL с /fr /en или /cn в конце).

Я не могу понять, в чем проблема. Особенно потому, что не вызывается конкретная ошибка и потому, что в моем локальном репозитории она работает как шарм.

Логика следующая ControllerBase :

 <?php

use PhalconMvcController;
class ControllerBase extends Controller
{
// Here I check if the language session is alredy defined and I load the desired message.php
protected function _getTranslation()
{

    if ($this->session->has("language")) {
        if (file_exists("messages/".$this->session->get("language").".php")) {
           require "messages/".$this->session->get("language").".php";
        } else {
           require "messages/en.php";
        }
    } else {
        require "messages/en.php";
    }       

    //Return a translation object
    return new PhalconTranslateAdapterNativeArray(array(
       "content" => $messages
    ));

}

// Here I check if the first parameter or the second parameter is defining the language, if not I load the default english language
protected function beforeExecuteRoute($dispatcher) 
{
    if ($this->dispatcher->getParam(0) == "fr") {
        $this->session->set("language", "fr");
    } elseif ($this->dispatcher->getParam(0) == "en") {
        $this->session->set("language", "en");
    } elseif ($this->dispatcher->getParam(0) == "cn") {
        $this->session->set("language", "cn");
    } else {
        if ($this->dispatcher->getParam(1) == "fr") {
            $this->session->set("language", "fr");
        } elseif ($this->dispatcher->getParam(1) == "en") {
            $this->session->set("language", "en");
        } elseif ($this->dispatcher->getParam(1) == "cn") {
            $this->session->set("language", "cn");
        } else {
            if ($this->session->has("language")) {
                $this->session->set("language", $this->session->get("language"));
            } else {
                $this->session->set("language", "en");
            }
        }
    }
}

// Here the I define the url for each flag at every view loading
protected function afterExecuteRoute($dispatcher) 
{

    $this->view->setVar("t", $this->_getTranslation());

    if ($this->dispatcher->getParam(0)) {
        if ($this->dispatcher->getParam(0) == "fr" || $this->dispatcher->getParam(0) == "en" || $this->dispatcher->getParam(0) == "cn") {
            $this->view->fr = "/sebfct/" . $this->dispatcher->getControllerName() . "/" . $this->dispatcher->getActionName() . "/fr";

            $this->view->en = "/sebfct/" . $this->dispatcher->getControllerName() . "/" . $this->dispatcher->getActionName() . "/en";

            $this->view->cn = "/sebfct/" . $this->dispatcher->getControllerName() . "/" . $this->dispatcher->getActionName() . "/cn";
        } else {
            $this->view->fr = "/sebfct/" . $this->dispatcher->getControllerName() . "/" . $this->dispatcher->getActionName() . "/" . $this->dispatcher->getParam(0) . "/fr";

            $this->view->en = "/sebfct/" . $this->dispatcher->getControllerName() . "/" . $this->dispatcher->getActionName() . "/" . $this->dispatcher->getParam(0) . "/en";

            $this->view->cn = "/sebfct/" . $this->dispatcher->getControllerName() . "/" . $this->dispatcher->getActionName() . "/" . $this->dispatcher->getParam(0) . "/cn";
        }   
    } else {
        $this->view->fr = "/sebfct/" . $this->dispatcher->getControllerName() . "/" . $this->dispatcher->getActionName() . "/fr";

        $this->view->en = "/sebfct/" . $this->dispatcher->getControllerName() . "/" . $this->dispatcher->getActionName() . "/en";

        $this->view->cn = "/sebfct/" . $this->dispatcher->getControllerName() . "/" . $this->dispatcher->getActionName() . "/cn";
    }


}
  

}

Ниже приведен index.volt (каждый вид простирается от него, включая index / index.volt)

 <!DOCTYPE html>
<html>
    <head>
        <title>TITLE</title>
    </head>
    {{ stylesheet_link("css/base.css") }}
    {{ stylesheet_link("css/layout.css") }}
    {{ stylesheet_link("css/skeleton.css") }}
    {{ stylesheet_link("css/main.css") }}
    {{ stylesheet }}
    <body>
        <div class="container">
            <div class="one columns">
                <a class="nav-link" href="/sebfct">
                    {{ homeIcon }}
                </a>
            </div>
            <div class="two columns">
                <a class="nav-link" href="/sebfct">
                    <h4 class="nav-bar">WEBSITE</h1>
                    <h5>Version 1.2</h5>
                </a>
            </div>

            <div class="one column offset-by-ten nav-bar"><a href= {{ en }}>{{ english }}</a></div>
            <div class="one column nav-bar"><a href= {{ fr }}>{{ french }}</a></div>
            <div class="one column nav-bar"><a href= {{ cn }}>{{ chinese }}</a></div>

            <div class="sixteen columns">
            </div>

            <div class="three columns offset-by-ten menu">
                <h4><a class="nav-link" href="/sebfct/tutorial"><?php echo $t->_("gen_tuto") ?></a></h1>
            </div>
            <div class="three columns menu">
                <h4><a class="nav-link" href="/sebfct/about"><?php echo $t->_("gen_about") ?></a></h1>
            </div>

            <div class="sixteen columns">
                <hr />
            </div>
        </div>
        {{ content() }}
    </body>
</html>
  

Итак, как я упоминал ранее, эта логика работает довольно хорошо во всех представлениях, кроме index / index.volt,
Архитектура моего сайта следующая:

 website
    .phalcon
    app
        cache
        config
        controller
            AboutController.php
            ControllerBase.php
            IndexController.php
            TutorialController.php
        models
        views
            about
                index.volt
            index
                index.volt
            tutorial
                index.volt
            index.volt /* This one is the one described above */
    public
        .... public things ....
    .htaccess
    index.html
  

Любые советы приветствуются, даже если они кажутся тривиальными. Заранее благодарю

РЕДАКТИРОВАТЬ: больше точности в отношении переданного URL

URL-адрес, передаваемый флагом, является желаемым (поэтому, когда я нажимаю на флаг, новый URL-адрес точно такой же в моем локальном репозитории и на моем сервере, за исключением того, что «localhost» становится «X.X.X: PORT».

Например, в случае индекса URL — это localhost/sebfct ( X.X.X.X:PORT/sebfct ), а щелчок по французскому флагу перенаправит пользователя на url localhost/sebfct/index/index/fr ( X.X.X.X:PORT/sebfct/index/index/fr ) , обратите внимание, что в этом случае первым «индексом» является the Controller , а вторым — the Action .

При необходимости я мог бы присоединиться к URL-адресу веб-сайта, но я действительно не знаю, «принято» ли это в вопросе SO или это может быть даже полезно.

Комментарии:

1. Пожалуйста, укажите, что именно означает «не работает». Вы получаете неправильный URL для флагов или вообще ничего? Какой URL-адрес вы используете для вызова indexAction (может быть разница между localhost и server)?

2. @colburton Спасибо за ваш ответ, переданный URL-адрес хорош, afterExecuteRoute($dispatcher) метод передает желаемый URL-адрес для каждого представления. Я обновил свой вопрос необходимой информацией.

3. И «нерабочая» часть заключается в том, что страница все еще на английском языке, несмотря на / fr в конце?

4. @colburton Да, вы абсолютно правы, я сожалею, что пропустил два раза, чтобы уведомить об этом, несмотря на ваше предупреждение. Он был отредактирован.

5. Phalcon для каждой установки одинаков?

Ответ №1:

Я не уверен, что полностью понял ваш вопрос, но позвольте мне попробовать здесь.

Прежде всего, я бы предположил, что у вас есть index.php внутри вашей общей папки для настройки ваших параметров и инъекций.

Проблема, которую я замечаю в вашей архитектуре, заключается в том, что у вас не должно быть index.volt вне любой папки внутри папки views.

Если вы хотите расширить этот файл (т.е.. index.volt), вам нужно поместить его в папку (вы можете назвать это «templates»), а затем поместить

 {% extends "templates/index.volt" %} 
  

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

Если все еще есть проблемы с загрузкой и тому подобное, вы можете попытаться настроить свой index.php внутри вашей общей папки для настройки URL-адресов и тому подобного.

Если проблема не в этом, вы можете попробовать использовать node.js и настройте сервер для тестирования; или вы можете настроить настройки vhost внутри вашего system32 и настроить параметры apache так, чтобы у них был базовый URL.