Модератор форума: Yuri_G  
Сообщество uCoz » Мастерская uCoz » Дизайн: управление шаблонами » Условные операторы и системные коды (Особенности использования и интересные решения)
Условные операторы и системные коды
Модератор форума
Сообщение # 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$)?>


bandjuk
Сообщений: 6816
Репутация: 2398
Уровень замечаний:

Сообщение # 2041 | 14:11:29
deathbloody,
<?if(substr($URI_ID$,strpos($URI_ID$,'Cat')+3)>=307)?>код<?endif?>
deathbloody
Сообщений: 98
Репутация: 1

Сообщение # 2042 | 14:21:13
bandjuk, так, а как работает данный код, напишите пожалуйста
bandjuk
Сообщений: 6816
Репутация: 2398
Уровень замечаний:

Сообщение # 2043 | 14:28:53
deathbloody, если $URI_ID$ вывод значение равное или больше ldCat307 , то выводится нужная инфа
deathbloody
Сообщений: 98
Репутация: 1

Сообщение # 2044 | 15:12:21
А можно как-то диапазоном сделать?

Добавлено (23 Июл 2014, 15:12:21)
---------------------------------------------
Типа такого:

Код
<?if(substr($URI_ID$,strpos($URI_ID$,'Cat')+3)=307..398)?>код<?endif?>
Сообщение отредактировал deathbloody - Среда, 23 Июл 2014, 15:12:37
bandjuk
Сообщений: 6816
Репутация: 2398
Уровень замечаний:

Сообщение # 2045 | 15:21:01
<?if(substr($URI_ID$,strpos($URI_ID$,'Cat')+3)>=307)?><?if(substr($URI_ID$,strpos($URI_ID$,'Cat')+3)<=398)?>код<?endif?><?endif?>
deathbloody
Сообщений: 98
Репутация: 1

Сообщение # 2046 | 15:22:39
разобрался

Код
substr($URI_ID$,-3)>'321' and substr($URI_ID$,-3)<'399'
bandjuk
Сообщений: 6816
Репутация: 2398
Уровень замечаний:

Сообщение # 2047 | 15:27:15
deathbloody, или так )
АСГАРД
Сообщений: 78
Репутация: 5

Сообщение # 2048 | 14:47:48
Ребята, может кто из профессионалов подскажет возможно ли реализовать следующее!
Итак $PRICE$ нельзя использовать в вычислениях, насколько понял связано с валютой (но не до конца еще разобрался)
Итак товар продается упаковками, и пока приходится ставить цену сразу за упаковку, но также хотелось бы показывать цену и за штуку, (количество в упаквоке указано в доп.поле3) Количество в упаковке может быть разным. Также имеется опция размер влияющая на цену (в этом то вся и загвоздка, что можно использовать цену в чистом виде разделив на количество, но тогда при изменении размера цена за упаковку меняется а за штуку для данного размера нет)
Если бы $PRICE$ можно было умножать или делить на какое то число вопросов бы не было))
onemore
Сообщений: 86
Репутация: 88
Уровень замечаний:

Сообщение # 2049 | 01:16:14
проблема: в сайдблоке длинные теги портят всю красоту. разбивают плиточный вид.

не пойму можно ли тут условие substr или len сделать или тупо j-скриптом. типа если .eTag больше 10 символов display:none.
Сообщение отредактировал onemore - Понедельник, 28 Июл 2014, 01:25:09
EgorKruglikov
Сообщений: 414
Репутация: 150

Сообщение # 2050 | 04:26:33
АСГАРД, здравствуйте, Вы можете использовать иные доступные системные переменные для реализации задачи:
Цитата
$PRICE_RAW$ - значение цены единицы товара в чистом виде
$PRICE_IN_RAW$ - значение входящей цены товара в чистом виде
$PRICE_OLD_RAW$ - значение "старой" цены товара в чистом виде

"в чистом виде" - подразумевается, что цена представлена числовым значением, с которым Вы можете производить вычисления по виду Вами указанному.

---------------------------------------------

