it-swarm.com.de

Drupal unerwartet "Schwerwiegender Fehler: Der Klassenname muss auf jeder Seite ein gültiges Objekt oder eine Zeichenfolge [...] common.inc sein"

" Schwerwiegender Fehler : Der Klassenname muss ein gültiges Objekt oder eine Zeichenfolge in C:\xampp\htdocs\uc sein\include\common.inc on line 7506 "

Der obige Fehler trat unerwartet auf. Ich habe einem Inhaltstyp ein "Langtext" -Feld hinzugefügt, aber als ich erwartete, auf eine gespeicherte Feldkonfigurationsseite gebracht zu werden, wurde stattdessen auf jeder Seite ein schwerwiegender Fehler angezeigt.

Ich habe mir Includes\common.inc angesehen:

/**
 * Get the entity controller class for an entity type.
 */
function entity_get_controller($entity_type) {
  $controllers = &drupal_static(__FUNCTION__, array());
  if (!isset($controllers[$entity_type])) {
    $type_info = entity_get_info($entity_type);
    $class = $type_info['controller class'];
    $controllers[$entity_type] = new $class($entity_type); // Line 7506
  }
  return $controllers[$entity_type];
}

Ich verstehe jedoch nicht Drupal auf einer ausreichend niedrigen Ebene, um die Beziehungen zwischen diesen Variablen und Funktionen zu verstehen.

Ich habe auch Drupal nach Leuten mit einem ähnlichen Problem gesucht :

(1) Ich habe einen Benutzer gefunden der behauptet, dass ich das Submodul "Relation Endpoints Field" installieren muss, aber Drupal suche, es scheint kein solches Modul zu geben .

(2) Ein anderer Benutzer schlug vor, den Cache manuell zu löschen :

DELETE FROM cache;
DELETE FROM cache_filter;
DELETE FROM cache_menu;
DELETE FROM cache_page;
DELETE FROM watchdog;

(via WordPress API , irreführender Name, ich weiß.)

Das Löschen dieser Tabellen aus dem Cache hat nicht geholfen.

(3) Und ein anderer Benutzer schlug vor, alte Module zu deaktivieren, insbesondere das Modul "Alte Suchfacetten" . Da ich kein Modul finden kann, das sich speziell auf alte Suchfacetten bezieht, ging ich in die MySQL-Systemtabelle und markierte die Zeile des Suchmoduls mit dem Status 0, um anzuzeigen, dass das Laden des Moduls insgesamt gestoppt werden soll.

Unter demselben Link wie (3) schlug ein Benutzer vor, das Datenbanksuchmodul zu aktivieren. Daher löschte ich alle Tabellen, importierte die neueste stabile SQL-Datei und installierte das Modul, jedoch nach Neuerstellung des Problems ( versuchen, einem Inhaltstyp ein Feld hinzuzufügen), das ebenfalls fruchtlos endete.

Trotzdem bleibt das Problem bestehen

Der schwerwiegende Fehler wird auf jeder Seite angezeigt, sodass die Site nicht mehr funktioniert. Jede Hilfe oder Anweisung wäre sehr dankbar. Danke für's Nachsehen.

5
Morgan Delaney

Der Fehler bedeutet, dass Drupal die Entitätstypinformationen für eine Entität, die geladen werden soll, nicht finden kann.

Fügen Sie dort var_dump($entity_type); hinzu und laden Sie die Seite neu. Das letzte, das gedruckt werden soll (wenn es mehrere gibt), ist der Schuldige. Was Sie dann tun müssen, hängt vom Entitätstyp ab. Es kann beispielsweise sein, dass Sie ein Modul deaktiviert haben, das noch aufgerufen wird.

8
Berdir

Dieses Problem wurde sehr oft (ohne Reparatur) angesprochen und geschlossen (mehr als 50, die ich sehen kann). Zugegeben, es ist schwer zu finden. Ich habe das Problem eingegeben. Ich habe die eigentliche Ursache aufgespürt, aber die Feinheiten des Caches liegen etwas außerhalb meiner Möglichkeiten.

Das Löschen des Caches könnte hier helfen. Leider kann man nicht immer dorthin gelangen, vor allem, weil drush cc auch explodiert, wenn dieser Fehler auftritt. Dies gilt auch für den Zugriff auf einen Benutzer (in meinem Fall). . Es ist von Natur aus unangemessen, einen Benutzer zu verpflichten, den Cache jedes Mal zu löschen, wenn dies auftritt. Sie können einen Benutzer nicht dazu bringen, eine Problemumgehung als normalen Geschäftsverlauf durchzuführen.

Dies ist die Spitze des Eisbergs bei diesem Problem. (the PHP Schwerwiegender Fehler: Der Klassenname muss ein gültiges Objekt oder eine Zeichenfolge in /includes/common.inc in Zeile 7522 sein).

[[[[in 7.28, in Zeile 7855, 6 =]]] $ class = $ type_info ['controller class']; $ controller [$ entity_type] = neue $ class ($ entity_type);

Das Symptom tritt auf, weil die Suche nach dem Element ['Controller-Klasse'] als erfolgreich angenommen wird. Dies ist nicht der Fall, und es wird keine sekundäre Nachricht (z. B. bei einem Versuch/Fang oder einem tatsächlichen Test hier) generiert.

Das Problem ist darauf zurückzuführen, dass aus irgendeinem Grund kein $ class-Wert aus dem $ type_info-Array abgerufen werden kann, indem module_invoke_all ('entity_info') ausgeführt wird. Sicherlich könnte eine Anrufzeit, die als Referenz vergeht, dies tun, aber das würde normalerweise abgefangen werden. Das eigentliche Problem ist in /includes/common.inc bei 7644.

      if (empty($entity_info)) {
        if ($cache = cache_get("entity_info:$langcode")) {
          $entity_info = $cache->data;
        }
        else {
          $entity_info = module_invoke_all('entity_info');
          // Merge in default values.
          foreach ($entity_info as $name => $data) {
            $entity_info[$name] += array(
              'fieldable' => FALSE,
              'controller class' => 'DrupalDefaultEntityController',
              'static cache' => TRUE,
              'field cache' => TRUE,
              'load hook' => $name . '_load',
              'bundles' => array(),
              'view modes' => array(),
              'entity keys' => array(),
              'translation' => array(),
            );
            $entity_info[$name]['entity keys'] += array(
              'revision' => '',
              'bundle' => '',
            );
            foreach ($entity_info[$name]['view modes'] as $view_mode => $view_mode_info) {
              $entity_info[$name]['view modes'][$view_mode] += array(
                'custom settings' => FALSE,
              );
            }
            // If no bundle key is provided, assume a single bundle, named after
            // the entity type.
            if (empty($entity_info[$name]['entity keys']['bundle']) && empty($entity_info[$name]['bundles'])) {
              $entity_info[$name]['bundles'] = array($name => array('label' => $entity_info[$name]['label']));
            }
            // Prepare entity schema fields SQL info for
            // DrupalEntityControllerInterface::buildQuery().
            if (isset($entity_info[$name]['base table'])) {
              $entity_info[$name]['schema_fields_sql']['base table'] = drupal_schema_fields_sql($entity_info[$name]['base table']);
              if (isset($entity_info[$name]['revision table'])) {
                $entity_info[$name]['schema_fields_sql']['revision table'] = drupal_schema_fields_sql($entity_info[$name]['revision table']);
              }
            }
          }
          // Let other modules alter the entity info.
          drupal_alter('entity_info', $entity_info);
          cache_set("entity_info:$langcode", $entity_info);
        }
      }

Beachten Sie, dass wenn die Bedingung im if at wahr ist

if ($cache = cache_get("entity_info:$langcode")) {
  $entity_info = $cache->data;
}

dann wird das module_invoke_all ('entity_info') niemals ausgeführt. Es kommt einfach vor, dass die Bedingung immer erfüllt ist, nachdem eine andere Verarbeitung zum Erstellen des Caches durchgeführt wurde. Das bedeutet, dass es keine Möglichkeit gibt, die entity_info einzurichten. In meinem Fall gab es keine Möglichkeit, die Entitätsinformationen des Benutzers abzurufen, was den oben genannten ursprünglichen Fehler verursachte. Ich habe das 'else' zum Testen um eine Stufe höher gemacht (das 'else {}' herausgenommen), und alles hat so funktioniert, wie es sollte, um den Fehler zu beheben.

Ich glaube, dass der eigentliche Fehler darin besteht, dass die Überprüfung des Caches nicht ausreichend ist und dass eine Überprüfung der Existenz der entity_info über die bestimmte zu suchende Entität erforderlich ist. Tatsächlich kann es gerechtfertigt sein, auch in der im Cache gespeicherten entity_info nach dem Element ['controller class'] für diese Entität zu suchen. D.

1
dvand

Ich fühlte mich dumm, nachdem ich einen Tag damit verbracht hatte, zwei Tippfehler zu finden, aber wenn das jemandem hilft ..

Ich habe ein benutzerdefiniertes Modul, das einen neuen feldfähigen Entitätstyp mit Bundles erstellt: Ich habe Word 'entity' als letztes Word im Namen meines Moduls verwendet und später das Suchen und Ersetzen verwendet, um Folgendes zu ändern: module_name_entity in module_name.

Aus diesem Grund wurden einige Hook_entity_property_info () und hook_entity_info () jetzt aufgerufen: module_name_property_info () und module_name_info () ohne den Entitätsteil des Hooks im Funktionsnamen.

Dies führte dazu, dass common.inc die Entitätsinformationen nicht fand und diesen Fehler für mich verursachte.

0
pintoflager