Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Скрыть/отобразить div (https://javascript.ru/forum/misc/75200-skryt-otobrazit-div.html)

_marisha 12.09.2018 11:07

Скрыть/отобразить 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;?>

Вероятно делаю что-то не так... Или есть другой способ. Подскажите, пожалуйста, с решением. Спасибо.

laimas 12.09.2018 11:21

Написал, а переменная в цикле определяется. Но тогда у вас логика не верна, то есть, переменная $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:52

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?>

_marisha 12.09.2018 12:03

По поводу $EndRead.
1) Изначально получаем значение со слешами (/articles/tags/tag1/)
2) далее (после разделения по "/") получаем массив
3) после разделения последний элемент массива пустой. Для того, чтобы работать со значением "tag1", последний пустой элемент удаляем
4) после этого берем последний элемент (уже после удаления пустого элемента) и оперируем с ним.

"JS код можно вынести после цикла, и без функции, у вас же это разовое определение." - была попытка ) Но в голову не пришло убрать функцию :) После того, как JS код был вынесен после цикла, и без функции, то в результате заголовок отображается как необходимо (т.е. если есть ссылки, то заголовок выводится, если ссылок нет - заголовок не выводится)
laimas, спасибо за помощь, результат то что нужно :thanks:

_marisha 12.09.2018 12:18

laimas, "По окончании цикла вывод html:" - дело в том, что если вывести div после цикла, то отображаться будут сначала ссылки, а потом заголовок.
Вариант "JS код можно вынести после цикла, и без функции" подошел как надо :)

laimas 12.09.2018 12:35

Цитата:

Сообщение от _marisha
дело в том, что если вывести div после цикла, то отображаться будут сначала ссылки, а потом заголовок.

C Чего вдруг? У вас div выводится до цикла, кто же вам мешает выполнить цикл и вывод его упаковать в строку (либо в буфер), затем вывести div и строку упакованную (или буфер) как показано.

Вы мудрите там, где совсем не требуется.

laimas 12.09.2018 14:57

Цитата:

Сообщение от _marisha
По поводу $EndRead.

По этому поводу вообще ничего не понятно.

list($x1, $x2, $link) = explode('/', trim('/articles/tags/tag1/', '/'));
//$link = ссылка или что-то касаемо ссылки
//array_pop, end, это лишнее


А если нет ссылки, тогда как выглядит $arRead?

_marisha 19.09.2018 12:20

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?

laimas 19.09.2018 14:04

Цитата:

Сообщение от _marisha
если ссылки нет, тогда блок "Читайте также" не выводится

Это понятно, это так надо, не понятно что содержится в $arRead если ссылки нет - эта переменная пустая или имеет значение отличное от http://mysite.ru/help/articles/view/nazvanie_stati/?
Если она пустая то зачем разбивать на массив и т.д., если проще проверить возвращенное булево значение? А если не пустая и отличная от указанной ссылки, то каким образом последний элемент полученного массива может определять есть ли или нет ссылки? В этом случае проверять нужно значение последнего элемента, а не его наличие и это можно сделать рег. выражением.

list($x1, $x2, $link) = explode('/', trim('/articles/tags/tag1/', '/')); - здесь удаляются крайние слеши в строке прежде чем она разбивается на массив, чтобы не удалять пустоты. А list(...), это конструкция, но судя по указанному примеру ссылки она вам не поможет, если только ссылки не имеют фиксированное количество элементов (я так понимаю это ЧПУ).

_marisha 20.09.2018 06:53

"не понятно что содержится в $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, время: 23:40.