Je crée un type de contenu de panneaux CTools (c'est-à-dire la chose que vous insérez dans les panneaux lors de l'ajout de contenu, pas un type de nœud) et j'essaie d'utiliser l' #ajax
attribut d' un élément de formulaire pour définir des valeurs par défaut. Voir le code ci-dessous.
my_module_content_type_edit_form($form, &$form_state)
Soit dit en passant, tout cela se trouve à l'intérieur de l' appel du type de contenu .
$form['link_type'] = array(
'#type' => 'radios',
'#title' => t('Link Type'),
'#ajax' => array(
'callback' => 'my_module_set_target'
),
'#default_value' => empty($conf['link_type']) ? '_blank' : $conf['link_type'],
'#options' => array('none'=>t('No Link'), 'internal'=>t('Internal Link'), 'external'=>t('External Link'), 'document'=>t('Document Link')),
);
Mon rappel est le suivant.
function my_module_set_target($form, $form_state) {
watchdog("Test", "Testing callback", array(), WATCHDOG_ALERT);
$form['link_target']['#default_value'] = '_parent';
return $form['link_target']['#default_value'];
}
Peu importe si le retour que je watchdog()
propose fonctionnerait, ne fonctionne même pas.
Je sais que CTools fait des trucs bizarres avec AJAX, mais ça ne peut pas être si bizarre. Avez-vous une idée de la façon dont je ferais ce que je veux faire?
Merci!
Alternativement: Comment définir une valeur par défaut basée sur la valeur d'une option de formulaire précédente?
J'ai compris comment faire cela, mais c'est un peu hacky - vous créez de nouveaux champs de formulaire pour chaque fourchette de dépendance. Vous pouvez ensuite fusionner les valeurs dans hook_content_type_edit_form_submit()
, en utilisant celle qui correspond à la valeur choisie pour le composant qui a initialement tout forké.
Je laisse la question ouverte parce que moi (et, franchement, tous les programmeurs avec qui je travaille), je veux vraiment un bon moyen d'utiliser AJAX dans ces formulaires de modification de type de contenu de Panel.
Mise à jour: Il semble que vous ne puissiez pas non plus faire de trucs avec #attached.
$form['link'][$i] = array(
'#type' => 'fieldset',
'#title' => t('Link #@num', array('@num' => $i)),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#attached' => array(
'js' => array(
'alert("Yay.");', 'inline'
),
)
);
la source
ctools_add_js();
oudrupal_add_js();
à la fin dehook_content_type_edit_form();
. Si vous faites simplement des trucs simples liés à l'interface utilisateur, cela semble être le meilleur appel (au moins jusqu'à ce que quelqu'un réponde correctement à cette question).Réponses:
Réponse courte: vous devez utiliser #ajax ['chemin'].
Longue réponse:
Avoir un rappel ajax n'aide pas car ctools crée ses formes différemment afaik. Le rappel effectué par system / ajax ne peut pas trouver la définition complète du formulaire et ne peut donc pas trouver un élément pour traiter la demande ajax. L'utilisation de #ajax [chemin] déclenche simplement un élément de menu.
Vous pouvez vérifier par vous-même en vidant le formulaire lorsque vous utilisez #ajax [rappel]
J'ai modifié le simplecontext_content_type_edit_form en ajoutant le widget de saisie semi-automatique de l'utilisateur et votre champ qui fonctionnent tous les deux :)
Comme vous utilisez maintenant le chemin #ajax, vous devez ajouter un élément de menu comme je l'ai aimé
Un nittpick sur #attached [js]: le js en ligne doit être clé => valeur comme:
J'ai utilisé Firebug pour vérifier la valeur résultante et non l'effet résultant. J'espère donc que cela vous aidera à résoudre votre problème.
la source
J'ai eu un problème similaire, où je voulais inclure un type d'élément Media dans un plugin de type de contenu CTools, qui utilise également ajax pour sélectionner une image.
Il utilise son propre paramètre ajax 'path', au lieu du paramètre 'callback', mais lors de la sélection d'une image, le formulaire a été reconstruit sans l'élément multimédia.
J'ai tracé cela au fait que drupal_rebuild_form ne pouvait trouver ni la fonction wrapper de formulaire CTools, ni la fonction de formulaire de paramètres réels. Je l'ai donc corrigé en ajoutant ces lignes de code au formulaire de paramètres ctools:
Peut-être que je manque quelque chose de pourquoi les fichiers include ne sont pas chargés, mais les inclure manuellement a résolu le problème pour moi.
la source
de mon côté, j'ai dû écrire une fonction wrapper de formulaire dans un fichier .module et inclure manuellement le volet (où le contenu du formulaire d'origine est défini) comme ça:
Maintenant, pendant l'appel ajax, Drupal est capable de récupérer mon formulaire afin que je puisse utiliser l'API de formulaire AJAX standard.
la source