Konstantin

Konstantin

Был в сети 15 июня 2026, 19:21
Заказы не принимаю
Павел Романов
Павел Романов
Создайте плагин, в котором получайте значение TV и удаляйте директорию.
Если на удаление ресурса, то повесьте плагин на событие OnDocFormDelete, если на очистку корзины, то на OnBeforeEmptyTrash.

В первом случае есть объект ресурса и значение его TV можно получить через:
$resource->getTVValue('tvname');

Во втором — есть массив ID удаляемых ресурсов, которые можно использовать для получения объектов и дальше как в первом варианте.
Дмитрий Мансуров
Дмитрий Мансуров
Я дописал и поправил ваш код.
Теперь он не путается со сниппетом localizator и дружит с ТВ полями
Работает так
{9 | locfield : 'tv_name'}
Можно использовать id tv поля, можно имя (видно из кода)
Запилил я это все в плагин (проверено)
<?php

/** @var modX $modx */
switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
        /** @var Fenom $fenom
            Мы получаем переменную $fenom при его первой инициализации и можем вызывать его методы. 
            Например, добавим модификатор вывода имени домена сайта из произвольной ссылки.
        */
        $pdo = $modx->getService('pdoTools');

        // localizator
        $fenom->addModifier('locfield', function ($id, $field = null) use ($pdo, $modx) {
            $pdo->debugParserModifier($id, 'locfield');
            
            /** @var modResource $resource */
            if (empty($id)) {
                $resource = $modx->resource;
            } elseif (!is_numeric($id)) {
                $field = $id;
                $resource = $modx->resource;
            } elseif (!$resource = $pdo->getStore($id, 'resource')) {
                $resource = $modx->getObject('modResource', $id);
                $pdo->setStore($id, $resource, 'resource');
            }
            
            $key =  $modx->getOption('cultureKey');
            if( $modx->getOption('cultureKey') != 'ru' ) {
                $q = $modx->newQuery( "localizatorContent" );
                $q->where( array( "`resource_id` = '" . $id . "'", "`key` = '" . $key . "'" ) );
                $q->select( array( $field ) );
                $s = $q->prepare();  // print $q->toSQL(); die;
                $s->execute();
                $array = $s->fetch(PDO::FETCH_ASSOC);
                $field_value = $array[$field];
                if(empty($field_value)){
                    if(is_numeric($field)){
                        $tvId = intval($field);
                    }else{
                        $tvObj = $modx->getObject('modTemplateVar', array('name' => $field));
                        $tvId = $tvObj->get('id');
                    }
                    
                    $q = $modx->newQuery( "locTemplateVarResource" );
                    $q->where( array( "`contentid` = '" . $id . "'", "`key` = '" . $key . "'", "`tmplvarid` = '" . $tvId . "'" ) );
                    $q->select(  'value'  );
                    $s = $q->prepare();   
                    $s->execute();
                    $array = $s->fetch(PDO::FETCH_ASSOC);
                    
                    return $array['value'];
                }else{
                    return $field_value;
                }
                
            }
            
            $output = '';
            if (!empty($resource)) {
                if (!empty($field)) {
                    if (strtolower($field) == 'content') {
                        $output = $resource->getContent();
                    } else {
                        $output = $resource->get($field);
                        if (is_null($output)) {
                            $output = $resource->getTVValue(preg_replace('#^tv\.#i', '', $field));
                        }
                    }
                } else {
                    $output = $resource->toArray();
                }
            }
            $pdo->debugParserModifier($id, 'locfield');
            return $output;
        });
        break;
}
Галочку
pdoToolsOnFenomInit
не забудьте

И для страждущих getImageList (проверено)
[[getImageList?  &tpl=`why_we.tpl` &value=`[[*why_we]]`]]
или даже так, когда данные в другом ресурсе (не успел проверить, но вроде должно)
{'getImageList' | snippet : [
    'tpl' => 'why_we.tpl',
    'value' => (9 | locfield : 'tv_name')
]}
Баха Волков
Баха Волков
Серый
Серый
Александр
Александр
Вижу) спасибо огромное!
Если кому нужно, выкладываю скрипты:

Файл 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'] = 'option.item';
		//Дописать параметры для сниппета получающего результаты по вкусу			

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

		$result = array($snippetResult, 'success');
	}
	else {
		$result = array('Некорректный запрос', 'error');
	}
	
	if (!empty($result)) {
		die(json_encode($result));
	}

javascript:
<script type="text/javascript">
    	$(document).on('change', 'select[name="selector-1"]', function(e) {
    		if ($(this).val() != '') {
        			$.ajax({
        				type: "POST",
        				url: "assets/ajax/getlist.php",
        				data: {
        				    action: 'getList', 
        				    parent: $("select[name='selector-1']").val()
           		         },

        			success: function(response) {
        				var data = eval(response);
        
        				switch (data[1]) {
        					case 'success':
    						//Если все ок - вставляем результат во второй селектор
    						$("select[name='selector-2']").val("").html("<option value='' selected disabled>Выберите значение из списка</option>" + data[0])
    
        						break;
        							
        					case 'error':
    						//Если не ок - выводим ошибку (используется jGrowl)
        						$.jGrowl(data[0], {theme: 'error', position: 'center'});
        							
        						break;
        						
        					}
        				}
        			});
    		}
    	});
    </script>

Ну и html понятно:
<select name="selector-1">
    <option selected disabled>Выберите услугу</option>
    [[!pdoMenu?
    	&level=`1`
    	&parents=`2`
    	&tplOuter=`@INLINE [[+wrapper]]`
    	&tpl=`@INLINE <option value="[[+id]]">[[+menutitle]]</option>`
    ]]
</select>
<select name="selector-2">
    <option value="" selected disabled>Выберите врача</option>
</select>
Илья Уткин
Илья Уткин
Попробуйте поставить customExtra и сохранять формы в нем.

В форме заявок нужно добавить хук, назовём его, к примеру saveRequest
[[!FormIt?  
    &hooks=`saveRequest,email,redirect`  
    &emailTo=`your@mail.ru`  
    &emailSubject=`Заказ обратного звонка`
    &emailTpl=`tpl.mail.contact`
    &redirectTo=`5`
]]

В сниппете создадим объект и сохраним его
<?php
$modx->addPackage('customextra', $modx->getOption('core_path').'components/customextra/model/');
$request = $modx->newObject('customExtraItem');
$request->set('name', $_POST['name']);
$request->set('string1', $_POST['contact']);
$request->set('description', $_POST['text']);
$request->save();
return true;



ilyaut.ru/addons/very-easy-to-add-custom-objects-in-modx/