jqGrid: ширина подхода «все в одном» jqGridEdit Class> как установить составной первичный ключ? - PullRequest
2 голосов
/ 17 июня 2010

Как установить составной первичный ключ для подхода «все в одном» (сетка, определенная в файле JS, и данные, использующие класс jqGridEdit в файле php)?Пожалуйста, для меня составной первичный ключ таблицы 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();
    

Пожалуйста, скажите мне, что не так, и как сделать, чтобы установить составной первичный ключ в этом подходе!?

Большое спасибо за турответы.


Итак, вот решение, которое я получаю после многих усилий ;-(

Возможно, это не оптимальное решение, но операции добавления, редактирования и dell работают хорошо!!!

Вот пример определения таблицы с КОМПОЗИТНЫМ ПЕРВИЧНЫМ КЛЮЧОМ:

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 ]

7 голосов
/ 17 июня 2010

Прежде всего, это нечто странное в определении colModel, которое вы публикуете. Например, текст, такой как colModel":[, определенно неверен. Трудно что-то сказать о коде, если он содержит много ошибок (возможно, ошибок форматирования, но читатель не знает ваш исходный код). Если у вас есть проблемы с форматированием данных, просто опубликуйте их, и другие люди смогут переформатировать ваш вопрос.

Теперь о вашем главном вопросе. Использование key:true в более как один ряд является неправильным способом. На http://www.trirand.com/jqgridwiki/doku.php?id=wiki:colmodel_options вы можете найти в описании параметра key следующий параметр:

В случае отсутствия идентификатора с сервера, это может быть установлено как идентификатор для уникальный идентификатор строки Только один столбец может иметь это свойство. Если есть еще чем один ключ сетка находит первый один и второй игнорируются.

jqGrid нужен идентификатор, чтобы отличать один ряд сетки от другого. Вы можете заполнить jqGrid любыми идентификаторами, такими как 1,2,3 и т. Д., Которые не являются вашими реальными идентификаторами. Если все столбцы, которые имеют информацию, составляющую составной первичный ключ, имеют параметр editable:true в colModel, то значения из этих столбцов будут отправляться на сервер при всех операциях редактирования, и вы сможете создать соответствующий оператор SELECT в своем файл mygrid_crud.php.

Если вы не хотите отображать некоторые столбцы, которые нужны только для создания составного ключа, вы можете использовать для этих столбцов следующие параметры в colModel

hidden: true, editable: true, editrules: { edithidden: false }, hidedlg: true

Это сделает столбцы невидимыми для пользователя, но данные будут отправлены на сервер при всех операциях редактирования.

Еще одно небольшое замечание и конец. Не устанавливайте значения по умолчанию в. Например, {name:"index", index:"index", label:"index"} имеет все три одинаковых поля. Таким образом, вы можете уменьшить все до {name:"index"}

1 голос
/ 14 мая 2014

Просто столкнулся с этой проблемой и нашел другое решение, которое может оказаться полезным.

Я действительно не хотел менять структуру таблицы для jqGrid, поэтому вместо этого я создал составной ключ..

Первичным ключом моих данных был состав из целого числа и даты (это таблица месячных планов продаж, поэтому даты имели широкое разделение).Я разработал идентификатор для ответа json, который представлял собой комбинацию двух частей:

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

Затем, когда отредактированные данные отправляются обратно из jqGrid на страницу, переданный идентификатор действительно является«79 * 2014-03-01», который легко разбить на части, необходимые для доступа к данным для обновления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...