Главная » Delphi » Управление данными предпочтений пользователя

0

Следующим  немаловажным элементом является поддержка информации  о пред почтениях пользователя. Большинство динамических приложений позволяют поль зователем управлять способом отображения информации на странице в довольно широких приделах: начиная с порядка расположения покупок  в корзинке и до цвето вых предпочтений пользователя. Конечно, WebSnap  существенно упрощает эту зада чу, но на сей раз придется написать несколько строк  кода.

Сначала  добавим  в проект новую страницу. Выберем для нее тип генератора TAdapterPageProducer и затребуем регистрацию пользователей для ее просмотра. (Как  это  сделать  с помощью панели инструментов и возникающего в результате мас тера — рассматривалось ранее.) Сохраним файл  как wmPreferenceInput. Добавим  к Web модулю TAdapter и переименуем содержимое свойства Adapter из Adapter1 в PrefAdapter, как показано на рис. 23.11.

Рис. 23.11. Web модуль PreferenceInput, который хранит предпочтения пользователей

Дважды  щелкните на компоненте PrefAdapter, а затем  добавьте два компонента AdapterField и  один   AdapterBooleanField.  Назовите  компоненты  Adapter- Field FavoriteMovie и PasswordHint, а AdapterBooleanField как LikesChoco- late. (Обратите внимание: при  переименовании этих  компонентов изменяются зна чения DisplayLabel и FieldName.) Кроме  того,  в коде HTML значение DisplayLa- bel можно изменить на более осмысленное.

Компонент PrefAdapter будет содержать значения пользовательских предпочте ний,  а также  обеспечивать доступ к ним из других страниц. Компоненты класса TAdapter содержат сценарии, которые могут самостоятельно хранить, управлять и манипулировать информацией, но выполнение этих действий требует  определенного кода.  Каждый  из трех  созданных компонентов AdapterField должен  обладать воз можностью получить в сценарии свои значения, поэтому  каждый  из них поддержива ет событие OnGetValue. Поскольку эта информация должна  быть  доступна  при  всех обращениях данного пользователя, ее целесообразно хранить в свойстве Ses- sion.Values (значения сеанса). Переменная Session.Values представляет собойиндексированную строку как массив вариантов, поэтому в нем можно хранить прак

тически все, что угодно на протяжении действия текущего сеанса.

Класс TAdapter позволяет также  выполнять действия над своими  данными. Чаще всего,  для  этого  применяется кнопка  Submit в форме HTML.  Выберите компонент PrefAdapter, перейдите в инспектор объектов и дважды  щелкните на свойстве Ac- tions. Добавьте одно  действие и назовите его  SubmitAction. Измените значение DisplayLabel его  свойства на  Submit Information. Затем  перейдите к вкладке Events (События) в инспекторе объектов и добавьте в обработчик события OnExe- cute код, представленный в листинге 23.2.

Листинг 23.2. Обработчик события OnExecute

procedure TPreferenceInput.SubmitActionExecute(Sender: TObject; Params: TStrings);

var

Value: IActionFieldValue;

begin

Value := FavoriteMovieField.ActionValue;

if Value.ValueCount > 0 then begin

Session.Values[sFavoriteMovie] := Value.Values[0];

end;

Value := PasswordHintField.ActionValue;

if Value.ValueCount > 0 then begin

Session.Values[sPasswordHint] := Value.Values[0];

end;

Value := LikesChocolateField.ActionValue;

if Value <> nil then begin

if Value.ValueCount > 0 then begin

Session.Values[sLikesChocolate] := Value.Values[0];

end;

end else begin

Session.Values[sLikesChocolate] := ‘false';

end;

end;Когда  пользователь щелкает   на  кнопке Submit,  этот  код  получает значения  из входных  полей  HTML и помещает их в переменные сеанса  для последующего исполь зования в компоненте AdapterField.

Конечно, доступ к этим значениям может понадобиться сразу, как только они бу

дут установлены, поэтому  каждое  поле адаптера возвращает свое значение из объекта SessionsService. Для каждого  поля  адаптера установите обработчик события OnGetValue так, как это показано в листинге 23.3.

Листинг 23.3. Обработчики события OnGetValue

… constsFavoriteMovie = ‘FavoriteMovie'; sPasswordHint = ‘PasswordHint'; sLikesChocolate = ‘LikesChocolate'; sIniFileName = ‘DDG6Demo.ini';

procedure TPreferenceInput.LikesChocolateFieldGetValue(Sender: TObject; var Value: Boolean);

