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

Flash, ColdFusion и Remoting

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

Мы создали функциональность, позволяющую просматривать и добавлять контакты в приложение, однако также нужно реализовать возможность обновления контактной информации сразу при ее изменении. Когда контакты выбираются в списке ListBox, их информация отображается в фильме. У пользователя должна быть возможность изменять информацию о контакте и обновлять запись. Это делается нажатием кнопки update, которая вызывает метод updateContact.

  1. Для этого нужно, чтобы функция updateContact передала обновленную информацию о контакте в CF.
    function updateContact() {
      // make sure that a contact is selected 
      if (contacts_mc.getValue()) {
        // create an object that will be passed to CF for the
        //update
        var o = newObject();
        o.id = contacts_mc.getValue();
        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; 
        // handle the birth date
        // the birth_date variable is set with the getBirthDate 
        //method
        o.birth_date = birth_date; 
        // call the updateContact service 
        contacts_service.updateContact(o); 
      } 
    }

    Как видите, этот метод аналогичен методу saveContact за исключением того, что здесь осуществляется проверка выделения в списке ListBox, так как нам нужно запретить выполнение метода при отсутствии выделения контакта. Идентификатор записи контакта также передается CF для указания того, какую запись в базе данных необходимо обновить. Номер id сохраняется в объекте данных наряду с другой информацией о контакте. Этот объект затем передается методу updateContact нашего CFC.

  2. Создаем метод CFC updateContact, чтобы брать параметры, переданные из Flash, обновить базу данных и передать флажок успешного завершения операции обратно во Flash.
    <!--- save existing contact info --->
    <cffunction name="updateContact" access="remote">
    <cfquery datasource="#request.dsn#" name="save_contact">
    update contactsset first_name="#flash.first_name#", 
    last_name="#flash.last_name#", 
      Кaddress="#flash.addressft", city="#flash.citytt", 
        state="#flash.state#", Кzip="#flash.zip#", 
          email="#flash.email#", phone="#flash.phoneft",
    Кnotes="#flash.notestt",
    birth_date=#createodbcdate(flash.birth_date)#
    where id=#flash.id#;
    </cfquery>
    <cfreturn 1 />
    </cffunction>
  3. Возвращаясь к фильму Flash, метод updateContact_Result продолжает работу, выводя сообщение об успешном завершении операции с помощью компонента MessageBox практически тем же способом, что и в функции saveContact_Result.
    function updateContact_Result(success) {
      // if the update is sucessful do the following
      if (success) {
      // refresh the contact ListBox after update
        contacts_service.getAllContacts();
        // display message to user that the update was successful
        message_mc._visible = 1;
        message_mc.setSize(200, 150);
        message_mc.setMessage("The contact was updated 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); 
      } 
    }

    Опять-таки, метод getAllContacts вызывается для обновления ListBox в случае, если информация о контакте была изменена. Теперь можно просматривать, добавлять и обновлять информацию о контактах, но, как вы, наверное, чувствуете, чего-то здесь не достает. Осталось реализовать еще одну возможность, и мы получим полноценное приложение PMA.

Удаление контактов

PMA не было бы законченным приложением без возможности удаления контактов из базы данных. Рассмотрим необходимый код. Необходимо выбрать контакт из списка, прежде чем мы сможем с ним что-либо сделать. Затем щелчком на кнопке delete, вызываем метод deleteConfirm.

  1. Прежде всего проверяем, выбран ли контакт. Если нет, нужно вывести сообщение, предлагающее пользователю выделить нужную запись.
    function deleteConfirm() {
      if (contacts_mc.getValue()) { 
        message_mc._visible = 1; 
        message_mc.setSize(200, 150);
        message_mc.setMessage ("Are you sure you want to delete
        Кthe selected entry?");
        var buttons = ["Okay", "Cancel"];
        message_mc.setButtons(buttons); 
        message_mc.setButtonWidth(60);
        message_mc.setCloseHandler("deleteContact");
      } 
    }
  2. Если удаление подтверждено, можно удалить контакт. Проверка нажатия кнопки OK осуществляется, как и прежде, с использованием ее индекса 0. Затем нужно передать номер id в ColdFusion. Он сохраняется в объекте и передается методу deleteContact CFC контактов.
    function deleteContact(component, buttonlndex) { 
      if (buttonlndex == 0) {
        // set the object to pass to CF 
        var o = new Object(); 
        o.id = contacts_mc.getValue(); 
        contacts_service.deleteContact(o); 
      } 
    }
  3. Относительно CF, необходим лишь простой запрос на удаление, который уберет запись из базы данных. Получив от CF флажок успешного завершения операции через шлюз Flash, возвращаемся к методу deleteContact_Result.
    <!--- delete contact from the database --->
    <cffunction name="deleteContact" access="remote">
    <cfquery datasource="#request.dsn#" name= "delete_contact">
    delete from contacts
    where id=#flash.id#;
    </cfquery>
    <cfreturn 1 />
    </cffunction>
< Лекция 18 || Лекция 19: 1234567
Игорь Хан
Игорь Хан

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

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

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

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

Тамара Ионова
Тамара Ионова
Россия, Нижний Новгород, НГПУ, 2009
Магомед Алисултанов
Магомед Алисултанов
Россия, Волгоград, лицей 2