Puncte:0

hook_forms() nu funcționează

drapel br

Încerc să adaug un buton la toate formularele de noduri prin apel invers în hook_forms. Primesc o eroare similară. Poate cineva să ajute.

Avertisment: call_user_func_array() se așteaptă ca parametrul 1 să fie un callback valid, clasa „my_dossier_form” negăsită în drupal_retrieve_form() (linia 844 din /var/www/includes/form.inc).
Notă: conversie matrice în șir în drupal_prepare_form() (linia 1094 din /var/www/includes/form.inc).
Notă: conversie matrice în șir în drupal_prepare_form() (linia 1108 din /var/www/includes/form.inc).
Notă: conversie matrice în șir în drupal_prepare_form() (linia 1128 din /var/www/includes/form.inc).

Cod

function my_dossier_forms($form_id, $args) {
  $forms = array();
  if ($tipuri = node_type_get_types()) {
    foreach (array_keys($tipuri) ca $tip) {
      $forms[$tip . '_node_form']['callback'] = 'my_dossier_form';
    }
  }

  returnează $formulare;
}

function my_dossier_form($form, &$form_state) {
  $form['delete'] = matrice(
    '#type' => 'trimite',
    '#value' => t('Șterge'),
    '#weight' => 10,
  );
  returnează $form;
}
beltouche avatar
drapel cn
Sigur nu vrei `hook_form_alter`?
Павел Герасюта avatar
drapel br
Conform sarcinii, trebuie să folosesc hook_forms în mod specific.
Jaypan avatar
drapel de
Codul tău pare ok, dar nu găsește `my_dossier_form()`. În ce fișier este această funcție? Poate fi necesar să-l includeți în mod explicit.
Павел Герасюта avatar
drapel br
În fișierul my_dossier.module.
Павел Герасюта avatar
drapel br
Mă gândeam să folosesc module_load_include
apaderno avatar
drapel us
@beltouche Sunt de acord. Generatorul de formulare setat cu `hook_forms()` (a.k.a. valoarea *callback*) ar trebui să creeze formularul complet, nu doar un buton de trimitere. Se pare că sarcina OP este modificarea formelor de editare a nodurilor, pentru care `hook_form_BASE_FORM_ID()` este cârligul de implementat.
Puncte:1
drapel us

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.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.