Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.09.2018, 11:07
Профессор
Отправить личное сообщение для _marisha Посмотреть профиль Найти все сообщения от _marisha
 
Регистрация: 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;?>

Вероятно делаю что-то не так... Или есть другой способ. Подскажите, пожалуйста, с решением. Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 12.09.2018, 11:21
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 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.
Ответить с цитированием
  #3 (permalink)  
Старый 12.09.2018, 11:52
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 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?>
Ответить с цитированием
  #4 (permalink)  
Старый 12.09.2018, 12:03
Профессор
Отправить личное сообщение для _marisha Посмотреть профиль Найти все сообщения от _marisha
 
Регистрация: 18.05.2018
Сообщений: 170

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

"JS код можно вынести после цикла, и без функции, у вас же это разовое определение." - была попытка ) Но в голову не пришло убрать функцию После того, как JS код был вынесен после цикла, и без функции, то в результате заголовок отображается как необходимо (т.е. если есть ссылки, то заголовок выводится, если ссылок нет - заголовок не выводится)
laimas, спасибо за помощь, результат то что нужно
Ответить с цитированием
  #5 (permalink)  
Старый 12.09.2018, 12:18
Профессор
Отправить личное сообщение для _marisha Посмотреть профиль Найти все сообщения от _marisha
 
Регистрация: 18.05.2018
Сообщений: 170

laimas, "По окончании цикла вывод html:" - дело в том, что если вывести div после цикла, то отображаться будут сначала ссылки, а потом заголовок.
Вариант "JS код можно вынести после цикла, и без функции" подошел как надо
Ответить с цитированием
  #6 (permalink)  
Старый 12.09.2018, 12:35
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

Вы мудрите там, где совсем не требуется.
Ответить с цитированием
  #7 (permalink)  
Старый 12.09.2018, 14:57
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

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


А если нет ссылки, тогда как выглядит $arRead?
Ответить с цитированием
  #8 (permalink)  
Старый 19.09.2018, 12:20
Профессор
Отправить личное сообщение для _marisha Посмотреть профиль Найти все сообщения от _marisha
 
Регистрация: 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?
Ответить с цитированием
  #9 (permalink)  
Старый 19.09.2018, 14:04
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 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(...), это конструкция, но судя по указанному примеру ссылки она вам не поможет, если только ссылки не имеют фиксированное количество элементов (я так понимаю это ЧПУ).
Ответить с цитированием
  #10 (permalink)  
Старый 20.09.2018, 06:53
Профессор
Отправить личное сообщение для _marisha Посмотреть профиль Найти все сообщения от _marisha
 
Регистрация: 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);?>

Т.е. если ссылки есть, тогда производить разбивку по /
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обработчик событий для динамически добавленных элементов Tecvid Events/DOM/Window 28 25.06.2018 13:49
Показать div при наведении / jQuery updaite Элементы интерфейса 4 28.07.2014 03:45
Cookie для меню аккордион и для div Lastedl jQuery 1 03.12.2013 04:55
Проблемы с div обновлённым через (#id).load erlcat jQuery 4 03.03.2013 03:41
проблема с div И animate g00000dman jQuery 2 24.03.2011 23:34