jQuery: dynamisch erstellter Link führt zu Fehlermeldung [gelöst]
am 17.02.2012 - 07:57 Uhr in
Hallo,
ich habe das oben beschriebene Problem. Um es zu konkretisieren: Ich habe ein Modul geschrieben in dem ersteinmal nur ein Link statisch vorhanden ist.
function add_rde_server_menu () {
$items = array();
$items['add-rde-server-mainpage'] = array (
'title' => 'RDE-Server',
'page callback' => 'add_rde_server_dialog_page',
'access arguments' => array('access rde server dialog'),
'type' => MENU_NORMAL_ITEM,
);
$items['add-rde-server-mainpage/add-rde-server-dialog'] = array (
'title' => 'add-rde-server-dialog',
'page callback' => 'add_rde_server_dialog',
'access arguments' => array('access rde server dialog'),
'type' => MENU_CALLBACK,
);
$items['add-rde-server-mainpage/edit-rde-server-dialog'] = array (
'title' => 'edit-rde-server-dialog',
'page callback' => 'edit_rde_server_dialog',
'access arguments' => array('access rde server dialog'),
'type' => MENU_CALLBACK,
);
return $items;
}
function add_rde_server_dialog_page () {
$output = '<div id="contentBlock_rde_server"><p>'.l('RDE-Server erstellen', 'add-rde-server-mainpage/add-rde-server-dialog', $options = array('attributes' => array('class' => 'add-rde-server-dialog'))).'</p></div>';
return $output;
}Statisch ist hierbei der Link mit dem Pfad add-rde-server-mainpage/add-rde-server-dialog, welcher ordnungsgemäß funktioniert. Der andere Link wird dann innerhalb der Seite erst angelegt, sobald ein Eintrag, über ein Formular, hinzugefügt wurde.
...
$('.edit-rde-server-dialog').click(function () {
// var $changeValue = $(this).attr('id');
// alert($changeValue);
$edit_dialog.dialog('open');
return false;
});
function appendContent () {
var $name = $('#bezeichnung_rde_server').val();
var $descr = $('#beschreibung_rde_server').val();
$('#rde_server tbody').append('<tr>'+
'<td id="rde_server_'+$counter+'">'+$name+'</td>'+
'<td id="descr_rde_server_'+$counter+'">'+$descr+'</td>'+
'<td><a id="edit-rde-server-'+$counter+'" href="/drupal/add-rde-server-mainpage/edit-rde-server-dialog">Bearbeiten</a></td>'+ // hier wird der link erzeugt
'</tr>'
);
}
...Der Link wird ordnungsgemäß angelegt, und der Pfad ist wie angegeben add-rde-server-mainpage/edit-rde-server-dialog. Allerdings führt der Klick auf den Link zu einer weißen Seite und Drupal notiert dazu die Fehlermeldung:
call_user_func_array() expects parameter 1 to be a valid callback, function 'edit_rde_server_dialog' not found or invalid function name in C:\xampp\htdocs\drupal\includes\menu.inc in Zeile 349..
Liegt es an der dynaimschen Erzeugung des Links, die ja quasi nich über die l-Funktion sondern direkt über jQuery erfolgt? Wenn ja, wie kann ich das Problem lösen?
Danke
- Anmelden oder Registrieren um Kommentare zu schreiben

selber Fehler bei Modul "Case Tracker"
am 17.02.2012 - 08:59 Uhr
Dieselbe Fehlermeldung kommt auch hier in ganz anderem Zusammenhang, vielleicht hilft das, die Fehlerquelle einzukreisen: Modul "Case Tracker": "Cannot add cases and projects".
Hallo,danke für den Link.
am 17.02.2012 - 10:21 Uhr
Hallo,
danke für den Link. Allerdings wird ja dort eine Neuinstallation vorgeschlagen, dieser möchte ich vorerst mal aus dem Weg gehen.
Hab mir jetzt nochmal die Zeile in der menu.inc angeschaut. In der Fehlermeldung kritisiert er ja den ersten Parameter, welcher in diesem Falle $router_item['page_callback'] ist, also der page callback (richtig!?).
Nun habe ich mal den page callback in der module-Datei herausgenommen:
...$items['add-rde-server-mainpage/edit-rde-server-dialog'] = array (
'title' => 'edit-rde-server-dialog',
'access arguments' => array('access rde server dialog'),
'type' => MENU_CALLBACK,
);
...
Damit springt er zumindest mal auf eine neue Seite mit dem gewünschten Inhalt, beim Klicken auf den Link. Allerdings sollte sich im Optimalfall ein Fenster öffnen, eben der jQuery UI-Dialog. Ich weis auf der anderen Seite aber auch nicht, was ich in die page callback-Methode in der module-Datei eintragen söllte, könnte, müsste.
EDIT:
Habe gerade gemerkt, dass ich noch einen grundlegenden Fehler eingebaut hatte, der aber das eigentliche Problem nicht löst:
Linkerzeugung
function appendContent () {
var $name = $('#bezeichnung_rde_server').val();
var $descr = $('#beschreibung_rde_server').val();
$('#rde_server tbody').append('<tr>'+
'<td id="rde_server_'+$counter+'">'+$name+'</td>'+
'<td id="descr_rde_server_'+$counter+'">'+$descr+'</td>'+
'<td><a class="edit-rde-server-dialog" id="edit-rde-server-'+$counter+'" href="/drupal/add-rde-server-mainpage/edit-rde-server-dialog">Bearbeiten</a></td>'+ // hier hatte natürlich das Attribut class gefehlt
'</tr>'
);
}
// jetzt ist der Aufruf zumindest theoretisch überhaupt möglich, da vorher der link nur mit einem id-Attribut erzeugt wurde
$('.edit-rde-server-dialog').click(function () {
var $changeValue = $(this).attr('id');
alert($changeValue);
$edit_dialog.dialog('open');
return false;
});
Hallo.Nach langer Recherche
am 22.02.2012 - 11:54 Uhr
Hallo.
Nach langer Recherche und einigen Testveränderungen, weis ich zumindest, warum Drupal das Fehlen der Methode beklagt. Ich hatte den Link so angelegt, das er dem DOM nicht registriert wurde.
Ich musste also mit den Behaviors arbeiten.
Inzwischen steht der folgende Quelltext in meinem JS-file (gekürzt):
// $Id: add_rde_server.js $
(function ($) {
$(document).ready(function () {
//Drupal.behaviors.add_rde_server = function (context) {
var $counter = 0;
// Aufbau des Eingabeformulars im erscheinenden Dialog
var $add_form = '<form>'+
'<p><b>Name: </b><br /><input type="text" id="bezeichnung_rde_server" name="name" size="30" maxlength="50" /></p>'+
'<p><b>Beschreibung: </b><br /><textarea id="beschreibung_rde_server" name="beschreibung" rows="10" cols="100" /></p>'+
'</form>';
// Tabelle, welche den erstellten Inhalt anzeigt
var $contentTable = '<p><table id="rde_server" class="ui-widget ui-widget-content">'+
'<thead>'+
'<tr class="ui-widget-header">'+
'<th>Name</th>'+
'<th>Beschreibung</th>'+
'<th></th>'+
'</tr>'+
'</thead>'+
'<tbody>'+
'</tbody>'+
'</table></p>';
// Inhaltstabelle an Abschnitt mit id contentBlock_rde_server anhängen
$('#contentBlock_rde_server').append($contentTable);
// Eigenschaften des Dialogfensters und Bestimmung der Funktionsweise beim Betätigen der Buttons
var $add_dialog = $('<div></div>').html($add_form).dialog({
modal: true,
width: 750,
height: 450,
title: 'RDE-Server erstellen',
autoOpen: false,
buttons: {
'OK': function () {
var $value_exists = new Boolean();
$value_exists = validateAndSubmit();
if ($value_exists) {
$(this).dialog('close');
clearForm();
}
else {
$('#bezeichnung_rde_server').attr('style', 'border-color: red;');
}
},
'Close': function () {
$(this).dialog('close');
clearForm();
}
}
});
// Aufruf des Hinzufügen-Dialogs beim Klick auf Link der Klasse add-rde-server-dialog
$('.add-rde-server-dialog'/*, context*/).click(function () {
$add_dialog.dialog('open');
return false;
});
function validateAndSubmit () {
var $val = new Boolean();
$val = validate();
if ($val == true) {
insertInDB();
appendContent();
Drupal.attachBehaviors();
$counter++;
return true;
}
else if ($val == false) {
return false;
}
}
function appendContent () {
var $name = $('#bezeichnung_rde_server').val();
var $descr = $('#beschreibung_rde_server').val();
/*
$('#rde_server tbody').append('<tr>'+
'<td id="rde_server_'+$counter+'">'+$name+'</td>'+
'<td id="descr_rde_server_'+$counter+'">'+$descr+'</td>'+
'<td><a class="edit-rde-server-dialog" id="edit-rde-server-'+$counter+'" href="/drupal/add-rde-server-mainpage/edit-rde-server-dialog">Bearbeiten</a></td>'+
'</tr>'
);
*/
Drupal.behaviors.append = function () {
$('#rde_server tbody').append('<tr>'+
'<td id="rde_server_'+$counter+'">'+$name+'</td>'+
'<td id="descr_rde_server_'+$counter+'">'+$descr+'</td>'+
'<td><a class="edit-rde-server-dialog" id="edit-rde-server-'+$counter+'" href="/drupal/add-rde-server-mainpage/edit-rde-server-dialog">Bearbeiten</a></td>'+
'</tr>'
)
}
}
});
})(jQuery);
Allerdings führt das ganze zu den selben Problemen wie weiter oben bereits beschrieben (WSOD und Fehlermeldung). Allerdings habe ich keine Ahnung, warum scheinbar das Drupal.attachBehaviors überhaupt keine Wirkung hat.
MfG
Fortsetzung unter:
am 24.02.2012 - 09:38 Uhr
"jQuery: durch Drupal Behaviors Fehlverhalten auf Seite" ;-)