Sembunyikan kesalahan dari pengguna tetapi tunjukkan ke admin?

18

Di bawah 'Pesan kesalahan untuk ditampilkan' Saya dapat menyembunyikan kesalahan (seperti yang disarankan untuk situs produksi). Namun apakah mungkin untuk menyembunyikan kesalahan bagi semua orang kecuali peran tertentu?

Evans
sumber
ya itu, ada beberapa modul untuk itu. Tetapi apa yang Anda sarankan juga menyembunyikan kesalahan bentuk, seperti yang saya nyatakan di bawah ini.
reptil
Permintaan fitur di sini drupal.org/node/2743119
giorgio79

Jawaban:

18

Kata Pengantar: Jawaban ini pertama kali diposting sebagai jawaban untuk " Bagaimana cara saya menekan pesan peringatan atau kesalahan untuk pengguna situs? ".

Nonaktifkan modul Pesan

Anda dapat menggunakan modul Nonaktifkan Pesan untuk ini. Berikut ini kutipan dari halaman proyeknya:

Memberikan opsi kepada pemilik situs untuk menonaktifkan pesan tertentu yang ditampilkan kepada pengguna akhir. Sistem pesan inti drupal seperti yang ditawarkan oleh drupal_set_message adalah cara terbaik untuk modul untuk mengirim pesan kepada pengguna akhir. Namun tidak semua pemilik situs drupal ingin menunjukkan semua pesan yang dikirim oleh drupal core dan semua modul kepada pengguna mereka. Modul ini memberikan administrator situs cara yang cukup kuat untuk menyaring pesan yang ditampilkan kepada pengguna akhir.

Beberapa fitur-fiturnya adalah:

  • Saring pesan yang cocok dengan string teks lengkap dengan tepat.
  • Saring pesan yang cocok dengan ekspresi reguler.
  • Izin untuk secara khusus menyembunyikan semua pesan dari jenis tertentu dari peran apa pun.
  • Nonaktifkan semua pemfilteran untuk pengguna tertentu.
  • Nonaktifkan semua pemfilteran untuk jalur tertentu.
  • Terapkan penyaringan hanya untuk jalur tertentu.
  • Sistem debug untuk mendapatkan pesan dalam HTML tanpa menunjukkannya kepada pengguna akhir.

Tersedia untuk Drupal 6, Drupal 7 atau Drupal 8.

Tentang menggunakan ekspresi reguler

Jika Anda menggunakan fitur ' ekspresi reguler ', Anda harus memastikan bahwa Anda menggunakan ekspresi reguler yang "menangkap" pesan kesalahan yang ingin Anda sadap, seperti dijelaskan juga dalam dokumentasi Komunitas .

Di bawah " Tip: Tetap sederhana. " Pada halaman itu, ada contoh yang bagus, yang terlihat seperti ini:

Sadarilah bahwa sesuatu yang tampak sangat mudah seperti:

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

Memiliki lebih banyak karakter yang tak terlihat di dalamnya daripada yang diperkirakan:

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

Jadi bungkus saja daging grep dengan regex sederhana "sembarang karakter": ". +" Seperti pada:

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

Jadi "petunjuk" untuk menghasilkan pesan yang benar, adalah mengecilkan pesan kesalahan yang ingin Anda tangkap, dan menempatkan " . + " Karakter yang sesuai.

Berbicara tentang menyusut, perhatikan bahwa field_txt_student_idtelah dihilangkan dalam ekspresi reguler juga (untuk membuatnya TIDAK bergantung pada nama bidang).

Contoh

Sebagai contoh lain, anggap Anda ingin menangkap pesan kesalahan ini:

PDOException: di dblog_watchdog () (baris 160 dari /home/dbuser/public_html/yoursitesname.com/modules/dblog/dblog.module).

Dalam hal ini, kemungkinan ekspresi reguler akan terlihat seperti:

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

Perhatikan bagaimana saya sengaja tidak memasukkan bagian dari jalur sebelumnya /modules/dblog/dblog.module(sehingga dapat digunakan kembali di situs lain di mana kesalahan yang sama terjadi ...).

Perhatikan juga bahwa Anda harus memikirkan ya atau tidak termasuk 160bagian dari itu: jika modul sedikit berubah sehingga dalam pesan kesalahan itu (misalnya) menjadi garis 161, kesalahan Anda tidak akan dicegat lagi. Untuk menghindarinya, abaikan bagian 160 dari itu, jika itu yang Anda inginkan (secara pribadi saya lebih suka melihat kesalahan yang muncul kemudian, dan kemudian menyesuaikan kembali ekspresi reguler saya).

Jika ekspresi reguler Anda tidak bekerja pada awalnya (= pesan masih muncul), maka itu mungkin karena ada beberapa kesalahan ketik pada ekspresi reguler. Untuk menentukan kesalahan ketik seperti itu, pertama coba dengan ekspresi reguler yang tidak terlalu ketat, meskipun itu hanya untuk mencoba sesuatu seperti itu (untuk menangkap SEMUA pesan yang berisi PDOExceptiondan dblog_watchdog):

