2012-09-25 2 views
1

드롭 다운 선택 상자가있는 페이지가 있습니다. 무언가가 선택되면 zend 컨트롤러를 호출하여 일부 데이터를 반환 한 다음 페이지의 다른 부분에 데이터가 채워지는 ajax 호출이 있습니다. 문제는 페이지가 새로 고쳐지고이를 방지하기 위해서입니다.젠드 컨트롤러/아약스가 페이지 새로 고침을하지 못하게하기

나는 지금까지 작동하지 않은 여러 가지를 시도했다.

내 자바 스크립트

event.preventDefault(); 
return false; 

퍼팅/JQuery와/아약스

는 .. 컨트롤러 자체에

$this->disableRender(); 
$this->_helper->layout->disableLayout(); 
$this->_helper->viewRenderer->setNoRender(TRUE); 

을 넣고도 마지막에

return false; 

을 가하고 공동 관리자.

누구에게 의견이 있습니까?

편집 : 여기에 아래

<script> 

$(document).ready(function() { 

    $("#advDropdown").change(function (event) { 
     //event.preventDefault(); 
     //return false; 
     var advertiser_id; 
     advertiser_id = $("#advDropdown").val(); 

     $.ajax({ 
      type: 'POST', 
      dataType: 'json', 
      //url: '/dashboard/reporting/getallcampaigns', 
      url: '/admin/ajax/getallcampaigns?format=json', 
      data: { advertiser_id: advertiser_id }, 
      success: function(data) { 
       //alert(adv_data); 
       //var data = jQuery.parseJSON(adv_data); 
       var count = 0; 
       // loop through the returned data object 
       for(var key in data) { 
        if(typeof data[key] === "object") { 
         for(var i = 0; i < data[key].length; i++) { 
          for(var property in data[key][i]) { 
           //alert(property + " = " + data[key][i][property]); 
           if(count == 0){ 

            $('#campaign').html('<table id="campaign">'); 
            $('#campaign').append('<thead><tr><th width="100"><input type="checkbox"></th><th width="500">Campaign Name</th>'); 
            $('#campaign').append("</tr></thead>"); 

           } else { 
            $('#campaign').append('<tr><td><input type="checkbox" id=' + property +'"></td><td>' + property + " - " + data[key][i][property] + "</td></tr>"); 

           } 
           count = count + 1; 
          } 
         } 
         $('#campaign').append("</table>"); 

        } else if(typeof data[key] === "string") { 
         // alert(key + " = " + data[key]); 
        } 
       } 

       //alert("campaigns: " + campaigns); 
       //this.preventDefault(); 
       event.preventDefault(); 
       return false; 


      }, 
      error: function() { 
       alert("could not change the status indicator color"); 
      } 
     }); 

     return false; 
    }); 

</script> 

그리고 아래의 아약스와 컨트롤러 코드는

<?php 

class Admin_AjaxController extends Zend_Controller_Action{ 

    public function init(){ 

     $this->_helper->layout->disableLayout(); 

     $this->_helper->viewRenderer->setNoRender(); 
    } 

    public function getallcampaignsAction(){ 


      $this->_helper->layout->disableLayout(); 

      $this->_helper->viewRenderer->setNoRender(); 


      $campaign = new Campaign(); 

      $data = $this->_request->getPost(); 

      $campaigns = $campaign->getCampaigns($data['advertiser_id']); 



      $result = array(); 

      $db = Zend_Db_Table_Abstract::getDefaultAdapter(); 
      foreach($campaigns as $campaign){ 

       // get campaigns id and get the name 

       $c_sql = 'SELECT * FROM campaigns WHERE ext_id = ' . $campaign['ext_id']; 
       error_log("c_sql2: " . $c_sql); 


       $campaign_name = $db->query($c_sql)->fetchAll(); 

       $campaign_name2 = $campaign_name[0]['name']; 



       $temp_array = array($campaign['ext_id'] => $campaign_name[0]['name']); 
       array_push($result, $temp_array); 


      } 
      $final_array = array('data' => $result); 




      //header('Content-type: application/json'); 

      echo json_encode($final_array); 
      //Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer') 
      //$this->_helper->sendJson($data, array('keepLayouts' => false)); 
      //$this->_helper->json($data, true, array('keepLayouts' => false); 

      //error_log(""); 
      //return $final_array; 
      //$response = $this->_helper->autoCompleteDojo->sendAutoCompletion($data); 

      //$view = new ViewModel(); 
      //$view->setTerminate(true); 
      //return $view; 
      //return $this->response; 
      //exit(); 

      //return false; 
      //die(); 


     } 

} 


?> 
+0

선택 상자가 제출중인 양식의 일부인 것처럼 들립니다. 그것이 페이지를 새로 고치는 원인입니다. 선택 상자와 관련된 코드를 표시 할 수 있습니까? – vascowhite

+0

그냥 아약스와 컨트롤러 용 코드를 게시했습니다. 확인 해봐. – CodeCrack

답변

1

가 난 단지

public function init() 
{ 
    $this->_helper->layout->disableLayout(); 
    $this->_helper->viewRenderer->setNoRender(); 
} 



private function __isAjax() { 
    return (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'); 
} 

public function onselectAction(){ 
    if (self::__isAjax()) { 
     if ($this->getRequest()->isPost()){ 
      $selected = $this->getRequest()->getPost('selected'); 
      $getModel = new Application_Model_DbTable_City(); 
      $this->view->data = $getModel->getData($selected); 
      $this->renderScript('ajax/result.phtml'); 
     } 

    }else{ 
     echo "some error occured"; 
    } 
} 
AjaxController.php

라는 아약스의 컨트롤러를 생성 한 컨트롤러 코드입니다

그리고이 jquery로이 함수를 호출했습니다.

jQuery.ajax({ 
      type: "POST", 
      url: "<?php echo $this->url(array('controller'=>'ajax','action'=>'onselect'),null,true) ?>", 
      data: 'selected='+selected, 
      success: function(data) { 
       jQuery('#result').html(data); 
      } 
     }); 

나를 위해 잘 작동합니다.

+0

코드가 json을 echo하고 renderScript를 호출한다는 점을 제외하면 코드가 내 것과 비슷합니다. 방금 아약스와 컨트롤러 용 코드를 게시했습니다. 확인 해봐 – CodeCrack

관련 문제