Php 使用Phalcon标记动态加载CSS和Javascript文件

Php 使用Phalcon标记动态加载CSS和Javascript文件,php,phalcon,Php,Phalcon,我想这个问题的结果可能和 我的主布局视图具有整个应用程序的基本html结构,我正在使用控制器布局视图显示该控制器的内容。我相信到目前为止我做得对吗 但是现在我遇到了一个问题,需要在我的主布局视图中加载与模块控制器相关的特定JS和CSS文件 目前,我正在我的主布局文件中加载所有CSS和JS,但这完全违背了多模块方法。每个模块都应该能够加载css/js文件,而无需修改核心布局文件 理想情况下,我会喜欢采用与设置页面标题相同的方法 控制器: Phalcon\Tag::setStylesheetLink

我想这个问题的结果可能和

我的主布局视图具有整个应用程序的基本html结构,我正在使用控制器布局视图显示该控制器的内容。我相信到目前为止我做得对吗

但是现在我遇到了一个问题,需要在我的主布局视图中加载与模块控制器相关的特定JS和CSS文件

目前,我正在我的主布局文件中加载所有CSS和JS,但这完全违背了多模块方法。每个模块都应该能够加载css/js文件,而无需修改核心布局文件

理想情况下,我会喜欢采用与设置页面标题相同的方法

控制器: Phalcon\Tag::setStylesheetLink(“,false)

视图:echo Phalcon\Tag::getStylesheetLink()


有没有其他我可能没有的方法来完成这一点?

目前没有办法创建某种排序函数(样式表按照您设置的顺序打印出来)或一个收集工具,您只需将样式表添加到
\Phalcon\Tag::stylesheetLink()
中,就可以打印出来

但是,您可以通过自定义类实现所需的功能,如下所示:

在config.ini中,您有这个部分

[resource]
css.bootstrap = "/public/css/bootstrap.css"
css.index     = "/public/css/index.css"
css.about     = "/public/css/about.css"
css.contact   = "/public/css/contact.css"
创建一个类
\MyApp\Tag

namespace MyApp;

class Tag
{
    private $_css = array();

    public function add($css)
    {
        $this->_css[$css] = true;
    }

    public function remove($css)
    {
        $this->_css[$css] = false;
    }

    public function clear()
    {
        $this->_css = array();
    }

