Всего 125 679 комментариев

Сергей Шлоков
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 товаров из комплекта?
R2m0x94 (Vasily)
09 июня 2021, 18:05
0
В моём случае мне хватило вывести так (в tv на админке для возможных значений в списке):
<?php
// [[!tvLabelnameCountry? &tvVal=`[[+tv.vendor_address]]`]]
$tvArr = explode('||', $tvVal);

foreach($tvArr as $n => $v) {
   echo strstr($v, '=', true);
}

А, так как задача с поставщиками и производителями перешла на ms2 в связке с ресурсами, то пришёл к такому результату, так как с id-шниками не стал заморачиваться, но потребовалось просто вывести страну [[+vendor.country]]:
<?php
/**
 * Получаем страну производителя из настроек ms2 по имени $name. 
 * Если используется для поставщика, то имя может отсутствовать, поэтому ничего не выводим.
 * Если же необходимо получить по id, то 'name' заменить на 'id' (Тodo: Кастумизация)
 * 
 * $page = $modx->getObject('modResource', ['id' => 13]);
 * $output = $page->get('pagetitle');
 * 
 * return $output;
 * 
 * Пример вызова:
 * [[!msVendorCountry? &name=`{$purveyor | resource : "pagetitle"}`]]
 * {'!msVendorCountry' | snippet : ['name' => $purveyor | resource : "pagetitle"]}
 * 
 */

//$name = 'Sony';
$vendor = $modx->getObject('msVendor', ['name' => $name]);
if (!is_object($vendor)) {
    return '';
}
$output = ', '.$vendor->get('country');
return $output;

Код чанка в чанке с mFilter2:
{if $_pls['tv.purveyor']!= ''}
   {foreach $key as $purveyor index=$index}
        {$purveyor | resource : "pagetitle"}{'!msVendorCountry' | snippet : ['name' => $purveyor | resource : "pagetitle"]}
    {/foreach}
{/if}
Михаил
09 июня 2021, 12:34
0
Привет! Запоздалое (уезжал) большое спасибо, да костыль небольшой, зато работает как надо!
Александр Быковский
09 июня 2021, 11:50
0
Добрый день. Тоже подключился к данной теме по просьбе) Дополнения последние msMultiCurrency и Polylang. У У ссылок класс polylang-toggle как и в trigger. Событие OnTogglePolylangLanguage для плагина из документации. Но переключение валюты при смене языка не происходит
Роман
09 июня 2021, 09:12
0
Может просто добавить:
$modx->resource->set("dataMeta", $dataMeta);