Опубликован: 07.11.2006 | Уровень: специалист | Доступ: платный
Лекция 19:

Flash, ColdFusion и Remoting

< Лекция 18 || Лекция 19: 1234567
Добавление контактов

В следующем параграфе о PMA мы рассмотрим функциональность, заключающуюся в добавлении контактов в базу данных. Кнопка add является компонентом PushButton, который вызывает метод обработки щелчка мыши addConfirm при нажатии кнопки.


Создадим метод addConfirm, который установим в качестве обработчика щелчка. При нажатии кнопки должно отображаться сообщение, инструктирующее пользователя о том, как добавить новый контакт. После этого можно либо продолжить работу, либо выбрать отмену и вернуться в PMA.

  1. Начнем с отображения фильма сообщения, установив параметр видимости компонента MessageBox на значение 1, т.к. по умолчанию в фильме этот параметр отключен. Также установим размер и сообщение фильма, как показано ниже.
    function addConfirm(  {
    
      message_mc._visible = 1;
      message_mc.setSize(200, 150);
      message_mc.setMessage("Please fill out the form and click
      К\"save\" tc add the new contact");
  2. Далее устанавливаем кнопки и их ширину в MessageBox с помощью массива кнопок для хранения имен PushButtons в MessageBox. Затем вызываем методы setButtons и setButtonWidth для динамического добавления и установки размера кнопок.
    var buttons = ["Okay", "Cancel"];
    message_mc.setButtons(buttons); 
    message_mc.setButtonWidth(60);
  3. Наконец, определяем метод закрытия обработчика.
    message_mc.setCloseHandler ("addContact");
    }

    Затем здесь устанавливаются некоторые параметры (такие как размер окна) и сообщение. Возможность динамической настройки этих параметров очень полезна, равно как и то, что можно использовать компонент MessageBox для других сообщений подтверждения в любом месте приложения. Последняя строка вышеуказанного кода устанавливает метод закрытия обработчика MessageBox, вызываемого каждый раз при закрытии окна. Очевидно, нам не требуется, чтобы что-либо происходило после нажатия кнопки cancel , поэтому нужно соответствующим образом дополнить метод addContact.

  4. При нажатии кнопки OK нужно очистить поля формы и включить кнопку save, чтобы пользователь мог добавить информацию о новом контакте.
    function addContact(component, buttonlndex) { 
      if (buttonlndex == 0) {
        first_name = "";
        last_name = "";
        address = "";
        city = "";
        state = "";
        zip = "";
        email = "";
        phone = "";
        notes.text = "";
        save_mc.setEnabled(true); 
      } 
    }

    Так как кнопка OK имеет в массиве индекс 0, определяем, была ли она нажата, и очищаем поля формы перед тем, как сделать доступной кнопку save. Если она не была нажата, ничего не происходит, и пользователь возвращается в PMA.

  5. Теперь поля ввода очищены, и кнопка save доступна, поэтому пользователь может создавать новую запись. Он должен заполнить все поля, и здесь мы используем простой метод проверки того, что заполнены именно все поля.
    function validateFields() {
      if (first_name != '' && last_name != '' && address != '' &&
      Кcity != '' && state != '' && zip != '' && email != '' &&
      Кphone ! ='' && notes. text != 
        '' && calendar_mc.getSelectedItem()) {
        return true;
      } 
    }

    Этот метод проверяет существование данных в полях, а также выбор даты создания контакта. Разумеется, проверка может быть изощреннее, однако для наших целей и такая вполне годится. Если вы хотите сделать приложение функциональнее, смело расширяйте возможности этого метода и создайте схему проверки, удовлетворяющую вашим нуждам. Метод validateFields возвращает значение true, если форма успешно проходит проверку.

  6. Теперь можно использовать этот метод совместно с методом saveContact, который будет вызываться при щелчке пользователем на кнопке save для сохранения новой контактной информации в базе данных.
    function saveContact() { 
      if(validateFields()) {
  7. Так как в нашем случае пользователь заполнил все поля, создайте объект нового контакта для передачи в CF.
    var o = new Object();
    o.first_name = first_name;
    o.last_name = last_name;
    o.address = address;
    o.city = city;
    o.state = state;
    o.zip = zip;
    o.email = email
    o.phone = phone;
    o.notes = notes.text;
    o.birth_date = birth_date;
  8. Каждый раз при выборе даты в календаре, мы вызываем обработчик изменений getBirthDate, который устанавливает переменную birth_date. Отправьте его в saveContact CFC через шлюз Flash.
    contacts_service.saveContact(o); 
    }   else   {
  9. Если пользователь не заполнил все поля, он будет оповещен об этом с помощью того же окна сообщения, что использовалось нами ранее. Это делается так же, как и в функции addConfirm.
    message_mc._visible = 1;
    // set the size and message of the clip
    message_mc.setSize(200, 150);
    message_mc.setMessage ("Please be sure to fill out all fields.");
    // set the buttons and their width in the MessageBox
    var buttons = ["Okay"];
    message_mc.setButtons(buttons); 
    message_mc.setButtonWidth(60);
  10. Теперь нужно просто сбросить метод закрытия обработчика, если он был установлен.
    message_mc.setCloseHandler(null); 
      } 
    }
  11. Перейдем обратно в текстовый редактор, в котором введены функции ColdFusion, и создадим модуль CFC, ответственный за захват информации из объекта и добавление ее в базу данных, который мы только что вызывали в функции saveContact. Введите следующий код.
    <!--- save contact info --->
    <cffunction name="saveContact" access="remote">
    <cfquery datasource="#request.dsn#" name="add_contact">
    insert into contacts(first_name, last_name, address, city, state,
    Кzip, email, phone, notes, birth_date) 
     values('#flash.first_name#', '#flash.last_name#',
      К'#flash.address#', '#flash.city#', '#flash.stateft', 
       '#flash.zip#', '#flash.email#', 
       К#flash.phone#', '#flash.notes#', #createodbcdate
        (flash.birth_date)#);
    </cfquery>
    <cfreturn 1 />
    </cffunction>

    Если вы уже хорошо знакомы с CF и областями применения переменных, то обрадуетесь, узнав, что области применения переменных Flash существуют и в ColdFusion MX. Доступ к данным, переданным из Flash, можно осуществлять так: flash.имя_переменной. Это способ доступа к данным, переданным из Flash, а также их включения в выражение insert. После успешного выполнения insert, возвращаем флажок успешного завершения во Flash. Этот флажок имеет значение 1 и будет передан обратно методу saveContact_Result.

  12. Этот метод будет выводить сообщение об успешном окончании операции, если вставка была успешной. Он проверяет, была ли вставка успешной, и если это так, выводит сообщение об успешном окончании операции. Добавьте следующий код к уже имеющимся действиям в фильме Flash.
    function saveContact_Result(success) { 
      if(success) {
        message_mc._visible = 1;
        message_mc.setSize(200, 150);
        message_mc.setMessage("The new contact 
         was added successfully.");
        // set the buttons and their width in the MessageBox
        var buttons = ["Okay"];
        message_mc.setButtons(buttons);
        message_mc.setButtonWidth(60);
        // reset the close handler method in case it was already
        // set
        message_mc.setCloseHandler(null);
  13. После этого вызывается начальный метод getAllContacts, который обновит список ListBox нашим новым контактом.
    contacts_service.getAllContacts(); 
      } 
    }
< Лекция 18 || Лекция 19: 1234567
Игорь Хан
Игорь Хан

у меня аналогичная ситуация. Однако, если взять пример из приложения (ball_motion_04_click for trial.fla) то след остается. при этом заметил, что в моем проекте в поле "One item in library" виден кружок, в то время как в приложенном примере такого кружка нет.

Вопрос знатокам, что не так?

Александр Коргапольцев
Александр Коргапольцев

объект созданый мной упорно не желает оставлять след(единственное что добился, так это то что шарик резво гоняется за курсором) функция duplicateMovieClip остаётся не активной, т.е. следа от объекта не остаётся, но если я тоже самый код вбиваю в учебный файл всё работает, не могу понять где я ошибаюсь и почему в документе созданном заново, не работает код начиная от функции duplicateMovieClip? 

Наталья Алмаева
Наталья Алмаева
Россия
Светлана Казьмина
Светлана Казьмина
Россия, Волгодонск