PHP/TWIG: цикл for для создания HTML-разделов

Я родом из ASP.NET MVC, и следующее было достаточно легко сделать. Мне интересно, как это можно сделать с помощью PHP и TWIG.

Я хочу динамически построить серию HTML div. Див выглядит так:

<div class="grid_gallery-item">               
    <img src="img/gallery/gallery_grid1.jpg" alt=""/>                       
    <a href="img/gallery/gallery_grid1.jpg"></a>
 </div>

Атрибут src изображения, а также href гиперссылки должны быть разными для каждого блока div. Я хотел бы сделать это в цикле for, используя инкремент для изменения путей src и href.

Еще одна сложность заключается в том, что я использую для своих путей ассет (symfony2). Таким образом, атрибут src и атрибут href на самом деле выглядят так:

{{asset('img/gallery/gallery_grid1.jpg')}}

Как я могу это сделать ?


person Sam    schedule 21.08.2013    source источник


Ответы (2)


Никогда не использовал активы, но я думаю, что вы сможете легко сделать это с помощью PHP альтернативный синтаксис.

<?php $myArray = array('1','2','3'....); //this can store full image paths also?>

<?php foreach($myArray as $item): ?>
<div class="grid_gallery-item">               
    <img src="{{asset('img/gallery/gallery_grid<?php echo $item; ?>.jpg')}}" alt=""/>                       
    <a href="{{asset('img/gallery/gallery_grid<?php echo $item; ?>.jpg')}}"></a>
</div>
<?php endforeach; ?>

Я надеюсь, что это помогает. Дайте мне знать, если вам нужна дополнительная информация.

ОБНОВЛЕНИЕ: чтобы прочитать каждый файл из каталога, используйте это:

<?php 
$dirname = 'dirname'; 
$directory = new DirectoryIterator(dirname(__FILE__).'/../'.$dirname); //modify path to your needs 
?>

<?php foreach($directory as $file): 
         if(!$file->isDot()): ?>
   <div class="grid_gallery-item">               
        <img src="{{asset('<?php echo $dirname.'/'.$file->getFilename(); ?>')}}" alt=""/>                       
        <a href="{{asset('<?php echo $dirname.'/'.$file->getFilename(); ?>')}}"></a>
   </div>
 <?php endif;
     endforeach; ?>

Я не пробовал эту часть, но она должна работать. Просто измените его под свои нужды.

person Alex Sutu    schedule 21.08.2013
comment
очень полезно. Я попробую. Я думаю, что здесь опечатка: не должно ли это быть $item вместо $i ? - person Sam; 21.08.2013
comment
Позвольте мне понять это. Вы храните имена изображений в массиве или просто хотите увеличивать одно и то же имя изображения снова и снова, пока не будет достигнуто определенное значение? - person Alex Sutu; 21.08.2013
comment
хорошо, код, который вы написали, является хорошим началом для меня. Следующим шагом является то, что в идеале пути к изображениям действительно должны храниться в массиве. Более того, я должен указать имя папки на диске, чтобы массив был построен с использованием изображений в папке. Вы знаете, возможно ли это? Вероятно, мне следует использовать подход @punk и сделать это в контроллере. - person Sam; 21.08.2013
comment
Я собираюсь принять это как ответ, хотя подход @punk тоже хорош, и я думаю, что закончу смесью обоих. Спасибо ребята ! - person Sam; 21.08.2013

использовать

{% for div in divs %}
    <div class="grid_gallery-item">               
        <img src="{{ div.src }}" alt=""/>                       
        <a href="{{ div.href }}"></a>
    </div>
{% endfor %}

а вот php код

    $array = array(
      array('src' => 'image here',
            'href' => 'link here'),
      array('src' => 'image here',
            'href' => 'link here'),

    );
$twig->render('page.twig', array('divs' => $array));
person Shushant    schedule 21.08.2013
comment
не уверен, что понимаю. Где находится html в цикле for? Кроме того, «1» после «gallery_grid» должен исходить от инкремента цикла for. - person Sam; 21.08.2013
comment
прошу прощения за неполный код, я отредактировал свой ответ, осмотрите его - person Shushant; 21.08.2013
comment
Я думаю, что это лучший подход, так как массив теперь встроен в контроллер и возвращается с представлением. Думаю, мне нужно найти, как динамически построить массив из изображений в исходной папке. Я думаю, что я должен открыть для этого другой пост, так как он не связан с исходной проблемой. - person Sam; 21.08.2013
comment
используйте DirectoryIterator для заполнения массива во время выполнения (из файловой системы) или из базы данных используйте расширение PDO или mysqli - person Shushant; 21.08.2013