Форумы / National / Russian / Тех. поддержка / Мой любимый вопрос с логическими блоками)

Kopusha
#1 13.12.2017 18:26

Как написать

Если мы в Индексе то
Или если мы в Форуме то 
Или Если мы в Пейдже то
И если мы где то еще кроме верхних трех то...

То есть что бы всегда что то из 4 срабатывало)

Added 20 seconds later:

Но только одно не более

Added 3 minutes later:

И второй вопрос

У меня есть список юзеров самый обычный и есть эти же юзеры на карте

<!-- IF {PHP.env.ext} == 'users' AND {PHP.out.uri} != 'ua/users?map=1' -->Это обычный список юзеров<!-- ENDIF -->
<!-- IF {PHP.env.ext} == 'users' AND {PHP.out.uri} == 'ua/users?map=1' -->Это эти же юзеры на карте<!-- ENDIF -->

Не могу понять как ловить момент когда это именно карта с юзерами - пробовал как выше но для 3х языков надо городить орогод - AND {PHP.out.uri} == 'users?map=1' не срабатывает без языка. Больше через {PHP|dump} не смог придумать как ловить условие. Заранее спасибо!

Roffun
#2 13.12.2017 19:13
#43196 Kopusha:

Как написать

Если мы в Индексе то
Или если мы в Форуме то 
Или Если мы в Пейдже то
И если мы где то еще кроме верхних трех то...

То есть что бы всегда что то из 4 срабатывало)

Дополнительные возможности шаблонизатора CoTemplate

<!-- IF {PHP.env.ext} == "index" OR {PHP.env.ext} == 'page' OR {PHP.env.ext} == 'forums' -->
если на главной, страницах, форуме
  <!-- IF {PHP.env.ext} == "index" -->
    если только на главной
  <!-- ENDIF -->
  <!-- IF {PHP.env.ext} == "page" -->
    если только на страницах
  <!-- ENDIF -->
  <!-- IF {PHP.env.ext} == "forums" -->
    если только на форумах
  <!-- ENDIF -->

<!-- ELSE -->
что-то еще
здесь можно еще условия влаживать
<!-- ENDIF -->

 

Добавлено 9 минут спустя:

#43196 Kopusha:  У меня есть список юзеров самый обычный и есть эти же юзеры на карте

<!-- IF {PHP.env.ext} == 'users' AND {PHP.out.uri} != 'ua/users?map=1' -->Это обычный список юзеров<!-- ENDIF -->
<!-- IF {PHP.env.ext} == 'users' AND {PHP.out.uri} == 'ua/users?map=1' -->Это эти же юзеры на карте<!-- ENDIF -->

Не могу понять как ловить момент когда это именно карта с юзерами - пробовал как выше но для 3х языков надо городить орогод - AND {PHP.out.uri} == 'users?map=1' не срабатывает без языка. Больше через {PHP|dump} не смог придумать как ловить условие. Заранее спасибо!

Поищите переменную map, и попробуйте проверку через cot_import , так как ?map=1 это _GET запрос

Что за плагин выводит карту ?

Вот пример проверки:

<!-- IF {PHP|cot_import('map', 'G', 'TXT')} -->
Карта
<!-- ELSE -->
Без карты
<!-- ENDIF -->

Или можно сделать проверку для переменной env:

<!-- IF {PHP.env.ext|cot_import('map', 'G', 'TXT')} -->
Карта
<!-- ELSE -->
Без карты
<!-- ENDIF -->

Если нужно проверить что это целое число, то TXT замените на INT, если map нужно проверять только на конкретный параметр (=1), то:

<!-- IF {PHP.env.ext|cot_import('map', 'G', 'INT')} == 1 -->
Карта
<!-- ELSE -->
Без карты
<!-- ENDIF -->

 

Улетел на другую планету, а там почты нету.. https://www.cotonti.com/forums/45298?m=posts
Отредактировано: Roffun (13.12.2017 19:54, 6 лет назад)
Kopusha
#3 13.12.2017 19:52

