Я новичок в веб-программировании, поэтому, пожалуйста, потерпите меня.Я хочу, чтобы пользователь выбрал значение в поле со списком автозаполнения 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 () не определена. То, что я до сих пор делал, это следуя блогу Фила
Создал AjaxContext для моего поискового действия.
Создал файл search.ajax.phtml и вызвал его из моего файла search.phtml
Добавил событие onChange в мой выпадающий список Dojo в моей форме
Создан 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;?>
Любая помощь очень ценится, так как это заставляет мою голову таять и останавливает мой проект, так как мне понадобятся эти функции для других модулей.
Спасибо
Грэм