【问题标题】:Implementing a search form that updates grid or lister实现更新网格或列表的搜索表单
【发布时间】:2012-09-04 08:49:23
【问题描述】:

我正在尝试实现一个搜索表单,当给定(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();
}

【问题讨论】:

    标签: atk4


    【解决方案1】:

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

    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】:

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

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

      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 接收表名,而不是模型名。 快速搜索的数组参数标识了它将搜索的字段。

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

      如果您想更改搜索(例如,不区分大小写,因为它只与提供的完全匹配),您可以在 yoursite/lib 中创建一个新版本,例如 MySearch.php,它扩展了 QuickSearch 和 init,然后覆盖 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 应该根据搜索为您处理网格重新加载。

      【讨论】:

      • 是的,我在其他地方使用它,我只需要在单个网格中进行快速搜索/过滤。但是我对搜索表单的想法是让它在各种数据库表中搜索关键字并将结果显示在不同的网格中(每个表一个),这就是为什么我要考虑如何更新网格。基本上我想我想做的是有一个“快速搜索”字段,可以在各种网格中搜索,如果可能的话,我不会。我没有在代码页上找到显示类似内容的示例...
      【解决方案3】:

      您的问题是使用 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(..))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-21
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多