Как стать автором
Обновить

ExtJS и PHP в примере

Время на прочтение21 мин
Количество просмотров3K
Добрый день,

Когда я начинал писать на ExtJS, именно примеров с PHP кодом в интернете не хватало, статьи были, но все они сводились к тому, что был код ExtJS (переводы книг) без PHP. Поэтому я и решил написать эту статью.

Для начала, несколько советов начинающим ExtJSникам:
В первых: Не знаете JavaScript? не поленитесь прочитать книгу по JS.
Во вторых: Зайдите на www.extjs.com там много хороших примеров ExtJS с PHP.
И в третьих: Пользуйтесь docs и examples из библиотеки ExtJS.

Теперь собственно к примеру. Напишем маленькую программу для занесения в БД документов накладных. Накладная будет состоять из номера, даты, поля продавец (выборка из БД), поля покупатель (выборка из БД), таблицы товаров накладной и таблицы существующих у нас товаров (из БД). Кнопкой «Cохранить» накладная будет отправляется в БД.
Этого примера хватит для того, чтобы понять основу взаимодействия ExtJS и PHP. И так приступим, наша форма будет выглядеть так:

image

Для начала создадим следующую структуру каталогов и файлов:

image

ext — библиотека ExtJS
index.php — без комментариев :)
app.js — сама программа

Также у нас будут ещё файлы:

config.php — подключение к БД
get_org.php — получение списка организаций из БД в JSON формате
get_tovar.php — получение списка товаров из БД в JSON формате
save.php — cохранение формы в БД

Код index.php:
  1. <html>
  2. <head>
  3. <title>ExtJS и PHP</title>
  4. <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
  5.  
  6. <link rel="stylesheet" type="text/css" href="lib/ext/resources/css/ext-all.css"/>
  7.  
  8. <script type="text/javascript" src="lib/ext/adapter/ext/ext-base.js"></script>
  9. <script type="text/javascript" src="lib/ext/ext-all.js"></script>
  10. <script type="text/javascript" src="app.js"></script>
  11. <style type="text/css">
  12. .movie_form {
  13.   padding: 10px;
  14. }
  15. .movie-item {
  16.   font:normal 12px tahoma, arial, helvetica, sans-serif;
  17.   line-height:150%;
  18.   padding:5px 20px 5px 10px;
  19.   border:1px solid #fff;
  20.   border-bottom:1px solid #eeeeee;
  21.   white-space:normal;
  22.   color:#555;
  23. }
  24. .movie-item h2 {
  25.   display:block;
  26.   font:inherit;
  27.   font-weight:bold;
  28.   color:#336699;
  29. }
  30. .movie-item h2 span {
  31.   float: right;
  32.   font-weight:normal;
  33.   color:#555;
  34.   margin:0 0 5px 5px;
  35.   width:100px;
  36.   display:block;
  37.   clear:none;
  38. }
  39. </style>
  40. <script type="text/javascript" src="ext-lang-ru.js"></script>
  41. </head>
  42. <body>
  43.   <div>
  44.   <div class="movie_form" id="form"></div>
  45.   </div>
  46. </body>
  47. </html>
* This source code was highlighted with Source Code Highlighter.


Код app.js:
  1. Ext.BLANK_IMAGE_URL = 'lib/ext/resources/images/default/s.gif';
  2. Ext.QuickTips.init();
* This source code was highlighted with Source Code Highlighter.

Втавляем в самом начале.
  1.   // Шаблон для КомбаБокса
  2.   var _combo_tpl = new Ext.XTemplate(
  3.     '<tpl for=\".\"><div class=\"movie-item\">',
  4.       '<h2><span>ИД: {id_org}</span>{name}</h2>',
  5.       'ИНН: {inn}',
  6.     '</div></tpl>'
  7.   );
* This source code was highlighted with Source Code Highlighter.

Шаблон для отображения выпадающего списка.

