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


☜RED_BULL☞
Сообщений: 27
Репутация: 0

Сообщение # 1201 | 22:58:50
Хотелось бы узнать, есть ли оператор показывающий число пользователей в той или иной группе?
ЗЫ: Хочу организовать рейтинг группировок на моем портале.

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

Сообщение # 1202 | 23:01:50
☜RED_BULL☞,
Прикрепления: 5469409.jpg (38.1 Kb)
Сообщение отредактировал bandjuk - Понедельник, 07 Янв 2013, 23:02:20
SL1de
Сообщений: 13
Репутация: 0

Сообщение # 1203 | 02:47:39
Добрый день. помогите пожалуйста как сделать так чтобы только в разделе [id:1] показывался информер $MYINF_6$ и больше нигде его не было видно?

например есть раздел "программы" нужно чтобы показывался информер $MYINF_6$ - (топ скачанных программ) только в этом разделе.
bandjuk
Сообщений: 6816
Репутация: 2398
Уровень замечаний:

Сообщение # 1204 | 03:53:10
SL1de,
<?if($SECTION_NAME$='программы')?>$MYINF_6$<?endif?>
Apsaty
Сообщений: 56
Репутация: -2
Уровень замечаний:

Сообщение # 1205 | 09:52:02
Цитата (SL1de)
Добрый день. помогите пожалуйста как сделать так чтобы только в разделе [id:1] показывался информер $MYINF_6$ и больше нигде его не было видно? например есть раздел "программы" нужно чтобы показывался информер $MYINF_6$ - (топ скачанных программ) только в этом разделе.

<?if($MODULE_ID$='см. название модуля' and $URI_ID$='см. номер страницы')?>$MYINF_6$<?else?><?endif?>
Кайман
Сообщений: 7
Репутация: 0

Сообщение # 1206 | 00:54:36
Может кто-нибудь подсказать какое нутро у $CATEGORIES$ ?

Добавлено (10 Янв 2013, 00:54:36)
---------------------------------------------

Цитата (fflesh)
Если с разделов - то можно, скриптом, взять данные из блока категорий - там отображается сколько всего фоток в разделах - и вставить куда нужно. А если данные из альбомов - то только информером - список категорий в JavaScript формате + скрипт который будет все это дело парсить и распихивать куда нужно.

предыдущий вопрос снимается, с ним я уже разобрался.
В общем кол-во фоток в разделах получилось вывести таким кодом в информерах

Код
<?if($CATEGORY_NAME$='Название раздела')?><span class="catNumData">$NUM_DATA$</span><?endif?>
а теперь загвоздка - кол-во фото в альбомах таким же макаром не получается вывести (каждое число в отдельной ячейке таблицы) ибо дальше не работают нужные условные операторы в информерах.
С JavaScript сразу скажу - пока что, к сожалению, туго. Может кто-нибудь подскажет умную мысль?
bandjuk
Сообщений: 6816
Репутация: 2398
Уровень замечаний:

Сообщение # 1207 | 01:22:33
Кайман, создал информер:


