perl - 如何将附加参数 POST 到 editurl?

标签 perl jqgrid catalyst

我花了几个小时查看示例和文档,试图弄清楚如何将附加参数发布到 editurl,但尚未弄清楚。我正在使用 Perl Catalyst。

虽然我没有将所有内容都编码在 Controller 中,但我得到了添加和编辑所需的 POSTed 内容,但没有删除记录。我需要将 inv_id POST 到服务器,以便我的 Controller 删除记录。

Controller /Root.pm:

package MyFirstGrid::Controller::Root;
use Moose;
use namespace::autoclean;

BEGIN {extends 'Catalyst::Controller'}
with 'Catalyst::TraitFor::Controller::jQuery::jqGrid';

__PACKAGE__->config(namespace => '');

sub index :Path :Args(0) {
  my ($self, $c) = @_;

  $c->detach($c->view("TT"));
}

sub getdata :Local {
  my ($self, $c) = @_;

  my $inv_rs = $c->model('DB::Inventory')->search({});
  $inv_rs = $self->jqgrid_page($c, $inv_rs);
  my @row_data;
  while (my $inv = $inv_rs->next) {
    my $single_row = {
      cell => [
        $inv->inv_id,
        $inv->client_id,
        $inv->amount,
        $inv->tax,
        $inv->total,
        $inv->note,
      ],
    };
    push @row_data, $single_row;
  }
  $c->stash->{json_data}{rows} = \@row_data;
  $c->detach($c->view("JSON")); 
}

sub postrow :Local {
  my ($self, $c) = @_;

  my $data = $c->req->params;
  my $inv_rs = $c->model('DB::Inventory')->search({inv_id => $data->{inv_id}});
  $inv_rs->update({
    client_id => $data->{client_id},
    amount => $data->{amount},
    tax => $data->{tax}, 
    total => $data->{total}, 
    note => $data->{note}, 
  });
  $c->res->status(204); 
}

sub default :Path {
  my ($self, $c) = @_;

  $c->response->body('Page not found');
  $c->response->status(404);
}

sub end : ActionClass('RenderView') {}

__PACKAGE__->meta->make_immutable;

1; 

索引.tt:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>My First Grid</title>

<link rel="stylesheet" type="text/css" media="screen" href="[% c.uri_for('/static/css/cupertino/jquery-ui-1.8.22.custom.css') %]" />
<link rel="stylesheet" type="text/css" media="screen" href="[% c.uri_for('/static/css/ui.jqgrid.css') %]" />

<style type="text/css">
html, body {
  margin: 0;
  padding: 0;
  font-size: 75%;
}
</style>

<script src="[% c.uri_for('/static/js/jquery-1.7.2.min.js') %]" type="text/javascript"></script>
<script src="[% c.uri_for('/static/js/i18n/grid.locale-en.js') %]" type="text/javascript"></script>
<script src="[% c.uri_for('/static/js/jquery.jqGrid.min.js') %]" type="text/javascript"></script>

<script type="text/javascript">
$(function(){ 
  $("#list").jqGrid({
    url: "[% c.uri_for("getdata") %]",
    datatype: 'json',
    mtype: 'GET',
    colNames:['Inv No', 'Client ID', 'Amount','Tax','Total','Notes'],
    colModel :[ 
      //{name:'inv_id', index:'inv_id', editable:true, hidden:true, editrules:{edithidden:false}, hidedlg:true}, 
      {name:'inv_id', index:'inv_id', editable:true, hidden:true}, 
      {name:'client_id', index:'client_id', width:55, editable:true, editoptions:{size:10}},
      {name:'amount', index:'amount', width:80, align:'right', editable:true, editoptions:{size:10}}, 
      {name:'tax', index:'tax', width:80, align:'right', editable:true, editoptions:{size:10}}, 
      {name:'total', index:'total', width:80, align:'right', editable:true, editoptions:{size:10}}, 
      {name:'note', index:'note', width:150, sortable:false, editable: true, edittype:"textarea", editoptions:{rows:"2",cols:"20"}} 
    ],
    pager: '#pager',
    rowNum:10,
    rowList:[10,20,30],
    sortname: 'inv_id',
    sortorder: 'desc',
    viewrecords: true,
    caption: 'My First Grid: Navigator',
    editurl: "[% c.uri_for("postrow") %]",
    height: 240
  }); 

  jQuery("#list").jqGrid('navGrid','#pager',
    {}, //options
    {height:280,reloadAfterSubmit:false}, // edit options
    {height:280,reloadAfterSubmit:false}, // add options
    {reloadAfterSubmit:false}, // del options 
    {} // search options
  ); 

}); 
</script>
</head>

<body>
<table id="list"><tr><td/></tr></table> 
<div id="pager"></div> 
</body>
</html>

最佳答案

我认为您遇到的问题的根源在于网格的填充。在填充网格期间,所有网格的行( <tr> 元素)都会获得 id属性。在编辑和删除行期间 id 的值相应行的属性将始终发送到服务器。重要的是要知道 id 的值属性在页面上必须是唯一的。如果 inv_id 的值是唯一的,您可以直接使用此值作为 id 。要通知 jqGrid 有关选择,您可以添加 jsonReader: {id: "inv_id"}作为附加网格参数或仅添加 key: true属性定义为 inv_id专栏。

我自己不使用 Perl Catalyst,但填充网格数据的部分(参见 my $single_row = { cell => [...]} )在我看来应该包含 idcell 之外的属性(property)属性(类似于 $single_row = {cell => [...], id => $inv->inv_id} )。如果inv_id是唯一的,最好添加 key: trueinv_id 的定义专栏,您的问题就已经解决了。

如果您已经使用 id 的另一个值并且您确实需要同时拥有这两个值: idinv_id那么你可以使用例如 onclickSubmit删除选项的回调。

onclickSubmit: function (options, rowid) {
    return {inv_id: $(this).jqGrid("getCell", rowid, "inv_id")};
}

我的意思是使用以下内容

$("#list").jqGrid('navGrid', '#pager', {}, //options
    {height: 280, reloadAfterSubmit: false}, // edit options
    {height: 280, reloadAfterSubmit: false}, // add options
    { // del options
        reloadAfterSubmit: false,
        onclickSubmit: function (options, rowid) {
            return {inv_id: $(this).jqGrid("getCell", rowid, "inv_id")};
        }
    }
); 

因此,在删除操作期间发布到服务器的数据将使用附加参数 inv_id 进行扩展。 .

关于perl - 如何将附加参数 POST 到 editurl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12340636/

相关文章:

javascript - 在 jqGrid ColumnChooser 上添加删除列处理程序

jquery - Free-jqGrid navButtonAdd buttonColor

perl - Catalyst Template::Toolkit 渲染输出

regex - 报价 - 捕获 - 问题

git - 如何在存储库历史记录中的每个 git 提交中查找字数?

Perl 一行 if 语句

perl - :Args and :CaptureArgs in Catalyst?和有什么不一样

perl - 调用子程序 "$module =>"时 "not_in_file_ok"代表什么

javascript - 如何在js中使用javascript中的外部值创建循环中的对象?

perl - 为什么我的 perl Catalyst redirect_and_detach 替换插件方法失败?