Доступ к содержимому * .txt из папки, циклический просмотр и отображение результатов в шаблоне smarty - PullRequest
0 голосов
/ 11 октября 2019

Я создаю шаблон в CMS Made simple, который использует Smarty engine. Я новичок в smarty / php.

Я перебираю изображения в папке и отображаю их в Bootstrap Carusel. Это работает нормально.

С другой стороны, мне нужно отображать текст и подпись для каждого изображения.

Я пришел к решению поставить файл .txt, который содержит заголовок и текстсодержимое для каждого изображения в папке. Например, у меня есть img1.jpg и файл с именем img1.txt в той же папке (img2.jpg - img2.txt, img3.jpg - img3.txt и т. Д.). Каждое изображение имеет соответствующий .txt файл, который содержит содержимое, которое необходимо прочитать в разделе заголовка и текста в приведенном ниже коде)

Я не уверен, как бы я реализовал это решение для {foreach}и мне нужна помощь.

Я использовал этот фрагмент ниже для доступа к .txt, но использование *.txt не работает. *.txt дает пустой массив.

Обновление

    {"{uploads_url}/images/{$entry->Picfolder}/*.txt"|file_get_contents|parse_str:$result|glob}

   {foreach from=$result key=text item=foo}
         <p>{$text}</p>
   {/foreach} 

Вот весь код карусели:

<!--Carousel Wrapper-->
<div id="carousel-thumb" class="carousel slide carousel-fade carousel-thumbnails" data-ride="carousel">
<!--Slides-->
<div class="carousel-inner" role="listbox">
 {assign var='pics' value="uploads/images/{$entry->Picfolder}/*.jpg"|glob} <!--finding all .jpgs in the folder -->
  {foreach from=$pics item='pic'}<!-- loop through .jpgs --> 
     {if $pic@first}
       <div class="carousel-item active">
       {else}
       <div class="carousel-item">
     {/if}           
       <img class="d-block w-100" src='{root_url}/{$pic}' alt="First slide"> <!-- add jpgs from loop -->
         <div class="carousel-caption d-md-block">
           <h5>Caption</h5><!-- need to insert content from .txt file here -->
           <p>Image text</p><!-- need to insert content from .txt file here -->
         </div>   
       </div>
  {/foreach}
       </div>
          <!--/.Slides-->
          <!--Controls-->
          <a class="carousel-control-prev" href="#carousel-thumb" role="button" data-slide="prev">
            <span class="carousel-control-prev-icon" aria-hidden="true"></span>
            <span class="sr-only">Previous</span>
          </a>
          <a class="carousel-control-next" href="#carousel-thumb" role="button" data-slide="next">
            <span class="carousel-control-next-icon" aria-hidden="true"></span>
            <span class="sr-only">Next</span>
          </a>
          <!--/.Controls-->
          <ol class="carousel-indicators">
            {foreach from=$pics item='pic' name=img}
              <li data-target="#carousel-thumb" data-slide-to="{$smarty.foreach.img.index}" class="active"> <img class="d-block w-100" src='{root_url}/{$pic}' height="50" width="50" class="img-fluid"></li>
            {/foreach}
          </ol>
</div>
<!--/.Carousel Wrapper-->

Может кто-нибудь помочь мне с этим? Я действительно застрял в этой проблеме. Заранее спасибо ..

1 Ответ

0 голосов
/ 14 октября 2019

Я действительно рекомендую вам справиться с этим на уровне PHP. Возможно, вы могли бы подготовить массив кортежей [image_path, caption] и присвоить его Smarty. Сам Smarty - это шаблонизатор;он не должен иметь дело с глобусами, манипуляциями с именами файлов или другой логикой кода, за исключением тривиальных циклов.

Если вы все еще хотите сделать это на уровне Smarty, то вы можете создать имя файла и затем напечатать егосодержание:

<p>
  {capture "fileName"}/full/path/to/{$pic|basename:'.jpg'}.txt{/capture}
  {$smarty.capture.fileName|file_get_contents}
</p>

Что это значит:

  1. Обрезать расширение .jpg из $pic.
  2. Добавить полный путь и .txt расширение до этого и захватить его как переменную Smarty $fileName.
  3. Распечатать содержимое $fileName.
...