image
  1.   // Хранилище списка Организаций
  2.   var _store_saller = new Ext.data.Store({
  3.     reader: new Ext.data.JsonReader({root : 'rows', id : 'id_org', fields : ['id_org', 'name', 'inn']}),
  4.     proxy: new Ext.data.HttpProxy({url : 'get_org.php'})
  5.   });
* This source code was highlighted with Source Code Highlighter.

Хранилище данных для списка организаций, данные получаем из БД через скрипт get_org.php, скрипт возвращает нам JSON ответ. Пример скрипта будет приведен ниже.
  1.   // КомбоБокс поля Продавец
  2.   var _combo_saller = {
  3.     xtype: 'combo', name : 'prod', fieldLabel: 'Продавец', store: _store_saller, anchor: '100%', emptyText: 'Выберите ...',
  4.     valueField: 'id_org', displayField: 'name', mode : 'remote', triggerAction: 'all',
  5.     tpl: _combo_tpl, itemSelector: 'div.movie-item', minChars : 2
  6.   }
  7.   // КомбоБокс поля Покупатель
  8.   var _combo_bayer = {
  9.     xtype: 'combo', name : 'pok', fieldLabel: 'Покупатель', store: _store_saller, anchor: '100%', emptyText: 'Выберите ...',
  10.     valueField: 'id_org', displayField: 'name', mode : 'remote', triggerAction: 'all',
  11.     tpl: _combo_tpl, itemSelector: 'div.movie-item', minChars : 2
  12.   }
* This source code was highlighted with Source Code Highlighter.

Комбобоксы для списка продавец и покупатель. tpl: _combo_tpl — тут используем ранее подготовленный шаблон.
  1.   // Хранилище для списка Товара текущего документа
  2.   var _store_tovar = new Ext.data.JsonStore({
  3.     root    : 'tovar',
  4.     fields    : [
  5.       {name: 'id', type: 'float'},
  6.       {name: 'name'},
  7.       {name: 'col', type: 'float'},
  8.       {name: 'price', type: 'float'}
  9.     ]
  10.   });
  11.   // Хранилище для списка всех Товаров
  12.   var _store_tovar_all = new Ext.data.JsonStore({
  13.     url    : 'get_tovar.php',
  14.     root    : 'tovar',
  15.     fields    : [
  16.       {name: 'id', type: 'float'},
  17.       {name: 'name'},
  18.       {name: 'col', type: 'float'},
  19.       {name: 'price', type: 'float'}
  20.     ],
  21.     autoLoad   : true
  22.   });
* This source code was highlighted with Source Code Highlighter.

Хранилище для списка всех Товаров (_store_tovar_all) получает данные из БД через скрипт get_tovar.php, скрипт возвращает JSON. Параметр type: 'float' больше тут нужен для правльной сортировки данных в гриде.
  1.   // Поля для грида _grid_tovar
  2.   var _grid_columns = [
  3.     { header: "ИД", width: 30, dataIndex: 'id', sortable: true, hidden:true },
  4.     { id: 'title', header: "Наименование", width: 180, dataIndex: 'name', sortable: true },
  5.     { header: "Количество", width: 85, dataIndex: 'col',   sortable: true },
  6.     { header: "Цена", width: 85, dataIndex: 'price', sortable: true, align: 'center' }
  7.   ]
  8.   // Поля для грида _grid_tovar_all
  9.   var _grid_columns_all = [
  10.     { header: "ИД", width: 30, dataIndex: 'id', sortable: true, hidden:true },
  11.     { id: 'title', header: "Наименование", width: 180, dataIndex: 'name', sortable: true },
  12.     { header: "Количество", width: 85, dataIndex: 'col', sortable: true },
  13.     { header: "Цена", width: 85, dataIndex: 'price', sortable: true, align: 'center' }
  14.   ]
* This source code was highlighted with Source Code Highlighter.

Поля, которые будут использоваться в гридах.
  1.   // Грид списка Товаров текущего документа
  2.   var _grid_tovar = new Ext.grid.GridPanel({
  3.     store      : _store_tovar, //Хранилище
  4.     enableDragDrop    : true,
  5.     ddGroup      : '_grid_tovar_DDGroup',
  6.     columns      : _grid_columns,
  7.     stripeRows    : true,
  8.     autoExpandColumn  : 'title',
  9.     frame      : true,
  10.     height      : 200,
  11.     loadMask    : true,
  12.     columnLines    : true,
  13.     clicksToEdit    : 1,
  14.     //border: false,
  15.     tbar: {
  16.       items: [
  17.         {
  18.           text: 'Отчистить',
  19.           handler: function() {
  20.             _grid_tovar.getView().refresh();
  21.             _grid_tovar_all.getView().refresh();
  22.             _grid_tovar.store.removeAll();
  23.           }
  24.         },{
  25.           text: 'Удалить позицию',
  26.           handler: function() {
  27.             var s = _grid_tovar.getSelectionModel().getSelections();
  28.             for(var i = 0, r; r = s[i]; i++){
  29.               _grid_tovar.store.remove(r);
  30.             }
  31.           }
  32.         }
  33.       ]
  34.     }
  35.   });
* This source code was highlighted with Source Code Highlighter.

Грид списка товаров документа, с кнопкой отчистки грида и удаления выделенной позиции.
  1.   // Грид списка всех Товаров
  2.   var _grid_tovar_all = new Ext.grid.GridPanel({
  3.     store      : _store_tovar_all,
  4.     enableDragDrop    : true,
  5.     ddGroup      : '_grid_tovar_all_DDGroup',
  6.     columns      : _grid_columns_all,
  7.     stripeRows    : true,
  8.     autoExpandColumn  : 'title',
  9.     frame      : true,
  10.     height      : 200,
  11.     loadMask    : true,
  12.     columnLines    : true,
  13.     listeners: {
  14.       rowdblclick: function(_grid_tovar_all, row, e) {
  15.         var record_all = _grid_tovar_all.getStore().getAt(row);
  16.         var rec = record_all.copy();
  17.         var _button = new Ext.Button({
  18.           text : 'Сохранить',
  19.           handler : function(){
  20.             rec.data['col'] = _panel.getForm().findField('fcol').getValue(true);
  21.             rec.data['price'] = _panel.getForm().findField('fprice').getValue(true);
  22.             _grid_tovar.store.insert(0, rec);
  23.             _grid_tovar.getView().refresh();
  24.             _win.close();
  25.           }
  26.         })
  27.         var _panel = new Ext.FormPanel({
  28.           border: false, frame: true,
  29.           items: [
  30.             {xtype: 'textfield', name: 'fcol', fieldLabel: 'Количество', value: '1'},// selectOnFocus: true},
  31.             {xtype: 'textfield', name: 'fprice', fieldLabel: 'Цена', value: rec.get('price')}//, selectOnFocus: true}
  32.           ]
  33.         })
  34.         var _win = new Ext.Window({
  35.           title: rec.get('name'),
  36.           border: false, resizable: false, width: 270,
  37.           items: [_panel],
  38.           buttons: [_button],
  39.           keys: [{
  40.             key: 13, // Enter key
  41.             handler: function(){
  42.               _button.focus();
  43.             }
  44.           }],
  45.           listeners: {
  46.             activate: function() {
  47.               _panel.getForm().findField('fcol').focus(true,250);
  48.             }
  49.           }
  50.         }).show();
  51.       }
  52.     },
  53.     keys: [
  54.         {
  55.           key: 27, // Esc key
  56.           handler: function(){
  57.             alert('Esc');
  58.           }
  59.         },{
  60.           key: 13, // Enter key
  61.           handler: function(){
  62.             alert('Enter');
  63.           }
  64.         }
  65.     ]
  66.   });
* This source code was highlighted with Source Code Highlighter.

Грид списка всех Товаров. rowdblclick — это событие двойного нажатия на гриде. При нажатии открывается окно (_win) для ввода количества товара и цены. После нажатия в окне кнопки «Сохранить» или ENTER'а уже скорректированные данные попадают в грид списка товаров документа. keys — приведен здесь в качестве примера работы в гриде клавишами. key: 13, // Enter key в хандлере можно прописать событие для кнопки ENTER такие же как и при двойном клике на гриде.
  1.   Ext.onReady(function(){
* This source code was highlighted with Source Code Highlighter.

Начинаем генерацию формы.
  1.   // Основня форма документа
  2.   var _form_sf = new Ext.FormPanel({
  3.     id: 'id_form_sf',
  4.     url     : 'save.php',
  5.     renderTo   : 'form',
  6.     frame     : true,
  7.     title     : 'Счет-Фактура',
  8.     width     : 600,
  9.     items : [
  10.       {  
  11.         layout:'column',
  12.           items:[
  13.             {
  14.               columnWidth:.6,
  15.               layout: 'form',
  16.               items: [{xtype : 'textfield', id: 'track-tip-num', name : 'title', fieldLabel : 'Номер', anchor : '95%'}]
  17.             },{
  18.               columnWidth:.4,
  19.               layout: 'form',
  20.               labelWidth: 40,
  21.               items: [{xtype : 'datefield', id: 'track-tip-data', name : 'date', fieldLabel : 'Дата', anchor : '100%'}]
  22.             }
  23.           ]
  24.       },
  25.       _combo_saller,
  26.       _combo_bayer,
  27.       _grid_tovar,
  28.       _grid_tovar_all
  29.     ],
  30.     buttons : [
  31.       {
  32.         text : 'Сохранить',
  33.         handler : function(){
  34.         
  35.           var modifiedRecords = _grid_tovar.store.getRange();
  36.           if (modifiedRecords.length > 0) {
  37.             var jsonData="[";
  38.             jsonData += Ext.util.JSON.encode(modifiedRecords[0].data);
  39.             for(var cnt = 1; cnt < modifiedRecords.length; cnt++){
  40.               var record = modifiedRecords[cnt];
  41.               jsonData += ',' + Ext.util.JSON.encode(record.data);
  42.               }
  43.             jsonData = jsonData.substring(0,jsonData.length) + "]";
  44.           };
  45.           
  46.           _form_sf.getForm().submit({
  47.             //waitMsg : 'Передача данных...',
  48.             params: {
  49.               prod_id: _form_sf.getForm().findField('prod').getValue(true),
  50.               pok_id: _form_sf.getForm().findField('pok').getValue(true),
  51.               data: jsonData
  52.             },
  53.             success : function(f,a){
  54.               Ext.Msg.alert('Готово', a.result.truemsg);
  55.             },
  56.             failure : function(f,a){
  57.               Ext.Msg.alert('Ошибка', a.result.errormsg);
  58.             }
  59.           })
  60.         }
  61.       },{
  62.         text : 'Отчистить',
  63.         handler : function(){
  64.           _form_sf.getForm().reset();
  65.           _grid_tovar.store.removeAll();
  66.         }
  67.       }
  68.     ]
  69.   });
* This source code was highlighted with Source Code Highlighter.

Тут основная форма документа. save.php — это скрипт для сохранения данных. _combo_saller, _combo_bayer, _grid_tovar, _grid_tovar_all — это ранее нами подготовленные данные. При нажатии на кнопку «Сохранить» из грида товаров документа формируется переменная jsonData которая содержит грид товаров документа в JSON формате. Далее в скрипт save.php подготавливаются и передаются параметры (params:), которые не передаются по умолчанию формой. Параметры prod_id, pok_id и data. Дело в том что, из комбобоксов по умолчанию формой передается отображаемые данные, конкретно название организаций (displayField: 'name'), а нам нужны значения ИД (valueField: 'id_org'), вот мы получаем и передаем их отдельно (prod_id: _form_sf.getForm().findField('prod').getValue(true) и тд.). После скрипт save.php обрабатывает и нам возвращает ответ в котором передает нам информацию о том успешно (success:) прошло сохранение или нет (failure:), также скрипт может вернуть ошибки в конкретные поля формы. Пример save.php будет приведен ниже.
  1.   // Конфигурация Drag and Drop для _grid_tovar
  2.   var firstGridDropTargetEl = _grid_tovar.getView().scroller.dom;
  3.   var firstGridDropTarget = new Ext.dd.DropTarget(firstGridDropTargetEl, {
  4.       ddGroup  : '_grid_tovar_all_DDGroup',
  5.       notifyDrop : function(ddSource, e, data){
  6.           var records = ddSource.dragData.selections;
  7.           _grid_tovar.store.insert(0, records);
  8.           _grid_tovar.getView().refresh();
  9.           return true
  10.       }
  11.   });
  12.   // Конфигурация Drag and Drop для _grid_tovar_all
  13.   var secondGridDropTargetEl = _grid_tovar_all.getView().scroller.dom;
  14.   var secondGridDropTarget = new Ext.dd.DropTarget(secondGridDropTargetEl, {
  15.       ddGroup  : '_grid_tovar_DDGroup',
  16.       notifyDrop : function(ddSource, e, data){
  17.           var records = ddSource.dragData.selections;
  18.           Ext.each(records, ddSource.grid.store.remove, ddSource.grid.store);
  19.           _grid_tovar_all.getView().refresh();
  20.           return true
  21.       }
  22.   });
  23. })
* This source code was highlighted with Source Code Highlighter.

И последнее, конфигурация того как будут вести себя Drag and Drop наших гридов.

Теперь к кодам на php, и так:

Код config.php: (настройка БД)
  1. <?php
  2.   $db_server = "localhost";  // Хост БД
  3.   $db_user = "root";      // Логин БД
  4.   $db_password = "";      // Пароль БД
  5.   $db_dbname = "online";    // Имя БД
  6.  
  7.   $connect = @mysql_connect($db_server, $db_user, $db_password) // Создаём соединение (идентификатор $connect)
  8.     or die ("Couldn't connect to MySQL:<br>" . mysql_error() . "<br>" . mysql_errno());
  9.   
  10.   $db = @mysql_select_db($db_dbname, $connect) // Вибираем базу
  11.     or die ("Couldn't select database:<br>" . mysql_error(). "<br>" . mysql_errno());
* This source code was highlighted with Source Code Highlighter.

Код get_org.php: (получение списка организаций)
  1. <?php
  2. require('config.php');
  3.  
  4.   $cmd = iconv('UTF-8', 'WINDOWS-1251', $_POST['query']); //Запрос из Комбобокса
  5.   
  6.   $query = 'SELECT id_org,name,inn FROM `organizatsii` WHERE `name` LIKE \'%' .$cmd. '%\' ORDER BY name';
  7.   $query2 = 'SELECT id_org,name,inn FROM `organizatsii` WHERE `inn` LIKE \'%' .$cmd. '%\' ORDER BY name';
  8.   
  9.   $result = @mysql_query($query, $connect) or die ("Couldn't execute query:<br>" . mysql_error(). "<br>" . mysql_errno());
  10.   if (mysql_num_rows($result)==0) {
  11.     $result = @mysql_query($query2, $connect) or die ("Couldn't execute query:<br>" . mysql_error(). "<br>" . mysql_errno());
  12.   }
  13.   while ($row = mysql_fetch_array($result)) :
  14.     $row["name"] = iconv('WINDOWS-1251', 'UTF-8', $row["name"]);
  15.     $arr[] = $row;
  16.   endwhile;
  17.   
  18.   $u2koi = array
  19.   (
  20.   '\u0430' => 'а', '\u0410' => 'А',
  21.   '\u0431' => 'б', '\u0411' => 'Б',
  22.   '\u0432' => 'в', '\u0412' => 'В',
  23.   '\u0433' => 'г', '\u0413' => 'Г',
  24.   '\u0434' => 'д', '\u0414' => 'Д',
  25.   '\u0435' => 'е', '\u0415' => 'Е',
  26.   '\u0451' => 'ё', '\u0401' => 'Ё',
  27.   '\u0436' => 'ж', '\u0416' => 'Ж',
  28.   '\u0437' => 'з', '\u0417' => 'З',
  29.   '\u0438' => 'и', '\u0418' => 'И',
  30.   '\u0439' => 'й', '\u0419' => 'Й',
  31.   '\u043a' => 'к', '\u041a' => 'К',
  32.   '\u043b' => 'л', '\u041b' => 'Л',
  33.   '\u043c' => 'м', '\u041c' => 'М',
  34.   '\u043d' => 'н', '\u041d' => 'Н',
  35.   '\u043e' => 'о', '\u041e' => 'О',
  36.   '\u043f' => 'п', '\u041f' => 'П',
  37.   '\u0440' => 'р', '\u0420' => 'Р',
  38.   '\u0441' => 'с', '\u0421' => 'С',
  39.   '\u0442' => 'т', '\u0422' => 'Т',
  40.   '\u0443' => 'у', '\u0423' => 'У',
  41.   '\u0444' => 'ф', '\u0424' => 'Ф',
  42.   '\u0445' => 'х', '\u0425' => 'Х',
  43.   '\u0446' => 'ц', '\u0426' => 'Ц',
  44.   '\u0447' => 'ч', '\u0427' => 'Ч',
  45.   '\u0448' => 'ш', '\u0428' => 'Ш',
  46.   '\u0449' => 'щ', '\u0429' => 'Щ',
  47.   '\u044a' => 'ъ', '\u042a' => 'Ъ',
  48.   '\u044b' => 'ы', '\u042b' => 'Ы',
  49.   '\u044c' => 'ь', '\u042c' => 'Ь',
  50.   '\u044d' => 'э', '\u042d' => 'Э',
  51.   '\u044e' => 'ю', '\u042e' => 'Ю',
  52.   '\u044f' => 'я', '\u042f' => 'Я',
  53.   '\r' => '',
  54.   '\n' => '<br />',
  55.   '\t' => ''
  56.   );
  57.   
  58.   echo '{rows:'.strtr(json_encode($arr),$u2koi).'}';
  59. ?>
