[gelöst] Views Ajax Block Validation Nachricht

am 05.05.2014 - 08:56 Uhr in
Hallo zusammen
Ich habe die Frage auch hier gepostet: http://stackoverflow.com/questions/23467510/drupal-views-ajax-block-validation-message.
Ein Views Block mit Ajax und exposed Filtern. Funktioniert alles super. Doch die Validation-Messages werden erst nach dem erneuten Laden der Seite angezeigt. Kann mir da jemand weiterhelfen?
- Anmelden oder Registrieren um Kommentare zu schreiben
Moin,was dir in deinem
am 10.05.2014 - 17:52 Uhr
Moin,
was dir in deinem Beispiel fehlt, ist der Ajax Callback, nachdem der User seine Eingabe in das entsprechende Feld getätigt hat. Das kannst du z.Bsp. so lösen (array_unshift und _custom_form_validate brauchst du dann nicht:
<?php
function hook_form_alter(&$form, &$form_state, $form_id) {
if($form['#id'] === 'id_from_views') {
$form['feld_des_inputs']['prefix'] = '<div id ="foo">'; //braucht JS als Selector für die Message
$form['feld_des_inputs']['suffix'] = '</div'>;
$form['feld_des_inputs']['#ajax'] = array('callback' => 'ajax_load');
if(!empty($form_state['values']['field'])) {
$message = t('Custom error message.');
drupal_set_message($message, $type = 'error', $repeat = FALSE);
}
}
}
function ajax_load($form, &$form_state) {
$commands = array();
$commands[] = ajax_command_replace("#foo", drupal_render($form['feld_des_inputs']));
$commands[] = ajax_command_prepend("#foo", theme('status_messages'));
return array('#type' => 'ajax', '#commands' => $commands);
}
?>
Hey Vielen Dank! Macht
am 11.05.2014 - 10:06 Uhr
Hey Vielen Dank! Macht irgendwie Sinn, werde ers sobald ich dazu komme testen und ein Feedback geben! Nochmals vielen Dank!
Hi glycidSo ich habe es nun
am 12.05.2014 - 09:13 Uhr
Hi glycid
So ich habe es nun getestet, und funktioniert noch nicht wirklich. Also genau genommen geschieht gar nichts.
Mit folgendem Code hab ichs getestet:
<?php
function mymodule_form_alter(&$form, &$form_state, $form_id) {
if($form['#id'] === 'form_id') {
$form['custom_input_field']['#prefix'] = '<div id ="foo">';
$form['custom_input_field']['#suffix'] = '</div>';
$form['custom_input_field']['#ajax'] = array('callback' => 'ajax_load');
if(!empty($form_state['values']['custom_input_field'])) {
$message = t('Custom error message.');
drupal_set_message($message, $type = 'error', $repeat = FALSE);
}
}
}
function ajax_load($form, &$form_state) {
$commands = array();
$commands[] = ajax_command_replace("#foo", drupal_render($form['custom_input_field']));
$commands[] = ajax_command_prepend("#foo", theme('status_messages'));
return array('#type' => 'ajax', '#commands' => $commands);
}
?>
Wenn ich die Form ausgebe, sind die Prefix, Suffix, und Ajax- Attribute wie gewünscht gesetzt worden.
Oder hab ich da etwas übersehen? Vielleicht nochmals zu erwähnen ist, dass es sich um einen Exposed-Filter einer View handelt, respektive funkt da irgendein Views-Handler oder so dazwischen...
Ach ja und die ich musste #prefix und #suffix MIT hashtag setzten, dies war bei deinem Beispiel anders.
Ja, die Hashtags hatte ich
am 12.05.2014 - 10:12 Uhr
Ja, die Hashtags hatte ich vergessen. Das ist schon korrekt so. Hm, ich hab das so oder so ähnlich mehrfach im Einsatz, um bestimmte Formular- Eingaben direkt zu validieren. Kannst du mal mit
dpm ($form_state['input']['custom_input_field'];
prüfen, ob da die Eingaben im Array sind und mal statt
drupal_set_message($message, $type = 'error', $repeat = FALSE);
mal
dpm ($message);
innerhalb der
if()
Anweisung ausgeben lassen?Was ich auch nicht ganz
am 12.05.2014 - 10:29 Uhr
Was ich auch nicht ganz verstehe, dass du mit
if(!empty());
prüfst. Da wird
$message
doch immer ausgegeben, wenn der User etwas eingibt....Also ich habe die Zeile <?php
am 12.05.2014 - 10:43 Uhr
Also ich habe die Zeile
<?php
if(!empty($form_state['values']['custom_input_field'])) {
?>
in
<?php
if(!empty($form_state['input']['custom_input_field'])) {
?>
geändert. Da mit dem 'values'-Attribut per dpm() nie etwas ausgegeben wurde. Mit dem Input Attribut allerdings schon. Funktioniert aber immer noch nicht. Die Message wird dann auch korrekt abgefüllt und drupal_set_message ausgeführt. Allerdings erst wieder beim Page-Reload. Somit bin ich am selben Punkt wie zu Anfang. Irgendwie wird die Funktion ajax_load() nicht aufgerufen. Wenn ich dort ein dpm() setzte oder gar ein exit() passiert gar nichts.
Noch eine Frage: Das custom_input_field ist ein normales Textfeld. Wie kann es also überhaupt ein Callback wie ajax_load besitzen? Respektive wann wird dieser Callback genau ausgelöst? Ich denke da könnte das Problem liegen. Bei einer Selectbox zum Beispiel wird der Ajax-Callback bei der Auswahl eines neuen Wertes gesetzt, wie ist es aber beim Textfeld? Entweder beim Form-Submit oder oder bei der Eingabe von Text... Weisst du was ich meine?
Gruss Feanor
glycid schrieb Was ich auch
am 12.05.2014 - 10:46 Uhr
Was ich auch nicht ganz verstehe, dass du mit
if(!empty());
prüfst. Da wird
$message
doch immer ausgegeben, wenn der User etwas eingibt....Korrekt! Dies aber bloss zum testen, danach werd ich schon eine andere Prüfung unterziehen. So jedoch ist es einfach zu prüfen, ob es überhaupt funktioniert.
FeanorCC schriebDas
am 12.05.2014 - 11:19 Uhr
Das custom_input_field ist ein normales Textfeld
Dann kann natürlich kein Aufruf erfolgen. Es sei denn, der User drückt die Enter- Taste. Wenn es unbedingt ein Textfeld sein muss, brauchst du noch ein geeignetes Trigger Element, das den Callback auslöst. Das kann ein weiteres Feld mit einer Select List oder ein Submit Button sein.
Edit: Da hätte ich natürlich auch gleich mal dran denken können....
glycid schrieb FeanorCC
am 12.05.2014 - 12:11 Uhr
Das custom_input_field ist ein normales Textfeld
Edit: Da hätte ich natürlich auch gleich mal dran denken können....
Kein Problem, bei mir hats auch ein Weilchen gedauert, da dein Lösungsansatz etwas anders war.
Noch über einen andere Trigger zu gehen finde ich nun etwas sehr aufwendig. Vorallem da es eigentlich wie in meinem ersten Post super funktioniert, bloss die form_set_error() message wird erst beim page-reload angezeigt. Aber die Validation etc. funktioniert alles sauber über Ajax.
Ich hab's nun so gelöst:
<?php
function _custom_form_validate($form, &$form_state) {
if(!empty($form_state['values']['field'])) {
form_set_error('field', t('Custom error message.'));
drupal_add_js(array('my_module' => array('message' => theme('status_messages'))), array('type' => 'setting'));
}
}
?>
Und in der Javascript Datei meines Modules:
var message;
Drupal.behaviors.setMessage= {
attach: function (context, settings) {
try{
// Set the validation message
var message_new = Drupal.settings.my_module.message;
if(message_new.length > 0) {
if(message_new != message) {
message = message_new;
$('#my_form_element').prepend(message);
}
}
}
catch(err){
//Handle errors here
}
}
};
Dies Funktioniert exakt wie ich es wollte. Dennoch wäre es schön gewesen nicht über pures Javascript oder jQuery gehen zu müssen, da Drupal das eigentlich auch so können müsste. Bei einer selbst erstellten Form klappt die direkte Anzeige von Messages ohne Probleme, doch bei den Views-Exposed-Filtern sehe ich momentan keine andere Lösung. Falls jemand des Rätels Lösung weiss, ich warte gespannt darauf.
Hier ein anderer etwas
am 05.11.2014 - 16:12 Uhr
Hier ein anderer etwas einfacherer Lösungsansatz: http://stackoverflow.com/a/23825912/3043126