erstellter Menüpfad funktioniert nicht bzw. falsch [gelöst]
am 04.09.2009 - 20:18 Uhr in
Hallo an alle,
ich melde mich ja relativ wenig mit meinen Problemen, da ich meist versuche diese erst einmal selbst zu beheben. Nun sitz ich aber heute schon wieder den ganzen Tag an einer relativ einfachen Sache und weiß nicht mehr weiter.
Ich habe in der hook_menu()-Funktion folgende Einträge erstellt:
$items['admin/cybernetics/exercises/manage/%cs_exercise/options'] = array
(
'title' => 'Options',
'page callback' => 'drupal_get_form',
'page arguments' => array('cs_exercise_options_form', 4),
'access arguments' => array('administer interships'),
'type' => MENU_CALLBACK,
'file' => 'cs_exercise.admin.inc',
);
$items['admin/cybernetics/exercises/manage/%cs_exercise/options/%cs_exercise_option/edit'] = array
(
'title' => 'Edit option',
'page callback' => 'drupal_get_form',
'page arguments' => array('cs_exercise_option_form', 4, 6),
'access arguments' => array('administer interships'),
'type' => MENU_CALLBACK,
'file' => 'cs_exercise.admin.inc',
);
Der erste Menüeintrag funktioniert auch so wie er soll. Wenn ich jedoch versuche eine Option zu editieren (2. Menüeintrag) komme ich einfach nicht zu der gewünschten Funktion, sonder werde immer wieder zu dem 1. Menüeintrag umgeleitet (bzw. zu seiner callback page).
Mache ich jedoch das "edit" am ende des 2. Menüpfades weg funktioniert alles auf einmal. Ich kann mir den Fehler bis jetzt noch nicht erklären. Vielleicht weiß hier einer Rat???
Das "edit" am Ende müsste auf jedenfall stehend bleiben. Ich habe auch schon mehrfach den Cache im Drupal und manuell in der Datenbank gelöscht und das komplette Modul bereits auf einer anderen Drupal-Installation getestet, jedoch immer mit dem selben falschen Ergebnis.
Vielen Dank schonmal im voraus.
LG the-sandman
- Anmelden oder Registrieren um Kommentare zu schreiben
Ich kann so kein Fehler
am 04.09.2009 - 20:48 Uhr
Ich kann so kein Fehler sehen.
----------------------------------------
http://tobiasbaehr.de/
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Das Verhältnis anderen zu helfen muss höher sein, als von anderen Hilfe zu erfragen/erwarten.
Ich leider auch nicht. Das
am 05.09.2009 - 12:03 Uhr
Ich leider auch nicht. Das macht mir die Sache relativ schwer, da ich garnicht weiß wo ich mit der Fehlersuche ansetzen soll...
LG the-sandman
Naja die Funktionen sind ja
am 05.09.2009 - 12:18 Uhr
Naja die Funktionen sind ja gleich, nur die Parameter sind anders also musste die cs_exercise_option_form Funktion anschauen.
----------------------------------------
http://tobiasbaehr.de/
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Das Verhältnis anderen zu helfen muss höher sein, als von anderen Hilfe zu erfragen/erwarten.
Hab ich auch schon, hab auch
am 13.09.2009 - 13:43 Uhr
Hab ich auch schon, hab auch versucht einige Testausgaben mit "drupal_set_message()" zu machen.
Das Problem ist, dass Drupal nicht mal bis zu der Funktion "cs_exercise_option_form()" kommt, geschweige denn die "cs_exercise_option_load()" (also die Load-Funktion durch den Pfad-Parameter) kommt und mir dort Testausgaben anzeigt. Der Fehler scheint schon in der Verlinkung zu liegen und die Funktionen werden nicht richtig gefunden, sehe ich das richtig? Nur wenn ich das "/edit" am Ende des Pfades weg lassen, wird auf einmal alles gefunden. Das ist echt sehr verwirrend
LG the-sandman
Paste noch die fehlende
am 13.09.2009 - 13:50 Uhr
Paste noch die fehlende *_load, *_to_arg Funktionen sowie das Formular.
----------------------------------------
http://tobiasbaehr.de/
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Das Verhältnis anderen zu helfen muss höher sein, als von anderen Hilfe zu erfragen/erwarten.
Ok, natürlich, hab ich voll
am 13.09.2009 - 15:28 Uhr
Ok, natürlich, hab ich voll vergessen.
Hier die Load-Funktionen:
<?php
function cs_exercise_load($exerc_id, $nid = NULL, $type = '')
{
if ($nid)
{
switch ($type)
{
case 'intership':
$exercise = db_fetch_object(db_query("SELECT e.eid, e.name, e.task, e.solution, e.ordering AS default_ordering, e.required AS default_required, e.precondition AS default_precondition, e.display AS default_display, e.description, ie.default_option, ie.required, ie.ordering, ie.precondition, ie.display
FROM {cs_exercises} AS e
LEFT JOIN {cs_intership_exercises} AS ie ON e.eid = ie.eid AND ie.nid = %d
WHERE e.eid = %d", $nid, $exerc_id));
$result = db_query("SELECT io.nid, io.oid, io.ordering, eo.name, eo.eid
FROM {cs_intership_options} AS io
LEFT JOIN {cs_exercise_options} AS eo ON io.oid = eo.oid AND nid = %d
WHERE eid = %d ORDER BY io.ordering, eo.name", $nid, $exerc_id);
break;
case 'class':
$exercise = db_fetch_object(db_query("SELECT e.eid, e.name, e.task, e.solution, e.ordering AS default_ordering, e.required AS default_required, e.precondition AS default_precondition, e.display AS default_display, e.description, ce.default_option, ce.required, ce.ordering, ce.precondition, ce.display
FROM {cs_exercises} AS e
LEFT JOIN {cs_class_exercises} AS ce ON e.eid = ce.eid AND ce.icid = '%s'
WHERE e.eid = %d", $nid, $exerc_id));
$result = db_query("SELECT co.icid, co.oid, co.ordering, eo.name, eo.eid
FROM {cs_class_exercise_options} AS co
LEFT JOIN {cs_exercise_options} AS eo ON co.oid = eo.oid AND co.icid = '%s'
WHERE eo.eid = %d
ORDER BY co.ordering, eo.name", $nid, $exerc_id);
break;
default:
$exercise = db_fetch_object(db_query("SELECT *
FROM {cs_exercises}
WHERE eid = %d", $exerc_id));
$result = db_query("SELECT *
FROM {cs_exercise_options}
WHERE eid = %d
ORDER BY ordering, name", $exerc_id);
break;
}
if (isset($exercise->default_ordering) && is_null($exercise->ordering))
{
$exercise->ordering = $exercise->default_ordering;
}
if (isset($exercise->default_required) && is_null($exercise->required))
{
$exercise->required = $exercise->default_required;
}
if (isset($exercise->default_precondition) && is_null($exercise->precondition))
{
$exercise->precondition = $exercise->default_precondition;
}
if (isset($exercise->default_display) && is_null($exercise->display))
{
$exercise->display = $exercise->default_display;
}
}
else
{
$exercise = db_fetch_object(db_query("SELECT *
FROM {cs_exercises}
WHERE eid = %d", $exerc_id));
$result = db_query("SELECT *
FROM {cs_exercise_options}
WHERE eid = %d
ORDER BY ordering, name", $exerc_id);
}
if ($exercise)
{
$exercise->options = array();
while ($option = db_fetch_object($result))
{
$exercise->options[$option->oid] = $option;
}
}
return $exercise;
}
?>
und
<?php
function cs_exercise_option_load($oid)
{
drupal_set_message('Option: '. $oid);
return db_fetch_object(db_query("SELECT *
FROM {cs_exercise_options}
WHERE oid = %d", $oid));
}
?>
Das Formular sieht dann so aus:
<?php
function cs_exercise_option_form($form_state, $exercise, $option = NULL)
{
// If we got a bunk exercise, kick out an error message.
if (empty($exercise))
{
drupal_set_message(t('There is no exercise with that ID.'), 'error');
drupal_goto('admin/cybernetics/exercises/manage');
}
if (!empty($option))
{
$form['oid'] = array
(
'#type' => 'hidden',
'#value' => $option->oid
);
drupal_set_title(t('Edit option: %name', array('%name' => $option->name)));
}
else
{
drupal_set_title(t('Options for %name', array('%name' => $exercise->name)));
}
$form['eid'] = array
(
'#type' => 'hidden',
'#value' => $exercise->eid,
);
$form['name'] = array
(
'#type' => 'textfield',
'#title' => t('Name'),
'#description' => t('This name will appear to groups on intership forms.'),
'#default_value' => $option->name,
'#required' => TRUE,
'#weight' => 0,
);
// Loading all implementations of the function hook_admin_display_features and add additonal features to the input field.
$cs_exerciseClass = new cs_exercise($exercise);
$cs_exerciseClass->additions['#printout'] = array('no_history');
$form['exercise'] = array
(
'#prefix' => '<div id="cs-exercise-solution-wrapper'. $cs_exerciseClass->eid .'" class="attach-wrapper">',
'#suffix' => '</div>',
$cs_exerciseClass->eid => $cs_exerciseClass->get_input('admin_display_features'),
);
$form['ordering'] = array
(
'#type' => 'weight',
'#title' => t('Order'),
'#description' => t('Options will be listed sorted by this value and then by their name.<br />May be overridden at the intership level.'),
'#default_value' => isset($option->ordering) ? $option->ordering : 0,
'#weight' => 4,
);
$form['submit'] = array
(
'#type' => 'submit',
'#value' => t('Submit'),
'#suffix' => l(t('Cancel'), 'admin/cybernetics/exercises/manage/'. $exercise->eid .'/options'),
'#weight' => 10,
);
return $form;
}
?>
Die Klasse "$cs_exerciseClass" und alle damit verbundenen Funktionen laufen einwandfrei, aber zum Testen wurde diese auch schon rausgenommen.
Ich wäre so unendlich dankbar, wenn der Fehler endlich gefunden werden würde und ich das Projekt demnöchst abschließen könnte um es der Community zur Verfügung zu stellen.
LG the-sandman
Maximale Pfadtiefe von 7?
am 18.09.2009 - 13:31 Uhr
Nach weiteren zahlreichen Stunden und Tagen der Fehlersuche habe ich eventuell die Ursache des Fehlers gefunden. Anhand folgender Quelle scheint mir nur eine Maximale Menü-Pfadtiefe von 7 Elementen möglich:
http://api.drupal.org/api/constant/MENU_MAX_PARTS/6
Gehe ich richtig in dieser Annahme bzw. kann mir jemand meine Vermutung bestätigen?
LG the-sandman
Soweit ich gelesen habe ist
am 18.09.2009 - 14:03 Uhr
Soweit ich gelesen habe ist die maximale Menütiefe 9.
Sorry, habe gerade Metütiefe und Pfad verwechselt.
Beste Grüße
Werner
maximale Pfadtiefe von 7!!!
am 18.09.2009 - 14:19 Uhr
Ich habe nun das Menü zu dem beschriebenen Problem entsprechend umgestellt und siehe da, es funktioniert auf einmal alles so, wie es soll...
Also ganz wichtig, Drupal 6.x hat eine maximale Pfadtiefe von 7!!!
LG the-sandman