Andrey

Andrey

Был в сети 27 апреля 2023, 14:37
Заказы принимаю
Максим Кузнецов
Максим Кузнецов
Скорее всего, придется расширять функцию saveComment в
core/components/tickets/model/tickets/tickets.class.php

Если использовать феном, то можно обойтись и без сниппета:
{foreach $thumbs | split as $thumb}
	<!--Получаем основное изображение из превью 120х120, к примеру -->
	
	<a href='{$thumb | replace : ".w120.h120" : ""}'>
		<img src='{$thumb}' width='120' height='120' />
	</a>
{/foreach}
Николай Загумённов
Николай Загумённов
Попробывал сделать так:
{$_modx->runSnippet('!TicketComments', [
    'showLog' => 1,
	'class' => 'TicketComment',
    	'loadModels' => 'UserFiles',
    	'leftJoin' => '{
        "Thumbs": {
            	"class": "UserFile",
            	"on": "Thumbs.list = TicketComment.id AND Thumbs.properties LIKE \'%w\":120,\"h\":90%\'"
        	}
    	}',
    	'select' => '{
        	"TicketComment": "*",
	        "Thumbs": "GROUP_CONCAT(Thumbs.url) as thumbs"
    	}',
    	'groupby' => 'TicketComment.id',
])}
В плейсхолдере thumbs получаю строку с картикками через запятую. Теперь осталось только сделать сниппет который будет обрабатывать эту строку.
Когда оставляю коментарий картинки не подгружаются сразу, надо обновить страницу, чтобы пути появились под комментом.
Как можно сделать чтобы они подгружались сразу?
P.S. Спасибо за GROUP_CONCAT()
Павел Гвоздь
Павел Гвоздь
Итого вот:

В tpl.Tickets.comment.form вызываем форму загрузки файла:
{$_modx->runSnippet('!ufForm', [
    'class' => 'modUser',
    'list' => 'comment-' ~ $thread,
    'tplForm' => 'uf.form',
    'dropzone' => '{
        "maxFilesize": 2,
        "maxFiles": 5,
        "acceptedFiles": ".jpg, .jpeg, .gif, .png",
        "template": "edit"
    }',
])}

Важный момент, который ты почему-то не упомянул:
Чанк uf.form переписываем так, чтобы там не было тега form (заменяем его на div):
<div class="userfiles-form-wrapper">
    <div class="userfiles-form userfiles-dropzone" id="[[+propkey]]" data-clickable=".userfiles-form-clickable-[[+propkey]]" data-sorting="1">
        <div class="dz-message needsclick">[[%userfiles_msg_needsclick]]</div>
    </div>
    <a class="userfiles-form-clickable userfiles-form-clickable-[[+propkey]]">[[%userfiles_msg_select_files]]</a>
</div>
Не знаю, насколько это правильно, но работает. :)

В tpl.Tickets.comment.one.auth и tpl.Tickets.comment.one.guest прописываем вывод файлов комментария:
{$_modx->runSnippet('!pdoResources', [
    'class' => 'UserFile',
    'loadModels' => 'UserFiles',
    'limit' => 10,
    'tpl' => '@INLINE
        <div class="item pull-left">
            <a href="{$url}" rel="fancybox"><img src="{$thumb}" alt=""></a>
        </div>
    ',
    'leftJoin' => '{
        "Thumb": {
            "class": "UserFile",
            "on": "Thumb.parent = UserFile.id AND Thumb.properties LIKE \'%w\":120,\"h\":90%\'"
        }
    }',
    'select' => '{
        "UserFile": "url",
        "Thumb": "Thumb.url as thumb"
    }',
    'where' => '{
        "UserFile.class": "modUser",
        "UserFile.list": "comment-' ~ $id ~ '"
        
    }',
    'sortby' => '{"rank":"ASC"}',
])}

И плагин будет выглядеть так:
switch ($modx->event->name) {
    case 'OnCommentSave':
        if ($mode == 'new' && $modx->user->isAuthenticated($modx->context->key)) {
            $corePath = MODX_CORE_PATH.'components/userfiles/';
            if ($uf = $modx->getService('UserFiles', 'UserFiles', $corePath.'model/userfiles/', array('core_path' => $corePath))) {
                if ($files = $modx->getCollection('UserFile', array('parent' => $modx->user->id, 'list' => 'comment-'.$object->Thread->name))) {
                    foreach ($files as $file) {
                        $file->set('list', 'comment-'.$object->id);
                        $file->save();
                        
                        if ($children = $file->getMany('Children')) {
                            foreach ($children as $child) {
                                $child->remove();
                            }
                            $file->generateThumbnails();
                        }
                    }
                }
            }
        }
        break;
}

