Содержание
Delphi for PHP: данные из сетки

Теперь есть почти все для построения приложения, работающего с БД. Для полного счастья не хватает возможности получения ID записи при перемещении по сетке для того, чтобы идентифицировать запись и выполнить с ней какие-либо действия (отредактировать, удалить, вытащить связанные записи, посмотреть дополнительные атрибуты и так далее). В интернет-приложениях эта задача решается добавлением CheckBox-ов для каждой записи, введением дополнительного столбца с гиперссылками Удалить-Редактировать или еще каким-то способом. В нашем случае это не проходит, приходится использовать возможности JavaScript.

Программисты на Delphi или любом другом подобном языке привыкли, что при перемещении по DBGrid всегда есть возможность получить в связанном Query поля записи, на которую установлен указатель DBGrid. В Delphi for PHP нам такую возможность реализовать не удалось, хотя, судя по скудной справке, она должна присутствовать. Вместе с тем Delphi for PHP позволяет интегрировать в код PHP модули JavaScript, причем для компонентов, наряду с закладкой Event, присутствует закладка событий Javascript. Для компонента DBGrid закладка выглядит следующим образом:



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



При перемещении по сетке значение ID текущей записи должно отображаться в окне слева снизу. При нажатии кнопки Показать для проверки должна отобразиться сетка с одной записью в соответствии с выбранным ID. Поскольку значение ID будет считываться из сетки, придется его там отобразить. (При настройке колонок для любой из них можно установить свойство Visible, но установка его в false на отображение почему-то не повлияла.) Обработка события OnClick выглядит следующим образом:

               function DBGrid1JSClick($sender, $params)
               {

               ?>
              
               //Add your javascript code here
               document.Unit2.Edit1.value=DBGrid1.getTableModel().getValue(0,DBGrid1.getFocusedRow());
               
               <?php

               }

При выполнении этой обработки значение первого поля в сетке (на это указывает 0, в нашем примере это поле ID) будет отображаться в текстовом поле Edit1 на форме Unit2.



Однако получить ID - это полдела, надо еще передать его из JavaScript в PHP для дальнейшей работы. Напрямую через переменную этого не сделать. Как вариант, можно передать значение через Cookie или методом GET. Можно поступить и по-другому - забрать значение из текстового окна (свойство $this->Edit1->Text). Окно можно скрыть от пользователя. При этом нельзя устанавливать свойство Visible в false (работать не будет), а нужно в свойствах компонента убрать рамку и сделать цвет шрифта таким же, как цвет фона. Обязательно надо установить свойство ReadOnly в true. При нажатии кнопки Показать модифицируем запрос, забирая ID из окна Edit, и обновляем данные на сетке. Все работает, даже скриншот не будем приводить.

Примечание. Событие OnClick реагирует, естественно, только на клик мыши. Перемещение по строкам таблицы при помощи клавиш не отслеживается и подходящего события в списке не просматривается. Так что при создании приложений надо это учитывать.

Остается вопрос об обновлении данных в сетке. При первом показе сервер пережевывает PHP и отдает браузеру для показа HTML, замешанный на JavaScript. Например, если в браузере посмотреть исходный код странички с выводом таблицы для данного примера, увидим, что для отображения передаются вполне конкретные значения.

 rowData.push([
"1","Архив фотографий","1" ]);
oData.push([
"1","Архив фотографий","1" ]);
rowData.push([
"2","Курсовая работа","2" ]);
oData.push([
"2","Курсовая работа","2" ]);
rowData.push([
"3","Дипломная работа","2" ]);
oData.push([
"3","Дипломная работа","2" ]);
rowData.push([
"4","Архив документов","1" ]);
oData.push([
"4","Архив документов","1" ]);

Чтобы эти значения обновить, нужно смотаться на сервер, выполнить новый запрос и вернуть результаты в браузер. Для этого можно, например, запомнить модифицированный текст sql-запроса в глобальной переменной и перейти на пустую страницу, с которой будет настроена автоматическая пересылка обратно. Или же можно использовать возможности VCL, закрыв и снова открыв соединение с базой данных. После этого данные в таблице будут обновлены.

Содержание

© re-stichka.narod.ru
При публикации данного материала ссылка на источник обязательна.

Hosted by uCoz