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?
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?
Câu trả lời:
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? ".
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.
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_id
cũ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).
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 160
phầ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 PDOException
và dblog_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.
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.
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']);
}
}
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.
Để xóa thông báo khỏi trang web Drupal, vui lòng làm theo các bước dưới đây:
None
sẽ vô hiệu hóa tất cả các báo cáo lỗi.Errors and warnings
sẽ hiển thị trên các vấn đề nghiêm trọng nhất.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.php
tệ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 errors
hoặc đi trực tiếp vào đường dẫn /admin/config/development/logging
và đặ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 Messages
mô-đun.
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.
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
$messages
phần được nhận xét, nó cũng sẽ không hiển thị cho quản trị viên.