За последние 24 часа нас посетили 31872 программиста и 1363 робота. Сейчас ищут 827 программистов ...

Как в шаблонизаторе правильно прокрутить цикл и подставить значения

Тема в разделе "PHP для новичков", создана пользователем AlexsaiL, 30 авг 2017.

  1. AlexsaiL

    AlexsaiL Активный пользователь

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    Пытаюсь в тег <a > в адрес прописать путь в папку к большим изображениям, чтобы при просмотре выдавало одно изображение(Большое), а в теге <img> на сайте отображалось другое изображение.
    получаю массив на выходе
    PHP:
    1. (
    2.     [0] => Array
    3.         (
    4.             [C_DATE] => 0000-00-00 00:00:00
    5.             [picture_big] => Array
    6.                 (
    7.                     [0] => b_s111_1.jpg
    8.                     [1] => b_s111_2.jpg
    9.                     [2] => b_s111_3.jpg
    10.                     [3] => b_s111_4.jpg
    11.                 )
    12.  
    13.             [picture_huge] => Array
    14.                 (
    15.                     [0] => huge/h_s222_1.jpg
    16.                     [1] => huge/h_s222_2.jpg
    17.                     [2] => huge/h_s222_3.jpg
    18.                     [3] => huge/h_s222_4.jpg
    19.                 )
    PHP:
    1. {foreach $rsProduct as $item}
    2.               <a class="nivLightBox"  href="http://site.local/picture/huge/{$item['picture_huge']}" >
    3.                    <img src="../ru/picture/{$item['picture_big']}" alt="" />
    4.               </a>
    5.         {/foreach}
    но в на выходе получаю array вместо изображений:
    HTML:
    1.  
    2. <a class="nivLightBox"  href="http://site.local/picture/huge/array" >
    3.                    <img src="../ru/picture/array" alt="" />
    4.               </a>
    5.  
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    так у вас вложенные массивы....
    поменяйте чтоб данные были вида
    Код (Text):
    1. (
    2.     [0] => Array
    3.         ( [0] => (
    4.             [C_DATE] => 0000-00-00 00:00:00
    5.             [picture_big] =>  b_s111_1.jpg
    6.             [picture_huge] => huge/h_s222_1.jpg
    7.           )
    8. [1] => (
    9.             [C_DATE] => 0000-00-00 00:00:00
    10.             [picture_big] =>  b_s111_1.jpg
    11.             [picture_huge] => huge/h_s222_1.jpg
    12.           )
    13. )
    либо цикл в цикле .. что не совсем хорошо в вашей задаче
     
  3. AlexsaiL

    AlexsaiL Активный пользователь

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    цикл в цикле пробовал, но у меня тогда прокручивает и много дублей вылетает, так как сначала цикл срабатывает на тег а, а потом на тег img
    а конкретнее где необходимо поменять? мне же надо вывести все пришедие изображения, а не одно первое. Если я правильно понимаю процитированный вами код.
    --- Добавлено ---
    Может как то можно прокрутить {section}? я читал что можно, но немного сложнее чем через foreach.
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    я как пример только показал формирование данных для двух элементов... - формируйте как хотите
    просто логичнее было бы имено чтоб элементами массива были - даты изображения, их полное фото, превьюшка.....
    а у вас получается - одна дата + 5 фото одного разрешения в одном элементе, а в другом элементе 5 фото другого разрешения

    я предлагаю формировать данные по другому .. оставив шаблон таким

    ну или

    Код (Text):
    1. {foreach $rsProduct as $item}
    2. {foreach $item as $e}
    3.               <a class="nivLightBox"  href="http://site.local/picture/huge/{$e['picture_huge']}" >
    4.                    <img src="../ru/picture/{$e['picture_big']}" alt="" />
    5.               </a>
    6.         {/foreach}
    7.  {/foreach}
     
  5. AlexsaiL

    AlexsaiL Активный пользователь

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    вот код формирования массива на выдачу:
    PHP:
    1. .....
    2. if (mysql_num_rows($rs)!= 0) {
    3.               $smartyRs = array();
    4.               while ($row = mysql_fetch_assoc($rs)) {
    5.                 $result = $row['id_product'];
    6.                 $itemId = intval($itemId);
    7.                 $sql = "SELECT `id_product`, GROUP_CONCAT(`picture_big` ORDER BY `ordera` DESC) as `picture_big`, GROUP_CONCAT(CONCAT(IFNULL(`picture_huge`, `picture_big`)) ORDER BY `ordera` DESC) as `picture_huge` FROM `pictures` GROUP BY `id_product` = '{$result}'  ";
    8.                 $res = mysql_query($sql);
    9.                 if (mysql_num_rows($res) != 0){
    10.                   while($row1 = mysql_fetch_assoc($res)) {
    11.                    
    12.                     if($row1['id_product'] == $result){
    13.                       $piecesBig = explode(",", $row1['picture_big']);
    14.                       $row['picture_big'] = $piecesBig;
    15.                       $row1['picture_huge'] = explode(",", $row1['picture_huge']);
    16.                       $row['picture_huge'] = array_map(function ($str) { return 'huge/'.$str; }, $row1['picture_huge']);
    17.                     }
    18.                   }
    19.                 }
    20.       $smartyRs[] = $row;
    21.         }
    22.        
    23.       }
    24.       return $smartyRs;
    25.     }
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    так у вас в бд так записано .. по несколько картинок
    или берите только одну из них
    PHP:
    1. $row['picture_big'] = $piecesBig[0];
    или что то там с логикой непонятно ... что вы хотите в результате?
     
  7. AlexsaiL

    AlexsaiL Активный пользователь

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    у меня в бд так записано, идет несколько строк к примеру id_product - 100
    у этого id_product изображений может быть 8 или 4 (любое кол-во), соответсвенно он в таблице занимает несколько строк, а когда я вытягиваю, я объединяю так как у продукта в столбце picture_big будет носколько фото
     
  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    а что тогда - пример цикл в цикле не работает как надо?
     
  9. AlexsaiL

    AlexsaiL Активный пользователь

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    Это уже смарти не дает, первый цикл в смарти прогоняет тег а, если у него 4 изображения, закинет 4, потом заходит в тег img там цикл крутит, в итоге в каждом из 4 полученых блоков по 4 дубля
    --- Добавлено ---
    читал по смарти документацию, но что-то не особо понял как быть в этой ситуации, хотя другие элементы через {foreach} в смарти нормально проходят, без косяков.
     
  10. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    А давайте вы просто по человечески скажите - что вы хотите получить в результате на основе представленных даных...?
    Например для каждого элемента - 4 картинки обернутых в ссылки такието...или что?
     
  11. AlexsaiL

    AlexsaiL Активный пользователь

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    в теге img выводить изображение, а в ссылке в теге <а> прописать ссылку на такое же, только большое изображение, при клике на изображение, срабатывает плагин просмотра изображений и отображает уже большое изображение.
     
  12. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    Одно изображение?
    Какое из 4х? Первое?
     
  13. AlexsaiL

    AlexsaiL Активный пользователь

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    любое кол-во может быть
     
  14. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    а код что приводил выше
    Код (Text):
    1. {foreach $rsProduct as $item}
    2. {foreach $item as $e}
    3.               <a class="nivLightBox"  href="http://site.local/picture/huge/{$e['picture_huge']}" >
    4.                    <img src="../ru/picture/{$e['picture_big']}" alt="" />
    5.               </a>
    6.         {/foreach}
    7. {/foreach}
    не так разве выводит?
     
  15. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    нда.. был неправ.. запустил попробовать
    предлагаю привести данные к такому виду - тогда все норм
    Код (Text):
    1. Array
    2. (
    3.     [0] => Array
    4.         (
    5.             [C_DATE] => 0000-00-00 00:00:00
    6.             [picture] => Array
    7.                 (
    8.                     [0] => Array
    9.                         (
    10.                             [big] => b_s111_1.jpg
    11.                             [huge] => huge/h_s222_1.jpg
    12.                         )
    13.  
    14.                     [1] => Array
    15.                         (
    16.                             [big] => b_s111_2.jpg
    17.                             [huge] => huge/h_s222_2.jpg
    18.                         )
    19.  
    20.                     [2] => Array
    21.                         (
    22.                             [big] => b_s111_3.jpg
    23.                             [huge] => huge/h_s222_3.jpg
    24.                         )
    25.  
    26.                     [3] => Array
    27.                         (
    28.                             [big] => b_s111_3.jpg
    29.                             [huge] => huge/h_s222_3.jpg
    30.                         )
    31.  
    32.                 )
    33.  
    34.         )
    35.  
    36.     [1] => Array
    37.         (
    38.             [C_DATE] => 2000-00-00 00:00:00
    39.             [picture] => Array
    40.                 (
    41.                     [0] => Array
    42.                         (
    43.                             [big] => b_s111_1.jpg
    44.                             [huge] => huge/h_s222_1.jpg
    45.                         )
    46.  
    47.                     [1] => Array
    48.                         (
    49.                             [big] => b_s111_2.jpg
    50.                             [huge] => huge/h_s222_2.jpg
    51.                         )
    52.  
    53.                     [2] => Array
    54.                         (
    55.                             [big] => b_s111_3.jpg
    56.                             [huge] => huge/h_s222_3.jpg
    57.                         )
    58.  
    59.                     [3] => Array
    60.                         (
    61.                             [big] => b_s111_3.jpg
    62.                             [huge] => huge/h_s222_3.jpg
    63.                         )
    64.  
    65.                 )
    66.  
    67.         )
    68.  
    69. )
    70.  
    71. 0000-00-00 00:00:00
    72. b_s111_1.jpg -> huge/h_s222_1.jpg b_s111_2.jpg -> huge/h_s222_2.jpg b_s111_3.jpg -> huge/h_s222_3.jpg b_s111_3.jpg -> huge/h_s222_3.jpg 2000-00-00 00:00:00
    73. b_s111_1.jpg -> huge/h_s222_1.jpg b_s111_2.jpg -> huge/h_s222_2.jpg b_s111_3.jpg -> huge/h_s222_3.jpg b_s111_3.jpg -> huge/h_s222_3.jpg
    шаблон
    Код (Text):
    1. {foreach $rsProduct as $item}
    2. <hr/>{$item.C_DATE}<br/>
    3.     {foreach $item.picture as $e}
    4.     {$e.big} -> {$e.huge}
    5.               <a class="nivLightBox"  href="http://site.local/picture/huge/{$e.huge}" >
    6.                    <img src="../ru/picture/{$e.big}" alt="" />
    7.               </a>
    8.     {/foreach}
    9. {/foreach}
     
    AlexsaiL нравится это.
  16. AlexsaiL

    AlexsaiL Активный пользователь

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    Благодарю, сейчас попробую)
     
  17. AlexsaiL

    AlexsaiL Активный пользователь

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    Я как понимаю под такую структуру мне придется изменить обращение к бд удалить GROUP_CONCAT и вытягивать с бд по другому
     
  18. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    ну точ, то что-то придется менять - это точно )))
    можете преобразовывать полученный массив из полученного запроса, можете сам запрос
     
    AlexsaiL нравится это.
  19. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    PHP:
    1. while($row1=mysql_fetch_assoc($res)){
    2.   $img1 = explode(",", $row1['picture_big']);
    3.   $img2 = explode(",", $row1['picture_huge']);
    4.   $pic = [];
    5.   $i = 0;
    6.   foreach ($img1 as $img) {
    7.      $pic[] = ['big'=>$img,'huge'=>$img2[$i];
    8.      $++;
    9.   }
    10.   $row[picture'] = $pic;
    11. }
     
    AlexsaiL нравится это.
  20. AlexsaiL

    AlexsaiL Активный пользователь

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    Ругается на эту строку
     
  21. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    не проверял же .. видно что в конце ] не хватает
    PHP:
    1.   $pic[] = ['big'=>$img,'huge'=>$img2[$i]];
     
    AlexsaiL нравится это.
  22. AlexsaiL

    AlexsaiL Активный пользователь

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    благодарю, уже исправил, дело еще было $++; не указана переменная, не доглядел
    --- Добавлено ---
    Благодарю за помощь, все заработало!)
     
  23. AlexsaiL

    AlexsaiL Активный пользователь

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    AdSoft, а вот еще такой вопрос, если у меня в столбце `picture_huge` у продукта указано NULL, я в запросе :
    меняю NULL на изображение с `picture_big` в этой же строке. А так как изображения в разных папках, следовательно тогда мне надо прописать условие, в котором говорится, если в `picture_huge` есть изображение, то он добавляет название папки- ('huge/') перед изображение
    PHP:
    1.  $ array_map(function ($str) { return 'huge/'.$str; }, $row1['picture_huge']);
    а если `picture_huge` == NULL, то тогда не добавляет название папки- ('huge/'). Прописывал условие, что-то не реагирует.
     
  24. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    думайте.. значит неправильно прописали что-то