META-tags - немного странное желание

leosha

Старожил PHPCLub
META-tags - немного странное желание

Такая трудность. Шапка всех страниц хранится в отдельном файле который include на все остальные страницы.
Захотелось мне теперь в эту шапку включить META keywords, description
А вот то, что в этих тэгах хранится должно, выводится из базы уже после этого самого include..
Вообщем, вопрос выглядит так:

Есть файл _head.php3
<html><head>
<META NAME="Keywords" CONTENT="<? echo $meta_keywords; ?>">
</head>
<body>

есть файл page.php3
<? include ("_head.php3"); ?>
...
...
...
$meta_keywords = " ... ";
</body>
</html>


В таком виде в тэге <META NAME="Keywords"> будет пусто, что логично и понятно.
Так вот, как-то можно исхитрится чтобы переменная $meta_keywords подставилась ПОСЛЕ обработки ВСЕЙ страницы.
Генерить $meta_keywords ДО include ("_head.php3") неудобно по многим причинам.
Может я хочу странного, но, надеюсь изложил понятно...
Идеи принимаются любые.
PS. То что я тормоз и не подумал об этом во время начального проектирования сайта - я и сам знаю, не утруждайтесь напоминать.. =)
 

antonio

Moderator
Команда форума
А в разделе функций работы со строками есть функции управления буфером вывода типа obчего-то там
 

leosha

Старожил PHPCLub
1) Жаль что только в PHP4 эти функции есть
2)Еще больше жаль, что я ну никак не въеду КАК это должно работать.
На zend.com вот такой пример по работе с этими функциями
http://www.zend.com/manual/function.ob-start.php

<?php
function c($str) {
// Druu Chunusun mut dum KuntrubuЯ...
return nl2br(ereg_replace("[aeiou]", "u", $str));
}

function d($str) {
return strip_tags($str);
}
?>

<?php ob_start("c"); ?>
Drei Chinesen mit dem KontrabaЯ...
<?php ob_start("d"); ?>
<h1>..saЯen auf der StraЯe und erzдhlten sich was...</h1>
<?php ob_end_flush(); ?>
... da kam die Polizei, ja was ist denn das?
<?php ob_end_flush(); ?>

?>

Никто не объяснит его ценность и смысл?
 

dak

Guest
Никто не объяснит его ценность и смысл?
================================
Что ж, можно попробовать :)
По ob_start("c") буферизируются все данные, выдаваемые функцией c($str),
и заносятся в стек.
По ob_start("d") тоже происходит для данных, выдаваемых функцией d($str)
и.т.д.
Функция ob_end_flush() "выкидывает" данные из стека. Вызовов ob_end_flush() должно быть столько же, сколько и ob_start().
Стек, насколько я понял из мана, работает по принципу LIFO.
(TFM: If multiple output callback functions are active, output is being filtered sequentially through each of them in nesting order.)
В твоей ситуации имеет смысл написать функцию, которая будет давать на выходе нужный мета-таг, и вызывать ее по ob_start("meta_func") после того, как отработает весь скрипт.
Насколько это ценно для тебя, решай сам. Но, в принципе, это выход во многих ситуациях.
 

leosha

Старожил PHPCLub
> выход на самом деле очень простой.
> Создается функция print_head, в которую как
> параметры поступают title, description, keywords.
> В каждом файле происходит ее вызов, а сама она подключается через
> include.

Может я неуловил основную мысль в этом ответе?

Конечно же, я могу сделать следующее:

=============файл print_head.php3====================
<?
print "<html><head>";
function print_head ($title,$meta_keywords) {
print "<TITLE> $title </TITLE>";
print "<META NAME=\"Keywords\" CONTENT=\" $meta_keywords \">";
}
</head>
=====================================================


=============файл page.php3==========================
<? include ("print_head.php3"); ?>
<body>
....
....
....
....
<?
$title = "Заголовок";
$meta_keywords = "keywords keywords";
print_head($title,$meta_keywords);
?>
</body></html>
=====================================================

Но, к сожалению, в таком раскладе это работать не будет (и не должно, по идее).
Т.к. функция print_head() отработает именно в том месте, откуда я ее вызвал.
И у меня внутри <body> </body> будет напечатано и title и meta... Что, конечно же мне
даром не надо.
Еще раз говорю - я не могу вызвать эту функцию в нужном месте, т.к. переменные,
которые ей необходимо передать, сформируются к концу страницы где-то..
Функции ob_start и иже с ними не подходят, по причине их отсутствия в PHP3...
PS. А еще, я так и не смог заставить работать эти функции в PHP4...
 

DJ Rabbit

Guest
Если тебя мучают такие проблемы, значит настало время переходить на шаблоны. В принципе, FastTemplate может удовлетворить твоё странное желание. У меня есть собственноручно написанный класс шаблона, работающий с базой данных mysql - там автоматизирован вывод строк таблицы. Автоматизирован вплоть до того, что если надо вывести ещё одну таблицу на странице (без сложной обработки строк, которая не укладывается в запрос), достаточно открыть файл шаблона и вписать туда блок с запросом. Кому надо - пишите.
 
Сверху