* This source code was highlighted with Source Code Highlighter.

$_POST['query'] — запрос, передаваемый из комбобокса при написании в нем чего-нибудь (фильтр). У нас в комбобоксе стоит (minChars: 2) это значит, что если в комбобоксе написать более двух символов, обновится хранилище (заново выполнится скрипт хранилища, у нас это get_org.php) в скрипт будет передан запрос query. Таким образом, мы можем фильтровать список организации из БД.
$u2koi = array… — используется для корректного получения русских текстов из БД.

Код get_tovar.php: (получение списка товаров)
  1. <?php
  2. require('config.php');
  3.  
  4.   $query = 'SELECT id,name,col,price FROM `tovar` ORDER BY name';
  5.  
  6.   $result = @mysql_query($query, $connect) or die ("Couldn't execute query:<br>" . mysql_error(). "<br>" . mysql_errno());
  7.  
  8.   while ($row = mysql_fetch_array($result)) :
  9.     $row["name"] = iconv('WINDOWS-1251', 'UTF-8', $row["name"]);
  10.     $arr[] = $row;
  11.   endwhile;
  12.  
  13.   $u2koi = array
  14.   (
  15.   '\u0430' => 'а', '\u0410' => 'А',
  16.   '\u0431' => 'б', '\u0411' => 'Б',
  17.   '\u0432' => 'в', '\u0412' => 'В',
  18.   '\u0433' => 'г', '\u0413' => 'Г',
  19.   '\u0434' => 'д', '\u0414' => 'Д',
  20.   '\u0435' => 'е', '\u0415' => 'Е',
  21.   '\u0451' => 'ё', '\u0401' => 'Ё',
  22.   '\u0436' => 'ж', '\u0416' => 'Ж',
  23.   '\u0437' => 'з', '\u0417' => 'З',
  24.   '\u0438' => 'и', '\u0418' => 'И',
  25.   '\u0439' => 'й', '\u0419' => 'Й',
  26.   '\u043a' => 'к', '\u041a' => 'К',
  27.   '\u043b' => 'л', '\u041b' => 'Л',
  28.   '\u043c' => 'м', '\u041c' => 'М',
  29.   '\u043d' => 'н', '\u041d' => 'Н',
  30.   '\u043e' => 'о', '\u041e' => 'О',
  31.   '\u043f' => 'п', '\u041f' => 'П',
  32.   '\u0440' => 'р', '\u0420' => 'Р',
  33.   '\u0441' => 'с', '\u0421' => 'С',
  34.   '\u0442' => 'т', '\u0422' => 'Т',
  35.   '\u0443' => 'у', '\u0423' => 'У',
  36.   '\u0444' => 'ф', '\u0424' => 'Ф',
  37.   '\u0445' => 'х', '\u0425' => 'Х',
  38.   '\u0446' => 'ц', '\u0426' => 'Ц',
  39.   '\u0447' => 'ч', '\u0427' => 'Ч',
  40.   '\u0448' => 'ш', '\u0428' => 'Ш',
  41.   '\u0449' => 'щ', '\u0429' => 'Щ',
  42.   '\u044a' => 'ъ', '\u042a' => 'Ъ',
  43.   '\u044b' => 'ы', '\u042b' => 'Ы',
  44.   '\u044c' => 'ь', '\u042c' => 'Ь',
  45.   '\u044d' => 'э', '\u042d' => 'Э',
  46.   '\u044e' => 'ю', '\u042e' => 'Ю',
  47.   '\u044f' => 'я', '\u042f' => 'Я',
  48.   '\r' => '',
  49.   '\n' => '<br />',
  50.   '\t' => ''
  51.   );
  52.   
  53.   echo '{tovar:'.strtr(json_encode($arr),$u2koi).'}';
  54. ?>