в блок (пример):
Код
$MYINF_8$   
<div class="arrowlistmenu">   
<ul class="categoryitems">   
<li><a href="/photo/devushki/3d/8">3D обои</a></li>   
<li><a href="/photo/devushki/avril_lavin/17">Аврил Лавин</a></li>   
<li><a href="/photo/avto_i_devushki/2">Авто и девушки</a></li>   
<li><a href="/photo/avto_moto/avtomobili/11">Автомобили</a></li>   
и т.д..........
</ul>   
<script type="text/javascript">   
   function setCatNumEnt(){   
   if(!window.uCatsOut)return;   
   $('div.arrowlistmenu a').each(function(i){   
   var a=this,ah=a.href,cArr=window.uCatsOut;   
   if(!/\/photo\//.test(ah))return;   
   var t=ah.split('/'),id=t[t.length-1]||t[t.length-2],li=$(a).parent();   
   if(!isNaN(id)){   
   $.each(cArr,function(j){   
   if(cArr[j][0]==id){   
   li.append('<span class="catNumEnt">['+cArr[j][6]+']</span>');   
   }   
   };);   
   };   
   };);   
   };setCatNumEnt();   
   </script>   
</div>


стили (пример):

Цитата
div.arrowlistmenu, div.punkt {width:19.5em;}
.arrowlistmenu ul, .punkt ul {list-style-type: none; margin: 0; padding: 0; margin-bottom: 0.8em;}
.arrowlistmenu ul li{padding-bottom: 0.2em; position:relative;}
.arrowlistmenu ul li a {font-size:1.2em; font-family: Tahoma,sans-serif; color: #4392B3; background: url(http://fotki.ucoz.ua/diz/arrowbullet.png) no-repeat center left; display: block; padding: 0.1em 1.7em 0.1em 1.2em; text-decoration: none; font-weight: bold;}
.arrowlistmenu ul li a:visited {text-decoration:none; color:#3399FF;}
.arrowlistmenu ul li a:hover {text-decoration:none; color:#FFFFFF; background-color:#4392B3;}
div.arrowlistmenu span.catNumEnt{position:absolute; top:0.1em; right:0.2em; font-size:1em; font-family: Tahoma,sans-serif; color:#FFFFFF;}


на выходе:
Прикрепления: 9259123.jpg (46.5 Kb) · 4194605.jpg (38.6 Kb)
Сообщение отредактировал bandjuk - Четверг, 10 Янв 2013, 01:23:20
Кайман
Сообщений: 7
Репутация: 0

Сообщение # 1208 | 01:20:21
wacko у меня уже крыша начинает ехать....
Когда создаю информер с JavaScript - вообще не появляется кнопка его редактирования. Это так и должно быть?

А если без него, вставляю код, а потом ставлю галочки на
JavaScript - там где он вставлен ничего нет. И так не только с этим кодом...

Добавлено (13 Янв 2013, 01:20:21)
---------------------------------------------
и кстати цифры не показывает.

RideHed
Сообщений: 95
Репутация: 13

Сообщение # 1209 | 22:03:23
подскажите пожалуйста код для ограничения количества символов.
webanet
Сообщений: 24067
Репутация: 4985

Сообщение # 1210 | 22:06:01
RideHed, как-то так
Код
<?if(len(слова или код)>число)?><?substr(слово или код,0,число)?>тут многоточие, если символы порезало<?else?>слово<?endif?>

ТУТ можно оставить своё мнение по любому вопросу
https://webanetlabs.net/
FeNiKs8127
Сообщений: 9
Репутация: 10

Сообщение # 1211 | 01:17:58
Здравствуйте! Задача: Если в $MESSAGE$ присутствует слово "site.ru" то выводить картинку эту -> img.jpg, если нет, то ничего не выводить.
Как реализовать данную фразу в код? У меня получается так:
<?if($MESSAGE$='www.site.ru')?><img src="http://site.ru/img.jpg" /><?endif?> Но не работает, в чём проблема?
sch779
Сообщений: 703
Репутация: 348

Сообщение # 1212 | 01:56:33
Цитата (FeNiKs8127)
Но не работает, в чём проблема?
У Вас идет явное сравнение содержимого $MESSAGE$ с заданной строкой!
Т.е., работать будет только в случае если $MESSAGE$ содержит только эту строку!
В Вашем случае надо искать вхождение подстроки:
Код
<?if((strpos($MESSAGE$,'www.site.ru') != -1) || (strpos($MESSAGE$,'/site.ru') != -1))?>Нужный код<?endif?>

Теперь будет срабатывать, если в $MESSAGE$ есть http://www.site.ru или http://site.ru
Просто искат подстроку 'site.ru' не стоит - будет срабатывать, к примеру, на имя 'subsite.ru'.
Есть одно ограничение - функция strpos ищет вхождение подстроки только в первых 1000 символах строки-источника.
Т.е., если содержимое $MESSAGE$ по размеру больше 1000 символов и адрес сайта находится за этой границей, то сравнение не сработает!
Если есть уверенность, что длина $MESSAGE$ не может превышать 2000 символов, то проверить всю строку можно так:
Код
<?if((strpos($MESSAGE$,'www.site.ru') != -1) || (strrpos($MESSAGE$,'www.site.ru') != -1) || (strpos($MESSAGE$,'/site.ru') != -1) || (strrpos($MESSAGE$,'/site.ru') != -1))?>Нужный код<?endif?>
В данном случае функция strpos проверяет первые 1000 символов, а функция strrpos - последние 1000 символов.
Если надо работать с любой длиной $MESSAGE$, то условные операторы, увы, не помогут - прийдется использовать javascript!
Сообщение отредактировал sch779 - Понедельник, 14 Янв 2013, 02:05:58
FeNiKs8127
Сообщений: 9
Репутация: 10

Сообщение # 1213 | 07:42:14
sch779, на моём сайте код $MESSAGE$ использует всего 100 символов, так что мне больше не нужно. Спасибо Огромное, очень помогли.
bandjuk
Сообщений: 6816
Репутация: 2398
Уровень замечаний:

Сообщение # 1214 | 14:58:11
Цитата (Кайман)
Когда создаю информер с JavaScript - вообще не появляется кнопка его редактирования. Это так и должно быть?

Прикрепления: 2949604.jpg (12.1 Kb)
☜RED_BULL☞
Сообщений: 27
Репутация: 0

Сообщение # 1215 | 23:37:56
bandjuk, и что это даст?
Я имел в виду; как получить кол-во пользователей в данной группировке?
Возможно ли это вообще?

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