从onChange事件调用Controller操作

时间:2011-09-02 23:10:10

标签: controller yii onchange

我需要Yii帮助。

如何从文本框onChange事件中调用Controller操作?

更新 我有一个用CActiveForm构建的表单。这个表单有很多文本框。当我更改任何值时,必须更新其他值,使用新输入的值计算公式。所以我想做的是以下几点:

    <tr>
        <td>Average KW Demand:</td>
        <td><?php echo $form->textField($lfac_model, 'kw_demand', array('size'=>5));?></td>
    </tr>
    <tr>
        <td>Estimated Load Factor:</td>
        <td><?php echo $form->textField($lfac_model, 'loadf', array('size'=> 5));?>/td>
    </tr>

当用户更改“估计负载系数”时,应使用公式的结果更新“平均KW需求”值。我想通过将公式存储在表中,然后转到Controller操作,检索特定公式,计算新值并将其发送回视图。我不确定这是否是实现这一目标的最佳方法。

2 个答案:

答案 0 :(得分:1)

您应该可以使用CJuiAutoComplete Yii小部件来执行您想要的操作。有一个基本演示here,Yii文档中还有其他示例。在您的情况下,您需要确保的主要事情是您还指定了“appendTo”选项,请参阅该窗口小部件使用的jQuery autocomplete docs

基本上,您可以为“Estimated Load Factor”字段设置窗口小部件,并通过appendTo属性指向“Average KW Demand”字段。

如果您不想要自动填充内容并且只想替换该值,则可以在“loadf”值上使用htmlOptions属性“ajax”,如下所示:

'ajax' => array(
    'type'=>'POST', //request type
    'url'=>$this->createUrl('site/ajaxAction'), //url to call
    'success'=>'function(data) { $(\'#kw_demand\').val(data) }',// function to call onsuccess 
             // "data" is returned data and function can be regular js or jQuery
)

请参阅:CHtml#ajax-detailjQuery.ajax。在这种情况下,您很可能会返回纯文本,因此您的控制器功能将如下所示:

public function actionAjaxAction() {
  [your data functions...]
  echo $kw_demand_string;
  Yii::app()->end()
}

答案 1 :(得分:1)

文本框的onChange事件是一个javascript事件。它存在于应用程序的不同方面。

要在控制器上调用操作,您将不得不使用一些 AJAX (或异步调用)。这里的想法是基本上将一些数据发布到处理该操作的路径。

例如:

  • 假设您有此路线/页面:/product/details =&gt; ProductController::actionDetails()
  • 您希望使用自动完成选项更新搜索字段。
  • 您在搜索字段的onChange事件上设置了javascript,以调用将字段值(当前输入的文本)发布到控制器上的操作的方法。
  • 您设置此路线/页面/product/ajaxautocomplete =&gt; ProductController:actionAjaxAutocomplete()
  • 此第二个操作会从您的javascript异步HTTP请求(AJAX调用)中获取已发布的值,并根据数据库返回可能结果的列表。
  • 然后你的javascript接受返回(通常是XML / JSON,有时是HTML),并在客户端对dom应用值。

您可以使用jQuery轻松完成此任务:

$.ajax({
  type: 'POST',
  url: '/product/ajaxautocomplete',
  data: { 'searchPhrase' => searchBox.value },
  success: function(data, textStatus, jqXHR) { applyValues(data); },
  dataType: 'json'
});