ユーザーからエラーを非表示にしますが、管理者には表示しますか?


18

[表示するエラーメッセージ]の下で、エラーを非表示にできます(本番サイトで推奨)。しかし、特定の役割以外の全員にエラーを隠すことは可能ですか?


はい、そうです、そのためのモジュールがいくつかあります。しかし、あなたが提案していることは、以下で述べたように、フォームエラーも隠します。
爬虫類

機能のリクエストはこちらdrupal.org/node/2743119
giorgio79

回答:


18

序文:この回答は、最初に「サイトユーザーに対する警告またはエラーメッセージを抑制するにはどうすればよいですか?」に対する回答として投稿されました。

メッセージモジュールを無効にする

これには、メッセージ無効化モジュールを使用できます。プロジェクトページからの引用です:

エンドユーザーに表示される特定のメッセージを無効にするオプションをサイト所有者に提供します。drupal_set_messageが提供するコアdrupalメッセージシステムは、モジュールがエンドユーザーにメッセージを送信するための優れた方法です。ただし、すべてのdrupalサイトの所有者が、drupalコアから送信されるすべてのメッセージとすべてのモジュールをユーザーに表示したいわけではありません。このモジュールは、サイト管理者に、エンドユーザーに表示されるメッセージを除外する合理的に強力な方法を提供します。

その機能のいくつかは次のとおりです。

  • 全文文字列に正確に一致するメッセージを除外します。
  • 正規表現に一致するメッセージを除外します。
  • 特定のタイプのすべてのメッセージを任意のロールから明確に隠す許可。
  • 特定のユーザーのすべてのフィルタリングを無効にします。
  • 特定のパスのすべてのフィルタリングを無効にします。
  • 特定のパスにのみフィルタリングを適用します。
  • エンドユーザーに表示せずにHTMLでメッセージを取得するシステムをデバッグします。

Drupal 6、Drupal 7またはDrupal 8のいずれかで利用可能。

正規表現の使用について

正規表現」機能を使用している場合は、コミュニティのドキュメントでも説明されているように、インターセプトするエラーメッセージを「キャッチ」する正規表現を使用する必要があります。

そのページの「ヒント:シンプルに保つ」の下に、次のようなすばらしいサンプルがあります。

次のような非常に簡単に見えるものに注意してください。

Notice: Undefined index: field_txt_student_id in ctools_entity_form_field_content_type_render() (line 96 of [...]entity_form_field.inc).

予想以上に多くの目に見えない文字が含まれています:

<em class="placeholder">Notice</em>: Undefined index: field_txt_student_id in <em class="placeholder">ctools_entity_form_field_content_type_render()</em> (line <em class="placeholder">96</em> of <em class="placeholder">[...]entity_form_field.inc</em>).

そのため、次のように単純な「任意の文字」正規表現で「。+」でgrepの肉をラップします。

.+Notice.+Undefined index:.+ctools_entity_form_field_content_type_render.+entity_form_field.inc.+

したがって、正しいメッセージを作成するための「手がかり」は、キャッチするエラーメッセージを縮小し、適切な場所に「。+」文字を配置することです。

縮小についてfield_txt_student_id言えば、正規表現でもが省略されていることに注意してください(フィールド名に依存しないようにするため)。

別の例として、次のエラーメッセージをキャッチするとします。

PDOException:dblog_watchdog()で(/home/dbuser/public_html/yoursitesname.com/modules/dblog/dblog.moduleの160行目)。

この場合、可能な正規表現は次のようになります。

.+PDOException.+in dblog_watchdog().+(line 160 of.+/modules/dblog/dblog.module).+

以前に意図的にパスの一部を含めなかったことに注意してください/modules/dblog/dblog.module(同じエラーが発生する別のサイトで再利用できるように...)。

また160、モジュールの一部をyesまたはnoに含める必要があることにも注意してください。エラーメッセージでモジュールが少し変更されて(たとえば)lineになった161場合、エラーはもう傍受されません。それを避けるために、もしそれがあなたが好むなら、160の部分を省略します(個人的には、最初に戻ってくるエラーを見て、それから私の正規表現を再適応します)。

正規表現が最初に機能しない場合(=メッセージがまだ表示される場合)、正規表現に誤字がある可能性があります。そのようなタイプミスを特定するには、(and を含むすべてのメッセージをキャッチするために)そのような何かを試すだけであったとしても、最初に制限の少ない正規表現を試します。PDOExceptiondblog_watchdog

.+PDOException.+dblog_watchdog.+

