Всего 125 701 комментарий

Uladzislau
10 июня 2021, 23:17
0
Message:
Array
(
[0] => uri: Ресурс с ID 307 уже использует URI test-current. Пожалуйста, введите уникальный псевдоним или используйте «Заморозить URI», чтобы вручную заменить его.
[1] => alias: Ресурс с ID 307 уже использует URI test-current. Пожалуйста, введите уникальный псевдоним или используйте «Заморозить URI», чтобы вручную заменить его.
)

добавил новый с уникальным id и все равно тоже самое! Как решить проблему?
Uladzislau
10 июня 2021, 23:05
0
Array
(
[0] => uri: Ресурс с ID 306 уже использует URI test-current. Пожалуйста, введите уникальный псевдоним или используйте «Заморозить URI», чтобы вручную заменить его.
[1] => alias: Ресурс с ID 306 уже использует URI test-current. Пожалуйста, введите уникальный псевдоним или используйте «Заморозить URI», чтобы вручную заменить его.
)

таже самая ошибка. товар удалил кэш почистил. id убрал чтоб новый товар заполняло с новыми id.
может кто уже решил проблему?
Сергей Шлоков
10 июня 2021, 19:50
+2
Вот простейший сниппет, который вызывается на странице modx.local/download?file=dl.txt
if ($modx->user->isAuthenticated('web')) {
    $file = basename($_GET['file']);
    if (!empty($file) && file_exists(MODX_BASE_PATH . "assets/files/{$file}")) {
        header("Location: http://modx.local/assets/files/{$file}");
        exit();
    } else {
        header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
    }
} else {
    return 'Иди отседова.';
}
Скачивается только залогиненным пользователем. Гостю отворот-поворот.
Александр Мельник
10 июня 2021, 19:33
0
мне крыть нечем, это очень правильное замечание.
Сергей Шлоков
10 июня 2021, 19:31
+1
А как можно увидеть прямую ссылку? Ты её формируешь на странице download. Пользователь её не видит. А когда файл отдаётся на скачивание, то ссылка тоже не светится.

Вот для примера файл лежит в modx.local/assets/files/.


Т.е. перед тем, как отдать файл, ты проверяешь права. Так что левый пользователь не сможет загрузить его.
Александр Мельник
10 июня 2021, 19:20
0
Разумная идея, спасибо.
Тут уже включаются нюансы проекта. Такой способ конечно хорош, но он не исключает того, что один пользователь получит законно ссылку на скачивание файла и передаст тому, кто такого права не имеет.
И тут уже будут юридические нюансы ответственности, если службой безопасности предприятия будет доказано, что файл был незаконно получен именно с сайта (то есть может быть скачан по прямой ссылке) то ответственность будет нести разработчик. Если же один человек скачал законно файл, а потом передал его по почте тому, кто доступа к файлу не имеет — будет отвечать сотрудник это сделавший.
Сергей Шлоков
10 июня 2021, 18:48
0
Ясно. Тогда я бы сделал так — для проверенных пользователей выводил бы список файлов. Кликнул «скачать» — идёт переадресация на страницу site.ru/download?file=filename. На ней проверяются права, счётчик и идёт переадресация на статический файл. Nginx нужно настроить на скачивание файлов вместо отдачи. Таким образом, PHP не используется.
Проверил у себя на Apache, работает.
Александр Мельник
10 июня 2021, 18:21
0
Существенно ниже при отдаче как статики, около 15 процентов нагрузки на процессора от nginx процесса.
Конечно сервер самый простенький, но зато на нем более показательные получаются результаты. Раз одноядерный процессор может уйти в 100 процентов от отдачи одного файла, то значит нельзя рассчитывать только на вертикальное масштабирование сервера.
Даже если установить 16 ядер то 20 пользователей, которые примерно одновременно запросят на выдачу файл — уложат и 16 ядер легко.
Будем думать, к счастью время есть для поиска оптимального решения, возможно напишу линукс демон, который будет в фоновом режиме пережимать видео и с гигабайта останется 300 мегабайт.
Сергей Шлоков
10 июня 2021, 17:54
+1
Вроде норм. Подсмотреть логику скачиваний можно в FileAttach.
Сергей Шлоков
10 июня 2021, 17:49
0
А если для сравнения отдать как статику? Мне кажется, для раздачи больших файлов сервер слабоват.
Anton
10 июня 2021, 17:39
0
В общем, реализовал так:
1. Создал группы ресурсов и пользователей.
2. Создал ресурсы, к которым открыл доступы нужным группам (ведь 1 пользователь может состоять в нескольких группах).
3. С помощью сниппета «FileDownload R» сделал вывод нужной директории с ftp.
4. С помощью .htaccess закрыл листинг этой директории.
5. Ну и стандартная логин-форма из сниппета «Login».

