Нужна помощь с Ajax Search в Zend Framework - PullRequest
1 голос
/ 05 апреля 2011

Я новичок в веб-программировании, поэтому, пожалуйста, потерпите меня.Я хочу, чтобы пользователь выбрал значение в поле со списком автозаполнения Dojo и отобразил результаты на той же странице.Я пытался следить за отличным постом Фила Брауна http://blog.philipbrown.id.au/2011/03/awesome-pagination-with-zf-paginator-ajaxcontext-and-the-html5-history-api/, но, честно говоря, это слишком много, особенно в отношении JavaScript.Я также пытался реализовать http://www.w3schools.com/php/php_ajax_database.asp, но безрезультатно, так как он рендерит всю мою страницу и результаты на самой странице с первой попытки и при повторном изменении значения в выпадающем списке ничего не передается моему JSфункция (я получаю XMLHttpRequest () не определена. То, что я до сих пор делал, это следуя блогу Фила

  1. Создал AjaxContext для моего поискового действия.

  2. Создал файл search.ajax.phtml и вызвал его из моего файла search.phtml

  3. Добавил событие onChange в мой выпадающий список Dojo в моей форме

  4. Создан JS-сценарий для обработки события при изменении на основе примера W3Schools.

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

Код моего поискового действия указан ниже. Я сохранил действие, чтобы проверить кнопку отправки на данный момент, так как мне не нужно обновлять страницу.

public function searchAction()
 {
   // Generate the form
   $form = new PetManager_Form_SearchBreeds;
   $this->view->form = $form;

   $input=$_GET["input"];

   if($input=$_GET["input"]){
    $b=$input;
        $q = Doctrine_Query::create()
        ->from('PetManager_Model_Breeds b')
        ->leftJoin('b.PetManager_Model_Pettype p')
        ->addWhere('b.breed LIKE ?',"$b%");

        // Execute query and attach results to the view
        $results=$q->fetchArray();
        $this->view->results=$results;
   }else if($form->isValid($this->getRequest()->getParams())){
            $input = $form->getValues();
             $q = Doctrine_Query::create()
            ->from('PetManager_Model_Breeds b')
            ->leftJoin('b.PetManager_Model_Pettype p');

            // attach criteria to base query
            if(!empty($input['breed'])){
            $b=$input['breed'];

             $q->addWhere('b.breed LIKE ?',"$b%");
            }

        // Execute query and attach results to the view
        $results=$q->fetchArray();
        $this->view->results=$results;
    } 

}

Мой код JS выглядит следующим образом

function getBreedDetails(str)
 {
   if (window.XMLHttpRequest)
   {// code for IE7+, Firefox, Chrome, Opera, Safari
     xmlhttp=new XMLHttpRequest();
       // testing only window.alert("XMLHTTP Request"+str);
   }
  else
   {// code for IE6, IE5
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      // testing only window.alert("MICROSOFT.XMLHTTP Request"+str);
   }
  xmlhttp.onreadystatechange=function()
  {
      if (xmlhttp.readyState==4 && xmlhttp.status==200)
      {

        document.getElementById("records").innerHTML=xmlhttp.responseText;
      }
   }
 xmlhttp.open("GET","/breeds/breed/search?input="+str,true);
 xmlhttp.send();

}

ThКод для моей формы выглядит следующим образом:

public function init()
{

    // Initialise form

    $this->setAction('/breeds/breed/search')
          -> setMethod('get');


     // Create a autocomplete input for breed name that fires an onChange event     
    $breedName = new Zend_Dojo_Form_Element_ComboBox('breed',array('onChange'=>"Javascript:getBreedDetails(breed.value)"));
    $breedName->setLabel('Breed Name');
            $breedName->setOptions(array(
            'autocomplete' => false,
            'storeId'   => 'breedStore',
            'storeType' => 'dojo.data.ItemFileReadStore',
            'storeParams' => array('url' => "/breeds/breed/autocomplete"),
            'dijitParams' => array('searchAttr' => 'breed')
      ))
            ->setRequired(true)
            ->addValidator('NotEmpty', true)
            ->addFilter('HTMLEntities')            
            ->addFilter('StringToLower')        
            ->addFilter('StringTrim');

    // create a submit button
    $search = new Zend_Form_Element_Submit('submit');
    $search->setLabel('Search')
           ->setOptions(array('class'=>'submit'));


     // attach elements to the form
    $this->addElement($breedName)
         ->addElement($search);     


  }

Мой файл search.ajax.phtml показан ниже, он вызывается из файла search.phtml, просто используя команду echo

<?php if(count($this->results)):?>
 <div id="records">
   <table>
    <tr>
    <td class="key">
    Breed
    </td>
    <td class="key">
     Tpye
    </td>
    </tr>
    <?php foreach ($this->results as $r):?>
    <tr>
     <td><?php echo $this->escape($r['breed']);?></td>
     <td><?php echo $this->escape($r['PetManager_Model_Pettype']['type']);?></td>
     <td><a href="<?php echo $this->url(array('id' => $r['breedID']), 'breeds-display'); ?>"> <img src='/images/view.png'/></a></td> 
     <td><a href="<?php echo $this->url(array('id' => $r['breedID']), 'breeds-update'); ?>"><img src='/images/updateico.png'/></a></td>   
     </tr>
     <?php endforeach;?>
     </table>

    </div>  
     <?php else:?>
     No Breeds Found
     <?php endif;?>

Любая помощь очень ценится, так как это заставляет мою голову таять и останавливает мой проект, так как мне понадобятся эти функции для других модулей.

Спасибо

Грэм

Ответы [ 2 ]

0 голосов
/ 05 мая 2011

Поскольку вы используете Dojo, вы можете также использовать его встроенную Ajax функциональность ...

А вот что-то странное:

$input=$_GET["input"];

if($input=$_GET["input"]){

Прежде всего, вы должны использовать правильную методологию Zend Framework, т.е. используйте $this->_getParam('input'); вместо доступа к аналогам $ _GET / $ _ POST / $ _ REQUEST.

Так что замените его на:

$input = $this->_getParam('input');

if (!is_null($input)) {

И затем для вашей реальной проблемы (ну, я думаю, в любом случае): чтобы вернуть данные из вашего вызова AJAX, вам, скорее всего, следует убедиться, что Zend Framework не будет отображать данные с использованием шаблона представления (если, конечно, вы не сделаете отдельный .phtml, который возвращает данные в правильном формате). Поэтому вам следует отключить средство визуализации вида, используя $this->_helper->viewRenderer->setNoRender();, а если вы используете менеджер раскладки, отключите это тоже $this->_helper->layout()->disableLayout();. И в конце сценария верните данные в формате, ожидаемом вашим клиентским сценарием (скорее всего, JSON).

Итак, подведем итог: ваш код действия поиска Ajax, вероятно, должен выглядеть следующим образом:

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

// fetch params & process, store results in $results

$this->getResponse()->setBody(Zend_Json::encode($results));

О, кстати, вам следует рассмотреть возможность использования отдельного действия для реального поиска ajax, если это возможно, вместо того, чтобы смешивать его с действием, которое отображает / обрабатывает вашу форму поиска ...

0 голосов
/ 05 мая 2011

Ну, сначала вам нужно локализовать проблему.Чтобы увидеть, если это на стороне сервера (PHP) или JS.Познакомьтесь с Firebug.Узнайте, каков фактический запрос, отправляемый на сервер, и отправляет ли сервер ожидаемый результат.Время освоить отладку и инструменты, которые помогут вам в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...