在我的站点中,我有一个页面旨在处理用于错误跟踪和功能请求的基本票证系统。我需要一个网格来显示当前打开的请求,并带有一个允许用户添加新请求的按钮。我还希望每一行都有一个名为“详细信息”的按钮,该按钮将打开一个新页面或弹出一个包含历史记录的框架(不介意哪个),例如日期、时间和错误/问题的任何评论、状态更新或评论和一个简单的表格,以允许用户添加新的回复。
到目前为止,我创建了一个添加 CRUD 的页面,并使用 addColumn('button','detail') 为每一行添加了一个按钮。
并且创建它的 ATK4 代码像这样优雅地简短
<?php
class page_ticket extends Page {
function init() {
parent::init();
$p=$this;
$team=$this->api->getTeamID();
if (isset($_GET['detail'])) {
$ticket=$_GET['detail'];
$p->add('HtmlElement',null, 'crud')->setElement('h2')->set('Ticket History - ['.$ticket.']');
} else {
$tk=$p->add('CRUD_Ticket', null, 'crud');
$m=$tk->setModel('Ticket', array('name', 'submit_date', 'status','ticket_type_id', 'urgency_id','description');
$m->addCondition('status','TKO');
$open=$this->api->db->dsql()->table('vscrum_ticket')
->field('count(*)')
->where('team_id',$team)
->where('status','TKO')
->do_getOne();
.. .. ..
$tk->grid->addQuickSearch(array('name'));
$tk->grid->addPaginator(12);
}
$this->template->set('open_tickets', $open);
} //End else detail
}
function defaultTemplate(){
return array('page/ticket');
}
}
但问题是我无法确定处理按钮的默认功能的位置。目前,默认情况下,它会打开传递参数的同一页面 (ticket.php),但会打开一个新窗口并给出 Ajax 错误,如图所示。
我在页面和错误窗口中包含了 if then else ,它正确显示了我的输出,即按下详细信息按钮的行的票证 ID。我可以稍后添加其他细节,但为什么它在新窗口中打开它而不是在框架中加载它?
我认为这是 CRUD 的默认功能,因为按钮通常是编辑或删除的,但我该如何覆盖它?
如果我想打开一个不同的页面,而不是同一个页面,我认为这也与覆盖使用 javascript frameURL 函数打开一个框架的 MVCGrid 按钮的默认功能有关。
CRUD 看起来像这样
<?php
class CRUD_Ticket extends View {
public $form=null;
public $grid=null;
public $grid_class='MVCGrid';
public $form_class='MVCForm';
public $frame_options=null;
function init(){
parent::init();
if(isset($_GET[$this->name])){
$this->api->stickyGET($this->name);
$this->form=$this->add($this->form_class);
$_GET['cut_object']=$this->name;
return;
}
$this->grid=$this->add($this->grid_class);
$this->js('reload',$this->grid->js()->reload());
$this->add_button = $this->grid->addButton('Add Ticket');
$this->add_button->js('click')->univ()
->frameURL('Add Ticket',$this->api->getDestinationURL(null,array($this->name=>'new')),$this->frame_options);
}
function setModel($a,$b=null){
if($this->form){
$m=$this->form->setModel($a,$b);
if(($id=$_GET[$this->name])!='new'){
$m->loadData($id);
}
if($this->form->isSubmitted()){
$this->form->update();
$this->form->js(null,$this->js()
->trigger('reload'))->univ()->closeDialog()->execute();
}
return $m;
}
$m=$this->grid->setModel($a,$c);
$this->grid->addColumn('button','detail');
if($id=@$_GET[$this->grid->name]){
$this->js()->univ()->frameURL('Ticket History',$this->api->getDestinationURL(
null,array($this->name=>$id)))->execute();
}
return $m;
}
}
我尝试将 CRUD 中对 frameURL 的调用更改为
$this->js()->univ()->page('ticketdtl',array($this->name=>$id));
和
$this->js()->univ()->location($this->api->getDestinationURL('tktdetail',array($this->name=>$id))
但是这些也不起作用,因为它仍然重定向到原始页面,所以我认为它必须是需要在某个地方覆盖的默认功能 - 只是不知道在哪里?
回到此处的agiletoolkit.org 页面并意识到将按钮添加到网格(B1 和B2)的演示也表现出相同的行为。