Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
4 / 4 / 7
Регистрация: 21.02.2013
Сообщений: 71
1

Использование шаблонов Smarty для вывода тегов при условии

26.11.2013, 17:56. Показов 1423. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
Пришлось поработать с шаблонизатором Smarty для PHP, и застрял на казалось бы довольно простой задаче. Не пойму, как при помощи его синтаксиса выполнить задачу.

Имеется такой код переменной длины на HTML:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<div class="row">
    <div class="col-sm-3 service">
        <a href="#" class="btn btn-default element">Блок 1</a>
    </div>
    <div class="col-sm-3 service">
        <a href="#" class="btn btn-default element">Блок 2</a>
    </div>
    <div class="col-sm-3 service">
        <a href="#" class="btn btn-default element">Блок 3</a>
    </div>
</div>
<div class="row">
    <div class="col-sm-3 service">
        <a href="#" class="btn btn-default element">Блок 4</a>
    </div>
    <div class="col-sm-3 service">
        <a href="#" class="btn btn-default element">Блок 5</a>
    </div>
    <div class="col-sm-3 service">
        <a href="#" class="btn btn-default element">Блок 6</a>
    </div>
</div>
Мне нужно сделать на его основе Smarty шаблон, чтобы он отсчитывал по 3 блока:
HTML5
1
2
3
<div class="col-sm-3 service">
    <a href="#" class="btn btn-default element">Блок 1</a>
</div>
И оборачивал их в:
HTML5
1
2
3
<div class="row">
    <!-- 3 блока -->
</div>
Никак не могу понять, как мне корректно обернуть 3 блока div'ом, получается что-то вроде этого:
HTML5
1
2
3
4
5
6
7
8
9
10
11
{foreach from=$body_default key=text item=link name=default}
    {if $smarty.foreach.default.index % 3 == 0}
        <div class="row">
    {/if}
    <div class="col-sm-3 service">
        <a href="{$link}" class="btn btn-default element">{$text}</a>
    </div>
    {if $smarty.foreach.default.index % 3 == 0}
        </div>
    {/if}
{/foreach}
Тут, как видно, div будет оборачивать только каждый 3 блок.

Если кто работал или работает со Smarty, очень нужна ваша помощь.

P.S.: Заранее спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2013, 17:56
Ответы с готовыми решениями:

Smarty использование двух шаблонов (mobile и deskpot)
Здравствуйте! Достался мне один сайт, написанный на Smarty шаблонизаторе. Сайт довольно старый....

Используйте цикл for для вывода сообщений об именах и id десяти тегов <span> при нажатии кнопки.
Помогите пожалуйста. Используйте цикл for для вывода сообщений об именах и id деся-ти тегов...

Как настроить Angular routes в комбинации с Zend Framework 2 (при условии, что ZF2 роутинг отключён) и Smarty (.tpl-ки)
Доброго времени суток, форумчане! Я использую Zend Framework 2, Smarty (шаблонизатор), AngularJS...

Использование шаблонов при наследовании, ошибка при компиляции
При изучении списков написал шаблон протестировал, все работает. После написал класс наследник от...

1
4 / 4 / 7
Регистрация: 21.02.2013
Сообщений: 71
06.12.2013, 10:37  [ТС] 2
Лучший ответ Сообщение было отмечено Ruia как решение

Решение

Нашёл решение, не знаю на сколько оно костыльное, но главное работает.

Напишу, что я сделал, может кому пригодятся в такой же ситуации.
Smarty, как я понял, не позволяет создавать переменные напрямую в коде шаблона (файл *.tpl), зато для вывода сложного форматирования можно написать пользовательскую функцию (она же плагин).

Получилось как-то так.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function smarty_function_main_menu($params, &$smarty)
{
    $html = "";
    $count = 1;
    
    foreach($params["menu"] as $key => $value)
    {
        if($count == 1)
        {
            $html .= "<div class=\"row\">";
        }
        
        $html .= "<div class=\"col-sm-3 service\"><a href=\"$value\" class=\"btn btn-default element\">$key</a></div>";
        
        $count++;
        
        if($count == 4 || end($params["menu"]) == $value)
        {
            $html .= "</div>";
            
            $count = 1;
        }
    }
    
    return $html;
}
После чего в коде шаблона такую функцию можно вызвать по имени и передать ей в виде первого аргумента, например, массив.

У меня вышло так.
HTML5
1
{main_menu menu=$body_default}
0
06.12.2013, 10:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.12.2013, 10:37
Помогаю со студенческими работами здесь

Как найти для этих условии 2 парных чисел а и b при котором выполняется все условии?
Мой пример кода был таким данный момент но не работал. В экране пустота. Ничего не выводится. Где у...

Использование индекса при условии in () в where
Подскажите, пожалуйста, как понять поведение мускула в таком простейшем запросе. Есть таблица с...

Использование шаблонов для форматирования ввода
Подскажите пожалуйста, если возможность в VB скажем в TextBox какие-нибудь шаблоны для контроля...

Использование мастеров для шаблонов проекта
Есть ли статьи на русском по созданию таких вот мастеров?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru