PHP функция возврата.Читы разрешены - PullRequest
0 голосов
/ 01 марта 2011

OK.

У меня очень длинная и довольно сложная функция.

Это выглядит почти так:

    <?php
            function hello() {

                    echo 'My Function!' ?>
                    <ul>
                    <li> Blablabla </li>
                    <ul>
                    (...)
    <?php } ?>

Огромная проблема в том, что я не в состоянии что-либо повторить.

Моя функция ДОЛЖНА возвращать свое содержимое вместо отображения или прямого вывода (так должно быть, это шорткод Wordpress, а когда я повторяю - содержимое отображается вверху страницы - ВСЕГДА, а не в место, где я хочу их):

   <?php
                function hello() {

                        $output .= 'My Function!'; 
                        $output .= '<ul>';
                        $output .='<li> Blablabla </li>';
                        $output .='<ul>';
                        (...)

                        return $output;
         } ?>

Надеюсь, до сих пор легко.

Теперь реальные проблемы:

У меня есть тонны прямого кода, например:

?> 

<div>
    <span>
        <p>Smth</p>
        <a>smth</a>
    </span>
</div>

<?php

Добавление $ output везде убивает красивые абзацы / пробелы, и код становится ОЧЕНЬ ТРУДНЫМ для чтения и понимания (и все элементы HTML теперь являются частями переменных, поэтому даже мой редактор php плохо их обрабатывает и раскрашивает их как элементы PHP ).

И еще одна вещь, у меня тонны таких строк:

<a href="<?php bloginfo('template_directory');  ?>/includes/php/timthumb.php?src=<?php echo $url; ?>&h=<?php if($items=="one") echo 320; elseif($items=="two") echo 230; elseif($items=="three") echo 180; elseif($items=="four") echo 130; ?>&w=<?php if($items=="one") echo 600; elseif($items=="two") echo 420; elseif($items=="three") echo 277; elseif($items=="four") echo 203; ?>" title="<?php the_title(); ?>" class="link">

(да, это одна строка)

И я абсолютно не знаю, как добавить такие строки в $ output.

$output .= '<a href="<?php bloginfo('template_directory');  ?>/includes/php/timthumb.php?src=<?php echo $url; ?>&h=<?php if($items=="one") echo 320; elseif($items=="two") echo 230; elseif($items=="three") echo 180; elseif($items=="four") echo 130; ?>&w=<?php if($items=="one") echo 600; elseif($items=="two") echo 420; elseif($items=="three") echo 277; elseif($items=="four") echo 203; ?>" title="<?php the_title(); ?>" class="link"> ';

Конечно, не работает (даже с "до" и ").

Я считаю, что ДОЛЖЕН быть более простой способ прикрепить весь код для возврата, но как? Я пытался с ob_start (); перед кодом и возвращением ob_get_clean (); после, но вместо содержимого выводится короткое имя.

Ответы [ 3 ]

4 голосов
/ 01 марта 2011

Очень трудно представить, в чем заключается проблема, которую вы пытаетесь решить - хотя я не знаком с WordPress. Разве вы не можете просто вызвать функцию, куда должен идти вывод?

Вы можете использовать буферизацию вывода - используйте echo / print как обычно, но ...

ob_start();
hello();
$output=ob_get_contents();
ob_end_clean();

Но это не решает проблему, которую вам все еще нужно отправить в браузер в нужном месте на странице - и если вы можете сделать это:

print $output;

в нужном месте, тогда вы наверняка сможете сделать:

hello();

в том же месте.

2 голосов
/ 01 марта 2011

Я согласен с symcbean, но это может быть более практичным подходом при интеграции с Wordpress: если у вас теперь есть одна функция с именем hello (), которая отображает HTML, вы можете рассмотреть возможность переименования этой функции в hello_content () (или что-то похожее) и замените функцию hello () предложением symcbean:

function hello_content( ) {
   echo "foo";
}

function hello( ) {
   ob_start( );
   hello_content( );
   return ob_get_clean( );
}

Это должно исправить вашу непосредственную проблему.

1 голос
/ 01 марта 2011

Синтаксис PHP Heredoc будет держать все в чистоте и порядке, и вы сможете вернуть результат в переменную.Пока вам не нужны никакие константы, все будет работать нормально.

Вы используете его следующим образом:

function bar() {
    $var = <<<EOV
    anything here
    anything there
EOV;

    return $var;
}
...