Внутренние (встроенные) функции
Говоря о функциях, определяемых пользователем, все же нельзя не сказать пару слов о встроенных функциях. С некоторыми из встроенных функций, такими как echo(), print(), date(), include(), мы уже познакомились. На самом деле все перечисленные функции, кроме date(), являются языковыми конструкциями. Они входят в ядро PHP и не требуют никаких дополнительных настроек и модулей. Функция date() тоже входит в состав ядра PHP и не требует настроек. Но есть и функции, для работы с которыми нужно установить различные библиотеки и подключить соответствующий модуль. Например, для использования функций работы с базой данных MySql следует скомпилировать PHP с поддержкой этого расширения. В последнее время наиболее распространенные расширения и соответственно их функции изначально включают в состав PHP так, чтобы с ними можно работать без каких бы то ни было дополнительных настроек интерпретатора.
Решение конкретной задачи
Необходимо написать интерфейс, который позволял бы создавать html-формы. Пользователь выбирает, какие элементы и в каком количестве нужно создать, придумывает им названия, а наша программа сама генерирует требуемую форму.
Разобьем задачу на несколько подзадач: выбор типов элементов ввода и их количества, создание названий элементов ввода и обработка полученных данных, т.е. непосредственно генерация формы. Первая задача достаточно проста: нужно написать соответствующую форму, например подобную приведенной ниже ():
<form action="ask_names.php">Создать элемент "строка ввода текста": <input type=checkbox name=types[] value=string><br>Количество элементов: <input type=text name=numbers[string] size=3><br><br>Создать элемент "текстовая область": <input type=checkbox name=types[] value=text><br>Количество элементов: <input type=text name=numbers[text] size=3><br><input type=submit value="Создать"></form>Листинг 5.12. task_form.html
Когда мы пишем в имени элемента формы, например types[], это значит, что его имя – следующий элемент массива types. То есть у нас первый элемент формы ( "строка ввода текста" ) будет иметь имя types[0], а второй (текстовая область) – types[1]. В браузере task_form.html будет выглядеть примерно так:
Рис. 5.1.Форма для выбора создаваемых элементов и их количества
После отправки данных этой формы мы получим информацию о том, какие элементы и сколько элементов каждого типа нужно создать. Следующий скрипт запрашивает названия для этих элементов:
<?$file = "task.php"; /* файл, который будет обрабатыватьсгенерированную этим скриптом форму */ function Ask_names(){ // функция генерирует форму для // ввода названий элементов ввода global $file; //объявляем, что хотим использовать эту // переменную, заданную вне функцииif (isset($_GET["types"])){ $st = '<form action="'.$file.'">'; foreach ($_GET["types"] as $k => $type){/* перебираем все типы элементов, которые нужно создать */ $num = $_GET["numbers"][$type]; // сколько элементов каждого типа нужно for ($i=1;$i<=$num;$i++){ // создаем $num строк для ввода $st.= "Введите имя $i-го элемента типа $type: "; $st.= "<input type=text name=names[$type][]><br>"; } // сохраняем тип и число необходимых // элементов ввода этого типа $st.= "<input type=hidden name=types[] value=$type>"; $st.= "<input type=hidden name=numbers[] value=$num><br>";} $st .= "<input type=submit name=send value=send></form>";return $st; // в переменной $st содержится код формы // для запроса имен} else echo "Select type";}echo Ask_names(); // вызываем функцию и выводим // результаты ее работы?>Листинг 5.13. ask_names.php
Допустим, нужно создать два элемента типа "текстовая строка" и один элемент типа "текстовая область", как и отмечено в форме выше. Тогда скрипт ask_names.php обработает ее таким образом, что мы получим такую форму:
Рис. 5.2.Форма для ввода названий создаваемых элементов
Введем в эту форму, например, строки "Название", "Автор" и "Краткое содержание". Эти данные будет обрабатывать скрипт task.php.
<?$show_file = "task_show.php"; /* файл, который будет обрабатывать данные созданной этим файлом формы */ function Create_element($type,$name){ // функция создает элемент ввода // по типу и названию $str=""; switch($type){ case "string": $str .= "$name: <input type=text name=string[]><br>"; break; case "text": $str .= "$name: <textarea name=text[]></textarea><br>"; break; }return $str;}function Create_form(){ // функция создает форму // с нужными элементамиglobal $show_file; $str = '<form action="'.$show_file.'">'; foreach ($_GET["types"] as $k => $type){ // перебираем типы элементов $num = $_GET["numbers"][$k]; // число элементов этого типа for ($i=1;$i<=$num;$i++){ $arr = $_GET["names"][$type][$i-1]; // имя создаваемого элемента $str .= Create_element($type,$arr); // вызываем функцию для // создания элемента } } $str .= "<input type=submit value=send></form>";echo $str;}$crt = "Create_form";$crt(); // вызываем функцию создания // формы Create_form?>Листинг 5.14. task.php
Результатом работы этого скрипта с входными данными, приведенными выше, будет следующая форма:
Рис. 5.3.Пример формы, сгенерированной нашей программой