Костыльно, признаю… но другого ничего в голову не пришло. Помоему, просто с текущей версией UserFiles никак по другому не реализовать прикрепление изображений к комментариям.

— Обновлено --

Данная реализация разбивает файлы по группам comment-[[+id]], что позволяет более проще получить к ним доступ в бекенде на странице UserFiles или на вкладке UserFiles страницы редактирования юзера.
Володя
Володя
создаете обработчик в VP:
  • тип — динамический ресурс
  • содержимое — [[$images]]
создаете маршрут в VP:
/images/{res:[0-9]+}/{thumb}/{rank:[0-9]+}
создаете чанк images:
содержимое
[[!images?
&tpl=`@INLINE <img src="[[+url]]">`
]]
создаете снгиппет images:
содержимое
<?php
if (!isset($_REQUEST['fastrouter'])) {return '';}
$ms2Gallery = $modx->getService('ms2gallery', 'ms2Gallery', MODX_CORE_PATH . 'components/ms2gallery/model/ms2gallery/');
if (!$modx->loadClass('pdoTools', MODX_CORE_PATH . 'components/pdotools/model/pdotools/', false, true)) {
	return false;
}
$pdoTools = new pdoTools($modx, $scriptProperties);
$f = $_REQUEST['fastrouter'];
if (!$File = $modx->getObject('msResourceFile', array(
    'resource_id' => $f['res'],
    'path' => $f['res']. '/' . $f['thumb'] . '/',
    'rank' => $f['rank']
    ))) {
    $modx->sendErrorPage();
}
$row = $File->toArray();
$scriptProperties['tpl'] = !empty($tplRow) ? $tplRow : '';
$pdoTools->setConfig(array_merge($default, $scriptProperties));
$output = empty($tpl)
	? '<pre>' . $pdoTools->getChunk('', $row) . '</pre>'
	: $pdoTools->getChunk($tpl, $row, $pdoTools->config['fastMode']);
if (!empty($toPlaceholder)) {
	$modx->setPlaceholder($toPlaceholder, $output);
}
else {
	return $output;
}
и все… радуетесь.
but1head
but1head
<?php
$end = $scriptProperties['end'];
$curday = strtotime(date('d.m.Y'));
$remaining_days = floor(($end-$curday)/(60*60*24));


if (!function_exists('numberEnd')) {
    function numberEnd($number, $titles) {
		$cases = array (2, 0, 1, 1, 1, 2);
    	return $titles[ ($number%100>4 && $number%100<20)? 2 : $cases[min($number%10, 5)] ];
	}
}


$number = $remaining_days; 


return $number.' д'. numberEnd($number, array('ень', 'ня', 'ней'));
Использование:
[[!timeleft? &end=`[[+unpub_date:strtotime`]]`]]
Василий Наумкин
Василий Наумкин
if ($modx->event->name == 'OnLoadWebDocument') {
	$section_root = 15;
	
	if ($modx->resource instanceof Ticket) {
		if ($category = $modx->resource->getOne('Section')) {
			if ($category->get('parent') == $section_root) {
				if (!$modx->user->isMember(array('Group1','Group2'))
					&& $modx->resource->get('createdby') != $modx->user->id
					&& $category->get('createdby') != $modx->user->id
				) {
					$modx->sendUnauthorizedPage();
				}
			}
		}
	}
	elseif ($modx->resource instanceof TicketsSection && $modx->resource->get('parent') == $section_root) {
		if (!$modx->user->isMember(array('Group1','Group2')) && $modx->resource->get('createdby') != $modx->user->id) {
			$modx->sendUnauthorizedPage();
		}
	}
}
Василий Наумкин
Василий Наумкин
Безопаснее настроить сервер по этой заметке — bezumkin.ru/blog/2012/06/18/13/

Запускать все сайты от одного юзера, или ставить 777 — одинаково небезопасно.
В любом случае это обозначает, что получив доступ к одному сайту, злоумышленник может накуралесить и на остальных.

Правильнее система: один сайт — один юзер, причем не www-data и не root. И права 755, 644. И отдельный доступ для этих юзеров через sftp, для работы с файлами.