hook_init körs inte vid valideringsfel?

Events happening in the community are now at Drupal community events on www.drupal.org.
_dala_'s picture

Jag undrar vilken hook jag ska använda när jag behöver inkludera javascript i headern i alla lägen. Jag använder hook_init men koden verkar inte exekvera vid valideringsfel, alltså tex när felaktiga värden submittas i ett formulär.

Någon som vet hur det ligger till?

...just det, jag kör D6

Comments

Det enda jag kan bidra med

ztyx's picture

Det enda jag kan bidra med är att Theme Development Module, som kör JavaScript vid varje sidladdning, använder sig av hook_init(). Dessutom säger funktionens API-sida att den kan användas för att lägga in saker på varje sida. Du är säker på att valideringsfel inte gör att din JavaScript fallerar på nått sätt (t.ex. i och med att den renderar ny kod på sidan)?

Det är inte det att

_dala_'s picture

Det är inte det att javascriptet fallerar, utan det skrivs inte ut. Det jag gjort är att jag uppdaterat (skrev om) modulen messagefx.

hook_init():

<?php
function messagefx_init() {
  if (
$messages = drupal_get_messages(NULL, FALSE)) {   
   
$js = '';  
    foreach (array(
'status', 'error') as $type) {    
      if(
$messages[$type]){     
       
$effect = variable_get($type.'_effect', 'pulsate');
       
$times  = variable_get($type.'_times', 3);
       
$length = variable_get($type.'_length', 200);
        if(!empty(
$effect)){           
         
$js .= _messagefx_build_js($type, $effect, $times, $length);
        }
      }   
    }        
    if (!empty(
$js)) {
     
drupal_add_js('$(document).ready(function(){'. $js .'});', 'inline', 'header');     
    }
  }
}
?>

_messagefx_build_js():

<?php
function _messagefx_build_js($message_type, $effect, $times, $length){
 
jquery_ui_add('effects.'.$effect);
 
$javascript = sprintf(
   
"\$('.%s').effect('%s', {%s}, %d);",
   
$message_type,
   
$effect,
    (
$times ? " times: {$times} " : " "),
   
$length
 
);
  return
$javascript;
}
?>

Detta fungerar toppen på alla statusmeddelanden och skriver ut följande script i htmlheadern:

$(document).ready(function(){$('.status').effect('pulsate', { times: 1 }, 300);});

Skriver jag däremot in ett felaktigt värde i ett formulär t ex och errormeddelandet dyker upp så skrivs inte headerscriptet ut och effekten uteblir.

Det kan ju hända att jag letar i fel ände...

Hmm, har du caching

ztyx's picture

Hmm, har du caching påslaget? hook_init() anropas inte om man har cache påslaget och av den anledningen så skulle ditt javascript kunna utebli...

Jag vet inte om hook_boot() skulle kunna råda bot på ditt problem?

Har du undersökt variabeln

zoo33's picture

Har du undersökt variabeln $messages och kollat hur den ser ut när det finns formulärvarningar? Borde inte förklaringen ligga nånstans i din hook_init()? För hooken körs som sagt vid varje sidladdning (utom när den laddas från cache).

/ Hannes Lilljequist – SthlmConnection

Kan det vara så enkelt att

_dala_'s picture

Kan det vara så enkelt att formulärvarningarna inte är satta när hook_init() exekveras?

Som du säkert misstänkte var $messages tom ...

Jag löste mitt problem

_dala_'s picture

Jag löste mitt problem genom att lyfta ut funktionaliteten från hook_init() till en egen funktion och anropar helt enkel den även från hook_validate() efter att varningar sätts.

Får se om jag filar på en bättre lösning...

Tack för svaren!

När man tänker efter är

zoo33's picture

När man tänker efter är det rätt självklart. hook_init() körs tidigt, långt innan formulärshanteringen skulle jag tro.

/ Hannes Lilljequist – SthlmConnection

Sweden

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds:

Hot content this week