1

在我的站点中,我有一个页面旨在处理用于错误跟踪和功能请求的基本票证系统。我需要一个网格来显示当前打开的请求,并带有一个允许用户添加新请求的按钮。我还希望每一行都有一个名为“详细信息”的按钮,该按钮将打开一个新页面或弹出一个包含历史记录的框架(不介意哪个),例如日期、时间和错误/问题的任何评论、状态更新或评论和一个简单的表格,以允许用户添加新的回复。

到目前为止,我创建了一个添加 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)的演示也表现出相同的行为。

4

1 回答 1

1

Agile Toolkit Grid 中的按钮发送一个请求,请求一些 JavaScript 响应。当该响应到达时,它可以打开一个框架。因此,您需要执行两个请求而不是一个请求。

我在这里包含了一个工作示例:

http://agiletoolkit.org/codepad/gui/grid#GridButton

于 2012-08-05T22:44:26.523 回答