Или можно сделать проверку для переменной env:

<!-- IF {PHP.env.ext|cot_import('map', 'G', 'TXT')} -->
Карта
<!-- ELSE -->
Без карты
<!-- ENDIF -->

 

И то и то - идеально! спАсибо!

Roffun
#4 13.12.2017 19:58
#43198 Kopusha:

И то и то - идеально! спАсибо!

На других движках такое сделать из шаблона намного проблематичнее, и то на некоторых, вот за это и люблю Cotonti. 

Улетел на другую планету, а там почты нету.. https://www.cotonti.com/forums/45298?m=posts
Kopusha
#5 14.12.2017 12:49
я раз 5 начинал писать вопрос и все время сам находил решение за утро) конская конструкция, работает, и я так понимаю ее упростить не реально кроме как плагином который то же самое будет делать?

 

<!-- IF {PHP.env.ext} == "users" -->
<!-- IF {PHP|cot_import('map', 'G', 'TXT')} -->
<div class="_padding-top-30"  style="height: 500px; background: #fff url(themes/traveller/img/cover_16.jpg) center 75% no-repeat; background-size: cover;">
<!-- ENDIF -->
<!-- IF {PHP.m} == 'profile' -->
<div class="_padding-top-30"  style="height: 500px; background: #fff url(themes/traveller/img/cover_21.jpg) left 75% no-repeat; background-size: cover;">
<!-- ENDIF -->
<!-- IF {PHP.m} == 'details' -->
<div class="_padding-top-30"  style="height: 500px; background: #fff url(themes/traveller/img/cover_21.jpg) left 75% no-repeat; background-size: cover;">
<!-- ENDIF -->
<!-- IF !{PHP|cot_import('map', 'G', 'TXT')} AND {PHP.m} != 'profile' AND {PHP.m} != 'details' -->
<div class="_padding-top-30"  style="height: 500px; background: #fff url(themes/traveller/img/cover_15.jpg) center 75% no-repeat; background-size: cover;">
<!-- ENDIF -->

<!-- ELSE -->


<!-- IF {PHP.env.ext} == "index" OR {PHP.env.ext} == 'folio' OR {PHP.env.ext} == 'marketorders' OR {PHP.env.ext} == 'market' OR {PHP.env.ext} == 'projects' OR {PHP.env.ext} == 'page' OR {PHP.env.ext} == 'forums' -->
<!-- IF {PHP.env.ext} == 'index' -->
<div class="_padding-top-30"  style="height: 500px; background: #fff url(themes/traveller/img/cover_6.jpg) left 75% no-repeat; background-size: cover;">
<!-- ENDIF -->
<!-- IF {PHP.env.ext} == 'marketorders' -->
<div class="_padding-top-30"  style="height: 500px; background: #fff url(themes/traveller/img/cover_10.jpg) left 75% no-repeat; background-size: cover;">
<!-- ENDIF -->
<!-- IF {PHP.env.ext} == 'page' -->
<div class="_padding-top-30"  style="height: 500px; background: #fff url(themes/traveller/img/cover_1.jpg) center 75% no-repeat; background-size: cover;">
<!-- ENDIF -->
<!-- IF {PHP.env.ext} == 'folio' -->
<div class="_padding-top-30"  style="height: 500px; background: #fff url(themes/traveller/img/cover_7.jpg) center 75% no-repeat; background-size: cover;">
<!-- ENDIF -->
<!-- IF {PHP.env.ext} == 'market' -->
<div class="_padding-top-30"  style="height: 500px; background: #fff url(themes/traveller/img/cover_4.jpg) center 45% no-repeat; background-size: cover;">
<!-- ENDIF -->
<!-- IF {PHP.env.ext} == 'projects' -->
<div class="_padding-top-30"  style="height: 500px; background: #fff url(themes/traveller/img/cover_3.jpg) center 45% no-repeat; background-size: cover;">
<!-- ENDIF -->
<!-- IF {PHP.env.ext} == 'forums' -->
<div class="_padding-top-30"  style="height: 500px; background: #fff url(themes/traveller/img/cover_5.jpg) center 45% no-repeat; background-size: cover;">
<!-- ENDIF -->