.+PDOException.+dblog_watchdog.+

Atau bahkan seperti itu (untuk menangkap SEMUA pesan yang berisi PDOException):

.+PDOException.+

2 ungkapan terakhir ini mungkin akan menekan terlalu banyak pesan, jadi Anda ingin mempersempitnya menjadi satu yang Anda cari.

Alternatif tidak stabil

Ada juga modul Pesan Lebih Baik sebagai alternatif. Namun, untuk D7 (yang merupakan pertanyaan ini), ia hanya memiliki versi Alfa.

Pierre
sumber
6

Anda dapat memeriksa peran pengguna dengan menggunakan fungsi in_array (). Dalam templat Anda:


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

Atau Anda dapat melakukannya di fungsi preprocess Anda (tidak yakin apakah variabel pesan dipanggil dengan benar tetapi dapat memberi Anda ide)


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

JurgenR
sumber
Pemahaman saya adalah bahwa saya tidak bisa menyembunyikan <? Php print $ messages; ?> dari pengguna karena menunjukkan erros bahwa pengguna perlu melihat serta kesalahan tipe database, misalnya jika Anda mencoba membuat simpul dan meninggalkan bidang wajib. Terima kasih
Evanss
1
Anda benar, Anda bisa mencoba mencari tahu bagaimana perbedaan pesan kesalahan dari pesan default dan membuat hook_permission untuk itu. Semoga berhasil!
JurgenR
4

Sebenarnya ini tidak bisa dilakukan.

Anda dapat menyembunyikan semua pesan untuk pengguna atau peran tetapi masalah utama terletak pada cara drupal mengkategorikan kesalahan.

Kesalahan formulir sama dengan pengecualian database untuk fungsi pesan, jadi jika Anda menyembunyikan kesalahan, Anda juga menyembunyikan pesan kesalahan dari formulir komentar.

Saya ingin seseorang membuktikan kesalahan saya karena saya belum berhasil mencapai pemberitahuan php yang disembunyikan tetapi menunjukkan pemberitahuan formulir pada saat yang sama.

reptil
sumber
4

Untuk menghapus pemberitahuan dari situs web Drupal, ikuti langkah-langkah di bawah ini:

  • Buka admin / config / development / logging.
  • Anda memiliki tiga pilihan:
    1. None akan menonaktifkan semua pelaporan kesalahan.
    2. Errors and warnings akan ditampilkan pada masalah yang paling serius.
    3. All messages akan menampilkan semua masalah dan mungkin hanya berguna untuk pengembang.

Cara lain untuk menonaktifkan pemberitahuan dan pesan kesalahan melalui kode. Tambahkan kode berikut ke settings.phpfile:

$conf['error_level']=0;

Anda juga dapat mengonfigurasi Drupal untuk hanya mencatat kesalahan yang mengikuti instruksi ini: buka Administration > Configuration > Development > Logging and errorsatau langsung ke lintasan /admin/config/development/loggingdan atur "Pesan kesalahan untuk ditampilkan" menjadi tidak ada . Drupal kemudian masih mencatat kesalahan tetapi tidak menampilkannya kepada pengguna.

Jika Anda memerlukan lebih banyak kontrol, gunakan Disable Messagesmodul ini.

Adi
sumber
Ini tentang drupal_set_message, bukan pesan kesalahan.
njp
@ njp - semuanya masuk ke $ messages. Periksa templat Anda.
leymannx
3

Anda dapat menggunakan modul pesan yang lebih baik . Ini menawarkan konfigurasi berbasis peran dan / atau pencocokan ekspresi reguler untuk menyaring beberapa pemberitahuan.

BetaRide
sumber
Pesan yang lebih baik tidak memiliki konfigurasi berbasis peran untuk menampilkan pesan, hanya untuk menunjukkan jenis modul modul
reptilex
2

Anda dapat mengomentari kode ini dalam tema Anda

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

atau status_messages elemen tema melayani ini Anda dapat menulis fungsi tema sendiri di template.php

MYTHEME_status_messages(&$variables){}

Ini hanya dapat berpengaruh pada kesalahan pemberitahuan dan peringatan

werqious
sumber
1
Tetapi jika $messagesbagian berkomentar itu tidak akan ditampilkan untuk admin juga.
GoodSp33d
Pemahaman saya adalah bahwa saya tidak bisa menyembunyikan <? Php print $ messages; ?> dari pengguna karena menunjukkan erros bahwa pengguna perlu melihat serta kesalahan tipe database, misalnya jika Anda mencoba membuat simpul dan meninggalkan bidang wajib. Terima kasih
Evanss
api.drupal.org/api/drupal/includes!theme.inc/function/... di sini adalah bagaimana core menyiapkan pesan peringatan untuk rendering Anda dapat menyalin logika ini dan menambahkan logika Anda sendiri di mythemename_status_messages () di file theme.php tema Anda
werqious