Скрыть/отобразить div
Доброго времени суток!
Необходимо скрыть div, если нет ссылок в элементе. Пример: 1) в статье есть заголовок "Читайте также" 2) если в статье есть ссылки на другие статьи, тогда заголовок отображается. Если ссылок в статье нет, тогда заголовок скрыть. При попытке изначально div скрыть, а при выполнении условия (есть ли ссылка) выполнить loadPage, div всё равно скрыт <div id="div1" style="font: bold 18px/24px 'OpenSans'; padding-bottom: 20px; padding-top: 20px; display: none;" onload="loadPage();">Читайте также:</div> <?foreach($arResult['PROPERTIES']['READ']['VALUE'] as $read_key => $arRead):?> <? $arReadCode = explode("/", $arRead); $arReadCodeNew = array_pop($arReadCode); $EndRead = end($arReadCode); if (isset($EndRead)):?>//проверка, есть ли ссылки <script> function loadPage() { document.getElementById('div1').style.display = 'block'; } </script> <? $arSelect = Array("ID", "NAME", "CODE"); $arFilter = Array("IBLOCK_ID"=>5, "CODE"=>$EndRead); $res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect); while($ArticleName = $res->Fetch()):?> <div><a href="<?=$arRead?>"><?=$ArticleName['NAME']?></a></div><br> <?endwhile?> <?endif;?> <?endforeach;?> Вероятно делаю что-то не так... Или есть другой способ. Подскажите, пожалуйста, с решением. Спасибо. |
Написал, а переменная в цикле определяется. Но тогда у вас логика не верна, то есть, переменная $EndRead постоянно изменяется, и если последнее в цикле (end($arReadCode)) вернет null, то даже при наличии ссылок блок будет скрыт.
JS код можно вынести после цикла, и без функции, у вас же это разовое определение. $EndRead = end($arReadCode); - это что будет? $arReadCode = explode("/", $arRead); - получили массив $arReadCodeNew = array_pop($arReadCode); - вытолкнули последний его элемент $arReadCode - либо должен быть пустым, либо иметь один элемент после array_pop, тогда не понятно зачем end($arReadCode); Если более одного элемента, и второй обязательно ссылка (?), тогда что есть $arReadCode[0]? |
onload="loadPage();" у div и JS код выбросить.
До цикла определить $style = 'none'; Сперва выполняйте цикл, в котором если есть ссылка, то $style = 'block';, а циклом while пакуйте в строку: $s .= <div><a href="<?=$arRead?>"><?=$ArticleName['NAME']?></a></div><br> По окончании цикла вывод html: <div id="div1" style="font: bold 18px/24px 'OpenSans'; padding-bottom: 20px; padding-top: 20px; display:<?=$style?>">Читайте также:</div><?=$s?> |
По поводу $EndRead.
1) Изначально получаем значение со слешами (/articles/tags/tag1/) 2) далее (после разделения по "/") получаем массив 3) после разделения последний элемент массива пустой. Для того, чтобы работать со значением "tag1", последний пустой элемент удаляем 4) после этого берем последний элемент (уже после удаления пустого элемента) и оперируем с ним. "JS код можно вынести после цикла, и без функции, у вас же это разовое определение." - была попытка ) Но в голову не пришло убрать функцию :) После того, как JS код был вынесен после цикла, и без функции, то в результате заголовок отображается как необходимо (т.е. если есть ссылки, то заголовок выводится, если ссылок нет - заголовок не выводится) laimas, спасибо за помощь, результат то что нужно :thanks: |
laimas, "По окончании цикла вывод html:" - дело в том, что если вывести div после цикла, то отображаться будут сначала ссылки, а потом заголовок.
Вариант "JS код можно вынести после цикла, и без функции" подошел как надо :) |
Цитата:
Вы мудрите там, где совсем не требуется. |
Цитата:
list($x1, $x2, $link) = explode('/', trim('/articles/tags/tag1/', '/')); //$link = ссылка или что-то касаемо ссылки //array_pop, end, это лишнее А если нет ссылки, тогда как выглядит $arRead? |
1) изначально $arRead выглядит так: http://mysite.ru/help/articles/view/nazvanie_stati/
2) $arReadCode = explode("/", $arRead); рабиваем строку по /. Получаем Array ( [0] => http: [1] => [2] => mysite.ru [3] => help [4] => articles [5] => view [6] => nazvanie_stati [7] => ) 3) последний 7ой элемент нужно убрать $arReadCodeNew = array_pop($arReadCode); После этого получаем Array ( [0] => http: [1] => [2] => mysite.ru [3] => help [4] => articles [5] => view [6] => nazvanie_stati ) 4) далее нужно взять последний элемент $EndRead = end($arReadCode); 5) на основании последнего элемента сделать выборку по коду $arSelect = Array("ID", "NAME", "CODE", 'PREVIEW_PICTURE', 'DATE_ACTIVE_FROM'); $arFilter = Array("IBLOCK_ID"=>5, "CODE"=>$EndRead); $res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect); while($ArticleName = $res->Fetch()):?> <?$Preview = CFile::GetPath($ArticleName['PREVIEW_PICTURE']);//ссылка на изображение ?> <div style="margin-bottom: 10px; width: 100%; overflow: hidden;"> <div style="float: left; margin-right: 10px;"><img style="width: 100px;height: 100px;" src="<?=$Preview?>"></div> <div> <p style="font: 12px 'OpenSans';color: #acacac; margin-bottom: 5px; padding-top: 15px;"><?echo date_create($ArticleName['DATE_ACTIVE_FROM'])->Format('d.m.y');?></p> <a href="<?=$arRead?>"><?=$ArticleName['NAME']?></a> </div> </div> <?endwhile?> 6) если ссылки нет, тогда блок "Читайте также" не выводится list($x1, $x2, $link) = explode('/', trim('/articles/tags/tag1/', '/')); Вместо $link верно понимаю что нужно $arRead? А что за $x1, $x2? |
Цитата:
Если она пустая то зачем разбивать на массив и т.д., если проще проверить возвращенное булево значение? А если не пустая и отличная от указанной ссылки, то каким образом последний элемент полученного массива может определять есть ли или нет ссылки? В этом случае проверять нужно значение последнего элемента, а не его наличие и это можно сделать рег. выражением. list($x1, $x2, $link) = explode('/', trim('/articles/tags/tag1/', '/')); - здесь удаляются крайние слеши в строке прежде чем она разбивается на массив, чтобы не удалять пустоты. А list(...), это конструкция, но судя по указанному примеру ссылки она вам не поможет, если только ссылки не имеют фиксированное количество элементов (я так понимаю это ЧПУ). |
"не понятно что содержится в $arRead если ссылки нет - эта переменная пустая или имеет значение отличное от http://mysite.ru/help/articles/view/nazvanie_stati/" - переменная пустая.
"Если она пустая то зачем разбивать на массив и т.д., если проще проверить возвращенное булево значение?" - имеете ввиду так if (isset($arRead))? "то каким образом последний элемент полученного массива может определять есть ли или нет ссылки?" - если верно понимаю, тогда лучше убрать условие if (isset($EndRead)), вместо него сделать if (isset($arRead)):?> <?$arReadCode = explode("/", $arRead); $arReadCodeNew = array_pop($arReadCode); $EndRead = end($arReadCode);?> Т.е. если ссылки есть, тогда производить разбивку по / |
Часовой пояс GMT +3, время: 18:03. |