实现更新网格或列表的搜索表单

时间:2012-07-13 15:34:44

标签: atk4

我正在尝试实现一个搜索表单,该表单将显示在给定(a)关键字时从数据库获取的结果,然后使用搜索结果更新网格或列表。 只有我有点失去了如何更新网格...

我看了一些类似的问题(例如:How to refresh grid after update from modal form in atk4?),但在提交表单后我似乎无法更新网格。 代码如下,任何关于我做错的提示,或更好的方法吗? 后来我想从不同的数据库表中搜索和更新几个网格/列表,但如果我得到一个工作,那将是一个开始... :)

$f=$this->add('Form');
$f->addField('Search','buscar', 'Enter keywords:');
$f->addSubmit('Search');

$g=$this->add('Grid');
$g->js(true)->addClass('myreload');
$g->js('myreload')->reload();
$g->setSource('conflicto');
$g->addColumn('nombre');        
$g->addColumn('idconflicto');

if($f->isSubmitted())  
{
     $keywords=$f->getElement('buscar')->get();
     $g->dq->where("nombre LIKE '".$keywords."'");
     $this->js(null,$this->js()->_selector('.myreload')->trigger('myreload')) ->univ() ->closeDialog() ->successMessage('Actualizado') ->execute();
}

3 个答案:

答案 0 :(得分:0)

您是否尝试在网格上使用内置的quicksearch?

您应该能够将quicksearch添加到网格中,以便您的页面看起来像这样

class page_yourpage extends Page {
    function init(){
       parent::init();
       $p=$this;

       $c=$p->add('Grid');
       $c->setSource('conflicto');

       if($c->grid){
          $c->grid->addPaginator(20);
          $c->grid->addQuickSearch(array('nombre'));
        } // end if
     } // end init
} // end class

注意setSource接收表名,而不是模型名。 quicksearch的数组参数标识它将搜索哪个字段。

这会导致添加带有放大类图标的搜索字段,因此您输入搜索文本,它将搜索指定的字段并使用与该搜索匹配的行更新网格。

如果你想改变搜索(例如,因为它只是提供完全匹配的不区分大小写),你可以在yoursite / lib中创建一个新版本,如MySearch.php,它扩展了QuickSearch,在init中,然后覆盖applyDQ()函数,并在输入的搜索字符串上包含一个strtolower(),在mysql表列上包含LOWER(列)。

class MySearch extends QuickSearch () {

 function applyDQ($dq){
            if(!($v=$this->get('q')))return;

            $v=strtolower(addslashes($v));  // quote it

            $q=array();
            foreach($this->fields as $field){
                    $q[]="lower($field) like '%".$v."%'";
            }
            if($q){
                    $dq->having(join(' or ',$q));
            } // end if
    } // end function
 } // end class

然后,您需要使用此代码将其添加到页面上的网格中,以便它使用MySearch的实现而不是默认实现。

 $c->grid->addQuickSearch(array('nombre'), 'MySearch');

ATK4应根据搜索情况为您重新加载网格。

答案 1 :(得分:0)

好的,所以你应该做的是:

if (isset($_GET["q"])){
    $q = $_GET["q"];
    $g->dq->where("field like '%" . mysql_real_escape_string($q) . "%');
}

if ($f->isSubmitted()){
    $g->js()->reload(null, array("q" => $f->get("q")))->execute();
}

未经测试,但应该有效。

答案 2 :(得分:0)

您的问题是使用Agile Toolkit 4.1语法。在4.2中你可以使用它:

$g=$this->add('Grid');
$q=$this->api->dsql()->table('conflicto');

if (isset($_GET["q"])){
    $q->where('field','like', '%'.$q.'%'); 
                              // 3rd argument is escaped automatically
}

$g->setSource($g);

但是我必须提醒你,最好的当然是使用$ g-> setModel($ m-> addCondition(..))