6

私の問題は、実際には ajax の読み込み自体ではなく、javascript なしで読み込む機能です。つまり、プロジェクト全体を ajax-availability に基づいてコーディングするか、 ajaxを使用にコーディングすると、簡単に対処できます。

//編集: アーレンドはすでに多かれ少なかれ有効な答えを持っていましたが、同時に「この質問に対する直接的な答えはありません」. ただし、私のようなシナリオに対する開発者の他のアプローチをいくつか見てみたいと思います! ほんの少しのリンクでも役に立ちます!

基本的に、Javascript を有効にしていないユーザーと有効にしているユーザーの両方が同じエクスペリエンスを持っていることを確認するために、同じページにすべてを 2 回コーディングすることにイライラします。それは面倒で、他の人がこの問題をどのように解決するのかいつも疑問に思っていました.

たとえば、同じ変数に依存する 2 つの div を更新すると、面倒になります。次に例を示します。

非 js バージョン

require 'classobject.class.php';
$another_var = 'something';
$class = new classobject($_POST['variable']); // just an example to show that this is dynamic - I'm aware of injection!
$function = $class->returnsth(); // returns 1

if(isset($_POST)) {
    echo '<div id="one">Module 1 says:'; $require 'module_one.php'; echo '</div>';
    echo '<br /><br />';
    echo '<div id="two">Module 2 says:'; $require 'module_two.php'; echo '</div>';
}

これでmodule_two.phpmodule_two.php$function の戻り変数に応じて異なる方法で実行されるコードができました。お気に入り:

if($function >= 1 && another_var != 'something') {
   // do stuff
}
else { 
   // do other stuff 
}

これはリロードで簡単に機能するため、keyUp/enter/submit などで 2 つのモジュールをロードしたい場合、基本的にいくつかの問題があります。

  • $_POSTそれらを使用するには、変数をモジュールに手動で送信する必要があります
  • クラスとそのメソッドを再実行し、各モジュールファイルでそれらへのリンク(require_once)を作成する必要があります。
  • $another_var はモジュールに存在しないため、この変数を各モジュールにも送信する必要があり (たとえば、ポストを使用)、使用する前に、次のように「変更」する必要があります。$another_var = $_POST['another_var'];

これは少し面倒だと思います。皆さんはどうやってそうしているのでしょうか。私のコーディング方法がばかげていないことを願っていますが、別の方法は考えられません。私の非常に基本的な例に関連付けるのはおそらく難しいですが、プロジェクト全体にコードを含めるのは多すぎます。要約すると、この混乱をコーディングしてクリーンアップするためのより良い方法を探しています-方法があるに違いありません! 私はセッションについて考えましたが、互換性のためにセッションに依存したくありません (誰かが Cookie を許可していない場合)。

私のコードを組み立てる方法で私が達成しようとしていることに関連できない場合は、私がかなり直面しているシナリオを説明します (私の惨めさを既に理解している場合は重要ではありません):

  1. 基本的にindex.php、html body と css スタイリングなど、すべてが実行されるページがあります。このページには、インデックスを必要とするページから設定されるいくつかの変数が必要です ($another_var私の例のように)。
  2. 他の変数も設定できるようになりました (たとえば、フォームから)。そのさまざまなクラスとメソッドに応じて、モジュールの while ループで使用される新しい変数 (配列) をロードして、すべてをエコーアウトします。

抽象的すぎないことを願っています。訪問元のページ (予約したいイベント) からいくつかの変数が設定され、さらにいくつかの項目 (期間、いくつかの設定など) がユーザーによって設定される予約システムを考えてみてください。最終的には、データベースから最終結果までの結果を表示することになっています。つまり、ユーザーはステップごとに結果を絞り込んでいると言えます。

4

2 に答える 2

11

あなたの質問に対する直接的な答えはありませんが、考える材料はいくつかあります。

懸念事項の分離 ビジネス ロジックとレイアウト ロジックを分離できるかどうかについて考えることができます。多くの場合、テンプレート エンジンを使用すると、この問題に大いに役立ちます。たとえば、Twig や Smarty で良い経験をしたことがあります (少し前のことで、現在どのように評価されているかはわかりません)。コードを (あまり直線的ではない) 方法で書く必要がありますが、より論理的です。

OOP のような懸念の分離の典型的な例は、次のようなものです。

$this->setParam('Myparam','myvalue');

if ($this->isAjax())
{
    $this->setTemplate('ajax.php');        
    $this->setLayout(false);
} else {
    $this->setTemplate('normal.php');
    $this->setLayout('Mylayout');
}

return $this->render();

これは想像力に富んだ状況であり、多くの MVC のようなアプリケーションやフレームワークで見られます。主なアイデアは、レイアウトをデータから分離できるようにすることです。インスピレーションを得るために、いくつかの最新のフレームワーク (symfony、codeigniter、zend フレームワークなど) を検討することをお勧めします。

用語集 / 分離された PHP アプリケーションでよく適用される概念 ここに、使用できる概念の簡単なリストを示します。

PHP での mvc の例: http://www.phpro.org/tutorials/Model-View-Controller-MVC.html

注:私は実装があまり好きではありません。私は既存のフレームワークをはるかに好みます。このチュートリアル全体の説明が気に入っています。たとえば、私にとってこのリンクは学習用であり、実装用ではありません。

サイレックス symfony2 のメークによる単純な分離された php マイクロ フレームワークには、サイレックスを本当にお勧めします。実装と学習は簡単ですが、ここで説明する概念のほとんどが含まれています。名前空間やクロージャなど、すべての php 5.3+ 機能を使用します。

参照: http://silex.sensiolabs.org/

Frontcontroller パターン コードのエントリ ポイントは 1 つだけです。私は通常、あなたのアプリケーションに1つだけ、そして1つだけポイントを持っています. 通常、フロントコントローラーはリクエストをアプリケーションの残りの部分に「ディスパッチ」します

http://en.wikipedia.org/wiki/Front_Controller_pattern

ルーティング

ルーティング システムは、多くの場合、frontcontroller パターンと組み合わせて使用​​されます。基本的には、どの URL がどのモジュール / コントローラに接続されているかを記述します。これにより、URL を変更せずに、ユーザーがアプリにアクセスする方法を変更できます。

参照: https://stackoverflow.com/questions/115629/simplest-php-routing-framework

コントローラ

コントローラーは、ビジネス ロジックが適用される場所です。データベースからデータを取得し、権限を確認し、テンプレートを設定し、レイアウトを設定します (ただし、個別の懸念事項が大きくなりすぎる場合は、これもコントローラーの外に移動されます)。

モデル モデルは基本的に、データベースを管理するレイヤーです。これは、すべての mysql_* 関数を移動する単純なクラスにすることも、フル機能の ORM にすることもできます。主な哲学は、データベースへの情報のフェッチと配置に関連するすべてのロジックが分離されているということです。

1 ステップ アップ: ORM アプリケーションでよく使用されるメソッドは、オブジェクト リレーショナル モデルです。これらは、SQL レコードを PHP オブジェクトに「マップ」します。Doctrine と Propel は、これらのよくできたライブラリの 2 つです。私は開発においてこれらのシステムに大きく依存しています。この意味で、教義または推進部分はモデル層を表します。

ビュー: 通常、ビューはテンプレート エンジンで構成されます。プレーンな PHP をテンプレートとして使用するものもあれば、symfony など、変数が配置される別のスコープを作成するものもあります。何が最善かについては多くの議論や意見がありますが、そのうちの 1 つがスタックオーバーフローにあります。

私が好きなもの: - Twig: http://twig.sensiolabs.org/ - sfTemplate: http://components.symfony-project.org/templating/ - Smarty: http://components.symfony-project.org/templating /

デカップリングのメカニズム:

  • イベントベースのシステム イベントを使用すると、コードを分離するのに役立ちます。たとえば、レコードが保存された後に電子メールを送信したい場合、イベントはそれを行うための優れたソリューションです。一般に、モデルは電子メールについて知る必要はありません。したがって、イベントはそれらを接続する方法です: -email-send-class に特定のレコードをリッスンさせて、それらが正しいメールを送信できるようにすることができます。(おそらく、コントローラから電子メールを送信したい場合があります。これはおそらく好みの問題です)。

  • 依存性注入 PHP で OOP コードを使用する場合、多くの場合、実行中のシングルトン クラス (構成など) に依存していました。OOP の観点からは、これはテストが難しく、依存関係をそのように実行することはあまりエレガントとは見なされないため、悪いと見なすことができます。依存性注入は Java から派生したパターンであり、現在ではこれを回避するために新しいフレームワークで使用されています。頭を包み込むのは少し難しいかもしれませんが、いくつかの新しいフレームワークで戻ってくることがわかります.

PHP での依存性注入: PHP 5.3 での依存性注入

フレームワーク:

これらの方法の多くは困難であるか、自分で実装するには多くの作業が必要です。多くは、このためのフレームワークに常駐します。フレームワークが必要な場合と必要でない場合があります。フレームワークが必要な場合と不要な場合がありますが、それはあなたの選択です。しかし、フレームワークがそれを行う方法を学ぶことは依然として有用であり、自分で車輪を再発明しようとするのではありません。

フレームワークなしの php フレームワーク: https://stackoverflow.com/questions/694929/whats-your-no-framework-php-framework

良い習慣: https://stackoverflow.com/questions/694246/how-is-php-done-the-right-way

注目に値するフレームワーク (imho): CodeIgniter、Kahona、CakePHP、Symfony (1.4/2.0)、Silex、Zend Franework、Yii。他にもたくさんあり、それぞれに熱心なファンと嫌いな人がいます。

于 2011-11-26T21:25:40.460 に答える
0

私はPHPでこのようなものを書きました。$content変数を定義してからrequire('layout.php'). 変数は$content単なる大きな HTML 文字列です。

リクエストがAJAXかどうかを判断するPHP関数を作成しました。

非 AJAX 応答は$content、b/t ヘッダーおよびフッター レイアウト コンテンツを中央に配置してレイアウトをレンダリングします。

AJAX リクエストは基本的にこれを取得します: json_encode(Array("content"=>$content)). そして、jQuery を使用して JSON 応答から HTML を取得し、DOM を変更します。を使用json_encode()すると、JavaScript の文字列のエスケープが処理されます。

最終的に、複雑なソリューションを過度に設計することなく、すべてのページを事実上 AJAX 化しました。

AJAX をサポートするブラウザーは、新しいタブ/ウィンドウでリンクを開いて、非 AJAX 要求をシミュレートすることもできます。(または、リンクをブックマーク/共有することもできます。)

于 2011-12-05T15:38:50.977 に答える