Concrete5 – Blöcke im Template

Template mit Blöcken

Wird ein neues Theme erstellt, braucht es manchmal auch ein Layout (Custom Template) für einen Block um sicherzustellen dass das Layout der Navigation zum Layout des Themes passt. Custom Templates können wir Themes verteilt und installiert werden. Man kann sogar ein Package erstellen, so dass Theme und Custom Templates sich zusammen in einem einzelnen Verzeichnis befinden! Allerdings muss man noch immer das Block Template auswählen und der Benutzer könnte die Einstellungen überschreiben.

Als Theme-Entwickler ist es allerdings möglich, sämtliche Layout Anweisungen im Theme bzw. Template zu haben.

Es ist hilfreich bereits ein Theme erstellt zu haben, um das grundlegende Wissen dazu zu haben. Concrete5 Theme erstellen

Es spielt keine Rolle welches Template modifiziert wird, solange es ein Plätzchen für unsere Navigation hat. In diesem Tutorial werden wir das folgende Template anpassen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
defined('C5_EXECUTE') or die(_("Access Denied."));
$this->inc('elements/header.php');
?>
<div id="logo">
    <a href="<?php echo DIR_REL?>/"><img src="<?php echo $this->getThemePath()?>/images/logo.gif" alt="Micropark Pilatus"/></a></div>
<div id="menu">
    <?php
    $nav = new Area('Navigation');
    $nav->display($c);
    ?></div>
<div id="nebenlinks">
    <?php
    $sub_nav = new Area('Sub Navigation');
    $sub_nav->display($c);
    ?></div>
<div id="page">
    <?php
    $content = new Area('Content');
    $content->display($c);
    ?></div>
<?php
$this->inc('elements/footer.php');
?>

In diesem Template sind zwei Bereiche welche bisher editierbar sind “Navigation” und “Sub Navigation”. Wir möchte in diesem Fall, dass der Benutzer diese Bereiche nicht editieren kann bzw. muss.

Wir modifizieren also die beiden Bereiche, so dass unser neues Template folgendermassen aussieht:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
defined('C5_EXECUTE') or die(_("Access Denied."));
$this->inc('elements/header.php');
?>
<div id="logo">
    <a href="<?php echo DIR_REL?>/"><img src="<?php echo $this->getThemePath()?>/images/logo.gif" alt="Micropark Pilatus"/></a></div>
<div id="menu">
    <?php
    $bt = BlockType::getByHandle('autonav');
    $bt->controller->displayPages = 'top';
    $bt->controller->orderBy = 'display_asc';                    
    $bt->controller->displaySubPages = 'none';                    
    $bt->render('templates/header_nav');
    ?></div>
<div id="nebenlinks">
    <?php
    $bt_links = BlockType::getByHandle('autonav');
    $bt_links->controller->displayPages = 'top';
    $bt_links->controller->orderBy = 'display_asc';                    
    $bt_links->controller->displaySubPages = 'none';                    
    $bt_links->render('view');
    ?></div>
<div id="page">
    <?php
    $content = new Area('Content');
    $content->display($c);
    ?></div>
<?php
$this->inc('elements/footer.php');
?>
  • Zeile 9 – Anstelle des editierbaren Bereiches, holen wir das “Handle” des gewünschten Blocks. Autonav in unserem Fall
  • Zeile 10-12 – Diese Anweisungen sind Block-spezifisch. Unglücklicherweise müssen die Blöcke analysiert werden, um an diese Eigenschaften/Werte zu kommen.
  • Zeile 13 – Block ausgeben! Das Default-Template trägt den Namen “view”. In diesem Fall möchten wir aber ein eigenes Custom Template ansprechen. Freie Wahl!

Dasselbe mit der Unternavigation auf den Zeilen 22-26.

Fertig! Wird nun eine neue Seite angelegt, so sind unsere beiden Navigationen immer vorhanden. Soll die Navigation entfernt/modifiziert werden, so geschieht dies komplett über das Template. Templates welche so erstellt wurden, enthalten keinen “roten Rahmen”. Dadurch ist es dem Benutzer nicht mehr möglich diesen Bereich zu bearbeiten.

