2010-07-17 3 views
1

J'essaye d'obtenir un formulaire AJAX-soumis (AHAH) fonctionnant pour montrer dans un bloc sur la barre latérale. Pour tester, j'utilise un exemple de module appelé "Poof" du livre Pro Drupal Development: http://books.google.com/books?id=VmZrdGuBZCMC&lpg=PA269&ots=cnHiYG6kXn&dq=pro%20drupal%20development%20poof&pg=PA269#v=onepage&q=pro%20drupal%20development%20poof&f=falsePourquoi les formulaires Drupal AHAH ne fonctionnent-ils pas dans un bloc?

La seule chose que j'ai ajouté à l'exemple jusqu'à présent est une implémentation de hook_block, qui ressemble à ceci:

function poof_block($op = 'list', $delta = 0, $edit = array()) { 
    switch ($op) { 
    case 'list': 
     $blocks[0]['info'] = t('poof'); 
     return $blocks; 
    case 'view': 
     $block['content'] = drupal_get_form('poof_form'); 
     return $block; 
    } 
} 

le module AJAX fonctionne très bien lors de l'affichage sur sa propre page (mydrupalsite.com/poof), mais quand je l'appelle la forme avec module_invoke (« tapette », « bloc » ...) dans un fichier de modèle, le formulaire soumet comme normal (sans AJAX) et actualise la page.

Je ne trouve pas de réponse définitive pour expliquer pourquoi cela se produit, bien que quelque chose de tangentiellement apparenté suggère que peut-être AHAH ne fonctionne pas dans les blocs. Si c'est le cas, pourquoi? Ou mieux encore, qu'est-ce qu'un work-around. Dois-je mettre la page blanche sur sa propre page et l'apporter avec un iframe? Cela semble inutilement désordonné.

MISE À JOUR: est ici plus de code de référence (encore une fois, il est du livre Pro Drupal)

function poof_form() { 
    $form['target'] = array(
    '#type' => 'markup', 
    '#prefix' => '<div id="target">', 
    '#value' => t('Click the button below.'), 
    '#suffix' => '</div>', 
); 
    $form['submit'] = array(
    '#type' => 'button', 
    '#value' => t('Click Me'), 
    '#submit'=>false, 

    '#ahah' => array(
     'event' => 'click', 
     'path' => 'poof/message_js', 
     'wrapper' => 'target', 
     'effect' => 'fade', 
    ), 
); 

    return $form; 
} 

function poof_message_js() { 
    $output = t('POOF!'); 
    drupal_json(array('status' => TRUE, 'data' => $output)); 
} 
+0

J'utilise des formulaires activés pour les modules AJAX dans les blocs, et ils fonctionnent très bien - donc il y a probablement quelque chose qui ne va pas dans la logique de détection des modules AJAX dans votre cas. Comment configurer le module AJAX pour le joindre à votre formulaire? –

+0

Merci pour votre réponse, Henrik. Je n'utilise pas le module AJAX directement ici. J'utilise la fonctionnalité "AHAH" de Drupal dans les formulaires. J'ajoute un autre extrait à mon message original pour plus de clarté. Peut-être que la réponse est que je dois écrire Ajax directement avec jQuery. Comme la méthode AHAH semble fonctionner dans un contexte de page, j'espérais contourner cela et utiliser le même code dans un bloc. – fredrover

+1

Est-ce que misc/ahah.js est inclus lorsque vous obtenez le formulaire dans le bloc. –

Répondre

1

Essayez d'ajouter

$blocks[0]['cache'] = BLOCK_NO_CACHE;

à votre mise en œuvre de hook_block. Le rendu d'un formulaire avec ahah provoque un appel à drupal_add_js pour ajouter le javascript ahah, mais tant que la sortie du bloc est mise en cache, le javascript ajouté à la page ne le fait pas.

Questions connexes