Ich erstelle einen Inhaltstyp für CTools-Bedienfelder (dh das Element, das Sie beim Hinzufügen von Inhalten in Bedienfelder einfügen, nicht einen Knotentyp) und versuche, das #ajax
Attribut eines Formularelements zu verwenden, um einige Standardwerte festzulegen. Siehe Code unten.
Dies ist my_module_content_type_edit_form($form, &$form_state)
übrigens alles innerhalb des Aufrufs des Inhaltstyps .
$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')),
);
Mein Rückruf ist der folgende.
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'];
}
Unabhängig davon, ob die von mir vorgeschlagene Rückkehr tatsächlich funktionieren würde, watchdog()
funktioniert sie nicht einmal.
Ich weiß, dass CTools einige seltsame Dinge mit AJAX macht, aber es kann nicht so seltsam sein. Haben Sie eine Idee, wie ich tun würde, was ich tun möchte?
Vielen Dank!
Alternativ: Wie setze ich einen Standardwert basierend auf dem Wert einer vorherigen Formularoption?
Ich habe herausgefunden, wie das geht, aber es ist ein bisschen hacky - Sie erstellen neue Formularfelder für jede Abhängigkeitsgabel. Sie können dann die Werte zusammenführen hook_content_type_edit_form_submit()
, wobei der Wert verwendet wird, der dem Wert entspricht, der für die Komponente ausgewählt wurde, die anfangs alles gegabelt hat.
Ich lasse die Frage offen, weil ich (und ehrlich gesagt jeder Programmierer, mit dem ich arbeite) wirklich eine gute Möglichkeit haben möchte, AJAX in diesen Bearbeitungsformularen für Panel-Inhaltstypen zu verwenden.
Update: Es scheint, dass Sie mit #attached auch nichts anfangen können.
$form['link'][$i] = array(
'#type' => 'fieldset',
'#title' => t('Link #@num', array('@num' => $i)),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#attached' => array(
'js' => array(
'alert("Yay.");', 'inline'
),
)
);
quelle
ctools_add_js();
oderdrupal_add_js();
am Ende von hinzufügen konntehook_content_type_edit_form();
. Wenn Sie nur einfache Dinge im Zusammenhang mit der Benutzeroberfläche tun, scheint dies der beste Anruf zu sein (zumindest bis jemand diese Frage richtig beantwortet).Antworten:
Kurze Antwort: Sie sollten #ajax ['path'] verwenden.
Lange Antwort:
Ein Ajax-Rückruf hilft nicht, da ctools seine Formen anders erstellt. Der von system / ajax durchgeführte Rückruf kann die vollständige Formulardefinition nicht finden und kann daher kein Element finden, für das die Ajax-Anforderung verarbeitet werden soll. Die Verwendung von #ajax [Pfad] löst nur einen Menüpunkt aus.
Sie können dies selbst überprüfen, indem Sie das Formular bei Verwendung von #ajax [Rückruf] ausgeben.
Ich habe die simplecontext_content_type_edit_form geändert, indem ich das Widget für die automatische Vervollständigung des Benutzers und Ihr Feld hinzugefügt habe, die beide funktionieren :)
Da Sie jetzt den #ajax-Pfad verwenden, müssen Sie einen Menüpunkt hinzufügen, wie es mir gefallen hat
Ein kleiner Tipp zu #attached [js]: Die Inline-js sollten key => value like:
Ich habe Firebug verwendet, um den resultierenden Wert und nicht den resultierenden Effekt zu überprüfen. Ich hoffe, dies hilft, Ihr Problem zu beheben.
quelle
Ich hatte ein ähnliches Problem, bei dem ich einen Media-Elementtyp in ein CTools-Inhaltstyp-Plugin aufnehmen wollte, das auch Ajax zur Auswahl eines Bildes verwendet.
Anstelle der Einstellung "Rückruf" wird die eigene Ajax-Einstellung "Pfad" verwendet. Bei der Auswahl eines Bildes wurde das Formular jedoch ohne das Medienelement vollständig neu erstellt.
Ich habe dies darauf zurückgeführt, dass drupal_rebuild_form weder die CTools-Formularumbruchfunktion noch die eigentliche Einstellungsformularfunktion finden konnte. Also habe ich es behoben, indem ich diese Codezeilen zum ctools-Einstellungsformular hinzugefügt habe:
Vielleicht fehlt mir etwas Offensichtliches, warum die Include-Dateien nicht geladen werden, aber das manuelle Einfügen hat das Problem für mich behoben.
quelle
Auf meiner Seite musste ich eine Formularumbruchfunktion in die .module-Datei schreiben und den Bereich manuell (wo der ursprüngliche Formularinhalt definiert ist) wie folgt einschließen:
Während eines Ajax-Aufrufs kann Drupal jetzt mein Formular abrufen, damit ich die Standard-AJAX-Formular-API verwenden kann.
quelle