phalcon php包含js根据控制器和动作名称

时间:2014-04-20 22:11:16

标签: javascript php phalcon

我正在为我的应用程序使用phalcon php框架。 这个应用程序经常使用javascript verry进行交互式。

是否有类/服务也会根据名称包含js控制器,否则如果找不到包含'main'javascript文件?

例如我正在请求网址: http://www.mysite.com/search/keyword

因此phalcon将使用包含参数的indexAction执行searchController。 indexAction函数返回的数据将传递给视图。

该视图还将包含js / search / index.js

(可能还包括css文件css / search / index.css!?)

js是否有这种类型的层次结构功能的功能?

1 个答案:

答案 0 :(得分:1)

开箱即用,但这相对容易实现。您可以在基本控制器中实现该逻辑,具体如下:

abstract class AbstractController extends \Phalcon\Mvc\Controller
{
    public function afterExecuteRoute()
    {

        // Don't want to add assets if the action gets forwarded.

        if (!$this->dispatcher->isFinished()) {
            return;
        }

        $controllerName = $this->dispatcher->getControllerName();
        $actionName = $this->dispatcher->getActionName();
        $path = 'js/' . $controllerName. '/' . $actionName . '.js';

        // Defining APPLICATION_PATH global constant is one way of pointing to the root of your application. 
        // This can be done in your config or index. Alternatively you could add config to your DI and do 
        // something like DI::getDefault()->getShared('config')->applicationPath.

        if (file_exists(APPLICATION_PATH . '/public/' . $path)) {
            $this->assets->addJs($path);
        } else {
            $this->assets->addJs('js/main.js');
        }
    }
}

在视图中output them as usual

<html>
    <head>
        <title>Some amazing website</title>
        <?php $this->assets->outputCss() ?>
    </head>
    <body>

        <!-- ... -->

        <?php $this->assets->outputJs() ?>
    </body>
<html>

看看controller events,它们在这样的时候非常方便。

<强>更新

另一种可能的方法是使用视图选择逻辑来紧密选择js。该视图将检查views/controller/action.voltviews/layouts/controller.volt等,详细了解hierarchical rendering。这将通过将js层次结构与实际视图层次结构相匹配来帮助保持整洁。这取决于你如何实现它,但最好将它们保存在同一个afterExecuteRoute处理程序中。