Phalcon:ControllerBase逻辑在除index / index.volt之外的每个视图中都有效

时间:2014-06-17 01:48:20

标签: php phalcon

我决定在我自己的服务器中推送一个示例,以便在从亲爱的“localhost”迁移到真实服务器时检查是否有任何问题。我面临着自昨天以来无法解决的麻烦:

我使用session variable“语言”导致使用正确的message.php(在我的情况下使用英语,法语或中文)。

我的所有控制器都从我的ControllerBase延伸,而ControllerBase正在管理语言逻辑。

这个想法很简单:在每个视图中,当用户点击其中一个标志时,我有三个标志(cn,fr和en),当前页面(更常见的是所有将要探索的页面)变为想要的语言。

在本地目录中,它工作得很好......而在服务器上它实际上在除索引视图之外的每个视图中工作:

索引将始终保持其原始语言(英语在第一次连接时,如果您在其他视图中更改语言,则会进行调整。但是单击索引中的标记将永远不会更改语言,尽管最后有/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(所以当我点击一个标志时,新的url在我的本地存储库和我的服务器中完全相同,只是“localhost”变为“XXXX:PORT”。

例如,对于索引,网址为localhost/sebfctX.X.X.X:PORT/sebfct),点击法国国旗会将用户重定向到网址localhost/sebfct/index/index/fr({{1 }}),请注意,在这种情况下,第一个“索引”是X.X.X.X:PORT/sebfct/index/index/fr,第二个是Controller

如果有必要,我可以加入网站的网址,但我真的不知道它是否在SO问题中被“接受”,或者它是否有用。

1 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解你的问题,但让我试试这里。

首先,我假设您的公共文件夹中有index.php,用于配置设置和注入。

问题我在你的架构上注意到你不应该在views文件夹里面的任何文件夹之外有一个index.volt。

如果你想从那个文件扩展(即index.volt),你必须把它放在一个文件夹里(你可以把它叫做#34; templates&#34;)然后把它放在

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

在格式上需要扩展的文件的顶部,如果您使用伏特模板,则需要进行扩展。

如果仍然存在加载等问题,那么您可以尝试在公用文件夹中配置index.php以获取网址设置等。

如果以上不是问题,那么您可以尝试使用node.js并设置服务器进行测试;或者您可以在system32中配置vhost设置,并将apache设置配置为具有基本URL。