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

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

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

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

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

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

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

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

Ниже приведена логика ControllerBase:

<?php

use Phalcon\Mvc\Controller;
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 \Phalcon\Translate\Adapter\NativeArray(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.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), обратите внимание, что в этом случае первый «индекс» — это Controller, а второй - Action.

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


person sebastien FCT    schedule 17.06.2014    source источник
comment
Уточните, пожалуйста, что именно не работает значит. Вы получаете неправильный URL-адрес для флагов или вообще ничего? Какой URL-адрес вы используете для вызова indexAction (может быть разница между локальным хостом и сервером)?   -  person colburton    schedule 17.06.2014
comment
@colburton Спасибо за ваш ответ, переданный URL-адрес хорош, метод afterExecuteRoute($dispatcher) передает желаемый URL-адрес для каждого просмотра. Я обновил свой вопрос с необходимой информацией.   -  person sebastien FCT    schedule 17.06.2014
comment
И неработающая часть в том, что страница все еще на английском языке, несмотря на / fr в конце?   -  person colburton    schedule 17.06.2014
comment
@colburton Да, вы совершенно правы, мне жаль, что я пропустил два раза, чтобы уведомить об этом, несмотря на ваше предупреждение. Он был отредактирован.   -  person sebastien FCT    schedule 17.06.2014
comment
Phalcon на каждой установке одинаков?   -  person kbtz    schedule 17.06.2014
comment
@cvsguimaraes Да, guimaraes, каждая установка одинакова, и версия php также есть в обеих конфигурациях.   -  person sebastien FCT    schedule 18.06.2014
comment
Простой вопрос: есть ли на вашем сайте файл favicon на сервере, но не локально? Я видел странные вещи, происходящие, когда действие индекса вызывается дважды, если нет файла favicon.ico (или нет других правил в .htaccess для его обработки), и в этом случае оно снова отобразит ваше действие индекса, возможно перезаписывать что-л. Возможно, проверьте свои журналы доступа, чтобы увидеть, происходит ли что-то подобное   -  person TommyBs    schedule 14.07.2014


Ответы (1)


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

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

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

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

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

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

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

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

person Blkc    schedule 25.07.2014