Ẩn lỗi từ người dùng nhưng hiển thị cho quản trị viên?


18

Trong phần 'Thông báo lỗi hiển thị' Tôi có thể ẩn lỗi (như được khuyến nghị cho các trang web sản xuất). Tuy nhiên, có thể ẩn lỗi cho tất cả mọi người ngoại trừ một vai trò nhất định?


đúng vậy, có một số mô-đun xung quanh cho điều đó. Nhưng những gì bạn đang đề xuất cũng che giấu lỗi hình thức, như tôi đã nêu dưới đây.
reptilex

Yêu cầu tính năng ở đây drupal.org/node/2743119
giorgio79

Câu trả lời:


18

Lời nói đầu: Câu trả lời này lần đầu tiên được đăng dưới dạng câu trả lời cho " Làm cách nào để chặn thông báo lỗi hoặc thông báo lỗi cho người dùng trang web? ".

Vô hiệu hóa mô-đun Tin nhắn

Bạn có thể sử dụng mô-đun Vô hiệu hóa Tin nhắn cho việc này. Đây là một trích dẫn từ trang dự án của nó:

Cung cấp tùy chọn chủ sở hữu trang web để vô hiệu hóa các thông báo cụ thể được hiển thị cho người dùng cuối. Hệ thống tin nhắn drupal cốt lõi được cung cấp bởi drupal_set_message là một cách tuyệt vời để các mô-đun gửi tin nhắn đến người dùng cuối. Tuy nhiên, không phải tất cả chủ sở hữu trang web drupal đều muốn hiển thị tất cả các tin nhắn được gửi bởi lõi drupal và tất cả các mô-đun cho người dùng của họ. Mô-đun này cung cấp cho quản trị viên trang web một cách hợp lý mạnh mẽ để lọc các tin nhắn được hiển thị cho người dùng cuối.

Một số tính năng của nó là:

  • Lọc các tin nhắn khớp chính xác với một chuỗi văn bản đầy đủ.
  • Lọc các tin nhắn phù hợp với một biểu thức thông thường.
  • Quyền đặc biệt ẩn tất cả các tin nhắn thuộc một loại nhất định khỏi bất kỳ vai trò nào.
  • Vô hiệu hóa tất cả các bộ lọc cho người dùng cụ thể.
  • Vô hiệu hóa tất cả các bộ lọc cho các đường dẫn cụ thể.
  • Chỉ áp dụng lọc cho các đường dẫn cụ thể.
  • Hệ thống gỡ lỗi để nhận thông báo trong HTML mà không hiển thị cho người dùng cuối.

Có sẵn cho cả Drupal 6, Drupal 7 hoặc Drupal 8.

Về việc sử dụng biểu thức chính quy

Nếu bạn đang sử dụng tính năng ' biểu thức chính quy ' của nó, bạn phải đảm bảo rằng bạn sử dụng biểu thức chính quy "bắt" thông báo lỗi bạn muốn chặn, như được giải thích trong tài liệu Cộng đồng .

Bên dưới " Mẹo: Giữ cho nó đơn giản. " Trên trang đó, có một mẫu tuyệt vời, trông giống như vậy:

Xin lưu ý rằng một cái gì đó xuất hiện rất đơn giản như:

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

Có rất nhiều nhân vật vô hình trong đó hơn người ta có thể mong đợi:

<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>).

Vì vậy, chỉ cần bọc thịt của grep bằng một biểu thức "bất kỳ nhân vật" đơn giản nào: ". +" Như trong:

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

Vì vậy, "manh mối" để đưa ra một thông báo chính xác, là thu nhỏ thông báo lỗi bạn muốn bắt và đặt các ký tự " . + " Nếu thích hợp.

Nói về thu hẹp, lưu ý rằng field_txt_student_idcũng đã bị bỏ qua trong biểu thức chính quy (để làm cho nó KHÔNG phụ thuộc vào tên trường).

Thí dụ

Một ví dụ khác, giả sử bạn muốn bắt thông báo lỗi này:

PDOException: trong dblog_watchdog () (dòng 160 của /home/dbuser/public_html/yoursitesname.com/modules/dblog/dblog.module).

Trong trường hợp này, một biểu thức chính quy có thể sẽ trông giống như vậy:

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

Lưu ý cách tôi cố tình không bao gồm một phần của đường dẫn trước đó /modules/dblog/dblog.module(để nó có thể được sử dụng lại trong một trang web khác có lỗi tương tự xảy ra ...).

Cũng lưu ý rằng bạn phải suy nghĩ có hoặc không bao gồm 160phần của nó: nếu mô-đun thay đổi một chút để trong thông báo lỗi, nó sẽ trở thành dòng 161, lỗi của bạn sẽ không bị chặn nữa. Để tránh điều đó, hãy bỏ qua phần 160 của nó, nếu đó là điều bạn thích (cá nhân tôi trước tiên muốn thấy lỗi quay lại sau đó, sau đó điều chỉnh lại biểu thức thông thường của tôi).

Nếu biểu thức chính quy của bạn không hoạt động lúc đầu (= thông báo vẫn xuất hiện), thì đó có thể là do có một số lỗi chính tả trong biểu thức thông thường. Để xác định lỗi chính tả như vậy, trước tiên hãy thử với một biểu thức chính quy ít hạn chế hơn, ngay cả khi chỉ thử với một cái gì đó tương tự (để bắt TẤT CẢ các tin nhắn có chứa PDOExceptiondblog_watchdog):

