2014-11-13 4 views
0

Я используюDROPDOWNLIST не обновляется с использованием Yii

PHP язык, юй-1.1.13 рамки и БД MySQL.

В моих взглядах, у меня есть этот код:

Просмотров Код главной страницы

/** Start Widget **/ 
    $this->beginWidget('zii.widgets.jui.CJuiDialog',array(
     'id'=>'dialog', 
     'options' => array(
       'title' => 'Locations Management', 
       'autoOpen' => false, 
       'modal' => true, 
       'resizable' => false, 
       'dialogClass' => 'managelocation-dialog-class', 
       'show'=>array(
         'effect'=>'drop', 
         'duration'=>500, 
       ), 
       'hide'=>array(
         'effect'=>'drop', 
         'duration'=>500, 
       ), 
     ), 

    )); 


    /** 
    * Render dialog view. 
    */ 
    echo $this->renderPartial('manageLocationDialog', array(
      'model' => $model, 
      'locationInfo' => $locationInfo, 
    )); 


    $this->endWidget('zii.widgets.jui.CJuiDialog'); 


    /** 
    * Filter Dialog widget 
    */ 
    $this->beginWidget('zii.widgets.jui.CJuiDialog',array(
      'id'=>'filter-dialog', 
      'options' => array(
        'title' => 'Filter', 
        'autoOpen' => false, 
        'modal' => true, 
        'resizable' => false, 
        'width' => 350, 
        'dialogClass' => 'location-dialog-class', 
        'show'=>array(
          'effect'=>'drop', 
          'duration'=>500, 
        ), 
        'hide'=>array(
          'effect'=>'drop', 
          'duration'=>500, 
        ), 
      ), 

    )); 

    /** 
    * Render the filter dialog view. 
    */ 
    echo $this->renderPartial('manageLocationFilter', array(
      'filterFormloc' => $filterFormloc, 
      'locationInfo' => $locationInfo, 
    )); 

    $this->endWidget('zii.widgets.jui.CJuiDialog');?> 

Просмотры Код Add/Edit Dialog

<div id="action-button-div" class="row"> 
     <?php 
      echo CHtml::button('Create New', array(
       'id'=>'action-button', 
       'class'=>'submit-button', 
       'onclick'=>"{submitActionJs();}", 
       'update' =>'#filter_province_name', 
      )); 
     ?> 
     <?php 
      echo CHtml::button('Cancel', array(
       'id'=>'cancel-button', 
       'onclick'=>'{$("#dialog").dialog("close");}', 
      )); 
     ?> 
    </div> 

Просмотры Код фильтровального Диалога

<div id="dialog-contents-container"> 
    <div class="row"> 
     <div id="filter-mode-div"> 
      <?php 
       echo $form->labelEx($filterFormloc, 'filter_mode', array(
        'label' => 'Filter Mode', 
       )); 
      ?> 
      <div> 
      <?php 
       echo $form->radioButtonList($filterFormloc, 'filter_mode', array(
        1=>'ON',2=>'OFF'),array('id'=>'filter_mode' 
       )); 
      ?> 
      </div> 
     </div> 
     <div id="reset-button-div"> 
      <?php 
       echo CHtml::button('Reset Settings', array(
        'id'=>'reset-button', 
        'onclick'=>'{$(this.form).find("textarea, :text, select").val("").end().find(":checked").prop("checked", false);$("#ManageLocationFilterForm_filter_mode_1").attr("checked",true);}', 
       )); 
      ?> 
     </div> 
    </div> 

    <div id="under-container"> 

     <div class="row"> 
      <div id="province_name"> 
       <?php 
        echo $form->labelEx($filterFormloc, 'province_name', array(
         'label' => 'Province *', 
        )); 
       ?> 

       <div> 
       <?php 
        echo $form->dropDownList($filterFormloc, 'province_name', 
         $locationInfo->getAllProvincesForSelection(true, 'Select Province'), 
         array(
          'id' => 'filter_province_name', 
          'class' => 'selectbox', 
         ) 
        ); 
       ?> 
       </div> 
      </div> 
     </div> 

    </div> 


    <div id="action-button-div" class="row"> 
     <?php 
      echo CHtml::button('Apply Filter Settings', array(
       'id'=>'action-button_2', 
       'onclick'=>"{submitFilterActionJs();}" 
      )); 
     ?> 
     <?php 
      echo CHtml::button('Cancel', array(
       'id'=>'cancel-button_2', 
       'onclick'=>'{$("#filter-dialog").dialog("close");}', 
      )); 
     ?> 
    </div> 

</div> 

В моем контроллере, ниже мой код:

