Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Разное

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: SoftTime FrameWork + JavaScript + Ajax

Сообщения:  [1-1] 

 
 автор: Ирбис   (01.07.2010 в 16:09)   письмо автору
 
 

Интересуюсь вопросом создания форм с помощью SoftTime FrameWork, которые, при этом, также управляются JavaScript.
В принципе, решение я нашел. Хотелось бы им поделиться и услышать мнения о том насколько оно удачное/неудачное. Особенно интересуют мнения создателей фреймворка ;)

Что требуется получить: форму, в которой, допустим, при выборе одного из значений из SELECT-списка динамически без перезагрузки появляются другие элементы или просто какой-либо текст.
Вот пример: http://test.irbis09.jino.ru/dmn/
Логин: test
Пароль: test

При использовании SoftTime FrameWork валидация формы происходит после ее отправки, т.е. страница перезагружается. При этом, если форма валидацию не прошла, то вывести ее требуется с теми же элементами/текстом, который был динамически добален JavaScript.
Если валидация пройдена, то формируем SQL-запрос и обновляем информации в базе и пользователь переадресовывается на нужную страницу.

Я решил поступить так.
Создал 3 файла:
testadd.php - основной файл, который осуществляет генерацию формы, ее вывод и добаление информации в базу.
testadd.js - файл, который содержит JavaScript, с помощью которого в форме можно динамически производить изменения.
ajax.testadd.php - файл, принимающий запросы с помощью AJAX (и не только;) ) и возвращающий строку, которую нужно добавить в форму.

Сгенерировать форму, вывести ее, динамически ее изменить с помощью JavaScript не сложно.
Также несложно обработать данные из формы, если она прошла валидацию, и поместить нужную информацию в БД.
Сложность состоит в том, как повторно вывести форму вместе с тем динамическим контентом, который был добавлен JavaScript, если форма не прошла валидацию.

Мое решение:
Файл ajax.testadd.php выдает контент как при AJAX-запросе, так и при обращении из файла testadd.php. Это позволяет добавить контент динамически с помощью JavaScript при необходимости, а также вывести этот же контент при повторной загрузки, если форма не прошла валидацию.

Фрагмент файла testadd.php в котором создается форма:
<?php
$text_val 
= include("ajax.testadd.php");

$name   = new field_text("name""Название"TRUE$_REQUEST['name']);
$fruit  = new field_select("fruit""Фрукт", array("Выберите фрукт""Апельсин""Яблоко"), $_REQUEST['fruit']);
$text   = new field_paragraph($text_val);
  
$form = new form(array("name" => $name,  
                      
"fruit" => $fruit
                      
"text" => $text),
                            
"Добавить",
                            
"form");

..................
echo 
"<script language='javascript' src='testadd.js'></script>";
?>


Файл ajax.testadd.php

<?php
$fruits 
= array("""Апельсин растет в тропиках""Яблоко растет в каждом саду");
if(
$_REQUEST['manage'] == "on")
{
  
header("Content-type: text/html; charset=windows-1251");
  echo 
$fruits[$_REQUEST['fruit']];
}
else
{
  return 
$fruits[$_REQUEST['fruit']];
}
?>



Файл testadd.js (чтобы сработала подсветка обрамлю начало и конец кода тегами <?php ?>. На самом деле testadd.js - это обычный подключаемый файл JavaScript)


<?php


$(document).ready(function() {
    
  
// Реакция на выпадающий список с фруктами
  
$('select[name=fruit]').change(function () {
      var 
url 'ajax.testadd.php?fruit=' + $(this).val() + '&manage=on';
      
url encodeURI(url);
      $(
'td[colspan=2]').load(url); 
  });
//end of change()
  
});//end of ready()


?>




При первой загрузке файла testadd.php в переменную $text_val попадет пустая строка, т.к. в этот момент у нас элемент $_REQUEST['fruit'] не иницаилизирован и файл ajax.testadd.php возвращает элемент массива $fruits с нулевым индексом (при обращении из скрипта addtest.php в файле ajax.testadd.php отрабатывает блок else).
Допустим пользователь выбрал элемент "Апельсин", скрипт ajax.testadd.php вернет строку "Апельсин растет в тропиках" (при обращении к скрипту ajax.testadd.php по AJAX отрабатывает блок if - это осуществляется за счет передаче скрипту переменной manage) и эта строка будет вставлена в форму - в строку таблицы, которой соответствует элемент field_paragraph ($('td[colspan=2]') конечно, не лучший идентификатор, нужно расширить SoftTime FrameWork, чтобы можно было создавать в форме элементы с ID селекторами)
Предположим, что посетитель не заполнил обязательное поле "name", т.е форма не пройдет валидацию и нам придется ее вывести повторно. При повторной загрузки скрипта testadd.php в элементе $_REQUEST['fruit'] будет находится число 1, которое соответсвует апельсину как в SELECT-списке, так и в массиве $fruits в скрипте ajax.testadd.php. Это позволяет нам вывести в строке таблицы, которой соответстует элемент field_paragraph, строку, соответствующую апельсину. Эту строку вернет скрипт ajax.testadd.php.

Таким образом, если форма не прошла валидацию, то при повторном выводе она примет тот же вид, который у нее был до того, как пользователь ее отправил. Это произойдет благодаря тому, что скрипт ajax.testadd.php позволяет получить данные как через AJAX, так и из самого скрипта testadd.php.

Обработка формы после успешной валидации, на мой взляд, большого труда не вызывает, даже если у нее будут добавлены новые элементы динамически.

  Ответить  

Сообщения:  [1-1] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования