
Существует много людей, которые хотят опубликовать свои собственные формы в Joomla! содержание.
Для удовлетворения своих потребностей, я решил написать этот учебник. Учебник предназначен для Joomla! 1.0.x кодирования начинающих, но промежуточные можете найти некоторые приемы полезным.
В этом шаг за шагом уроке вы узнаете,
- что сам форм Коллинг являются и для каких целей они служат,
- некоторые наиболее полезные PHP и Joomla! 1.0.x трюков, которые имеют отношение к себе формы призвание. Например:
- как сценарий ловит, что пользователь отправил данные,
- как распознать URL адрес, по которому скрипт работает,
- Как отключить конкретного Joomla! с кэш страницы,
- , что Joomla! конкретным объектом базы данных $, $ моей есть, где искать свои методы и их описание,
- и так далее
Какие формы само призвание есть, и для какой цели они служат
Каждая форма собирает данные из респондентов.
Собранные данные не сохраняются в форме, но они - как правило, после нажатия кнопки отправки - послали куда-то. Они направляются в некоторую обработку сценария, который "сидит" на другой адрес URL, и что - после возможной предварительной обработки, - пишет в базу данных и / или отправляет их на адрес электронной почты.
Это наиболее распространенный подход. И такой подход используют стандартную Joomla! формы компонентов.
Но можно жить без компонентов формы, возможно, чтобы наши собственные формы, которые будут включены в содержание статьи. Формы могут отправлять собранную информацию для себя и обрабатывать их. Это так называемые формы само призвание.
Можно даже еще больше: чтобы показать результаты формы в той же статье содержание.
В этом уроке я покажу вам, как.
Потому что должен быть какой-то скрипт там манипулирует с данными формы я буду использовать плагин Jumi для этого в том числе скрипты в содержании. Если вы предпочитаете другой плагин для PHP-скрипт включения в Joomla! Содержание Вы можете использовать его.
Описание демо-формы
Хотя вид демо очень конкретного вы можете написать любой формы можно представить в подходе объяснить в этой статье.
Не делайте тесты на общедоступном сервере производства, но и на локальном хосте только!
Допустим, мы хотим
- форма голосования, которая собирает ответы на 3 взаимоисключающие вопросы,
- сохранить ответы в базе данных вместе с датой и временем ответа на этот вопрос и вместе с идентификацией пользователя,
- чтобы показать, "спасибо" объявление и резюме результатов, но только для тех пользователей, кто голосовал.
Основная стратегия
Разделение кода на несколько частей, функциональных и логических блоков дает много преимуществ. Хотя я не буду обсудили преимущества здесь я буду следовать этой общей хорошей практикой здесь.
Существуют две основные логические блоки в нашу задачу:
- показать образуют + сбор данных + + проверить их сохранения данных в базе данных (само форме вызовом)
- читать данные из базы данных и показывать результаты.
Так что я буду разделить наше приложение на два файла сценария также: self_call_form.php и show_results.php.
Мы будем вдаваться в подробности в следующем.
Но давайте начнем с базой данных, в первую очередь.
База данных
Пусть наши таблицы базы данных, имя xxx_mytable_test где ххх означает для Joomla! префикс базы данных. Некоторые Joomla! пользователи других Йос префикс имеют префикс мес. Я предполагаю, Йос префикс в следующем.
Я повторяю наша задача сохранить дату и время записи, идентификации пользователей и ответ.
Не вдаваясь в MySQL баз данных и таблиц дизайн деталей, которые можно найти в структуре таблиц описано в MySQL языке будет:
Инструкция CREATE TABLE IF NOT EXISTS `jos_mytable_test` ( `ID` Int (11) NOT NULL auto_increment, `` Recordtime даты NOT NULL по умолчанию "0000-00-00 00: 00: 00, `User_id` VARCHAR (15) NOT NULL по умолчанию "хозяин", `Ответить` Int (6) NOT NULL по умолчанию "0, PRIMARY KEY (`ID`) ) TYPE = MyISAM;
Поле идентификатор был добавлен только в таблице запись уникальной идентификации.
Вы должны создать таблицу в базе данных Joomla. Убедитесь, что ваш префикс jos_. Если он все еще mos_, изменить префикс таблиц.
В таблице можно создать с помощью PhpMyAdmin либо вручную, либо автоматически с помощью копирования и вставки заявления MySQL выше.
Я буду считать таблицу jos_mytable_test создается с этого времени.
self_call_form.php
Существуют два основных метода, посредством которого форма общения с окружающей средой: POST и GET. GET, передает (и читает) данные из URL приложения. Мы не будем использовать метод GET здесь.
Метод POST записывает данные в глобальные переменные PHP $ _POST. Итак, мы имеем полный доступ к данным, сюда.
Генеральный алгоритм self_call_form.php
Если нет соответствующих данных в $ _POST, то есть нет ответа от пользователя, а затем показать форму. Если пользователь ответил, то поблагодарить его и написать ответ (и других данных) в базе данных.
Алгоритм выше переведены на язык PHP выглядит этот код:
функция self_form() // Имя радиокнопки (здесь "ответ") тоже должно быть именем столбца в базе данных !!! { $ Якорь = "myform"; / / $ Якоря переменными мы должны будем позже эхо " "; / / HTML якорь нам понадобится позже эхо " "; / / Форма контейнера if(!Исеть($ _POST["Ответ"])) / / Если нет ответа, то писать виде { $ Return_url = Get_return_url($ Якорь); эхо " "; эхо " Вы нашли этот урок полезным? "; эхо " Абсолютно нет.\n"; эхо " Так-так.\n"; эхо " Да. Спасибо за это.\n"; эхо " "; эхо " "; } еще / / Если есть ответ благодарность и написать ответ в базе данных { эхо « Спасибо за голосование »; write_data($ _POST["Ответ"]); } эхо " "; }
Объяснения и некоторые хитрости
PHP функция Исеть ("ответ") проверяет "ответ" Погода существует в $ _POST.
Мы хотим, чтобы форма для отправки данных на себя. Это означает, что на тот же адрес URL (формы и ее обработка сценария можно найти на тот же адрес). Мы можем использовать жесткий кодированный адрес адрес страницы, или, как в нашем случае, мы можем получить URL из окружающей среды Joomla с помощью простого трюка. Используя хитрость лучше, чем первый жесткий кодированный подход, потому что наш код можно использовать повторно в различных страниц без прикосновения.
Так в чем здесь фокус, содержащихся в функции get_return_url ($ якорь).
Функция get_return_url ()
функция get_return_url($ Якорь) { if ($ Query_string = MosGetParam( $ _SERVER, 'QUERY_STRING', '' )) { $ Вернуться = 'Index.php? . $ Query_string; } еще { $ Вернуться = 'Index.php'; } / / URL-адрес начинается с index.php сейчас // преобразование & в & для соответствия xtml $ Вернуться = str_replace( '&', '&', $ Вернуться ); / / Добавление якорь в конце URL-адрес $ Вернуться .="# $ якорь"; / / Добавление якорь URL / / Http:// prepand в начале URL возвращение sefRelToAbs($ Вернуться); }
Существует никакого чуда в нем. Функция просто возвращает URL адрес, где она работает (в нашей форме). В том числе и якоря.
Почему я включил (HTML) якорь в обратный адрес?
Представьте себе, что наша форма в нижней части страницы очень долго. Если бы не якорь, то после отправки данных пользователь будет видеть в верхней части страницы и имеет для прокрутки вниз. С якоря пользователь будет вернуть на место, он проголосовал.
Я хотел бы обратить ваше внимание на Joomla! конкретные mosGetParam функции () тоже. Это самая полезная функция. И должны быть использованы в вас образуется интенсивно.
Общее описание mosGetParam () можно найти здесь. Один из практического использования следующим образом:
Вместо использования:
$ _POST ['SomeName']
что лучше использовать:
mosGetParam ($ _POST, 'SomeName)
потому что не только некоторые обрезки нежелательных вход пользователя, но есть и другие полезные опции в нем.
Однако, если у вас есть много данных, которые будут обрабатываться он может быть довольно много времени чахоточный вывести все значения из $ _POST один за другим: либо путем непосредственного доступа к ним или через mosGetParam () функцию. Существует еще одна хитрость: использовать PHP функция экстракт ($ _POST), который строит переменных и присваивает им имена все содержимое $ _POST.
Обратите внимание, мы используем $ _SERVER в функции get_return_url (). $ _SERVER Другой PHP глобальные переменные как $ _POST и могут быть некоторые использования в сценарии тоже. Если вы не знаете значения переменных вы можете показать их в своем сценарии с использованием var_dump ($ somoevaribale) функции.
Функция checkForm ()
Эта функция проверки JavaScript, которая проверяет ввод пользователя по отношению к некоторым правилам. Это письмо является на самом деле адрес электронной почты, это имя не пустой, и т.д.
Еще раз: вы можете найти различные сценарии проверки на источники сотни интернет.
В нашем демо-форме мы будем проверить, что пользователь выбрал "ответ" радио-кнопки. Если нет "ответ" не подают данные, но показывать предупреждение:
<SCRIPT type="текст / javascript"> функция checkForm(theForm) { вар Поэтому = ""; для (i=0; я) { if (theForm.answer[i]. Проверено) { вар checkvalue = theForm.answer[i]. Значение; перерыв; } } Поэтому + = checkRadio(checkvalue); if (почему! = "") { Поэтому + = "\nЕсли вы считаете, что это наша ошибка, сообщите нам, пожалуйста ».; предупреждение(Зачем); возвращение ложный; } возвращение правда; } функция checkRadio(checkvalue) { вар Ошибка = ""; if (!(checkvalue)) { Ошибка = "Вы не выбрали ни одного варианта.\n"; } возвращение ошибки; } ->
Есть нет трюков и никаких чудес здесь, так что пойдем к записи данных в базу данных.
Функция write_data ()
Вы можете сэкономить много времени, если вы используете Joomla! объекты и методы, а не с использованием стандартных баз данных MySQL функций. Я имею в виду использование базы данных-> нагрузки ..., базы данных-> запрос и т.д. Очень описательный руководство может быть найдено здесь.
функция write_data($ Значение) / / Если пользователь входит в систему сохранения его идентификатор иначе сохранить «хозяин» { Глобальный $ Базе данных, Мой $; if (Мой $->id) $ User_id = Мой $->id; еще $ User_id = "хозяин"; $ Базе данных->SetQuery( "INSERT INTO #__mytable_test (id, recordtime, user_id, answer) VALUES ('', '". данные("Y-м-д Н: я: S ')."','".$ User_id."','".$ Значение."');" ); $ Базе данных->запрос(); / / Запись данных }
Ничего интересного здесь, за исключением глобальных Joomla! Переменная $ моей. Она содержит идентификатор пользователя, имя, адрес своей электронной почты и т.д. И еще: попробуйте использовать var_dump ($ моей) в коде, и вы увидите структуру и содержание.
Проверка запроса:
Я не включил никакого подтверждения, что данные на самом деле написано. Вы можете сделать это, если хотите. Просто заменить строку $ базы данных> Запрос (); поif (!$ Базе данных->запрос()) { / / Запись данных, и если происходит ошибка предупреждение эхо " alert('".$ Базе данных->getErrorMsg()."'); "; }
Таким образом, у нас есть все строительные блоки нашего самостоятельного вызова форме сейчас.
Вы можете попробовать его сразу же (если у вас есть Йос или mos_mytable_test таблицы, созданной).
Но есть еще одна вещь ...
Не для всех нас поведение приложения будет, как обычно ожидается: после отправки формы будет по-прежнему видны и не будет "спасибо" объявления.
Это произойдет, для тех, чьи Joomla! Кэш включен.
А вот и еще одна хитрость: выключение всей кэш Joomla легко, но отключение кэша для одной из страниц Joomla, кажется, проблема.
Большая проблема с очень простое решение.
Кэш-хак был описан в Joomla! форум:
Редактировать / includes / Cache / Lite.php
Вы увидите "функция сохранения ($ данных ..."
изменение
функция спасти($ Данных, $ ID = NULL,, $ Группы = 'По умолчанию') { if ($ Этой-> _ кеширование) {
в
функция спасти($ Данных, $ ID = NULL,, $ Группы = 'По умолчанию') { if(strpos($ Данных,' ') ! == ложный) { $ Этой-> _ кеширование = 0; } if ($ Этой-> _ кеширование ) {
Затем, создайте модуль с
в организме, и опубликовать его на любой отображаются позиции (пользователь не увидит) ... Затем просто включите этот модуль на любой странице вы не хотите кэшировать ...
Я только добавил, что "NOCACHE директивы" могут быть включены в содержание.
Резюме self_call_form.php
Так что все содержимое self_call_form.php:
определенный( "_VALID_MOS" ) or умереть( "Ограничение доступа" ); / / По соображениям безопасности ?> <SCRIPT type="текст / javascript"> функция checkForm(theForm) { ... } функция checkRadio(checkvalue) { ... } -> функция self_form() { ... } функция get_return_url($ Якорь){ ... } функция write_data($ Значение){ ... } / / Исполнительный код начинается здесь self_form(); / / Исполнительного кодекса заканчивается ?>
NB: весь сценарий "завернуты" в исполнительной self_form () функции. Нет сценариев переменные определены вне какой-либо функции, поэтому нет риска переменных будет взаимодействовать с другими 3rd партии или Joomla! переменных в непредсказуемом направлении.
Уфф ...
Это все для себя форму вызова: показать форму сбора данных + + + проверить их сохранения данных в базе данных.
Теперь напишите в вашей статье
{Jumi [somepathway / self_call_form.php]}
и протестировать его.
Сначала вы увидите

и после голосования (только после голосования) Вы можете увидеть результат второй части (show_results.php):

Вторая часть - представление результатов, полученных из базы данных - это гораздо проще, чем предыдущая часть.
show_results.php
определенный( "_VALID_MOS" ) or умереть( "Ограничение доступа" ); функция show_results() { Глобальный $ Базе данных; эхо " "; / / Не обязательно, но полезно здесь $ Radios_name = "ответ"; / / Должен быть столбец в базе данных слишком! if(Исеть($ _POST[$ Radios_name])) {/ / Показать результаты для тех, кто проголосовал только эхо " "; эхо " Это руководство было "; $ Базе данных->SetQuery( "ВЫБЕРИТЕ $ radios_name, COUNT (id) AS numitems ИЗ #__myform_test GROUP BY $ radios_name"); $ Строк = $ Базе данных->loadObjectList(); Еогеасп ( $ Строк as $ Строки ){ / / Пешком через ответы переключатель ($ Строки->ответ){ дома 1: эхо "бесполезно для".$ Строки->numitems."читатели,\n"; перерыв; дома 2: эхо "так полезно для".$ Строки->numitems."читатели и\n"; перерыв; дома 3: эхо "очень полезно для".$ Строки->numitems."читатели\n"; перерыв; по умолчанию: } } эхо " "; } } show_results(); ?>
Теперь писать в содержимое только в соответствии с ранее заявление плагин Jumi:
{Jumi [somepathway / show_results.php]}
и протестировать его.
Я не думаю, что есть много для объяснения, кроме манипулирования базой данных и строк объектов. Опять же: перейти на Joomla! API описание.
Заключение
Все было решено, все было написано. Вы можете скачать весь сценарий здесь.