cakephp自动完成 - 传递参数
问题描述:
我目前拥有这段代码。我正在尝试根据下拉列表中的值执行自动填充。问题是,林不知道我怎么能在Ajax请求的下拉传递选定值...cakephp自动完成 - 传递参数
使用普通的香草Scriptaculous和Prototype
<form>
<?php echo $this->Form->input('searchby', array('type' => 'select', 'options' => $searchByList, 'label' => 'Search By:'));?>
</b>
<?php echo $ajax->autoComplete('searchvalue', '/Controller/autoComplete/', array('minChars' => 2)); ?>
<input name="search" type="submit" value="Search"/>
</form>
答
如果你正在做一个搜索页面,我建议传球参数使用GET而不是POST。用户通常会将搜索添加为书签,如果使用POST完成搜索,则无法保留结果。
这是一个(快速入侵)如何做自动完成的例子。
你的搜索视图
<form method="get" action="/controller/search">
<?php echo $this->Form->input('Search.searchby', array('type' => 'select', 'options' => $searchByList, 'label' => 'Search By:'));?>
<?php echo $ajax->autoComplete('Search.searchvalue', '/controller/autoComplete/', array('minChars' => 2)); ?>
<input name="search" type="submit" value="Search"/>
</form>
它需要一个名为“控制器”控制器,它使用两个功能(“搜索”和“自动完成”)
function search() {
// GET parameters for search
$searchby = (isset($this->params['url']['searchby'])) ? ($this->params['url']['searchby']) : '';
$searchvalue = (isset($this->params['url']['searchvalue'])) ? ($this->params['url']['searchvalue']) : '';
// DO SEARCH HERE
$conditions = array('searchby'=>$searchby, 'searchvalue' => $searchvalue);
…etc…
}
function autocomplete() {
if(!empty($this->data['Search']['searchvalue'])){
$rs = $this->Search->findAll(array('searchvalue' => "LIKE {$this->data['Search']['searchvalue']}%"));
$this->set('searchvalues', $rs);
}
$this->render('autocomplete', 'ajax');
}
自动完成AJAX部件需要一个视图模板命名为'autocomplete.ctp'
<!-- autocomplete.ctp -->
<ul>
<?php if(isset($searchvalues) && !empty($searchvalues)){ ?>
<?php foreach($searchvalues as $t) { ?>
<li><?php echo $t['Search']['searchvalue']; ?></li>
<?php } ?>
<?php } ?>
</ul>
这应该让你指出正确的方向ñ。如果你想得到select标签的值并通过ajax传递它,那么你应该看看ajax函数用于序列化表单,你可能必须手工编写javascript代码,知道如果AJAX助手有序列化形式的选择。这里的一些代码我用来序列只是一个选择标签。可能是有益的)
<?php
$graph_type = array(
'impressions'=>'Impressions',
'click_throughs'=>'Click Throughs',
'click_through_ratio'=>'Click Through Ratio',
'time_with_brand'=>'Time with Brand',
'average_time_with_brand'=>'Average Time with Brand'
);
echo $html->selectTag('Graph/type', $graph_type, null, array('onChange' => 'event.returnValue = false; return false;', 'style' => 'margin-right:20px;'),null, false);
echo $javascript->event("'GraphType'", "change",
$ajax->remoteFunction(
array(
'update' => 'graph_container',
'url' => '/reports/ajax_graph_multiple',
'with'=>"Form.serialize('reports_form')"
)
)
);
?>
答
我明白了。您希望'searchBy'参数被序列化,以便它在自动完成功能中可用。 If you check out the documentation, there is an option for adding additional parameters.
有一个序列化表单的原型函数。我将它用于我的常规窗体,但我从未用于自动填充。试试这个。
<form id='autocomplete_form' name='autocomplete_form'>
<?php echo $this->Form->input('searchby', array('type' => 'select', 'options' => $searchByList, 'label' => 'Search By:'));?>
<?php echo $ajax->autoComplete('searchvalue', '/Controller/autoComplete/', array('minChars' => 2, 'parameters'=>"Form.serialize('autocomplete_form')")); ?>
<input name="search" type="submit" value="Search"/>
</form>
感谢了很多,但我的问题是关于我如何在searchBy传中自动完成()函数自动完成(){ 如果(!空($这个 - >数据[ '搜索'] [ 'searchvalue' ])){ $ rs = $ this-> Search-> findAll(array('searchvalue'=>“LIKE {$ this-> data ['Search'] ['searchvalue']}%”)); $ this-> set('searchvalues',$ rs); } $ this-> render('autocomplete','ajax'); } – caker 2011-03-16 14:52:51
谢谢大家。我通过切换到jquery来解决它! – caker 2011-03-17 14:39:06