我正在尝试实现一个搜索表单,该表单将显示在给定(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();
}
答案 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(..))