【问题标题】:how to modify behaviour of MVCGrid buttons in CRUD in ATK4如何在 ATK4 中修改 CRUD 中 MVCGrid 按钮的行为
【发布时间】:2012-08-02 03:26:16
【问题描述】:

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

到目前为止,我创建了一个添加 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 页面here 并意识到将按钮添加到网格(B1 和B2)的演示也表现出相同的行为。

【问题讨论】:

  • 为什么有人-1没有任何解释?这是 ATK4 中任何人都可能想要的功能,正如我昨天在附录中指出的那样,atk4 演示页面也出现错误,因此可能是 ATK4 中的错误
  • 根据常见问题解答 - 最好的 stackoverflow 问题包括一些源代码并且针对特定的编程问题。以上不是一个开放式的讨论问题,那么为什么问题上的 -1 呢?
  • 我给 +1,我认为没有理由投反对票。也许是因为你忘记了标题末尾的问号。
  • 感谢 Romans - 谁给了 -1 一个没有解释的人对 stackoverflow 没有帮助,因为它没有向用户反馈原因。将来我会记住问号,因为标题可能会被误解为陈述,尽管它是一个问题。

标签: atk4 mvcgrid


【解决方案1】:

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

我在这里提供了一个工作示例:

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

【讨论】:

  • 我已经开始使用包含新版本 format_button 函数的新类来扩展 MVCGrid,但我确信会有更简单的方法。试试这个。谢谢
  • 虽然我添加了一个额外的东西,但它仍然有效。我的初始页面包含一个 CRUD。该对话框包含几个元素,包括另一个 CRUD 和几个视图。当我按照您的示例进行操作时,我在对话框中同时获得了原始 CRUD 和 $_GET['keyword'] 块的内容。通过在初始页面内容周围添加 if (!isset($_GET['keyword'] ,这可以按预期工作。
  • 这个例子并不理想,最好将用户发送到一个单独的页面,不需要任何关键字来检查。
  • 我让它与示例一起工作(两个进入页面并使用 FrameURL,但它确实变得混乱,因为我想在框架内有一个表单,因此有另一个 get 用于 isSubmitted。我尝试了另一种方法在第一页中使用 $_GET 来捕获按钮单击并使用第二页作为参数调用 getDestinationURL 但我再次收到 AJAXec 错误 - 所以您可以在 GRID 中发布一个自定义按钮的示例,该按钮重定向到不同的页面并传递按下的行的参数?TIA
  • Grid 也支持附加组件。我在键盘上又添加了一个示例,说明如何通过单线制作弹出窗口支持。请试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
相关资源
最近更新 更多