Hi Nino, *,

2010/11/20 Nino Novak <nn.l...@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+h...@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

Antwort per Email an