FormLister + AJAX #3: Как передать УРЛ и pagetitle?

Всем привет!

Осваиваюсь с FormLister, пока не всё понятно. Документацию читал, но не всё усёк :)

У меня в коде страницы есть форма, генерируемая вызовом сниппета FormLister. В форме два скрытых поля для УРЛа и pagetitle страницы:

<input type="hidden" name="url" value="[~[*id*]~]">
<input type="hidden" name="pagetitle" value="[*pagetitle*]">


В reportTpl код

<a href="[(site_url)][+url.value+]">[+pagetitle.value+]</a>


Событие сабмита формы перехватывается и данные отправляются Аяксом на отсутствующий УРЛ (Аякс способ №3), пример взял отсюда
<script>
   $(document).on('submit','#consult_frmwrapper form',function(ev){
      var frm = $('#consult_frmwrapper form');
      
      $.ajax({
         type: 'post',
         url: '/form_consult',
         data: frm.serialize(),
         success: function (data) {
            $('#consult_frmwrapper form').remove();
            $('#consult_frmwrapper').html( data );
         }
      });
      ev.preventDefault();
   });
</script>


На событии OnPageNotFound стоит плагин, который ловит этот УРЛ и снова запускает $modx->runSnippet('FormLister', ...) с точно такими же параметрами, как и первый вызов.

Вся эта конструкция нормально отрабатывает при первом вызове формы. Но если скажем форма не прошла валидацию, то второй вызов формы идет уже с несуществующего УРЛа /form_consult.

И естественно pagetitle и УРЛ не парсятся.

Есть ли способ изящно передать pagetitle и УРЛ страницы, с которой вызвана форма, на несуществующий адрес /form_consult? Возможно ли это сделать средствами FormLister?

14 комментариев

avatar
Мало реальных примеров в доках, и здесь, поэтому вопросы возникают.
avatar
если не ошибаюсь, то я как-то делал через параметр

parseDocumentSource
Обрабатывает чанки MODX-парсером.
Возможные значения — 0 или 1.
Значение по умолчанию — 0.
avatar
А у меня он стоит, этот параметр. Но когда форма «крутится» на несуществующей странице Аяксом — там и парсить-то нечего.

Нужно именно как-то передать УРЛ или ID той страницы, откуда произошел первоначальный вызов формы.
avatar
еще такую штуку придумал

<input type="hidden" value="[*pagetitle*]" data-value="[+itemTitle.value+]" name="itemTitle">
<input type="hidden" value="[(site_url)][~[*id*]~]" data-value="[+itemUrl.value+]" name="itemUrl">


можно потом заменить с помощью js значение параметра value, если data-value не пустое.
avatar

		<input type="hidden" value="[!if? &is=`[+itemTitle.value+]:empty` &then=`[*pagetitle*]` &else=`[+itemTitle.value+]`!]"  name="itemTitle">
		<input type="hidden" value="[!if? &is=`[+itemUrl.value+]:empty` &then=`[~[*id*]~]` &else=`[+itemUrl.value+]`!]" name="itemUrl">
avatar
Да, в итоге именно так и сделано, и это работает без JS.

P.S. Можно еще по HTTP Referer вычислять, но работает — и пусть, не буду заморачиваться.
avatar
Можно просто передать с формой id страницы, а в обработчике вызвать формлистер с параметром defaultsSources, подставив туда этот id.
avatar
Спасибо, только я не понял — топику-то за что минус. Задавать вопросы в нашем сообществе — это дурной тон?
avatar
Хотел коммент минусануть, да отвлекся и ткнул потом в топик (: Чтобы было не так обидно, напишу, как я поступаю в таких случаях:

$id = isset($_POST['id']) && is_numeric($_POST['id'])? (int)$_POST['id']: 0;
if ($id) {
    $params['defaultsSources'] = 'modResource:'.$id.':doc';
    $params['keepDefaults'] = 1;
}

return $modx->runSnippet('FormLister', $params);

Так в форме будут доступны поля с данными о документе с этим id: [+doc.pagetitle+], [+doc.id+] и т.д.

На странице, с которой отправляется форма:

<script>var docid = [*id*];</script>

и это значение передается в обработчик вместе с полями формы как поле с именем id. Если форма заранее выводится на странице из чанка, то можно просто в ней предусмотреть скрытое поле с именем id и значением [+doc.id+], а задать это значение при вызове чанка так:

{{feedbackFormTpl? &doc.id=`[*id*]`}}
Комментарий отредактирован 2018-04-05 18:57:39 пользователем Pathologic
avatar
не, нифига не пашет так. делал через сохранение значений полей через js, но это скорее хак, чем решение.
avatar
Поделитесь, чем закончилось? Тоже сижу мучаюсь с этим же примером и с этой же задачей — передать ссылку и pagetitle в чанке reportTpl.
  • paic
  • 0
avatar
Вариант от Pathologic работает!
Единственное изменение, которое внес — вместо
<code>$id = isset($_POST['id']) && is_numeric($_POST['id'])? (int)$_POST['id']: 0;</code>
просто
<code>$id = $_POST['id'];</code>
и
<code>var docid = [*id*];</code>
сразу внес в основной скрипт.
Комментарий отредактирован 2018-11-17 08:10:57 пользователем paic
avatar
Есть еще один вариант, пишем скрипт на стр вызова формы

<script>
$('.input_hidden').val('[*pagetitle*]');
</script>

В шаблоне формы пишем

<input type="hidden" class="input_hidden" name="title" value="[+title.value+]"/>

Через первый JS заполняем поле в первом вызове, а потом заполняем это поле при вызове AJAX
avatar
Это надо писать в форму через prepare
У меня сделано так: /form?page=[*id*]
в форме запущена prepare которая ставит по $_GET['id'] пару плейсхолдеров — название и полный путь к странице, которые закидываются в скрытые поля в форме. Даже при ошибке заполнения в [+page.value+] сохраняется ранее введенный обратный адрес.

$FormLister->setField('page',$url);
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.