Ergebnis 1 bis 14 von 14

Thema: Template für Ausgabe als Tabelle

  1. #1
    Contao-Nutzer
    Registriert seit
    13.06.2010.
    Beiträge
    28

    Standard Template für Ausgabe als Tabelle

    Vielen Dank an die Entwickler von Metamodels & Contao! Contao ist schon genial, aber Metamodels hebt auch Contao noch ein Stück höher.

    ich bin gerade dabei mich in Metamodels einzuarbeiten und stehe gerade vor folgendem Problem:

    Ich habe mir ein Template erstellt. Leider zeigt er mir jetzt nur den Tabelleninhalt an und nicht den Kopf. Was muss ich denn über "table" schreiben damit er mir einmalig die Feldbezeichnungen in den Tabellenkopf ausgibt?

    HTML-Code:
    <?php if (count($this->data)): /* display only if there is data. */ ?>
    
      <table class="termintabelle">
    	<thead>
    	<tr>
    	<th><?php echo $arrItem['attributes']['title']; ?></th>
    	<th><?php echo $arrItem['attributes']['startdatum']; ?></th>
    	<th><?php echo $arrItem['attributes']['enddatum']; ?></th>
    	<th><?php echo $arrItem['attributes']['meldeschluss']; ?></th>
    	<th><?php echo $arrItem['attributes']['ort']; ?></th>
    	<th><?php echo $arrItem['attributes']['kontaktperson']; ?></th>
    	<th><?php echo $arrItem['attributes']['email']; ?></th>
    	</tr>
    	</thead>
    
    	<tbody>
    
    <?php foreach ($this->data as $arrItem): /* loop over all items. */ ?>
    
    
        <tr>
    	<td><?php echo $arrItem['text']['title']; ?></td>
    	<td><?php echo $arrItem['text']['startdatum']; ?></td>
    	<td><?php echo $arrItem['text']['enddatum']; ?></td>
    	<td><?php echo $arrItem['text']['meldeschluss']; ?></td>
            <td><?php echo $arrItem['text']['ort']; ?></td>
            <td><?php echo $arrItem['text']['kontaktperson']; ?></td>
            <td><a href="mailto:<?php echo $arrItem['text']['email']; ?>"><?php echo $arrItem['text']['email']; ?></a></td>
        </tr>
    
     <?php endforeach; /* item loop */ ?>
    
    	</tbody>
      </table>
    
    <?php endif; ?>
    Grüße aus dem gerade sonnigen Baden
    simkay

  2. #2
    Maintainer Avatar von xtra
    Registriert seit
    02.07.2009.
    Ort
    Tuebingen
    Beiträge
    2.007
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von simkay Beitrag anzeigen
    Vielen Dank an die Entwickler von Metamodels & Contao! Contao ist schon genial, aber Metamodels hebt auch Contao noch ein Stück höher.
    Freut mich dass es dir gefaellt.

    ich bin gerade dabei mich in Metamodels einzuarbeiten und stehe gerade vor folgendem Problem:

    Ich habe mir ein Template erstellt. Leider zeigt er mir jetzt nur den Tabelleninhalt an und nicht den Kopf. Was muss ich denn über "table" schreiben damit er mir einmalig die Feldbezeichnungen in den Tabellenkopf ausgibt?

    HTML-Code:
    <?php if (count($this->data)): /* display only if there is data. */ ?>
    <?php $arrItem = $this->data[0]; /* fetch first item for title columns. */ ?>
      <table class="termintabelle">
    	<thead>
    	<tr>
    	<th><?php echo $arrItem['attributes']['title']; ?></th>
    	<th><?php echo $arrItem['attributes']['startdatum']; ?></th>
    	<th><?php echo $arrItem['attributes']['enddatum']; ?></th>
    	<th><?php echo $arrItem['attributes']['meldeschluss']; ?></th>
    	<th><?php echo $arrItem['attributes']['ort']; ?></th>
    	<th><?php echo $arrItem['attributes']['kontaktperson']; ?></th>
    	<th><?php echo $arrItem['attributes']['email']; ?></th>
    	</tr>
    	</thead>
    
    	<tbody>
    
    <?php foreach ($this->data as $arrItem): /* loop over all items. */ ?>
    
    
        <tr>
    	<td><?php echo $arrItem['text']['title']; ?></td>
    	<td><?php echo $arrItem['text']['startdatum']; ?></td>
    	<td><?php echo $arrItem['text']['enddatum']; ?></td>
    	<td><?php echo $arrItem['text']['meldeschluss']; ?></td>
            <td><?php echo $arrItem['text']['ort']; ?></td>
            <td><?php echo $arrItem['text']['kontaktperson']; ?></td>
            <td><a href="mailto:<?php echo $arrItem['text']['email']; ?>"><?php echo $arrItem['text']['email']; ?></a></td>
        </tr>
    
     <?php endforeach; /* item loop */ ?>
    
    	</tbody>
      </table>
    
    <?php endif; ?>
    Das sollte dir helfen.

    Gruss
    Chris
    Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.

  3. #3
    Contao-Nutzer
    Registriert seit
    13.06.2010.
    Beiträge
    28

    Standard

    Hi. Danke für deine schnelle Antwort.

    edit:
    OK, spitze danke dir vielmals. Jetzt gehts. Hatte nur vergessen dein Tag auch zu schliessen.

    Also für alle die etwas ähnliches vorhaben:

    HTML-Code:
    <?php if (count($this->data)): /* display only if there is data. */ ?>
    <?php $arrItem = $this->data[0]; /* fetch first item for title columns. */ ?>
    
    <table class="termintabelle">
    	<thead>
    	<tr>
    	<th><?php echo $arrItem['attributes']['title']; ?></th>
    	<th><?php echo $arrItem['attributes']['startdatum']; ?></th>
    	<th><?php echo $arrItem['attributes']['enddatum']; ?></th>
    	<th><?php echo $arrItem['attributes']['meldeschluss']; ?></th>
    	<th><?php echo $arrItem['attributes']['ort']; ?></th>
    	<th><?php echo $arrItem['attributes']['kontaktperson']; ?></th>
    	<th><?php echo $arrItem['attributes']['email']; ?></th>
    	</tr>
    	</thead>
    	<tbody>
          
     <?php?>
    
    <?php foreach ($this->data as $arrItem): /* loop over all items. */ ?>
    
        <tr>
    	<td><?php echo $arrItem['text']['title']; ?></td>
    	<td><?php echo $arrItem['text']['startdatum']; ?></td>
    	<td><?php echo $arrItem['text']['enddatum']; ?></td>
    	<td><?php echo $arrItem['text']['meldeschluss']; ?></td>
            <td><?php echo $arrItem['text']['ort']; ?></td>
            <td><?php echo $arrItem['text']['kontaktperson']; ?></td>
            <td><a href="mailto:<?php echo $arrItem['text']['email']; ?>"><?php echo $arrItem['text']['email']; ?></a></td>
            </tr>
    	
     <?php endforeach; /* item loop */ ?>
       
    	</tbody>
    </table>
        
      <?php endif; ?>
    Geändert von simkay (20.03.2013 um 15:11 Uhr)

  4. #4
    Contao-Fan
    Registriert seit
    19.06.2009.
    Ort
    Mittelhessen
    Beiträge
    463

    Standard

    Hallo,

    ich möchte gerne ebenfalls meine MetaModels Liste als Tabelle darstellen. Nur sollten die Tabellenfelder "automatisch" erzeugt werden, damit ich dieses Tabellentemplate "frei" nutzen kann. In der hier angegebenen Tabelle werden die Attribute für die Tabelle ja vorgegeben.

    Mit meinen begrenzten "Fähigkeiten" habe ich mir jetzt das folgende Template zusammen gestrickt:

    PHP-Code:
    <?php $strRendersettings = ($this->settings)? 'settings' 'view'?>
    <?php 
    if (count($this->data)): ?>

    <div class="layout_full">
    <table class="sortable ce_table" id="sortable">
    <thead>
    <?php 
        $i 
    == 0
    ?>

    <?php foreach ($this->data as $arrItem): ?>
    <?php 
        
    if ($i == 0): 
    ?>
    <tr class="item <?php echo $arrItem['class']; ?>">
        <?php foreach ($arrItem['attributes'] as $field => $strName): ?>
            <?php if (($strValue $arrItem[$this->getFormat()][$field]) || ($strValue $arrItem['text'][$field])): ?>
    <th class="field <?php echo $field?> label">
    <?php echo sprintf($GLOBALS['TL_LANG']['MSC']['field_label'], $strName); ?>
    </th>
            <?php endif; ?>
        <?php endforeach; ?>
            <?php if ($arrItem['jumpTo']['deep']): ?>
    <th class="mm_details_th">Details:</th>
            <?php endif; ?>
    </tr>
    <?php 
        $i
    ++; 
        endif;
    ?>
    <?php 
    endforeach; ?>
    </thead>
    <tbody>
    <?php foreach ($this->data as $arrItem): ?>
    <tr class="item <?php echo $arrItem['class']; ?>">

        <?php foreach ($arrItem['attributes'] as $field => $strName): ?>
        <?php if (($strValue $arrItem[$this->getFormat()][$field]) || ($strValue $arrItem['text'][$field])): ?>
    <td class="field <?php echo $field?> value">
    <?php echo $strValue?>
    </td>
    <?php endif; ?>
    <?php 
    endforeach; ?>
        <?php if ($arrItem['jumpTo']['deep']): ?>
    <td><a href="<?php echo $arrItem['jumpTo']['url']; ?>"><?php echo $this->details?></a></td>
        <?php endif; ?>
    </tr>
    <?php endforeach; ?>
    </tbody>
    </table>
    </div>
    <?php else: ?>
    <p class="info"><?php echo $this->noItemsMsg?></p>
    <?php endif; ?>

    <!-- indexer::stop -->
    <script type="text/javascript">
    <!--//--><![CDATA[//><!--
    window.addEvent('domready', function() {
      new TableSort('sortable', '.', ',');
    });
    //--><!]]>
    </script>
    <!-- indexer::continue -->
    Damit die Tabelle im Frontend noch sortierbar ist, und wie die üblichen Tabellen aussieht, habe ich auch noch die Klassen class="sortable ce_table" und die ID id="sortable" eingefügt. Zusätzlich am Ende das JavaScript.
    Zusätzlich habe ich noch in das Seitenlayout unter Eigener Java-Script Code eingefügt:
    Code:
    <!-- indexer::stop -->
    <link rel="stylesheet" href="plugins/tablesort/css/tablesort.css" type="text/css" media="screen" />
    <script type="text/javascript" src="plugins/tablesort/js/tablesort.js"></script>
    <!-- indexer::continue -->
    Folgende Probleme habe ich jetzt noch:

    1. Optimierung:
    Ich bin davon überzeugt, dass der Code für die Ausgabe der Kopfzeile viel besser gelöst werden kann, weiß aber nicht wie.

    2. Leere Felder
    Wenn in einem Datensatz ein Feld leer bleibt, dann wird in der Tabelle kein leeres Tabellenfeld erzeugt, sondern die Einträge werden in der Zeile um ein Feld nach links verschoben.

    3. Mehrere Einträge
    Enthält ein Feld mehrere Einträge, z.B. beim Feld Mehrfachauswahl, dann rutscht meine Tabelle nach rechts. Hier müsste ich eine Lösung finden, damit die Einträge gemeinsam in ein Tabellenfeld geschrieben werden.

    Würde mich freuen, wenn mir jemand bei der Umsetzung die entscheidenden Tipps geben könnte.

    Viele Grüße
    André

  5. #5
    Contao-Fan
    Registriert seit
    19.06.2009.
    Ort
    Mittelhessen
    Beiträge
    463

    Standard

    Bin jetzt soweit, dass alles wunschgemäß funktioniert.

    Für die Kopfzeile konnte ich nach einigem Probieren die Einstellungen aus dem hier aufgeführten oberen Template übernehmen, damit bin ich mit der Optimierung sicher einen Schritt weiter, reicht mir auch soweit.

    Die Leeren Felder werden ausgegeben, wenn man in den Rendereinstellungen das Feld "Leere Einträge verbergen" nicht auswählt, ich hatte da einen haken gesetzt, jetzt werden auch die leeren Tabellenzellen mit ausgegeben.

    Mein Problem mit "mehreren Einträgen" hat sich in Luft aufgelöst, vielleicht durch ein Update oder irgendwelches Probieren, keine Ahnung, funktioniert jetzt auf jeden Fall.

    Mein Template sieht jetzt so aus, falls es noch jemand gebrauchen kann:
    Code:
    <?php $strRendersettings = ($this->settings)? 'settings' : 'view'; ?>
    <?php if (count($this->data)): ?>
    
    <div class="layout_full">
    <table class="sortable ce_table" id="sortable">
    <thead>
    <?php $arrItem = $this->data[0]; /* fetch first item for title columns. */ ?>
    <tr class="item <?php echo $arrItem['class']; ?>">
    	<?php foreach ($arrItem['attributes'] as $field => $strName): ?>
    		<?php if (($strValue = $arrItem[$this->getFormat()][$field]) || ($strValue = $arrItem['text'][$field])): ?>
    <th class="field <?php echo $field; ?> label">
    <?php echo sprintf($GLOBALS['TL_LANG']['MSC']['field_label'], $strName); ?>
    </th>
    		<?php endif; ?>
    	<?php endforeach; ?>
    		<?php if ($arrItem['jumpTo']['deep']): ?>
    <th class="mm_details_th">Details:</th>
    		<?php endif; ?>
    </tr>
    </thead>
    <tbody>
    <?php foreach ($this->data as $arrItem): ?>
    <tr class="item <?php echo $arrItem['class']; ?>">
    	<?php foreach ($arrItem['attributes'] as $field => $strName): ?>
    		<?php if (($strValue = $arrItem[$this->getFormat()][$field]) || ($strValue = $arrItem['text'][$field])): ?>
    <td class="field <?php echo $field; ?> value">
    <?php echo $strValue; ?>
    </td>
    <?php endif; ?>
    <?php endforeach; ?>
    	<?php if ($arrItem['jumpTo']['deep']): ?>
    <td><a href="<?php echo $arrItem['jumpTo']['url']; ?>"><?php echo $this->details; ?></a></td>
    	<?php endif; ?>
    </tr>
    <?php endforeach; ?>
    </tbody>
    </table>
    </div>
    <?php else: ?>
    <p class="info"><?php echo $this->noItemsMsg; ?></p>
    <?php endif; ?>
    
    <!-- indexer::stop -->
    <script type="text/javascript">
    <!--//--><![CDATA[//><!--
    window.addEvent('domready', function() {
      new TableSort('sortable', '.', ',');
    });
    //--><!]]>
    </script>
    <!-- indexer::continue -->

  6. #6
    Contao-Nutzer
    Registriert seit
    15.05.2012.
    Beiträge
    171

    Standard

    Vielen Dank für das Template!
    An und für sich läuft es bei mir, doch wird die tablesort.js nicht geladen. Bei ce_Elementen (Tabelle) funktioniert das Sortieren prinzipiell, es liegt also nicht an meiner Contao-Installation, das Plugin ist da und Contao kann darauf zugreifen.
    Eine Idee, woran es bei Deinem Template hapern könnte?

    Danke!

  7. #7
    Contao-Fan
    Registriert seit
    19.06.2009.
    Ort
    Mittelhessen
    Beiträge
    463

    Standard

    Zitat Zitat von Mary Beitrag anzeigen
    Eine Idee, woran es bei Deinem Template hapern könnte?
    Mein Template funktioniert bei mir, bei Deinem Template hapert es

    Nein, mal im Ernst, hast Du im Seitenlayout, dass für die Seite genutzt wird auch den JavaScript-Code eingefügt?
    Es gibt da ein Feld "Eigener JavaScript-Code".
    Code:
    <!-- indexer::stop -->
    <link rel="stylesheet" href="plugins/tablesort/css/tablesort.css" type="text/css" media="screen" />
    <script type="text/javascript" src="plugins/tablesort/js/tablesort.js"></script>
    <!-- indexer::continue -->

  8. #8
    Contao-Nutzer
    Registriert seit
    15.05.2012.
    Beiträge
    171

    Standard

    Ja, danke, damit funktioniert's!
    Ich schließe daraus, dass Contao die Javascript-Einbindung wie durch Wunderhand automatisch hinzufügt, sobald ich eine ce_table hinzufüge. War mir bisher nicht bewusst. Wieder was gelernt :-).

    ERGÄNZUNG:
    Und mit dieser Extension muss man das nicht generell im Seitenlayout einbauen, sondern kann es individuell nur einer bestimmten Seite zuweisen. Super Sache!
    Geändert von Mary (13.11.2013 um 13:01 Uhr) Grund: Ergänzung

  9. #9
    Contao-Fan
    Registriert seit
    21.02.2010.
    Beiträge
    306

    Standard

    Wie kann ich hier in dieses Template noch ein odd oder even einbauen, um die einzelnen Zeilen farblich unterscheiden zu können?

    Gruß, Thomas

  10. #10
    Contao-Urgestein
    Registriert seit
    07.07.2009.
    Beiträge
    4.107

    Standard

    Zitat Zitat von tofo Beitrag anzeigen
    Wie kann ich hier in dieses Template noch ein odd oder even einbauen, um die einzelnen Zeilen farblich unterscheiden zu können?

    Gruß, Thomas
    Das Bedarf etwas mehr Code, daher die Frage: Wäre es nicht ausreichend das auch über CSS zu lösen?

  11. #11
    Contao-Fan
    Registriert seit
    21.02.2010.
    Beiträge
    306

    Standard

    Bin leider, was CSS und PHP betrifft, ein wenig eingerostet. Ich dachte, es wäre daher recht einfach, mittels odd/even Prüfung in PHP ein class="odd" oder class="even" mitzuschicken.

    Gruß, Thomas

  12. #12
    Wandelndes Contao-Lexikon Avatar von tab
    Registriert seit
    22.10.2013.
    Beiträge
    10.077
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Naja, etwas mehr Code ist ja nicht viel mehr Code. Das einzubauen dürfte also nicht schwierig sein. Aber wirklich notwendig wird es wohl kaum sein, da es eben auch ohne die zusätzliche Klasse leicht über CSS gemacht werden kann. Stichworte: Pseudoklassen, nth-child, nth-of-type. Ein kleines Beispiel zur Verwendung mit Tabellen findet sich z.B. hier.

  13. #13
    Contao-Fan
    Registriert seit
    21.02.2010.
    Beiträge
    306

    Standard

    Danke für den Hinweis, hab's verstanden. Merci.

    Gruß, Thomas

  14. #14
    Contao-Fan
    Registriert seit
    21.02.2010.
    Beiträge
    306

    Standard

    So, ich hab nun ein wenig herumgebastelt und will aus meinem aktuellen Projekt etwas an die Allgemeinheit zurückgeben.

    Es taucht doch immer wieder der Wunsch auf, eine ganze Tabellenzeile klickbar zu machen, um auf eine Folgeseite zu kommen. Lösungsansätze gäbe es viele, angefangen von normalen HTML/CSS oder in Kombination mit jQuery. Ich habe mich für eine DIV-Tabelle entschieden, weil man hier recht einfach den link mit einbauen kann.

    Code geht wie folgt:
    PHP-Code:
    <?php $strRendersettings = ($this->settings)? 'settings' 'view'?>
    <?php 
    if (count($this->data)): ?>

    <div class="table ce_table layout_full" id="meine-tabellen-id">
        <?php $arrItem $this->data[0]; /* fetch first item for title columns. */ ?>
        <div class="head <?php echo $arrItem['class']; ?>">
            <?php foreach ($arrItem['attributes'] as $field => $strName): ?>
            <?php if (($strValue $arrItem[$this->getFormat()][$field]) || ($strValue $arrItem['text'][$field])): ?>
            <div class="label <?php echo $field?>">
                <?php echo $strName?>
            </div>
            <?php endif; ?>
            <?php endforeach; ?>
        </div>
        
        <?php foreach ($this->data as $arrItem): ?>
        <?php if ($arrItem['jumpTo']['deep']): ?>
        <a href="<?php echo $arrItem['jumpTo']['url']; ?>" title="<?php echo $this->details?>" class="row <?php echo $arrItem['class']; ?> ">
        <?php else: ?>
        <div class="row item <?php echo $arrItem['class']; ?> ">
        <?php endif; ?>
            <?php foreach ($arrItem['attributes'] as $field => $strName): ?>
            <?php if (($strValue $arrItem[$this->getFormat()][$field]) || ($strValue $arrItem['text'][$field])): ?>
            <div class="cell value <?php echo $field?>">
                <?php echo $strValue?>
            </div>
            <?php endif; ?>
            <?php endforeach; ?>
        <?php if ($arrItem['jumpTo']['deep']): ?>
        </a>
        <?php else: ?>
        </div>
        <?php endif; ?>
        <?php endforeach; ?>
    </div>
    <?php else: ?>
    <p class="info"><?php echo $this->noItemsMsg?></p>
    <?php endif; ?>
    Soviel zum Template. Damit das ganze dann auch wie eine Tabelle aussieht, formatiert man das ganze dann mit CSS:
    Code:
    #meine-tabellen-id.table {
        display:table;
    }
    #meine-tabellen-id .row {
       display:table-row;
    }
    #meine-tabellen-id .cell, #meine-tabellen-id .label {
       display:table-cell;
    }
    #meine-tabellen-id .head {
       display:table-header-group;
    }
    #meine-tabellen-id .cell:hover {
        background-color:#ddd;
    }
    #meine-tabellen-id .row:hover {
        background-color:#ccc;
    }
    #meine-tabellen-id a {
        text-decoration: none;
        color:#000;
    }
    Das Template ist so konzipiert, dass der Link nur dann eingesetzt wird, wenn auch wirklich nur ein Link auf einen Datensatz vorhanden ist (<?php if ($arrItem['jumpTo']['deep']): ?>).

    Anregungen und Verbesserungsvorschläge immer gerne willkommen.

    Gruß, Thomas

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
  •