Вызов действия Controller из события onChange - PullRequest
0 голосов
/ 03 сентября 2011

Мне нужна помощь с Yii.

Как я могу вызвать действие Controller из события onChange из текстового поля?

Обновление: У меня есть форма, построенная с 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>

Когда пользователь изменяет «Расчетный коэффициент нагрузки», значение «Среднее значение потребности в кВт» должно обновляться в соответствии с результатом формулы. Я понял, что нужно сохранить формулы в таблице, затем перейти к действию Controller, получить конкретную формулу, вычислить новое значение и отправить его обратно в представление. Я не уверен, что это лучшая идея для реализации этого.

Ответы [ 2 ]

1 голос
/ 03 сентября 2011

Событие onChange в текстовом поле является событием JavaScript. Он живет в другом аспекте вашего приложения.

Чтобы вызвать действие на вашем контроллере, вам нужно будет использовать AJAX (или асинхронный вызов). Идея здесь состоит в том, чтобы по существу опубликовать некоторые данные в маршрут, который обрабатывает это действие.

Например:

  • Скажем, у вас есть этот маршрут / страница: /product/details => ProductController::actionDetails()
  • Вы хотите обновить поле поиска с параметрами автозаполнения.
  • Вы настроили javascript для события onChange вашего поля поиска, чтобы вызывать метод, который отправляет значение поля (текущий текст) в действие на вашем контроллере.
  • Вы настроили этот маршрут / страницу /product/ajaxautocomplete => ProductController:actionAjaxAutocomplete()
  • Это второе действие принимает опубликованное значение из вашего асинхронного HTTP-запроса javascript (вызов 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'
});
1 голос
/ 03 сентября 2011

Вы сможете использовать виджет CJuiAutoComplete Yii, чтобы делать то, что вы хотите.Здесь есть базовая демонстрация здесь и другие примеры в документах Yii.Главное, что вам нужно убедиться в том, что вы также указываете опцию "appendTo", смотрите документ jQuery autocomplete , который использует этот виджет.

Итак, вынастроит виджет для вашего поля «Оценочный коэффициент загрузки» и укажет на поле «Среднее значение потребности в киловаттах» через атрибут appendTo.

И если вы не хотите, чтобы автозаполнение выполнялось, а просто хотите заменитьзначение, вы можете использовать атрибут htmlOptions "ajax" в вашем значении "loadf" следующим образом:

'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
)

see: CHtml # ajax-detail и jQuery.ajax.В этом случае вы, скорее всего, вернете простой текст, чтобы ваша функция контроллера выглядела так:

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