общественной функция actionRegisterLocation() {

$model = new ManageLocationForm; 
    if (isset($_POST['ManageLocationForm'])) 
    { 

     $model->attributes = $_POST['ManageLocationForm']; 

     if (Yii::app()->request->isAjaxRequest) 
     { 
      if ($model->hasErrors()) 
      { 
       $errors = ''; 
       foreach ($model->getErrors() as $e) $errors .= implode($e).'<br>'; 
       echo CJSON::encode(array(
         'status'=>'failure', 
         'messages'=>$errors 
       )); 
      } 
      else 
      { 
       $locationInfo = new LocationInfo; 
       if ($model->operation_mode === AdminGeneralHelper::OPERATION_MODE_UPDATE) 
       { 
        $locationInfo=LocationInfo::model()->findByPk($model->location_id); 
       } 
       $locationInfo->short_name = $model->short_name; 
       $locationInfo->town_name = $model->town_name; 
       $locationInfo->province_name = $model->province_name; 

       $locationInfo->save(); 

       if ($model->operation_mode === AdminGeneralHelper::OPERATION_MODE_CREATION) 
        $_message = 'Create operation completed.'; 
       if ($model->operation_mode === AdminGeneralHelper::OPERATION_MODE_UPDATE) 
        $_message = 'Update operation completed.'; 


       if ($locationInfo->hasErrors()) 
       { 
        $errors = ''; 
        foreach ($locationInfo->getErrors() as $e) $errors .= implode($e).'<br>'; 
        echo CJSON::encode(array(
          'status'=>'failure', 
          'messages'=>$errors 
        )); 
       } 
       echo CJSON::encode(array(
         'status' => 'success', 
         'messages' => $_message, 
       )); 
      } 
      exit; 
     } 
    } 
    else 
    { 
     echo "FALSE"; 
    } 
    Yii::app()->end(); 
} 

Ниже приведен сценарий:

  1. открыть диалоговое окно для добавления местоположения. (Параметры: short_name, город и провинция)
  2. Место было успешно добавлено в виде сетки и DB.
  3. Открываю диалоговое окно для фильтра. Он может фильтровать только по провинции.
  4. Когда я просматриваю списки распада, местоположение, которое было успешно добавлено, отсутствует в списках.

Мой вопрос в том, как обновить выпадающие списки диалогового окна фильтра после того, как я успешно добавил местоположение из диалогового окна «Добавить/редактировать». Альтернативное решение - мне нужно обновить браузер, а затем открыть диалоговое окно фильтра. Но это не то, что удобно для пользователя. Это действительно ошибка.

+0

Помогите нам решить проблему, удалив ненужные файлы или строки кода. – topher

+0

Привет @topher! Добрый день! Я удалил ненужные строки кода. Пожалуйста, помогите мне решить мою проблему. Спасибо. – fedel1234

+0

Привет @topher! Пожалуйста, помогите мне решить мою проблему. – fedel1234

ответ

0

update или требует ответа для запроса как html (подробнее см. Источник для CHtml::ajax()). Ваш запрос возвращает json. У вас есть несколько вариантов:

  1. Вы можете изменить контроллер вернуть все варианты выпадающего меню как HTML и продолжать использовать update.
  2. Вы можете изменить контроллер, чтобы вернуть полное раскрывающееся меню в виде html и использовать replace вместо update.
  3. Вы можете изменить контроллер, чтобы вернуть идентификатор и значение недавно добавленного местоположения и использовать пользовательскую функцию javascript, чтобы добавить этот параметр в раскрывающийся список.
+0

Привет @topher! можете ли вы дать мне пример кода варианта № 1, который есть. Вы можете изменить контроллер, чтобы вернуть все параметры раскрывающегося списка в виде html и продолжить использование обновления. – fedel1234

+0

@ переполнение стека fedel1234 не дает мне код сайта. Мы дадим вам решения, но вам придется их реализовать. – topher

+0

Отмечено @topher. благодаря – fedel1234

0

Я пробовал вариант № 3 и его работу.

Ниже приведен рабочий код из моего Javascript-файла.

function submitActionJs() { 
    var fareCat = document.getElementById("name").value; 
    var newFareCat = toTitleCase(fareCat); 
    $.ajax({ 
     url: 'registerFareCategory', 
     type: 'POST', 
     datatype: 'json', 
     data: $('form').serializeArray(), 
     timeout: 10000, 
     beforeSend: function(){ 
      $('#dialog-msg').html('Processing...'); 
     }, 
     success: function(data){ 
      var res = eval('(' + data + ')'); 
      $('#dialog-msg').html(res.messages); 
      if (res.status == 'success'){ 
       $("#message-label").html(res.messages); 
       $.fn.yiiGridView.update('fare-category-grid'); 
       $("#dialog").dialog("close"); 
       window.parent.$('#filter_name').append('<option value = "' + newFareCat + '">' + newFareCat + '</option>'); 
       //sort fare category dropdownlist from filter dialog 
       $("#filter_name").html($('#filter_name option').sort(function(x, y) { 
        return $(x).text().toUpperCase() < $(y).text().toUpperCase() ? -1 : 1; 
       })); 
       $("#filter_name").get(0).selectedIndex = 0; 
       e.preventDefault(); 
      } 

     }, 
     error: function(){ 
      $('#dialog-msg').html('Ajax Communication Error.'); 
     } 
    } 
    ); 

} 

Спасибо @topher за ваше предложение.