We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 4036
    • 239 Posts
    Очень-очень нужна помощь!!!
    Понадобилась тут немного навороченная фотогалерея (http://test.bredova.ru/).

    Туда подгружаются фотографии по типу:

    <a href="img/1_big.jpg" rel="lightbox[plants]" data-thumb="thumbs/1.png"><img src="img/1.jpg"/></a>
    <a href="img/2_big.jpg" rel="lightbox[plants]" data-thumb="thumbs/2.png"><img src="img/2.jpg"/></a>
    ...


    Т.е. предварительно подготавливается три изображения: большое, среднее и маленькое превью.

    И столкнулась я с тем, что нужно как-то полуавтоматизировать процесс.
    Ручками замучаешься прописывать эти строчки, так как фотографий может быть в одной тематике около 100, а то и больше. Достаточно того, что они готовятся в ручную (по другому никак, есть опасность потери качества, а это главный критерий).

    Сначала посмотрела в сторону плагина MultiPhotos, но поняла, что это меня не спасает — не хватает полей, да и записей будет слишком много.

    Значит нужно писать свой снипет, который будет «залазить» в указанную директорию, куда я предварительно закину фотографии, и подставлять имена файлов из этой директории. Хотя я не уверена, что это верное решение sad но ничего другого пока в голову не лезет.

    С PHP только начала знакомиться (я в нем "дуб дерево хвойное"), нашла пример, чуть его подправила по себя:

    <?php
    //define the path as relative
    $path = "wedding";
    $webpath ="foto/";
    //using the opendir function
    $dir_handle = @opendir($path) or die("Unable to open $path");
    
    list_dir($dir_handle,$path);
    
    function list_dir($dir_handle,$path)
    {
        // print_r ($dir_handle);
    
        //running the while loop
        while (false !== ($file = readdir($dir_handle))) {
            $dir =$path.'/'.$file;
            if(is_dir($dir) && $file != '.' && $file !='..' && $file != "Thumb.db")
            {
    			if (strpos($file, '.jpg',1) ) {
                $handle = @opendir($dir) or die("undable to open file $file");
                echo "<a href='$webpath/big_photo/$file' rel='lightbox[plants]' data-thumb='$webpath/thumbs/$file'><img src='$webpath.$file' /></a>";
                list_dir($handle, $dir);
    			}
            }elseif($file != '.' && $file !='..' && $file != "Thumb.db")
            {
    			if (strpos($file, '.jpg',1) ) {
                   echo "<a href='$webpath/big_photo/$file' rel='lightbox[plants]' data-thumb='$webpath/thumbs/$file'><img src='$webpath.$file' /></a>";
    			}
            }
        }
       
    
        //closing the directory
        closedir($dir_handle);
       
    }
    ?>
    


    Создала в корне сайта директорию foto, а в ней wedding.

    А затем вызвала на нужной странице:
    [[fotogallery? &path=`wedding` &webpath=`foto` ]]
    


    Пишет "Unable to open wedding".
    Млин, что я делаю не так????

    Помогите, пожалуйста!!!
    Мне самой не справиться sad
      Портфолио - http://wowstudio.pro
      • 785
      • 2,113 Posts
      Логику сниппета, честно говоря, я не понял – зачем рекурсивно вызывается чтение каталога и как связаны $path и $webpath – непонятно.
      В любом случае лучше использовать не относительные, а абсолютные пути, то есть не
      "wedding"
      а
      $modx->config[’base_path’].’foto/wedding’
      И чтобы внутри функции были видны переменные, надо их или передать в нее параметрами или объявить глобальными (это о $webpath).
        Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
        Статьи о MODx, регулярно новые публикации
        • 9085
        • 630 Posts
        $path = "wedding";
        $webpath ="foto/";
        //using the opendir function
        $dir_handle = @opendir($path) or die("Unable to open $path");

        Тут мы пытаемся зайти в каталог "wedding/" относительно корневой директории MODx
        (которого, судя по всему не существует - полагаю фотки лежат в каталоге "foto" или "img"(?))

        И почему $path отличается от $webpath?
        <a href='$webpath/big_photo/$file...

        тут перед ’big_photo’ будет два слэша: "foto//big_photo..."

        Итого, поддерживая Akots, предлагаю поменять 2 строчки в самом начале:
        $webpath = 'foto/wedding';
        $path = $modx->config['base_path'].$webpath; //
        

        А дальше - видно будет smiley
          Правильно заданный вопрос повышает вероятность получения нужного ответа.
          Что-то не работает? Загляните в лог ошибок!
          Есть проблема? "Локализуйте" её!
          Ответы на большинство вопросов по MODx | MODx RTFM | API Evo Revo | галопом по Европам Азиям smiley wikibooks(ru) Ditto(en) | Wayfinder e-book | Заметки и о MODx
          • 4036
          • 239 Posts
          Спасибо, что откликнулись. Вот идите, дуб дубом sad
          Логика была проста, все фотографии лежат в папке foto.
          А дальше по темам, например wedding, children и т.д.
          И на соот. странице мы указываем эту папку с помощью вызова сиппета и подстановки названия папки.

          Поменяла две строчки

          <?php
          //define the path as relative
          $webpath = 'foto/wedding';
          $path = $modx->config['base_path'].$webpath;
          //using the opendir function
          $dir_handle = @opendir($path) or die("Unable to open $path");
          
          list_dir($dir_handle,$path);
          
          function list_dir($dir_handle,$path)
          {
              // print_r ($dir_handle);
          
              //running the while loop
              while (false !== ($file = readdir($dir_handle))) {
                  $dir =$path.'/'.$file;
                  if(is_dir($dir) && $file != '.' && $file !='..' && $file != "Thumb.db")
                  {
          			if (strpos($file, '.jpg',1) ) {
                      $handle = @opendir($dir) or die("undable to open file $file");
                      echo "<a href='$webpath/big_photo/$file' rel='lightbox[plants]' data-thumb='$webpath/thumbs/$file'><img src='$webpath.$file' /></a>";
                      list_dir($handle, $dir);
          			}
                  }elseif($file != '.' && $file !='..' && $file != "Thumb.db")
                  {
          			if (strpos($file, '.jpg',1) ) {
                         echo "<a href='$webpath/big_photo/$file' rel='lightbox[plants]' data-thumb='$webpath/thumbs/$file'><img src='$webpath.$file' /></a>";
          			}
                  }
              }
             
          
              //closing the directory
              closedir($dir_handle);
             
          }
          ?>
          


          Вызываю на странице:
          [[fotogallery? &webpath=`foto/wedding` ]]


          Получаю:
          <a href='/big_photo/IMG_3875.jpg' rel='lightbox[plants]' data-thumb='/thumbs/IMG_3875.jpg'><img src='.IMG_3875.jpg' /></a>


          Это уже хоть что-то smiley
          Вот только foto/wedding не подставилось sad

            Портфолио - http://wowstudio.pro
            • 4036
            • 239 Posts
            Quote from: AKots at Dec 04, 2010, 04:42 PM

            Логику сниппета, честно говоря, я не понял – зачем рекурсивно вызывается чтение каталога и как связаны $path и $webpath – непонятно.
            В любом случае лучше использовать не относительные, а абсолютные пути, то есть не
            "wedding"
            а
            $modx->config[’base_path’].’foto/wedding’
            И чтобы внутри функции были видны переменные, надо их или передать в нее параметрами или объявить глобальными (это о $webpath).


            Фотографии будут по темам разбиты wedding, children и т.д.
            На соот. странице, нужно вызывать соот. папку.
            Вот и вся логика smiley
            Я просто не знала, как лучше сделать sad
              Портфолио - http://wowstudio.pro
              • 785
              • 2,113 Posts
              Quote from: esche at Dec 04, 2010, 10:35 PM

              А дальше - видно будет smiley
              Дальше сразу видно, что ничего хорошего не будет. Рекурсивный вызов сделан в оригинальном коде для вывода структуры каталога со всеми папками и файлами, а здесь пытаются папку вывести как файл…

              Quote from: Bredova at Dec 04, 2010, 11:58 PM

              Вот только foto/wedding не подставилось sad
              Я выше писал

              Quote from: AKots at Dec 04, 2010, 04:42 PM

              И чтобы внутри функции были видны переменные, надо их или передать в нее параметрами или объявить глобальными (это о $webpath).

              Вообще для начала полезно написать алгоритм работы программы (просто на русском языке), чтобы было понятно, что должно происходить – типа «определяем нужную папку», «цикл по всем файлам в папке», «собираем нужную строку» и так далее (можно подробнее), а потом в соответствии с этим писать программу на PHP. А выборочная замена строк в программе, которая предназначена совсем для другого, ничего хорошего не принесет.

              Еще раз повторю, рекурсия здесь не нужна, половина строк в программе лишняя, зато нет, например, проверки, введены ли параметры при вызове сниппета.
                Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                Статьи о MODx, регулярно новые публикации
                • 4036
                • 239 Posts
                Ок, мне подсказали другой путь:

                // код чанка
                $sTpl = $modx->getChunk('GalleryRowTpl');
                
                // массив с плейсхолдерами
                $aSearch = array('[+item.image.big+]', '[+item.image.min+]', '[+item.image.med+]');
                
                // циклично обходим директорию
                foreach (glob($modx->config['base_path']."thumbs/big/*.{jpeg,jpg,gif,png}", GLOB_BRACE) as $sTmp) {
                        // определяем имя файла
                        $sFilename = basename($sTmp);
                
                        // проверяем наличие тумбы и копии среднего размера
                        if (is_file($modx->config['base_path'].'thumbs/med/'.$sFilename) and is_file($modx->config['base_path'].'thumbs/min/'.$sFilename)) {
                                // массив замен
                                $aReplace = array('[(base_url)]thumbs/big/'.$sFilename, '[(base_url)]thumbs/min/'.$sFilename, '[(base_url)]thumbs/med/'.$sFilename);
                
                                // вывод изображения
                                $aRow[] = str_replace($aSearch, $aReplace, $sTpl);
                        }
                }
                
                // выводим все изображения
                if (is_array($aRow)) {
                        return implode("\n", $aRow);
                }
                


                Код чанка:
                <a href="[+item.image.big+]" rel="lightbox[plants]" data-thumb="[+item.image.min+]"><img src="[+item.image.med+]" /></a>


                Я полезла править его под свою задачу:
                // папка с фото
                if(!$folder) return;
                
                // код чанка
                $sTpl = $modx->getChunk('GalleryRowTpl');
                
                // массив с плейсхолдерами
                $aSearch = array('[+item.image.big+]', '[+item.image.min+]', '[+item.image.med+]');
                
                // циклично обходим директорию
                foreach (glob($modx->config['base_path']."foto/".$folder."/big/*.{jpeg,jpg,gif,png}", GLOB_BRACE) as $sTmp) {
                        // определяем имя файла
                        $sFilename = basename($sTmp);
                
                        // проверяем наличие тумбы и копии среднего размера
                        if (is_file($modx->config['base_path'].'foto/'.$folder.'/med/'.$sFilename) and is_file($modx->config['base_path'].'foto/'.$folder.'/min/'.$sFilename)) {
                                // массив замен
                                $aReplace = array('[(base_url)]'.'foto/'.$folder.'/big/'.$sFilename, '[(base_url)]'.'foto/'.$folder.'/min/'.$sFilename, '[(base_url)]'.'foto/'.$folder.'/med/'.$sFilename);
                
                                // вывод изображения
                                $aRow[] = str_replace($aSearch, $aReplace, $sTpl);
                        }
                }
                
                // выводим все изображения
                if (is_array($aRow)) {
                        return implode("\n", $aRow);
                }
                


                Вызов снипета на странице:
                [[GalleryOutput? &folder=`wedding`]]


                Но видимо, я все же что-то напутала с синтаксисом.
                Потому что работать перестало sad
                  Портфолио - http://wowstudio.pro
                  • 785
                  • 2,113 Posts
                  С ходу ничего плохого не заметно, если не работает, надо смотреть, нет ли ошибок PHP в логах сервера, а также добавить печать важных переменных после их присвоения (чтобы найти, где присваиваются неверные переменные).
                    Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                    Статьи о MODx, регулярно новые публикации
                    • 4036
                    • 239 Posts
                    Все, вопрос решен smiley
                    Из-за поиска разных вариантов и своей невнимательности - перепутала физические папки.
                      Портфолио - http://wowstudio.pro