В некоторых разделах сайтов на платформе uCoz сбоит вывод номеров страниц. В общем случае код такой:
<?if($PAGE_SELECTOR$)?><!-<s3015>->Страницы<!-</s>->:
$PAGE_SELECTOR$<?endif?>
Почистим его от служебных пометок uCoz’а (на рабочем сайте этого делать не надо):
<?if($PAGE_SELECTOR$)?>Страницы:
$PAGE_SELECTOR$<?endif?>
Итак, если переменная $PAGE_SELECTOR$
что-нибудь
выдаёт, то будет показан результат выдачи, а если ничего
не выдает, то не будет показано даже слово «Страницы:».
Всё бы хорошо, но на самом деле код работает не так. Например, на странице какой-нибудь категории из блока статей:
- Если в категории нет ни одной статьи, то на странице не показывается ничего — ни номер, ни слово «Страницы:" (так и должно быть);
- Если в категории статей меньше, чем предел размещения их на одной странице (по умолчанию обычно 10), то появляется слово «Страницы:», но чисел никаких нет;
- Если статей больше предела размещения на одной странице категории, то код выдаёт нормальный результат: «Страницы:" + переключатель.
Желательно привести код к рабочим результатам.
Если страница списка статей в категории одна, должен выводиться текст: «Страницы: 1» (напоминаем, раздел статей мы взяли для примера, то же можно увидеть, например, в разделе файлов или ссылок). Делаем так:
Страницы:
<?if($PAGE_SELECTOR$)?>$PAGE_SELECTOR$<?else?>1<?endif?>
Оказывается, это работает только тогда, когда в категории нет
ни одной статьи. Иначе переменная $PAGE_SELECTOR$
перестаёт быть пустой и выдаёт:
<span class=«pagesBlockuz1»></span>
Для того, чтобы обработать эту ситуацию, нужно не просто проверять
существование значения, а анализировать его. Если между тегами <span>
есть что-нибудь, то надо это «что-нибудь»
выводить. А если нет ничего, то надо выводить цифру 1.
В применении к нашему случаю, если после первой закрывающей
угловой скобки сразу же идёт открывающая, то надо выводить
цифру.
Где находится первая закрывающая угловая скобка, нам ответит
функция strpos(S1,S2)
. Здесь S1 —
строка, в которой ищем, а S2 — строка, которую
ищем. У нас будет:
strpos($PAGE_SELECTOR$,'>')
Но нам нужна собственно и не она, а следующий
за ней символ строки. Для этого используем функцию substr(S,N1,N2)
.
Здесь S — строка, которую разрезаем (у нас $PAGE_SELECTOR$
);
N1 — число, которое указывает с какого символа строку
S надо разрезать (у нас это будет strpos($PAGE_SELECTOR$,'>')
+ 1
, нам нужен следующий за закрывающей скобкой символ); N2 —
длина строки, которую хотим получить (в нашем случае 1 — нам
нужно проверить только следующий за закрывающей скобкой символ).
Проще говоря, мы вырезаем из строки, которую выдаёт переменная $PAGE_SELECTOR$
символ, который следует за первой же закрывающей угловой
скобкой, и сравниваем его с символом «<». Если есть
совпадение, то выводим цифру 1. В противном случае — всё
содержимое переменной $PAGE_SELECTOR$
. Ниже добавка
в код сравнения и полностью вся строка условного оператора:
substr($PAGE_SELECTOR$,strpos($PAGE_SELECTOR$,'>')+1,1) !==
'<'
<?if($PAGE_SELECTOR$ &&
substr($PAGE_SELECTOR$,strpos($PAGE_SELECTOR$,'>')+1,1) !==
'<')?>$PAGE_SELECTOR$<?else?>1<?endif?>
Это работает, но можно упростить код. Вместо того, чтобы резать строки и анализировать их, в нашем случае можно просто искать строку «><». Если она есть, то выводим единицу:
<?if($PAGE_SELECTOR$ && strpos($PAGE_SELECTOR$,'><') <
0)?>$PAGE_SELECTOR$<?else?>1<?endif?>
Это тоже работает.
© Photo: Toshiyuki IMAI aka matsuyuki via flickr.com