вывод repeater'а в html (проблема)

element80

Постоялец
Регистрация
4 Апр 2014
Сообщения
83
Реакции
28
доброго времени суток.
на всякий случай напомню, что я в php оценил бы себя на 0 по шкале от 1 до 10, тем не менее мечта ведет меня вперед и приходится делать такую вот хрень.

собственно суть проблемы - при выводе данных из репитера значение функции убивает форматирование элементов на странице, вплоть до предыдущей строки.

чтоб было понятнее - загружу скрины. движок - wordpress, если это важно.

это кусок кода с созданием функции из файла functions.php:
functions.php.jpg

продублирую текстом:
Код:
/* Выводим номера телефонов организации (убивает форматирование) */
function get_places_phone() {
    $rows = get_field('phones') ;
    $row_count = count($rows) ;
    $counter = 0 ;

    if( have_rows('phones') ) : while( have_rows('phones') ) : the_row();
    $phone_code = get_sub_field('phone_code') ;
    $phone_number = get_sub_field('phone_number');
    $places_phone = '+38'."$phone_code"."$phone_number" ;
    if ($counter < $row_count -1) {    echo $places_phone . ', ' ; }
    else { echo $places_phone ; }
    $counter ++ ;
    endwhile;
    endif;
};

это собственно кусок template-файла, куда эта функция и вызывается:
template.JPG

дубль текстом:
Код:
<div class="place-card">
            <ul>
                <?php if (get_places_address() !="") { ?><li class="fa fa-home">Адресс: <?php echo get_places_address(); ?></li><?php }; ?>
                <?php if (get_places_phone() !="") { ?><li class="fa fa-phone">Тел.: <?php echo get_places_phone(); ?></li><?php }; ?>
            </ul>                           
        </div>

а вот результат, который я вижу на странице (спасибо отладчику chrome)
result.JPG

как видим, форматирование элемента <li> убито, более того, если <?php echo get_places_phone(); ?> заключить в <span>, то он (спан) тоже исчезает.

