Aleksandr Huz

Aleksandr Huz

С нами с 02 августа 2014; Место в рейтинге пользователей: #21
Илья
14 июля 2020, 13:15
1
0
Сделал так:
{'!pdoNeighbors' | snippet : [
    'class' => 'modResource',
        'loadModels' => 'ms2gallery',
        'leftJoin' => [
            'Image' => [
                'class' => 'msResourceFile',
                'on' => 'modResource.id = Image.resource_id AND Image.parent = 0 AND Image.rank = 0',
            ],
            'Thumb' => [
                'class' => 'msResourceFile',
                'on' => 'Image.id = Thumb.parent AND Thumb.path LIKE "%small%"',
            ]
        ],
        'select' => [
            'modResource' => '*',
            'Thumb' => 'Thumb.url as small',
        ],
    'tplWrapper' => '@INLINE {$prev}{$next}',
    'tplPrev' => '@INLINE <a href="/{$uri}"><img src="{$small}">туда</a>',
    'tplNext' => '@INLINE <a href="/{$uri}"><img src="{$small}">сюда</a>',
]}
В результате выводится первая миниатюра {$small} в pdoNeighbors
Может кому-то будет полезно.

Не дадим modxУ погибнуть!!!
Саша Туманов
20 апреля 2020, 22:05
1
+1
Вот готовое к использованию для вывода ленты юзера:

<?php
$cacheKey = "insta_".md5($url);

if (!$pdo = $modx->getService('pdoTools')) return false;
$returnCache = $modx->cacheManager->get("$cacheKey");
$data = '';

if(!$returnCache) {
	$doc = new DOMDocument();
	libxml_use_internal_errors(true);
	$doc->loadHTMLFile($url);
	libxml_clear_errors();
	$xpath = new DOMXpath($doc);
	$sharedData = $xpath->query("//html/body/script[1]")->item(0)->textContent;
	preg_match_all('/window\._sharedData = \{(.*)\};/ism', $sharedData, $matches);
	if (!empty($matches[1][0])) {
		$res = json_decode('{' . $matches[1][0] . '}', true);
		
		$media = array_slice($res['entry_data']['ProfilePage'][0]['graphql']['user']['edge_owner_to_timeline_media']['edges'], 0, $limit);
		if (!empty($media)) {
			foreach ($media as $row) {
				$data .= $pdo->getChunk($tpl, array(
					// 'image'     => $row['node']['display_url'],
					'thumb'     => $row['node']['thumbnail_src'],
					// 'thumb_150' => $row['node']['thumbnail_resources'][0]['src'],
					'thumb_240' => $row['node']['thumbnail_resources'][1]['src']
				));
			}
		}
	}
	$modx->cacheManager->set($cacheKey, $data, 7200*60);
	return $data;
}

return $returnCache;

И вызов:

{$_modx->runSnippet("@FILE snippets/parseInsta.php", [
	'url' => 'https://www.instagram.com/someuser/',
	'limit' => 4,
	'tpl' => '@INLINE <a href="{$thumb}" class="gallery__item"><img src="{$thumb_240}" alt=""></a>'
])}
Alexey Medvedev
12 мая 2019, 12:48
1
0
modx.pro/components/14066#comment-93796

Уже обсуждалась эта проблема.
Закомментируйте строчки 136-150 в файле core/components/tinycompressor/model/tinycompressor/tinycompressor.class.php

/* translate the name of the file */
                $fat = $this->modx->getOption('friendly_alias_translit');
                $friendly_alias_translit = (empty($fat) || $fat == 'none') ? false : true;
                $filename = modResource::filterPathSegment($this->modx, $pathInfo['filename']); //cleanAlias(translate)
                if ($friendly_alias_translit)
                {
                    $filename = preg_replace('/[^A-Za-z0-9_-]/', '', $filename); // restrict segment toalphanumeric characters only
                }
                $filename = preg_replace('/-{2,}/','-',$filename); // remove double symbol "-"
                $filename = trim($filename, '-'); // remove first symbol "-"
                $newPath = strtolower($filename . '.' . $pathInfo['extension']);
                if ($newPath !== $file['name']) {
                    $path = $basePath . $newPath;
                    $source->renameObject($oldPath, $newPath);
                }
Николай
22 марта 2019, 12:34
4
+5
Я вот таким вариантом пользуюсь:

<?php

if( in_array($modx->event->name, ['OnManagerPageInit','OnBeforeManagerLogin']) ) {
    $logpath = MODX_CORE_PATH . 'cache/logs/error.log';
    
    if( file_exists($logpath) ) {
        if(filesize($logpath) > 5000000) {
            $logcontent = file_get_contents($logpath);
            $filename = 'error-'. date("Y-m-d_H:i:s");
            
            $zip = new ZipArchive();
            $zip->open(MODX_CORE_PATH . 'cache/logs/'. $filename . '.zip', ZipArchive::CREATE);
            $zip->addFromString($filename . '.txt', $logcontent);
            $zip->close();        
            
            $modx->runProcessor('system/errorlog/clear');
        }
    }
}

Баха Волков
11 марта 2019, 17:20
2
0
По моему совсем не с той стороны зашли, ведь нужен всего лишь функционал загрузки файлов. Вот пример метода в modx.tree.directory.js:

,uploadFiles: function(btn,e) {
        if (!this.uploader) {
            this.uploader = new MODx.util.MultiUploadDialog.Dialog({
                url: MODx.config.connector_url
                ,base_params: {
                    action: 'browser/file/upload'
                    ,wctx: MODx.ctx || ''
                    ,source: this.getSource()
                }
                ,cls: 'ext-ux-uploaddialog-dialog modx-upload-window'
            });
            this.uploader.on('show',this.beforeUpload,this);
            this.uploader.on('uploadsuccess',this.uploadSuccess,this);
            this.uploader.on('uploaderror',this.uploadError,this);
            this.uploader.on('uploadfailed',this.uploadFailed,this);
        }
        this.uploader.base_params.source = this.getSource();
        this.uploader.show(btn);
    }
Нужно создать кнопку которая бы вызывала данный метод и всё. Ну не совсем всё, а остальные методы ошибки, методы которые возвращают id нужного источника и т.д., но это куда лучше чем стилизовать combo
Евгений Шеронов
15 января 2019, 15:33
1
+1
Настройка session_cookie_domain или session_cookie_path.
В настройки контекстов можете их тоже добавить.

Обычно как раз проблемы тогда, когда основной site_url(base_url) для WEB имеет какую-то вложенность, а в других контекстах нет. Поэтому настройки сессий тоже нужно править)
Денис
11 декабря 2018, 19:19
5
+5
Судя по исходникам просто так не выйдет.
Создайте плагин и повесьте на событие OnManagerPageBeforeRender
После вставьте следующий код:
<?php
switch ($modx->event->name) {
	case 'OnManagerPageBeforeRender':
        if($controller->config['controller'] == "mgr/orders") {
            if ($miniShop2 = $modx->getService('miniShop2')) {
                $modx->controller->addHtml('<style>.x-grid3-col-order-product-image img {width:40px;display:block;}</style>');
                $modx->controller->addHtml('
                    <script>
                        Ext.onReady(function(){
                            var originalGetColumns = miniShop2.grid.OrderProducts.prototype.getColumns;
                            miniShop2.config["default_thumb"] = miniShop2.config["defaultThumb"];
                            Ext.override(miniShop2.grid.OrderProducts,{
                                getColumns: function () {
                                	var imgFields = [ "product_thumb", "product_image" ];
                                    var columns = originalGetColumns.apply(this);
                                    for(var i=0; i<columns.length; i++){
                                    	if(imgFields.indexOf(columns[i]["dataIndex"]) != -1){
                                    		columns[i]["renderer"] = miniShop2.utils.renderImage;
                                    		columns[i]["id"] = "order-product-image";
                                    	}
                                    }
                                    return columns;
                                }
                            });
                        });
                    </script>
                ');
            }
        }
    break;
}

Если в системной настройке ms2_order_product_fields указан product_thumb или product_image, то вы увидите уже не ссылку, а картинку.
Альберт
10 декабря 2018, 16:22
1
+1
Итак, вопрос решил таким образом:

1. Создал плагин msCustomOrdersList:
switch ($modx->event->name) {
    case 'msOnManagerCustomCssJs':
        if ($page != 'orders') return;
        	$modx->controller->addLastJavascript(MODX_ASSETS_URL.'components/mscustomorderslist/default.js');
    break;
}

2. В файле assets/components/mscustomorderslist/default.js:
Ext.ComponentMgr.onAvailable('minishop2-grid-orders', function(){
    this.baseParams.action = "mgr/orders/customgetlist";
});

3. В папке создал файл core/components/minishop2/processors/mgr/orders/customgetlist.class.php, который полностью копирует оригинальный getlist.class.php, а дальше уже идут мои изменения: название города в списке заказов, отключение кнопки «удалить» для менеджеров, разделение заказов по городам для менеджеров.
Василий Наумкин
25 ноября 2018, 15:53
4
+8
На всякий случай, тестировать можно и без создания дополнительных сниппетов.
[[!msGetOrder?
    &id=`2404`
    &tpl=`tpl.msEmail.new.user`
]]

Вызвать в ресурсе с пустым шаблоном:
Дмитрий
22 июля 2018, 23:19
4
+5
Да, Сергей! Вчера поставил на все сайты! Теперь думаю, как жил без этого раньше =)

Кому интересно – вот инструкция:
У меня хостер в панели предлагает запаролить папку.