Сохранить в tv результат работы сниппета или php-скрипта
Добрый вечер, уважаемые!
Суть вопроса — на странице хочу выводить размер файла PDF в МБ с дочерней страницы. Сделал это через сниппет. Но мне надо одновременно вывести значение для 100 файлов. Т. к. размер файла — это неизменное число, то решил его поместить в tv поле у каждой дочерней страницы страницы. А потом просто выводить значение tv поле.
Подскажите, как мне решить этот вопрос? То ли записать результат работы сниппета в tv поле, то ли записать в него результат работы php-скрипта (что одно и тоже). Или может еще как-то можно.
Спасибо за ответы!
Суть вопроса — на странице хочу выводить размер файла PDF в МБ с дочерней страницы. Сделал это через сниппет. Но мне надо одновременно вывести значение для 100 файлов. Т. к. размер файла — это неизменное число, то решил его поместить в tv поле у каждой дочерней страницы страницы. А потом просто выводить значение tv поле.
Подскажите, как мне решить этот вопрос? То ли записать результат работы сниппета в tv поле, то ли записать в него результат работы php-скрипта (что одно и тоже). Или может еще как-то можно.
Спасибо за ответы!
Комментарии: 9
Если правильно понял, можно воспользоваться компонентом FileAttach. Он позволяет вывести размеры файлов.
О мамочки, нахрена, извините за грубость, пихать какие-то данные, которые легко вычислить, в отдельное поле? Захламлять БД, усложнять логику, мучать менеджеров? Можно написать простенький сниппет, хотя бы типа такого:
<?php
clearstatcache();
$size = filesize(MODX_BASE_PATH.'files/'.$input);
if ($size > 1024){
$s = $size / 1024;
$unit = 'Кб';
if ($s > 1024){
$s = $s / 1024;
$unit = 'Мб';
}
$s = round($s);
} else {
$s = $size;
$unit = 'байт';
}
return $s.' '.$unit;
А потом выводить (тоже, как просто пример): {var $filesize = $_modx->runSnippet('@FILE:snippets/getFilesize.php',[
'input' => $file.file
])}
<span class="files-list__item-size">{$filesize}</span>
Ну или можно FileAttach использовать, что тоже очень хорошо.
у меня был такой простенький сниппет. Вот результат работы со сниппетом:
Время потраченное на запросы к базе данных — 0.0016 s;
Количество запросов к базе данных — 3;
Время потраченное на работу PHP скриптов — 21.1095 s;
Общее время потраченное на генерацию страницы — 21.1111 s.
А вот без сниппета:
Время потраченное на запросы к базе данных — 0.0010 s;
Количество запросов к базе данных — 3;
Время потраченное на работу PHP скриптов — 0.2820 s;
Общее время потраченное на генерацию страницы — 0.2830 s.
Думаю, если значение будет в tv поле, то производительность будет выше. Если выбирать между производительностью и полем в БД — я выберу производительность.
Время потраченное на запросы к базе данных — 0.0016 s;
Количество запросов к базе данных — 3;
Время потраченное на работу PHP скриптов — 21.1095 s;
Общее время потраченное на генерацию страницы — 21.1111 s.
А вот без сниппета:
Время потраченное на запросы к базе данных — 0.0010 s;
Количество запросов к базе данных — 3;
Время потраченное на работу PHP скриптов — 0.2820 s;
Общее время потраченное на генерацию страницы — 0.2830 s.
Думаю, если значение будет в tv поле, то производительность будет выше. Если выбирать между производительностью и полем в БД — я выберу производительность.
Специально ради вас открыл один сайт, где у меня в корне прошлыми разработчиками было вывалено 320 файлов разного формата и разного размера. И код ниже, который проходит по 324 файлам и вычисляет их размер, выполняется за 0.0016 s. Может, стоит немного оптимизировать ваш сниппет? 21 секунда это ооооочень много и явный признак, что вы что-то делаете не так :)
<?php
$files = scandir(MODX_BASE_PATH);
foreach ($files as $file){
if (is_file(MODX_BASE_PATH.$file)){
echo '
'.$file.' is a file. size is: '.filesize(MODX_BASE_PATH.$file);
}
}
Да, действительно, запрос по определению размера файла не такой прожорливой. Но есть второй, который определяет количество страниц каждого файла. Вот он прожорливый:
<?php
$pdf_content = file_get_contents($pdf_filename);
$count = preg_match_all("/\/Page\W/", $pdf_content, $matches);
echo "{$count}";
Идея в том, что размер файла и количество страниц статичные величины, а если статичные, то почему бы не записать их в БД?
Еще можно вообще отказаться от идеи с количеством страниц :) Ну, может это реально необходимо, но не знаю, не знаю. А вообще, идею понял. Тогда можно попробовать еще кэширование, как вариант. Еще можно сделать дополнительную табличку в БД и записывать туда путь и имя файла и его размер и кол-во страниц. Это тоже делается довольно легко. Ну или в ТВ, да. Только я не понимаю, в чем тогда проблема?) Не решили еще?
Я не специалист. Код сниппета нашел на просторах интернета и оптимизировал для себя. А вот как записать в tv результат работы php-кода так и не нашел
Самый простой способ:
Если страница, в которую надо записать TV, текущая, то вообще просто:
Если страница, в которую надо записать TV, текущая, то вообще просто:
//тут какие-то вычисления и затем:
$modx->resource->setTVValue('TVNAME', $value);
$modx->resource->save();
Если страница, в которую надо записать TV, не текущая, а какая-то другая, то сначала надо как-то получить ее ID: программно, или захардкодить, или передать в сниппет и затем://опять какие-то вычисления и поиск ID
$page = $modx->getObject('modResource',$id);
$page->setTVValue('TVNAME', $value);
$page->save();
Дмитрий, супер! То что надо, все работает.
Спасибо большое за помощь!
Спасибо большое за помощь!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.