<!-- ELSE -->

<div class="_padding-top-30"  style="height: 500px; background: #fff url(themes/traveller/img/cover_12.jpg) left 75% no-repeat; background-size: cover;">
<!-- ENDIF -->


<!-- ENDIF -->

 

Roffun
#6 14.12.2017 18:29
#43200 Kopusha: я раз 5 начинал писать вопрос и все время сам находил решение за утро) конская конструкция, работает, и я так понимаю ее упростить не реально кроме как плагином который то же самое будет делать?

В первую очередь все зависит от целей. Упростить код можно, но для этого нужно вникать в суть задачи, цели, тз, и прочее. Если цель всего лишь вывод разных стилей для <div class="_padding-top-30">, то подобные реализации не обязательно делать через кучу условий.

1. Если можно оптимизировать код с помощью css - стоит оптимизировать, почему бы не заменить style на класс, а потом с помощью css подставлять ?
2. Вместо кучи проверок можно использовать вывод конструкции в FILE с нужным выражением или условиями, или даже вместо имени .tpl файла подставить {PHP.env.ext}, и т.д. Например {FILE "{PHP.cfg.themes_dir}/{PHP.theme}/inc/traveller-{PHP.env.ext}.tpl"} - это если кода много, то создаете в шаблоне какую-нибудь папку, например inc, в ней файлы вида traveller-default.tpl, traveller-page.tpl и т.д.
3. Можно написать PHP функцию.

p.s. сейчас покажу на примере

Добавлено 29 минут спустя:

Например, для users пример с помощью html класса и css к нему:

<style>
[class*="traveller-"]{
height: 500px; 
  background-color: #fff; 
  background-size: cover; 
  background-repeat: no-repeat;  
}

.traveller-users-map {
 background-image: url(themes/traveller/img/cover_16.jpg);
 background-position: center 75%;
}

.traveller-users-nomap {
 background-image: url(themes/traveller/img/cover_15.jpg);
 background-position: center 75%;
}

.traveller-users-profile {
 background-image: url(themes/traveller/img/cover_21.jpg);
 background-position:  left 75%;
}

.traveller-users-details {
 background-image: url(themes/traveller/img/cover_21.jpg);
 background-position:  left 75%;
}
</style>
<!-- IF {PHP.env.ext} == "users" -->

    <!-- IF {PHP|cot_import('map', 'G', 'TXT')} -->
    <div class="_padding-top-30 traveller-users-map">
    <!-- ELSE -->
    
        <!-- IF {PHP.m} != 'profile' AND {PHP.m} != 'details' -->
            <div class="_padding-top-30 traveller-users-nomap">
        <!-- ENDIF -->
        <!-- IF {PHP.m} == 'profile' -->
            <div class="_padding-top-30 traveller-users-profile">
        <!-- ENDIF -->
        <!-- IF {PHP.m} == 'details' -->
            <div class="_padding-top-30 traveller-users-details">
        <!-- ENDIF -->
    
    <!-- ENDIF -->

<!-- ENDIF --> 

А вот для остальных с помощью отдельных tpl для примера:

<!-- IF {PHP.env.ext} == "index" OR {PHP.env.ext} == 'folio' OR {PHP.env.ext} == 'marketorders' OR {PHP.env.ext} == 'market' OR {PHP.env.ext} == 'projects' OR {PHP.env.ext} == 'page' OR {PHP.env.ext} == 'forums' -->
{FILE "{PHP.cfg.themes_dir}/{PHP.theme}/inc/traveller-{PHP.env.ext}.tpl"}
<!-- ELSE -->
{FILE "{PHP.cfg.themes_dir}/{PHP.theme}/inc/traveller-default.tpl"}
<!-- ENDIF -->

 

Добавлено 1 час спустя:

