我是網絡編程的新手,所以請耐心等待。我想要做的是讓用戶從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 ()不確定。 我所做的到目前爲止是以下菲爾的博客在Zend框架中使用Ajax搜索需要幫助
創建一個AjaxContext我的搜索行動。
創建一個search.ajax.phtml文件,並把它稱爲從我search.phtml文件
增加了onChange事件以我的形式到我的Dojo組合框
創建一個JS腳本來處理基於W3Schools示例的on change事件。
任何人都可以請幫助我,我已經看到無處不在我能想到但仍然沒有喜悅。
我的搜索動作代碼在下面我一直保留檢查提交按鈕的動作,因爲它阻止我刷新頁面。
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();
}
我的表單的代碼如下所示
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文件
<?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;?>
任何幫助非常感謝,因爲這使我的頭融化,並正在磨我的項目停下來,因爲我將需要此功能的其他模塊。
感謝
格雷厄姆
不知道Dojo,但我很確定Dojo有一個AJAX的抽象層。爲什麼不使用它來讓你的事情變得容易?另外,我們需要看你的HTML。你如何觸發你的請求?如果您直接請求頁面,請求是否有效? (然後你可以刪除PHP幷包含相關的HTML位) – JohnP 2011-04-05 09:36:35
嗨johnP不,我不知道Dojo要麼我是這個東西的總新手。我會將表單和頁面的代碼添加到問題中。 – Graham 2011-04-05 10:37:34
確認你的PHP作品,並首先給你正確的結果。這樣,我們將重點放在問題的一部分 – JohnP 2011-04-05 10:46:25