var

S: string;

begin

S := Session.Values[sLikesChocolate];

Value := S = ‘true';

end;

procedure TPreferenceInput.FavoriteMovieFieldGetValue(Sender: TObject; var Value: Variant);

begin

Value := Session.Values[sFavoriteMovie];

end;

procedure TPreferenceInput.PasswordHintFieldGetValue(Sender: TObject; var Value: Variant);

begin

Value := Session.Values[sPasswordHint];

end;Теперь необходим способ  отобразить элементы управления, которые фактически получат  данные от пользователя. Для этого  применяется генератор TAdapterPage- Producer. Все происходит точно так же, как и со страницей Login: двойной щелчок на компоненте TAdapterPageProducer снова  вызовет Web дизайнер. Создайте но вую форму  AdapterForm, добавьте AdapterFieldGroup и AdapterCommandGroup. Установите значение свойства Adapter компонента AdapterFieldGroup в состоя ние  PrefAdaper, а также  свойство DisplayComponent компонента AdapterCom- mandGroup в состояние AdapterFieldGroup. Затем  щелкните правой кнопкой мыши на компоненте AdapterFieldGroup и выберите в появившемся меню  пункт Add All Fields (Добавить все поля).  Для каждого  из созданных в результате полей  используйте инспектор объектов, чтобы   заполнить их  свойства FieldName соответствующими значениями. Кроме  того, можно  изменить значение свойства Caption (Заголовок) на более осмысленное, чем установлено по умолчанию. Затем  выберите компонент AdapterCommandGroup и,  щелкнув  на нем  правой кнопкой мыши,  выберите в поя вившемся меню пункт Add All Commands (Добавить все команды). Установите свойст во  ActionName возникающего в результате  элемента AdapterActionButton в со стояние SubmitAction. И, в заключение, установите свойство AdapterActionBut- ton.PageName в состояние PreferencesPage.

Если в Web дизайнере что нибудь сделано неправильно, то во вкладке Browser поя

вится  сообщение об ошибке.  Сообщение информирует обо  всех свойствах, которые необходимо установить для правильного взаимодействия с HTML.После  того  как все будет сделано  и страница HTML  будет выглядеть правильно, останется лишь запустить приложение, чтобы  новая  страница появилась в меню. Если войти на страницу теперь, то можно  заметить, что элементы управления ввода готовы принять данные пользовательских предпочтений, которые можно  изменить не щел кая на кнопке  Submit (поскольку ее просто нет).

Теперь с помощью панели инструментов создадим  страницу для отображения предпочтений пользователя и назовем ее PreferencesPage. Эта страница будет за щищенной и публикуемой. (Как обычно, все это можно  сделать  с помощью мастера.) Сохраним новый  модуль как wmPreferences.

Затем  перейдем к HTML  этой  страницы и в области ниже  таблицы, содержащей

меню навигации, добавим следующий сценарий:

<P>

Favorite Movie: <%

= Modules.PreferenceInput.PrefAdapter.FavoriteMovieField.Value

%>

<BR>

Password Hint: <%

= Modules.PreferenceInput.PrefAdapter.PasswordHintField.Value

%>

<BR>

<%

s = ”

if (Modules.PreferenceInput.PrefAdapter.LikesChocolateField.Value)

s = ‘You like Chocolate’

else

s = ‘You do not like chocolate’

Response.Write(s);

%>

Теперь, когда приложение скомпилировано и запущено, можно  ввести  свои пред почтения и щелкнуть на кнопке Submit, приложение запомнит и отобразит введенные предпочтения на странице Preferences. К значениям, полученным в этом сценарии, можно  обращаться из любой другой страницы точно так же, как если бы они были ус тановлены в ней.  Значения хранятся в объектах Session на протяжении всех обра щений HTTP  и могут быть в любой  момент возвращены с помощью сценария из ком понента Adapter.

НА ЗАМЕТКУ

Как можно заметить, с каждой из страниц в приложении WebSnap ассоциирован файл HTML. Но поскольку такие файлы существуют вне приложения, их можно редактиро- вать, сохранять и обновлять в окне броузера без перекомпиляции приложения. Это оз- начает, что саму страницу можно модифицировать без перезагрузки Web-сервера. Во время разработки с серверными сценариями также можно экспериментировать сво- бодно, безо всякой необходимости перекомпилировать приложение. Далее в настоя- щей главе рассматриваются альтернативные способы сохранения и получения HTML.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии