Undefined array key obwohl vorhanden

  • Hallo,

    ich stecke gerade mehr oder weniger an einem Fehler fest, welchen ich nicht nachvollziehen kann. Vielleicht kann sich jemand ja etwas darunter vorstellen.

    Ausgangssituation: Ich erweitere das Lexikon von VieCode. In dem Lexikon wird bei Einträgen das Array "moduleList" in der EntryPage.class.php in das Template gerendert und beinhaltet alle Module (Unterseiten) zu diesem Eintrag.

    Ich manipuliere das Array $this->moduleList (BEVOR es ins Template gerendet wird) über ein EventListener auf assignVariables. Unter gegebenen Umständen möchte ich nämlich nicht, dass der Benutzer eine bestimme Unterseite sieht und entferne diese vor dem Rendern aus dem Array.

    Der Code sieht wie folgt aus (gekürzt):

    Jetzt ist es so, dass ich bei einigen Lexikon Einträgen beim Aufruf folgende Fehlermeldung bekomme und bei anderen Einträgen funktioniert alles wunderbar und die Unterseite wird nicht angezeigt. Datenbanktechnisch sind alle Einträge gleich, es gibt keine Unterschiede im Inhalt.

    Ich habe natürlich erst einmal überprüft ob es den Key 85 ggf. wirklich nicht gibt. Der Key ist in dem Lexikon-Eintrag aber definitiv vorhanden (sonst würde er ja auch nicht durch die foreach-Schleife ausgegeben werden).

    Ich kann den Fehler nicht mehr nachvollziehen - auch wenn er erst einmal recht trivial zu beheben erscheint. Im Template werden auch lediglich die Unterseiten ausgegeben, welche ins Template gerendert wurden. Somit wird auch im Template nicht explizit auf irgendeinen Key zugegriffen.

    Ich teste weiter, aber vielleicht weiß ja jemand eine Lösung oder hatte so etwas ähnliches schonmal.


    Grüße,

    JAY

    • Offizieller Beitrag

    Hallo,

    Hilfe, warum ist die ->objects-Eigenschaft einer DatabaseObjectList public ;(.

    Ein schreibender Zugriff auf ->objects und zugehörige Eigenschaften ist effektiv undefiniert, die DatabaseObjectLists sind darauf nicht ausgelegt und wenn ich den Code neu machen könnte, dann wären die Eigenschaften auch protected statt public.

    Ganz konkret fällt dir hier vermutlich auf die Füße, dass du durch die Löschung des Wertes dafür sorgst, dass indexToObject ungültige Daten enthält.

  • Hallo,

    danke für deine Antwort.

    Hilfe, warum ist die ->objects-Eigenschaft einer DatabaseObjectList public ;( .

    Vielleicht vertu ich mich jetzt, aber die ->objects der DatabaseObjectList sind protected. Siehe z. B.:

    wcfDebug($page->moduleList):

    Ich manipuliere hier keine Werte der ->objects, sondern entferne (unset) lediglich einige objects aus dem Array ($this->moduleList), welches in der EntryPage.class.php public ist.

    Ist das o.g. Verhalten von mir fehlerhaft?

    Ganz konkret fällt dir hier vermutlich auf die Füße, dass du durch die Löschung des Wertes dafür sorgst, dass indexToObject ungültige Daten enthält.

    Ist diese Aussage nach meiner Erläuterung immer noch valide?

    • Offizieller Beitrag

    Hallo,

    Vielleicht vertu ich mich jetzt, aber die ->objects der DatabaseObjectList sind protected. Siehe z. B.:

    Du verwechselst das. Es gibt mir um die ->objects-Property an sich und nicht um den Inhalt des Arrays.

    Ich manipuliere hier keine Werte der ->objects, sondern entferne (unset) lediglich einige objects aus dem Array ($this->moduleList), welches in der EntryPage.class.php public ist.

    moduleList ist kein Array. Das ist eine DatabaseObjectList. Im ersten Beitrag hatte ich's vermutet. Hier habe ich es jetzt aber tatsächlich nachgesehen.

    Ist das o.g. Verhalten von mir fehlerhaft?

    Ja.

    Ist diese Aussage nach meiner Erläuterung immer noch valide?

    Ja.

  • Hallo,

    danke. Das bedeutet effektiv gibt es keine saubere Möglichkeit über einen EventListener die moduleList zu ändern? Oder würdest du dies ggf. irgendwie anders lösen?

    Wundern tut mich aber immer noch, weshalb es bei einige Einträgen klappt und bei anderen hingegen wieder nicht.

    Grüße

    • Offizieller Beitrag

    Hallo,

    danke. Das bedeutet effektiv gibt es keine saubere Möglichkeit über einen EventListener die moduleList zu ändern? Oder würdest du dies ggf. irgendwie anders lösen?

    Ich bin nicht ausreichend mit dem Code des Lexikons vertraut um die Frage zu beantworten.

    Wundern tut mich aber immer noch, weshalb es bei einige Einträgen klappt und bei anderen hingegen wieder nicht.

    Das ist das schöne an undefiniertem Verhalten :)

  • Hallo Tim Düsterhus,

    du hast mir erst einmal weitergeholfen - danke dafür.

    Ich sehe hier spontan jetzt nur die Möglichkeit im Event assignVariables folgendes zu machen und im conditionBuilder einfach weiter einzugrenzen und da bereits die Überprüfung zu machen, ob der Benutzer die Untereseite sehen darf. Dann würde die moduleList überschrieben und wird von "außen" nicht mehr angefasst.

    Im Event assignVariables:

    Code
            if ($page->entry->modules) {
                $page->moduleList = new EntryModuleList();
                $page->moduleList->getConditionBuilder()->add('entryID = ?', [$this->entryID]);
                $page->moduleList->sqlOrderBy = 'sortOrder ASC';
                $page->moduleList->readObjects();
            }

    Das sollte das Problem doch theoretisch lösen?

    Grüße,

    JAY

  • Hallo,

    das sieht zumindest nicht offensichtlich falsch aus. Ich kann allerdings auch nicht sagen, ob es richtig ist. Dazu am besten Rücksprache mit VieCode halten.

    Danke, das reicht mir vorerst - das sollte klappen, weil $this->moduleList dann überschrieben wird. Ich hätte mich weiterhin dämlich gesucht ^^ Nochmals danke!

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!