私のサイトには、バグ追跡と機能要求のための基本的なチケットシステムを処理することを目的としたページがあります。ユーザーが新しいリクエストを追加できるボタンを使用して、現在開いているリクエストのグリッドを表示する必要があります。また、各行に「詳細」というボタンを付けて、新しいページを開くか、バグ/問題の日付、時刻、コメント、ステータスの更新などの履歴を含むフレームをポップアップ表示します(どちらでもかまいません)。またはコメントと、ユーザーが新しい応答を追加できるようにするための簡単なフォーム。
これまで、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エラーが発生します。
ページとエラーウィンドウにifthenelseを含めたところ、詳細ボタンが押された行のチケットIDである出力が正しく表示されます。後で他の詳細を追加できますが、フレームにロードするのではなく、新しいウィンドウでこれを開くのはなぜですか?
ボタンは通常編集または削除されるため、これがCRUDのデフォルト機能だと思いますが、これをオーバーライドするにはどうすればよいですか?
同じページではなく別のページを開きたい場合は、javascriptframeURL関数を使用してフレームを開く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)に追加されたデモでも同じ動作を示すことに気付きました。