Urdu Français
English English Deutsch Deutsch Español Español Français Français Italiano Italiano Nederlands Nederlands Português Português Русский Русский Ελληνικά Ελληνικά
Login



 
Добро пожаловать в Jumi! Учебник >> >> Самостоятельная вызова формы в Joomla! содержание

Существует много людей, которые хотят опубликовать свои собственные формы в 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]}

и протестировать его.

Сначала вы увидите

Jumi форма ввода

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

Форма выходного Jumi

Вторая часть - представление результатов, полученных из базы данных - это гораздо проще, чем предыдущая часть.

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 описание.

Заключение

Все было решено, все было написано. Вы можете скачать весь сценарий здесь, .