2014-02-09 2 views
0

Yii 1.1.14Yii Ajax кнопку Отправить

Я пытаюсь сделать всплывающее окно, чтобы выбрать год, а затем получить выход отчетности за выбранный год:

enter image description here

всплывающее меню созданный CJuiDialog. Внутри CJuiDialog ', у меня есть форма. В первый раз у меня была обычная кнопка отправки в форме, и она отлично работала. Но это не закрыло всплывающее окно. Тогда я нашел это сообщение: Yii - CJuiDialog Close on submit button click Кнопка диалога для отправки формы закрывает диалоговое окно, но, похоже, не публикуется на указанном URL-адресе. Я также пробовал ajaxSubmitButton() непосредственно в форме. Тот же результат, когда я нажимаю на эту кнопку. Нет ошибок JS, ничего в журнале приложений.

Это мой Вид:

<div class="reporting"> 
    <?php 
     $this->beginWidget('zii.widgets.jui.CJuiDialog',array(
      'id'=>'mydialog', 
      'options'=>array(
       'title'=>'select year test', 
       'autoOpen'=>false, 
       'modal'=>true, 
       'buttons' => array(
        'Dialog Submit Button'=>'js:function(){ 
         $.post(
          $("#select-year-form").attr("action"), 
          $("#select-year-form").serialize(), 
          function(){$("#mydialog").dialog("close");}      
         ); 
        }',    
         array('text'=>Yii::t('app','reporting.select.close'),'click'=> 'js:function(){$(this).dialog("close");}'), 
       ), 
      ), 
     )); 
    ?> 
    <div class="well"> 
     <?php echo  CHtml::beginForm(CHtml::normalizeUrl(array('/site/about')),'post',array('id'=>'select-year-form')); ?> 
     <table class="contentheader"> 
      <tr> 
      <td><?php echo CHtml::DropDownList('year', $lastyear, $yearslist, array('options'=>array($lastyear=>array('selected'=>true)))); ?></td> 
      </tr> 
     </table> 
     <br /> 
     <?php echo CHtml::ajaxSubmitButton('Form Ajax Submit Button', 
       CHtml::normalizeUrl(array('/site/about')), 
       array('success'=>'function(){$("#mydialog").dialog("close");}'), 
       array('name' => 'run', 'class' => 'btn btn-success') 
     ); ?> 
     <?php echo CHtml::endForm(); ?> 
    </div> 

    <?php 
     $this->endWidget('zii.widgets.jui.CJuiDialog'); 
     echo CHtml::link(Yii::t('app','app.menu.reporting.planning.xlsabsence'), '#', array(
      'onclick'=>'$("#mydialog").dialog("open"); return false;', 
     )); 
    ?> 
</div> 

EDIT: Вот RequestHeader для AJAX кнопка отправки: источник