    public function generate()
    {
        $config = \Phalcon\DI::getDefault()->get('config');
        $output = '';

        foreach ($this->_css as $css => $active)
        {
            if ($active)
            {
                if (isset($config->resource->css->$css))
                {
                    $output .= \Phalcon\Tag::stylesheetLink($config->resource->css->$css);
            }
        }

        return $output;
    }
}
然后在控制器中,您可以执行以下操作:

$style = new \MyApp\Tag();
$style->add('bootstrap');
$style->add('about');

$this->view->setVar('stylesheets', $style->generate();
在你看来:

<?php echo $stylesheets; ?>

目前无法创建某种排序功能(样式表按照您设置的顺序打印出来),也无法创建一个只需将样式表添加到
\Phalcon\Tag::stylesheetLink()
即可打印出来的收集工具

但是,您可以通过自定义类实现所需的功能,如下所示:

在config.ini中,您有这个部分

[resource]
css.bootstrap = "/public/css/bootstrap.css"
css.index     = "/public/css/index.css"
css.about     = "/public/css/about.css"
css.contact   = "/public/css/contact.css"
创建一个类
\MyApp\Tag

namespace MyApp;

class Tag
{
    private $_css = array();

    public function add($css)
    {
        $this->_css[$css] = true;
    }

    public function remove($css)
    {
        $this->_css[$css] = false;
    }

    public function clear()
    {
        $this->_css = array();
    }

    public function generate()
    {
        $config = \Phalcon\DI::getDefault()->get('config');
        $output = '';

        foreach ($this->_css as $css => $active)
        {
            if ($active)
            {
                if (isset($config->resource->css->$css))
                {
                    $output .= \Phalcon\Tag::stylesheetLink($config->resource->css->$css);
            }
        }

        return $output;
    }
}
然后在控制器中,您可以执行以下操作:

$style = new \MyApp\Tag();
$style->add('bootstrap');
$style->add('about');

$this->view->setVar('stylesheets', $style->generate();
在你看来:

<?php echo $stylesheets; ?>

以下是一种手动操作js和css文件资产顺序的方法

首先,在控制器中添加css和js路径时,使用automatic Phalcon\Assets\Collection容器来存储临时资产:

$this->assets->addJs('js/bootstrap-multiselect.js');
$this->assets->addCss('css/bootstrap-multiselect.css');
在所有控制器从中扩展的自定义BaseController中,添加AfterExecuteOute()公共方法:

/**
 * stuff to do after a route has been executed
 * this is where we attach standard js and css assets
 * */
public function afterExecuteRoute(){
    // wait to rebuild assets until after the dispatcher is finished
    if( ! $this->dispatcher->isFinished() ){
        return;
    }
    ...
}
一旦我们确定当前路由已完成执行,我们可以从Phalcon\assets\Manager中的自动js和css集合中提取临时资产,将它们附加到我们的公共资产文件列表中,对它们进行排序和重复数据消除,然后将它们放入新的自定义集合中:

// get list of js files added to the standard js collection
$append_js = array();
forEach( $this->assets->getJs() as $js){
    $append_js[] = $js->getPath();
}
// declare paths to common js assets
$js_assets = array(
    'js/jquery-2.1.1.min.js',
    'js/jquery-ui.min.js',
    'js/bootstrap.min.js',
);
// merge common paths with ad-hoc paths
$js_assets = array_merge( $js_assets, $append_js );
$js_assets = array_unique( $js_assets ); // dedup
// add js assets to a new collection
$js_collection = $this->assets->collection('header_js');
forEach( $js_assets as $js_path ){
    $js_collection->addJs( $js_path );
}
将css资产重建到新集合的工作方式与此相同:

// get list of css files added to the standard css collection
$append_css = array();
forEach( $this->assets->getCss() as $css ){
    $append_css[] = $css->getPath();
}
// declare paths to common css assets
$css_assets = array(
    'css/jquery-ui.min.css',
    'css/jquery-ui.theme.min.css',
    'css/jquery-ui.structure.min.css',
    'css/bootstrap.min.css',
    'css/bootstrap-theme.min.css',
    'css/main.css',
);
// merge common paths with ad-hoc paths
$css_assets = array_merge( $css_assets, $append_css );
$css_assets = array_unique( $css_assets ); // dedup
// add css assets to a new collection
$css_collection = $this->assets->collection('header_css');
forEach( $css_assets as $css_path ){
    $css_collection->addCss( $css_path );
}
最后,在模板中输出js和css资产时,输出新的自定义集合,而不是Phalcon\assets\Manager自动创建的默认集合:

{{ getDoctype() }}
<html>
    <head>
        {{ tag.getTitle() }}
        {{ assets.outputCss( 'header_css' ) }}
        {{ assets.outputJs( 'header_js' ) }}
    </head>
{{getDoctype()}
{{tag.getTitle()}}
{{assets.outputCss('header_css')}
{{assets.outputJs('header_js')}

以下是一种手动操作js和css文件资产顺序的方法

首先,在控制器中添加css和js路径时,使用automatic Phalcon\Assets\Collection容器来存储临时资产:

$this->assets->addJs('js/bootstrap-multiselect.js');
$this->assets->addCss('css/bootstrap-multiselect.css');
在所有控制器从中扩展的自定义BaseController中,添加AfterExecuteOute()公共方法:

/**
 * stuff to do after a route has been executed
 * this is where we attach standard js and css assets
 * */
public function afterExecuteRoute(){
    // wait to rebuild assets until after the dispatcher is finished
    if( ! $this->dispatcher->isFinished() ){
        return;
    }
    ...
}
一旦我们确定当前路由已完成执行,我们可以从Phalcon\assets\Manager中的自动js和css集合中提取临时资产,将它们附加到我们的公共资产文件列表中,对它们进行排序和重复数据消除,然后将它们放入新的自定义集合中:

// get list of js files added to the standard js collection
$append_js = array();
forEach( $this->assets->getJs() as $js){
    $append_js[] = $js->getPath();
}
// declare paths to common js assets
$js_assets = array(
    'js/jquery-2.1.1.min.js',
    'js/jquery-ui.min.js',
    'js/bootstrap.min.js',
);
// merge common paths with ad-hoc paths
$js_assets = array_merge( $js_assets, $append_js );
$js_assets = array_unique( $js_assets ); // dedup
// add js assets to a new collection
$js_collection = $this->assets->collection('header_js');
forEach( $js_assets as $js_path ){
    $js_collection->addJs( $js_path );
}
将css资产重建到新集合的工作方式与此相同:

// get list of css files added to the standard css collection
$append_css = array();
forEach( $this->assets->getCss() as $css ){
    $append_css[] = $css->getPath();
}
// declare paths to common css assets
$css_assets = array(
    'css/jquery-ui.min.css',
    'css/jquery-ui.theme.min.css',
    'css/jquery-ui.structure.min.css',
    'css/bootstrap.min.css',
    'css/bootstrap-theme.min.css',
    'css/main.css',
);
// merge common paths with ad-hoc paths
$css_assets = array_merge( $css_assets, $append_css );
$css_assets = array_unique( $css_assets ); // dedup
// add css assets to a new collection
$css_collection = $this->assets->collection('header_css');
forEach( $css_assets as $css_path ){
    $css_collection->addCss( $css_path );
}
最后,在模板中输出js和css资产时,输出新的自定义集合,而不是Phalcon\assets\Manager自动创建的默认集合:

{{ getDoctype() }}
<html>
    <head>
        {{ tag.getTitle() }}
        {{ assets.outputCss( 'header_css' ) }}
        {{ assets.outputJs( 'header_js' ) }}
    </head>
{{getDoctype()}
{{tag.getTitle()}}
{{assets.outputCss('header_css')}
{{assets.outputJs('header_js')}

你好,尼古拉斯,很抱歉花了这么长时间回复,我一直在处理项目。不幸的是,我在给班级打电话时遇到了问题。我应该把它添加到DI中吗?目前我只是像上面一样调用它,我的错误是:PHP致命错误:找不到类'MyApp\Tag'。显然,我已经用“MyApp”替换了我的应用程序的名称,但我想不出还有什么地方我做错了?@Tim你需要注册
MyApp
名称空间才能找到它。你可以给它取任何你喜欢的名字。如果您将它添加到DI容器中,您所要做的就是:
$obj=\Phalcon\DI::getDefault()->get('mytag')
。如果时间不是问题,您可能希望等到12月初,此时0.7已过时。这个功能包含在那个版本中。嗨,Nikolaos,我发现了问题,我没有在自动加载器中注册名称空间。这项功能很快就会内置,真是太棒了!!快速提问,帮助我学习。我在上面的类中得到了另一个致命错误,“在不在对象上下文中时使用$this”:foreach($this->\u css as$css=>$active)。我不明白这里发生了什么?我真的很感激你的见解。谢谢!我的错$这在静态类中不存在。“让我很快修改代码。”蒂姆更正道。
generate
函数不应该是静态的。你好,尼古拉斯,很抱歉花了这么长时间才回复,我一直在处理项目。不幸的是,我在给班级打电话时遇到了问题。我应该把它添加到DI中吗?目前我只是像上面一样调用它,我的错误是:PHP致命错误:找不到类'MyApp\Tag'。我显然已经用“MyApp”代替了我的a