12.09.2018, 11:07
|
Профессор
|
|
Регистрация: 18.05.2018
Сообщений: 170
|
|
Скрыть/отобразить 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;?>
Вероятно делаю что-то не так... Или есть другой способ. Подскажите, пожалуйста, с решением. Спасибо.
|
|
12.09.2018, 11:21
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Написал, а переменная в цикле определяется. Но тогда у вас логика не верна, то есть, переменная $EndRead постоянно изменяется, и если последнее в цикле (end($arReadCode)) вернет null, то даже при наличии ссылок блок будет скрыт.
JS код можно вынести после цикла, и без функции, у вас же это разовое определение.
$EndRead = end($arReadCode); - это что будет?
$arReadCode = explode("/", $arRead); - получили массив
$arReadCodeNew = array_pop($arReadCode); - вытолкнули последний его элемент
$arReadCode - либо должен быть пустым, либо иметь один элемент после array_pop, тогда не понятно зачем end($arReadCode);
Если более одного элемента, и второй обязательно ссылка (?), тогда что есть $arReadCode[0]?
Последний раз редактировалось laimas, 12.09.2018 в 11:32.
|
|
12.09.2018, 11:52
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
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?>
|
|
12.09.2018, 12:03
|
Профессор
|
|
Регистрация: 18.05.2018
Сообщений: 170
|
|
По поводу $EndRead.
1) Изначально получаем значение со слешами (/articles/tags/tag1/)
2) далее (после разделения по "/") получаем массив
3) после разделения последний элемент массива пустой. Для того, чтобы работать со значением "tag1", последний пустой элемент удаляем
4) после этого берем последний элемент (уже после удаления пустого элемента) и оперируем с ним.
"JS код можно вынести после цикла, и без функции, у вас же это разовое определение." - была попытка ) Но в голову не пришло убрать функцию После того, как JS код был вынесен после цикла, и без функции, то в результате заголовок отображается как необходимо (т.е. если есть ссылки, то заголовок выводится, если ссылок нет - заголовок не выводится)
laimas, спасибо за помощь, результат то что нужно
|
|
12.09.2018, 12:18
|
Профессор
|
|
Регистрация: 18.05.2018
Сообщений: 170
|
|
laimas, "По окончании цикла вывод html:" - дело в том, что если вывести div после цикла, то отображаться будут сначала ссылки, а потом заголовок.
Вариант "JS код можно вынести после цикла, и без функции" подошел как надо
|
|
12.09.2018, 12:35
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от _marisha
|
дело в том, что если вывести div после цикла, то отображаться будут сначала ссылки, а потом заголовок.
|
C Чего вдруг? У вас div выводится до цикла, кто же вам мешает выполнить цикл и вывод его упаковать в строку (либо в буфер), затем вывести div и строку упакованную (или буфер) как показано.
Вы мудрите там, где совсем не требуется.
|
|
12.09.2018, 14:57
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от _marisha
|
По поводу $EndRead.
|
По этому поводу вообще ничего не понятно.
list($x1, $x2, $link) = explode('/', trim('/articles/tags/tag1/', '/'));
//$link = ссылка или что-то касаемо ссылки
//array_pop, end, это лишнее
А если нет ссылки, тогда как выглядит $arRead?
|
|
19.09.2018, 12:20
|
Профессор
|
|
Регистрация: 18.05.2018
Сообщений: 170
|
|
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?
|
|
19.09.2018, 14:04
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от _marisha
|
если ссылки нет, тогда блок "Читайте также" не выводится
|
Это понятно, это так надо, не понятно что содержится в $arRead если ссылки нет - эта переменная пустая или имеет значение отличное от http://mysite.ru/help/articles/view/nazvanie_stati/?
Если она пустая то зачем разбивать на массив и т.д., если проще проверить возвращенное булево значение? А если не пустая и отличная от указанной ссылки, то каким образом последний элемент полученного массива может определять есть ли или нет ссылки? В этом случае проверять нужно значение последнего элемента, а не его наличие и это можно сделать рег. выражением.
list($x1, $x2, $link) = explode('/', trim('/articles/tags/tag1/', '/')); - здесь удаляются крайние слеши в строке прежде чем она разбивается на массив, чтобы не удалять пустоты. А list(...), это конструкция, но судя по указанному примеру ссылки она вам не поможет, если только ссылки не имеют фиксированное количество элементов (я так понимаю это ЧПУ).
|
|
20.09.2018, 06:53
|
Профессор
|
|
Регистрация: 18.05.2018
Сообщений: 170
|
|
"не понятно что содержится в $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);?>
Т.е. если ссылки есть, тогда производить разбивку по /
|
|
|
|