Ocultar erros dos usuários, mas mostrar ao administrador?

18

Em 'Mensagens de erro a serem exibidas', posso ocultar erros (conforme recomendado para sites de produção). No entanto, é possível ocultar erros para todos, exceto uma determinada função?

Evanss
fonte
sim, existem alguns módulos para isso. Mas o que você está sugerindo também oculta erros de formulário, como afirmei abaixo.
Reptilex 11/09/2015
Pedido de recurso aqui drupal.org/node/2743119
giorgio79

Respostas:

18

Prefácio: Esta resposta foi postada pela primeira vez como resposta a " Como suprimir um aviso ou mensagem de erro para os usuários do site? ".

Desativar módulo de mensagens

Você pode usar o módulo Desativar mensagens para isso. Aqui está uma citação de sua página do projeto:

Oferece ao proprietário de um site opções para desativar mensagens específicas mostradas aos usuários finais. O sistema principal de mensagens drupal, oferecido por drupal_set_message, é uma excelente maneira de os módulos enviarem mensagens aos usuários finais. No entanto, nem todos os proprietários de sites do drupal desejam mostrar todas as mensagens enviadas pelo núcleo do drupal e todos os módulos para seus usuários. Este módulo oferece aos administradores do site uma maneira razoavelmente poderosa de filtrar as mensagens mostradas aos usuários finais.

Algumas de suas características são:

  • Filtre as mensagens que correspondem exatamente a uma sequência de texto completo.
  • Filtre as mensagens que correspondem a uma expressão regular.
  • Permissões para ocultar especificamente todas as mensagens de um determinado tipo de qualquer função.
  • Desative toda a filtragem para usuários específicos.
  • Desative toda a filtragem para caminhos específicos.
  • Aplique a filtragem apenas para caminhos específicos.
  • Sistema de depuração para obter mensagens no HTML sem mostrá-lo aos usuários finais.

Disponível para Drupal 6, Drupal 7 ou Drupal 8.

Sobre o uso de expressões regulares

Se você estiver usando o recurso ' expressão regular ', precisará usar uma expressão regular que "capte" a mensagem de erro que deseja interceptar, conforme explicado também na documentação da Comunidade .

Abaixo de " Dica: mantenha as coisas simples " nessa página, há uma excelente amostra, com a seguinte aparência:

Esteja ciente de que algo que parece muito simples como:

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

Tem muito mais caracteres invisíveis nele do que se poderia esperar:

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

Então, apenas envolva a carne do grep com uma simples expressão regular "any character": ". +" Como em:

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

Portanto, a "pista" para chegar a uma mensagem correta é reduzir a mensagem de erro que você deseja capturar e colocar caracteres " . + " Quando apropriado.

Falando em encolher, observe que field_txt_student_idtambém foi omitido na expressão regular (para NÃO depender do nome do campo).

Exemplo

Como outro exemplo, suponha que você queira capturar esta mensagem de erro:

PDOException: em dblog_watchdog () (linha 160 de /home/dbuser/public_html/yoursitesname.com/modules/dblog/dblog.module).

Nesse caso, uma possível expressão regular deve ser algo assim:

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

Observe como eu intencionalmente não incluí parte do caminho antes /modules/dblog/dblog.module(para que ele possa ser reutilizado em outro site onde o mesmo erro ocorre ...).

Observe também que você tem que pensar sim ou não para incluir a 160parte dele: se o módulo mudar um pouco para que na mensagem de erro (por exemplo) fique em linha 161, seu erro não será mais interceptado. Para evitar isso, omita a parte 160, se é o que você prefere (pessoalmente, prefiro ver o erro retornando e depois re-adaptar minha expressão regular).

Se sua expressão regular não funcionar no início (= a mensagem ainda aparece), talvez seja porque há algum erro de digitação na expressão regular. Para identificar esse erro de digitação, tente primeiro com uma expressão regular menos restritiva, mesmo que fosse apenas para tentar algo assim (para capturar TODAS as mensagens que contêm PDOExceptione dblog_watchdog):

