Хорошо, вот сделка, в которой я действительно застрял.
Я использую мои cms с шаблонами дизайна.
Где последний конечный результат (в основном файле шаблона дизайна: 'design.php'):
<div>{CONTENT_HEADER}</div>
<div style='float:left;width:25%'>{CONTENT_LEFT}</div>
<div style='float:left;width:50%'>{CONTENT_CENTER}</div>
<div style='float:left;width:25%'>{CONTENT_RIGHT}</div>
<div>{CONTENT_FOOTER}</div>
Где CONTENT_XXXX - это модули сайта генерации мыслей:
ob_start("gz_handler");
<....... LOAD ALL THE HEADER MODULES .......>
$output0 = ob_get_contents();
ob_end_clean();
ob_start("gz_handler");
<....... LOAD ALL THE LEFT SIDE MODULES .......>
$output1 = ob_get_contents();
ob_end_clean();
ob_start("gz_handler");
<....... LOAD ALL THE CENTER SIDE MODULES .......>
$output2 = ob_get_contents();
ob_end_clean();
ob_start("gz_handler");
<....... LOAD ALL THE RIGHT SIDE MODULES .......>
....
// That's I talk about, but this is just for static html, not variables
// Push to header finalizers to override default <title></title>
$header_finalizers_array['change_head_title_attr_to'] = $thread_data['topic_title'];
<....... END OF ALL THE RIGHT SIDE MODULES .......>
$output3 = ob_get_contents();
ob_end_clean();
ob_start("gz_handler");
<....... LOAD ALL THE FOOTER MODULES .......>
$output5 = ob_get_contents();
ob_end_clean();
define("CONTENT_HEADER", finalize_output($output0,$header_finalizers_array));
define("CONTENT_LEFT", finalize_output($output2,$left_finalizers_array));
define("CONTENT_CENTER", finalize_output($output3,$center_finalizers_array));
define("CONTENT_RIGHT", finalize_output($output4,$right_finalizers_array));
// No need finalizations, because there are no more parts, which call content changes
define("CONTENT_FOOTER", $output5);
Все в порядке в 95% случаев. Но в некоторых случаях мне нужно ПОЛУЧИТЬ СОДЕРЖАНИЕ ПЕРЕМЕННОГО (в левых боковых модулях), которое ТОЛЬКО будет определено в СЛЕДУЮЩЕЙ СТОРОНЕ (например, в правых боковых модулях)
С помощью своего кода я могу определить заголовки сайта в «модулях заголовка», но затем, если я этого захочу, я могу изменить его в ex. справа, потому что я могу добавить в массив требование замены данных, которое будет выполнено после того, как все содержимое сторон будет преобразовано в переменные, но ДО печати в браузер клиента.
Все это можно сделать только с 1 строкой в функции:
function finalize_output($output="",$fin_array=array()) {
<...>
$output = preg_replace("#<title>.*</title>#i", "<title>".$fin_array['change_head_title_attr_to']."</title>", $output, 1);
<...>
}
Теперь о моей проблеме.
Как сделать то же самое с переменными:
IN ЛЕВАЯ СТОРОНА модулей У меня есть предложение (ПРОБЛЕМА: $ object ):
if(isset($object)) {
$best_product = sqlArray(sqlQuery("SELECT * FROM tableA WHERE b='$object'"));
<..All the rest code of BEST's product..>
}
IN ПРАВАЯ СТОРОНА модули У меня есть смысл (ПРОБЛЕМА: $ object ):
<... Print LAST 10 PRODUCTS ***>
$res = sqlquery("SELECT * FROM tableA ORDER BY id DESC LIMIT 100);
while($data = sqlarray($res)) { <..PRINT PRODUCT INFO..> }
$new = rand(0,secured($_POST['user_input_new_products']));
for($i=1;$i<=$new;$i++) {
$price_diff_old_new1 = change_products_to_sql('fish_$i', 19.99);
$price_diff_old_new2 = push_product_to_sql('crab_$i', 16.99);
if($i==$new) {
$object = $price_diff_old_new1+$price_diff_old_new2;
}
}
ЭТО ПРОСТО ПРИМЕРНЫЙ КОД, ЧТО Я ДОЛЖЕН ДЕЛАТЬ (так что не будем вдаваться в подробности), но ТОЧКА ЭТОГО , что Мне нужно как-то передать переменную в более раннюю точку источника :
Одним из решений будет « USE GOTO », но будет ли эта переменная запомнена.
Я имею в виду:
echo "JOB IS STARTED";
LABEL HOME:
<INCLUDED FILE : procuts.php >
if(isset($object) && check_is_number($object)) {
$a = $object;
}
if(isset($break_me) && $break_me) {
GOTO FINAL;
}
<END OF INCLUDE>
...
<INCLUDED FILE : upload.php >
$object = 999;
$break_me = true;
GOTO HOME;
<END OF INCLUDE>
}
LABEL FINAL:
echo "JOB IS DONE";
И, есть ли другой способ сделать это БЕЗ ПЕРЕХОДА (если GOTO-решение возможно (?))?
Я лично думал, что это невозможно, но с Php 5.3.0 это возможно, и я, вероятно, буду закодирован. К несчастью, я не уверен, что компания будет использовать Php 5.3.0 на своих серверах, поэтому я надеюсь, что есть другие решения.
Также я все еще не уверен, что даже GOTO поможет там.