jqGrid:“All in One”方法宽度jqGridEdit类>如何设置复合主键?

时间:2010-06-17 16:00:03

标签: jqgrid

如何为“All in One”方法设置复合主键(JS文件中定义的网格,以及使用php文件中的jqGridEdit类的数据)? 对我来说,对于我来说,表T的复合主键是一个基本主键,它定义了一些属于该表T的字段!

这是我的测试,但我没有数据,也无法使用CRUD操作:

  • 在我的JS文件中,我有这行代码:

    ...
    colModel:[
       {name:"index",index:"index",label:"index"}, // <= THAT'S JUST THE INDEX OF MY TABLE         
       {name:"user",index:"user",label:"user",key:true}, // <= A PART OF MY COMPOSITE PRIMARY KEY
       {name:"pwd",index:"pwd",label:"pwd",key:true},    // <= A PART OF MY COMPOSITE PRIMARY KEY
       {name:"state",index:"state",label:"state",key:true}, // <= A PART OF MY COMPOSITE PRIMARY KEY
       ... <= AND SO ON
       url:"mygrid_crud.php",
       datatype:"json",
       jsonReader:{repeatitems:false},
       editurl: "mygrid_crud.php",
       prmNames:{"id":"index"} // <= WHAT I NEED TO WRITE HERE ???
      ...
    
  • 在我的php文件(mygrid_crud.php)中:

    ...
    $grid = new jqGridEdit($conn);
    $query = "SELECT * FROM mytable WHERE user='$user' and pwd='$pwd' and state='$state'..."; // <= SELECT * it's ok or i need to specify all fields i need ? 
    $grid->SelectCommand = $query;
    $grid->dataType = "json";
    $grid->table = 'mytable';
    $grid->setPrimaryKeyId('index'); // <= WHAT I NEED TO WRITE HERE ???
    ...
    $grid->editGrid();
    

请告诉我有什么问题,以及如何在这种方法中设置复合主键!?

非常感谢您的巡回回复。


所以,这是我经过大量努力后获得的解决方案;-(

这可能不是最佳解决方案,但添加,编辑和戴尔操作运行良好!!!

以下是具有COMPOSITE PRIMARY KEY的表定义示例:

CREATE TABLE `chat` (
  `number` int(11) NOT NULL AUTO_INCREMENT,

  `user` varchar(30) NOT NULL,
  `pwd` varchar(100) NOT NULL,
  `subject` varchar(100) NOT NULL,
  `time` datetime NOT NULL,
  `recipient` varchar(100) NOT NULL,

  `message` varchar(1000) DEFAULT NULL,

  PRIMARY KEY (`user`, `pwd`, `subject`, `time`, `recipient`),
  UNIQUE KEY `number` (`number`)
) 

所以要用网格来管理这样的表,我这样做。

在我的HTML文件中,我有以下代码行:

...
<table id='grid_chat'></table>
<div id='pager_chat'></div>
...

在我的PHP文件中,我有这行代码:

 ...
$grid = new jqGridRender($conn);
…
if($oper=="edit"){…}
elseif($oper=="del"){…}
…
$grid->setPrimaryKeyId('number');
…
// here i get the primary key for the new message i want to add 
$chat = $_SESSION["chat"];
$user = $chat["user"];
$pwd = $chat["pwd"];
$subject = $chat["subject"];
…
$query = "SELECT * FROM chat WHERE user='$user' and pwd='$pwd' and subject='$subject'...”;
$grid->SelectCommand = $query;
…
// for the UNIQUE KEY (used for edit and dell operations)
$grid->setColProperty("number", array("hidden"=>true)); 

// for the COMPOSITE PRIMARY KEY (used for add operation)
$grid->setColProperty("user", array("hidden"=>true,"editoptions"=>array("value"=> $user),"editrules"=>array("required"=>true)));
$grid->setColProperty("pwd", array("hidden"=>true,"editoptions"=>array("value"=> $pwd),"editrules"=>array("required"=>true)));
$grid->setColProperty("subject", array("hidden"=>true,"editoptions"=>array("value"=> $subject),"editrules"=>array("required"=>true)));
$grid->setColProperty("time", array("hidden"=>true,"editoptions"=>array("value"=> $time),"editrules"=>array("required"=>true)));
$grid->setColProperty("recipient", array("hidden"=>true,"editoptions"=>array("value"=> $recipient),"editrules"=>array("required"=>true)));

// for the message
$grid->setColProperty("message", array("classes"=>"multiligne","label"=>"Message","width"=>400,"edittype"=>"textarea","editrules"=>array("required"=>true)));

// Set a new user datetime format using PHP convensions (for the php time variable)
$grid->setUserTime('Y-m-d H:i:s');
…

这不是“一体化”的方法,但效果很好!!

如果有人看到要优化的内容,请告诉我!!!

此致

Qualliarys

2 个答案:

答案 0 :(得分:7)

首先,你发布的colModel定义有些奇怪。例如,像colModel":[这样的文本肯定是错误的。如果代码中包含很多错误(可能是格式错误,但读者不知道您的原始代码),很难说出代码。如果您在格式化数据时遇到问题,只需发布​​您拥有的内容,其他人就可以重新格式化您的问题。

现在谈谈你的主要问题。在一行中使用key:true是错误的方法。在http://www.trirand.com/jqgridwiki/doku.php?id=wiki:colmodel_options上,您可以在以下key参数的说明中找到:

  

如果服务器没有id,   这个可以设置为id   唯一的行ID。只有一列可以   有这个属性。如果有更多   网格找到第一个键而不是一个键   一,二被忽略。

jqGrid需要有一个id来区分一行网格和另一行网格。你可以用任何id,如1,2,3等填充jqGrid,这不是你真正的id。如果所有具有组成复合主键的信息的columnt在editable:true中都有选项colModel,那么这些列中的值将在所有编辑操作中发送到服务器,您将能够构建相应的mygrid_crud.php文件中的SELECT语句。

如果您不想显示仅需要构建复合键的某些列,可以使用colModel

中的选项后的这些列
hidden: true, editable: true, editrules: { edithidden: false }, hidedlg: true

它会使列对用户不可见,但数据将在所有编辑操作中发送到服务器。

最后还有一个小小的评论。不要在中设置默认值。例如,{name:"index", index:"index", label:"index"}所有三个字段都相同。因此,您可以将所有内容减少到{name:"index"}

答案 1 :(得分:1)

也遇到了这个问题,并且有一个别人可能觉得有用的不同解决方案。

我真的不想为jqGrid更改我的表结构,所以我创建了一个复合键。

我的数据的主键是整数和日期的组合(它是每月销售目标的表格,因此日期有很大的分离)。我所做的是为json响应创建一个ID,它是两个部分的组合:

$response->rows[$line]['id'] = $id . "*" . $date;

然后,当编辑后的数据从jqGrid发回到页面时,传回的id确实类似于“79 * 2014-03-01”,这很容易拆分回访问数据以进行更新所需的部分