Ergebnis 1 bis 7 von 7

Thema: Zugehörige Kinderartikel ausgeben, Contao 5.3, MM 2.4

  1. #1
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    521

    Standard Zugehörige Kinderartikel ausgeben, Contao 5.3, MM 2.4

    Hallo,

    ich habe Elterntabelle (Personen) und eine Kindertabelle (Artikel). Nun versuche ich im Template metamodel_prerendered_persons.html5, die ich für den Rendering für Frontend einstellte, die Personen und die zu ihnen zugehörigen Artikel auszugeben. Mein Template sieht momentan so aus.

    Leider kommen die Artikel nicht richtig aus, d.h. dass es nur rauskommt.
    HTML-Code:
    <div class="item article first even" id="article_7" data-id="article_7"></div>
    Außerdem stimmt es noch nicht, welche Artikel zu welcher Person rauskommen. Wahrscheinlich ist die Abfrage noch nicht richtig. Weiß jemand, was da noch nicht stimmt?

    PHP-Code:
    <?php
    $translator 
    = \Contao\System::getContainer()->get('translator');
    // Debug items.
    if (\Contao\System::getContainer()->get('kernel')->isDebug()) {
        
    dump($this->data);
    }

    ?>
    <?php 
    if (count($this->data)): ?>

        <div class="layout_full">

            <?php foreach ($this->data as $arrItem): ?>
                <?php $this->block('item'); ?>
                <div class="item person <?= $arrItem['class'?>" id="person_<?= $arrItem['raw']['id'?>" data-id="person_<?= $arrItem['raw']['id'?>">

                <?php

                
    // Name der MetaModel Tabelle

                
    $modelName 'mm_person_articles';
                
    $renderId $arrItem['raw']['id'];

                
    $factory $this->getContainer()->get('metamodels.factory');
                
    $model $factory->getMetaModel($modelName);
                
    $filter $model->getEmptyFilter();
                
    $items $model->findByFilter($filter);
                
    $renderFactory $this->getContainer()->get('metamodels.render_setting_factory');
                
    $articleItems $items->parseAll('html5'$renderFactory->createCollection($model$renderId));

                
    ?>

                    <?php foreach ($arrItem['attributes'] as $field => $name): ?>
                        <?php if ((null !== ($value $arrItem[$this->getFormat()][$field] ?? null)) ||
                            (
    null !== ($value $arrItem['text'][$field] ?? null))): ?>
                            <div class="field <?= $field ?> <?php if ($field == 'longtext'): ?>modal<?php endif ?>">
                                <?php if ($field == 'longtext'): ?><div class="modal-inner"><?php endif ?>
                                <?php if ($field == 'longtext'): ?>
                                    <div class="modal-trigger-buttons">
                                        <div class="modal-trigger-buttons_inner">
                                    <button class="modal-close-button">
                                        <svg width="100%" height="100%" viewBox="0 0 119 119" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;">
        <g transform="matrix(1,0,0,1,-156,-1)">
            <g id="close-button" transform="matrix(1,0,0,1,15.4793,-1693.22)">
                <rect x="141" y="1695" width="117.833" height="117.833" style="fill:none;"/>
                <g id="close" transform="matrix(3.79222,0,0,3.79222,137.457,1691.35)">
                    <g>
                        <g>
                            <path d="M16.47,32.036C7.905,32.036 0.962,25.08 0.962,16.5C0.962,7.92 7.905,0.964 16.47,0.964C25.035,0.964 31.979,7.92 31.979,16.5C31.979,25.08 25.035,32.036 16.47,32.036ZM16.47,30.036C23.932,30.036 29.979,23.975 29.979,16.5C29.979,9.025 23.932,2.964 16.47,2.964C9.009,2.964 2.962,9.025 2.962,16.5C2.962,23.975 9.009,30.036 16.47,30.036Z" style="fill:rgb(107,50,179);"/>
                        </g>
                    </g>
                    <path d="M8.986,9.002L23.955,23.998" style="fill:none;fill-rule:nonzero;stroke:rgb(107,50,179);stroke-width:2px;"/>
                    <path d="M23.955,9.002L8.986,23.998" style="fill:none;fill-rule:nonzero;stroke:rgb(107,50,179);stroke-width:2px;"/>
                </g>
            </g>
        </g>
    </svg>

                                    </button>
                                    <button class="modal-prev-button">
    <svg width="100%" height="100%" viewBox="0 0 119 118" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;">
        <g transform="matrix(1,0,0,1,-305,0)">
            <g id="prev-button" transform="matrix(1,0,0,1,164.676,-1695)">
                <rect x="141" y="1695" width="117.833" height="117.833" style="fill:none;"/>
                <g id="preview" transform="matrix(3.79222,0,0,3.79222,-39.3413,1691.35)">
                    <g>
                        <g>
                            <path d="M63.092,32.036C54.529,32.036 47.583,25.078 47.583,16.5C47.583,7.922 54.529,0.964 63.092,0.964C71.654,0.964 78.6,7.922 78.6,16.5C78.6,25.078 71.654,32.036 63.092,32.036ZM63.092,30.036C70.551,30.036 76.6,23.972 76.6,16.5C76.6,9.028 70.551,2.964 63.092,2.964C55.633,2.964 49.583,9.028 49.583,16.5C49.583,23.972 55.633,30.036 63.092,30.036Z" style="fill:rgb(107,50,179);"/>
                        </g>
                    </g>
                    <path d="M66.95,8.51L59.436,16.259L66.95,24.085" style="fill:none;fill-rule:nonzero;stroke:rgb(107,50,179);stroke-width:2px;"/>
                </g>
            </g>
        </g>
    </svg>
                                    </button>
                                    <button class="modal-next-button">
    <svg width="100%" height="100%" viewBox="0 0 119 119" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;">
        <g transform="matrix(1,0,0,1,-452,-2)">
            <g id="next-button" transform="matrix(1,0,0,1,311.769,-1692.43)">
                <rect x="141" y="1695" width="117.833" height="117.833" style="fill:none;"/>
                <g id="next" transform="matrix(3.79222,0,0,3.79222,-211.652,1691.35)">
                    <g>
                        <g>
                            <path d="M108.53,32.036C99.967,32.036 93.021,25.078 93.021,16.5C93.021,7.922 99.958,0.964 108.53,0.964C117.102,0.964 124.038,7.922 124.038,16.5C124.038,25.078 117.092,32.036 108.53,32.036ZM108.53,30.036C115.989,30.036 122.038,23.972 122.038,16.5C122.038,9.028 115.998,2.964 108.53,2.964C101.062,2.964 95.021,9.028 95.021,16.5C95.021,23.973 101.071,30.036 108.53,30.036Z" style="fill:rgb(107,50,179);"/>
                        </g>
                    </g>
                    <path d="M104.681,8.51L112.195,16.259L104.681,24.085" style="fill:none;fill-rule:nonzero;stroke:rgb(107,50,179);stroke-width:2px;"/>
                </g>
            </g>
        </g>
    </svg>

                                    </button>
                                    </div>
                                    </div>
                                <?php endif; ?>
                                 <?= $value ?>
                                 <?php if ($field == 'intro'): ?>
                                    <button class="button modal-trigger">
                                        <svg width="100%" height="100%" viewBox="0 0 118 118" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
                                            <g id="button-trigger" transform="matrix(1,0,0,1,-141,-1695)">
                                                <rect x="141" y="1695" width="117.833" height="117.833" style="fill:none;"/>
                                                <clipPath id="_clip1">
                                                    <rect x="141" y="1695" width="117.833" height="117.833"/>
                                                </clipPath>
                                                <g clip-path="url(#_clip1)">
                                                    <g id="trigger-button1" serif:id="button-trigger" transform="matrix(0.75,0,0,0.75,34.8749,-2203.63)">
                                                        <g transform="matrix(5.55556,0,0,5.55556,147.056,5192.61)">
                                                            <path d="M13.14,29.28C20.952,29.28 27.28,22.952 27.28,15.14L25.28,15.14C25.28,21.848 19.848,27.28 13.14,27.28L13.14,29.28ZM27.28,15.14C27.28,7.328 20.952,1 13.14,1L13.14,3C19.848,3 25.28,8.432 25.28,15.14L27.28,15.14ZM13.14,1C5.328,1 -1,7.328 -1,15.14L1,15.14C1,8.432 6.432,3 13.14,3L13.14,1ZM-1,15.14C-1,22.952 5.328,29.28 13.14,29.28L13.14,27.28C6.432,27.28 1,21.848 1,15.14L-1,15.14Z" style="fill:rgb(107,50,179);fill-rule:nonzero;"/>
                                                        </g>
                                                        <g transform="matrix(0,5.55556,5.55556,0,170.222,5276.72)">
                                                            <rect x="-8.97" y="7.97" width="17.94" height="2" style="fill:rgb(107,50,179);"/>
                                                        </g>
                                                        <g transform="matrix(-5.55556,0,0,5.55556,269.889,5265.61)">
                                                            <rect x="0" y="1" width="17.93" height="2" style="fill:rgb(107,50,179);"/>
                                                        </g>
                                                    </g>
                                                </g>
                                            </g>
                                        </svg>
                                </button>
                            <?php endif ?>
                            <?php if ($field == 'longtext'): ?></div><?php endif ?>
                            </div>


                        <?php endif; ?>
                    <?php endforeach; ?>
                    

                </div>
                <?php $this->endblock(); ?>

    <?php if (count($articleItems)): ?>
        <div class="related-articles-person">
    <?php foreach ($articleItems as $article): ?>
                <?php $this->block('item'); ?>
                <div class="item article <?= $article['class'?>" id="article_<?= $article['raw']['id'?>" data-id="article_<?= $article['raw']['id'?>">

                    <?php foreach ($article['attributes'] as $field => $name): ?>
                        <?php if ((null !== ($value $article[$this->getFormat()][$field] ?? null)) ||
                            (
    null !== ($value $article['text'][$field] ?? null))): ?>
                            <div class="field <?= $field ?> <?php if ($field == 'longtext'): ?>modal<?php endif ?>">
                                <?php if ($field == 'longtext'): ?><div class="modal-inner"><?php endif ?>
                                <?php if (!$this->view->get('hideLabels')): ?>
                                    <div class="label"><?= $translator->trans('field_label', ['%field_label%' => $name], 'metamodels_list'?></div>
                                
                                    <?php endif; ?>
                                <?php if ($field == 'longtext'): ?>
                                    <div class="modal-trigger-buttons">
                                        <div class="modal-trigger-buttons_inner">
                                    <button class="modal-close-button">
                                        <svg width="100%" height="100%" viewBox="0 0 119 119" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;">
        <g transform="matrix(1,0,0,1,-156,-1)">
            <g id="close-button" transform="matrix(1,0,0,1,15.4793,-1693.22)">
                <rect x="141" y="1695" width="117.833" height="117.833" style="fill:none;"/>
                <g id="close" transform="matrix(3.79222,0,0,3.79222,137.457,1691.35)">
                    <g>
                        <g>
                            <path d="M16.47,32.036C7.905,32.036 0.962,25.08 0.962,16.5C0.962,7.92 7.905,0.964 16.47,0.964C25.035,0.964 31.979,7.92 31.979,16.5C31.979,25.08 25.035,32.036 16.47,32.036ZM16.47,30.036C23.932,30.036 29.979,23.975 29.979,16.5C29.979,9.025 23.932,2.964 16.47,2.964C9.009,2.964 2.962,9.025 2.962,16.5C2.962,23.975 9.009,30.036 16.47,30.036Z" style="fill:rgb(107,50,179);"/>
                        </g>
                    </g>
                    <path d="M8.986,9.002L23.955,23.998" style="fill:none;fill-rule:nonzero;stroke:rgb(107,50,179);stroke-width:2px;"/>
                    <path d="M23.955,9.002L8.986,23.998" style="fill:none;fill-rule:nonzero;stroke:rgb(107,50,179);stroke-width:2px;"/>
                </g>
            </g>
        </g>
    </svg>

                                    </button>
                                    <button class="modal-prev-button">
    <svg width="100%" height="100%" viewBox="0 0 119 118" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;">
        <g transform="matrix(1,0,0,1,-305,0)">
            <g id="prev-button" transform="matrix(1,0,0,1,164.676,-1695)">
                <rect x="141" y="1695" width="117.833" height="117.833" style="fill:none;"/>
                <g id="preview" transform="matrix(3.79222,0,0,3.79222,-39.3413,1691.35)">
                    <g>
                        <g>
                            <path d="M63.092,32.036C54.529,32.036 47.583,25.078 47.583,16.5C47.583,7.922 54.529,0.964 63.092,0.964C71.654,0.964 78.6,7.922 78.6,16.5C78.6,25.078 71.654,32.036 63.092,32.036ZM63.092,30.036C70.551,30.036 76.6,23.972 76.6,16.5C76.6,9.028 70.551,2.964 63.092,2.964C55.633,2.964 49.583,9.028 49.583,16.5C49.583,23.972 55.633,30.036 63.092,30.036Z" style="fill:rgb(107,50,179);"/>
                        </g>
                    </g>
                    <path d="M66.95,8.51L59.436,16.259L66.95,24.085" style="fill:none;fill-rule:nonzero;stroke:rgb(107,50,179);stroke-width:2px;"/>
                </g>
            </g>
        </g>
    </svg>
                                    </button>
                                    <button class="modal-next-button">
    <svg width="100%" height="100%" viewBox="0 0 119 119" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;">
        <g transform="matrix(1,0,0,1,-452,-2)">
            <g id="next-button" transform="matrix(1,0,0,1,311.769,-1692.43)">
                <rect x="141" y="1695" width="117.833" height="117.833" style="fill:none;"/>
                <g id="next" transform="matrix(3.79222,0,0,3.79222,-211.652,1691.35)">
                    <g>
                        <g>
                            <path d="M108.53,32.036C99.967,32.036 93.021,25.078 93.021,16.5C93.021,7.922 99.958,0.964 108.53,0.964C117.102,0.964 124.038,7.922 124.038,16.5C124.038,25.078 117.092,32.036 108.53,32.036ZM108.53,30.036C115.989,30.036 122.038,23.972 122.038,16.5C122.038,9.028 115.998,2.964 108.53,2.964C101.062,2.964 95.021,9.028 95.021,16.5C95.021,23.973 101.071,30.036 108.53,30.036Z" style="fill:rgb(107,50,179);"/>
                        </g>
                    </g>
                    <path d="M104.681,8.51L112.195,16.259L104.681,24.085" style="fill:none;fill-rule:nonzero;stroke:rgb(107,50,179);stroke-width:2px;"/>
                </g>
            </g>
        </g>
    </svg>

                                    </button>
                                    </div>
                                    </div>
                                <?php endif; ?>
                                 <?= $value ?>
                                 <?php if ($field == 'intro'): ?>
                                    <button class="button modal-trigger">
                                        <svg width="100%" height="100%" viewBox="0 0 118 118" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
                                            <g id="button-trigger" transform="matrix(1,0,0,1,-141,-1695)">
                                                <rect x="141" y="1695" width="117.833" height="117.833" style="fill:none;"/>
                                                <clipPath id="_clip1">
                                                    <rect x="141" y="1695" width="117.833" height="117.833"/>
                                                </clipPath>
                                                <g clip-path="url(#_clip1)">
                                                    <g id="trigger-button1" serif:id="button-trigger" transform="matrix(0.75,0,0,0.75,34.8749,-2203.63)">
                                                        <g transform="matrix(5.55556,0,0,5.55556,147.056,5192.61)">
                                                            <path d="M13.14,29.28C20.952,29.28 27.28,22.952 27.28,15.14L25.28,15.14C25.28,21.848 19.848,27.28 13.14,27.28L13.14,29.28ZM27.28,15.14C27.28,7.328 20.952,1 13.14,1L13.14,3C19.848,3 25.28,8.432 25.28,15.14L27.28,15.14ZM13.14,1C5.328,1 -1,7.328 -1,15.14L1,15.14C1,8.432 6.432,3 13.14,3L13.14,1ZM-1,15.14C-1,22.952 5.328,29.28 13.14,29.28L13.14,27.28C6.432,27.28 1,21.848 1,15.14L-1,15.14Z" style="fill:rgb(107,50,179);fill-rule:nonzero;"/>
                                                        </g>
                                                        <g transform="matrix(0,5.55556,5.55556,0,170.222,5276.72)">
                                                            <rect x="-8.97" y="7.97" width="17.94" height="2" style="fill:rgb(107,50,179);"/>
                                                        </g>
                                                        <g transform="matrix(-5.55556,0,0,5.55556,269.889,5265.61)">
                                                            <rect x="0" y="1" width="17.93" height="2" style="fill:rgb(107,50,179);"/>
                                                        </g>
                                                    </g>
                                                </g>
                                            </g>
                                        </svg>
                                </button>
                            <?php endif ?>
                            <?php if ($field == 'longtext'): ?></div><?php endif ?>
                            </div>
                        <?php endif; ?>
                    <?php endforeach; ?>
                </div>
                <?php $this->endblock(); ?>             
    <?php endforeach; ?>
    </div>
    <?php endif; ?>
            <?php endforeach; ?>
        </div>
    <?php else: ?>
        <?php $this->block('noItem'); ?>
        <p class="info"><?= $this->noItemsMsg ?></p>
        <?php $this->endblock(); ?>
    <?php 
    endif; ?>
    Geändert von jenda (27.02.2025 um 18:56 Uhr)

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

    Standard

    Zitat Zitat von jenda Beitrag anzeigen
    Außerdem stimmt es noch nicht, welche Artikel zu welcher Person rauskommen. Wahrscheinlich ist die Abfrage noch nicht richtig. Weiß jemand, was da noch nicht stimmt?
    Du musst auch filtern - ein "empty-Filter" ist erstmal nur eine "leere Hülle" => guck Dir die Beispiele meines Vortrags der CK23 an...

    Eleganter wäre es, alle notwendigen Artikeldaten mit einer Abfrage zu holen und nicht "kleckerweise" in dem foreach.

  3. #3
    Wandelndes Contao-Lexikon Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    10.181
    User beschenken
    Wunschliste

    Standard

    PHP-Code:
    ....
    <?php foreach ($arrItem['attributes'] as $field => $name): ?>
    ...
    ist nur für die "erste Demoausgabe" gedacht - man hat doch selbst einen Plan, wie das HTML-Gerüst aussehen soll...

    PHP-Code:
    <?php if (count($this->data)): ?>
        <div class="layout_full">
            <?php foreach ($this->data as $arrItem): ?>
                <div class="item person <?= $arrItem['class'?>" id="person_<?= $arrItem['raw']['id'?>" data-id="person_<?= $arrItem['raw']['id'?>">
                    <div class="description">
                        <?= $arrItem['html5']['longtext'?>
                        <p><?= $arrItem['text']['intro'?></p>
                    </div>
                </div>
                <!-- usw. .... -->
            <?php endforeach ?>
        </div>
    <?php else: ?>
        <?php $this->block('noItem'); ?>
            <p class="info"><?= $this->noItemsMsg ?></p>
        <?php $this->endblock(); ?>
    <?php 
    endif; ?>

  4. #4
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    521

    Standard

    Ich habe es wie folgt gelöst. Hoffentlich ist es der beste Weg.

    PHP-Code:
    <?php
    use MetaModels\Filter\Rules\SearchAttribute;

    $translator = \Contao\System::getContainer()->get('translator');
    $isDebug = \Contao\System::getContainer()->get('kernel')->isDebug();
    if (
    $isDebug) {
        
    dump($this->data);
    }

    $container $this->getContainer();
    $factory $container->get('metamodels.factory');
    $renderFactory $container->get('metamodels.render_setting_factory');

    $personId 0;
    $articleItems 0;

    if (
    $this->data) {
        
    ?>
        <div class="layout_full">
            <div class="container">
                <?php
                
    foreach ($this->data as $arrItem) {
                    
    $personId $arrItem['raw']['id'];
                    
    $this->block('item');
                    
    ?>
                    <div class="item person <?= $arrItem['class'?>" id="person_<?= $personId ?>" data-id="person_<?= $personId ?>" data-modal="modal_<?= $personId ?>">
                        <?php
                        $modelName 
    'mm_person_articles';
                        
    $renderId 3;
                        
    $parentId = (int) $personId;
                        
    $model $factory->getMetaModel($modelName);
                        
    $filter $model->getEmptyFilter();
                        
    $filterRule = new \MetaModels\Filter\Rules\SimpleQuery('SELECT id FROM mm_person_articles WHERE pid = ?', [$parentId]);
                        
    $filter->addFilterRule($filterRule);
                        
    $items $model->findByFilter($filter);
                        
    $articleItems $items->parseAll('html5'$renderFactory->createCollection($model$renderId));

                        foreach (
    $arrItem['attributes'] as $field => $name) {
                            if (
    $field !== 'longtext' && ($value $arrItem[$this->getFormat()][$field] ?? $arrItem['text'][$field] ?? null)) {
                                
    ?>
                                <?php if ($field === 'picture'): ?><div class="intro-wrapper"><?php endif ?>
                                <?php if ($field === 'personName'): ?><div class="person-name-wrapper"><?php endif ?>
                                <div class="field <?= $field ?><?= $field === 'longtext' 'id="modal_' $personId '"' '' ?>>
                                    <?= $value ?>
                                    <?php if ($field === 'intro') { ?>
                                        <button class="button modal-trigger"></button>
                                    </div>
                                    </div>
                                    <?php ?>
                                </div>
                                <?php
                            
    }
                        }
                        
    ?>
                    </div>
                    <?php $this->endblock(); ?>

                    <?php if ($articleItems) { ?>
                        <?php foreach ($articleItems as $article) { ?>
                            <?php $this->block('item'); ?>
                            <div class="item article <?= $article['class'?>" id="article_<?= $article['raw']['id'?>" data-id="article_<?= $article['raw']['id'?>" data-modal="modal_<?= $article['raw']['id'?>">
                                <?php
                                
    foreach ($article['attributes'] as $field => $name) {
                                    if (
    $field !== 'longtext' && $field !== 'related_articles' && $field !== 'article' && ($value $article[$this->getFormat()][$field] ?? $article['text'][$field] ?? null)) {
                                        
    ?>
                                        <div class="field <?= $field ?><?= $field === 'longtext' 'id="modal_' $article['raw']['id'] . '"' '' ?>>
                                            <?= $value ?>
                                            <?php if ($field === 'intro') { ?>
                                                <button class="button modal-trigger"></button>
                                            <?php ?>
                                        </div>
                                        <?php
                                    
    }
                                }
                                
    ?>
                            </div>
                            <?php $this->endblock(); ?>
                        <?php ?>
                    <?php ?>
                <?php ?>
            </div>
        </div>

        <div class="modals-wrapper" id="modal-wrapper-<?= $personId ?>">
            <?php
            
    foreach ($this->data as $arrItem) {
                foreach (
    $arrItem['attributes'] as $field => $name) {
                    if (
    strpos($field'longtext') !== false && ($value $arrItem[$this->getFormat()][$field] ?? $arrItem['text'][$field] ?? null)) {
                        
    ?>
                        <div class="field <?= $field ?> modal" <?= $field === 'longtext' 'id="modal_' $arrItem['raw']['id'] . '"' '' ?>>
                            <div class="modal-inner">
                                <div class="modal-trigger-buttons">
                                    <div class="modal-trigger-buttons_inner">
                                        <button class="modal-close-button"></button>
                                        <button class="modal-prev-button"></button>
                                        <button class="modal-next-button"></button>
                                    </div>
                                </div>
                                <?= $value ?>
                            </div>
                        </div>
                        <?php
                    
    }
                }
            }

            foreach (
    $articleItems as $article) {
                foreach (
    $article['attributes'] as $field => $name) {
                    
    $hasRelatedArticles false;
                    if (
    in_array($field, ['longtext'], true) && ($value $article[$this->getFormat()][$field] ?? $article['text'][$field] ?? null)) {
                        
    ?>
                        <div class="field <?= $field ?> modal" <?= $field === 'longtext' 'id="modal_' $article['raw']['id'] . '"' '' ?>>
                            <div class="modal-inner">
                                <div class="modal-trigger-buttons">
                                    <div class="modal-trigger-buttons_inner">
                                        <button class="modal-close-button"></button>
                                        <button class="modal-prev-button"></button>
                                        <button class="modal-next-button"></button>
                                    </div>
                                </div>
                                <?= $value ?>
                            </div>
                        </div>
                        <?php
                    
    }
                }
            }
            
    ?>
        </div>
    <?php } else { ?>
        <?php $this->block('noItem'); ?>
        <p class="info"><?= $this->noItemsMsg ?></p>
        <?php $this->endblock(); ?>
    <?php 
    ?>

  5. #5
    Wandelndes Contao-Lexikon Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    10.181
    User beschenken
    Wunschliste

    Standard

    Wie schon in #3 geschrieben - wenn man nicht (unnötiger Weise) über alle Attribute loopt, wäre der Code sicher einfacher zu lesen und zu pflegen...

    Die API-Abfrage könnte man in eine "Helper-Klasse" auslagern und alles notwendige injecten - sie https://www.e-spin.de/contao-metamod...renz-2023.html Seite 14 und Handbuch https://metamodels.readthedocs.io/de...-services.html

  6. #6
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    521

    Standard

    Dankeschön für den Tipp. Ich habe einen Helper erstellte, den noch registriert und veröffentlicht und den Code vereinfacht. Momentan sieht er so aus. Ich hoffe, dass es nun die beste Praxis ist.

    src/Helper/MetaModelsTemplateHelper.php
    PHP-Code:
    <?php

    namespace App\Helper;

    use 
    MetaModels\Filter\Setting\IFilterSettingFactory;
    use 
    MetaModels\Render\Setting\IRenderSettingFactory;
    use 
    MetaModels\IFactory;
    use 
    MetaModels\IMetaModel;

    class 
    MetaModelsTemplateHelper
    {
        
    /**
         * The factory.
         *
         * @var IFactory
         */
        
    private IFactory $factory;

        
    /**
         * Filter setting factory.
         *
         * @var IFilterSettingFactory
         */
        
    private IFilterSettingFactory $filterFactory;

        
    /**
         * Render setting factory.
         *
         * @var IRenderSettingFactory
         */
        
    private IRenderSettingFactory $renderFactory;

        
    /**
         * MetaModelsTemplateHelper constructor.
         *
         * @param IFactory              $factory
         * @param IFilterSettingFactory $filterFactory
         * @param IRenderSettingFactory $renderFactory
         */
        
    public function __construct(
            
    IFactory $factory,
            
    IFilterSettingFactory $filterFactory,
            
    IRenderSettingFactory $renderFactory
        
    ) {
            
    $this->factory $factory;
            
    $this->filterFactory $filterFactory;
            
    $this->renderFactory $renderFactory;
        }

      
        public function 
    getPersonArticles(string $personId): array
        {
            
    $modelName 'mm_person_articles';
            
    $renderId 3;
            
    $parentId = (int) $personId;
            
    $model $this->factory->getMetaModel($modelName);
            
    $filter $model->getEmptyFilter();
            
    $filterRule = new \MetaModels\Filter\Rules\SimpleQuery('SELECT id FROM mm_person_articles WHERE pid = ?', [$parentId]);
            
    $filter->addFilterRule($filterRule);
            
    $items $model->findByFilter($filter);
            
    $articleItems $items->parseAll('html5'$this->renderFactory->createCollection($model$renderId));
            return 
    $articleItems;
        }
    }

    config/services.yml
    Code:
    services:
      App\Helper\MetaModelsTemplateHelper:
        public: true
        autowire: true
        autoconfigure: true

    Template

    PHP-Code:
    <?php
    use App\Helper\MetaModelsTemplateHelper;
    use 
    MetaModels\Filter\Rules\SearchAttribute;

    // Get helper.
    $templateHelper = \Contao\System::getContainer()->get(MetaModelsTemplateHelper::class);

    $isDebug = \Contao\System::getContainer()->get('kernel')->isDebug();
    if (
    $isDebug) {
        
    dump($this->data);
    }
    $personId 0;

    ?>
    <?php 
    if ($this->data): ?>
        <div class="layout_full">
            <div class="container">
                    <?php
                    
    foreach ($this->data as $personItem) {
                        
    $personId $personItem['raw']['id'];
                        
    // Get the person articles
                        
    $articleItems $templateHelper->getPersonArticles($personId);
                        
    // dump($articleItems);

                        
    $this->block('item');
                        
    ?>
                <div class="item person <?= $personItem['class'?>" id="person_<?= $personId ?>" data-id="person_<?= $personId ?>" data-modal="modal_<?= $personId ?>">
                        <div class="intro-wrapper">
                                <div class="picture">
                                    <?= $personItem['html5']['picture'?>
                                </div>
                                <div class="person-name-wrapper">
                                    <?= $personItem['html5']['personName'?>
                                </div>  
                                <div class="intro">
                                   <?= $personItem['html5']['intro'?>
                                </div>
                                <button class="button modal-trigger" data-modal-trigger="modal_<?= $personId ?>">   </button>
                        </div>
                    </div>
                    <?php $this->endblock(); ?>

                    <?php if ($articleItems): ?>
                        <?php foreach ($articleItems as $article): ?>
                            <?php $this->block('item'); ?>
                            <div class="item article <?= $article['class'?><?php if ($article['raw']['marginTop']): ?> own-margin-top<?php endif ?>" id="article_<?= $article['raw']['id'?>" data-id="article_<?= $article['raw']['id'?>" data-modal="modal_<?= $article['raw']['id'?><?php if ($article['raw']['marginTop']): ?>style="--margin-top: <?= $article['raw']['marginTop'?>px;"<?php endif ?>>
                                        <div class="picture">
                                            <?= $article['html5']['picture'?>
                                        </div>
                                        <div class="title">
                                            <?= $article['html5']['title'?>
                                        </div>
                                        <div class="intro">
                                            <?= $article['html5']['intro'?>
                                        </div>
                                        <button class="button modal-trigger" data-modal-trigger="modal_<?= $article['raw']['id'?>"></button>
                            </div>
                            <?php $this->endblock(); ?>
                        <?php endforeach ?>
                    <?php endif ?>
            </div>
        </div>
        <div class="modals-wrapper" id="modal-wrapper-<?= $personId ?>">
            <?php foreach ($this->data as $personItem): ?>
                        <div class="modal" id="modal_<?= $personItem['raw']['id'?>">
                            <div class="modal-inner">
                                <div class="modal-trigger-buttons">
                                    <div class="modal-trigger-buttons_inner">
                                        <button class="modal-close-button"></button>
                                        <button class="modal-prev-button"></button>
                                        <button class="modal-next-button"></button>
                                    </div>
                                </div>
                                <?= $personItem['html5']['longtext'?>
                            </div>
                        </div>
            <?php endforeach ?>
            <?php foreach ($articleItems as $article): ?>
                        <div class="modal" id="modal_<?= $article['raw']['id'?>">
                            <div class="modal-inner">
                                <div class="modal-trigger-buttons">
                                    <div class="modal-trigger-buttons_inner">
                                        <button class="modal-close-button"></button>
                                        <button class="modal-prev-button"></button>
                                        <button class="modal-next-button"></button>
                                    </div>
                                </div>
                                <div class="picture"><?= $article['html5']['picture'?></div>
                                <?= $article['html5']['title'?>
                                <?= $article['html5']['intro'?>
                               <?= $article['html5']['longtext'?>
                               <?= $article['html5']['article'?>
                               <?php if ($article['raw']['related_articles']): ?>
                                    <?= $article['html5']['related_articles'?>
                                <?php endif ?>
                            </div>
                        </div>
            <?php endforeach ?>
        </div>
    <?php ?>
    <?php 
    else: ?>
        <?php $this->block('noItem'); ?>
        <p class="info"><?= $this->noItemsMsg ?></p>
        <?php $this->endblock(); ?>
    <?php 
    endif ?>
    Geändert von jenda (09.03.2025 um 10:53 Uhr)

  7. #7
    Wandelndes Contao-Lexikon Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    10.181
    User beschenken
    Wunschliste

    Standard

    das sieht doch schon besser aus...

    das
    PHP-Code:
    $templateHelper = \Contao\System::getContainer()->get(MetaModelsTemplateHelper::class); 
    kann "oben" einmalig unter die "use" und das
    PHP-Code:
    $translator = \Contao\System::getContainer()->get('translator'); 
    kann ganz weg...

    PHP-Kontrollstrukturen in Templates schreibt man üblicher Weise damit https://www.php.net/manual/de/contro...ive-syntax.php

    ansonsten wären noch ein paar Feinheiten am Code zu fixen, die aber an der Funktionsweise nichts weiter ändern

    Eine Alternative zu der Abfrage in jedem foreach von Personen könnte man erst alle Personen-IDs sammeln und damit alle passenden Artikel per Helper holen - wenn man im Helper ein Array mehrdimensionales Array mit den pid als oberste Ebene, könnte man dann mit der id der Person prima darauf zugreifen.

    Hängt alles etwas von der Menge der angezeigten Datensätze ab.

Aktive Benutzer

Aktive Benutzer

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

Berechtigungen

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