Ce node_type_get_types() returns este o matrice asociativă de obiecte de tip nod, tastate de tip. Descrierea valorii returnate este mai de înțeles în _node_types_build() documentație.
Implementarea hook realizată dintr-un modul de bază Drupal, de exemplu comment_forms(), ajută la înțelegerea codului corect.
function comment_forms() {
$forms = array();
foreach (node_type_get_types() ca $tip) {
$forms["comment_node_{$type->type}_form"]['callback'] = 'comment_form';
}
returnează $formulare;
}
În cazul dvs., codul ar trebui să fie similar cu următorul.
function my_dossier_forms($form_id, $args) {
$forms = array();
foreach (node_type_get_types() ca $tip) {
$forms["my_dossier_node_{$type->type}_form"]['callback'] = 'my_dossier_form';
}
returnează $formulare;
}
Acest cod nu este mult diferit de codul afișat în întrebare și nu ar provoca, singur, clasa „my_dossier_form” nu a fost găsită eroare.
The linia 844 este urmatoarea.
$form = call_user_func_array(isset($callback) ? $callback: $form_id, $args);
$callback este inițializată din următorul cod.
dacă (!isset($forms) || !isset($forms[$form_id])) {
$forms = module_invoke_all('forms', $form_id, $args);
}
$form_definition = $forms[$form_id];
if (isset($form_definition['argumente callback'])) {
$args = array_merge($form_definition['argumente callback'], $args);
}
if (isset($form_definition['callback'])) {
$callback = $form_definition['callback'];
$form_state['build_info']['base_form_id'] = isset($form_definition['base_form_id']) ? $form_definition['base_form_id'] : $callback;
}
Linia 844 nu putea gândi formularul_dosarului_meu este o clasă, cu excepția cazului $callback conține o matrice ca array('my_dossier_form', 'mymodule_form');, sau conține un șir ca „my_dossier_form::methodName”.
Avertismentele despre conversia matrice în șir înseamnă că Drupal primește o matrice atunci când așteaptă un șir, de exemplu de la următoarea linie (linia 1094).
elseif (isset($form_state['build_info']['base_form_id']) && function_exists($form_state['build_info']['base_form_id'] . '_validate')) {
Aș evita doar returnarea unui ID de formular care începe cu $type deoarece acest lucru creează probabil conflicte cu implementarea altor module hook_forms(), care se așteaptă să returneze fiecare un ID de formular unic. Vedea module_invoke_all() pentru a înțelege ce se întâmplă când doi hook_forms() implementările returnează informații pentru același ID de formular.
foreach (module_implements($hook) ca $modul) {
$funcție = $modul . '_' . $cârlig;
dacă (funcție_există($funcție)) {
$rezultat = call_user_func_array($funcție, $args);
// În cazul hook_forms(), $result conține o matrice.
if (isset($rezultat) && is_array($rezultat)) {
$retur = array_merge_recursive($retur, $rezultat);
}
elseif (isset($rezultat)) {
$return[] = $rezultat;
}
}
}
Pentru a fi mai exact, două module care returnează valori pentru același ID de formular ar putea cauza cel puțin call_user_func_array() se așteaptă ca parametrul 1 să fie un callback valid, clasa „[callback]” nu a fost găsită când ambii setează valoarea pentru același apel invers. Vedeți rezultatul următorului cod, pentru a înțelege ce se întâmplă exact.
$return["type_node_form"]["callback"] = "my_dossier_form";
$result["type_node_form"]["callback"] = "mymodule_form";
print_r(array_merge_recursive($return, $result));
The sună din nou value devine o matrice de două șiruri de caractere, care call_user_func_array() interpretează ca o matrice care conține un nume de clasă și un nume de metodă.
Matrice
(
[type_node_form] => Matrice
(
[callback] => Matrice
(
[0] => formularul_dosarului_meu
[1] => mymodule_form
)
)
)
În acest caz, conflictul este cu modulul Node, care folosește următorul cod pentru este hook_forms() implementare.
funcția node_forms() {
$forms = array();
if ($tipuri = node_type_get_types()) {
foreach (array_keys($tipuri) ca $tip) {
$forms[$tip . '_node_form']['callback'] = 'node_form';
}
}
returnează $formulare;
Ca o notă secundară, hook_forms() scopul este furnizarea aceluiași generator de formulare pentru un grup de formulare al căror ID urmează o schemă, cum ar fi în cazul formularelor de editare a comentariilor, ale căror ID-uri sunt comentariu_nod_[tip de nod]_form. Când este furnizat, callback-ul generatorului de formulare (promis ca sună din nou valoare) ar trebui să construiască forma completă, nu o parte a acesteia.
Faptul formularul_dosarului() creează doar un buton de trimitere și formularele_dosarului_meu() folosește același cod folosit de node_forms() mă face să cred că scopul codului este modificarea formelor de editare a nodurilor, care ar trebui realizată prin implementare hook_form_BASE_FORM_ID_alter(). Cu asta face modulul Carte book_form_node_form_alter(), care este invocat pentru forma de editare a nodului pentru fiecare tip de conținut.
funcția book_form_node_form_alter(&$form, &$form_state, $form_id) {
$nod = $form['#nod'];
$access = user_access('administrarea schițelor cărții');
dacă (!$acces) {
if (user_access('adăugați conținut la cărți') && (!empty($node->book['mlid']) && !empty($node->nid) || book_type_is_allowed($node->type))) {
// Deja în ierarhia cărții, sau acest tip de nod este permis.
$acces = TRUE;
}
}
dacă ($acces) {
_book_add_form_elements($form, $form_state, $node);
// Deoarece meniul drop-down „Carte” nu poate declanșa trimiterea unui formular când
// JavaScript este dezactivat, adăugați un buton de trimitere pentru a face asta. book.css ascunde
// acest buton când JavaScript este activat.
$form['carte']['pick-book'] = matrice(
'#type' => 'trimite',
'#value' => t('Schimbați cartea (actualizați lista părinților)'),
'#submit' => matrice(
„book_pick_book_nojs_submit”,
),
'#weight' => 20,
);
}
}
Dacă atunci cârligul trebuie să folosească numele tipului de conținut, acesta este disponibil în $form['#node']->type.