287 Nachrichten unter 96 Themen von 98 Mitgliedern
[SilverStripe Roadmap][Changelog]

Offene Fragen zur ersten SilverStripe Umsetzung

Seite: 1 771 mal gelesen
  • Homezonebenny
    Homezonebenny Community Member
    13 Beiträge

    Offene Fragen zur ersten SilverStripe Umsetzung

    Hi,
    ich arbeite gerade an meiner Abschlussarbeit für die IHK, diese Abschlussarbeit beinhaltet eine Designumsetzung (nix wildes) + Implementierung in ein für mich bis dato unbekanntes CMS "SilverStripe" hehe :-D


    Die Designumsetzung habe ich schon beendet (mb ist nur n Daten trash Server, nicht wundern :D):
    http://montageberthold.de/design/home.html
    http://montageberthold.de/design/index.html


    Das SilverStripe Tutorial auch bis zu den Forms durchgearbeitet:
    http://doc.silverstripe.org/sapphire/en/tutorials/3-forms#creating-the-form


    Dann anschließend das obige Design in mein SilverStripe Projekt lokal implementiert (Templates mit Versch. $Layout, Start und Folgeseite). Includes brauchte ich in diesem Design bisher keine, weil z.B. der Breadcrump nur auf der Folgeseite erscheint.

    Nun zu meinen offnen Fragen:

    1. Kopf und Fuß navigation im backend trennen, wie?!
    2. Kontaktbox unterhalb der Suche, wie Pflegbar machen da kein Content
    3. "zur Startseite" link statisch auf home leiten oder anders lösen
    4. Banner image Pflegbar machen, so dass jede Seite einen eigenen Headbanner haben kann
    5. Kontaktformular (muss nicht Pflegbar sein, also dieses Formularmodul das ich in der Demo gesehen habe),
    es sollte so schnell und einfach wie möglich impelementiert werden, es muss nicht mal die mail optisch gestaltet werden, da keine
    mail jemals über das Formular verschickt wird. Es ist ja nur eine Demoseite, ein Projekt für eine Präsentation bei der IHK, dass wars.
    Mailserver gibts nicht (internet connection).

    Zudem gäbe es noch "Punkt 6", aber das habe ich eigentlich so halb gelöst. Meine Breadcrump ist ein UL LI Konstrukt, dass heißt das die Standard Breadcrump hier nicht wirklich taugt. Also habe ich mir die Breadcrump in die Page.php überschrieben:

    public function Breadcrumbs($maxDepth = 20, $unlinked = false, $stopAtPageType = false, $showHidden = false)
    {
    $page = $this;
    $parts = array();
    $i = 0;
    while
    ($page
    && (!$maxDepth || sizeof($parts) < $maxDepth)
    && (!$stopAtPageType || $page->ClassName != $stopAtPageType))
    {
    if($showHidden || $page->ShowInMenus || ($page->ID == $this->ID))
    {
    if($page->URLSegment == 'home')
    $hasHome = true;
    if(($page->ID == $this->ID) || $unlinked)
    $parts[] = ("<li class=\"cms_last_node\"><a href=\"" . $page->Link() . "\">" . Convert::raw2xml($page->Title) . "</a></li>");
    else
    $parts[] = ("<li><a href=\"" . $page->Link() . "\">" . Convert::raw2xml($page->Title) . "</a></li>");
    }
    $page = $page->Parent;
    }
    return implode(' ', array_reverse($parts));
    }

    Was mir bei der breadcrump (der überschriebenen) noch fehlt ist die class="cms_first_node" Klasse, nur ist mir da nicht genau bewusst wie ich das hinbekomme. Da hier der letzte der erste Node ist, so viel habe ich schon herausgefunden :)


    Vielen lieben Dank für eure Hilfe
    Benny


    PS:
    Da meine Designumsetzungen von
    - IE 5.5 bis IE 9
    - FF ab v3 ++
    - Safari ab 3.2.1 ++
    - Opera ab 9.64++
    - Chrome ab v1++

    OHNE HACKs identisch aussehen, lege ich auf den xhtml / css output großen Wert, vorallem auf die Kontrolle des Codes was das CMS auspuckt. Bisher habe ich da mit SilverStripe echt nur positive Erfahrungen gemacht, auser einen kleinen Bug im Page Comment System den ich schon reportet habe: http://open.silverstripe.org/ticket/6610

    Aus diesem Grunde ist es mir eben noch relativ wichtig die Breadcrump (für mich) schön hinzubekommen.
    Was mir leider an SilverStripe nicht so gefällt ist, dass der generierte (ersetzte) Code SPACES im Quellcode aufweißt.
    Das ist jetzt nicht sooo schlimm, aber es stört mich halt schon ein wenig :-D :-P

    Um es genau zu erklären:

    <% if Menu(2) %><ul id="Menu2"><% control Menu(2) %>
    <li class="$LinkingMode<% if FirstLast %> $FirstLast<% end_if %>"><a href="$Link">$MenuTitle</a></li><% end_control %>
    </ul><% end_if %>

    Ergibt keine "Enter spaces" im Quellcode, dies wiederrum schon:

    <% if Menu(2) %>
    <ul id="Menu2">
    <% control Menu(2) %>
    <li class="$LinkingMode<% if FirstLast %> $FirstLast<% end_if %>"><a href="$Link">$MenuTitle</a></li>
    <% end_control %>
    </ul>
    <% end_if %>

    Und zwar über und nach dem UL, vor bzw. nach dem LI, und nach dem UL.
    Eben überall wo man die Templateanweisungen setzt. Diese werden eben ersetzt und leider hinterlässt dies spaces.
    Wie gesagt, theoretisch ist das nicht so Wild, aber ältere Browser wie z.B. IE6 haben schon allein durch spaces rumgezickt, und diese spaces dann auch angezeigt bzw. andere Bugs hervorgerufen. Bisher lief mit meinen Tests alles gut, was das Design in SilverStripe angeht aber mögen tu ich diese Spaces eben nicht. Mit kleinen "Tricks" siehe den ersten Block, kann man spaces vermeiden, aber leider funktioniert das nicht überall, z.B. beim Include der CSS Files :-\ (spaces nach oben).
  • Homezonebenny
    Homezonebenny Community Member
    13 Beiträge

    Re: Offene Fragen zur ersten SilverStripe Umsetzung

    Meine Lösungen (da keiner geantwortet hat, selbst herausgefunden):

    WICHTIG:
    Seiten neu "builden" nachdem ihr etwas hinzugefügt habt (einen der Punkte):
    http://localhost/dev/build/?flush=1



    1. Kopf und Fußnavigation

    PAGE.PHP

    //============================================================================
    // Page
    //============================================================================
    class Page extends SiteTree
    {
    // properties
    public static $db = array
    (
    'TopNavigation' => 'Boolean',
    'FootNavigation' => 'Boolean'
    );
    //--------------------------------------------------------------------------


    // overrides/implements
    function getCMSFields()
    {
    $fields = parent::getCMSFields();

    $fields->addFieldToTab("Root.Content.Main", new ImageField('Headbanner', 'Banner oben'));
    $fields->addFieldToTab('Root.Behaviour', new CheckboxField('TopNavigation', 'In Kopfnavigation anzeigen?'), 'ShowInMenus');
    $fields->addFieldToTab('Root.Behaviour', new CheckboxField('FootNavigation', 'In Fußnavigation anzeigen?'), 'ShowInSearch');

    return $fields;
    }
    //--------------------------------------------------------------------------
    }


    //============================================================================
    // Page_Controller
    //============================================================================
    class Page_Controller extends ContentController
    {
    // data object controlls
    public function getNavigation($navi)
    {
    if($navi == "head")
    return DataObject::get('Page', 'TopNavigation = true');
    elseif($navi == "foot")
    return DataObject::get('Page', 'FootNavigation = true');
    }
    //--------------------------------------------------------------------------
    }

    WICHTIG:
    Die Page.php enthält von Haus aus schon mehr Code, einfach um diesen Code ergänzen (kommentare nicht unbedingt).

    PAGE.SS (template selbst):

    <% if getNavigation(head) %><ul class="top_nav tiny_text clearfix"><% control getNavigation(head) %>
    <li<% if First && Last %> class="first last single"<% else_if FirstLast %> class="$FirstLast"<% end_if %>><a href="$Link">$MenuTitle</a></li><% end_control %>
    </ul><% end_if %>

    Der gleiche Code oben, nur mit "foot" statt "head" in der Klammer liest die Fußnavigationslinks aus.
    Haken sind unter "Verhalten" bei der Seite setzbar.





    2. Kontaktbox unterhalb der Suche, wie Pflegbar machen da kein Content
    (kleine extra Seitenkonfigurationen / settings)


    code/SiteConfiguration.php

    <?php
    // INTERFACES:
    // - SiteConfiguration


    //============================================================================
    // SiteConfiguration
    //============================================================================
    Class SiteConfiguration extends DataObjectDecorator
    {
    // properties
    public static $db = array
    (
    'firmName' => 'Varchar',
    'street' => 'Varchar',
    'zip' => 'Varchar',
    'city' => 'Varchar',
    'phone' => 'Varchar',
    'fax' => 'Varchar',
    'email' => 'Varchar'
    );
    public static $has_many = array();
    //--------------------------------------------------------------------------


    // overrides/implements
    function extraStatics()
    {
    $fields = array('db'=>self::$db, 'has_many'=>self::$has_many);
    return $fields;
    }

    public function updateCMSFields(FieldSet $fields)
    {
    $fields->addFieldToTab('Root.Main', new TextField('firmName', 'Firmenname'));
    $fields->addFieldToTab('Root.Main', new TextField('street', 'Straße'));
    $fields->addFieldToTab('Root.Main', new TextField('zip', 'Postleitzahl'));
    $fields->addFieldToTab('Root.Main', new TextField('city', 'Ort'));
    $fields->addFieldToTab('Root.Main', new TextField('phone', 'Telefon'));
    $fields->addFieldToTab('Root.Main', new TextField('fax', 'Telefax'));
    $fields->addFieldToTab('Root.Main', new TextField('email', 'E-Mail'));
    }
    //--------------------------------------------------------------------------
    }
    ?>

    mysite/_config.php

    Object::add_extension('SiteConfig', 'SiteConfiguration');

    hinzufügen, damit die neue SiteConfiguration.php erkannt bzw. gefunden wird.
    Nun erscheinen im backend (Adminbereich) neue Felder die man mit Daten füttern kann.
    (Im Hauptknoten, TAB: Hauptteil)

    Diese Daten können im Template folgendermaßen ausgelesen werden:
    $SiteConfig.firmName
    $SiteConfig.street
    ...
    (siehe $fields liste oben)





    3. "zur Startseite" link statisch auf home leiten oder anders lösen


    Im template folgendes hinzufügen:
    <a href="$getPageType(HomePage).Link" class="home_link tiny_text">zur Startseite</a>
    da die Funktion, getpageType() nicht existiert, müssen wir diese noch anlegen.


    Page.php:

    class Page_Controller extends ContentController
    {
    function getPageType($type)
    {
    if(DataObject::get_one($type))
    return DataObject::get_one($type);
    else
    return false;
    }
    }

    WICHTIG:
    hier wieder beachten, dass Page_Controler schon mehr Code enthält, einfach diese Klasse um die Funktion erweitern.
    Diese Funktion holt sich den im Template angegebenen Page Type Data Object, so das man damit sich z.B. den Link usw. holen kann.
    Eigentlich sehr praktisch, da somit im Template alle Page Types geholt werden können :)
    Wird aber ein Page Type geholt der nicht existiert, dann erscheint eine Fehlermeldung. Ich bin noch nicht so weit in SilverStripe drin das ich hier irgendwie eine exception (Fehlermeldung) selbst werfen kann. Evt. ist das auch für diese kleine Funktion zu aufwendig, don't know...





    4. Banner image Pflegbar machen, so dass jede Seite einen eigenen Headbanner haben kann

    Page.php

    class Page extends SiteTree
    {
    public static $has_one = array
    (
    'Headbanner' => 'Image'
    );
    function getCMSFields()
    {
    $fields = parent::getCMSFields();

    $fields->addFieldToTab("Root.Content.Main", new ImageField('Headbanner', 'Banner oben'));

    return $fields;
    }
    }

    WICHTIG:
    Da wir oben bei Punkt 1 die Funktion getCMSFields() erstellt haben, muss hier nur noch
    $fields->addFieldToTab("Root.Content.Main", new ImageField('Headbanner', 'Banner oben'));
    hinzugefügt werden, durch $has_one... steht dies in getCMSFields zur Verfügung.


    Page.ss (Template):
    <% if Headbanner %>$Headbanner.SetWidth(700)<% else %><img src="$ThemeDir/images/banner_default.jpg" alt="" /><% end_if %>

    Dies Prüft ob im backend (Adminbereich) ein Bannerbild gesetzt wurde, wenn nicht setzt es das Standardbild.





    5. Kontaktformular

    siehe:
    http://www.ssbits.com/newbies/2010/creating-a-simple-contact-form/




    Ich hoffe ich konnte auch anderen helfe, die genau die gleichen Probleme hatten.
    Über ein feedback wie: "Danke, hat mir weitergeholfen" würde ich mich natürlich auch freuen :)

    Grüße
    Benjamin


    PS:
    Da in diesem Forum keine Code-Blöcke existieren, sind die Einrückungen auch fürn Ar***
    Einfach kopieren, einfügen, und selbst einrücken.

Zur Zeit online: Zur Zeit ist leider niemand online.

Wir begrüßen unsere neuen Mitglieder: saerdna