сначала подумал что это из-за двойного echo (в функции и в template), но удаление оного на ситуацию не влияет.
в предыдущем <li> элементе с адресом (там нет repeater'a) функция возвращает значение с помощью return, и действительно, если попробовать в нашей проблемной функции get_places_phone() вернуть значение через return, то форматирование возвращается в норму, но выводится только один последний номер телефона.
погуглил - оказалось что return возвращает только одно значение. пробовал шаманить с выводом через массив, да и вообще по всякому, убил уже часов 6, слишком уж мало у меня знаний и опыта.

укажите пожалуйста где я ошибся, или намекните хотя-бы.

p.s. код наверное ужасно костыльный, еще раз извиняюсь
 
Последнее редактирование:
PHP:
<?php
/* Выводим номера телефонов организации (убивает форматирование) */
function get_places_phone() {
$array = [];
    for($i=0;$i<=2;$i++){
    $array[] = '8800555353'.$i;
    }
    return $array;
};

function get_places_address(){ return 'Москва';}
?>
<div class="place-card">
            <ul>
                <?php if (get_places_address()) { ?><li class="fa fa-home">Адресс: <?php echo get_places_address(); ?></li><?php }; ?>
                <?php if (get_places_phone()) { foreach (get_places_phone() as $phone){?><li class="fa fa-phone">Тел.: <?=$phone?></li><?php }}; ?>
            </ul>                           
        </div>
 
Попробуй переписать так:
PHP:
function get_places_phone() {
    $rows = get_field('phones') ;
    $row_count = count($rows) ;
    $counter = 0 ;
    $result = "";
    if( have_rows('phones') ) : while( have_rows('phones') ) : the_row();
    $phone_code = get_sub_field('phone_code') ;
    $phone_number = get_sub_field('phone_number');
    $places_phone = '+38'."$phone_code"."$phone_number" ;
    if ($counter < $row_count -1) {    $result .= $places_phone . ', ' ; }
    else { $result .= $places_phone ; }
    $counter ++ ;
    endwhile;
    endif;
    return $result;
};
 
опытным путем выяснил, что проблема 99% в счетчике, т.к. с таким кодом работает
PHP:
<ul>
                <?php if (get_places_address() !="") { ?><li class="fa fa-home">Адресс: <?php echo get_places_address(); ?></li><?php }; ?>
               
                <?php if( have_rows('phones') ): ?>
                <?php while( have_rows('phones') ): the_row(); 
                    $phone_code = get_sub_field('phone_code') ;
                    $phone_number = get_sub_field('phone_number');
                    $places_phone = '+38'."$phone_code"."$phone_number" ;
                ?>
                <?php if ($phone_code && $phone_number) { 
                $places_phone = '<li class="fa fa-phone">' . '+38'."$phone_code"."$phone_number" . '</li>' ;
                }
                echo $places_phone
                ?>
                <?php endwhile; endif; ?>   

            </ul>

но как только добавляю counter (чтобы не создавать отдельный <li> для каждого номера) - опять умирает форматирование. короче, я смирился, пусть работает как работает.

work.JPG

спасибо огромное откликнувшимся, здоровья вам
 
PHP:
<?php
/* Выводим номера телефонов организации (убивает форматирование) */
function get_places_phone() {
    $array = [];
   
    $rows = get_field('phones') ;
    $row_count = count($rows) ;
    $counter = 0 ;
    if( have_rows('phones') ) : while( have_rows('phones') ) : the_row();
    $phone_code = get_sub_field('phone_code') ;
    $phone_number = get_sub_field('phone_number');
    $places_phone = '+38'."$phone_code"."$phone_number" ;
    if ($counter < $row_count -1) {    $array[] = $places_phone ; }
    else { $array[] = $places_phone ; }
    $counter ++ ;
    endwhile;
   
    return $array;
   
    endif;
};
?>

<div class="place-card">
            <ul>
                <?php if (get_places_address()) { ?><li class="fa fa-home">Адресс: <?php echo get_places_address(); ?></li><?php }; ?>
                <?php if ($phones = get_places_phone()) { foreach ($phones as $phone){?><li class="fa fa-phone">Тел.: <?=$phone?></li><?php }}; ?>
            </ul>                           
        </div>
 
Проблема в том, что у тебя 2 эхо. Результат в первом выводится в отформатированном виде
PHP:
if ($phone_code && $phone_number) {
                $places_phone = '<li class="fa fa-phone">' . '+38'."$phone_code"."$phone_number" . '</li>' ;
                }
А на строчке ниже ещё раз что-то выводится, но уже без li. Без форматирования, без <li>
Выводится примерно вот что:
PHP:
<ul>
<li> get_places_address();</li>
<li>+38.$phone_code.$phone_number </li>
$places_phone
</ul>
Как раз то, что заставляет браузер сломать вёрстку.
 
Для просмотра ссылки Войди или Зарегистрируйся, работает, но опять же создает новую <li> для каждого номера. то есть по сути полностью аналогично моему варианту. но то уже ерунда, по свободе разберусь как поправить.

Проблема в том, что у тебя 2 эхо. Результат в первом выводится в отформатированном виде

А на строчке ниже ещё раз что-то выводится, но уже без li. Без форматирования, без <li>

Выводится примерно вот что:
PHP:
<ul>
<li> get_places_address();</li>
<li>+38.$phone_code.$phone_number </li>
$places_phone
</ul>
Как раз то, что заставляет браузер сломать вёрстку.
а вот и нет, верстка дальше на странице остается нормальной, т.е. лишних закрытых или открытых тегов нет.
по коду:
PHP:
if ($phone_code && $phone_number) {
если заполнены код оператора и номер - идем дальше
PHP:
$places_phone = '<li class="fa fa-phone">' . '+38'."$phone_code"."$phone_number" . '</li>' ;
присваиваем переменной значение номера телефона, заключенного в элемент списка с классом.
PHP:
echo $places_phone
выводим переменную
 
PHP:
<?php
/* Выводим номера телефонов организации (убивает форматирование) */
function get_places_phone() {
$array = [];
    for($i=0;$i<=2;$i++){
    $array[] = '8800555353'.$i;
    }
    // return $array;
    echo '123';
    echo '321';
};

function get_places_address(){ return 'Москва';}
?>

<div class="place-card">
            <ul>
                 <?php if (get_places_phone() !="") { echo "Функция не равна \"\"" ?><li class="fa fa-phone">Тел.: <?php echo get_places_phone(); ?></li><?php }; ?>
            </ul>                           
        </div>

<!-- А если так -->

<div class="place-card">
            <ul>
                 <?php if (false) { ?><li class="fa fa-phone">Тел.: <?php echo get_places_phone(); ?></li><?php }; ?>
            </ul>                           
        </div>

<!-- Иначе -->

<div class="place-card">
            <ul>
                 <?php if (true) { ?><li class="fa fa-phone">Тел.: <?php echo get_places_phone(); ?></li><?php }; ?>
            </ul>                           
        </div>
Проблема в проверке.

Я наоборот думал что тебе в отдельных li каждый номер нужен. Но если нет то:
PHP:
<?php
/* Выводим номера телефонов организации (убивает форматирование) */
function get_places_phone() {
    $array = [];
    $rows = get_field('phones') ;
    $row_count = count($rows) ;
    $counter = 0 ;
    if( have_rows('phones') ) : while( have_rows('phones') ) : the_row();
    $phone_code = get_sub_field('phone_code') ;
    $phone_number = get_sub_field('phone_number');
    $places_phone = '+38'."$phone_code"."$phone_number" ;
    if ($counter < $row_count -1) {    $array[] = $places_phone ; }
    else { $array[] = $places_phone ; }
    $counter ++ ;
    endwhile;
    return $array;
    endif;
};
?>
<div class="place-card">
    <ul>
        <?php if (get_places_address()) { ?><li class="fa fa-home">
            Адресс:
            <?php echo get_places_address(); ?></li>
        <?php }; ?>
        <?php if ($phones = get_places_phone()) { echo'<li class="fa fa-phone">'; foreach ($phones as $phone){?>
        Тел.: <?=$phone?> <?php } echo '</li>';}; ?>
    </ul>
</div>
 
Последнее редактирование модератором:
Я наоборот думал что тебе в отдельных li каждый номер нужен.
я только начинаю знакомиться с программированием, массивы для меня сложно.
собирался сделать вида
if (счетчик = 0) { выводим с открытым тегом }
elseif ($counter < $row_count -1) { выводим только значение }
else { с закрытым }

проблема была не в счетчике, загадка остается неразгаданной.
вот эта одна строка кода так же рубит форматирование. я не понимаю. выводит урл сайта и убивает css.

PHP:
<?php $places_site = the_field('site'); if (strpos ($site, 'http') !== false) { ?><li class="fa fa-link fa-2"><?php echo $places_site; ?></li><?php }; ?>
1.JPG
2.JPG

а так работает
PHP:
<?php $places_site = get_field('site');
                    if (strpos ($places_site, 'http') !== false)
                    echo '<li class="fa fa-link fa-2">'."$places_site".'</li>' ;
                ?>
 
Последнее редактирование модератором:
Назад
Сверху