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

Qua*_*rys 2 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 ???
      ...
    
    Run Code Online (Sandbox Code Playgroud)
  • 在我的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();
    
    Run Code Online (Sandbox Code Playgroud)

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

非常感谢您的旅游回复.


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

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

以下是使用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`)
) 
Run Code Online (Sandbox Code Playgroud)

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

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

...
<table id='grid_chat'></table>
<div id='pager_chat'></div>
...
Run Code Online (Sandbox Code Playgroud)

在我的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');
…
Run Code Online (Sandbox Code Playgroud)

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

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

问候,

Qualliarys

Ole*_*leg 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
Run Code Online (Sandbox Code Playgroud)

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

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