사용자의 오류를 숨기고 관리자에게 표시 하시겠습니까?


18

'오류 메시지를 표시합니다'에서 오류를 숨길 수 있습니다 (생산 사이트에 권장되는대로). 그러나 특정 역할을 제외한 모든 사람에게 오류를 숨길 수 있습니까?


예, 그 주위에 몇 가지 모듈이 있습니다. 그러나 당신이 제안하는 것은 아래에 언급 한 것처럼 양식 오류도 숨 깁니다.
파충류

기능 요청은 여기 drupal.org/node/2743119
giorgio79 7

답변:


18

서문 :이 답변은 처음에 " 사이트 사용자에게 경고 또는 오류 메시지를 표시하지 않으려면 어떻게합니까? "에 대한 답변으로 게시되었습니다 .

메시지 비활성화 모듈

이를 위해 메시지 비활성화 모듈을 사용할 수 있습니다 . 프로젝트 페이지의 인용문은 다음과 같습니다.

최종 사용자에게 표시되는 특정 메시지를 비활성화하는 사이트 소유자 옵션을 제공합니다. drupal_set_message가 제공하는 핵심 drupal 메시지 시스템은 모듈이 최종 사용자에게 메시지를 보내는 훌륭한 방법입니다. 그러나 모든 drupal 사이트 소유자가 drupal core 및 모든 모듈에서 보낸 모든 메시지를 사용자에게 보여주고 자하는 것은 아닙니다. 이 모듈은 사이트 관리자에게 최종 사용자에게 표시되는 메시지를 걸러내는 강력한 방법을 제공합니다.

그 기능 중 일부는 다음과 같습니다.

  • 전체 텍스트 문자열과 정확히 일치하는 메시지를 필터링하십시오.
  • 정규식과 일치하는 메시지를 필터링하십시오.
  • 특정 유형의 모든 메시지를 역할에서 구체적으로 숨길 수있는 권한
  • 특정 사용자에 대한 모든 필터링을 비활성화합니다.
  • 특정 경로에 대한 모든 필터링을 비활성화합니다.
  • 특정 경로에 대해서만 필터링을 적용하십시오.
  • 최종 사용자에게 메시지를 표시하지 않고 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하십시오. 모듈에 오류 메시지에서 예를 들어 라인이되도록 약간 변경하면 161더 이상 오류를 가로 채지 않습니다. 그것을 피하기 위해 160 부분을 생략하십시오. 원하는 경우 (개인적으로 오류가 다시 오는 것을 본 다음 정규 표현식을 다시 적용하십시오).

정규식이 처음에 작동하지 않으면 (= 메시지가 여전히 표시됨) 정규식에 오타가 있기 때문일 수 있습니다. 이 (잡으려고과 같이 뭔가를 시도하는 경우에만 경우에도, 같은 오타, 덜 제한적인 정규 표현식으로 첫 번째 시도를 파악하려면 모든 메시지를 포함 PDOException하고 dblog_watchdog) :

.+PDOException.+dblog_watchdog.+

또는 (을 포함하는 모든 메시지 를 잡기 위해 PDOException) :

.+PDOException.+

이 마지막 2 개의 표현은 아마도 너무 많은 메시지를 억제 할 것이므로 나중에 그 단일 표현으로 좁히기를 원할 것입니다.

불안정한 대안

도 있습니다 더 나은 메시지 의 대안으로 모듈. 그러나 D7 (이 질문에 관한 것)의 경우 알파 버전 만 있습니다.


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; ?> 사용자가 데이터베이스 유형 오류뿐만 아니라 노드를 작성하고 필수 필드를 생략하려는 경우 사용자가 볼 필요가있는 오류를 표시합니다. 감사합니다
Evanss

1
맞습니다. 오류 메시지가 기본 메시지와 어떻게 다른지 알아 내고 hook_permission을 만들 수 있습니다. 행운을 빕니다!
JurgenR

4

실제로 이것은 실제로 할 수 없습니다.

사용자 또는 역할에 대한 모든 메시지를 숨길 수 있지만 주요 문제는 drupal이 오류를 분류하는 방식에 있습니다.

양식 오류는 메시지 기능에 대한 데이터베이스 예외와 동일하므로 오류를 숨기면 주석 양식의 오류 메시지도 숨 깁니다.

나는 PHP 통지를 숨기지 않고 동시에 양식 통지를 표시하기 때문에 누군가 나를 잘못 증명하고 싶습니다.


4

Drupal 웹 사이트에서 통지를 제거하려면 다음 단계를 따르십시오.

  • admin / config / development / logging으로 이동하십시오.
  • 세 가지 선택이 있습니다.
    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"Error messages to display"를 none으로 설정하십시오 . Drupal은 여전히 ​​오류를 기록하지만 사용자에게 표시하지는 않습니다.

더 많은 제어가 필요한 경우 Disable Messages모듈을 사용하십시오 .


이것은 오류 메시지가 아니라 drupal_set_message에 관한 것입니다.
njp

@njp-모두 $ messages로 방황합니다. 템플릿을 확인하십시오.
leymannx

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; ?> 사용자가 데이터베이스 유형 오류뿐만 아니라 노드를 작성하고 필수 필드를 생략하려는 경우 사용자가 볼 필요가있는 오류를 표시합니다. 감사합니다
Evanss

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.