または、そのようにすることもできます(を含むすべてのメッセージをキャッチするにはPDOException):

.+PDOException.+

これらの最後の2つの式は、おそらくあまりにも多くのメッセージを抑制します。そのため、目的の1つの式に絞り込んでください。

不安定な代替

代替として、Better Messagesモジュールもあります。ただし、D7(この質問の目的)については、Alfaバージョンのみがあります。


6

in_array()関数を使用して、ユーザーロールを確認できます。テンプレートで:


<?php global $user; ?>
<?php if (!in_array('YOUR_ROLE', $user->roles)): ?>
  <?php if ($messages): ?>
    <div id="messages">
      <?php print $messages; ?>
    </div> </div> 
  <?php endif; ?>
<?php endif; ?>

または、前処理関数でそれを行うことができます(メッセージ変数が正しく呼び出されるかどうかはわかりませんが、アイデアを与えることができます)


function MYTHEME_preprocess_page(&$variables, $hook) {
  global $user;
  if (!in_array('YOUR_ROLE', $user->roles)){
    // This has to be checked, could be something similar.
    unset($variables['page']['content']['messages']);
  }
}


私の理解では、<?php print $ messagesを隠すことはできません。ノードを作成して必須フィールドを省略しようとした場合など、ユーザーが表示する必要があるエラーとデータベースタイプのエラーが表示されるため、ユーザーから。ありがとう
エヴァンス

1
あなたは正しい、あなたはエラーメッセージがデフォルトメッセージとどのように異なるかを見つけて、それのためにhook_permissionを作成しようとすることができます。幸運を!
-JurgenR

4

実際、これは実際には実行できません。

ユーザーまたはロールのすべてのメッセージを非表示にすることができますが、主な問題はdrupalがエラーを分類する方法にあります。

フォームエラーは、メッセージ機能のデータベース例外と同じであるため、エラーを非表示にすると、コメントフォームのエラーメッセージも非表示になります。

PHP通知を非表示にすることはできませんが、フォーム通知を同時に表示することができたため、誰かが間違っていることを証明したいと思います。


4

Drupal Webサイトから通知を削除するには、以下の手順に従ってください。

  • admin / config / development / loggingに移動します。
  • 次の3つの選択肢があります。
    1. None すべてのエラー報告を無効にします。
    2. Errors and warnings 最も深刻な問題を表示します。
    3. All messages すべての問題を表示し、おそらく開発者のみに役立ちます。

コードを介して通知とエラーメッセージを無効にする別の方法。settings.phpファイルに次のコードを追加します。

$conf['error_level']=0;

あなたもDrupalの設定するだけで、これらの命令は次のエラーをログに記録することができますに行くAdministration > Configuration > Development > Logging and errorsか、パスに直接移動/admin/config/development/loggingする「ディスプレイにエラーメッセージ」とセットなし。Drupalは引き続きエラーをログに記録しますが、ユーザーには表示しません。

さらに制御が必要な場合は、Disable Messagesモジュールを使用してください。


これはdrupal_set_messageに関するものであり、エラーメッセージではありません。
-njp

@njp-それらはすべて$ messagesにさまよいます。テンプレートを確認してください。
レイマンクス

3

より良いメッセージモジュールを使用できます。役割ベースの構成および/または正規表現マッチングを提供して、一部の通知を除外します。


より良いメッセージには、メッセージを示すために、メッセージのみのモジュールタイプを示すための役割ベースの設定はありません
reptilex

2

テーマでこのコードをコメントすることができます

<?php if ($messages): ?>
    <div id="messages"><div class="section clearfix">
      <?php print $messages; ?>
    </div></div> <!-- /.section, /#messages -->
  <?php endif; ?>

または、status_messagesテーマ要素がこれを提供し、template.phpに独自のテーマ関数を記述できます

MYTHEME_status_messages(&$variables){}

これは、通知および警告エラーにのみ影響する可能性があります


1
ただし、$messagesセクションがコメント化されている場合、管理者にも表示されません。
GoodSp33d

私の理解では、<?php print $ messagesを隠すことはできません。ノードを作成して必須フィールドを省略しようとした場合など、ユーザーが表示する必要があるエラーとデータベースタイプのエラーが表示されるため、ユーザーから。ありがとう
エヴァンス

api.drupal.org/api/drupal/includes!theme.inc/function/…ここで、コアがレンダリング用の警告メッセージを準備する方法を説明します。このロジックをコピーして、テーマのtemplate.phpファイルのmythemename_status_messages()に独自のロジックを追加できます。
-werqious
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.