block-in-template

Dieses Tutorial hat zwei Varianten aufgezeigt, um Inhalt auf mehreren Seiten zentral zu verteilen. Welche die richtige ist, hängt wohl meist vom Ersteller hab – freie Wahl!




Seguir leyendo: 1, 2


17 Comments

Here are the autonav attributes and values I found by looking at the code:
controller->orderBy = ‘display_asc’;
//$bt_links->controller->displayUnavailablePages = ‘false’;
$bt_links->controller->displayPages=’second_level’;
$bt_links->controller->displaySubPages = ‘none’;
$bt_links->controller->displaySubPageLevels = ‘enough’;
$bt_links->render(‘view’);
?>

‘orderBy’
‘display_asc’ – in their sitemap order
‘display_desc’ – in reverse sitemap order
‘chrono_desc’ – with the most recent first
‘chrono_asc’ – with the earliest first
‘alpha_asc’ – in alphabetical order
‘alpha_desc’ – in reverse alphabetical order

‘displayUnavailablePages’
?’true’/’false’? (not sure if value be quoted)

‘displayPages’
‘top’ – at the top level
‘second_level’ – at the second level
‘third_level’ – at the third level
‘above’ – at the level above
‘current’ – at the current level
‘below’ – at the level below
‘custom’ – beneath a particular page

‘displaySubPages’
‘none’ – none
‘relevant’ – Relevant sub pages
‘relevant_breadcrumb’ – Display breadcrumb trail
‘all’ – Display all

‘displaySubPageLevels’
‘enough’ – Display sub pages to current
‘enough_plus1’ – Display sub pages to current +1
‘all’ – Display all
‘custom’ – Display a custom amount

‘render’
‘view’ – use default view
‘templates/custom_view’ – apply custom template

I used this method to modify the “full width” page type, adding a phone number above the navigation. But when I view the site following the update, the phone number is located below the navigation. If I go back to the “full width” template, the phone number is in the correct location. Why is it flipping positions on the child pages?

DEUTSCH:
Ich möchte bei einem Theme-Page-Type einen vorgegebenen nicht lösch- oder verschiebbaren Block (z.B. den Blocktyp “Slideshow”) verpassen, welcher aber Einstellbar ist (z.B. Bilderauswahl).

ENGLISH:
How to implement a Blocktype (for example “slideshow”) in a pagetype of a theme permanently which is still customizable (assortment of pictures)?

Hi there!

I defiened a block slideshow on every page using the Page Type method, I also limited the number of Blocks to one (using setBlockLimit), but someone is still able to add more than one block (through deleting and re-adding) as well as blocks of an other type.

is ist possible to prohibit the deleting of the block but still allow to change it (i.e. change the pictures by an other user, not admin).

setBlockLimit only means that there can never be more than one block at the same time. This doesn’t mean that only the admin can remove it or anything like that.

There are some patches in the forums that allow you to specify the block types allowed in an area but as far as I know they never made it into the core.

The only thing you can do out of the box is to use the “advanced permission mode”. Check this site: http://www.concrete5.org/documentation/general-topics/simple-permissions/ There’s a line you have to insert in site/config.php to enable it.

But be careful: The advanced permission mode gives you a lot of power and increases the complexity as well. Just give it a try, you can always remove the line and go back to the basic permission mode if you don’t want to use the advanced settings.

Defaults doesnt really work does it? If Im in page type default and add a html block and some html within it, I’d expect the html that I wrote to be in every page that uses this page type. But it doesn’t do that.

So what exactly default is I dont know and no one has be any to match their description with what it actually does. (same as composer)

That’s probably because you’ve created the page first and then added blocks to the page defaults. Concrete5 can’t know if you’ve manually added that block on the previously created page first in which case it should put the block from page defaults there.

However, when you’re editing the page defaults and add a block, you can click on it again and you’ll see a menu entry which allows you to set up the block on existing pages as well.
Open it and you’ll see a list of all pages from the same type, mark those where you’d like to place the block and you’re done.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *