Модератор форума: 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$)?>


rezkiy
Сообщений: 31
Репутация: 0

Сообщение # 1006 | 20:05:49
Спасибо щас попробую!

Quote (Астра)
rezkiy, или так:
<?if(!$PRICE_OLD$)?>$BRIEF$<?endif?>

Это не работает
Спасибо , разобрался сам.
сделал так <?if(Прайс Олд)?>стиль, фон и тэдэ><?else?><span style="font-size: 11pt"><font color="#000000">$BRIEF$<?endif?>
Вот так отображаеться цена со скидкой перечеркнутой, а если нету скидки то Бриф- что у нас тоже цена. B)
Сообщение отредактировал rezkiy - Вторник, 25 Сен 2012, 20:17:17
Rammetall
Сообщений: 10
Репутация: 0

Сообщение # 1007 | 14:02:21
Сколько максимально можно сделать альтернативных условий? (<?if($URI_ID$='page1' || $URI_ID$='page2' || $URI_ID$='page3' ||...........)
KaiLee
Сообщений: 5463
Репутация: 1135

Сообщение # 1008 | 14:10:00
Rammetall,
Наверно, много... Но если у Вас так много подходящих условий, не проще ли идти от неподходящих?

В ЛС - только адреса и пароли. Все остальное - на форуме.
Студия | Шаблоны | Статьи
Rammetall
Сообщений: 10
Репутация: 0

Сообщение # 1009 | 14:15:42
У меня их как раз наполовину. :(

Хотелось бы узнать, есть ли вообще ограничения на это. По идее не должно, но у меня ограничение вроде ставиться на 48, проверял на ошибки - не нашёл.
sch779
Сообщений: 703
Репутация: 348

Сообщение # 1010 | 15:03:18
Можно поступить проще:
Code

<?if (strpos(substr($URI_ID$,-5),'page1,page2,...,age10,...,ge100') != -1)?>Код для всех страниц, перечисленных в списке<?endif?>

Зачем substr? Дело в том, что если просто искать вхождение всей строки $URI_ID$, то, к примеру, страница 'page1', в этом случае, совпадет с 'page1' и с 'page10' и с 'page11' и т.д.!
А вышеприведенный код будет работать правильно для любых значений $URI_ID$!
Drinko
Сообщений: 909
Репутация: 773

Сообщение # 1011 | 15:22:51
Quote (Rammetall)
Сколько максимально можно сделать альтернативных условий?

Сколько угодно.

Rammetall
Сообщений: 10
Репутация: 0

Сообщение # 1012 | 19:06:56
Огромное спасибо за ответы!

Добавлено (29-Сен-2012, 18:34:59)
---------------------------------------------
Но я всё-равно не понимаю, почему у меня стоит ограничение на 48 условий...

Добавлено (29-Сен-2012, 18:38:53)
---------------------------------------------
при превышении лимита в 48 условий, все эти условия переделываются почему-то в неподходящие.

Добавлено (29-Сен-2012, 18:51:21)
---------------------------------------------
точнее, при превышении лимита прописанные условия просто как будто исчезают из кода, хотя они прописаны.

Добавлено (29-Сен-2012, 19:06:56)
---------------------------------------------
извиняюсь, точнее 49

Drinko
Сообщений: 909
Репутация: 773

Сообщение # 1013 | 20:44:14
Rammetall, может неправильно прописаны? Полный код приведите.

Rammetall
Сообщений: 10
Репутация: 0

Сообщение # 1014 | 22:02:42
Вот код всего, что задействовано:
$GLOBAL_AHEADER$:
Code
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>$SITE_NAME$ - $MODULE_NAME$</title>
<?$META_DESCRIPTION$?>
<link type="text/css" rel="StyleSheet" href="/_st/my.css" />
</head>
<body style="background-color:#000000; margin:0;padding:0;">
$ADMIN_BAR$
<div align='center'><img alt='' src='/head/head.png'>
<br>
<table cellspacing='0' cellpadding='0'>
<tr>
<td><a href='/'><img src='/head/glav1.png' onmouseover="this.src='/head/glav2.png'" onmouseout="this.src='/head/glav1.png'" border='0' alt='Home'></a></td>
<td><a href='/index/concerts/0-5'><img src='/head/conc1.png' onmouseover="this.src='/head/conc2.png'" onmouseout="this.src='/head/conc1.png'" border='0' alt='Concerts'></a></td>
<td><a href='/search/?q='><img src='/head/pois1.png' onmouseover="this.src='/head/pois2.png'" onmouseout="this.src='/head/pois1.png'" border='0' alt='Search'></a></td>
<td><a href='/index/contacts/0-7'><img src='/head/cont1.png' onmouseover="this.src='/head/cont2.png'" onmouseout="this.src='/head/cont1.png'" border='0' alt='Contacts'></a></td>
</tr>
</table></div>
<!-- <middle> -->
<table border="0" cellpadding="0" cellspacing="0" width="900px" align="center">
<tr>
<td valign="top" width="900px" style="padding-top:5px">
<table border="0" cellpadding="10" cellspacing="0" width="100%" style="border:2px solid #880000;"><tr><td style="background:#000000;"><!-- <body> -->

Страницы сайта:
<?if($URI_ID$='page1' || $URI_ID$='page2' || $URI_ID$='page3' || $URI_ID$='page4' || $URI_ID$='page5' || $URI_ID$='page6' || $URI_ID$='page7' || $URI_ID$='page8' || $URI_ID$='page9' || $URI_ID$='page10' || $URI_ID$='page11' || $URI_ID$='page12' || $URI_ID$='page13' || $URI_ID$='page14' || $URI_ID$='page15' || $URI_ID$='page16' || $URI_ID$='page17' || $URI_ID$='page18' || $URI_ID$='page19' || $URI_ID$='page20' || $URI_ID$='page21' || $URI_ID$='page22' || $URI_ID$='page23' || $URI_ID$='page24' || $URI_ID$='page25' || $URI_ID$='page26' || $URI_ID$='page27' || $URI_ID$='page28' || $URI_ID$='page29' || $URI_ID$='page30' || $URI_ID$='page31' || $URI_ID$='page32' || $URI_ID$='page33' || $URI_ID$='page33' || $URI_ID$='page34' || $URI_ID$='page35' || $URI_ID$='page36' || $URI_ID$='page37' || $URI_ID$='page38' || $URI_ID$='page39' || $URI_ID$='page40' || $URI_ID$='page41' || $URI_ID$='page42' || $URI_ID$='page43' || $URI_ID$='page44' || $URI_ID$='page45' || $URI_ID$='page46' || $URI_ID$='page47' || $URI_ID$='page48' || $URI_ID$='page49' || $URI_ID$='page50')?>$GLOBAL_AHEADER$<?endif?>
$CONTENT$<!-- </body> --></td></tr></table>
</td>
</tr>
</table>
<!-- </middle> -->
<div align='center'>$POWERED_BY$</div>
</body>
</html>
Сообщение отредактировал webanet - Воскресенье, 30 Сен 2012, 00:53:00
sch779
Сообщений: 703
Репутация: 348

Сообщение # 1015 | 23:46:32
Скорее всего, ограничение связано с длинной условного выражения внутри оператора <?if?>
Или, что более вероятно, с общей длинной условного оператора начиная с открывающей угловой скобки и до закрывающей.

Хотя - нет. Сейчас глянул - ограничение, похоже, именно на количество условий внутри if - 48, если добавить 49-ое условие, то уже не работает.

Хотя, при грамотном использовании условных операторов на эти "грабли" очень трудно наступить!
Я еще ни разу на подобные ограничения не наталкивался - предпочитаю очень длинные и трудночитаемые условия заменять на более "удобоваримые" конструкции. К примеру, типа той, что я приводил выше - там точно ограничений не будет!

Кстати, если будешь переводить свое условие по моему примеру, то не забудь про ограничение оператора strpos - ищет в первых 1000 символах! Так что, если строка со списком страниц будет больше 1000 символов, то разбей ее на несколько:
Code
<if (strpos(substr($URI_ID$,-5),'page1,page2,page3') != -1) || (strpos(substr($URI_ID$,-5),'page4,page5,page6') != -1)>Код<?endif?>
Сообщение отредактировал sch779 - Воскресенье, 30 Сен 2012, 00:12:54
Rammetall
Сообщений: 10
Репутация: 0

Сообщение # 1016 | 23:53:17
sch779, а сократить его как-то можно?
Miss_Esq
Сообщений: 13859
Репутация: 4159
Уровень замечаний:

Сообщение # 1017 | 00:00:14
Rammetall, Вы вообще что добиваетесь этими Условными Операторами ..

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

Сообщение # 1018 | 00:20:23
Quote (Rammetall)
а сократить его как-то можно?

Смотря какое условие Вам нужно. Если именно то, которое Вы привели, то можно вообще упростить до минимума:
Code
<?if ((substr($URI_ID$,0,4) == 'page') && (substr($URI_ID$,4) >= 1) && (substr($URI_ID$,4) <= 50))?>$GLOBAL_AHEADER$<?endif?>

Этот код выведет заголовок на всех страницах в диапазоне 'page1' - 'page50'
Сообщение отредактировал sch779 - Воскресенье, 30 Сен 2012, 00:24:57
Rammetall
Сообщений: 10
Репутация: 0

Сообщение # 1019 | 17:31:18
sch779, воооооооот, работает!!! Наконец-то есть решение, а то я запарился уже над этой проблемой думать! ОГРОМНОЕ Вам спасибо!

А можно спросить, что означает цифра 4 в коде, что-то я не пойму.

Добавлено (30-Сен-2012, 00:40:47)
---------------------------------------------
И как я понимаю, постраничное указывание в условии не будет работать (то есть как у меня изначально было), если там больше 48 условий?

Добавлено (30-Сен-2012, 00:51:47)
---------------------------------------------
И ещё: вводил этот код: <?if (strpos(substr($URI_ID$,-5),'page1,page2,page3') != -1)?>$GLOBAL_AHEADER$<?endif?>
Почему-то не работает.

Добавлено (30-Сен-2012, 12:13:31)
---------------------------------------------
А, всё, вспомнил для чего 4 нужна)

Добавлено (30-Сен-2012, 17:31:18)
---------------------------------------------
sch779, не в курсе, почему код <?if (strpos(substr($URI_ID$,-5)...... может не работать?

Miss_Esq
Сообщений: 13859
Репутация: 4159
Уровень замечаний:

Сообщение # 1020 | 17:35:10
Rammetall,
Quote
А можно спросить, что означает цифра 4 в коде, что-то я не пойму
Сколько симолов от начала нужно отбросить, (то есть слово page), и сравнивать в Условии только цифры оставшиеся от урезания строк типа page1 - page50
Quote
может не работать?
да

Сообщение отредактировал Miss_Esq - Воскресенье, 30 Сен 2012, 17:38:06
Поиск:
Telegram
Будьте в курсе всех обновлений: подпишитесь на наш официальный Telegram-канал uCoz и задавайте вопросы в чате сообщества!