【发布时间】:2012-03-11 20:30:38
【问题描述】:
我希望你在哪里放一个初始值。 我已经看到 quicksearch 有 'q' 元素但我无法访问它,例如这没有找到 q 元素:
$quickSearch->getElement('q');
如何访问快速搜索以设置初始值?
【问题讨论】:
标签: php user-interface frameworks atk4
我希望你在哪里放一个初始值。 我已经看到 quicksearch 有 'q' 元素但我无法访问它,例如这没有找到 q 元素:
$quickSearch->getElement('q');
如何访问快速搜索以设置初始值?
【问题讨论】:
标签: php user-interface frameworks atk4
要解决这个问题,我们首先要了解快速搜索类的搜索字段是如何添加到网格基础类中的。所以通过对源代码的调查,我们可以看到:
q
q仅添加DURING网格的渲染阶段知道了这些,我们现在可以继续将修改添加到地址项 #1。
首先,我们需要在 QuickSearch 类中添加一个变量来跟踪 Form_Field q:
var $search_field=null; // add this line (1)
function recallAll(){
$ff=$this->addField('line','q','');
$this->search_field=$ff; // and this line (2)
parent::recallAll();
:
:
}
其次,为了解决项目#2,在我们定义网格的页面上,我们需要添加一个后续挂钩,例如:
class page_gridsearchtest extends Page {
var $search=null;
function init() {
parent::init();
$g = $this->add('MVCGrid');
$g->setModel('Employees');
if($g){
$this->search=$g->addQuickSearch(array('fullname'));
if($this->search)
$this->api->addHook('post-init',array($this,'MyHook')); // add hook
}
}
function MyHook(){ // hooked method
if($this->search->search_field) {
if($this->search->search_field->get()=='')
$this->search->search_field->set('Juan'); // set initial search if blank
$this->search->search_field->setCaption('Employee Name Search');
}
}
}
这将在快速搜索字段旁边设置一个 CAPTION,如果搜索字段为空,则添加一个 DEFAULT 搜索文本。
如果这只是一次性的事情,那么这可能作为一种快速修复有用,因为直接对库源进行更改是非常不正统的,并且不遵循 ATK 提倡的扩展和子类化的 OOP 概念.
【讨论】:
查看它的来源可以帮助您找出问题所在。敏捷工具包的设计方式是开发人员应该利用源代码知识。
QuickSearch 是从 Filter 派生的,Filter 是从 Form 派生的,所以应该在某处有 addField。查看快速搜索,您会在recallAll() 函数中找到它。没有调用此函数,因此我们应该查看父类 - 过滤器。
Filter 在 api 中设置一个钩子,在初始化完成后调用recallAll。这意味着能够访问该字段,您可以重新定义方法或自己添加挂钩。
钩子:
$this->api->addHook('post-init',function() use($quickSearch){
$quickSearch->getElement('q')->set('hello');
});
扩展
class MyQuicksearch extends QuickSearch {
function recallAll(){
parent::recallAll();
$this->getElement('q')->set('hello');
}
}
最后,您可以利用知道recallAll 从哪里加载其默认值的优势,然后简单地执行以下操作:
$quicksearch->memorize('q','hello');
【讨论】: