0

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

我看过一些类似的问题(即:如何在 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();
}
4

3 回答 3

0

您是否尝试过使用网格上的内置快速搜索?

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

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 和 init 的 yoursite/lib 中创建一个新版本,例如 MySearch.php,然后覆盖 applyDQ () 函数并在输入的搜索字符串上包含一个 strtolower(),在 mysql 表列上包含一个 LOWER(column)。

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 应该根据搜索为您处理网格重新加载。

于 2012-07-14T16:38:05.940 回答
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();
}

未经测试,但应该可以工作。

于 2012-07-16T21:46:49.570 回答
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(..))

于 2012-09-04T00:49:23.153 回答