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')" 
      ) 
     ) 
    ); 
?> 
+0

感谢了很多,但我的问题是关于我如何在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

+0

谢谢大家。我通过切换到jquery来解决它! – caker 2011-03-17 14:39:06

我明白了。您希望'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>