Теперь вопрос. Это безопасно?
Александр Мельник
10 июня 2021, 17:04
0
Да, документация по функции readfile() не обманула, оперативной памяти расходуется мало в момент отдачи файла, но… процессор сервера кладет в 100%.
На сервере с такими характеристиками
«Процессор1 x 2.8 ГГц
Оперативная память 1 ГБ
NVMe 10 ГБ»
отдача даже одного файла приводит к полной загрузке процессора.
R2m0x94 (Vasily)
10 июня 2021, 14:44
0
Т.е сначала вызываю msProducts
&where=`{ "id:IN":[{$_modx->resource['dopid']}]}`

Далее
{'!msProductKits' | snippet : [
    'tplWrapper' => 'outerTpl',
    'mode' => 'owner',
    'tpl' => 'tpl.msProductKits.Item2',
    'sortby' => 'id',
    'sortdir' => 'asc',
]}
Хороший компонент. Спасибо :)
Наумов Алексей
10 июня 2021, 09:10
0
Вы же запускаете сниппет в контексте mgr, верно?
Там нет $modx->resource, здесь и возникает ошибка…
Роман
10 июня 2021, 09:04
0
Попробуйте в первую очередь почистить кэш. В админке есть фотографии у товаров? В базе посмотрите, в таблице modx_ms2_products, поля image и thumb. Есть ли там значения. Если что пишите на почту, помогу: nokerka[at]ya.ru
Игорь
10 июня 2021, 09:01
0
вот без этой строчки в сниппете:
$resource = intval($modx->getOption('resource', $scriptProperties, $modx->resource->get('id'), true));
работает почему-то
Наумов Алексей
10 июня 2021, 08:59
0
Добрый день.
Я так понимаю, у вас там некий файл с кодом, где нужны id товаров?

Сделайте запрос в бд напрямую, не запускайте сниппет.
Вот вырезка кода, только поправьте ее, я просто скопировал кусок:
// addPackage для загрузки модели
$modx->addPackage('msproductkits', MODX_CORE_PATH . 'components/msproductkits/model/');

// Build query
$c = $modx->newQuery('msProductKitItem');
$c->select($modx->getSelectColumns('msProductKitItem', 'msProductKitItem'));
$c->where(['active' => 1, $mode => $resource]);
$kitItems = $modx->getIterator('msProductKitItem', $c);
// далее foreach
Роман
10 июня 2021, 08:59
0
Есть поле createdby по нему и отбирайте.
Как-то так наверно:
[[pdoResources?
&parents=`0`
&tpl=`resourcesTpl`
&where=`{ "createdby":"1" }`
]]
Игорь
09 июня 2021, 21:09
0
Здравствуйте.
Есть форма распечатывания заказа из админки по методу modx.pro/howto/17280.
Пытаюсь добавить туда состав комплекта — мне нужно просто получить список id товаров, включенных в комплект. Но, почему-то сниппет
{$ids = $_modx->runSnippet('!msProductKits', ['mode' => 'owner','ids' => 1,'resource' => $prodid])}
в данном чанке не срабатывает (на страницах сайта во фронтенде работает нормально).
Как ещё можно получить id товаров из комплекта?