Posted by _dala_ on November 18, 2008 at 8:56am
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
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
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():
<?phpfunction 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():
<?phpfunction _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
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
Har du undersökt variabeln
$messagesoch kollat hur den ser ut när det finns formulärvarningar? Borde inte förklaringen ligga nånstans i dinhook_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
Kan det vara så enkelt att formulärvarningarna inte är satta när
hook_init()exekveras?Som du säkert misstänkte var
$messagestom ...Jag löste mitt problem
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ånhook_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
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