Death_Unlimited

Death_Unlimited

С нами с 01 октября 2017; Место в рейтинге пользователей: #1035
Death_Unlimited
08 октября 2017, 16:39
0
Сделал так как вы советовали через pdoResources
Соответственно нужно отказаться от загрузки формы из отдельного ресурса, а вставить её код прямо в шаблон
Но это получается что если у меня будет к примеру 10 модальных окон, все разного содержания и все их придется грузить через pdoResources? Неужели нет способа как-то это все сделать попроще? А насчет AjaxForm я так понял надо ресурс дополнительно в модальное окно вызывать через ajax, в общем какой-то Ajax в Аяксе и Аяксом погоняет)) Но что уж тут поделаешь, старый сайт просто переносится на MODx, а так как дизайн и верстка более менее да и система с кучей форм тоже уже приелась, то не хочется что либо кардинально менять в этом.
Death_Unlimited
08 октября 2017, 14:45
0
Ну вы же код не хотите показывать. Стандартное модальное окно Bootstrap не закрывается при нажатии на кнопку: getbootstrap.com/docs/3.3/javascript/#live-demo
Так вот ведь))
форма скопирована отсюда
Вся проблема в том что в стандартном модальном окне клавиша имеет type=«button», а тут же «submit».
Death_Unlimited
08 октября 2017, 13:45
0
А вообще мне достаточно было бы ответа на вопрос как убрать закрытие модального окна средствами bootstrap, при нажатии клавиши submit.
Death_Unlimited
08 октября 2017, 13:28
0
Хмм))) Да я то понимаю что ответ кроится буквально в 2-х — 5-ти строках кода посему спасибо, буду иметь в виду и если сам не справлюсь то обращусь)
Death_Unlimited
08 октября 2017, 13:18
0
Вот примерно как тут, только этот сайт на Bitrix, формы там на Ajax и грузятся они в модальное окно BOOTSTRAP с документа на который ведет ссылка. И если вы говорите что такое на MODx физически невозможно сделать стандартными средствами с использованием даже всех выше упомянутых плагинов, то грош цена тогда этому MODx-у. Потому как на том сайте все сделано стандартными либами.
Death_Unlimited
08 октября 2017, 12:57
0
Окей, а как просто убрать закрытие модалки средствами bootstrap при нажатии «submit» button, но чтобы сама клавиша так и продолжала выполнять свои функции. Суть в чем, я нашел практически решение первой проблемы:


$(document).on('af_complete', function(event, response) {
    if (response.success) {
	// 1. Просто закрыть
        $('#callBack').hide();
	// 2. Или с анимацией
        $('#callBack').fadeOut();
    }
 });

Но вот только как убрать стандартное закрытие модального окна по нажатию клавиши «submit»?

А сложности все в том что расчитывается использовать очень много форм в модальных окнах на одной странице, и в каждой будет находиться разная информация и разные поля, которые в свою очередь будут добавляться — редактироваться из админки. Поэтому не вижу другого выхода кроме как создание именно рессурсов с шаблоном в котором прописан AjaxForm с чанком формой.
Death_Unlimited
01 октября 2017, 21:20
0
Так в общем это мой косяк, засыпаю видать уже)) Ошибок понаделал просто капец, перед уходом только увидел, все работает спасибо огромное)
{\'migxFenom\' | snippet : [
\'data\'=>\'video\',		//что я пытался сюда передать сам не знаю))
\'chunk\'=>\'@INLINE
Death_Unlimited
01 октября 2017, 21:09
0
В общем дело не в экранированиии, попытался во втором вызове вынести вывод в файловый чанк, то же самое. Скорей всего if (!is_array($data)) { return ''; }, я со своим снипетом тоже чутка помучался, правда у меня ошибки сыпались хотя бы в лог, а тут просто ничего не выводит. Кстати если поменять на if (!is_array($data)) { return var_dump($data); } то вывод NULL, а вот так вот if (!is_array($data)) { return print_r($data); } выводит 1. И я не знаю как вы, а я наверное спать уже, утро вечера удалее как говорится) Так что спокойной ночи вам, завтра со свежими идеями лучше продолжать.
Death_Unlimited
01 октября 2017, 20:47
0
Да нет, вроде бы как массив, правда какой-то странный:
array(4) { [0]=> array(4) { ["MIGX_id"]=> string(1) "1"
["title_name"]=> string(25) "клиент Михаил"
["address"]=> string(67) "деревня"
["video"]=> string(98) "[{"MIGX_id":"1","youtube_video":"H1yHmaKTOrI"},
{"MIGX_id":"2","youtube_video":"asddasdsa2312312"}]" } }
переносы строк если что это уже я тут сделал. Обычно массив же в () таких скобках выводится.

Зато сейчас вижу что действительно, никуда регистр символов во втором MIGx не делся))
Death_Unlimited
01 октября 2017, 20:34
0
Что-то вообще ничего не выводит, и логи пустые даже не знаю куда смотреть.
Видимо:
if (!is_array($data)) { return ''; }
Скину полностью сюда содержимое чанка, он тестовый так что особо не пугайтесь)

{'migxFenom' | snippet : [
'migxtv'=>'migx_video_slider',
'chunk'=>'@INLINE 
						<li>
{\'migxFenom\' | snippet : [
\'data\'=>\'video\',
\'chunk\'=>\'@INLINE 
							<a class="fancybox fancybox.iframe video" href="https://www.youtube.com/watch?v={$youtube_video}"><img src="https://i1.ytimg.com/vi/{$youtube_video}/mqdefault.jpg" alt=""></a>
							<span>{$title_name}
<i>{$address}</i></span>\'
]}
						</li>']}
br скушивает))
Death_Unlimited
01 октября 2017, 20:20
0
Прошу прощения за дурацкий наверное вопрос, но вот такой вот формат экранирования кавычек в Fenom сработает?
{\'migxFenom\' | snippet : [
\'data\'=>\'video\',
\'chunk\'=>\'@INLINE тут код\'
]}
Death_Unlimited
01 октября 2017, 20:02
0
Не прочел этого сообщения прежде чем предыдущее написать, сейчас попробую еще раз, отпишусь если не отрублюсь за клавиатурой))
Death_Unlimited
01 октября 2017, 19:28
0
Нет, к сожалению если в чанке в data задать тег вложенного поля MIGx, то на выходе получаем вообще ничего. А так спасибо, если вы не против я некоторые моменты возьму на доработку своего сниппета)
Death_Unlimited
01 октября 2017, 19:12
0
А вложенный MIGx? В чанке второй раз запускать этот снипет и им через data выводить? И если под:
даже больше:
вы имеете в виду то что все символы json строки вложенного MIGx переводятся в нижний регистр, то согласен) А у меня к примеру во втором MIGx ссылка на видео youtube регистрозависимая, и как теперь ее выводить?

[{" migx_id":"1","youtube_video":"h1yhmaktori"},{"migx_id":"2","youtube_video":"asddasdsa2312312"}]
Еще и какой-то пробел появился перед migx_id.

Сейчас в чанке через data попробую, может тогда все нормально будет.
Death_Unlimited
01 октября 2017, 18:14
0
Кстати уже и косяк нашел.

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);
}
Death_Unlimited
01 октября 2017, 18:11
0
Вот в этой теме цитирую

Cyrax_02 11 декабря 2013, 14:31 # 0
Учитывая, что время работы парсера в сабжевых тестах не учитывается, получаем:

1)

$modx->pdoTools->getChunk($chunkName, array_merge($placeholders, $modx->placeholders), false);

// время: X сек (чанк обрабатывается полностью)
2)

$modx->pdoTools->getChunk($chunkName, $placeholders, false);

// время: 0.5X сек + время обработки $modx->placeholders парсером modx (чанк обрабатывается полностью)
3)

$modx->pdoTools->getChunk($chunkName, $placeholders, true);

// время: 0.2X сек (вложенные чанки и прочие теги не обрабатываются)
4)

$html = $modx->pdoTools->getChunk($chunkName, $placeholders, false);
$html = $modx->pdoTools->fastProcess($html);

// время: 0,5X (чанк обрабатывается полностью)
тестировали как я понял скорость обработки, ну я и глядя на самые маленькие цифры по обработке и с условием что «чанк обрабатывается полностью» и скопипастил оттуда этот кусок кода, при сознаюсь чем даже толком не разобравшись во всех тонкостях. Но как видите:
$html = $modx->pdoTools->getChunk($chunkName, $placeholders, false);
	$html = $modx->pdoTools->fastProcess($html);

	// время: 0,5X (чанк обрабатывается полностью)
Death_Unlimited
01 октября 2017, 17:08
1
0
В общем благодаря помощи Константина Ильина написал, а если быть точнее «намучал» я сниппет для обработки 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? Потому как сам я этой информации не нашел к сожалению((
так же думаю неплохо было бы добавить и мое совместное решение в шапку, если автор объявится естественно.
Death_Unlimited
01 октября 2017, 15:16
0
Выше человек мне уже вариант с конкатенацией подсказал)

Кстати:
$pdo->getChunk($chunk, $row, false);
Что устанавливает параметр false для getChunk и на что он влияет? нагуглить эту информацию что-то я не смог.

И если не составит не можете подсказать почему после
$rows = $modx->fromJSON($tv);

reset($rows);

$_first = key($rows);
в логи MODx сыпит ошибки вида
(ERROR @ C:\OSPanel\domains\...\core\cache\includes\elements\modsnippet\d66c42d1602cc2b078b0a95f7e22d5ae.include.cache.php : 31)
PHP warning: reset() expects parameter 1 to be array, null given
... //и так на все что я пытаюсь сделать с $rows
Хотя $rows на самом деле является массивом и проходит проверку is_array, и сам код отрабатывает нормально?
Death_Unlimited
01 октября 2017, 15:02
0
что-то быстрые правки у меня перешли в отлавливание ошибок, при чем ошибки в самом начале кода сниппета вида
PHP warning: reset() expects parameter 1 to be array, null given

PHP warning: key() expects parameter 1 to be array, null given
и т.д. То есть $rows = $modx->fromJSON($tv); не массив, потом попробовал $rows = json_decode($tv,1); ошибки не исчезли. Сделал проверку
$rows = json_decode($tv,1);

if (is_array($rows)) {
	echo 'это массив';
}else{
	echo 'это не массив';
}

reset($rows);

$_first = key($rows);
Говорит что массив но ошибки говорят иное)) Не пойму что не так?

Хотя код работает нормально не смотря на эти PHP warning.
Death_Unlimited
01 октября 2017, 13:12
0
Хм, даже не думал что так можно, в принципе сейчас чутка подправлю код для того чтобы и второй чанк можно было задавать и выложу сюда, вдруг кому пригодится. Спасибо за решение со вторым чанком)