Теперь есть почти все для построения приложения, работающего с БД. Для
полного счастья не хватает возможности получения 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. Например, если в браузере посмотреть исходный код странички
с выводом
таблицы для данного примера, увидим, что для отображения передаются
вполне
конкретные значения.
Чтобы эти значения обновить, нужно смотаться на сервер, выполнить
новый запрос и вернуть результаты в браузер. Для этого можно, например,
запомнить модифицированный текст sql-запроса в глобальной переменной и
перейти на пустую страницу, с которой будет настроена автоматическая
пересылка обратно. Или же можно использовать возможности VCL, закрыв и
снова открыв соединение с базой данных. После этого данные в таблице
будут обновлены.