Вот примерно как тут, только этот сайт на Bitrix, формы там на Ajax и грузятся они в модальное окно BOOTSTRAP с документа на который ведет ссылка. И если вы говорите что такое на MODx физически невозможно сделать стандартными средствами с использованием даже всех выше упомянутых плагинов, то грош цена тогда этому MODx-у. Потому как на том сайте все сделано стандартными либами.
$(document).on('af_complete', function(event, response) {
if (response.success) {
// 1. Просто закрыть
$('#callBack').hide();
// 2. Или с анимацией
$('#callBack').fadeOut();
}
});
Но вот только как убрать стандартное закрытие модального окна по нажатию клавиши «submit»?
А сложности все в том что расчитывается использовать очень много форм в модальных окнах на одной странице, и в каждой будет находиться разная информация и разные поля, которые в свою очередь будут добавляться — редактироваться из админки. Поэтому не вижу другого выхода кроме как создание именно рессурсов с шаблоном в котором прописан AjaxForm с чанком формой.
тестировали как я понял скорость обработки, ну я и глядя на самые маленькие цифры по обработке и с условием что «чанк обрабатывается полностью» и скопипастил оттуда этот кусок кода, при сознаюсь чем даже толком не разобравшись во всех тонкостях. Но как видите:
В общем благодаря помощи Константина Ильина написал, а если быть точнее «намучал» я сниппет для обработки MIGx полей) Просьба не судить строго так как это мой первый сниппет, да и в PHP я силен на уровне чтения документации и просмотра видео уроков в процессе написания кода. А хотя можете и строго судить))
Сниппет предназначен для использования синтаксиса Fenom в чанках, если Fenom не используется то getImageList справится лучше, хотя надеюсь что благодаря парсеру pdoTools этот сниппет будет работать быстрее.
<?php
//$docid - id документа, если не задано берем id текущего документа
//$tvname - поле MIGx
//$tv_in - поле вложенного MIGx
//$chunk - чанк или @INLINE
//$chunk_in - чанк для вывода вложенного MIGX
if (empty($docid)) {
$docid = $modx->resource->get('id');
}
$pdo = $modx->getService('pdoTools');
$tv = $modx->getObject('modResource',$docid);
$tv = $tv->getTVValue($tv_name);
$rows = json_decode($tv,1);
if (is_array($rows)) { //без этого почему то reset() key() им подобные и даже сам цикл ругались что
//в $rows не массив, подозреваю что из-за того что массив содержит json
//строку вложенного MIGx
reset($rows);
$_first = key($rows);
end($rows);
$_last = key($rows);
$total = count($rows);
foreach ($rows as $key => $row) {
$row['idx'] = $key+1;
$row['total'] = $total;
if ($key === $_first)
$row['_first'] = 1;
if ($key === $_last)
$row['_last'] = 1;
if ($key % 2)
$row['_alt'] = 1;
if(!empty($tv_in) && !empty($row[$tv_in])) {
$subArr = $modx->fromJSON($row[$tv_in]);
if (is_array($subArr)) { //аналогичная причина что и выше, плюс дополнительная
//проверка вдруг у нас тут обычное поле
reset($subArr);
$sub_first = key($subArr);
end($subArr);
$sub_last = key($subArr);
$sub_total = count($subArr);
foreach ($subArr as $keySub => $subRow) {
$subRow['idx'] = $keySub+1;
$subRow['total'] = $sub_total;
if ($keySub === $sub_first)
$subRow['_first'] = 1;
if ($keySub === $sub_last)
$subRow['_last'] = 1;
if ($keySub % 2)
$subRow['_alt'] = 1;
$row[$tv_in] = '';
if (empty($chunk_in)) {
$row[$tv_in] .= '<pre>' . $pdo->getChunk('', $subRow) . '</pre>';
} else {
$preout = $pdo->getChunk($chunk_in, $subRow, false);
$row[$tv_in] .= $pdo->fastProcess($preout); //без знака конкатенации "." перед "=" выведет только последний элемент!
}
}
}
}
if (empty($chunk)) {
$output .= '<pre>' . $pdo->getChunk('', $row) . '</pre>';
} else {
$html = $pdo->getChunk($chunk, $row, false);
$output .= $pdo->fastProcess($html); //без знака конкатенации "." перед "=" выведет только последний элемент!
}
}
}
//echo number_format(microtime(true) - $modx->startTime, 4), 's\<br\>';
//echo number_format(memory_get_usage() / 1048576, 4), 'mb\<br\>';
//return print_r($rows);
return $output;
Вызывается он вот так вот:
{'@FILE snippets/migX.php' | snippet : [
'tv_name'=>'migx_tv', //главное MIGx поле
'tv_in'=>'migx_in_tv', //вложенное MIGx поле
'chunk'=>'@FILE chunks/chunk.html', //чанк для вывода главного MIGx в котором будет содержаться уже обработанный chunk_in
'chunk_in'=>'@INLINE {$in_migx_in_tv}']} //чанк для вложенного MIGx поля в котором выводим поля вложенного MIGx(извиняюсь за тавтологию)
Естественно вызывать сниппет можно как вашей душе угодно, так же как и вложенный чанк вызывать из файла, вроде проблем не было. @INLINE тут просто для примера. В главном чанке просто вызываем вложенный MIGx и у нас на его место подставляется обработанный chunk_in в таком виде в каком вы его задали, с выводом полей вложенного MIGx.
Буду рад если укажите на мои ошибки или способы улучшить сниппет.
P.S. Еще раз спасибо кто помогал мне в написании сего сниппета.
А так же буду благодарен доброму человеку который объяснит для чего в:
$pdo->getChunk($chunk, $row, false);
параметр false? Потому как сам я этой информации не нашел к сожалению((
так же думаю неплохо было бы добавить и мое совместное решение в шапку, если автор объявится естественно.
Но это получается что если у меня будет к примеру 10 модальных окон, все разного содержания и все их придется грузить через pdoResources? Неужели нет способа как-то это все сделать попроще? А насчет AjaxForm я так понял надо ресурс дополнительно в модальное окно вызывать через ajax, в общем какой-то Ajax в Аяксе и Аяксом погоняет)) Но что уж тут поделаешь, старый сайт просто переносится на MODx, а так как дизайн и верстка более менее да и система с кучей форм тоже уже приелась, то не хочется что либо кардинально менять в этом.
Вся проблема в том что в стандартном модальном окне клавиша имеет type=«button», а тут же «submit».
Но вот только как убрать стандартное закрытие модального окна по нажатию клавиши «submit»?
А сложности все в том что расчитывается использовать очень много форм в модальных окнах на одной странице, и в каждой будет находиться разная информация и разные поля, которые в свою очередь будут добавляться — редактироваться из админки. Поэтому не вижу другого выхода кроме как создание именно рессурсов с шаблоном в котором прописан AjaxForm с чанком формой.
переносы строк если что это уже я тут сделал. Обычно массив же в () таких скобках выводится.
Зато сейчас вижу что действительно, никуда регистр символов во втором MIGx не делся))
Видимо:
Скину полностью сюда содержимое чанка, он тестовый так что особо не пугайтесь)
br скушивает))
вы имеете в виду то что все символы json строки вложенного MIGx переводятся в нижний регистр, то согласен) А у меня к примеру во втором MIGx ссылка на видео youtube регистрозависимая, и как теперь ее выводить?
Еще и какой-то пробел появился перед migx_id.
Сейчас в чанке через data попробую, может тогда все нормально будет.
тестировали как я понял скорость обработки, ну я и глядя на самые маленькие цифры по обработке и с условием что «чанк обрабатывается полностью» и скопипастил оттуда этот кусок кода, при сознаюсь чем даже толком не разобравшись во всех тонкостях. Но как видите:
Сниппет предназначен для использования синтаксиса Fenom в чанках, если Fenom не используется то getImageList справится лучше, хотя надеюсь что благодаря парсеру pdoTools этот сниппет будет работать быстрее.
Вызывается он вот так вот:
Естественно вызывать сниппет можно как вашей душе угодно, так же как и вложенный чанк вызывать из файла, вроде проблем не было. @INLINE тут просто для примера. В главном чанке просто вызываем вложенный MIGx и у нас на его место подставляется обработанный chunk_in в таком виде в каком вы его задали, с выводом полей вложенного MIGx.
Буду рад если укажите на мои ошибки или способы улучшить сниппет.
P.S. Еще раз спасибо кто помогал мне в написании сего сниппета.
А так же буду благодарен доброму человеку который объяснит для чего в:
параметр false? Потому как сам я этой информации не нашел к сожалению((
так же думаю неплохо было бы добавить и мое совместное решение в шапку, если автор объявится естественно.
Кстати:
Что устанавливает параметр false для getChunk и на что он влияет? нагуглить эту информацию что-то я не смог.
И если не составит не можете подсказать почему после
в логи MODx сыпит ошибки вида
Хотя $rows на самом деле является массивом и проходит проверку is_array, и сам код отрабатывает нормально?
и т.д. То есть $rows = $modx->fromJSON($tv); не массив, потом попробовал $rows = json_decode($tv,1); ошибки не исчезли. Сделал проверку
Говорит что массив но ошибки говорят иное)) Не пойму что не так?
Хотя код работает нормально не смотря на эти PHP warning.