Contao-Camp 2024
Ergebnis 1 bis 4 von 4

Thema: PageModel::findAll(), unterschiedliche Ausgaben

  1. #1
    Contao-Nutzer
    Registriert seit
    27.09.2017.
    Beiträge
    4

    Standard PageModel::findAll(), unterschiedliche Ausgaben

    Man teste folgenden PHP Code:

    PHP-Code:
    $pages PageModel::findAll();

    foreach (
    $pages as $page
    {
        
    print_r($page);
        echo 
    "<br></br>";

    Ausgabe in templates/test.php:

    ...
    Contao\PageModel Object ( [blnDetailsLoadedrotected] => [arrDatarotected] => Array ( [id] => 2 [pid] => 1 [sorting] => 64 [tstamp] => 1506779582 [title] => Docs [alias] => docs [type] => regular [pageTitle] => [language] => [robots] => index,follow [description] => [redirect] => permanent [jumpTo] => 0 [url] => [target] => [dns] => [staticFiles] => [staticPlugins] => [fallback] => [adminEmail] => [dateFormat] => [timeFormat] => [datimFormat] => [createSitemap] => [sitemapName] => [useSSL] => [autoforward] => [protected] => [groups] => [includeLayout] => [layout] => 0 [mobileLayout] => 0 [includeCache] => [cache] => 0 [includeChmod] => [cuser] => 0 [cgroup] => 0 [chmod] => a:9:{i:0;s:2:"u1";i:1;s:2:"u2";i:2;s:2:"u3";i:3;s: 2:"u4";i:4;s:2:"u5";i:5;s:2:"u6";i:6;s:2:"g4";i:7; s:2:"g5";i:8;s:2:"g6";} [noSearch] => [cssClass] => [sitemap] => map_default [hide] => [guests] => [tabindex] => 0 [accesskey] => [published] => 1 [start] => [stop] => [isBoxed] => 1

    [subpages] => 7 [mainAlias] => docs [mainTitle] => Docs [mainPageTitle] => Docs [parentAlias] => startpunkt [parentTitle] => Startpunkt [parentPageTitle] => Startpunkt [folderUrl] => [rootId] => 1 [rootAlias] => startpunkt [rootTitle] => Startpunkt [rootPageTitle] => Startpunkt [domain] => [rootLanguage] => de [rootIsPublic] => 1 [rootIsFallback] => 1 [rootUseSSL] => [rootFallbackLanguage] => de [trail] => Array ( [0] => 1 [1] => 2 ) )

    (Dieser Teil fehlt unten)

    [arrModifiedrotected] => Array ( ) [arrRelationsrotected] => Array ( [jumpTo] => Array ( [table] => tl_page [field] => id [type] => hasOne [load] => lazy ) [groups] => Array ( [table] => tl_member_group [field] => id [type] => hasMany [load] => lazy ) [layout] => Array ( [table] => tl_layout [field] => id [type] => hasOne [load] => lazy ) [mobileLayout] => Array ( [table] => tl_layout [field] => id [type] => hasOne [load] => lazy ) [cuser] => Array ( [table] => tl_user [field] => id [type] => hasOne [load] => lazy ) [cgroup] => Array ( [table] => tl_user_group [field] => id [type] => hasOne [load] => lazy ) ) [arrRelatedrotected] => Array ( ) [blnPreventSavingrotected] => )
    ...

    und in system/modules/my_modul/dca/tl_my_table.php :

    PHP-Code:
    $GLOBALS['TL_DCA']['tl_my_modul']['fields']['my_field'] = array
    (
        ...
        
    'options_callback' => array('tl_my_table''getPages')
        ...
    );

    class 
    tl_my_table extends Backend 
    {
        public function 
    getPages()
        {
            
    // obige foreach-Schleife
        
    }

    gibt es folgende Ausgabe:

    ...
    Contao\PageModel Object ( [blnDetailsLoadedrotected] => [arrDatarotected] => Array ( [id] => 2 [pid] => 1 [sorting] => 64 [tstamp] => 1506779582 [title] => Docs [alias] => docs [type] => regular [pageTitle] => [language] => [robots] => index,follow [description] => [redirect] => permanent [jumpTo] => 0 [url] => [target] => [dns] => [staticFiles] => [staticPlugins] => [fallback] => [adminEmail] => [dateFormat] => [timeFormat] => [datimFormat] => [createSitemap] => [sitemapName] => [useSSL] => [autoforward] => [protected] => [groups] => [includeLayout] => [layout] => 0 [mobileLayout] => 0 [includeCache] => [cache] => 0 [includeChmod] => [cuser] => 0 [cgroup] => 0 [chmod] => a:9:{i:0;s:2:"u1";i:1;s:2:"u2";i:2;s:2:"u3";i:3;s: 2:"u4";i:4;s:2:"u5";i:5;s:2:"u6";i:6;s:2:"g4";i:7; s:2:"g5";i:8;s:2:"g6";} [noSearch] => [cssClass] => [sitemap] => map_default [hide] => [guests] => [tabindex] => 0 [accesskey] => [published] => 1 [start] => [stop] => [isBoxed] => 1 )

    Hier fehlt ein Teil, beginnend mit subpages

    [arrModifiedrotected] => Array ( ) [arrRelationsrotected] => Array ( [jumpTo] => Array ( [table] => tl_page [field] => id [type] => hasOne [load] => lazy ) [groups] => Array ( [table] => tl_member_group [field] => id [type] => hasMany [load] => lazy ) [layout] => Array ( [table] => tl_layout [field] => id [type] => hasOne [load] => lazy ) [mobileLayout] => Array ( [table] => tl_layout [field] => id [type] => hasOne [load] => lazy ) [cuser] => Array ( [table] => tl_user [field] => id [type] => hasOne [load] => lazy ) [cgroup] => Array ( [table] => tl_user_group [field] => id [type] => hasOne [load] => lazy ) ) [arrRelatedrotected] => Array ( ) [blnPreventSavingrotected] => )
    ...

    Warum fehlt der Teil mit den subpages in tl_my_modul?
    Geändert von Went (02.10.2017 um 10:15 Uhr)

  2. #2
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.942

    Standard

    Ich denke, wegen fehlendem "eager-loading": Probier doch mal

    PHP-Code:
    $pages PageModel::findAll(['eager'=>true]); 
    Disclaimer: ungetestet
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  3. #3
    Contao-Nutzer
    Registriert seit
    27.09.2017.
    Beiträge
    4

    Standard

    Es bleibt unveränderlich! Hast du eine weitere Idee?

  4. #4
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.467
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    Das liegt daran, dass das PageModel ein...naja, sagen wir etwas spezielles Model ist :-)
    Per Definition ist ein Model eigentlich ein dummer Datenbehälter, ein sog. PoPo (Plain Old PHP Object) ;-)

    Das PageModel ist aber etwas speziell, weil durch den Aufruf von $pageModel->loadDetails(); noch andere Daten (alles was bei dir fett hervorgehoben ist) nachgeladen wird.
    Nachgeladen deshalb, weil diese Dinge vererbbar sind und somit bis nach oben rekursiv durchgesucht werden müssen. Das ist ein aufwändiger Prozess und du solltest ihn deshalb nur vornehmen, wenn du die Daten wirklich brauchst.

    Also in deiner foreach-Schleife einfach noch loadDetails() aufrufen auf jedem Model. Keine Sorge, Mehrfachaufrufe werden ignoriert, du musst also nicht prüfen ob sie schon da sind.

    Der Unterschied, warum die Daten beim einen Model schon da sind und beim andern nicht, liegt in der Model Registry. Sie speichert sich eine Kopie im Memory für jedes eindeutig (via ID) identifizierbare Model, damit die Datenbank nicht unnötig oft angefragt wird, wenn du z.B. PageModel::findByPk(42) zig mal nacheinander aufrufst, aber auch um die Integrität sicherzustellen (wenn z.B. zwei Extensions sich das gleiche Model holen und dann da drauf was ändern und ->save() aufrufen, dürfen sie einander nicht überschreiben).
    Kurz: Irgendjemand hat bevor dein Dump kommt bereits loadDetails() auf dem Model mit der ID 2 gemacht.

    Alles klar?

    Und bevor jemand fragt: Ja, das ist software-architektonisch völlig falsch. :P
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •