2009-08-19 21 views
1

Dies ist ein Follow-up zu: Core javascript functions to make error, warning or notice messages appear?Hervorrufen von Drupal

Grundsätzlich drupal_set_message() speichert Fehlermeldungen in der Sitzung. Ich brauche eine Möglichkeit, drupal VIA JAVSCRIPT mitzuteilen, diese Nachrichten nicht anzuzeigen. Wenn die Seite aktualisiert wurde, werden diese Nachrichten angezeigt, aber ich möchte, dass sie sofort angezeigt werden.

+0

Möchten Sie eine Nachricht erstellen und diese mit Effekten anzeigen oder möchten Sie eine in der Sitzung gespeicherte Nachricht anzeigen? Wie können Sie verfolgen, ob eine Nachricht über drupal_set_message erstellt wurde? – googletorp

+0

Ich möchte eine Nachricht mit Effekten anzeigen. Ich möchte eine Nachricht mit drupal_set_message auslösen und dann rufen, was auch immer aufgerufen werden muss, damit drupal sofort alle Nachrichten in der Sitzung direkt auf dem Bildschirm anzeigt. Ist das sinnvoll? – coderama

Antwort

0

da diese Nachrichten in der Sitzung und/oder db sind, müssten Sie Ajax verwenden, denke ich. Das ist kein sehr konventioneller Ansatz.

muss ich sagen, dass auf meinen Websites diese drupal_set_message() -Funktion häufig die Nachricht eine Seite zu spät angezeigt wird, so fühle ich Ihre Schmerzen.

+0

Genau. Also, es muss einen Weg geben, es direkt anzurufen? – coderama

2

Ich bin mir nicht sicher, ob ich dich richtig verstanden habe, aber es scheint, dass du auf etwas in deinem Javascript reagieren und eine Nachricht in drupal Stil mit den Effekten anzeigen möchtest.

Um alles klar zu machen, können JavaScript und Drupal (PHP) nicht wirklich gut miteinander kommunizieren. Die einzige Lösung ist durch AJAX, so dass es keinen Sinn machen würde, drupal_set_message() von Ihrem Javascript zu verwenden. Der Grund ist, dass es ziemlich schwierig wäre und Sie würden nur mit HTML enden, das Sie an Ihre Seite anhängen müssten. Es wäre also viel einfacher, den HTML-Code in Ihrem Javascript direkt zu erstellen, wie ich es in der Antwort auf Ihre andere Frage vorgeschlagen habe. Alles, was übrig bleiben würde, wäre, die Effekte anzuhängen. Das ist eigentlich gar nicht so schwer, abhängig von Ihren Effekten. Der einzige schwierige Teil besteht darin, die Einstellungen aus dem Modul messagefx abzurufen, was momentan nicht möglich ist, da keine Einstellungen in den Skriptvariablen gespeichert werden.

Also diese Lösung in Code würde wie folgt sein:

$("#something").a_trigger(function() { 
    $("#messages").append('your html with message').find('the html you inserted').effect(some effect here); 
}); 

auf die Wirkung Je Sie erstellen möchten, würden Sie eine andere Funktion aufzurufen, schauen, was messagefx tut in seiner Modul-Datei um die Linie 55.

Die andere Möglichkeit ist, dass Sie auf jede drupal_set_message() reagieren möchten. Der schwierige Teil wäre, herauszufinden, wann es eine Nachricht gibt, da es im Javascript nicht wirklich eine Möglichkeit gibt, es zu wissen. Bedenken Sie auch, dass die meisten Nachrichten das Ergebnis des Sendens eines Formulars sind, bei dem die Seite sowieso neu geladen wird, was unnötig wäre. Sie würden also mit dem Erstellen einer einfachen AJAX-Funktion beginnen, um die Daten abzurufen und ein eigenes einfaches Modul dafür zu erstellen. Im Grunde alles, was Sie brauchen, um eine URL mit hook_menu zu definieren und in diesem Callback den Ajax zu behandeln. Sie können die Nachrichten aus dem Super-globalen $ _SESSION abrufen.

So ist der Rückruf, wäre so etwas wie dies

function mymodule_ajax_callback() { 
    if (isset($_SESSION['messages'] && !empty($_SESSION['messages'])) { 
     $result = array(); 
     foreach($_SESSION['messages'] as $message) { 
      $result[] = 'Generate html based on $message'; 
     } 
     unset($_SESSION['messages']) // Remove the messages so they wont appear twice. 
    } 
    return drupal_json($result); 
} 

aussieht Der Rest wie die erste Lösung aussehen wird, erhalten Sie nur den HTML-Code aus der Ajax statt.

+2

Sie sollten das $ _SESSION-Array nicht direkt dafür manipulieren - verwenden Sie stattdessen 'drupal_get_messages()', oder noch einfacher, wie Sie möchten, das gerenderte HTML sowieso, rufen Sie theme ('status_messages') auf, das sie selbst holt.(HINWEIS: Um die Nachrichten zu löschen, müssten Sie 'drupal_get_messages()' mit dem $ clear_queue-Parameter auf 'true' setzen, sonst werden sie beim nächsten Mal wieder angezeigt) –

+0

Ja, das ist besser. Wusste nicht über drupal_get_message. Guter Punkt – googletorp