Модератор форума: Yuri_G  
Условные операторы и системные коды
Модератор форума
Сообщение # 1 | 04:36:06
Условные операторы от новичка до профи

Если вы совершенно не понимаете, как работают условные операторы, и информации в панели управления для вас мало, то я попробую вам объяснить. Самое главное, чтобы вы настроились на то, что это очень просто. Так оно и есть!

И так, начну с понятий. Условные операторы - это специальные коды-символы, которые могут выполнять какие-то сценарии. Вы можете создать совершенно новую опцию на своём сайте, которая собственно не предусмотрена панелью.

Для начала нужно понять и привыкнуть к составляющим частям самого кода сценария, а это:

Код
<?if($код$)?> - это какое-то условие (код), которое говорит оператору с кем мы имеем дело и с чем работать. Заменяем мысленно фразой «Если есть»;

Код
<?else?>- это оператор которое выполнит то, что вы скажете, когда условие не соответствует названным. Мысленно заменяем фразой «Если нет»;

Код
<?endif?> - это конец условного оператора, мысленно заменяем «Конец»;



Теперь разберем простой пример, который приводится в панели управления:

(Из редактора страниц)

Код
<?if($USER_LOGGED_IN$)?>Hello, $USERNAME$<?else?>You are GUEST. Please register.<?endif?>


Что это на нашем языке написано: «Если есть авторизированный пользователь, то «Привет его логину!», а если нет, «Привет Гостю!» и конец.»


Почему? Откуда? Подробней!

Что в данном коде использовалось:

Мы оператору
Код
<?if($код$)?>
сообщили, что наш сценарий направлен, чтобы поздороваться с теми, кто авторизирован. Мы поставили вместо $код$ следующий
Код
$USER_LOGGED_IN$
, то есть сказали «Если есть авторизированный -
Код
<?if($USER_LOGGED_IN$)?>
». После идет какая-то ваша информация доступна только авторизированным. Однако мы попутно можем использовать условие если они не соответствуют названным, а именно у нас не соответствуют Гости. Значит, мы после информации для зарегистрированных вписываем информацию для гостей.

Получаем
Код
<?if($USER_LOGGED_IN$)?> Привет, $USERNAME$ <?else?> Привет Гость!


Осталось закрыть всё это дело концовкой.
Код
<?if($USER_LOGGED_IN$)?> Привет, $USERNAME$<?else?>Привет Гость! <?endif?>


Мы так же можем исключить Гостей совершенно и вывести информацию только зарегистрированным. Для этого просто не используем «Если нет». Получаем следующее:

Код
<?if($USER_LOGGED_IN$)?> Как хорошо, что вы зарегистрировались! <?endif?>


То есть в данном случае фразу «Как хорошо, что вы зарегистрировались!» видят только те, кто вошёл под логином.


Условием для работы операторов может быть любой код, который указан как работающий в каком-то модуле. В нашем случае (редактор страниц) могут примеры:

Выход и вход:

Код
<?if($USER_LOGGED_IN$)?> <a href="$LOGOUT_LINK$">ВЫХОД</a> <?else?> <a href="$LOGIN_LINK$">ВХОД</a> <?endif?>


Дни после регистрации:

Код
<?if($USER_LOGGED_IN$)?>Вы с нами уже$USER_REG_DAYS$ дней!<?else?>Пожалуйста, зарегистрируйтесь. <?endif?>


И так далее.

Условия для сценария можно изменить с помощью дополнительных возможностей, которые поддерживают операторы. Это знаки «=», «>», «<». При необходимости, приравненные разделяются вертикальной чертой. После знака, вы сообщаете оператору на кого направлен весь сценарий.

Код
<?if($код$='условие')?> Я это вижу <?else?> А вот я вижу это<?endif?>


Или

Код
<?if($код$='условие')?> Самое главное, что я это вижу <?endif?>


Пример:

Код
<?if($USER$='Дима')?> Дима, не забудь каждый день читать почту. <?endif?>


То есть, на словах «Если есть логины вошедших и среди них есть Дима (='Дима'), то ему показать это…»

То же самое касается групп, имён, пола, даты и всего что работает из кодов.

Ещё примеры:

Код
<?if($USER$='Mike' or $USER$='Lola')?> Дима и Света, вот тайная ссылочка …. <?endif?>


Группы:

Код
<?if($GROUP_ID$=3 or $GROUP_ID$=4)?>Модеры и Админы, все кликаем на рекламу тут… <?endif?>


И т.д.


