Jetzt ist es an der Zeit, die Templates für die Datenbank zu erstellen. Gehe in AdminCP zu Pages -> Seitenverwaltung -> Templates. Klicke auf Neu und wähle Datenbank Template hinzufügen. Gebe im Feld Name Docs und wähle Liste der Datensätze beim Template-Typ aus. Wende das Template gleich auf die Datenbank Dokumentation an.
Es wird ein neuer Template-Satz mit dem Namen Docs erstellt, der mehrere Template-Bits für die Auflistung der Datensätze beinhaltet.
Lass uns gleich zu dem Template-Satz die Templates-Bits für die Anzeige der Datensätze in der Datenbank hinzufügen. Du machst es, in dem Du genau das gleiche, wie im vorherigen Schritt machst (s. Screenshot oben), mit dem Unterschied, dass beim Template-Typ diesmal Datensatz ausgewählt wird. Wenn es speicherst, hast Du auf der linken Seite einen Template-Satz mit dem Namen Docs, der alle benötigten Bestandteile beinhaltet.
Weiter unten folgt nun der Code für die einzelnen Templates.
Datensatzanzeige - Template record
Dieses Template steuert das Aussehen des Datensatzes, also der Seite mit dem Hauptinhalt. Bevor Du den Code unten im Template ersetzt, kannst Du Dir eine Seite in der Datenbank Dokumentation aufrufen und anschauen, wie diese optisch aufgebaut wird. Dann ersetzte den Inhalt des Templates mit dem unten stehenden Code und schaue die Seite noch mal an. So siehst Du, was sich verändert hat, am besten.
{{if $record::database()->can('add') or \IPS\Member::loggedIn()->member_id}} <ul class="ipsToolList ipsToolList_horizontal ipsClearfix ipsSpacer_both ipsResponsive_hidePhone"> {{if $record::database()->can('add')}} {{$page = \IPS\cms\Pages\Page::$currentPage;}} <li class='ipsToolList_primaryAction'> <a class="ipsButton ipsButton_medium ipsButton_important ipsButton_fullWidth" data-ipsDialog="1" data-ipsDialog-size="narrow" data-ipsDialog-title="{lang="cms_select_category"}" href="{$page->url()->setQueryString( array( 'do' => 'form', 'd' => \IPS\cms\Databases\Dispatcher::i()->databaseId ) )}">{lang="cms_add_new_record_button" sprintf="$record::database()->recordWord( 1 )"}</a> </li> {{endif}} </ul> {{endif}} <div class='ipsClearfix'> <h1 class='ipsType_pageTitle ipsType_break'> {{if $record->locked()}}<span><i class='fa fa-lock'></i></span> {{endif}} {{if $record->isFutureDate() || $record->mapped('pinned') || $record->mapped('featured') || $record->hidden() === -1 || $record->hidden() === 1}} {{if $record->isFutureDate()}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{$record->futureDateBlurb()}'><i class='fa fa-clock-o'></i></span></span> {{elseif $record->hidden() === -1}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{$record->hiddenBlurb()}'><i class='fa fa-eye-slash'></i></span></span> {{elseif $record->hidden() === 1}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{lang="pending_approval"}'><i class='fa fa-warning'></i></span></span> {{endif}} {{if $record->mapped('pinned')}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_positive" data-ipsTooltip title='{lang="pinned"}'><i class='fa fa-thumb-tack'></i></span></span> {{endif}} {{if $record->mapped('featured')}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_positive" data-ipsTooltip title='{lang="featured"}'><i class='fa fa-star'></i></span></span> {{endif}} {{endif}} {{if $record->prefix() OR ( $record->canEdit() AND $record::canTag( NULL, $record->container() ) AND $record::canPrefix( NULL, $record->container() ) )}} <span {{if !$record->prefix()}}class='ipsHide'{{endif}} {{if ( $record->canEdit() AND $record::canTag( NULL, $record->container() ) AND $record::canPrefix( NULL, $record->container() ) )}}data-editablePrefix{{endif}}> {template="prefix" group="global" app="core" params="$record->prefix( TRUE ), $record->prefix()"} </span> {{endif}} {{if $record->canEdit()}} <div class='ipsType_break ipsContained' data-controller="core.front.core.moderation"> <span data-role="editableTitle" title='{lang="click_hold_edit"}'>{$record->_title}</span> </div> {{else}} <div class='ipsType_break ipsContained'>{$record->_title}</div> {{endif}} </h1> </div> {{if count( $record->tags() ) OR ( $record->canEdit() AND $record::canTag( NULL, $record->container() ) )}} {template="tags" group="global" app="core" params="$record->tags(), FALSE, FALSE, ( $record->canEdit() AND $record::canTag( NULL, $record->container() ) ) ? $record->url() : NULL"} {{endif}} <article class='ipsContained ipsSpacer_top'> <div class='ipsClearfix'> <section class="ipsType_richText ipsType_normal" data-controller='core.front.core.lightboxedImages,guides.menu'>{$record->_content|raw}</section> {{if $record->editLine()}} {$record->editLine()|raw} {{endif}} {{if $records = $record->getReciprocalItems()}} {{$infoLineShown = FALSE;}} <br> {{foreach $records as $fieldId => $items}} <ul class="ipsList_inline ipsList_csv ipsList_noSpacing"> {{foreach $items as $item}} <li>{{if ! $infoLineShown}}{{$infoLineShown=TRUE;}}{lang="records_linking_to_me" sprintf="$item::database()->recordWord(0,TRUE), $record::database()->recordWord(1)"}: {{endif}}<a href="{$item->url()}">{$item->_title}</a></li> {{endforeach}} </ul> {{endforeach}} {{endif}} </div> {{if $bottomFields = $record->customFieldsForDisplay('display_bottom')}} <hr class='ipsHr ipsClear ipsClearfix'> {{foreach $bottomFields as $fieldId => $fieldValue}} {{if $fieldValue}} {$fieldValue|raw} {{endif}} {{endforeach}} {{endif}} {{if $record instanceof \IPS\Content\Reputation and settings.reputation_enabled}} <div class='ipsPos_right'> {template="reputation" app="core" group="global" params="$record"} <br> </div> {{endif}} <hr class='ipsHr ipsClear ipsClearfix'> {{if $record->isFutureDate() or $record->canPin() or $record->canUnpin() or $record->canFeature() or $record->canUnfeature() or $record->canHide() or $record->canUnhide() or $record->canMove() or $record->canLock() or $record->canUnlock() or $record->canDelete()}} <a href='#elentryActions_menu' id='elentryActions' class='ipsButton ipsButton_light ipsButton_verySmall' data-ipsMenu>{lang="content_record_actions" sprintf="$record::database()->recordWord( 1, TRUE )"} <i class='fa fa-caret-down'></i></a> <ul id='elentryActions_menu' class='ipsMenu ipsMenu_auto ipsHide'> {{if $record->isFutureDate() and $record::canFuturePublish( NULL, $record->container() )}} <li class='ipsMenu_item'><a href='{$record->url('moderate')->csrf()->setQueryString( array( 'action' => 'publish' ) )}' data-confirm title='{lang="publish_now"}'>{lang="publish"}</a></li> {{endif}} {{if $record->canFeature()}} <li class='ipsMenu_item'><a href='{$record->url('moderate')->csrf()->setQueryString( array( 'action' => 'feature' ) )}' title='{lang="feature_title_record" sprintf="$record::database()->recordWord(1)"}'>{lang="feature"}</a></li> {{endif}} {{if $record->canUnfeature()}} <li class='ipsMenu_item'><a href='{$record->url('moderate')->csrf()->setQueryString( array( 'action' => 'unfeature' ) )}' title='{lang="unfeature_title_record" sprintf="$record::database()->recordWord(1)"}'>{lang="unfeature"}</a></li> {{endif}} {{if $record->canPin()}} <li class='ipsMenu_item'><a href='{$record->url('moderate')->csrf()->setQueryString( array( 'action' => 'pin' ) )}' title='{lang="pin_title_record" sprintf="$record::database()->recordWord(1)"}'>{lang="pin"}</a></li> {{endif}} {{if $record->canUnpin()}} <li class='ipsMenu_item'><a href='{$record->url('moderate')->csrf()->setQueryString( array( 'action' => 'unpin' ) )}' title='{lang="unpin_title_record" sprintf="$record::database()->recordWord(1)"}'>{lang="unpin"}</a></li> {{endif}} {{if $record->canHide()}} <li class='ipsMenu_item'><a href='{$record->url('moderate')->csrf()->setQueryString( array( 'action' => 'hide' ) )}' title='{lang="hide_title_record" sprintf="$record::database()->recordWord(1)"}' data-ipsDialog data-ipsDialog-title="{lang="hide"}">{lang="hide"}</a></li> {{endif}} {{if $record->canUnhide()}} <li class='ipsMenu_item'><a href='{$record->url('moderate')->csrf()->setQueryString( array( 'action' => 'unhide' ) )}' title='{{if $record->hidden() === 1}}{lang="approve_title_record" sprintf="$record::database()->recordWord(1)"}{{else}}{lang="unhide_title_record" sprintf="$record::database()->recordWord(1)"}{{endif}}'>{{if $record->hidden() === 1}}{lang="approve"}{{else}}{lang="unhide"}{{endif}}</a></li> {{endif}} {{if $record->canLock()}} <li class='ipsMenu_item'><a href='{$record->url('moderate')->csrf()->setQueryString( array( 'action' => 'lock' ) )}' title='{lang="lock_title_record" sprintf="$record::database()->recordWord(1)"}'>{lang="lock"}</a></li> {{endif}} {{if $record->canUnlock()}} <li class='ipsMenu_item'><a href='{$record->url('moderate')->csrf()->setQueryString( array( 'action' => 'unlock' ) )}' title='{lang="unlock_title_record" sprintf="$record::database()->recordWord(1)"}'>{lang="unlock"}</a></li> {{endif}} {{if $record->canMove()}} <li class='ipsMenu_item'><a href='{$record->url('move')->csrf()}' data-ipsDialog data-ipsDialog-title="{lang="move"}" title='{lang="move_title_record" sprintf="$record::database()->recordWord(1)"}'>{lang="move"}</a></li> {{endif}} {{if $record->canDelete()}} <li class='ipsMenu_item'><a href='{$record->url('moderate')->csrf()->setQueryString( array( 'action' => 'delete' ) )}' data-confirm title='{lang="delete_title_record" sprintf="$record::database()->recordWord(1)"}'>{lang="delete"}</a></li> {{endif}} {{if \IPS\Member::loggedIn()->modPermission('can_view_moderation_log')}} <li class='ipsMenu_sep'><hr></li> <li class="ipsMenu_item"><a href='{$record->url()->csrf()->setQueryString( array( 'do' => 'modLog' ) )}' data-ipsDialog data-ipsDialog-title='{lang="moderation_history"}'>{lang="moderation_history"}</a></li> {{endif}} </ul> {{endif}} {{if $record->canEdit()}} <a href='{$record->url('edit')->csrf()}' title='{lang="edit"}'>{lang="edit"}</a> {{endif}} {{if !\IPS\Member::loggedIn()->group['gbw_no_report'] }} <a href='{$record->url('report')}' data-ipsDialog data-ipsDialog-size='medium' data-ipsDialog-title="{lang="content_record_report" sprintf="$record::database()->recordWord( 1, TRUE )"}" data-ipsDialog-remoteSubmit data-ipsDialog-flashMessage="{lang="report_submit_success"}" title="{lang="content_record_report" sprintf="$record::database()->recordWord( 1, TRUE )"}">{lang="content_record_report" sprintf="$record::database()->recordWord( 1, TRUE )"}</a> {{endif}} {{if $record->canManageRevisions()}} <a href='{$record->url('revisions')}' title="{lang="content_view_revisions"}">{lang="content_view_revisions"}</a> {{endif}} </article> <br> {{if $updateForm}} <div class='ipsAreaBackground_light ipsPad'> <h2 class='ipsType_sectionHead'>{lang="cms_front_update_fields" sprintf="$record::database()->recordWord( 1 )"}</h2> <ul class='ipsForm ipsForm_vertical'> {$updateForm|raw} </ul> </div> {{endif}}
Hier wurden einige Funktionen entfernt, wie z. B. Bewertungen, da diese in der Dokumentation nicht benötigt werden. Damit sehen die Templates schlanker und übersichtlicher. Natürlich kannst Du beim Erstellen Deiner eigenen Templates alles drin lassen, auch das was zur Zeit nicht benutzt wird, aber womöglich später.
Kategorien - Templates categoryHeader, categoryFooter und categoryTable
Diese drei Templates steuern die Liste der Datensätze in einer Kategorie. In meinem Beispiel wäre es z. B. die Kategorie Anwendungen, in der ich drei Seiten angelegt habe. Schau Dir an, wie sie jetzt aussieht und dann lösche/ersetze den Code wie unten angegeben.
Öffne das Template categoryHeader und lösche den gesamten Inhalt. Speichere.
Öffne das Template categoryFooter und lösche den gesamten Inhalt. Speichere.
Öffne das Template categoryTable und füge folgendes Code hinzu:
<div class='ipsPad' data-baseurl='{$table->baseUrl}' data-resort='{$table->resortKey}' data-controller='core.global.core.table{{if $table->canModerate()}},core.front.core.moderation{{endif}}'> {{if !count($rows)}} <div class="ipsPad"> {lang="cms_no_records_to_show" sprintf="\IPS\cms\Databases::load( \IPS\cms\Databases\Dispatcher::i()->databaseId )->recordWord()"} </div> {{else}} <ol class='ipsDataList ipsDataList_zebra ipsClear cCmsListing {{foreach $table->classes as $class}}{$class} {{endforeach}}' id='elTable_{$table->uniqueId}' data-role="tableRows"> {{foreach $rows as $row}} {{$idField = $row::$databaseColumnId;}} <li class="cDocs_row " data-rowid="{$row->$idField}"> <h4 class="ipsType_sectionHead"> <a href="{$row->url()}" class="ipsType_blendLinks"> {$row->_title} </a> </h4> <div class="ipsType_normal ipsType_richText" data-ipstruncate="" data-ipstruncate-type="remove" data-ipstruncate-size="3 lines"> {$row->truncated()|raw} </div> </li> {{endforeach}} </ol> {{endif}} </div>
An dieser Stelle wird die Liste aller Seiten in einer Kategorie mit Textvorschau erstellt. Diese Liste wird später nicht über die Navigation zu erreichen sein. Allerdings werden die Benutzer aus den Suchmaschinen hierauf landen, da Kategorie-Links in Sitemap aufgenommen werden.