Ergebnis 1 bis 3 von 3

Thema: [solved] Referenced Items mehrsprachig

  1. #1
    Contao-Nutzer Avatar von pout
    Registriert seit
    23.06.2009.
    Ort
    Wien
    Beiträge
    124
    User beschenken
    Wunschliste

    Standard [solved] Referenced Items mehrsprachig

    Hallo,

    ich habe ein MM Products und ein MM Textmodules. Beide enthalten übersetzte Attribute.

    In MM Products kann ich über eine Mehrfachauswahl Textbausteine aus MM Textmodules zuordnen.
    MM Textmodules hat nur 2 übersetzte Atrribute:
    1.) Name des Textbausteines = Überschrift
    2.) Text

    Ich möchte nun in der Detailansicht von MM Products, die immer nur 1 Produkt enthält, die zugeordneten Textbausteine ausgeben.

    MM Textmodules - eigener SQL-Filter (id=4):
    Code:
    SELECT products.id, relation.item_id, header.item_id, header.value, text.value, sort.sorting
    FROM `tl_metamodel_tag_relation`  as relation, 
    `mm_products` as products, 
    `tl_metamodel_translatedtext` as header,
    `tl_metamodel_translatedlongtext` as text,
    `mm_textmodules` as sort
    WHERE products.id = relation.item_id
    AND relation.value_id = header.item_id
    AND relation.value_id =text.item_id
    AND sort.id = header.item_id
    AND header.att_id = 38
    AND text.att_id = 39
    AND relation.att_id = 40
    AND header.langcode= {{param::filter?name=lang}}
    AND text.langcode = {{param::filter?name=lang}}
    AND products.id = {{param::filter?name=id}}

    Template:

    PHP-Code:
    <?php 
    function getTextmodulesByProduct($itemId$format='html5')
    {
      
    $objMetaModel = \MetaModels\Factory::byTableName('mm_textmodules');
      
    $objFilter $objMetaModel->prepareFilter(4, array('id' => $itemId'lang' => $GLOBALS['TL_LANGUAGE']));
      
    $objItems $objMetaModel->findByFilter($objFilter'sorting');
      echo 
    count($arrItems $objItems->parseAll());
      return 
    $objItems->parseAll($format$objMetaModel->getView(12)); 
    ?>
    <?php 
    if (count($this->data)): ?> 
    <div class="product_detailview">

      <?php foreach ($this->data as $arrItem): ?>
     
      <div class="detailview">
        <h1 class="ce_headline"><?php echo $arrItem['text']['name'?> </h1>
        <p class="description"><?php echo $arrItem['text']['description']; ?></p>
        <p class="year"><?php echo $arrItem['text']['price']; ?></p>
        <p class="url"><?php echo $arrItem['html5']['url']; ?></p> 
      </div>

      <div class="referenced_textmodules">
      <?php foreach (getTextmodulesByProduct($arrItem['raw']['id']) as $arrTextmodules): ?>
        <div class="textmodule">
          <?php echo $arrTextmodules[$this->getFormat()]['blockname']; ?>
          <?php echo $arrTextmodules[$this->getFormat()]['textblock']; ?>
        </div>
      <?php endforeach; ?>
      </div>
     
      <?php endforeach; ?>
    </div>
    <?php endif; ?>
    1. Problem:
      Ich bekomme bei einem Artikel immer nur einen (den letzten) der beiden ausgewählten Textbausteine ausgegeben. Der selbe SQL-Code direkt (myphpAdmin) angewendet, gibt beide Einträge aus.
      Lasse ich
      Code:
      AND products.id = {{param::filter?name=id}}
      weg, erhalte ich beide (alle) vorhanden Einträge.
    2. Frage:
      Gibt es einen eleganteren Weg mit MM Methoden um zum Ergebnis zu kommen?


    Danke Roman
    Geändert von pout (16.02.2015 um 12:45 Uhr)

  2. #2
    Contao-Nutzer Avatar von pout
    Registriert seit
    23.06.2009.
    Ort
    Wien
    Beiträge
    124
    User beschenken
    Wunschliste

    Standard

    Das Problem ist, dass in tl_metamodels_translatedtext/translatedlongtext mit der id von mm_products selektiert wird, die ich an meinen Filter übergebe.

    Code:
     [arrMatches:protected] => Array ( [0] => 2 [1] => 2 ) )
    Es stimmt zwar die Anzahl, aber es ist immer die von mir an den Filter übergebene id, die für alle Abfragen genutzt wird.

    Code:
    [42] => Array
                    (
                        [query] => SELECT products.id, relation.item_id, header.item_id, header.value, text.value, sort.sorting
    FROM `tl_metamodel_tag_relation`  as relation, 
    `mm_products` as products, 
    `tl_metamodel_translatedtext` as header,
    `tl_metamodel_translatedlongtext` as text,
    `mm_textmodules` as sort
    WHERE products.id = relation.item_id
    AND relation.value_id = header.item_id
    AND relation.value_id =text.item_id
    AND sort.id = header.item_id
    AND header.att_id = 38
    AND text.att_id = 39
    AND relation.att_id = 40
    AND header.langcode= 'de'
    AND text.langcode = 'de'
    AND products.id = '2'
                        [explain] => Array
                            (
                                [id] => 1
                                [select_type] => SIMPLE
                                [table] => products
                                [type] => const
                                [possible_keys] => PRIMARY
                                [key] => PRIMARY
                                [key_len] => 4
                                [ref] => const
                                [rows] => 1
                                [Extra] => Using index
                            )
    
                        [returned] => 2 row(s) returned
                    )
    
                [43] => Array
                    (
                        [query] => SELECT * FROM mm_textmodules WHERE id IN ('2') ORDER BY FIELD(id,'2')
                        [explain] => Array
                            (
                                [id] => 1
                                [select_type] => SIMPLE
                                [table] => mm_textmodules
                                [type] => const
                                [possible_keys] => PRIMARY
                                [key] => PRIMARY
                                [key_len] => 4
                                [ref] => const
                                [rows] => 1
                                [Extra] => 
                            )
    
                        [returned] => 1 row(s) returned
                    )
    
                [44] => Array
                    (
                        [query] => SELECT * FROM tl_metamodel_translatedtext WHERE att_id='38' AND item_id IN ('2') AND langcode='de'
                        [explain] => Array
                            (
                                [id] => 1
                                [select_type] => SIMPLE
                                [table] => tl_metamodel_translatedtext
                                [type] => ref
                                [possible_keys] => attvalue,attlang,attitem
                                [key] => attlang
                                [key_len] => 12
                                [ref] => const,const
                                [rows] => 2
                                [Extra] => Using where
                            )
    
                        [returned] => 1 row(s) returned
                    )
    
                [45] => Array
                    (
                        [query] => SELECT * FROM tl_metamodel_translatedlongtext WHERE att_id='39' AND item_id IN ('2') AND langcode='de'
                        [explain] => Array
                            (
                                [id] => 1
                                [select_type] => SIMPLE
                                [table] => tl_metamodel_translatedlongtext
                                [type] => ref
                                [possible_keys] => attlang,attitem
                                [key] => attlang
                                [key_len] => 12
                                [ref] => const,const
                                [rows] => 2
                                [Extra] => Using where
                            )
    
                        [returned] => 1 row(s) returned
                    )
    in allen Abfragen ist die übergebene id (=2) statt der value_id's.
    Offensichtlich könnte ich den Filter irgendwie einfacher machen, da die Abfragen an tl_metamodel_translatedlongtext/translatedtext von Metamodels generiert werden, aber wie?

  3. #3
    Contao-Nutzer Avatar von pout
    Registriert seit
    23.06.2009.
    Ort
    Wien
    Beiträge
    124
    User beschenken
    Wunschliste

    Standard

    Also: Es ist alles viel einfacher, wie ich vermutete:

    • Die Textbausteine (mm_textmodules) brauchen ein Attribut, dass nicht übersetzt ist, damit man einen vernünftigen Bezeichner hat. Ich habe ein Textfeld und es "Name des Textbausteines" genannt.
    • Im MM products gibt es eine Mehrfachauswahl "Textbausteine" (Spaltenname: textmodules). Hier wird Datenbanktabelle mm_textmodules ausgewählt und als Alias für Mehrfachauswahl: id.
    • Im Template kann dann so zugegriffen werden:
      PHP-Code:
      <?php if ($arrItem['raw']['textmodules']): ?>
      <?php 
      foreach ($arrItem['raw']['textmodules'] as $textmodule):
        echo (
      '<h2>'.$textmodule['textblock_header'].'</h2>'.$textmodule['textblock']);
         endforeach; 
      ?>
      <?php 
      endif; ?>

    (Mein Fehler war, dass ich bei der Mehrfachauswahl "Textbausteine" die Datenbanktabelle tl_metamodel_translatedtext (mit eigenem SQL) verwendet hatte um einen vernünftigen Bezeichner ausgeben zu können, daher standen mit die Textbausteine im Template nicht direkt zur Verfügung)

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
  •