firstgm 24 февраля 2015 3 7
Здравствуйте!
Прошу подсказать, как правильно подключить нужный шаблон в Smarty используя условие.

Есть форма с полем ввода «Серия», если в это поле введено «CM» нужно вывести ответ в другом шаблоне (с другим дизайном).

{if $request.serial == 'CM'}
    {extends "layout2.tpl"}
    {else}
    {extends "layout.tpl"}
{/if}


Предполагаю, что это не совсем сложно, но и не так просто, как я написал вышел в примере… Однако в синтаксисе Smarty я пока новичок.
7 комментариев
Fi1osof1
Fi1osof 24 февраля 2015г в 14:17 #
Однако в синтаксисе Smarty я пока новичок.
Так для этого документацию Smarty надо смотреть, на оффсайте Smarty.
Правильней
{if $request.serial == 'CM'}
    {include "layout2.tpl"}
    {else}
    {include "layout.tpl"}
{/if}
f
firstgm 24 февраля 2015г в 14:51 #
Спасибо — это мне дало понять, что это условие надо вызывать не внутри Smarty, а в самом начале в файле base.php, где начинается подключение шаблона.
<?php

$properties = $modx->resource->getOne('Template')->getProperties();

if(!empty($properties['tpl'])){
    $tpl = $properties['tpl'];
}
elseif($request.serial == 'CM')
    $tpl = 'index2.tpl';
else{
    $tpl = 'index.tpl';
}

if ($modx->resource->cacheable != '1') {
    $modx->smarty->caching = false;
}

if(!empty($properties['phptemplates.non-cached'])){
    $modx->smarty->compile_check = false;
    $modx->smarty->force_compile = true;
}

return $modx->smarty->fetch("tpl/{$tpl}");


Только теперь надо копать в сторону, как правильно получить значение из поле сериал.
elseif($request.serial == 'CM')
    $tpl = 'index2.tpl';

Потому что так, он явно не понимает, где это поле «serial».
Fi1osof1
Fi1osof 24 февраля 2015г в 14:56 #
Вот уж точно не по фэншую это… и затрется при переустановке компонента modxSite. Плюс к этому, там чистый php, а значит надо юзать $_REQUEST, а не не понять откуда взявшуюся $request.

В общем, учите основы php и разработки сайтов, иначе никак вообще. А то на трехколесном велике только пару метров проехали, а уже хотите тур дэ Франс выиграть.
f
firstgm 24 февраля 2015г в 16:51 #
<?php

$properties = $modx->resource->getOne('Template')->getProperties();

if(!empty($properties['tpl'])){
    $tpl = $properties['tpl'];
}

elseif($_REQUEST['serial'] == 'cm' or $_REQUEST['serial'] == 'CM')
    $tpl = 'index2.tpl';
else{
    $tpl = 'index.tpl';
}

if ($modx->resource->cacheable != '1') {
    $modx->smarty->caching = false;
}

if(!empty($properties['phptemplates.non-cached'])){
    $modx->smarty->compile_check = false;
    $modx->smarty->force_compile = true;
}

return $modx->smarty->fetch("tpl/{$tpl}");


Вроде так работает, но мне прям не нравится, что пришлось использовать оператор «или\or» для того, что бы учесть регистр букв. Несколько часов гуглил, как не учитывать регистр — ничего путевого.

Пробовал разные вариации:
elseif($_REQUEST['serial'] == 'cm, CM') — не работает
elseif($_REQUEST['serial'] == 'cm', 'CM') — не работает
elseif($_REQUEST['serial'] == 'cm' or 'CM') — не работает
elseif($_REQUEST['serial'] == 'cm' and 'CM') — не работает

Хоть сейчас все и работает, как надо, но все же, как проще всего не учитывать регистр? Чтоб знать на будущее.
Fi1osof1
Fi1osof 24 февраля 2015г в 17:57 #
1. in_array($_REQUEST['serial'], array( 'cm', 'CM'));
strtolower($_REQUEST['serial']) == 'cm';
mb_convert_case($_REQUEST['serial'], MB_CASE_LOWER) == 'cm';
preg_match('/^cm$/i', $_REQUEST['serial']);
// И главное:
strcasecmp($_REQUEST['serial'], 'cm') === 0;
Плохо гуглите (нагуглить пришлось только последнее, и в первой строчке сразу).
f
firstgm 24 февраля 2015г в 18:23 #
strcasecmp($_REQUEST['serial'], 'cm') === 0;
С этим я был почти рядом )) надо было 3 знака равенства оказывается… Заменил свои костыли на это — все работает.
Спасибо, Николай, отличная информация. Думаю многим пригодится!
Fi1osof1
Fi1osof 24 февраля 2015г в 18:33 #
Пожалуйста.
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.