わかりました、これが私が本当に立ち往生している取引です。
私は自分の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%のケースですべて問題ありません。ただし、NEXT SIDE (右側のモジュールなど) でのみ定義される VARIABLE のコンテンツ (左側のモジュール) を取得する必要がある場合があります。
私のコードでは、サイト ヘッダーを定義できます「ヘッダーモジュール」で、しかしそれが必要な場合は、元で変更できます。右側は、配列にデータ置換要件を追加できるためです。これは、すべてのサイド コンテンツが変数のジェネレーターになった後に実行されますが、クライアント ブラウザーに出力する前に実行されます。
これはすべて、関数内の 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);
<...>
}
今私の問題について。
VARIABLES で同じことを行う方法:
左側のモジュールには、次の文があります (問題: $object ):
if(isset($object)) {
$best_product = sqlArray(sqlQuery("SELECT * FROM tableA WHERE b='$object'"));
<..All the rest code of BEST's product..>
}
右側のモジュールには、次のような意味があります (問題: $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;
}
}
これは私がする必要があることの単なるサンプルコードです(詳細には行かないでください)が、要点は、変数を以前のソースポイントに送信する必要があるということです:解決策の1つは「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なしでこれを行う他の方法はありますか(GOTOソリューションが可能な場合(?))?
個人的にはコーディングできないと思っていたのですが、Php 5.3.0から可能になったのでコーディングしやすくなりました。残念ながら、会社がサーバーで Php 5.3.0 を使用するかどうかはわかりません。別の解決策があることを願っています。
また、 GOTOでさえ役立つかどうかはまだわかりません。