Konstantin

Konstantin

С нами с 24 декабря 2022; Место в рейтинге пользователей: #997
Дмитрий Мансуров
26 марта 2019, 02:40
1
0
Я дописал и поправил ваш код.
Теперь он не путается со сниппетом 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')
]}
Баха Волков
18 июля 2018, 10:48
1
0
а для строки в столбцах Collection помимо сниппета, еще добавил Collections.renderer.image
Не нужно.

Сделать нужно так,
<?php
$obj = json_decode($value);

return '<img src="stock-photo/' . $scriptProperties['row']['id'] . '/' . $obj[0]->image . '" />';
ну или как я написал выше
Серый
25 января 2018, 18:14
1
0
Вобщем, вот он, вот он рендер моей мечты:

Collections.renderer.imageplusmigx = function(value, metaData, record, rowIndex, colIndex, store) {
    if (value != '' && value != null) {
        var data = Ext.decode(value);
        var url = MODx.config.connectors_url + 'system/phpthumb.php?imageplus=1';
        
        var params = {};
        params.src = 'resourceimages/' + record.id + '/' + data.sourceImg.src;
        params.w = 100;
        if (data.sourceImg.src.indexOf('.png') !== -1) {
            params.f = 'png';
        }
        params.sw = data.crop.width;
        params.sh = data.crop.height;
        params.sx = data.crop.x;
        params.sy = data.crop.y;
        for (var i in params) {
            url += '&' + i + '=' + params[i];
        }
        return '<img alt="" src="' + url + '" width="' + (params.w || 80) + '">';
    }
}
Большое человеческое спасибо Алексею Ерохину!


Артем
10 января 2018, 19:35
1
0
Решение ниже:
1) Идем в файл core/components/collections/processors/mgr/resource/getlist.class.php
2) И комментируем строку 325 с текстом:
'class_key:!=' => 'CollectionContainer',
И будет вам счастье. Проверил у себя работает.
Илья Уткин
31 октября 2017, 11:22
3
+1
Я обычно как-то так делаю:

@EVAL return $modx->runSnippet('pdoResources', array(
	'parents' => 64,
	'limit' => 0,
	'tpl' => '@INLINE {$pagetitle}=={$id}',
	'outputSeparator' => '||',
	'sortby' => '{"menuindex":"ASC"}'
  ));
Виталий Серый
03 марта 2017, 22:43
4
+1
Все тоже самое, только тв запрашивать у требуемого ресурса.
{set $rows = json_decode(15 | resource : 'migx_tv', true)}
{foreach $rows as $row}
    {$row.image}
{/foreach}
Александр
08 августа 2016, 11:29
2
0
Вижу) спасибо огромное!
Если кому нужно, выкладываю скрипты:

Файл 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>
Дмитрий Танцирев
08 апреля 2016, 21:56
10
0
Может кому пригодится:

{"field":"published", "caption":"Чекбокс", "inputTVtype":"checkbox", "inputOptionValues":"Да==1"}

{"header": "Чекбокс", "dataIndex":"published", "show_in_grid":1, "renderer":"this.renderCrossTick"}
Илья Уткин
18 декабря 2015, 00:18
1
0
Попробуйте поставить 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/
Максим Кузнецов
28 июля 2015, 00:26
3
+3
1) По пунктам:
— При регистрации через Login нужно заносить пользователя в определенную группу (Users).
— Выставить группе анонимных пользователей права Load only на все контексты, где нужно запрашивать авторизацию
— Добавить в системной настройке unauthorized_page (403 ошибка) айди страницы с формой авторизации

После чего всех неавторизованных пользователей, при запросе на закрытую страницу, будет перебрасывать на страницу авторизации.

//Примечание: для альтернативы, если не нужна переадресация, можно создать простой сниппет (допустим, getAccess) и вызывать его на каждой странице.

Сниппет getAccess:
<?php
	$user = (!empty($userId)) ? $modx->getObject('modUser', $userId) : $modx->user;

	if (is_object($user) && $modx->user->isAuthenticated('web')) {
		return $content;
	}
	else {
		return $modx->getChunk('название_чанка');
	}
— соответственно, нужно создать чанк с формой авторизации и обозначить для сниппета параметр &content, в котором будет храниться html-код.

Пример:
<html>
	<head>
		[[$meta]]
	</head>
	<body>
		[[!getAccess? &content=`
			//ваш хтмл-код
		`]]
	</body>
</html>
(как альтернатива, можно переписать строчку сниппета «return $content» на «return $modx->getChunk($content);» — в таком случае, при вызове в поле &content нужно будет указывать название чанка, который отобразится авторизованному пользователю).

Из минусов такого метода — поисковые системы проиндексируют кучу дублей одинаковых страниц с формой авторизации.

2. modstore.pro/packages/ecommerce/payandsee — может быть, это вам поможет? В противном случае — придется настраивать свои сниппеты, завязанные на extend-полях пользователя.