Contao-Camp 2024
Ergebnis 1 bis 12 von 12

Thema: MM2.2 - Ausgabe eines Wertes der Kindtabelle auf der Seite der Elternliste

  1. #1
    Contao-Fan Avatar von Kopfnuss
    Registriert seit
    05.09.2012.
    Ort
    Zwickau
    Beiträge
    320
    Partner-ID
    11375
    Contao-Projekt unterstützen

    Support Contao

    Standard MM2.2 - Ausgabe eines Wertes der Kindtabelle auf der Seite der Elternliste

    Hey Ihr,
    ich komme hier nicht weiter. Folgenden Aufbau habe ich bis jetzt, vereinfacht nur auf die relevanten Elemente beschränkt.
    Tabelle:
    mm_order
    • id -> Attribut


    mm_positions
    • position_order_number -> Attribu
    • position_product_number -> Attribu


    Die Tabelle mm_order ist mit einem Select zu der Tabelle mm_positions verbunde. (mm_order 1-n mm_positions)

    Ich lasse mir ein Übersicht der Tabelle mm_order ausgeben und verlinke auf die Detailseite wo ich die passenden Werte von der Tabelle mm_positions ausgebe.
    Ich möchte jetzt bei der Übersicht noch die Artikelnummer (position_product_number) anzeigen lassen zu den passenden Eintrag bei mm_order.
    Dafür habe ich das Template "metamodel_prerendered.html5" bearbeitet und nutze MetaModels Interfaces.

    Code:
    <?php
    /* Parameter*/
    
    // Name der MetaModel Tabelle (siehe "Das erstes Metamodel")
    $modelName = 'mm_positions';
    // ID der Render-Einstellungen "FE-Liste"
    $renderId = 7;
    // ID des Filters
    $filterId = 11;
    ?>
    <?php
    
    /* Interface */
    $factory = $this->getContainer()->get('metamodels.factory');
    $model = $factory->getMetaModel($modelName);
    $filter = $model->prepareFilter($filterId, []);
    $items = $model->findByFilter($filter);
    $arrItemsPosition = $items->parseAll('html5', $model->getView($renderId));
    
    echo 'Anzahl: '.$items->getCount()."<br>\n";
    
    foreach ($arrItemsPosition as $arrItemPosition)
    {
       echo $arrItemPosition['html5']['position_product_number']."<br>\n";
    }
    ?>
    Ich habe unter dem MetaModel Position eine Filter erstellt -> Eigenes SQL
    Code:
    SELECT id FROM mm_positions WHERE position_order_number = 3
    -> ID = 11

    Wollte jetzt testweise nur den Wert aus allen Einträgen mit "position_order_number" = "3" anzeigen. Jedoch zeigt er mir alle Einträge aus der Tabelle mm_positions.
    Habe den Verdacht das mein Filter nicht funktioniert. Kann mir da jemand helfen?
    Geändert von Kopfnuss (23.03.2021 um 13:43 Uhr)

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

    Standard

    Zitat Zitat von Kopfnuss Beitrag anzeigen
    Die Tabelle mm_order ist mit einem Select zu der Tabelle mm_positions verbunde. (mm_order 1-n mm_positions)
    wenn das so der Fall ist, dann ist mm_order KEINE Kindtabelle sondern Du hast eine ganz normale Relation aufgebaut (1:n)

    "Kindtabelle" hat in MM eine spezielle Bedeutung, d.h. dass beim Kinddatensatz die pid auf die id des Elternatensatzes zeigt!

    ich frage mich, warum du soviel Gedöhns da machst?!? Bau das Debug ein https://metamodels.readthedocs.io/de...templates.html und guck in knoten 'raw' - da hast Du Zugriff auf alle Werte und musst da nicht solche Sachen in das Template schwurbeln

    siehe auch https://metamodels.readthedocs.io/de...-seite-filtern
    man kann auch mehrere MM-Listen in eine Seite einbauen, die auf den selben Slug/Get-Parameter lauschen

  3. #3
    Contao-Fan Avatar von Kopfnuss
    Registriert seit
    05.09.2012.
    Ort
    Zwickau
    Beiträge
    320
    Partner-ID
    11375
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von zonky Beitrag anzeigen
    ich frage mich, warum du soviel Gedöhns da machst?!? Bau das Debug ein https://metamodels.readthedocs.io/de...templates.html und guck in knoten 'raw' - da hast Du Zugriff auf alle Werte und musst da nicht solche Sachen in das Template schwurbeln
    Hab ich ja schon.
    Ich nehme mal an ich bekomme da nur mehr angezeigt wenn ich das mit einer Kindtabelle mache? Jetzt habe ich da nur die Werte aus der Tabelle mm_order, da ist die verbindung ja bei mm_positions über ein select da.

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

    Standard

    Zitat Zitat von Kopfnuss Beitrag anzeigen
    Ich nehme mal an ich bekomme da nur mehr angezeigt wenn ich das mit einer Kindtabelle mache?
    => Nein! im Gegenteil

    Also:

    * du hast mm_order
    * und mm_positions - hier ist ein Attribut "Einzelauswahl [select]" mit Verbindung zu mm_order

    Wenn Du mm_positions ausgeben lässt, dast Du im raw-Knoten alle Daten von mm_order

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

    Standard

    die Bezeichnungen klingen nach eine Art Shop... wenn Du im BE nicht eine Liste mit allen mm_positions benötigst, würde ich hier sogar zu einem Aufbau mit Kindtabelle raten - Einstellungen. Eingabemaske => Kindtabelle und Elternelement vorhanden

    bei der Tabelle mm_order hast Du im BE dann rechts ein neues Icon - mit Klick darauf erscheint eine neue Liste mit den mm_position-Items bzw. kannst Du dort neu anlegen. Im Datensatz wird die pid automatisch auf die id des Elterndatensatzes gesetzt.

    Das Icon in mm_order-Liste für mm_positions kannst Du in Eingabemaske auswählen.

  6. #6
    Contao-Fan Avatar von Kopfnuss
    Registriert seit
    05.09.2012.
    Ort
    Zwickau
    Beiträge
    320
    Partner-ID
    11375
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von zonky Beitrag anzeigen
    => Nein! im Gegenteil

    Also:

    * du hast mm_order
    * und mm_positions - hier ist ein Attribut "Einzelauswahl [select]" mit Verbindung zu mm_order

    Wenn Du mm_positions ausgeben lässt, dast Du im raw-Knoten alle Daten von mm_order
    Ich hätte aber gern das wenn ich mm_order ausgebe (als Liste, keine Detailansicht), das ich einen Wert von mm_positions bekomme. Da habe ich auch das debug und dort wird mir unter dem raw-Knoten nur das zu mm_order angezeigt.

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

    Standard

    Zitat Zitat von Kopfnuss Beitrag anzeigen
    A) Ich hätte aber gern das wenn ich mm_order ausgebe (als Liste, keine Detailansicht), das ich einen Wert von mm_positions bekomme.

    B) Da habe ich auch das debug und dort wird mir unter dem raw-Knoten nur das zu mm_order angezeigt.

    zu B) ist kar - in mm_order gibt es kein Attribut für die Relation - nur in mm_positions für mm_order

    zu A) o.k. - jetzt verstanden...

    kommt etwas darauf an, wieviele mm_order Item es sind bzw. ausgegeben werden...

    Du kannst

    a) für jedes mm_order-Item eine MM-API-Abfrage machen (viele Abfragen)
    b) erst alle mm_positions-Items holen und in Array speichern - und dann anhand der id das passende ausgeben (eine Abfrage aber ggf. großes Array)
    c) einmal durch deine mm_order-Items laufen und ids ermitteln (mm_order-Items speichern) - Abfrage auf mm_positions machen mit Filter auf id-Liste - und dann foreach über das items-Array

  8. #8
    Contao-Fan Avatar von Kopfnuss
    Registriert seit
    05.09.2012.
    Ort
    Zwickau
    Beiträge
    320
    Partner-ID
    11375
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Ich hab jetzt das Debug https://metamodels.readthedocs.io/de...templates.html in jedes Template eingebunden und bekomme auf der Übersichtsseite (mm_order) sowie auf der Detailseite (mm_positions) unter dem raw-knoten nicht die Werte der verbunden Tabelle angezeigt. Ka, was ich noch falsch mache.

    Okay.. siehe Beitrag obendrüber

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

    Standard

    Zitat Zitat von Kopfnuss Beitrag anzeigen
    Ich hab jetzt das Debug https://metamodels.readthedocs.io/de...templates.html in jedes Template eingebunden und bekomme auf der Übersichtsseite (mm_order) sowie auf der Detailseite (mm_positions) unter dem raw-knoten nicht die Werte der verbunden Tabelle angezeigt. Ka, was ich noch falsch mache.
    wie geschrieben - bei mm_order gibt es kein entsprechendes Attribut!

    bei mm_positions das Attribut "mm_order" mit in den Rendersettings aktiviert? poste mal die Ausgabe vom ersten Item

  10. #10
    Contao-Fan Avatar von Kopfnuss
    Registriert seit
    05.09.2012.
    Ort
    Zwickau
    Beiträge
    320
    Partner-ID
    11375
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Okay.. hatte das Attribut (select) unter den Rendereinstellungen unsichtbar bei mm_positions ^^ Da könnte ich jetzt passend die Werte von mm_order mit ausgeben.
    Für das eigentlich Problem schau ich mir mal deine Lösungsansätze an.
    Danke.

  11. #11
    Contao-Fan Avatar von Kopfnuss
    Registriert seit
    05.09.2012.
    Ort
    Zwickau
    Beiträge
    320
    Partner-ID
    11375
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Der Vollständigkeit halber hier die Lösung von meinem oben beschriebenen Problem.
    Ich habe im Template "metamodel_prerendered.html" eine Abfrage zu der Tabelle mm_positions und filter nach der "id" von mm_order (in mm_positions habe ich ja über das "select" den verbundenen Wert stehen). Lasse mir die Werte am Ende der foreach-Schleife ausgeben.
    metamodel_prerendered.html:
    Code:
    <?php
    /* Parameter*/
    // Name der MetaModel Tabelle (siehe "Das erstes Metamodel")
    $modelName = 'mm_positions';
    // ID der Render-Einstellungen "FE-Liste"
    $renderId = 7;
    // ID des Filters
    $filterId = 7;
    ?>
    
    <?php if (count($this->data)): ?>
    
        <div class="layout_full">
    
            <?php foreach ($this->data as $arrItem): ?>
                
                <?php
                $numItems = count($arrItem['attributes']);
                $i = 0;
                ?>
    
                <?php $this->block('item'); ?>
                <div class="item <?= $arrItem['class'] ?>">
    
                    <?php foreach ($arrItem['attributes'] as $field => $strName): ?>
    
                        <?php if ((isset($arrItem[$this->getFormat()][$field])
                                   && ($strValue = $arrItem[$this->getFormat()][$field])
                                   || (isset($arrItem['text'][$field]) && ($strValue = $arrItem['text'][$field])))): ?>
                            <div class="field <?= $field ?>">
                                <?php if (!$this->view->get('hideLabels')): ?>
                                    <div class="label"><?= sprintf(
                                            $GLOBALS['TL_LANG']['MSC']['field_label'],
                                            $strName
                                        ) ?></div>
                                <?php endif; ?>
                                <div class="value"> <?= $strValue ?></div>
                            </div>
                            <?php if (++$i === $numItems): ?>
                                <?php
                                /* Interface */
                                $factory = $this->getContainer()->get('metamodels.factory');
                                $model = $factory->getMetaModel($modelName);
    
                                $position_order_number_current = $arrItem['raw']['id'];
                                $arrFilterorder_number = ['position_order_number_filter' => $position_order_number_current];
                                $filter = $model->prepareFilter($filterId, $arrFilterorder_number);
                                // alle Items
                                $items = $model->findByFilter($filter);
                                // alle Items geparst zu Array mit HTML5 Knoten
                                $arrItemsPosition = $items->parseAll('html5', $model->getView($renderId));
    
                                /* Ausgabe */
                                // Anzahl der Items
                                // cecho 'Anzahl: '.$items->getCount()."<br>\n";
                                ?>
                                <div class="field product-number">
                                <?php                            
                                // Items-Array
                                foreach ($arrItemsPosition as $arrItemPosition)
                                {
                                    echo $arrItemPosition['html5']['position_product_number'];
                                }
                                ?>
                                </div>
    
                            <?php endif; ?>
                        <?php endif; ?>
                    <?php endforeach; ?>
                    <?php $this->block('actions'); ?>
                    <div class="actions">
                        <?php foreach ($arrItem['actions'] as $action): ?>
                            <?php $this->insert('mm_actionbutton', ['action' => $action]); ?>
                        <?php endforeach; ?>
                    </div>
                    <?php $this->endblock(); ?>
                </div>
                <?php $this->endblock(); ?>
            <?php endforeach; ?>
        </div>
    <?php else : ?>
        <?php $this->block('noItem'); ?>
        <p class="info"><?= $this->noItemsMsg ?></p>
        <?php $this->endblock(); ?>
    <?php endif; ?>
    Haben den Filter im MM Positions als Eigenes SQL:
    Code:
    SELECT id FROM mm_positions WHERE position_order_number = {{param::filter?name=position_order_number_filter}}
    P.S.: im Eingangspost war meine Filter-ID falsch. OO
    Das sollte auch funktionieren.
    Geändert von Kopfnuss (24.03.2021 um 10:53 Uhr)

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

    Standard

    das wäre "Variante a" aus #7

    Programmierung könnte man noch etwas optimieren - z.B. das in eine Funktion "nach oben" bringen und nicht jedes Mal den Container, Model usw. erstellen...

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
  •