Request URL:http://localhost/yii02/yiiars02/index.php?r=site/about 
Request Method:POST 
Status Code:200 OK 
Request Headersview source 
Accept:*/* 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4,de;q=0.2 
Connection:keep-alive 
Content-Length:9 
Content-Type:application/x-www-form-urlencoded; charset=UTF-8 
Cookie:b594784e48e60bab8dd41b584687725e=04rsh9hf09a4ef2f4a0in4prg7; e34b39f8afcdd208672f91abc90c8ad5=eqp4uva5819mj068b2n2qf3nu2; jpanesliders_panel-sliders=0; jpanesliders_position-icon=0; gantry-admin-tab=3; f6ea8ae4b9346c959ddbac3f5fefea4b=kk6g5oahbmql62rqkdiafem904; 60c5ada15aad7e760a944539ad24030d=bhf70j5o138vlse6m1gsmv49k6; 098c7ced18d50e0c9e49b567bc9f0832=fr-FR; 160a24a8bbe9b9a4500e829a48ae3415=e72bkntgosf81tbg26s6nk39j6; 25c0d40cd6ace920e960f397705968e5=pdgqudpu2psp5dpag72tol5tp0; PHPSESSID=31sij28hcolr3r1ip39rugmf62 
Host:localhost 
Origin:http://localhost 
Referer:http://localhost/yii02/yiiars02/index.php?r=planning/test 
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36 
X-Requested-With:XMLHttpRequest 
Query String Parametersview sourceview URL encoded 
r:site/about 
Form Dataview sourceview URL encoded 
year:2014 

Response Headersview

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Connection:Keep-Alive 
Content-Length:4810 
Content-Type:text/html 
Date:Mon, 10 Feb 2014 09:56:39 GMT 
Expires:Thu, 19 Nov 1981 08:52:00 GMT 
Keep-Alive:timeout=5, max=100 
Pragma:no-cache 
Server:Apache/2.2.17 (Win32) PHP/5.4.21 
X-Powered-By:PHP/5.4.21 

Для другой кнопки - тот же заголовок запроса. Ошибка не возникает - так почему я не могу увидеть страницу r = сайт/о? (на самом деле r = сайт/about - это всего лишь тестовая страница, мне нужно будет сделать целевую страницу, когда я разрешу эту проблему).

+0

Я думаю, что он представляет форму, но в actionIndex(). Проверьте, отправляется ли он в actionIndex, поместив код CVarDumper :: Dump ($ _ GET, 100, true), die() в actionIndex. Если он отправляется в индекс, то вызывается код выше. –

+0

Привет - спасибо - я поместил код в actionIndex, но ничего не изменилось. При нажатии одной из двух кнопок отправки единственное, что заметно происходит, это то, что диалог закрыт. –

+0

Хорошо, это означает, что если ваша функция успеха вызывается, тогда был сделан запрос ajax. Вы проверили заголовок запроса в элементе проверки -> Сеть? –

ответ

0

Ajax звонки сделаны для частичного обновления на странице не на всей странице. Сначала вы должны определить id для элемента, который хотите обновить. например

<div id='myDiv'> 
</div> 

Теперь у вас ajaxSubmitButton код написать

<?php echo CHtml::ajaxSubmitButton('Form Ajax Submit Button', 
       CHtml::normalizeUrl(array('/site/about')), 
       array('success'=>'function(){$("#mydialog").dialog("close");}', 
         'update'=>'#myDiv'       ), 
       array('name' => 'run', 'class' => 'btn btn-success') 
     ); ?> 

Когда будет получен ответ на идентификатор будет обновление обновляется соответствующим образом. Помните, что вы можете обновить любой элемент, установив для него id.

+0

Ты, безусловно, прав насчет аякса. Я не хотел использовать ajax. Но я нашел этот пост (см. Мой первоначальный пост) и подумал, что это может решить мои проблемы. В идеальном мире я хотел бы получить этот процесс: откройте всплывающее окно, выберите год, отправьте вызовы действие для создания файла PDF. Это поколение pdf довольно длинное, поэтому было бы неплохо иметь какой-то «загружающий» gif-образ. Когда PDF-файл генерируется, закройте всплывающее окно и покажите флеш-сообщение, чтобы сообщить пользователю, что PDF-версия успешно выполнена. Поэтому, если кто-то может дать мне несколько намеков на то, как близко к этому сценарию будет приятно –

0

я работать процесс, но результат загруженный файл, который не может быть прочитан Excel:

Я представил этот Аякс кнопка отправку:

<?php echo CHtml::ajaxSubmitButton('Form Ajax Submit Button', 
    CHtml::normalizeUrl(array('/planning/xlsAbsences')), 
    array(
     'type'=>'POST', 
     'beforeSend' => "function(request) { console.log('beforeSend'); }", 
     'data'=>'js:$("#select-year-form").serialize()+"&year="+$("#dropDownId :selected").text()', 
     'success'=>'function(response, status, request){  
      $("#mydialog").dialog("close"); 
      var disp = request.getResponseHeader("Content-Disposition"); 
      if (disp && disp.search("attachment") != -1) { 
       var filename = disp.substring(21).replace("\"",""); 
       var form = $("<form method=\"POST\" action=\"index.php?r=planning/dl\">"); 
       form.append($("<input type=\"hidden\" name=\"content\" value=\"" + request.responseText + "\">")); 
       form.append($("<input type=\"hidden\" name=\"filename\" value=\"" + filename + "\">")); 
       $("body").append(form); 
       form.submit(); 
      } 
      console.log(filename); 
      console.log(request.responseText); 
     }', 
     'complete' => "function(request) { console.log(request); }", 
     'error' => "function(data) { alert('erro'+data); }", 
    ), 
    array('name' => 'run', 'class' => 'btn btn-success') 
); ?> 

Я создал новое действие в качестве мишени для форма действия - его называют actionDl:

public function actionDl() 
{ 
    $filename = $_POST['filename']; 
    $content = $_POST['content']; 
    header("Content-Disposition: attachment; filename=".$filename); 
    header('Content-Type: application/octet-stream'); 
    header('Cache-Control: max-age=0'); 
    echo $content; 
} 

Я думал, что request.responseText содержит содержимое файла Excel, но, возможно, я ошибаюсь по этому поводу?

Смежные вопросы