.+PDOException.+dblog_watchdog.+

Ou mesmo assim (para pegar TODAS as mensagens que contêm PDOException):

.+PDOException.+

Essas duas últimas expressões provavelmente suprimiriam o excesso de mensagens; portanto, você deseja reduzi-la àquela que procura.

Alternativa instável

Há também o módulo Better Messages como alternativa. No entanto, para o D7 (que é essa a questão), ele possui apenas uma versão Alfa.

Pierre.Vriens
fonte
6

Você pode verificar a função do usuário usando a função in_array (). No seu modelo:


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

Ou você pode fazê-lo em sua função de pré-processo (não tenho certeza se a variável da mensagem é chamada corretamente, mas pode lhe dar uma idéia)


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
fonte
Meu entendimento é que não posso ocultar <? Php print $ messages; ?> dos usuários, pois mostra os erros que os usuários precisam ver e os erros do tipo de banco de dados, por exemplo, se você tentar criar um nó e deixar de fora um campo obrigatório. Obrigado
Evanss
11
Você está certo, você pode tentar descobrir como as mensagens de erro diferem das mensagens padrão e criar um hook_permission para elas. Boa sorte!
perfil completo de Jurgen
4

Na verdade, isso não é realmente factível.

Você pode ocultar todas as mensagens para usuários ou funções, mas o principal problema está na maneira como o drupal categoriza os erros.

Um erro de formulário é o mesmo que uma exceção de banco de dados para a função de mensagens; portanto, se você ocultar erros, também ocultará as mensagens de erro de um formulário de comentário.

Eu adoraria que alguém me provasse errado, porque não consegui ocultar avisos php, mas mostrar avisos de formulário ao mesmo tempo.

reptilex
fonte
4

Para remover o aviso de um site Drupal, siga as etapas abaixo:

  • Vá para admin / config / development / log.
  • Você tem três opções:
    1. None desativará todos os relatórios de erros.
    2. Errors and warnings será exibido nos problemas mais graves.
    3. All messages exibirá todos os problemas e provavelmente é útil apenas para desenvolvedores.

Outra maneira de desativar o aviso e a mensagem de erro através do código. Adicione o seguinte código ao settings.phparquivo:

$conf['error_level']=0;

Você também pode configurar o Drupal para registrar apenas os erros seguindo estas instruções: vá para Administration > Configuration > Development > Logging and errorsou vá diretamente para o caminho /admin/config/development/logginge defina "Mensagens de erro a serem exibidas" como nenhuma . O Drupal ainda registra os erros, mas não os exibe para os usuários.

Se você precisar de mais controle, use o Disable Messagesmódulo.

Adi
fonte
Trata-se de drupal_set_message, não de mensagens de erro.
Njp
@njp - todos eles vagam em $ messages. Verifique seus modelos.
Leymannx #
3

Você pode usar o melhor módulo de mensagem . Oferece configuração baseada em funções e / ou correspondência de expressão regular para filtrar algumas notificações.

BetaRide
fonte
Não mensagens melhores não tem uma configuração baseada papel para mostrar mensagens, apenas para mostrar o tipo de módulos de mensagens
reptilex
2

Você pode comentar este código no seu tema

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

ou elemento de tema status_messages serve isso, você pode escrever a própria função de tema no template.php

MYTHEME_status_messages(&$variables){}

Isso pode afetar apenas os erros de aviso e aviso

werqious
fonte
11
Mas se a $messagesseção for comentada, ela também não será exibida para os administradores.
GoodSp33d 06/07/2012
Meu entendimento é que não posso ocultar <? Php print $ messages; ?> dos usuários, pois mostra os erros que os usuários precisam ver e os erros do tipo de banco de dados, por exemplo, se você tentar criar um nó e deixar de fora um campo obrigatório. Obrigado
Evanss
api.drupal.org/api/drupal/includes!theme.inc/function/… aqui está como o núcleo prepara uma mensagem de aviso para renderização. Você pode copiar essa lógica e adicionar sua própria lógica em mythemename_status_messages () no arquivo template.php dos temas
werqious