И наконец вариант с PHP функцией для примера, для users и index, остальное можно дописать самостоятельно на основе примера.

В каждом шаблоне есть PHP файл с названием шаблона, например nemesis.php, в него добавляете такой код:

function traveller()
{
    global $env, $m;
    $traveller_class = '';

    if (in_array($env['ext'], array(
        'index',
        'users',
        'page',
        'forums',
        'projects',
        'folio',
        'market')))
    {
        $traveller_class = 'traveller-' . $env['ext'];
        switch ($env['ext'])
        {
            case "users":
                if (cot_import('map', 'G', 'TXT'))
                {
                    $traveller_class .= '-map';
                }
                else
                {
                    if ($m != 'profile' && $m != 'details')
                    {
                        $traveller_class .= '-nomap';
                    }
                    if ($m == 'profile')
                    {
                        $traveller_class .= '-profile';
                    }
                    if ($m == 'details')
                    {
                        $traveller_class .= '-details';
                    }
                }
                break;

            case "index":
                //$traveller_class .= '-any';
                break;
            case "page":
                //$traveller_class .= '-any';
                break;
            case "forums":
                //$traveller_class .= '-any';
                break;
            case "projects":
                //$traveller_class .= '-any';
                break;
            case "folio":
                //$traveller_class .= '-any';
                break;
            case "market":
                //$traveller_class .= '-any';
                break;
        }
    }
    return $traveller_class;
}

В нужном месте шаблона можно использовать функцию одним из нескольких способов:

1. Добавить к html коду функцию, она будет выводить класс, если совпадает условие или исчезать если условие не совпадает:

<div class="_padding-top-30  {PHP|traveller}">

2. Использовать как условный оператор:

<!-- IF {PHP|traveller} --> 
или
<!-- IF {PHP|traveller} == 'traveller-users-nomap' -->  

3. Придумать самостоятельно что еще с ней можно делать.

Итог: Для перечисленных в условии расширений функция будет возвращать класс вида traveller-расширение или если есть дополнительное условие как для users, то будет возвращать traveller-расширение-приставка.

Улетел на другую планету, а там почты нету.. https://www.cotonti.com/forums/45298?m=posts
Отредактировано: Roffun (14.12.2017 20:16, 6 лет назад)
Kopusha
#7 14.12.2017 22:58

Ой как круто) Я на свежую голову обязательно сделаю все варианты просто что бы научиться как минимум.

Added 15 hours later:

Третий вариант со своей функцией - отлично работает - огромное спасибо. Уже в следующий раз полезу сам писать функцию, так гораздо проще. Не факт что с 1 раза выйдет, но малпомалу)

PS - добавил к функции 

    else
    $traveller_class = 'traveller-else';

 

Added 2 hours later:

И еще с логискими блоками

Основной вопрос наверное - я не понимаю разницы OR и AND в блоке. В примере ниже - если не 1 или если менее 100 то верное. 

Есть конструкция <!-- IF {PHP.usr.profile.user_hide_hints} != '1' OR {PHP.usr.profile.user_logcount} <= '100' -->show<!-- ENDIF -->

Показывать подсказку если в профиле НЕ включено экстраполе со значением 1 или если юзер зашел менее 100 раз. 

Если нажал "Не показывай" то эстрполе = 1. И неважно сколько user_logcount - не будет показывать. Если user_logcount больше 100 то неважно больше что в экстраполе - не показывает. Если в экстраполе не 1 и user_logcount менее 100 - показывай. 

Блин - а как написать то? Так как наверху только при двух совпадениях работает.

Кроме такого конечно - так работает верно. 

<!-- IF {PHP.usr.profile.user_hide_hints} != '1' -->

<!-- IF {PHP.usr.profile.user_logcount} <= '100' -->

show

<!-- ENDIF -->

<!-- ENDIF -->

Вроде как все верно работает - это я не верно думаю/

 

Отредактировано: Kopusha (15.12.2017 16:51, 6 лет назад)