Date: prev next · Thread: first prev next last
2010 Archives by date, by thread · List index


Hi Nino, *,

2010/11/20 Nino Novak <nn.libo@kflog.org>:
On Saturday 20 November 2010 00:33, Christian Lohmaier wrote:

http://pumbaa.ooodev.org:7780/sitemap-status-testbed-page

cool :-)

:-)

Für Farben fühle ich mich als Rot-Grün-Blinder nun überhaupt nicht
zuständig,

Oh, dann aber als "Veto" instanz - (kann ich nicht lesen/ist unklar,...)

aber K-J's Einwand mit der Breite halte ich für ziemlich
berechtigt...

Ja, dachte dann, daß mit jquery zu scrollen/spalten ein bzw.
auszublenden.(aber mit jquery stehe ich noch auf Kriegsfuß, das will
nicht so, wie ich will :-))

[...]
Kannst du mir vielleicht den Code mal schicken?

Der wird vmtl. ohne Silverstripe nicht viel bringen, aber hier ist der
Template-Code (noch mit css-code direkt im Elemenent, das soll
natürlich in der endgültigen Version nicht mehr drin steheen)

<ul class="sitemap">
<% control SitemapStatus %>
<% if controllist == open %><ul><% else_if controllist == close %></li></ul>
<% else %>
<li style="margin-right: 0px;"><div style="width:100%"><a
href="$Link">$Title</a>
<% control ControlTranslations %><div class="$Stage"
style="margin-left:15px;text-align: center; width:70px; float:right">
<% if page.ExistsOnLive %><a href="$page.Link"
title="$page.Title">$locale</a><% else %>$locale<% end_if %>
</div><% end_control %><div class="clear"></div></div>
<% end_if %>
<% end_control %>

Mal kurz erklärt: "control SitemapStatus" man sich als for-loop über
alle Elemente, die die Funktinon "SitemapStatus" (siehe unten)
zurückgiebt, ebenso "control ControlTranslations" die in dem Fall die
Liste der auf der Seite vorhandenen Sprachen abklappert

Die if-statements dürften selbsterklärend sein, und die parameter
$Link $Title ebenso - das sind die entsprechenden Eigenschaften des
gerade in der Schleife behandelten Elements.

Das Template baut aus den Daten eine Verschachtelte ul, bei der die
Einträge jeweils so aufgebaut sind
<li>
  <div>Link zur entsprechenden en-US-Seite
     <div>Sprache1</div><div>Sprache2</div><div>Sprache3</div>...<div>spracheN</div>
     <div class="clear"></div>
  </div>
[ggf ul mit unterseiten]
</li>

Der Code im Seitencontroller ist alles anderes als sauber

1) Der Code, der die auf der Subsite existierenden Sprachen zurückgibt
(indirekt für die innere Schleife des Templates):

private function controlLanguages() {
    // the list of existing translation for the subsite (minus the
default langauge)
    $subsiteid = $this->owner->SubsiteID ;
    $langs = Translatable::get_existing_content_languages("SiteTree",
'"SubsiteID" = ' . $subsiteid);
    $subsite = Subsite::currentSubsite();
    if ($subsite == NULL) {
        $subsitelang = i18n::default_locale();
    } else {
        $subsitelang = $subsite->getLanguage();
    }
    unset($langs[$subsitelang]);
    // return set of available translation langauges minus the subsite default
    $result_dos = new DataObjectSet();

    foreach ($langs as $key => $value) {
        $result_dos->push(new ArrayData(array("locale" => $key, "name"
=> $value)));
    }
    return $result_dos;
}

2) Die Methode, für die Äußere Schleife, die alle Einträge der Sitemap
zusammenbastelt

public function SitemapStatus() {
    $lang = i18n::default_locale();
    if ($this->SubsiteID) {
        $subsite = DataObject::get_by_ID("Subsite", $this->SubsiteID);
        if ($subsite) {
            $lang = $subsite->getLanguage();
        }
    }
    $toplevel = Translatable::get_by_locale("SiteTree", $lang,
"\"ParentID\" = 0 AND \"ClassName\"<>'ErrorPage' AND
\"ClassName\"<>'ForumHolder'");

    $result = new DataObjectSet();
    $languages = $this->controlLanguages();
    $oldMode = Versioned::get_reading_mode();
    Versioned::reading_stage("Stage");
    foreach ($toplevel as $page) {
        $this->recursivePageadd($result, $page);
    }
    Versioned::set_reading_mode($oldMode);
    return $result;
}

3) Die Methode, die die eigentliche Arbeit macht:

private function recursivePageadd(&$resultref,$page) {
    $translations = new DataObjectSet();
    foreach($this->controlLanguages() as $lang) {
        $transpage = $page->getTranslation($lang->getField("locale"));
        if (!$transpage) {
            $stage = "missing";
        } elseif ($transpage->getExistsOnLive()) {
            $stage = "live";
            if ($transpage->getIsModifiedOnStage() &&
($transpage->ClassName != "UserDefinedForm")) {
                $stage = "changed";
            }
        } else {
            $stage = "unpublished";
        }
        $translations->push(new ArrayData(array("locale" =>
$lang->getField("locale"), "page"=>$transpage, "Stage"=>$stage)));
    }
    $page->ControlTranslations = $translations;
    $resultref->push($page);

    $childpages= Translatable::get_by_locale("SiteTree", "en_US",
"\"ParentID\" = " . $page->ID . " AND \"ClassName\"<>'ErrorPage'");
    if ($childpages) {
        $resultref->push(new ArrayData(array("controllist" => "open")));
        foreach($childpages as $childpage) {
            $this->recursivePageadd($resultref, $childpage);
            $resultref->push(new ArrayData(array("controllist" => "close")));
        }
    }
}

(mit mehr Erfahrung dürfte das vmtl auch kürzer gehen...)

ciao
Christian

--
E-Mail to discuss+help@de.libreoffice.org for instructions on how to unsubscribe
List archives are available at http://de.libreoffice.org/lists/discuss/
All messages you send to this list will be publicly archived and cannot be deleted

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.