* This source code was highlighted with Source Code Highlighter.

Код save.php: (и сохраняем)
<?PHP
$title = iconv('UTF-8', 'WINDOWS-1251', $_POST['title']);
$date = iconv('UTF-8', 'WINDOWS-1251', $_POST['date']);
$prod_id = iconv('UTF-8', 'WINDOWS-1251', $_POST['prod_id']);
$prod = iconv('UTF-8', 'WINDOWS-1251', $_POST['prod']);
$pok_id = iconv('UTF-8', 'WINDOWS-1251', $_POST['pok_id']);
$pok = iconv('UTF-8', 'WINDOWS-1251', $_POST['pok']);
$data = iconv('UTF-8', 'WINDOWS-1251', $_POST['data']);
if (($title == '') or ($date == '') or ($data == '')) $success = "false"; else $success = "true";
if ($title == '') {$err_title = "title: \"Поле 'Номер' не может быть пустым\","; $err_title_msg = "Не заполнен номер<br>";}
if ($date == '') {$err_date = "date: \"Поле 'Дата' не может быть пустым\","; $err_date_msg = "Не установлена дата<br>";}
if ($data == '') {$err_data_msg = "Не выбраны товары";}
print "{success: " .$success. ",errors: {".$err_title."".$err_date."null: \"null\"}, truemsg: \"Номер: " .$title. ", Дата: " .$date. " <br>Продавец: " .$prod. "<br>ИД Продавца: " .$prod_id. "<br>Покупатель: " .$pok. "<br>ИД Покупателя: " .$pok_id. "<br>Товары:".$data."\",errormsg:\"".$err_title_msg."".$err_date_msg."".$err_data_msg."\"}";
?>


Исходники создания БД выкладывать не буду, из скриптов видно какие таблицы и поля используются. При необходимости вы можете добавить или изменить поля. А скрипт save.php переписать под ваши нужды. Эта статья своего рода шаблон для начинающих.

Ну вот пока и все. Всем спасибо за внимание :) Успехов в написании на ExtJS.
Теги:
Хабы:
Всего голосов 29: ↑17 и ↓12+5
Комментарии20

Публикации