为什么dojo在使用CDN时工作,但在使用$ this-> dojo-> setLocalPath(使用Zend Dojo)时却没有?

时间:2010-07-28 19:05:04

标签: php zend-framework dojo

我一直在谷歌的CDN上使用Dojo。我刚刚下载了开发版本,所以我可以做一些调试。使用本地存储的dojo时,Firebug会报告几个语法错误。他们都看起来像这样:

SyntaxError: syntax error
(no script)(""en-us"")bootstrap.js (line 601)
(no script)(""dojo.cldr"", ""number"")bootstrap.js (line 590)
(no script)(""dojo.cldr"", ""number"")loader.js (line 634)
(no script)(""./number.js"", ""dojo.number"")loader.js (line 76)
(no script)(""dojo.number"")loader.js (line 411)
(no script)(""./currency.js"", ""dojo.currency"")loader.js (line 76)
(no script)(""dojo.currency"")loader.js (line 411)
(no script)(""../dijit/form/CurrencyTextBox.js"", ""dijit.form.CurrencyTextBox"")loader.js (line 76)
(no script)(""dijit.form.CurrencyTextBox"")loader.js (line 411)
[Break on this error] (601 out of range 505)
bootstrap.js (line 601)

我知道我在整个布局,视图和控制器中都正确设置了Dojo,因为如果我使用CDN,dojo工作正常。我还验证了localpath能够正确解析它。

这是使用CDN初始化的样子(这可以正常工作):

<head>
<?php echo $this->headMeta(); ?>
<?php echo $this->headTitle(); ?>
<?php echo $this->headLink(); ?>
<?php echo $this->headScript();
if ($this->dojo()->isEnabled()) {
    $this->dojo()->setCdnVersion('1.5')
                 ->addStyleSheetModule('dijit.themes.claro');
    echo $this->dojo();
}
?>
</head>

这就是使用本地版本的样子:

<head>
<?php echo $this->headMeta(); ?>
<?php echo $this->headTitle(); ?>
<?php echo $this->headLink(); ?>
<?php echo $this->headScript();
if ($this->dojo()->isEnabled()) {
    $this->dojo()->setLocalPath('/js/dojo/dojo.js')
                 ->addStyleSheetModule('dijit.themes.claro')
                 ->setDjConfigOption('parseOnLoad', true)
                 ->setDjConfigOption('isDebug', true);
    echo $this->dojo();
}
?>
</head>

出现这些语法错误的localpath我做错了什么?

2 个答案:

答案 0 :(得分:2)

当您下载源并希望在本地运行它时,您必须“构建”dojo。不知怎的,我错过了这个作为使用dojo的本地路径版本的要求。无论如何,我终于能够通过自定义构建让dojo在本地正确运行。我发现这个dojo参考非常有帮助:

http://docs.dojocampus.org/quickstart/custom-builds

在dojo发行版的util / buildscripts文件夹中,还有几个预定义的构建配置文件。我怀疑你可以使用其中一个构建整个dojo发行版,但我想如果我要解决这个问题,不妨从中获得优化的构建。

我的构建配置文件最终看起来像这样:

dependencies ={

   layers:  [
       {
       name: "mydojo.js",
       dependencies: [
           "dojox.grid.DataGrid",
           "dojox.Data.QueryReadStore",
           "dijit.form.ComboBox",
           "dijit.form.ValidationTextBox",
           "dijit.form.CurrencyTextBox",
           "dijit.form.PasswordTextBox",
           "dijit.form.RadioButton",
           "dijit.form.Button",
           "dijit.form.CheckBox",
           "dijit.form.DateTextBox"
       ]
       }
   ],

   prefixes: [
       [ "dijit", "../dijit" ],
       [ "dojox", "../dojox" ]
   ]

 };

我把它放在名为“myProfile.profile.js”的/ util / buildscripts / profiles文件夹中。

然后,我从/ util / buildscripts:

运行了构建脚本
./build.sh profile=myProfile action=release optimize=shrinksafe.keepLines layerOptimize=shrinksafe.keepLines releaseName=myRelease localeList=en-us,es-es version=0.1.dev

将生成的构建从/ release / myRelease复制到您网站的javascript文件夹,即/ js / myRelease /.

重要的命令行选项是“profile”和“action”,其他选项是可选的。您可以在我上面提供的网址上获得每个命令行选项含义的完整描述。我根据自己的特殊需求定制了这些选项 - 你的选择可能非常不同,我提供它们只是作为我最终看起来的样子。如果您使用的是Windows,而不是“build.sh”,请使用“build.bat”。

然后,要设置Zend使用此版本,我在layout.phtml文件中执行了以下操作:

if ($this->dojo()->isEnabled()) {
        $this->dojo()->setLocalPath($this->baseUrl() . '/js/myRelease/dojo/dojo.js')
             ->addStyleSheetModule('dijit.themes.claro')
             ->setDjConfigOption('isDebug', true)
             ->setDjConfigOption('debugAtAllCosts', true)
             ->addLayer($this->baseUrl() . '/js/myRelease/dojo/mydojo.js')                
             ;
}

使用“addLayer”进行自定义构建是我最终得到的。我希望这有助于拯救别人一点时间!

答案 1 :(得分:0)

我遇到了完全相同的问题。它似乎与本地化有关,但我无法弄清楚原因。

但是,有一种解决办法,它可以在某些情况下完成工作:在dijit / nls目录中,创建en和en-us目录并将common.js和loader.js文件复制到它们中。 / p>

您可能必须为多个dijit执行此操作,具体取决于dijit查找本地化文件的位置。

如果您遇到更好的解决方案,MikeH,请在此处发布。今天早些时候我将此问题发布到dojo论坛,并将通过链接到此主题进行跟进。希望有人会有一个非权宜之计。