пятница, 5 декабря 2008 г.

Учебник: Grid PHP SQL Часть 6

Удаление записи

В предыдущих частях мы создали редактируемую таблицу с функцией добавления записей в нее. Давайте подумаем. Мы еще многое не реализовали, но уже написали пару сотен строк кода...
Это показывает насколько важно структурировать код. Есть множество топиков на форумах и учебников как правильно писать Ext код. Убедитесь, что используете Firefox и отладчик (Firebug) и проверяйте результаты в IE. Вы можете проверять ваши .js файлы с помощью JSLint чтобы убедится в их корректности. Очень легко потеряться в Ext коде, так как большинство структур построено в Json формате. Правильно расставляйте отступы. Если вам еще не понятно, посмотрите ЧАВО от Mickael's по таблицам.

Эта часть учебника научит нас удалять записи из таблицы. Это будет очень просто. Мы просто выбираем ряд таблицы и нажимаем кнопку Delete (Удалить), Ajax запрос посылается и трансформируется в SQL запрос, как мы делали в других случаях. Вы просто можете попробовать сделать это и посмотреть как это легко.

А что делать если мы хотим удалить несколько рядов. Как это сделать?? Вы можете выбирать носколько рядов с помощью CTRL или SHIFT.. Видите? Чтобы удалить все эти ряды мы должны их все обработать и мы это сделаем с помощью цикла и создадим массив который будет содержать все идентификаторы IDPresidents для каждого ряда. Затем мы просто перекодируем массив и отошлем его на сервер как параметр.

Давайте посмотрим, как это сделать:
  var selections = PresidentListingEditorGrid.selModel.getSelections();
var prez = [];
for(i = 0; i< PresidentListingEditorGrid.selModel.getCount(); i++){
prez.push(selections[i].json.IDpresident);
}
var encoded_array = Ext.encode(prez);

Как вы можете видеть этот код достаточно прямолинейный. Давайте внедрим его в наш скрипт.
Во-первых давайте добавим кнопку удаления на панель инструментов (мы также добавили CSS код), вот так:
  tbar: [
{
text: 'Add a President',
tooltip: 'Great tooltips...',
iconCls:'add', // reference to our css
handler: displayFormWindow
}, '-', {
text: 'Delete selection',
tooltip: 'Jose, can you seeeee??',
handler: confirmDeletePresidents, // Confirm before deleting
iconCls:'remove'
}]

Так как люди, которые будут использовать ваши приложения не всегда сообразительны (я не исключение) и могут просто нажать кнопку удаления случайно, нам нужно спросить подтверждение для удаления с помощью функции:
  function confirmDeletePresidents(){
if(PresidentListingEditorGrid.selModel.getCount() == 1) // only one president is selected here
{
Ext.MessageBox.confirm('Confirmation','Do you not like that president at all?', deletePresidents);
} else if(PresidentListingEditorGrid.selModel.getCount() > 1){
Ext.MessageBox.confirm('Confirmation','Delete those presidents?', deletePresidents);
} else {
Ext.MessageBox.alert('Uh oh...','You can\'t really delete something you haven\'t selected huh?');
}
}


Полная функция удаления

Итак, что мы имеем:
  function deletePresidents(btn){
if(btn=='yes'){
var selections = PresidentListingEditorGrid.selModel.getSelections();
var prez = [];
for(i = 0; i< PresidentListingEditorGrid.selModel.getCount(); i++){
prez.push(selections[i].json.IDpresident);
}
var encoded_array = Ext.encode(prez);
Ext.Ajax.request({
waitMsg: 'Please Wait',
url: 'database.php',
params: {
task: "DELETEPRES",
ids: encoded_array
},
success: function(response){
var result=eval(response.responseText);
switch(result){
case 1: // Success : simply reload
PresidentsDataStore.reload();
break;
default:
Ext.MessageBox.alert('Warning','Could not delete the entire selection.');
break;
}
},
failure: function(response){
var result=response.responseText;
Ext.MessageBox.alert('error','could not connect to the database. retry later');
}
});
}
}


Теперь подкорректируем серверный скрипт database.php:

Наши варианты выбора пополнятся:
    case "DELETEPRES":
deletePresidents();
break;

А теперь нам нужно реализовать функцию deletePresidents(). Эта небольшая часть, которая строит запрос взависимости от выбора. На не нужно делать столько же запросов, сколько нам нужно удалить записей. Мы должны сделать все удаления в одном запросе. (Firebug очень здесь поможет) В любом случаем запрос создается следующей функцией:
function deletePresidents(){
$ids = $_POST['ids']; // Get our array back and translate it :
if (version_compare(PHP_VERSION,"5.2","<")) {
require_once("./JSON.php");
$json = new Services_JSON();
$idpres = $json->decode(stripslashes($ids));
} else {
$idpres = json_decode(stripslashes($ids));
}

// You could do some checkups here and return '0' or other error consts.

// Make a single query to delete all of the presidents at the same time :
if(sizeof($idpres)<1){
echo '0';
} else if (sizeof($idpres) == 1){
$query = "DELETE FROM presidents WHERE IDpresident = ".$idpres[0];
mysql_query($query);
} else {
$query = "DELETE FROM presidents WHERE ";
for($i = 0; $i < sizeof($idpres); $i++){
$query = $query . "IDpresident = ".$idpres[$i];
if($i<sizeof($idpres)-1){
$query = $query . " OR ";
}
}
mysql_query($query);
}
// echo $query; This helps me find out what the heck is going on in Firebug...
echo '1';
}


Что надо запомнить из этой части:
SelectionModels
Firebug сохранит много вашего времени

Файлы этой части вы найдете здесь

Источник: http://extjs.com/learn/w/index.php?title=Tutorial:Grid_PHP_SQL_Part6

Комментариев нет:

Отправить комментарий