Сохранить в tv результат работы сниппета или php-скрипта

Добрый вечер, уважаемые!

Суть вопроса — на странице хочу выводить размер файла PDF в МБ с дочерней страницы. Сделал это через сниппет. Но мне надо одновременно вывести значение для 100 файлов. Т. к. размер файла — это неизменное число, то решил его поместить в tv поле у каждой дочерней страницы страницы. А потом просто выводить значение tv поле.
Подскажите, как мне решить этот вопрос? То ли записать результат работы сниппета в tv поле, то ли записать в него результат работы php-скрипта (что одно и тоже). Или может еще как-то можно.

Спасибо за ответы!
Aleksey
14 апреля 2018, 17:00
modx.pro
2 219
0

Комментарии: 9

Андрей
15 апреля 2018, 09:46
0
Если правильно понял, можно воспользоваться компонентом FileAttach. Он позволяет вывести размеры файлов.
    Дмитрий
    15 апреля 2018, 10:22
    1
    0
    О мамочки, нахрена, извините за грубость, пихать какие-то данные, которые легко вычислить, в отдельное поле? Захламлять БД, усложнять логику, мучать менеджеров? Можно написать простенький сниппет, хотя бы типа такого:
    <?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 использовать, что тоже очень хорошо.
      Aleksey
      15 апреля 2018, 21:30
      0
      у меня был такой простенький сниппет. Вот результат работы со сниппетом:
      Время потраченное на запросы к базе данных — 0.0016 s;
      Количество запросов к базе данных — 3;
      Время потраченное на работу PHP скриптов — 21.1095 s;
      Общее время потраченное на генерацию страницы — 21.1111 s.

      А вот без сниппета:
      Время потраченное на запросы к базе данных — 0.0010 s;
      Количество запросов к базе данных — 3;
      Время потраченное на работу PHP скриптов — 0.2820 s;
      Общее время потраченное на генерацию страницы — 0.2830 s.

      Думаю, если значение будет в tv поле, то производительность будет выше. Если выбирать между производительностью и полем в БД — я выберу производительность.
        Дмитрий
        16 апреля 2018, 02:18
        0
        Специально ради вас открыл один сайт, где у меня в корне прошлыми разработчиками было вывалено 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);
            }
        }
          Aleksey
          16 апреля 2018, 21:31
          0
          Да, действительно, запрос по определению размера файла не такой прожорливой. Но есть второй, который определяет количество страниц каждого файла. Вот он прожорливый:
          <?php
          $pdf_content = file_get_contents($pdf_filename);
          $count = preg_match_all("/\/Page\W/", $pdf_content, $matches);
          echo "{$count}";
          Идея в том, что размер файла и количество страниц статичные величины, а если статичные, то почему бы не записать их в БД?
            Дмитрий
            16 апреля 2018, 21:47
            0
            Еще можно вообще отказаться от идеи с количеством страниц :) Ну, может это реально необходимо, но не знаю, не знаю. А вообще, идею понял. Тогда можно попробовать еще кэширование, как вариант. Еще можно сделать дополнительную табличку в БД и записывать туда путь и имя файла и его размер и кол-во страниц. Это тоже делается довольно легко. Ну или в ТВ, да. Только я не понимаю, в чем тогда проблема?) Не решили еще?
              Aleksey
              17 апреля 2018, 06:40
              0
              Я не специалист. Код сниппета нашел на просторах интернета и оптимизировал для себя. А вот как записать в tv результат работы php-кода так и не нашел
                Дмитрий
                17 апреля 2018, 11:38
                0
                Самый простой способ:
                Если страница, в которую надо записать TV, текущая, то вообще просто:
                //тут какие-то вычисления и затем:
                $modx->resource->setTVValue('TVNAME', $value);
                $modx->resource->save();
                Если страница, в которую надо записать TV, не текущая, а какая-то другая, то сначала надо как-то получить ее ID: программно, или захардкодить, или передать в сниппет и затем:
                //опять какие-то вычисления и поиск ID
                $page = $modx->getObject('modResource',$id);
                $page->setTVValue('TVNAME', $value);
                $page->save();
                  Aleksey
                  17 апреля 2018, 21:59
                  0
                  Дмитрий, супер! То что надо, все работает.
                  Спасибо большое за помощь!
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        9