.+PDOException.+dblog_watchdog.+

Hoặc thậm chí như vậy (để bắt TẤT CẢ các tin nhắn có chứa PDOException):

.+PDOException.+

Hai biểu thức cuối cùng này có thể sẽ chặn quá nhiều tin nhắn, vì vậy bạn muốn thu hẹp nó thành một biểu thức duy nhất mà bạn đang theo dõi.

Thay thế không ổn định

Ngoài ra còn có mô-đun Better Messages thay thế. Tuy nhiên, đối với D7 (đó là những gì câu hỏi này), nó chỉ có phiên bản Alfa.


6

Bạn có thể kiểm tra vai trò người dùng bằng cách sử dụng hàm in_array (). Trong mẫu của bạn:


<?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; ?>

Hoặc bạn có thể thực hiện nó trong chức năng tiền xử lý của mình (không chắc là biến thông báo được gọi chính xác nhưng nó có thể cho bạn ý tưởng)


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']);
  }
}


Hiểu biết của tôi là tôi không thể ẩn <? Php in $ tin nhắn; ?> từ người dùng vì nó hiển thị các lỗi mà người dùng cần phải xem cũng như các lỗi loại cơ sở dữ liệu, ví dụ: nếu bạn cố gắng tạo một nút và bỏ qua một trường bắt buộc. Cảm ơn
Evans

1
Bạn nói đúng, bạn có thể thử tìm hiểu xem các thông báo lỗi khác với các thông báo mặc định như thế nào và tạo một hook_ allow cho nó. Chúc may mắn!
JurgenR

4

Trên thực tế điều này là không thực sự có thể làm được.

Bạn có thể ẩn tất cả các tin nhắn cho người dùng hoặc vai trò nhưng vấn đề chính nằm ở cách drupal phân loại lỗi.

Lỗi biểu mẫu giống như ngoại lệ cơ sở dữ liệu cho chức năng thông báo, vì vậy nếu bạn ẩn lỗi, bạn cũng sẽ ẩn các thông báo lỗi của biểu mẫu nhận xét.

Tôi rất thích một người nào đó chứng minh tôi sai vì tôi đã không quản lý được việc ẩn các thông báo php nhưng đồng thời hiển thị các thông báo biểu mẫu.


4

Để xóa thông báo khỏi trang web Drupal, vui lòng làm theo các bước dưới đây:

  • Đi đến quản trị / cấu hình / phát triển / đăng nhập.
  • Bạn có ba lựa chọn:
    1. None sẽ vô hiệu hóa tất cả các báo cáo lỗi.
    2. Errors and warnings sẽ hiển thị trên các vấn đề nghiêm trọng nhất.
    3. All messages sẽ hiển thị tất cả các vấn đề và có lẽ chỉ hữu ích cho các nhà phát triển.

Một cách khác để vô hiệu hóa thông báo và thông báo lỗi thông qua mã. Thêm mã sau vào settings.phptệp:

$conf['error_level']=0;

Bạn cũng có thể định cấu hình Drupal để chỉ ghi lại các lỗi theo các hướng dẫn sau: đi đến Administration > Configuration > Development > Logging and errorshoặc đi trực tiếp vào đường dẫn /admin/config/development/loggingvà đặt "Thông báo lỗi hiển thị" thành không . Drupal sau đó vẫn ghi lỗi nhưng không hiển thị chúng cho người dùng.

Nếu bạn cần kiểm soát nhiều hơn, hãy sử dụng Disable Messagesmô-đun.


Đây là về drupal_set_message, không phải thông báo lỗi.
njp

@njp - tất cả đều đi lang thang vào tin nhắn $. Kiểm tra mẫu của bạn.
leymannx

3

Bạn có thể sử dụng mô-đun tin nhắn tốt hơn . Nó cung cấp cấu hình dựa trên vai trò và / hoặc kết hợp biểu thức chính quy để lọc ra một số thông báo.


Tin nhắn tốt hơn không có cấu hình dựa trên vai trò để hiển thị tin nhắn, chỉ để hiển thị loại mô-đun của tin nhắn
reptilex

2

Bạn có thể bình luận mã này trong chủ đề của bạn

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

hoặc phần tử chủ đề status_messages phục vụ điều này, bạn có thể viết chức năng chủ đề riêng trong template.php

MYTHEME_status_messages(&$variables){}

Điều này chỉ có thể ảnh hưởng đến thông báo và cảnh báo lỗi


1
Nhưng nếu $messagesphần được nhận xét, nó cũng sẽ không hiển thị cho quản trị viên.
GoodSp33d

Hiểu biết của tôi là tôi không thể ẩn <? Php in $ tin nhắn; ?> từ người dùng vì nó hiển thị các lỗi mà người dùng cần phải xem cũng như các lỗi loại cơ sở dữ liệu, ví dụ: nếu bạn cố gắng tạo một nút và bỏ qua một trường bắt buộc. Cảm ơn
Evans

api.drupal.org/api/drupal/includes!theme.inc/function/... đây là cách cốt lõi chuẩn bị một thông điệp cảnh báo cho rendering bạn có thể sao chép logic này và thêm logic của riêng bạn trong mythemename_status_messages () trong file template.php chủ đề của bạn
werqious
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.