Web アプリケーションでユーザーにメッセージを表示します。 クエリパラメータ PHP-Swagger JQuery CRUD データベースクエリ用の AJAX 関数

3.3K

ユーザーへのメッセージの表示は、Web アプリケーションが実行する必要がある非常に一般的なアクションです。 これは、フォームの処理時、エラー メッセージ、ユーザーがサイトの制限された部分にアクセスしようとしたときに登録するように指示するメッセージなど、さまざまな場合に発生する可能性があります。

多くの場合、メッセージの作成と出力は異なる HTTP リクエストに分割されます。 一般に、フォームの処理後にリダイレクトを使用すると便利ですが(「戻る」ボタンと「更新」ボタンの問題を回避するため)、同時に、メッセージを作成する自然な瞬間はまさにフォームを処理し、それに伴うアクションを実行する瞬間です。それ。 なぜ? メッセージ テキストが次のようになっていると想像してください。「アイテム『マウス パッド』の注文数が 7 から 12 に変更されました。」 おそらく機能の点でまったく異なるページにリダイレクトされた後は、以前に何が行われたかを判断するのがさらに面倒になるでしょう。

ほとんどの場合、メッセージはフォームを処理する POST リクエストに表示されます。これは良くありません。「このページは最新ではありません」という言葉は人生を台無しにします (ユーザーが [戻る] ボタンを試行しようとしたとき)。

誰かがリダイレクトを使用して、フレンドリーなメッセージをあきらめています。

同時に、人生をより良くするための簡単かつ明白な方法もあります。 明白であるにもかかわらず、何らかの理由で、少なくとも他の人のソースを見たときは、誰もそれを使用しているのを見たことがありませんでした。

したがって、問題があります。メッセージはさまざまなリクエスト内で「存続」する必要があります。 メッセージのテキストを、メッセージを表示するページに転送するメカニズムが必要です。 おそらくセッションについてはすでに覚えているでしょう。

はい、一般的にはあなたの言う通りです。 他の方法 (グローバル変数など) では、リダイレクトが使用されている場合にデータを保存できません (Maxim Naumenko による注記)。 さらに、私は通常、アプリケーションの各画面に、他の情報とともに、前の画面で生成されたメッセージを表示する機能があることを確認します。 メッセージを表示するための画面を別途用意する必要がなく、再度マウスをクリックする必要がないので便利です。 しかし実際には、デザイナーはここで、メッセージが表示される領域を強調表示することを考える必要があります。

このアイデアは非常にシンプルで、いくつかのクラスで実装できます。

最初に思い浮かぶのは、Message クラスを作成することです。これは、実際には、単純なクラス図でメッセージを表します。 メッセージは、それ自体を画面に表示できるだけでなく、セッション内に保存できる必要があります。

class Message ( /** * メッセージの内容。 */ var $content; /** * メッセージテキストを初期化するためのコンストラクター。 * * @param content message content */ function Message($content) ( $this->content = $ content ; ) /** * セッションにメッセージを書き込みます */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * ページにメッセージを出力します */ function toPage() ( echo " - " . $this->content . "
"; } }

$_SESSION 変数はセッションにアクセスするために使用されます。

$_SESSION は配列であることに注意してください。インデックス「session_message」を持つこの配列の 1 つの要素だけを使用しています。

この場合、「配列の配列」を扱っています。「session_message」要素に格納するのは配列であり、これは送信されたメッセージのリストです (もちろん、複数のメッセージが存在する可能性があります)。

スレッドが見つからない場合は、マニュアルのセッションとアレイに特化したセクションを見直してください。

ご質問があるかもしれません。 なぜここで授業が必要なのでしょうか? 2つの機能があればなんとかなるかもしれません。 しかし、さらに見てみましょう。 さまざまなタイプ (情報、エラー、警告) のメッセージを作成し、メッセージ受信者を決定する必要がある場合があります。

現時点では、セッションに入れられるのはオブジェクト自体ではなく、メッセージ テキストだけであることに注意してください。 OOP を使用すると、このメソッドにアクセスするクライアント コードを変更せずに、send() メソッドの動作を後から変更できます (たとえば、将来的には、多くのフィールドがある場合、Message オブジェクト全体をセッションに書き込むことができます)。

関数を使用してこれを行うことを想像してみましょう。 おそらく、message_send($txt) 関数と message_to_page($txt) 関数があるでしょう。 次に、メッセージの種類ごとに異なる動作を行う機能を追加する必要があります。 関数呼び出しの変更: message_send($txt, $kind)、message_to_page($txt, $kind)。 そのような関数を探してアプリケーション コード全体を調べて修正する必要があります。

これは、メッセージを連想配列 $msg[‘txt’]、$msg[‘kind’] として提示することで状況を事前に予測することで回避できます。その場合、関数呼び出しのパラメーターは 1 つだけになります。 これがどのようにクラスになろうとしているか感じられますか?

したがって、OOP を使用すると、事前にすべてを考えなくても済むという贅沢が得られます。

次のクラスである Inbox は、このためにのみ設計されています。

class Inbox ( /** * 受信したメッセージの配列。 */ var $messages = array(); /** * コンストラクターで、すべての受信メッセージを取得し、 * セッションから削除します。 */ function Inbox() ( if (is_array($ _SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->メッセージ = 新しいメッセージ($messages[$i]); ) ) /* メッセージ配列をクリア */ $_SESSION["session_messages"] = array(); ) /** * 受信トレイの内容をページに表示します。 */ function toPage() ( $co = sizeof($this->messages); if ($co > 0) ( echo "システムからのメッセージ:
"; ) for ($i = 0; $i< $co; $i++) { $this->メッセージ[$i]->ToPage(); ) ) )

メッセージング システムを試してみましょう。

現在の分の秒数を報告することでフォームの送信に応答する、非常に単純な例を作成してみましょう。

配列とセッションに関するすべての作業をクラス内に隠したので、最終的なコードはシンプルで美しく見えます。

Web サーバー上にディレクトリを作成し、その中に次の 3 つのファイルを作成してスクリプトを試してください。 「戻る」ボタンと「更新」ボタンには問題がないことに注意してください。

ここで、通常、ページ上に複数のブロックがあり、それぞれに個別のアプリケーションを含めることができる複雑なポータルを作成していると想像してください。

ここで 2 つの問題に遭遇します。

* メッセージのリストをページの特定の部分に表示したいのですが、これに適した場所はすでに見つかりました。
問題は、ページ上のメッセージのリストの位置に対応する正確な瞬間に $inbox->toPage() コマンドを実行する必要があることです。 このリストの位置を変更したい場合はコードを記述する必要がありますが、そのためにポータル フレームを常に変更するのは良くありません。 最善の解決策は、フレームワークに接続する必要があることだけがわかっている別個のモジュールの形式でメッセージの出力を作成することです。
つまり、モジュールを起動するという厳密な順序から解放されます。 確かに、受信箱の出力結果はシステムの動作に依存しないので (このステップではすでにセッション内のすべてのデータが存在します)、なぜ余分に複雑になるのでしょうか?
* メッセージ リストの外観 (デザイン) を維持するには、Message クラスと Inbox クラスの toPage() メソッドにハードコーディングされている HTML コードに注意する必要があります。 通常、デザインを変更するには、PHP コードを変更する必要があります。

最初の問題を解決するには、受信トレイの出力結果を保存するバッファを作成します。

おそらく、(Inbox に) 同様のものがまだいくつかあるので、バッファ システムを作成する必要があります。 誰の出力が誰のものであるかを混同しないように、おそらくバッファに名前を付けることになるでしょう。 バッファを出力するシーケンスをどこかに保存します。できれば変更を容易にするために外部ファイルに保存します。

この解決策の試みにより、中間データを保存する手段として XML を使用するというアイデアがすでに得られています。 XSLT スタイルを使用すると、2 番目の問題の解決に役立ちます。

XML とは何か、XSLT とは何かについては詳しく説明しません。 これらのことに慣れていない場合は、zvon.org から探し始めると良いでしょう。

アイデアは、HTML コードではなく、toPage() メソッドで XML 構造を生成することです。 ページ ドキュメントは XML コードを含む文字列として作成され (「バッファ」として機能します)、スクリプトの最後の段階で XSL 変換を使用します。

まず、コードの主要部分の結果がどうなるかを想像してみましょう。

分57秒:45

それが何であるかを推測するのは非常に簡単です - 2 つのメッセージと 1 つのフォームです。 PHP スクリプトはそのような文字列を準備するだけで済み、非常に簡単であることに注意してください。 さらに、メイン タグの順序は重要ではありません。たとえば、プログラマにとって都合がよいように、メイン タグを最初に置くことができます。 それを実装する方法。 何も変更せずに、出力バッファリングを使用し、HTML コードの代わりに XML を出力し、最後に単に出力を文字列にキャプチャすることができます。 しかし、そうすると柔軟性が失われます。たとえば、デバッグ情報を (エコーを使用して) ページに直接出力したい場合があります。 同時に、PHP 開発者は、ツリー ドキュメントを作成して渡すためのより高度な方法を提供する DOM モジュールの開発に取り組んでいます。 DOM を実装したい場合は、文字列の出力を DOM 要素の作成に変更して、アプリケーション全体を再設計する必要があります。 したがって、私はオブジェクトの XML 表現をオブジェクト自体の中に格納し、共通の XML ドキュメントを順次組み立てることを好みます。 それはそれほど難しいことではなく、少し修正する必要があるだけです。 この手法は、XML データを保存する特定の方法に厳密に関連付けられていないことがわかります。これにより、ほとんど手間をかけずに DOM の使用に移行できるようになります。 まず、各オブジェクトに toPage() メソッドがあることに注目してください。 この類似性により、新しい共通の親クラスの導入を検討する必要があります。 ページの XML ドキュメントの一部を作成できる各クラスは、オブジェクトの XML 表現を処理するクラスから継承します。 それを出力可能と呼びましょう。

class Outputable ( /** * XML コンテナ (文字列)。 */ var $output = ""; /** * コンテナの内容を与え、コンテナをクリアします。 * * @XML データを含む文字列を返します */ function getOutput () ( $ out = $this->output; $this->output = ""; return $out; ) /** * コンテナの内容に一部を追加します * * @param string 追加する文字列 * / function appendOutput($string) ( $this ->output .= $string . "n"; ) /** * "Abstract" メソッド. */ function toPage() ( ) )

toPage() メソッドは空になります。この場合、外部の「マトリョーシカ」クラスが内部クラスとどのように通信するかを示す指標として必要になります。 ただし、同じ方法でページ上に表示されるオブジェクトが多数あることに気付いた場合は、ここでデフォルトの実装を提供できます。

Message クラスと Inbox クラスはわずかに変更されます。両方とも Outputable から継承する必要があり、toPage() メソッドも変更されます。
メッセージ.php

class Message extends Outputable ( /** * メッセージの内容。 */ var $content; /** * メッセージテキストを初期化するためのコンストラクター。 * * @param content message content */ function Message($content) ( $this->content = $content; ) /** * セッションにメッセージを書き込みます */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * ページにメッセージを出力します * / function toPage() ( $this->appendOutput("".$this->content.""); ) )

class Inbox extends Outputable ( /** * 受信したメッセージの配列。 */ var $messages = array(); /** * コンストラクターで、すべての受信メッセージを * 受信し、セッションから削除します。 */ function Inbox( ) ( if (is_array ($_SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->メッセージ = 新しいメッセージ($messages[$i]); ) ) /* メッセージ配列をクリア */ $_SESSION["session_messages"] = array(); ) /** * 受信トレイの内容をページに表示します。 */ function toPage() ( $co = sizeof($this->messages); $this->appendOutput(""); for ($i = 0; $i< $co; $i++) { $this->メッセージ[$i]->toPage(); $this->appendOutput($this->messages[$i]->getOutput()); ) $this->appendOutput(""); ))

出力方法が変更されました。現在は、ページに直接出力する代わりに、外部表現は当面、各オブジェクトに「存在」する Outputable に保存されます。 appendOutput() メソッドは、echo() コンストラクトの代わりとして機能します。 オブジェクトの出力を取得するには、getOutput() メソッドが使用されます。

次に、コードのクライアント部分が何であるかを見てみましょう。これにより、前と同じ問題が解決されます。
インデックス.php

主な革新は $global_content オブジェクトにあり、その名前自体がそれを物語っています。 この場合、これは Outputable クラスに属します。実際のタスクでは、ページ コンテンツ用に別のクラスを作成することになるでしょう。

よく見ると、スクリプトの内容は実質的に変わっていません。同じ受信トレイ、同じ toPage() です。 ページコンテンツにメッセージリストの内容を表示する命令を追加しました。 多様性を持たせるために、2 つのメッセージが生成されるようになりました。

結果を確認するには、XSL テンプレートを準備するだけです。
スタイル.xsl

XSLT の例

メッセージ

私たちは何を達成できたのでしょうか?

まず第一に、複雑なプロジェクトに自信を持って取り組むことができます。モジュールの真の独立性が確保されています。 ページ上に結果が配置される順序は、外部 XSL テンプレートを使用して制御されるようになり、モジュールの実行順序には依存しません。

作業の結果として XML データを生成する任意のモジュールをプロジェクトで使用できます。 ちなみに、これは、共通の規格が存在せず、特定のエンジンのメソッド(assignなど)の呼び出しシーケンスでデータ作成が行われるテンプレートエンジンに比べて有利な点の1つです。

もう 1 つの利点は、デバッグが容易なことです。 スクリプトを実行すると、各ページにデバッグ出力 (アプリケーションのデバッグを大幅に簡素化する XML プロトタイプ) が含まれていることがわかります。

他に考慮する必要があるのは、メッセージ オブジェクトの作成方法です。 クライアント コードで new を直接使用することが常に便利であるとは限りません。 しかし、おそらくこれは別の記事のトピックになるでしょう。

最後に、今後の見通しについて簡単に説明します。

* 重要なメッセージのリストを表示するポップアップ ウィンドウ
* メッセージ内の「送信元ページ」と「宛先ページ」
* データベースにメッセージを記録する
*ボタン「自分の行動履歴を表示」
* セッション内のユーザーアクションの統計分析
* Web アプリケーションの「インテリジェント アシスタント」

概要

Joomla で初めて組み込まれた通知システムを使用すると、アプリでユーザー (またはユーザーのグループ) にさまざまなイベントについての情報を提供し続けることができます。 通知は、ユーザーが読んで追跡したいと思う重要なアラートであると考えてください。
通知はどこでも生成できます。 コンポーネントまたはプラグイン内で、後で JomSocial 通知システム内に表示されます。
このチュートリアルではその方法を説明しますが、使用できるサードパーティ コンポーネントがわからないため:) 例は、onAfterProfileUpdate イベントでトリガーされるコミュニティ プラグインで実行されます。
このイベントでトリガーされるプラグインの作成方法がわからない場合は、このガイドを確認することをお勧めします。

とにかくコンポーネントに実装する

このチュートリアルの概要で述べたように、コミュニティ プラグインを使用して通知を生成します。
おそらく、コンポーネントまたはプラグイン内に通知を作成することになるでしょう。 次のチュートリアルは、このような場合のいずれでも機能します。 コード内のどの時点で通知が作成されるかを決定し、JomSocial Core Libraries ファイルをロードするだけで済みます。

require_once JPATH_ROOT 。 "/components/com_community/libraries/core.php" ;

以下で説明するチュートリアルに従うと、拡張機能でも問題なく動作します。

開発環境の準備

1. ユーザーがプロファイルを変更したときにトリガーされるコミュニティ タイプのサンプル プラグインがすでに作成されていることを前提とします。
そうでない場合は、から空のサンプル プラグインをダウンロードし、Joomla にインストールしてプラグインを有効にすることができます。 と名付けられています コミュニティ - 通知の例
2. データベースに移動し、これら 2 つのテーブルを空にして、レコードがまったく存在しないようにします。

A) prefix_community_notification
b) prefix_community_mailq

3. テスト サイトに少なくとも 2 人のユーザーがいて、その ID を知っていること

Joomla の以前のバージョンでは、ユーザー ID は常に指定された番号 (62、42) から始まりました。Joomla 3 では、この番号はランダムになります。したがって、テスト環境の図は、お客様側では確実に異なるためです。

最初の通知

ROOT/plugins/community/example にあるプラグイン php ファイルを開きます。
onAfterProfileUpdate() 関数内で、

CNotificationLibrary::add ( $cmd , $actor , $target , $subject , $body , $template , $params ) ;

例に示すように、通知追加 API には 7 つのパラメーターがあります。

  • $cmd - 通知タイプです。 このファイルですべての通知タイプを確認できます。 ROOT/components/com_community/libraries/notificationtypes.php の 53 行目あたりから始まります。system_messaging 通知タイプを使用することをお勧めします。
  • $actor - アクションを実行する人です
  • $target - 通知を受け取る個人またはグループです。
  • $subject - 通知ポップアップ ウィンドウと電子メール タイトルの両方における通知の件名です。
  • $body - 電子メール通知メッセージの本文です。
  • $template - 使用する特定のテンプレートが必要な場合は、ここで定義できます。 それ以外の場合、このパラメータは空にすることができます
  • $params - カスタム定義パラメータ
  • これをすべて理解した上で、使用する変数を定義しましょう
    プラグイン コードを次のように変更します。

    $user = CFactory::getUser(); $cmd = "システムメッセージング" ; // 最初のパラメータ、アクティビティのタイプ $actor = $user -> id ; // 2 番目のパラメータ - $actor の ID を取得 $target = "965" ; // 3番目のパラメータ。 誰が通知を受け取りますか? 私たちの開発環境では、管理者ユーザーの ID は 965 です。実際の環境では、オブジェクトまたはユーザーの配列から ID を取得することになる可能性が高くなります。 $subject = "通知の件名" ; // 電子メール通知とポップアップ通知の両方の件名 $body = ; //メールの本文メッセージ。 $template = "" ; // 特定の jomsocial テンプレート ファイルを使用する必要がある場合は、ここで定義できます。 $params = 新しい CParameter("" ) ; // 追加の params オブジェクトを作成し、クラスを正式に定義することなく、それにデータを割り当てたい CNotificationLibrary:: add ( $cmd , $actor , $target , $subject , $body , $template , $params ) ;

    次に、任意のユーザーでログインし、プロファイル情報を変更します。 何が起こったのかを確認するためにデータベースに行きましょう。
    prefix_community_notifications テーブルに移動し、新しいレコードを確認します。

    prefix_community_mailq テーブルに移動し、新しいレコードを確認します。

    おめでとう! - 初めて独自の通知を作成し、電子メールと内部 JomSocial 通知システムを介して送信されました。


    コードの肥大化の可能性

    上の例は問題なく、機能しますが、一般にそのように使用することはお勧めできません。 代わりに、次のように書くこともできます

    $actor = CFactory::getUser(); $params = 新しい CParameter("" ) ; CNotificationLibrary:: add ( "system_messaging" , $actor -> "これは通知本文メッセージです" , "" , $params ) ;

    これは、基本的に上記のコードとまったく同じことを実行しながら、はるかにクリーンで理解しやすいものです。

    カスタム通知パラメータ

    通知 API は、追加したいパラメータを使用して拡張できます。
    これらのパラメータは、電子メール テンプレート、通知、そしてもちろん言語ファイルのいずれかに渡すことができます。

    $actor = CFactory::getUser(); $link = "http://www.google.com" ; $params = 新しい CParameter("" ) ; $params -> set ("actor" , $actor -> getDisplayName() ) ; // (アクター) タグとして使用可能 $params -> set ("actor_url" , "index.php?option=com_community&view=profile&userid=" . $actor -> id ) ; // (アクター) タグのリンク $params -> set ("url" , $link ) ; // アクティビティ全体の URL。 通知ウィンドウでアバターの上にマウスを移動するときに使用されます。 送信メールの(url)タグとしても使用できます。 $link 変数が定義されていることを確認してください:) CNotificationLibrary:: add ( "system_messaging" , $actor -> id , "965" , "Notification Subject" , "This is the notification body message" , "" , $params ) ;

    • $params = 新しい CParameter( ); - クラスを正式に定義せずに、新しい params オブジェクトを作成し、それにデータを割り当てたいと考えています。
    • $params->set("アクター", $actor->getDisplayName()); - 通知には常にアクターが必要です。 このパラメータは、(actor) タグとしてテンプレートに渡すことができます。 通知ウィンドウでは、アクションを実行するユーザーを定義します。
    • $params->set("actor_url", "index.php?option=com_community&view=profile&userid= . $actor->id); - アクター URL は通常、アクターの URL です。 通知ポップアップで、(actor) 要素へのリンクを追加します
    • $params->set("url", $link); - これは常に適切に設定する必要がある最も重要なパラメータです。 通知ウィンドウでは、このパラメータはアバター画像上で使用されます。 電子メール通知では、アクティビティが発生した場所がエコーされます。

    この例では、変数 $link を次の場所に設定します。 www.google.comそれがどのように機能するかを見ることができます

    言語文字列と使用パラメータの追加

    設定したパラメータを言語ファイルでも使用できるようになります。
    「」を変更して言語キーを定義しましょう。 CNotificationLibrary::add() API

    CNotificationLibrary::add("system_messaging" , $actor -> id , "965" , JText::sprintf("PLG_COMMUNITY_EXAMPLE_SUBJECT" ) , JText::sprintf("PLG_COMMUNITY_EXAMPLE_BODY" ) , "" , $params ) ;

    言語ファイルは次のようになります。

    PLG_COMMUNITY_EXAMPLE_SUBJECT = "(俳優) プロフィールを更新しました" PLG_COMMUNITY_EXAMPLE_BODY = "こんにちは管理者 \n (俳優) がプロフィールを更新したことをお知らせするメールです \n\n Google にアクセスしたい場合は、ここをクリックしてください \n a href=" _QQ_" (url)「_QQ_」>(url)"

    この例では、タグ (actor) と (url) を使用して、通知テンプレートと電子メール テンプレートの両方にデータを渡しています。 それがどのように見えるか見てみましょう。
    アバターの上にマウスを移動すると、通知ウィンドウで (url) パラメータがキックインされ、アバター上に Google へのリンクが追加されることに注目してください。 それは意図的です、なぜなら私たちがそのようにしたからです:)


    ]

    同じウィンドウ内で、アクター リンクの上にマウスを移動したとき。 これは、(actor) がアクションを実行するユーザーをエコーする部分であり、(actor_url)」はオブジェクトが適切にリンクされるように注意します。


    電子メールキューで何が起こるかを見てみましょう


    そして最後に、エンドユーザーに送信される実際の電子メール


    成功
    これまでに、通知ウィンドウと電子メールで正常に使用される 3 つのパラメーターを作成しました。

  • (actor) - アクションを実行するユーザーのユーザー名を返します。
  • (actor_url) - を与えます (俳優)の属性
  • (url) - 必須ではありませんが、通知には常に記載する必要があります。 これは、通知されるアクションが発生したメイン URL です。
  • 同様に、「」を定義できます。

    • (ターゲット) - 必要な場合
    • (target_url) 通知で必要な場合。
    • (タイトル) - 通常、通知を生成したオブジェクトを参照するために使用されます。 例: 「ユーザー X がアルバム Y に新しい写真を投稿しました。」 アルバム Y はここのタイトルです
    • (title_url) - 前のものと同様に、通知を生成したオブジェクトの URL。
    • (メッセージ) - このパラメータを使用して、JomSocial 電子メールの本文にメッセージを設定 (およびエコー) できます。

    結局のところ、私は妻以上に適した人は見つからないことに気づきました。 あとは嫁さんを探すだけだ

    PHP AJAX CRUD: MySQL データベース内のレコードの作成、削除、編集

    この記事では、PHP を使用して MySQL データベースのレコードを追加、編集、削除する方法について学びます。 AJAX リクエストをサーバー側スクリプトに送信する JQuery ハンドラーを使用しました。 ハンドラーはレコードのリストを更新します。

    作成、削除、編集のリクエストを送信するための AJAX フォーム

    レコードを追加するとき、フォームは AJAX リクエストを介して PHP スクリプトにデータを送信します。 追加が成功すると、エントリのリストが再ロードされます。

    CRUD データベース クエリ用の JQuery AJAX 関数

    JQuery AJAX 関数では、switch case の追加編集と削除を行います。 これらの場合、データベースのアクションに応じて、異なるクエリおよび応答データ文字列が生成されます。

    function showEditBox(id) ( $("#frmAdd").hide(); var currentMessage = $("#message_" + id + " .message-content").html(); var editMarkUp = ""+currentMessage+" SaveCancel"; $("#message_" + id + " .message-content").html(editMarkUp); ) function cancelEdit(message,id) ( $("#message_" + id + " .message-content") .html(message); $("#frmAdd").show(); ) function callCrudAction(action,id) ( $("#loaderIcon").show(); var queryString; switch(action) ( case "add ": queryString = "action="+action+"&txtmessage="+ $("#txtmessage").val(); Break; case "edit": queryString = "action="+action+"&message_id="+ id + " &txtmessage="+ $("#txtmessage_"+id).val(); ブレーク; case "削除": queryString = "action="+action+"&message_id="+ id; ブレーク; ) jQuery.ajax(( url: "crud_action.php", data:queryString, type: "POST", success:function(data)( switch(action) ( case "add": $("#comment-list-box").append(data); Break; case "edit": $("#message_" + id + " .message-content").html(data); $("#frmAdd").show(); 壊す; ケース "削除": $("#message_"+id).fadeOut(); 壊す; ) $("#txtmessage").val(""); $("#loaderIcon").hide(); )、エラー:関数 ()() )); )

    CRUD操作用のPHPスクリプト

    次のコードは、データベースに対してクエリを実行します。 この PHP スクリプトは、CRUD アクションを実行した後、AJAX 応答の結果としてレコードを更新します。

    require_once("dbcontroller.php"); $db_handle = 新しい DBController(); $アクション = $_POST["アクション"]; if(!empty($action)) ( switch($action) ( case "add": $result = mysql_query("INSERT INTO comment(message) VALUES("".$_POST["txtmessage"].")" ) ; if($result)($insert_id = mysql_insert_id(); echo " 編集 削除 " . $_POST["txtmessage"] . " "; ) Break; case "edit": $result = mysql_query("UPDATE comment set message = "".$_POST["txtmessage"]."" WHERE id=".$_POST["message_id"]); if($result) echo $_POST["txtmessage"]; Break; case "delete": if ( !empty($_POST["message_id"])) ( mysql_query("DELETE FROM comment WHERE id=".$_POST["message_id"]); ) ブレーク; ) )

    私の Zend アプリでは、モバイル アプリ用の API を少し書いています。 モバイル開発者が作業を容易にするために、私は Swagger を使用します。 これまでのところ、1 つの GET リクエストを除いて、すべてが正常に動作しています。

    /user/messages/(sessionToken) をいつ呼び出すのですか? ブラウザーで NumMessages = (numMessages) & pageNr = (pageNr) を実行すると、必要な結果が得られますが、Swagger にこのリクエストを実行させようとすると、sessionToken のみが渡されます。 Swagger に次のアノテーションを試してみました。

    /** * @SWG\Api(path="/user/messages/(sessionToken)?numMessages=(numMessages)&pageNr=(pageNr)", * @SWG\Operation(* method="GET", * summary="ページングされたメッセージを取得します", * Notes="", * type="string", * Nickname="getUsermessagesPagged", * authorizations=(), * @SWG\Parameter(* name="sessionToken", * description="トークンアクティブなユーザー セッションから", * required=true, * type="string", * paramType="path", * allowedMultiple=true *), * @SWG\Parameter(* name="numMessages", * description="ページ上のメッセージの数 (numMessages と pageNr が両方設定されていない場合は無視されます)", * required=true, * type="string", * paramType="query", * allowedMultiple=true *), * @SWG\Parameter (* name="pageNr", * description="pagenumber (numMessages と pageNr が両方設定されていない場合は無視されます)", * required=true, * type="string", * paramType="query", * allowedMultiple=true *), * @SWG\ResponseMessage(code=200, message="json (messages => "user_messages")"), * @SWG\ResponseMessage(code=400, message="json エラー「ログインしていません」"" ) *) *) */

    誰か私の間違いを見てますか?

    お手伝いは大歓迎です。

    心から

    アップデート。 提案どおり、両方の paramTypes を「query」に変更し、パスを変更しました。

    @SWG\Api(path="/user/messages/(sessionToken)",

    しかし彼は戦闘機としては機能しなかった。

    Eclipse PDT の xdebug は次のように表示します。

    RequestURI => /ias/public/user/messages/(sessionToken)

    QueryParams => Zend\\Stdlib\\Parameters - *ArrayObject*storage => 配列 - =>

    闊歩するJSON:

    ( "apiVersion": "1.0.0", "swaggerVersion": "1.2", "apis": [ ( "path": "\/user", "description": "ユーザーに関する操作" ) ], "info" : ( "title": "モバイル アクセス API", "description": "これは xxx モバイル アクセス API です。", "termsOfServiceUrl": null, "contact": "xxx", "license": null, "licenseUrl" : null, "_partialId": null, "_partials": , "_context": ( "comment": "\/**\ * @SWG\\Info(\ * title="モバイル アクセス API",\ * description="This is the xxx mobile access api.",\ * contact="xxx",\ *)\ *\/", "line": 3 } } } !}

    /user の出力は次のとおりです。

    ( "basePath": "http://localhost/ias/public"、"swaggerVersion": "1.2"、"apiVersion": "1.0.0"、"resourcePath": "/user"、"apis": [ ( "path": "/user/balance/(sessionToken)", "operations": [ ( "method": "GET", "summary": "userbalance を取得", "nickname": "getUserdata", "type": "string", "parameters": [ ( "paramType": "path", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "アクティブなユーザー セッションからのトークン" ) ], "responseMessages": [ ( "code": 200, "message": "json (balance => "user_balance")" ), ( "code": 400, "message ": "「ログインしていません」というエラーが発生した json" ) ]、"notes": ""、"authorizations": () ) ])、( "path": "/user/login"、"operations": [ ( "method": "POST"、"summary": "ユーザーをシステムにログイン"、"nickname": "loginUser"、"type": "string"、"parameters": [ ( "paramType": "form"、 "name": "email", "type": "string", "required": true, "allowMultiple": false, "description": "ログイン用のユーザーの電子メール" ), ( "paramType": "form", "name": "password"、"type": "string"、"required": true、"allowMultiple": false、"description": "クリア テキストでのログイン用パスワード" ) ]、"responseMessages": [ ( "code": 200, "message": "session_id、user_id、user_balance の json" ), ( "code": 400, "message": "エラーが発生した json "指定された電子メールとパスワードを持つユーザーがいません" ), ( " code": 400, "message": "エラー「無効な入力」のある json" ), ( "code": 400, "message": "エラー "投稿リクエストがありません" のある json" ) ]、"notes": "" , "authorizations": () ) ] ), ( "path": "/user/logout", "operations": [ ( "method": "POST", "summary": "ユーザーをログアウトする", "nickname" : "logoutUser", "type": "string", "parameters": [ ( "paramType": "form", "name": "sessionToken", "type": "string", "required": true, " allowMultiple": false, "description": "アクティブなユーザー セッションからのトークン" ) ]、"responseMessages": [ ( "code": 200, "message": "json (result => "deleted")" ), ( "コード": 400, "メッセージ": "エラー「指定された sid の user_session がありません」の json" ), ( "コード": 400, "メッセージ": "エラー "入力が無効です" の json" ), ( "コード": 400, "message": "エラー「投稿リクエストがありません」の json" ) ]、"notes": ""、"authorizations": () ) ])、( "path": "/user/messages/( sessionToken)", "operations": [ ( "method": "GET", "summary": "新しいメッセージを取得する", "nickname": "getUsermessages", "type": "string", "parameters": [ ( "paramType": "path"、"name": "sessionToken"、"type": "string"、"required": true、"allowMultiple": false、"description": "アクティブなユーザー セッションからのトークン" ) ], "responseMessages": [ ( "code": 200, "message": "json (messages => "user_messages")" ), ( "code": 400, "message": "json に「ログインしていません」というエラーが発生しました"" ) ]、"notes": ""、"authorizations": () )、( "method": "GET"、"summary": "ページングされたメッセージを取得"、"nickname": "getUsermessagesPages"、"type" : "string", "parameters": [ ( "paramType": "path", "name": "sessionToken", "type": "string", "required": true, "description": "アクティブなユーザーセッション" ), ( "paramType": "query", "name": "numMessages", "type": "string", "required": true, "description": "ページ上のメッセージ数 (numMessages &両方が設定されていない場合、pageNr は無視されます)" ), ( "paramType": "query"、"name": "pageNr"、"type": "string"、"required": true、"description": "pagenumber ( numMessages と pageNr は両方とも設定されていない場合は無視されます)" ) ], "responseMessages": [ ( "code": 200, "message": "json (messages => "user_messages")" ), ( "code": 400 、 "メッセージ": "「ログインしていません」というエラーが発生した json" ) ]、"メモ": ""、"承認": () ) ])、( "パス": "/user/userdata"、"operations" : [ ( "method": "POST", "summary": "Posts userdata", "nickname": "postUserdata", "type": "string", "parameters": [ ( "paramType": "form", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "アクティブなユーザー セッションからのトークン" ), ( "paramType": "form ", "name": "パスワード", "type": "string", "required": false, "allowMultiple": false, "description": "新しいパスワード" ), ( "paramType": "form", " name": "address", "type": "string", "required": false, "allowMultiple": false, "description": "新しいアドレス" ), ( "paramType": "form", "name": "housenr", "type": "string", "required": false, "allowMultiple": false, "description": "new housenr" ), ( "paramType": "form", "name": "zip" , "type": "string", "required": false, "allowMultiple": false, "description": "new zip" ), ( "paramType": "form", "name": "city", "type ": "string", "required": false, "allowMultiple": false, "description": "新しい都市" ), ( "paramType": "フォーム", "name": "email", "type": " string", "required": false, "allowMultiple": false, "description": "新しいメール" ) ], "responseMessages": [ ( "code": 200, "message": "json (user => "userdata ")" ), ( "コード": 400, "メッセージ": "エラーのある json

    私のswagger-uiがリクエストパラメータを送信していないというエラーのようですか? 以下は、1 つのクエリパラメータ sessionToken を使用した例です: (FireBug 2.0.6 によって制御されます)

    GET /ias/public/user/balance HTTP/1.1 ホスト: localhost ユーザーエージェント: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0 Accept: application/json Accept-Language: de, en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip、deflate Content-Type: application/json Referer: http://localhost/ias/swagger/ Cookie: __utma=111872281.581414660.1366700677.1394721873.1394723866.255; uvts=sB5Dda3cZBNdaTk; searchpanel-close=set 接続: キープアライブ

    答えは次のとおりです。

    HTTP/1.1 400 Bad Request Date: 火曜日、25 Nov 2014 14:58:20 GMT サーバー: Apache/2.4.9 (Win32) PHP/5.5.12 X-Powered-By: PHP/5.5.12 Content-Length: 25接続: 閉じるコンテンツタイプ: application/json; 文字セット=utf-8

    sessionToken が渡されなかったため、答えは正解でした。

    これには作業が必要ですが、swagger-ui からのものではありません。

    GET /ias/public/user/balance?sessionToken=HTTP/1.1 ホスト: localhost ユーザーエージェント: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0 受け入れる: text/html,application/ xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: de,en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate Cookie: __utma=111872281.581414660 .1366700677.1394721873.1394723866.255; uvts=sB5Dda3cZBNdaTk; searchpanel-close=set 接続: キープアライブ