2012-01-16 59 views
1

しばらく私はウェブサイトを持っていましたが、それは何百もの個々のPHPファイルに成長しました。約2年前、私は同じウェブサイトのモバイル版を作った。私はメインファイルだけをコピーし、ヘッダーとフッターをモバイルフレンドリーに調整することにしました。残りは期待通りに働いた。私はこの時点で50%の互換性があると言います。 サブディレクトリのいくつかは、コピーする代わりに、ln -sを使ってリンクを行うことができると私は決めました。これにより残りの45%が解決されました。PHP - 別のファイルが存在する場合は読み込み

最近、私は厄介な状況に遭遇しました。このシンボリックリンクされたサブディレクトリ内のファイルの1つは、モバイル版と完全なWebサイトでは大幅に異なる必要があります。通常のファイルでは、ハードコピーを作成して内容を変更するだけですが、sym-linkedディレクトリ内のファイルに対しては不可能です。

誰もこれに遭遇しましたか?これをどうすれば解決できますか?ここで

は、ファイルレイアウトは&例です。

/var/www/domain.com/ 
/var/www/mobile.domain.com/ 

/var/www/mobile.domain.com/images -> /var/www/domain.com/images 
/var/www/mobile.domain.com/tools -> /var/www/domain.com/tools 

私は、ファイル/tools/help/wizard/configure.phpを変更する必要がある場合、私はちょうどそのファイルの一意のファイルを持つことはできません

これは、UGLのように思える

if (file_exists("/var/www/mobile.domain.com/_overwrite_/" . $requested_file)) { 
    // ... include it instead of running the actual file 
} 

:私はと思ったが、のようなものをチェックするために、モバイルheaderファイルを変更されて好きではない

一つのアプローチyアプローチ。 Apacheディレクティブでも同様のことができます(私はそれらを知らないが、私はそれをModRewriteと推測している)

+0

もっと良いアプローチはないと思います。 Mod-rewriteは、HTTPリクエストをリダイレクト/変更するために使用され、PHPによってではなく、ユーザー(ブラウザ)によって送信されます。 ApacheはユーザーとPHPの「架け橋」です – Kristian

+0

ここで切り替えるのはあなたのページのプレゼンテーションロジックですか、あるいはモバイルプラットフォーム用の別のプレゼンテーションをサポートするビジネスロジックの変更ですか? – Scuzzy

+1

オートローダーまたは簡単なincludeステートメントを使用していますか? –

答えて

1

あなたはファイルシステムレベルの問題として疑問を呈しています。ファイルシステムレベルでそれを解決するには、ディレクトリ内のすべてのエントリにシンボリックリンクを張って、上書きしたいエントリを除いてください。

あなたはmobile.domain.comのための特別な/tools/help/wizard/configure.phpをしたい場合は、代わりにディレクトリレベルソフトリンクの

/var/www/mobile.domain.com/tools -> /var/www/domain.com/tools 

あなたはhelp以外のツール内のすべてのエントリへのソフトリンクを作ることができる可能性:

/var/www/mobile.domain.com/tools/file1 -> /var/www/domain.com/tools/file1 
/var/www/mobile.domain.com/tools/file2 -> /var/www/domain.com/tools/file2 
/var/www/mobile.domain.com/tools/file3 -> /var/www/domain.com/tools/file3 

物理ディレクトリtools/helpを作成し、wizardを除くすべてのエントリにソフトリンクを作成します。そして物理ディレクトリwizardを行い、configure.phpを除いてそこにあるすべてのエントリへのソフトリンクを作成:

/var/www/mobile.domain.com/tools/help/fileH1 -> /var/www/domain.com/tools/help/fileH1 
/var/www/mobile.domain.com/tools/help/fileH2 -> /var/www/domain.com/tools/help/fileH2 
/var/www/mobile.domain.com/tools/help/fileH3 -> /var/www/domain.com/tools/help/fileH3 
/var/www/mobile.domain.com/tools/help/wizard/fileW1 -> /var/www/domain.com/tools/help/wizard/fileW1 
/var/www/mobile.domain.com/tools/help/wizard/fileW2 -> /var/www/domain.com/tools/help/wizard/fileW2 
/var/www/mobile.domain.com/tools/help/wizard/fileW3 -> /var/www/domain.com/tools/help/wizard/fileW3 
/var/www/mobile.domain.com/tools/help/wizard/configure.php` 

mobile.domain.comに含まれては、彼らが存在してカスタマイズされた物理ファイルをピックアップし、ソフトリンクを経由してピックアップしますカスタマイズが存在しないメインサイトのファイル。

すべてのソフトリンクを使用してディレクトリを作成するのは面倒なことではなく、単純なシェルスクリプトを作成してソースディレクトリの内容をリストし、それぞれの目的のディレクトリにソフトリンクを作成するだけです。

/var/www.domain.comにファイルを追加するたびに、/var/www/mobile.domain.comのソフトリンクを更新するのは面倒です。これは、単一のサイトの元のコードを設計し、後でそれを複数のサイトに拡張しようとした結果です。コードを再構築すると、ファイルの追加や削除の処理方法が改善されますが、これには労力を要します。私はあなたの質問からあなたのコードを再構築しないようにしようとしています。

PHPオブジェクト階層レベルでこの問題を処理する方法があることに注意してください。 domain.comのPHPファイルでオブジェクトとクラスが定義されている場合は、mobile.domain.comのPHPファイルにサブタイプがdomain.comで、必要な変更のみを定義できます。このようにして、mobile.domain.comには、異なるモジュールを定義するためのPHPファイルだけが必要です。

+0

+1で終わります。私のお気に入りの解決策ではありませんが、少なくとも私がまだ考慮していない解決策です。 – Mikhail

0

モバイルヘッダに定数を設定してみてください:

define(IS_MOBILE_VIEW, true); 

その後、あなたはそれはほんの始まりに簡単なチェックを行うと、appropiate他のファイルをロードモバイル版のために異なることがありロードされているファイルに:

if(defined(IS_MOBILE_VIEW) && IS_MOBILE_VIEW) { 
    require_once '/var/www/mobile.domain.com/other_file.php'; 
} else { 
    //rest of file, you can also use a return; in the if clause 
    //or something similar if you don't want to enclose the whole logic in 
    //an else clause 
} 
0

私はあなたが記述したものより優れている方法はありません。実際には、すべてのインクルードステートメントが1つの場所(header.php?)にある場合、それはアプリケーションの残りの部分からこのロジックを隠すことができるので、まともなソリューションのように見えます。私はそれに欠点がないと思う。

さらにこれを関数に抽象化し、インクルード呼び出しをその関数に置き換えることで、コードに触れることなく後で必要なファイルを上書きすることができます。

今後、PHPのautoloadの機能を調べることもできます。

+0

あなたの答えは混乱しています。要約*関数への*何?誰がクラスについて何を言ったのか? header.phpは、ユーザがログインしているかどうかをチェックし、HTMLの先頭を表示します。それで全部です – Mikhail

関連する問題