Я решил загрузить образец на свой собственный сервер, чтобы проверить возможные проблемы при переходе с моего дорогого "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 или может ли это быть даже полезно.
afterExecuteRoute($dispatcher)
передает желаемый URL-адрес для каждого просмотра. Я обновил свой вопрос с необходимой информацией. - person sebastien FCT   schedule 17.06.2014