We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 1228
    • 8 Posts
    Нужен сниппет, который будет сканировать, к примеру, папку с фотографиями /assets/images/ и выводить список имен файлов. Нашел много разных вариантов, типа такого:

    <?php
    $dir = "/assets/images/";

    // Открыть заведомо существующий каталог и начать считывать его содержимое
    if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
    while (($file = readdir($dh)) !== false) {
    print "Файл: $file : тип: " . filetype($dir . $file) . "\n";
    }
    closedir($dh);
    }
    }
    ?>

    или такого:

    <?php
    foreach (glob("*.jpg") as $filename) {
    echo "$filename size " . filesize($filename) . "\n";
    }
    ?>

    но они вообще ничего не выводят.

    Help me.
      • 7314
      • 5 Posts
      без деталей и "лишних" проверок вот так:
      $dir = '... существующий относительный к [base href] путь ...';
      if ( $handle = opendir( $dir ) )
      {
          while ( $file = readdir($handle) )
          {
              echo $file . '<br />';
              ... код, нужный по делу ...
          }
          closedir( $handle );
      }
      
        • 897
        • 1,620 Posts
        дайте ссылку на страницу, где у вас этот сниппет работает.
          "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

          Не используйте Revo для "просто сайтов". Используйте Evo

          Who can defeat the Russian bear?
          • 897
          • 1,620 Posts
            "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

            Не используйте Revo для "просто сайтов". Используйте Evo

            Who can defeat the Russian bear?
            • 1228
            • 8 Posts
            Quote from: DiAksID at Jul 09, 2011, 02:13 PM

            без деталей и "лишних" проверок вот так:

            Спасибо! Сниппет работает, пришлось его немного изменить, чтобы не выводились . и .. перед списком файлов, нашел подсказку в инете:

            <?php
            $dir = 'assets/images';
            if ( $handle = opendir( $dir ) )
            {
                while ( $file = readdir($handle) )
                {
            
                 for ($i=0; $i<count($file); $i++) 
                   if ($file[$i] != '.' && $file[$i] != '..') {
                     echo $file . '<br />';
                 }
                }
                closedir( $handle );
            }
            ?>
            


            Но как оказалось, мне этого недостаточно. Необходимо, чтобы путь к папке менялся, так как планируется выводить множество галерей, которые будут распределены по разным папкам. Я попробовал решить этот вопрос через TV-параметр, но конструкцию типа $dir = ’assets/images/[+id_papki+]’; сниппет воспринимать не хочет.
              • 7314
              • 5 Posts
              Quote from: alpatov at Jul 10, 2011, 06:10 AM
              ... Но как оказалось, мне этого недостаточно. Необходимо, чтобы путь к папке менялся, так как планируется выводить множество галерей, которые будут распределены по разным папкам. Я попробовал решить этот вопрос через TV-параметр, но конструкцию типа $dir = ’assets/images/[+id_papki+]’; сниппет воспринимать не хочет.

              не "не хочет", а "не должен" wink это же сниппет, он "видит" просто [+id_papki+]

              либо запускайте его из шаблона или чанка с параметром [[имя_сниппета? &dir=`[[*имя_TV]]`]] (для Evo по другому) и используйте в нём эту переменную/параметр $dir. обработчик подставит вместо [[*имя_TV]] значение при вызове сниппета;

              либо прямо в нём доставайте путь из TV функцией $dir = $modx->resource->getTVValue( ’имя_TV’ );

              ЗЫ: и ваши "исправления" лишние, если не ошибаюсь. функция readdir отдаёт именно файл (имя.суффикс) без директории. хотя отсечь ’.’ и ’..’ конечно стоит, но просто сравнением $file...
                • 1228
                • 8 Posts


                не "не хочет", а "не должен" wink это же сниппет, он "видит" просто [+id_papki+]


                Спасибо, буду сейчас пробовать ))) ну вот не знаю я этих моментов, хорошо, что хоть есть где спросить
                  • 1228
                  • 8 Posts
                  MODx Evo 1.0.5
                  После долгих и безуспешных копаний, сниппет принял следующий вид:

                  <?php
                  $tpm = $modx->getTemplateVar('tvname'); 
                  $tpm1 = $tpm['value'];   
                  $tpm2 = "assets/images/"; 
                  $tpm2 .= $tpm1; 
                  $dir = "$tpm2";
                  if ( $handle = opendir( $dir ) )
                  {
                      while ( $file = readdir($handle) )
                  {
                       for ($i=0; $i<count($file); $i++) 
                         if ($file[$i] != '.' && $file[$i] != '..') {
                           echo  '<a href="[~[+id+]~]" title="[+pagetitle+]"><img src="/assets/images/[+tvname+]/'.$file . '" alt="[+longtitle+]" /></a>';
                       }
                      }
                      closedir( $handle );
                  }
                  ?>
                  


                  Заработало. Казалось бы, что все ок, но это не так. Данный сниппет вызывается так [[имя сниппета]] в чанке tpl для [!Ditto?!]. Некэшируемый вызов сниппета с кешируемым вызовом Дитто не работает.
                  Но оказалось, что сниппет берет за образец только данные из одной папки и применяет их ко всем остальным папкам, включая имена файлов и их количество.
                  Подозреваю, что дело не только в этой строке: $tpm1 = $tpm[’value’];
                  взял ее откуда-то из форумов, предположив, что она будет брать значение переменной, так как opendir наотрез отказывался принимать переменную $dir в чистом виде.

                  HELP ME!
                    • 7314
                    • 5 Posts
                    Quote from: alpatov at Jul 12, 2011, 11:24 AM
                    ... Подозреваю, что дело не только в этой строке: $tpm1 = $tpm[’value’];
                    взял ее откуда-то из форумов, предположив, что она будет брать значение переменной, так как opendir наотрез отказывался принимать переменную $dir в чистом виде.

                    HELP ME!

                    после того как взяли "что то где то", стоит поискать описание того, что взяли wink. функция $modx->getTemplateVar(’имя_TV’) возвращает значение TV для текущего документа и только для него, потому она и бесполезна в Ditto. намёк ясен? функцию для вывода ТV из ссылки на документ (а не на $modx) я давал раньше.

                    ЗЫ: и не путайте кеширование статики с кешированием исполняемого кода, это две большие разницы...