it-swarm.com.de

Konvertierung von Array in String in DrupalDefaultEntityController-> cacheGet ()

Ich habe einen Inhaltstyp mit einem mehrwertigen Taxonomiefeld. Wenn ich ein neues Element erstelle und mehrere Werte auswähle, wird der folgende Fehler angezeigt:

Konvertierung von Array in Zeichenfolge in DrupalDefaultEntityController-> cacheGet () (Zeile 369 von /path/to/drupal/installation/includes/entity.inc).

Die Werte werden gespeichert und alles scheint zu funktionieren, aber es ist etwas ablenkend, wenn dieser Fehler jedes Mal auftritt, insbesondere für das Büropersonal, das die Daten tatsächlich eingibt.

Warum passiert das?

4
Robbert

Es gibt bereits eine sehr schnelle Lösung, die einige Wochen später nach der Antwort von IntegrityFirst veröffentlicht wurde.

Siehe https://drupal.org/comment/7812787#comment-7812787 und diesen Patch: https://drupal.org/files/drupal7.entity-system.1525176-104 .patch (danke an Molot für den Link zum Core Bug Thread).

Es stellt sich heraus, dass es eine Funktion in Drupal Core gibt, die mehrdimensionale Array-Diff unterstützt, die diesen Fehler verursachen, aber es ist nur so dort nicht verwendet.

Fix ist also, array_diff_assoc (nicht rekursiv) mit drupal_array_diff_assoc_recursive (rekursiv, wie es von seinem Namen kommt) in Zeile 364 von includes/entity.inc (sehen DrupalDefaultEntityController::cacheGet wenn die Zeilennummer unterschiedlich ist oder wenn der Patch fehlschlägt).

9
iamweird

Problem :

Seit PHP 5.4) wird dieser Hinweis angezeigt, wenn ein Array als Zeichenfolge "Array" verglichen wird. Das Problem liegt in der Datei include/entity.inc in der Methode cacheGet, die Elemente aus einem statischen Cache sammelt.

In Zeile 369 wird array_assoc_diff verwendet, das die Array-Indizes und -Werte vergleicht und die Differenz der beiden Arrays zurückgibt. Leider geschieht dies nicht rekursiv. Wenn es sich um ein mehrdimensionales Array handelt, wird "Array" als Zeichenfolge verwendet und mit dem anderen Array verglichen. Dies führt dazu, dass die Benachrichtigung erfolgt.

Es scheint, dass der Code fehlerhaft ist und nicht die richtige Funktion ausführt, um ein bestimmtes Element aus dem Cache zu erhalten.

Erste Lösung :

Die erste Lösung, die ich zur Behebung dieses Problems gefunden habe, bestand darin, jedes Element der Bedingung zu durchlaufen und mithilfe des Schlüssels der Bedingungen zu überprüfen, ob der Entitätswert für dieses Schlüssel-Isset vorliegt. Wenn es nicht eingestellt ist, gibt es einen Unterschied. Dies würde bedeuten, dass die Entitäten mit diesem Schlüssel nicht festgelegt werden. Ich mag es nicht, verschachtelte foreach-Schleifen zu verwenden, obwohl dies für mich die unmittelbarste Lösung zur Lösung des Problems war.

Das Update bestand darin, die Zeilen 369 bis 371 zu ersetzen:

if (array_diff_assoc($conditions, $entity_values)) {
  unset($entities[$entity->{$this->idKey}]);
}

Mit diesem Code:

foreach ($conditions as $key=>$values) {
    if (!isset($entities[$key])) {
        unset($entities[$entity->{$this->idKey}]);
    }
    elseif ($conditions[$key] !== $entity_values[$key])
    {
        unset($entities[$entity->{$this->idKey}]);
    }
}

Zweite Lösung :

Ein zweiter Gedanke, den ich hatte, ist das Hinzufügen einer neuen Funktion, die eine ähnliche Funktionalität wie die PHP-Funktion array_diff_assoc hat, außer dass der Vergleich rekursiv durchgeführt wird. Beim Durchblättern des Online-Handbuchs PHP habe ich eine Funktion gefunden, die dies erreichen würde).

Platziere dies oben auf entity.inc nach dem Öffnen der PHP-Tags:

function array_diff_assoc_recursive($array1, $array2) {
    $difference=array();
    foreach($array1 as $key => $value) {
        if( is_array($value) ) {
            if( !isset($array2[$key]) || !is_array($array2[$key]) ) {
                $difference[$key] = $value;
            } else {
                $new_diff = array_diff_assoc_recursive($value, $array2[$key]);
                if( !empty($new_diff) )
                    $difference[$key] = $new_diff;
            }
        } else if( !array_key_exists($key,$array2) || $array2[$key] !== $value )     {
            $difference[$key] = $value;
        }
    }
    return $difference;
}

Ersetzen Sie das, was Sie in Zeile 369 sehen, aus:

if (array_diff_assoc($entity_values, $conditions)) {

Mit diesem Code:

if (array_diff_assoc_recursive($entity_values, $conditions)) {
5
BrightIntelDusk