【问题标题】:Using Yii's Ajax Validation without autoload Jquery在不自动加载 Jquery 的情况下使用 Yii 的 Ajax 验证
【发布时间】:2013-01-08 05:58:20
【问题描述】:

我想用CActiveFormAjaxValidation

我的布局视图文件在启用AjaxValidation之前是这样的:

<html lang="tr-TR" dir="ltr">
<head>
<script src="<?php echo Yii::app()->request->baseUrl; ?>/js/jquery.js"></script>
</head>

如您所见,我在布局页面上调用 jquery 框架(因为我在每个页面上都使用)。

我决定使用 CActiveForm 的 ajax 验证。首先在调用时启用enableAjaxValidation

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'otel-form',
    'enableAjaxValidation'=>true,
)); ?>

然后在我的控制器上取消注释

$this->performAjaxValidation($model);

但我收到了$(...).yiiactiveform is not a function 错误。当我检查页面的源代码时:

如您所见,还包括一个 jquery 库。所以页面上有2个jquery文件。因此,我遇到了错误。接下来我放了这样的东西来禁用jquery。

Yii::app()->clientscript->scriptMap['jquery.js'] = false;

现在 jquery 只加载一次。但是这个结果是:

<html lang="tr-TR" dir="ltr">
<head>
<script type="text/javascript" src="/istanbulcityhotels/assets/cb2686c8/jquery.yiiactiveform.js"></script>
<script src="/istanbulcityhotels/js/jquery.js"></script>
</head>

jquery.yiiactiveform.jsjquery.js 之前调用。它应该在 jquery.js 之后调用。 有点糊涂了。我该怎么办?

附加 是的,我读了this 问题,因为标题非常相似,但问题相同。

谢谢。

【问题讨论】:

    标签: yii


    【解决方案1】:

    您不应该在布局中手动包含 jQuery。不要这样做,而是将其包含在您的 Controller 基类中:

    public function init() {
        Yii::app()->clientScript->registerCoreScript('jquery');
    }
    

    不要忘记在您的具体控制器中调用parent::init()

    【讨论】:

    • 你对 concrete controllers 是什么意思?抱歉英语不好。能举个例子吗?
    • @Eray:派生自Controller 的类,例如UserController。他们的init 函数(如果你正在使用)需要调用parent::init()——这是标准的 PHP 东西,但我提到它是因为它很重要。
    • 好的,我明白了。我刚刚修改了我的 protected/components/Controller.php 文件。而不是在我的所有控制器上调用parent::init()。工作很好。但是这样做并将parent::init() 添加到所有控制器是很长的路要走。是否可以使用我的配置文件执行此操作?例如,我可以在我的配置文件中使用clientScript 组件吗?所以我可以在我的配置文件中注册 jquery,它会被包含在每一页中。
    • @Eray:不,那是不可能的。但是考虑一下,您现在已经有了一个现成的计划,可以在未来配置类似的东西:在任何地方添加另一个脚本现在是Controller 中的附加行。在一个具体的控制器中覆盖它,或者仅仅为了一个特定的动作,现在也非常容易(以前不可能)。
    【解决方案2】:

    似乎 CActiveForm 使用 CClientScript::POS_HEAD 常量在 title 标记之前插入脚本。所以解决方法是添加此代码

    <?php
    $cs=Yii::app()->clientScript;
    $cs->scriptMap=array(
        'jquery.js'=>false
    );?>
    

    到主布局文件的顶部以阻止它加载 jquery,然后在加载 jquery 文件后放置 title 标签

    <script src="<?php echo Yii::app()->request->baseUrl; ?>/js/jquery.js"></script>
    

    这样 jquery.yiiactiveform.js 将在 jquery 之后立即加载。

    【讨论】:

      【解决方案3】:

      只需将您自己的 jquery 放在标签标题上, 就像这样:

      <script src="/istanbulcityhotels/js/jquery.js"></script>
      <title>your title</title>
      

      【讨论】:

      猜你喜欢
      • 2011-02-12
      • 2012-12-07
      • 2012-09-08
      • 2014-03-02
      • 1970-01-01
      • 2011-10-30
      • 2015-07-31
      • 2011-03-13
      • 1970-01-01
      相关资源
      最近更新 更多