添加脚本并在运行时显示它们

时间:2015-09-15 14:31:07

标签: php

我想做这样的事情:

development {
    dataSource {
        dbCreate = "update"
        driverClassName = "org.postgresql.Driver"
        username = "usrcastor"
        url = "jdbc:postgresql://localhost:5432/dbcastor_master"
        password = "castor"
        dialect = net.sf.hibernate.dialect.PostgreSQLDialect
        pooled = true
        loggingSql = false


    }

    dataSource_otherDataSource {
        dbCreate = "update"
        driverClassName = "org.postgresql.Driver"
        username = "usrcastor"
        url = "jdbc:postgresql://localhost:5432/dbcastor_child_a"
        password = "castor"
        dialect = net.sf.hibernate.dialect.PostgreSQLDialect
        pooled = true
        loggingSql = false
    }
}

诀窍是:当用户想要在他们的classes.php中添加一个脚本时,他们只需要调用static mapping { datasource 'ALL' }

生成页面时,将调用函数<?php function addScript($name, $url) { $scripts[$name] = $url; } function displayScripts() { foreach ($scripts as $name => $url) { echo '<!-- Script: '.$name.' -->'; echo '<script src="'.$url.'"></script>' } } 并将所有脚本放在文件的头部。

出于显而易见的原因,我通常只会传递addScript('jQuery','http...');数组,但我不希望用户这样做。另外,displayScripts();如何知道$scripts数组?

我希望用户只调用displayScripts(),而不是我的代码中的逻辑。

问题是,数组$scripts应该类似于addScript('jQuery','http...');,但据我所知,你应该避免使用$scripts

有没有人知道如何做到这一点?

2 个答案:

答案 0 :(得分:2)

这是variable scope的问题,理论上你可以在全局范围内为脚本设置一个数组,然后由其他函数和整个文件访问:

<?php
// globally defined
$scripts = array();

function addScript($script) {
    global $scripts;
    $scripts[] = $script;
}
...

等等。这显然会污染全球空间,并且所有类型的ovf变量都可用,有效地声称这些变量名称被安全使用。

更好的解决方案是使用某种类型的注册表。理想情况下,您可以使用某种容器创建并跟踪此注册表。但是例如,让我们使用标准的单例模式。 see this SO question for more info

class Scripts
{
    // static instance tracker
    protected static $instance;

    // the registry for the scripts
    protected $scripts = array();

    // static function to fetch the instance
    public static function getInstance()
    {
        if (!self::$instance) self::$instance = new Scripts();
        return self::$instance;
    }

    // protected constructor, we dont want anybody to create an instance
    protected function __construct() {}

    public function addScript($script) {
        $this->scripts[] = $script;
        return $this;
    }

    public function getScripts() {
        return $this->scripts;
    }

    public function renderTags() {
        foreach ($this->scripts as $script) {
            // render the html <script> tags and return html
        }
    }
}

现在您有一个安全的注册表,您可以在其中存储脚本,可以在包含该类的任何位置使用:

// somewhere in the code
Scripts::getInstance()->addScript('jquery.js')->addScript('jquery.ui.js');

// in the view rendering stage:
echo Scripts::getInstance()->renderTags();

我鼓励你阅读设计模式和单身人士,因为从长远来看,后者确实存在一些问题。您可以在this SO question

中找到更多信息

答案 1 :(得分:1)

您可以在一个类中执行此操作,因此$scripts变量可用于每个方法:

<?php
class Scripts{
    public $scripts = array();

    function addScript($name, $url) {
        $this->scripts[$name] = $url;
    }

    function displayScripts() {
        foreach ($this->scripts as $name => $url) {
            echo '<!-- Script: '.$name.' -->';
            echo '<script src="'.$url.'"></script>'
        }
    }
}

然后你就可以使用它:

$sm = new Scripts;
$sm->addScript('jQuery', '...');

$sm->displayScripts();