onemore, здравствуйте, к сожалению, без конкретного примера проблематично понять суть ситуации. Но, если требуется решение на уровне jQuery - Вы можете попробовать воспользоваться дынным решением:
Код
<script type="text/javascript">
// Реализация – EK: http://vk.com/egorkruglikov
$(document).ready(function () {
var ek_sizet = 8; // Количество допустимых символов
var _0xca0b=["\x6C\x65\x6E\x67\x74\x68","\x74\x65\x78\x74","\x73\x75\x62\x73\x74\x72","\x2E\x2E\x2E","\x65\x61\x63\x68","\x2E\x65\x54\x61\x67"];$(_0xca0b[5])[_0xca0b[4]](function (_0xa641x1){$(this)[_0xca0b[1]]()[_0xca0b[0]]>ek_sizet&&$(this)[_0xca0b[1]]($(this)[_0xca0b[1]]()[_0xca0b[2]](0,ek_sizet)+_0xca0b[3]);} );
};);
</script>

Либо, Вы можете пробовать использовать решение (пункт "Вывод строки текста в многоточие").

Консультация по системе uCoz - разработка скриптов, настройка сайта.
Сообщение отредактировал EgorKruglikov - Понедельник, 28 Июл 2014, 04:26:53
АСГАРД
Сообщений: 78
Репутация: 5

Сообщение # 2051 | 08:29:42
EgorKruglikov12028
Смотрите я имел виду немного другое, вот ссылка на один из товаров на моем сайте http://www.nosokopt.ru/shop/276/desc/detskie-kolgotki-s-141 Итак имеется товар цена указана за упаковку в упаковке 30шт. Но также хотелось бы показать цену за шт. чтобы клиент не сидел и не пересчитывал на калькуляторе, $PRICE_RAW$ подразумевает цену в чистом виде и не связан с опциями))). Т.е. получается я смогу только показать цену самого маленького размера для данного товара, а хотелось бы чтобы для всех размеров цена была как за шт. так и за упаковку
EgorKruglikov
Сообщений: 414
Репутация: 150

Сообщение # 2052 | 10:53:05
АСГАРД, если верно понимаю суть задачи, необходимо, чтобы значение "Цена упаковки" было поделено на значение "Количество в упаковке", и тем самым отображалась бы информация о стоимости одного товара данного упаковки? При этом, если опции изменяются, то и стоимость одного товара в упаковке также должна соответствовать выбранной опции? Если верно данное предположение, то, задача решаема через jQuery (javascript).

- -

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

Консультация по системе uCoz - разработка скриптов, настройка сайта.
Сообщение отредактировал EgorKruglikov - Понедельник, 28 Июл 2014, 11:29:52
АСГАРД
Сообщений: 78
Репутация: 5

Сообщение # 2053 | 14:04:53
Цитата EgorKruglikov ()
На тестовом сайте примерный скрипт реализации написан, если Вам необходимо, возможно будет установить решение на Вашем сайте.

Да все верно необходимо просто $PRICE$ разделить на значение в доп поле 3, но также учитывать наценку в опциях. На каком тестовом сайте можно увидеть?
EgorKruglikov
Сообщений: 414
Репутация: 150

Сообщение # 2054 | 18:42:47
АСГАРД, ответил личным сообщением.

Консультация по системе uCoz - разработка скриптов, настройка сайта.
lupus
Сообщений: 7
Репутация: 1

Сообщение # 2055 | 11:04:17
У меня задача — скрыть раздел блога (13) от незалогиненных (999) и группы Пользователи (1),
и показывать его только группам Проверенные (2) , Модераторы (3) , и Администраторы (4)

Увы, система не имеет такой возможности, как это есть для Статей и
страниц сайта, (почему так???) и приходится использовать условные
операторы.
Увы, я не смог с ними разобраться, Логика и результат их работы оказались разными. Прошу помочь разобраться...

Шаблоны - Блог - вид материалов:

<?if($CID$ = 13)?>
<?if($CUR_GROUP_ID$ = 2 OR $CUR_GROUP_ID$ = 3 OR $CUR_GROUP_ID$ = 4)

СОДЕРЖИМОЕ ШАБЛОНА К ПОКАЗУ.

<?else?><br>У Вас нет прав читать записи из раздела
$CATEGORY_NAME$<br><br><?endif?><?endif?>
**********
На деле получается наоборот. Категория 13 показывается всем. Все остальные категории не показываются никому.

Ещё глюк в этом же шаблоне Блог - вид материалов:
код $USERNAME$ выдает имя моего логина для всех, незалогиненых и
залогиненных. Только мой ник. хотя код $USERNAME$ корректно срабатывает в
шапке сайта. Проверил с другого компа с чистого браузера.

Сообщество uCoz » Мастерская uCoz » Дизайн: управление шаблонами » Условные операторы и системные коды (Особенности использования и интересные решения)
Поиск: