0

AJAX を Joomla モジュールに正常に追加することができました (Joomla モジュールに AJAX を配置する方法の非常に不完全な実装については、こちらを参照してください)

私が抱えている問題は、これまでにエラーをスローしたときにエラーを返すことです。たとえば、JApplication メッセージをスローしているだけです。

JFactory::getApplication()->enqueueMessage('Some error message', 'error');

ただし、明らかにこれはAJAXにエラーの匂いを与えないため、送信するたびに「成功」​​と呼ばれます。したがって、私の問題です。

私の好みではあまりにも多くのユーザーがまだ Javascript を有効にしておらず、単純に 400 ヘッダー リダイレクトを追加するだけで満足しています (いずれにせよ、ユーザーにエラー メッセージを表示したいと思います)。javascriptが無効になっているときのフォールバックとして、JApplicationがPHPを介してエラーメッセージをキューに入れるだけにしたいと思います。

エラーメッセージをページにエコーアウトする方法も見ました。しかし、Joomla モジュールが AJAX を処理する方法が特に有用ではないため、コールバック データの結果は、実際にはページの完全な html コードになります。そのため、そのようにする場合は、ページ上の要素を具体的に選択する必要があると思います-そして、それを行う方法がわかりません/それが可能な場合でも!

では、AJAX のエラー メッセージをスローし、それを取得してユーザーに表示できるようにする最善の方法は何でしょうか (それでも、JavaScript 以外の優れたフォールバックを保持していますか?) ありがとう!

4

5 に答える 5

1

Joomla JavaScript オブジェクトには、この目的に適した関数 renderMessages があります。

// available msg types: success, error, notice
var msg = {
    error: ['it is an error!<br />', 'it is enother error!'],
    success: ['It works!!']
};
Joomla.renderMessages( msg );

結果

于 2014-07-12T09:36:05.683 に答える
1
<script>
  jQuery(window).load(function(){
   var data = {};
   display_result_data();
  });
function display_map_result_data() {
var ajaxUrl = "modules/mod_mapcontent/submit_form.php";
 jQuery.ajax({
              type: "POST",
              url: ajaxUrl,
              data: {category: 'simple'},
              dataType    : "json",
              async       : false,
              success : function(result){
                data = result;
               }
          });
}
 </script>
<?php
/**
 * @package     Joomla.Site
 * @subpackage  mod_banners
 *
 * @copyright   Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
*/
  defined('_JEXEC') or die;
  $baseurl = JURI::base();
?>
 <div id="mapcontent" class="mapcontent">
   <div id="map-canvas"></div>
 </div>
于 2013-12-20T06:40:04.563 に答える
0

あなたの機能では:

    $app = JFactory::getApplication();
    echo new JResponseJson(null, $app->enqueueMessage('Some errormessage','error'));

    //close the $app
    $app->close();

あなたのJavaScriptで:

    success: function(response) {
            var jMsgs = response.messages;  // You can stack multiple messages of the same type
            Joomla.renderMessages(jMsgs);
    }
于 2015-10-05T07:33:16.093 に答える
0

Joomla の開発者は、以前は信じられないほど便利だったものを変更し、使いにくくしています。その 1 つがメッセージ キューです。現在、閲覧のみ可能です。

したがって、メッセージ キューにメッセージを設定できれば、AJAX 応答を使用して、より AJAX に適した場所に移動して表示することができます。右?このようにして、次のページの読み込み時に表示するためにキューに入れられ、ユーザーが AJAX 要求を正常に行う (JS が有効になっていることを示す) と、メッセージは AJAX 応答と共にクライアントに移動されます。

まず、Reflection がインストール/有効化されたサーバーが必要です。私の知る限り、PHP 5.3 以降に組み込まれています。PHP 5.2 およびそれ以前のいくつかのリビジョンで入手できます。私のソリューションではそれが必要なので、あなたがそれを持っていると仮定します。

この関数は、検索するエラー メッセージの一部を受け取ります。そのため、エラー出力をメッセージ キューで見つけられるように計画する必要があります。あなたのメッセージがキュー内の唯一のメッセージであると想定することもできますが、私はそうは思いません。関数がメッセージを見つけると、それを取得し、メッセージ キューからクリアして、完全なメッセージを返します。

function getMessage($error) {
  $app=JFactory::getApplication();
  $appReflection = new ReflectionClass(get_class($app));
  $_messageQueue = $appReflection->getProperty('_messageQueue');
  $_messageQueue->setAccessible(true);
  $messages = $_messageQueue->getValue($app);
  foreach($messages as $key=>$message) {
      if(preg_match('/'.preg_quote($error,'/').'/',$message['message'])) {
          $return = $message;
          unset($messages[$key]);
      }
  }
  $_messageQueue->setValue($app,$messages);
  return $return;
}

このメソッドを使用すると、クライアント側の ajax ハンドラーが使用する別のデータ値としてメッセージを含めるように ajax 応答を設定できます。ユーザーが JS をオフにしている場合、サーバー上の ajax ハンドラーはこのコードを実行しないため、メッセージは通常のシステム メッセージとして表示されます。

于 2013-04-26T06:49:40.493 に答える
0

モジュールはアプリケーションの出力を完全に制御することはできません。コンポーネントとプラグインも関係しています。

メッセージキューを出力してアプリケーションを終了するものが必要です。

于 2013-04-23T10:14:46.180 に答える