Однако операторы могут работать друг в друге.

Пример:

Код
<?if($USER_LOGGED_IN$)?> Привет $USER$! <?if($GROUP_ID$=3 || $GROUP_ID$=4)?> Не забываем кликать на рекламу!<?endif?><?else?>Пожалуйста, зарегистрируйтесь.<?endif?>


Сценарий такой: «Если есть вошедшие, то Привет им, а если среди них есть Админы и Модеры, то добавить Кликаем на рекламу, если есть то кто не вошел, то просим зарегистрироваться и конец.»


Самое главное хорошо подумать, как написать сценарий, какие для этого использовать коды и кому они будут направляться. Можно написать что угодно, что придет на ум. uCoz настолько гибкий, что мне иногда кажется, что он живой и создатели сами точно не знают сколько и чего будет работать. Ну всё есть! Самое главное подумайте.

Теперь напоследок мини-инфо:


Код
* Сколько <?if($код$)?> столько и <?endif?>
* <?else?> нужно, когда выводим инфу для тех, кто не соответствует условиям, в других случаях оно не нужно
* Поддерживаются альтернативные условия or и and (||и [&&)
* Поддерживается вложенность операторов
* Поддерживается сравнение переменных друг с другом: <?if($VAR1$=$VAR2$)?>
* При сравнении текст обязательно должен быть в кавычках: <?if($USER$='Mike') ?>


Вопрос - ответ
Цитата
При создании новых страниц, закачанных через FTР, коды
Код
$SITE_NAME$, $LOGIN_LINK$, $LOGOUT_LINK$
отображаются в виде текста, а не того, чтобы хотелось... Почему они не работают?
$Коды$ будут работать только на динамических страницах, то есть тех, которые созданы в Панели управления через опцию "Создать страницу". В статических страницах, закаченных извне с расширением .html эти $Кода$ работать не будут.
Цитата
Как сделать альтернативные условия, например для кода
Код
$GROUP_ID$
?
Код
<?if($GROUP_ID$=5 or ($GROUP_ID$=4 and $USER$='Alex'))?>...<?endif?>
Цитата
Есть ли операторы, позволяющие пользователю видеть в списке категорий только те, в которые он имеет доступ?
Это можно сделать только строя список категорий вручную. Т.е. проверяете текущю группу и выводите нужный список категорий. Уровнем выше проверяете на необходимый раздел.
Цитата
Код
$GROUP_ID$
не работает в шаблоне мини-чата, почему?
Сообщения чата кешируются, поэтому использовать в чате динамически изменяющиеся коды нельзя.
Цитата
Есть код
Код
$USER_LOGGED_IN$
. А есть ли $USER_LOGGED_OUT$?
Нужно прото сделать отрицание в условии
Код
<?if(!$USER_LOGGED_IN$)?>


rodatam
Сообщений: 160
Репутация: 12

Сообщение # 211 | 15:50:22
Вопрос уже решил, использовав другое условие

<?if(strpos($ORDER_TAX$,'€-')='-1')?><td><h4><!--<s4607>-->Costo de envío<!--</s>--></h4>$ORDER_TAX$</td><?else?><td><h4><!--<s4607>-->Suma de descuento<!--</s>--></h4>$ORDER_TAX$</td><?endif?>

Правда хотелось бы узнать где была ошибка в предыдущем варианте, если кто знает, напишите пожалуйста.

Сообщение отредактировал rodatam - Суббота, 03 Сен 2011, 15:50:49
Как_В_Старой_Сказке
Сообщений: 18
Репутация: 7

Сообщение # 212 | 18:57:26
Ну помогите осуществить же условие:

<?if($URI_ID$='nwCat3')?><?if($Страница$='1')?>Мой текст<?endif?><?endif?>

Если категория - 3, если страница - первая - текст.

Интересует как это - $Страница$='1' - будет правильно.

sch779
Сообщений: 703
Репутация: 348

Сообщение # 213 | 22:11:57
Quote (Как_В_Старой_Сказке)
Ну помогите осуществить же условие

В каком, именно, блоке хотите это сделать?
Практически во всех блоках, где существует постраничный вывод, доступна шаблонная переменная $CURRENT_PAGE$, которая генерит код типа:
Code
<span ...>N</span>

где N - номер текущей страницы.
Вам нужно посмотреть - что именно генерит эта переменная в Вашем случае.
Если генерит как я привел выше, то проверка простая:
Code
<?if(($URI_ID$='nwCat3') && (substr($CURRENT_PAGE$,'>1<') != -1))?>Первая страница в третьей категории<?endif?>
sch779
Сообщений: 703
Репутация: 348

Сообщение # 214 | 02:02:33
Quote (Как_В_Старой_Сказке)
$CURRENT_PAGE$ и $PAGE_SELECTOR$ не работают.

Если я Вас правильно понял, то речь идет о модуле "Новости сайта"?
Просто дело в том, что это единственный модуль, который не поддерживает переменную $CURRENT_PAGE$!

Если так, то решить Вашу задачу на уровне шаблонов не получиться - только через JavaScript уже в браузере пользователя.
Т.е., в головной шаблон модуля "Новости", после $BODY$, вставляется вызов небольшого JS-кода, который ищет на текущей странице тег <b class="swchItemA"> - по крайней мере именно этот тег в моих шаблонах обрамляет номер текущей страницы списка новостей (переключатель страниц внизу страницы). Из найденного тега берем текст и сравниваем с "1" - если совпадение, то значит находимся на первой странице и можно выполнить необходимые действия:
Code
<script>
if ($("b.swchItemA").text() = "1") {первая страница}
</script>


Что выполнять на первой странице - вопрос уже другой.
Если Вы хотите просто отобразить на первой странице некий текст, то можно его сразу "вбить" в основном шаблоне модуля "Новости", в том месте страницы, где он должен выводиться на первой странице и по-умолчанию "закрыть" невидимым div-ом:
Code
<div id="firstPageMsg" style="display:none">
Вы находитесь на первой странице модуля "Новости"!
</div>


Соответственно, код проверки модифицируем следующим образом:
Code
<script>
if ($("b.swchItemA").text() = "1") {$("div#firstPageMsg").show();}
</script>
olegsuv
Сообщений: 1365
Репутация: 127

Сообщение # 215 | 02:56:18
Quote (sch779)
код проверки модифицируем следующим образом:

Уважаемый, вы в условии присваиваете, а не сравниваете.

Любые работы по:
- Javascript, jQuery, HTML, CSS
- Верстке макетов и установке их на сайты
- Нестандартным решениям
sch779
Сообщений: 703
Репутация: 348

Сообщение # 216 | 15:25:51
Quote (mob_dp2)
вы в условии присваиваете, а не сравниваете.

О, верно, прошу прощения за описку и спасибо за поправку!
Code
<script>   
if ($("b.swchItemA").text() == "1") {$("div#firstPageMsg").show();}   
</script>
Сообщение отредактировал sch779 - Воскресенье, 11 Сен 2011, 15:26:12
malroz
Сообщений: 202
Репутация: 39
Уровень замечаний:

Сообщение # 217 | 15:21:18
подскажите, плиз, как сделать так, что бы гостям размещенные мною ссылки (например: скачать, здесь и т.д.) были кликабельны только ля зарегистрированных, но когда ссылку нажимают гости (они ссылку видят и весь материал!), всплывало окошко для регистрации на сайте.
Заранее благодарю за ответ.

мой сайт http://malroz.ru/
malroz
Сообщений: 202
Репутация: 39
Уровень замечаний:

Сообщение # 218 | 15:44:42
Quote (Miss_Esq)
malroz,
Quote
но когда ссылку нажимают гости (они ссылку видят и весь материал
Это ещё смотря в каком виде ссылка ( ссылка , кнопка и т п )

в самом обыкновенном, например скачать

P.S. нашел скрипт

но маленько не то, что я хочу….нужно что б окошко всплывало, сами ссылки были видны, желательно чтобы скрипт работал на всем сайте (скрипт, который я нашел, как я понял только для форума!)

мой сайт http://malroz.ru/
olegsuv
Сообщений: 1365
Репутация: 127

Сообщение # 219 | 16:02:20
Некропостеры блин, насилуют скрипты 5 летней давности.

Code
$('a.link').attr('href','javascript://').attr('onclick','new _uWnd("Register","Register",400,200,{},"Зарегистрируйтесь"')


malroz, а теперь объясните, зачем вы такое западло суете своим пользователям? Хотите по-быстрее опустошить сайт? Так давайте в гугле забаним и делов то.

Любые работы по:
- Javascript, jQuery, HTML, CSS
- Верстке макетов и установке их на сайты
- Нестандартным решениям
kostik-tlt
Сообщений: 27
Репутация: 15

Сообщение # 220 | 19:33:20
Скажите пожалуйста, какой оператор(тапа URI_ID) определяет все статьи определённой категории каталога статей. Т.е. в первом блоке нужно прописать <?if(все стр.категории кат.статей)?> то...

Попробовал так: <?if($MODULE_ID$= 'publ' and $CID$= '2')?> , но какая-то хрень получается

Сообщение отредактировал kostik-tlt - Вторник, 20 Сен 2011, 20:17:58
sch779
Сообщений: 703
Репутация: 348

Сообщение # 221 | 23:08:27
Quote (kostik-tlt)
Скажите пожалуйста, какой оператор(тапа URI_ID) определяет все статьи определённой категории каталога статей

Вы нормально можете описать свою задачу?!
  • Что значит "в первом блоке"?
  • Что именно Вы хотите проверять условием?
  • Для чего нужна проверка?

    Если Вы хотите в каком-либо шаблонном блоке на странице вывести статьи из опеределенной категории, то это делается довольно просто стандартным информером по каталогу статей.
    Если же Вы хотите на странице определенной категории вывести определенную надпись или "повесить" баннер, то это тоже довольно просто делается в шаблоне "Страница со списком материалов категории" через условие типа ($URI_ID$ = 'puCat2').
    А больше, в принципе, ничего сделать и невозможно так как ни в одном из шаблонов блока "Каталог статей" невозможно получить доступ в процесс формирования списка выводимых статей, который "прячется" за переменной $BODY$. sad
    И если Ваша задача связанна именно с разбором $BODY$, то решать ее прийдется только с помощью js-скрипта, который будет из сформированного списка удалять (или скрывать) ненужные статьи.
    Хотя, имхо, с подобной задачей, как я уже писал выше, прекрасно справляется информер по данному блоку с установленным фильтром на заданную категорию.
  • kostik-tlt
    Сообщений: 27
    Репутация: 15

    Сообщение # 222 | 08:06:32
    sch779, вы отвечали на мой вопрос по поводу условия(на 29 стр.). Опишу проблему подробнее. Первый блок - это блок в котором располагаются меню и все блоки, он выводится на всех страницах сайта.(если неправильно объясняю, сайт remont-tlt.ru, справа "ремонт квартиры", "строительство", "топ 10" и т.д.) Есть каталок статей, в нём категории (1,2,3). Нужно, что бы определённая надпись выводилась на страницах всех материалов категории 1, и только на них.

    sch779
    Сообщений: 703
    Репутация: 348

    Сообщение # 223 | 16:06:26
    Quote (kostik-tlt)
    Нужно, что бы определённая надпись выводилась на страницах всех материалов категории 1

    Если речь идет о шаблоне "Страница материала и комментариев к нему", то все достаточно очевидно - в месте этого шаблона, где должна выводиться надпись, вставляем код типа:
    Code
    <?if($CID$ == 1)?>
    <div align="center">Материал категории с кодом 1</div>
    <?endif?>

    Если же речь идет о выводе нужной надписи на каждой странице списка материалов нужной категории, то идем в шаблон "Страница со списком материалов категории" и в нужном месте вставляем код типа:
    Code
    <?if(substr($URI_ID$,5) == 1)?>
    <div align="center">Материалы категории с кодом 1</div>
    <?endif?>

    Кстати - сайт по приведенной ссылке недоступен. Видно закрыл на реконструкцию?
    kostik-tlt
    Сообщений: 27
    Репутация: 15

    Сообщение # 224 | 19:44:20
    sch779, сайт работает, сайт. Дело в том, что код нужно прописывать не в "Страница материала и комментариев к нему" и не в "Страница со списком материалов категории". Первый блок это глобальные переменные (в моём случае это вертикальная полоса с права где располагаются меню). Там $CID$ не работает. $URI_ID$ задаются для конкретной одной странице.

    Можно прописать что-то вроде <?if(от $puEnt1$ до $puEnt100$)?> ??? , где $puEnt$ это URI_ID страници материала и комментариев к нему

    Сообщение отредактировал kostik-tlt - Пятница, 23 Сен 2011, 19:45:05
    sch779
    Сообщений: 703
    Репутация: 348

    Сообщение # 225 | 03:42:03
    Quote (kostik-tlt)
    Можно прописать что-то вроде

    Code
    <?if(substr($URI_ID$,0,5) == "puEnt") && (substr($URI_ID$,5) >= 1) && (substr($URI_ID$,5) <= 100)?>
    В данный момент открыта страница одной из статей с идентификатором от 1 до 100.
    <?endif?>
    Поиск: