Ergebnis 1 bis 28 von 28

Thema: [Entwicklerfrage] Auf aktuelles Meta Model (via auto_item) zugreifen

  1. #1
    Contao-Nutzer
    Registriert seit
    17.10.2014.
    Beiträge
    72

    Frage [Entwicklerfrage] Auf aktuelles Meta Model (via auto_item) zugreifen

    Hallo,

    ich entwickle gerade eine Erweiterung welche auf https://github.com/MetaModels/attrib...mment-56252142 basiert.

    ich möchte gerne im Event-Observer ermitteln welches Meta Model gerade auf der Seite eingeblendet ist.

    Konkret geht es um diese Zeile: https://github.com/iMi-digital/imi_m...server.php#L29

    Hat jemand dazu einen Ansatz?

    Grüße,

    Alexander
    Geändert von s3lf (12.06.2015 um 14:01 Uhr)

  2. #2
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.717
    User beschenken
    Wunschliste

    Standard

    PHP-Code:
    $metaModel = \MetaModels\Factory::byTableName('mm_landingpages'); 
    verstehe ich das richtig? Du möchtest statt "mm_landingpages" eine Variable, die sich aus dem MM speist, dessen Listing-Modul in einer FE-Seite eingebunden ist...

  3. #3
    Contao-Nutzer
    Registriert seit
    17.10.2014.
    Beiträge
    72

    Standard

    Exakt.

    Das sauberste was mir eingefallen ist, wäre es in tl_page ein Setting einzufügen "Metamodel für Language Switcher".

    Aber automatisch wäre es schöner. Kann ein auto_item auch von mehreren Modulen konsumiert werden?

    Wenn das in der Praxis vorkommt, wäre die o.g. Lösung ja die einzig richtige.

  4. #4
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.717
    User beschenken
    Wunschliste

    Standard

    mal überlegen...

    wir haben doch folgende Hierarchie:

    Seite > Artikel > Inhaltselement MM_Listing > MM_nn + Filter + Template(s)

    (beim FE-Modul nicht viel anders)

    während des Aufrufs zündet $GLOBALS['TL_HOOKS']['translateUrlParameters'][] - bei jedem MM-Aufruf

    ... ist die Frage, ob sich über das Inhaltselement das MM nicht in die globalen Variablen einschreibt $objPage oder $GLOBALS...

  5. #5
    Contao-Nutzer
    Registriert seit
    05.10.2012.
    Beiträge
    213

    Standard

    Bist du schon weitergekommen damit? Ich hab mir das aus Interesse mal angesehen, aber weder in objPage noch in den globals was gefunden.

    Dann dachte ich zuerst, dass es über Events gehen könnte, habe aber nichts passendes gefunden, das rechtzeitig ausgelöst wird und das Model liefert.

    Ich hab dann mal diese Funktion geschrieben, die dir die Namen der eingebundenen Metamodels als Array zurückgibt.

    Ist nicht besonders elegant geschrieben oder sorgfältig getestet, von daher Vorsicht - eher als proof of concept gedacht Lässt sich bestimmt eleganter lösen.
    Es wird bisher überhaupt nicht darauf getestet, ob die Models den auto_item-Parameter verwenden. Das wär natürlich notwendig. Dazu müsste man die Filter direkt überprüfen - die PID (=MetaModel) hast du ja jetzt.

    Wenn man Module oder Artikel mit Liste per insert-Tag einsetzt, wird es wahrscheinlich auch nicht funktionieren - das hab ich aber nicht getestet.

    PHP-Code:
        private function getCurrentMetamodel() {
            global 
    $objPage;
        
            
    $curModel = [];

            
    $layout = \LayoutModel::findByPk($objPage->layout);
            
    $modules unserialize($layout->modules);

            foreach (
    $modules as $module) {
                
    $objModule = ( \ModuleModel::findByPk($module['mod'] ));
                if (
    $objModule->metamodel_layout) {
                    
    $factory = \MetaModels\Factory::getDefaultFactory();
                    
    $modelName $factory->translateIdToMetaModelName($objModule->metamodel);
                    if (
    $modelName$curModel[] = $modelName;
                };
            }

            
    $sections = \Controller::getPageSections();
            foreach (
    $sections as $section) {
                
    $objArticles = \ArticleModel::findPublishedByPidAndColumn($objPage->id"main");
                if (
    $objArticles) {
                    foreach(
    $objArticles as $article ) {
                        
    $contents = \ContentModel::findPublishedByPidAndTable($article->id"tl_article");
                        if (
    $contents) {
                            foreach( 
    $contents as $content ) {
                                
    $factory = \MetaModels\Factory::getDefaultFactory();
                                
    $modelName $factory->translateIdToMetaModelName($content->metamodel);
                                if (
    $modelName$curModel[] = $modelName;
                            };
                        }
                    }
                };
            }
            return 
    array_unique($curModel);
        } 

    /Edit: Ja, auto_item in mehreren Models geht - deshalb gibt's im Moment ein Array zurück. Die Frage ist, inwiefern der Fall in der Praxis wirklich vorkommt - beide Models würden dann ja die gleichen Werte im alias benötigen.
    Geändert von pju (14.06.2015 um 23:59 Uhr)

  6. #6
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.717
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von pju Beitrag anzeigen
    Bist du schon weitergekommen damit? Ich hab mir das aus Interesse mal angesehen, aber weder in objPage noch in den globals was gefunden.
    in $_SESSION auch nachgesehen...?

  7. #7
    Contao-Fan Avatar von Thraile
    Registriert seit
    17.12.2009.
    Ort
    Detmold
    Beiträge
    501
    Partner-ID
    6306

    Standard

    Ich will ja kein Spielverderber sein, aber was machst du, wenn mehrere Metamodels auf der Seite eingebunden sind?

    Eigentlich müsste Mm selbst auf den Hook reagieren und ggf. Dann ein Eventuell triggern, auf das du reagieren kannst. Ich bin mir aber gerade nicht sicher ob es da schon was zu gibt. Hast du schon mal mit xtra oder Chibineko gesprochen? Die beiden sind gut via IRC zu erreichen....

  8. #8
    Contao-Nutzer
    Registriert seit
    05.10.2012.
    Beiträge
    213

    Standard

    @zonky: Ja.

    @Thraile: Von meiner Seite aus nur ein Experiment, und wie gesagt - man müsste dann die Filter überprüfen, ob auto_item verwendet wird.
    Ich dachte auch erst an ein Event. Aber ist das Problem dabei nicht, dass das changelanguage-Modul u.U. VOR den Metamodels ausgegeben wird, und deshalb ein Event, das die MMs ausgeben, gar nicht mehr greift?

  9. #9
    Contao-Nutzer
    Registriert seit
    17.10.2014.
    Beiträge
    72

    Standard

    Zitat Zitat von Thraile Beitrag anzeigen
    Ich will ja kein Spielverderber sein, aber was machst du, wenn mehrere Metamodels auf der Seite eingebunden sind?
    Genau - das dachte ich mir auch schon.
    Evtl. könnte man einen Auto Detect machen (wie, das wäre noch hier rauszufinden) und ansonsten noch die Möglichkeit bei tl_page das zu verwendende Meta Model einstellbar machen.

  10. #10
    Contao-Nutzer
    Registriert seit
    17.10.2014.
    Beiträge
    72

    Standard

    Den Attributnamen auf den sich das auto_item bezieht müsste ich übrigens auch noch ermitteln.

  11. #11
    Contao-Nutzer
    Registriert seit
    17.10.2014.
    Beiträge
    72

    Fehler

    Ich habe noch etwas darüber nachgeforscht und glaube langsam, dass es nicht wirklich schönes geht als die Lösung von pju.
    In der Regel ist ja mein Sprachwechsler im Seitenkopf und die Meta Models unten drunter.
    Das Rendering des Sprachwechslers für den ich die Informationen brauche geschiet also viel Früher als die Abfrage der Meta Models.

    pjus Lösung ist da quasi der Notwendige "Look-Ahead" um trotzdem an die Infos zu kommen.

    Edit: gut, pjus hat das Problem auch schon eben skizziert Wer lesen kann ...

  12. #12
    Contao-Nutzer
    Registriert seit
    17.10.2014.
    Beiträge
    72

    Standard

    Also ich hab den Code mal ein bisschen optimiert.
    Aber wie komme ich jetzt an die Filter Daten ran?

    PHP-Code:
       private function getCurrentMetamodel() {
            global 
    $objPage;

            
    $curModel = array();
            
    $factory = \MetaModels\Factory::getDefaultFactory();

            
    $layout = \LayoutModel::findByPk($objPage->layout);
            
    $modules unserialize($layout->modules);

            foreach (
    $modules as $module) {
                
    $objModule = ( \ModuleModel::findByPk($module['mod'] ));
                if (
    $objModule->metamodel_layout) {
                    
    $modelName $factory->translateIdToMetaModelName($objModule->metamodel);
                    if (
    $modelName$curModel[] = $modelName;
                };
            }

            
    $objArticles = \ArticleModel::findPublishedByPidAndColumn($objPage->id'main');
            if (
    $objArticles) {
                foreach(
    $objArticles as $article ) {
                    
    $contents = \ContentModel::findPublishedByPidAndTable($article->id'tl_article');
                    if (
    $contents) {
                        foreach( 
    $contents as $content ) {
                            
    $modelName $factory->translateIdToMetaModelName($content->metamodel);
                            
    $filtering $content->metamodel_filtering;
                            
    // todo:
                            // - fetch all filter conditions
                            // - return the one with parameter name = auto_item
                            
    if ($modelName$curModel[] = $modelName;
                        };
                    }
                }
            };

            return 
    array_unique($curModel);
        } 

  13. #13
    Contao-Fan Avatar von Thraile
    Registriert seit
    17.12.2009.
    Ort
    Detmold
    Beiträge
    501
    Partner-ID
    6306

    Standard

    Zitat Zitat von s3lf Beitrag anzeigen
    Das Rendering des Sprachwechslers für den ich die Informationen brauche geschiet also viel Früher als die Abfrage der Meta Models.
    Lös dich mal von der Reihenfolge der Module. Changelanguage feuert den Hook $GLOBALS['TL_HOOKS']['translateUrlParameters'], da darauf kann jedes Modul reagieren, egal ob es auf der Seite eingebunden ist oder nicht;-)

    Die Filter sind über die Pid mit dem Mm verbunden, kann aber auch sein, dass die eine Favoriten die passenden Filter finden kann.

  14. #14

  15. #15
    Contao-Nutzer
    Registriert seit
    17.10.2014.
    Beiträge
    72

    Standard

    Zitat Zitat von Thraile Beitrag anzeigen
    Lös dich mal von der Reihenfolge der Module. Changelanguage feuert den Hook $GLOBALS['TL_HOOKS']['translateUrlParameters'], da darauf kann jedes Modul reagieren, egal ob es auf der Seite eingebunden ist oder nicht;-)
    Klar kann jedes Modul darauf reagieren. Aber die Frage ist doch, wann es gefeuert wird. Und das ist eben i.d.R. bevor die MetaModels gerendert werden - somist kann ich mir beim rendern der MetaModels nicht deren Daten merken und dann beim translateUrlParameters drauf zu greifen - weil es eben in umgekehrter Reihenfolge passiert

  16. #16
    Contao-Nutzer
    Registriert seit
    17.10.2014.
    Beiträge
    72

    Standard

    Zitat Zitat von zonky Beitrag anzeigen
    Denke nicht. Ich will ja den normalen Sprachwechsler aus dem Changelanguage Modul verwenden.

  17. #17
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.717
    User beschenken
    Wunschliste

    Standard

    o.k. - ich habe glaube ich das Problem noch nicht ganz verstanden:

    bei Changelanguage wähle ich doch eine Referenzseite aus - korrekt?

    sagen wir /de/meine-seite.html ist die Basiseite und /en/my-site.html meine Übersetzung

    in bei den ist MM eingebunden

    ... und Du möchtest bei einem Alias z.B. /de/meine-seite/das-detail/4.html in changelanguage automatisch den Link /en/my-site/the-detail/4.html

    ??

  18. #18
    Contao-Nutzer
    Registriert seit
    17.10.2014.
    Beiträge
    72

    Standard

    Jein.

    Ich habe Seiten mit MM + Filter mit auto_item auf alias, Alias ist ein Translated-String

    Jetzt gibt es URLs wie /de/detail/etwas.html und /en/detail/something.html

  19. #19
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.717
    User beschenken
    Wunschliste

    Standard

    und wo ist nun das Problem?

  20. #20
    Contao-Nutzer
    Registriert seit
    17.10.2014.
    Beiträge
    72

    Standard

    Das hier. Muss noch den // todo Code ausfüllen. Dachte das wüsste vielleicht jemand auf Anhieb. Ansonsten muss ich weiter nachforschen.

    Zitat Zitat von s3lf Beitrag anzeigen
    Also ich hab den Code mal ein bisschen optimiert.
    Aber wie komme ich jetzt an die Filter Daten ran?

    PHP-Code:
       private function getCurrentMetamodel() {
            global 
    $objPage;

            
    $curModel = array();
            
    $factory = \MetaModels\Factory::getDefaultFactory();

            
    $layout = \LayoutModel::findByPk($objPage->layout);
            
    $modules unserialize($layout->modules);

            foreach (
    $modules as $module) {
                
    $objModule = ( \ModuleModel::findByPk($module['mod'] ));
                if (
    $objModule->metamodel_layout) {
                    
    $modelName $factory->translateIdToMetaModelName($objModule->metamodel);
                    if (
    $modelName$curModel[] = $modelName;
                };
            }

            
    $objArticles = \ArticleModel::findPublishedByPidAndColumn($objPage->id'main');
            if (
    $objArticles) {
                foreach(
    $objArticles as $article ) {
                    
    $contents = \ContentModel::findPublishedByPidAndTable($article->id'tl_article');
                    if (
    $contents) {
                        foreach( 
    $contents as $content ) {
                            
    $modelName $factory->translateIdToMetaModelName($content->metamodel);
                            
    $filtering $content->metamodel_filtering;
                            
    // todo:
                            // - fetch all filter conditions
                            // - return the one with parameter name = auto_item
                            
    if ($modelName$curModel[] = $modelName;
                        };
                    }
                }
            };

            return 
    array_unique($curModel);
        } 

  21. #21
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.717
    User beschenken
    Wunschliste

    Standard

    und wo ist nun das Problem?
    => in Worten!

  22. #22
    Contao-Nutzer
    Registriert seit
    17.10.2014.
    Beiträge
    72

    Standard

    Na das was da im Comment steht:

    1. Alle Filter Bedingungen der Meta Model Einbindung abrufen
    2. Diejenige Bedingung mit dem Parameter Namen auto_item abrufen

  23. #23
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.717
    User beschenken
    Wunschliste

    Standard

    ich will keine Quelltextanalyse sondern eine Problembeschreibung

    s.i.E.

    * Ich habe Seiten mit MM + Filter mit auto_item auf alias, Alias ist ein Translated-String
    * es werden je nach ausgewählter Sprache URLs wie /de/detail/etwas.html und /en/detail/something.html erstellt
    * ich möchte aber URLs die so aus sehen .................
    * mein Problem ist .................

  24. #24
    Contao-Nutzer
    Registriert seit
    17.10.2014.
    Beiträge
    72

    Standard

    Mein Problem ist, dass ich aktuell in dieser Zeile: https://github.com/iMi-digital/imi_m...server.php#L30 noch den String "alias" (Attributname) Hartkodiert habe. Das Modul soll aber flexibler sein. Daher möchte ich das Attribut um welches es geht automatisch bestimmen.

    Den "Pseudo Code" habe ich im letzten Post beschrieben, das bräuchte ich als PHP Code

  25. #25

  26. #26
    Contao-Nutzer
    Registriert seit
    17.10.2014.
    Beiträge
    72

  27. #27
    Contao-Nutzer
    Registriert seit
    05.10.2012.
    Beiträge
    213

    Standard

    Was mich wundert, warum hast du die Schleife mit den Sections rausgenommen? Jetzt schaut er ja nur nach Modulen, die in der Hauptspalte eingebunden sind …

  28. #28
    Contao-Nutzer
    Registriert seit
    17.10.2014.
    Beiträge
    72

    Standard

    PHP Storm hat $section grau angezeigt weil es nicht verwendet wurde. Da hab ich die Schleife gelöscht ohne zu wissen, was du damit bezwecken wolltest Kannst du nen PullRequest auf GitHub machen?

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
  •