MetaModels Beispiel: Referenced items: Unterschied zwischen den Versionen
Aus Contao Community Documentation
Luis (Diskussion | Beiträge) (→Zwei MetaModels zu einander referenzieren) |
Zonky (Diskussion | Beiträge) K (Hinweis Handbuch) |
||
(6 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
+ | {{Hinweis|Die Angaben, Beschreibungen und Screenshot beziehen sich auf MetaModels bis etwa Mitte 2016 und sind nicht aktuell! | ||
+ | Im [http://metamodels.readthedocs.io/de/latest/ MetaModels-Handbuch] sind aktuelle Angaben zu finden.}} | ||
+ | |||
[[Category:MetaModels|T2]] | [[Category:MetaModels|T2]] | ||
− | = | + | =MetaModels miteinander verknüpfen= |
==Ausgangslage== | ==Ausgangslage== | ||
Es gibt ein MetaModel mit "Kunden" (mm_customers) und eines mit "Projekte" (mm_projects). mm_projects enthält ein Attribut "customer" vom Typ "select", welches die in mm_customer erfassten Kunden anzeigt. Über dieses Feld wird das Projekt mit dem Kunden verknüpft. | Es gibt ein MetaModel mit "Kunden" (mm_customers) und eines mit "Projekte" (mm_projects). mm_projects enthält ein Attribut "customer" vom Typ "select", welches die in mm_customer erfassten Kunden anzeigt. Über dieses Feld wird das Projekt mit dem Kunden verknüpft. | ||
Zeile 7: | Zeile 10: | ||
==Lösungsansatz== | ==Lösungsansatz== | ||
− | + | Nebst den spezifischen Kunden-Detailinformationen sollen die Projekte gelistet darunter erscheinen. Die Projekte werden jeweils mit einem Titel-Link (h3), einer Kurzbeschreibung und der dazu gehörigen Bildgalerie angezeigt. Die Projekte werden überdies über einen Filter sortiert: | |
<source lang="php">$objFilter = $objMetaModel->prepareFilter(10, array()); </source> | <source lang="php">$objFilter = $objMetaModel->prepareFilter(10, array()); </source> | ||
In diesem Fall ist '10' die ID des Filters im MetaModels 'mm_projects'. Der Filter sorgt dafür, dass die Projekte chronologisch aufgelistet werden. | In diesem Fall ist '10' die ID des Filters im MetaModels 'mm_projects'. Der Filter sorgt dafür, dass die Projekte chronologisch aufgelistet werden. | ||
Das MetaModels-Template könnte wie folgt aussehen: | Das MetaModels-Template könnte wie folgt aussehen: | ||
+ | {{Hinweis|Beachte das in der TNG Version MetaModels auch auf Namespace umgestellt wurde und die Factory Aufrufe entsprechend anders lauten müssen: \MetaModels\Factory s.u.}} | ||
+ | '''Quelltext ohne Namespace:''' | ||
<source lang="php"> | <source lang="php"> | ||
<?php | <?php | ||
Zeile 20: | Zeile 25: | ||
$objFilter = $objMetaModel->prepareFilter(10, array()); | $objFilter = $objMetaModel->prepareFilter(10, array()); | ||
$objFilter->addFilterRule(new MetaModelFilterRuleSearchAttribute($objMetaModel->getAttribute('customer'), $strAlias, $objMetaModel->getAvailableLanguages())); | $objFilter->addFilterRule(new MetaModelFilterRuleSearchAttribute($objMetaModel->getAttribute('customer'), $strAlias, $objMetaModel->getAvailableLanguages())); | ||
+ | $objItems = $objMetaModel->findByFilter($objFilter); | ||
+ | return $objItems->parseAll($format, $objMetaModel->getView(3)); | ||
+ | } | ||
+ | ?> | ||
+ | |||
+ | <div class="customer_detailview"> | ||
+ | <?php foreach ($this->data as $arrItem): ?> | ||
+ | |||
+ | <div class="detailview"> | ||
+ | <h1 class="ce_headline"><?php echo $arrItem['text']['customer']; ?></h1> | ||
+ | <p class="description"><?php echo $arrItem['text']['description']; ?></p> | ||
+ | <p class="year"><?php echo $arrItem['text']['year']; ?></p> | ||
+ | <p class="url"><?php echo $arrItem['html5']['url']; ?></p> | ||
+ | </div> | ||
+ | |||
+ | <div class="referenced_projects"> | ||
+ | <h2>Projekte</h2> | ||
+ | <?php foreach (getProjectsByCustomer($arrItem['raw']['alias']) as $arrProjects): ?> | ||
+ | <?php if(!empty($arrProjects['raw']['images'])): ?> | ||
+ | <div class="project"> | ||
+ | <h3> | ||
+ | <a href="{{env::path}}<?php echo $arrProjects['jumpTo']['url']; ?>"> | ||
+ | <?php echo $arrProjects[$this->getFormat()]['project_name']; ?> | ||
+ | </a> | ||
+ | </h3> | ||
+ | <?php echo $arrProjects[$this->getFormat()]['description']; ?> | ||
+ | <?php echo $arrProjects[$this->getFormat()]['images']; ?> | ||
+ | </div> | ||
+ | <?php endif; ?> | ||
+ | <?php endforeach; ?> | ||
+ | </div> | ||
+ | |||
+ | <?php endforeach; ?> | ||
+ | </div> | ||
+ | |||
+ | </source> | ||
+ | |||
+ | '''Quelltext mit Namespace:''' | ||
+ | <source lang="php"> | ||
+ | <?php | ||
+ | function getProjectsByCustomer($strAlias, $format='html5') | ||
+ | { | ||
+ | $objMetaModel = \MetaModels\Factory::byTableName('mm_projects'); | ||
+ | $objFilter = $objMetaModel->prepareFilter(10, array()); | ||
+ | $objFilter->addFilterRule(new \MetaModels\Filter\Rules\SearchAttribute($objMetaModel->getAttribute('customer'), $strAlias, $objMetaModel->getAvailableLanguages())); | ||
$objItems = $objMetaModel->findByFilter($objFilter); | $objItems = $objMetaModel->findByFilter($objFilter); | ||
return $objItems->parseAll($format, $objMetaModel->getView(3)); | return $objItems->parseAll($format, $objMetaModel->getView(3)); |
Aktuelle Version vom 26. Januar 2017, 13:14 Uhr
Hinweis: Die Angaben, Beschreibungen und Screenshot beziehen sich auf MetaModels bis etwa Mitte 2016 und sind nicht aktuell!
Im MetaModels-Handbuch sind aktuelle Angaben zu finden. |
Inhaltsverzeichnis
MetaModels miteinander verknüpfen
Ausgangslage
Es gibt ein MetaModel mit "Kunden" (mm_customers) und eines mit "Projekte" (mm_projects). mm_projects enthält ein Attribut "customer" vom Typ "select", welches die in mm_customer erfassten Kunden anzeigt. Über dieses Feld wird das Projekt mit dem Kunden verknüpft.
Aufgabenstellung
Man möchte, dass auf der Detailansicht des Kunden, auch die jeweils dazu gehörigen Projekte angezeigt werden. Von dort möchte man auch per Link auf die Detailansicht des spezifischen Projektes springen können.
Lösungsansatz
Nebst den spezifischen Kunden-Detailinformationen sollen die Projekte gelistet darunter erscheinen. Die Projekte werden jeweils mit einem Titel-Link (h3), einer Kurzbeschreibung und der dazu gehörigen Bildgalerie angezeigt. Die Projekte werden überdies über einen Filter sortiert:
$objFilter = $objMetaModel->prepareFilter(10, array());
In diesem Fall ist '10' die ID des Filters im MetaModels 'mm_projects'. Der Filter sorgt dafür, dass die Projekte chronologisch aufgelistet werden.
Das MetaModels-Template könnte wie folgt aussehen:
Hinweis: Beachte das in der TNG Version MetaModels auch auf Namespace umgestellt wurde und die Factory Aufrufe entsprechend anders lauten müssen: \MetaModels\Factory s.u. |
Quelltext ohne Namespace:
<?php function getProjectsByCustomer($strAlias, $format='html5') { $objMetaModel = MetaModelFactory::byTableName('mm_projects'); $objFilter = $objMetaModel->prepareFilter(10, array()); $objFilter->addFilterRule(new MetaModelFilterRuleSearchAttribute($objMetaModel->getAttribute('customer'), $strAlias, $objMetaModel->getAvailableLanguages())); $objItems = $objMetaModel->findByFilter($objFilter); return $objItems->parseAll($format, $objMetaModel->getView(3)); } ?> <div class="customer_detailview"> <?php foreach ($this->data as $arrItem): ?> <div class="detailview"> <h1 class="ce_headline"><?php echo $arrItem['text']['customer']; ?></h1> <p class="description"><?php echo $arrItem['text']['description']; ?></p> <p class="year"><?php echo $arrItem['text']['year']; ?></p> <p class="url"><?php echo $arrItem['html5']['url']; ?></p> </div> <div class="referenced_projects"> <h2>Projekte</h2> <?php foreach (getProjectsByCustomer($arrItem['raw']['alias']) as $arrProjects): ?> <?php if(!empty($arrProjects['raw']['images'])): ?> <div class="project"> <h3> <a href="{{env::path}}<?php echo $arrProjects['jumpTo']['url']; ?>"> <?php echo $arrProjects[$this->getFormat()]['project_name']; ?> </a> </h3> <?php echo $arrProjects[$this->getFormat()]['description']; ?> <?php echo $arrProjects[$this->getFormat()]['images']; ?> </div> <?php endif; ?> <?php endforeach; ?> </div> <?php endforeach; ?> </div>
Quelltext mit Namespace:
<?php function getProjectsByCustomer($strAlias, $format='html5') { $objMetaModel = \MetaModels\Factory::byTableName('mm_projects'); $objFilter = $objMetaModel->prepareFilter(10, array()); $objFilter->addFilterRule(new \MetaModels\Filter\Rules\SearchAttribute($objMetaModel->getAttribute('customer'), $strAlias, $objMetaModel->getAvailableLanguages())); $objItems = $objMetaModel->findByFilter($objFilter); return $objItems->parseAll($format, $objMetaModel->getView(3)); } ?> <div class="customer_detailview"> <?php foreach ($this->data as $arrItem): ?> <div class="detailview"> <h1 class="ce_headline"><?php echo $arrItem['text']['customer']; ?></h1> <p class="description"><?php echo $arrItem['text']['description']; ?></p> <p class="year"><?php echo $arrItem['text']['year']; ?></p> <p class="url"><?php echo $arrItem['html5']['url']; ?></p> </div> <div class="referenced_projects"> <h2>Projekte</h2> <?php foreach (getProjectsByCustomer($arrItem['raw']['alias']) as $arrProjects): ?> <?php if(!empty($arrProjects['raw']['images'])): ?> <div class="project"> <h3> <a href="{{env::path}}<?php echo $arrProjects['jumpTo']['url']; ?>"> <?php echo $arrProjects[$this->getFormat()]['project_name']; ?> </a> </h3> <?php echo $arrProjects[$this->getFormat()]['description']; ?> <?php echo $arrProjects[$this->getFormat()]['images']; ?> </div> <?php endif; ?> <?php endforeach; ?> </div> <?php endforeach; ?> </div>