Владимир

Владимир

С нами с 28 декабря 2012; Место в рейтинге пользователей: #53
Василий Столейков
30 августа 2016, 16:03
2
+2
А в чём собственно вопрос-то?
Как сохранить данные из чекбокса в тв-шку jenrebook?

Создаёшь плагин на событие OnDocFormSave и радуешься жизни:
<?php
if($resource->class_key == 'Ticket' && $modx->event->name == 'OnDocFormSave' && $modx->context->key != 'mgr'){

    if(!empty($_POST['jenrebook'])) {
        $jenrebook = implode('||',$_POST['jenrebook']);
    	if (!$resource->setTVValue('jenrebook', $_POST['procent'])) {
    		$modx->log(xPDO::LOG_LEVEL_ERROR, 'jenrebook - ERROR');
    	}       
    } else {
    	if (!$resource->setTVValue('jenrebook', '') ) {
    		$modx->log(xPDO::LOG_LEVEL_ERROR, 'jenrebook - ERROR');
    	}       
    }
    $modx->cacheManager->refresh();
}
Павел Гвоздь
27 августа 2016, 13:30
1
+1
А там всего лишь заменить getCollection на getIterator. Вот здесь есть статья об этом.
Илья Уткин
16 августа 2016, 17:02
1
0
У меня всё нормально на нескольких сайтах. Только я в cache_prefix не использую слеш. У меня префикс, например, skaminy_
Сергей Шлоков
15 августа 2016, 11:42
1
+3
Это и раньше работать не могло, если только Вы ошибки без восклицательного знака вызывали.
Могло и может. Всё очень просто. Парсер по умолчанию гоняет 10 циклов. Если за 9 циклов он не обработает какой-нибудь плейсхолдер, то на 10-й раз он его удалит.
В данном случае, парсер в первом проходе проверяет плейсхолдер [[!+cp.error_message]]. Он пустой, поэтому остается не обработанным. Далее обрабатывается тег сниппета. Он (сниппет) выставляет этот плейсхолдер. Во втором цикле парсер проверяет оставшиеся плейсхолдеры и на этот раз распарсивает этот плейсхолдер.
А когда используется фильтр notempty, то плейсхолдер обрабатывается сразу же. Т.е. парсер на первом цикле вернет или пустое значение или указанное в фильтре. На втором круге парсить уже нечего.
Как-то так.
Илья Уткин
13 августа 2016, 17:18
1
+1
<?php
$contexts = $modx->getCollection('modContext',array('key:NOT IN' => array('web', 'mgr')));
foreach($contexts as $cx) {
    print_r($cx->toArray());
}
Максим Кузнецов
08 августа 2016, 10:34
3
+3
Реализовать ajax-запрос. Примерно вот так:

1. Вешаем на событие переключения селектора скрипт, который будет выполнять ajax-запрос:
<script>
	var canClick = true;

	$(document).on('change', 'select[name="selector-1"]', function(e) {
		if ($(this).val() != '' && canClick = true) {
    			$.ajax({
    				type: "POST",
    				url: "assets/ajax/getlist.php",
    				data: {
    					action: 'getList', 
    					parent: $("select[name='selector-1']").val()
       		        	},
    			
    				beforeSend: function(){
					canClick = false;
    				},
    			
    				success: function(response) {
    					var data = eval(response);
    
    					switch (data[1]) {
    						case 'success':
							//Если все ок - вставляем результат во второй селектор
							$("select[name='selector-2']").html("<option value='' selected disabled>Выберите значение из списка</option>" + data[0]).val("");

    							break;
    							
    						case 'error':
							//Если не ок - выводим ошибку (используется jGrowl)
    							$.jGrowl(data[0], {theme: 'error', position: 'center'});
    							
    							break;
    						
    					}

					canClick = true;
    				}
    			});
		}
	});
</script>

2. Создаем файл (в моем примере assets/ajax/getlist.php), на который ссылается скрипт и который будет возвращать нам результат:
<?php
	if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest' || empty($_POST['action'])) {
		return;
	}

	define('MODX_API_MODE', true);

	require dirname(dirname(dirname(__FILE__))) . '/index.php';
	
	$modx->getService('error','error.modError');
	$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
	$modx->setLogTarget('FILE');
	
	
	if ($_POST['action'] == "getList" && isset($_POST['parent'])) {
		//Получаем значение для второго селектора
		$snippetParams = array();
		$snippetParams['parents'] = intval($_POST['parent']);
		$snippetParams['tpl'] = '@INLINE <option value="[[+menutitle]]">[[+menutitle]]</option>';
		//Дописать параметры для сниппета получающего результаты по вкусу			

		$snippetResult = $modx->runSnippet('pdoResources', $snippetParams);

		$result = array($snippetResult, 'success');
	}
	else {
		$result = array('Некорректный запрос', 'error');
	}
	
	if (!empty($result)) {
		die(json_encode($result));
	}
Максим Кузнецов
06 августа 2016, 15:29
1
+2
1. Документация — плейсхолдеры, не соответствующие правилу наименования переменных в PHP
{$_pls['150x150']}

2. на ваш вкус — url просто более короткий и читаемый вызов этой же самой функции
Володя
05 августа 2016, 22:35
21
+5
можно добавить так
создать плагин на pdoToolsOnFenomInit, в нем добавить модификатор detector
<?php
switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
    if (!$fenom = $modx->getOption('fenom', $scriptProperties)) {
        return;
    }
    if (!$MobileDetect = $modx->getService('mobiledetect', 'MobileDetect', MODX_CORE_PATH . 'components/mobiledetect/')) {
	    return;
    }
    
    $key = $MobileDetect->config['force_browser_variable'];
    $device = !empty($_GET) && array_key_exists($key, $_GET)
		? $modx->stripTags($_GET[$key])
		: '';
	if (empty($device)) {
	    $device = $MobileDetect->getSettings();
    }
    if (empty($device)) {
        $detector = $MobileDetect->getDetector();
        $device = ($detector->isMobile() ? ($detector->isTablet() ? 'tablet' : 'mobile') : 'standard');
        $MobileDetect->saveSettings($device);
    }

    $fenom->addModifier("detector", function ($value) use ($device) {
        return $value == $device;
    });

    break;
}

и теперь в любом месте можно делать так
{if 'mobile'|detector}
mobile
{/if}

{if 'tablet'|detector}
tablet
{/if}

{if 'standard'|detector}
standard
{/if}
Илья Уткин
05 августа 2016, 11:17
1
+2
Простым языком: если при удалении главного объекта, второстепенные (связанные с ним) объекты тоже должны удалиться, то нужна связь Composite, если нет — Aggregate
Игорь Терентьев
02 августа 2016, 14:29
1
+3
Хорошее дополнение.
Но если нужно все под себя настроить, то лучше использовать парочку скриптов, описанных здесь.
Для установки дополнений:
gist.githubusercontent.com/ig0r74/80c27500e9c28d1261d3/raw/fbf095e0be76f84ee103775a2ba773695738f643/packages.php
Для настроек, TV, чанков и т.д.: gist.githubusercontent.com/ig0r74/722b2a14d57ca100d906/raw/9daf4e3f847a9be58239729cc27fc057db34304f/settings.php