MaxHub
Служба Заботы MaxSite CMS

Две формы на одной странице

Вопросы-ответы / 22 августа 2015

Если использовать больше одной формы на одной странице, происходит их "синхронизация". При отправке сообщения из одной формы, вторая тоже реагирует на это событие. Как сделать формы независимыми?

Формы сейчас подключаются так же, как на странице "Контакты" (посмотреть можно в shared/type/contact/contact.php):

$form = '[form]
[field]
require = 1   
type = text descripti имя
placeholder = Ваше имя
[/field]
[field] 
require = 1 
type = textarea  descripti вопрос
placeholder = О чем вы хотите написать?
[/field]
[/form]';
 
$form = str_replace("\r", "", $form);
$form = str_replace("\n", "_NR_", $form);
if (!function_exists('forms_content'))
{
 require_once(getinfo('plugins_dir') . 'forms/index.php');
}
 
echo forms_content(str_replace("_NR_", "\n", $form));
Комментариев: 5
  1. Думаю, что пока это невозможно сделать. Просто такое не предусмотрено в плагине forms. В плагине нет средств идентификации формы и логики распознавания источника присланных данных при обработке POST запроса от формы. Надо писать пожелание Максиму.

  2. А если "напильником" доделывать, меня бы пока и такой вариант устроил. В какую сторону смотреть? Я попытаюсь сама пока сделать, временный вариант.

  3. В какую сторону смотреть? Я попытаюсь сама пока сделать, временный вариант.

    Ну так в сторону кода плагина forms и смотреть wink Там разбросано по нескольким фрагментам места, где надо бы поправить, чтобы решить вашу задачу. Так что всё равно вам нужно ознакомиться со всем кодом плагина.

  4. Какие места отвечают за это? Попробую разобраться.

    Думаю, что проще код написать, чем заниматься объяснениями по этому вопросу, но времени особо нет. Поэтому попробую дать наводку.

    Во-первых, хорошо бы добавить форме параметр идентификации (эдакий form_id ). Найдите такой код в функции forms_content_callback и сделайте по аналогии:

    // email, как он будет показан в форме
    $r = preg_match_all('!\[email_title=(.*?)\]!is', $text, $all);
    if ($r)
     $email_title = trim(implode(' ', $all[1]));
    else
     $email_title = tf('Ваш email');

    Во-вторых, нужно передавать в функцию forms_show_form этот form_id и потом добавлять в html-код формы hidden поле, по аналогии с кодом:

    $out .= '<input type="hidden" name="forms_antispam2" value="' . $antispam2 * 765 . '">';

    В третьих, в функции forms_content_callback в коде:

    if ( $post = mso_check_post(array('forms_session', 'forms_antispam1', 'forms_antispam2', 'forms_antispam',
       'forms_name', 'forms_email',  'forms_submit' )) )
    {
     mso_checkreferer();

    нужно добавить проверку form_id и если распаресенное значение параметра не совпадает с присланным в $_POST, то игнорировать POST.

    Только нужно сделать всё так, чтобы без параметра form_id форма работала как обычно.

  5. Выше была логика для 0.862. В 0.90 логика плагина forms изменилась. Теперь параметр нужно задавать в секции [options] и нужно смотреть код (который отвечает за распознавание опции):

    $options ₌ mso_section_to_array₍$text, 'options', $def, true₎;

    Собственно, достаточно прописать в настройках формы примерно так:

    [options]
    email = admin@site.com
    form_id = first_form
    [/options]

    и form_id будет доступен в плагине.

    Тогда заботиться о передаче form_id в forms_show_form уже не нужно, т.к. он будет передан в рамках переменной $options.

    Остаётся только организовать вывод html и обработку POST. Приём POST теперь нужно смотреть в forms_content_post, но логика примерно такая же, как я и писал ранее.

Оставьте комментарий!

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

Вход / регистрация или войти без комментирования
  Имя и сайт используются только при регистрации

Авторизация MaxSiteAuth. Войти через loginza

(обязательно)