Neues "MultiOnePage" - Plugin

Ein CMSimple Support Forum für deutsch sprechende Nutzer und Entwickler
frase
Posts: 3515
Joined: Thu Apr 21, 2016 6:32 am
Location: Saxony
Contact:

Re: Neues "MultiOnePage" - Plugin

Post by frase » Thu Jan 16, 2020 3:06 pm

Ich zitiere mal aus meinem eigenen Beitrag von hier:
frase wrote:Einen Wunsch hätte ich für das MultiOnepage-Plugin vielleicht noch.
Im PD-Tab kann man CSS-Klassen für die Einzelseiten festlegen.
Man muss diese Klassen allerdings "im Kopf haben" - was gerade bei motley-tiles manchmal recht schwierig weil viel sein kann.
Olaf hat im Swiper-Plugin ein sehr schönes Feature bei der Konfiguration eingebaut:
Konfiguration: 2. Punkt: "Pre-defined-colors".
Dort kann man eine Data-List anlegen, die dann im PD-Tab als Browser-Vorschlag bei der Eingabe erscheint. So etwas wäre im MultiOnepage-Plugin verdammt bestimmt hilfreich.

Holger
Site Admin
Posts: 3236
Joined: Mon May 19, 2008 7:10 pm
Location: Hessen, Germany
Contact:

Re: Neues "MultiOnePage" - Plugin

Post by Holger » Thu Jan 16, 2020 6:28 pm

Ja, das Sniper äh Swiper Plugin ;) . Schönes Teil, Gratulation. Bisher hab' ich aber aus Zeitgründen nur von außen geschaut.
frase wrote:Olaf hat im Swiper-Plugin ein sehr schönes Feature bei der Konfiguration eingebaut:
Konfiguration: 2. Punkt: "Pre-defined-colors".
Dort kann man eine Data-List anlegen, die dann im PD-Tab als Browser-Vorschlag bei der Eingabe erscheint. So etwas wäre im MultiOnepage-Plugin verdammt bestimmt hilfreich.
Kein Problem. Nur würde ich eine automatische Lösung bevorzugen. Stichwort: Templates / Styles im acDIV's-Plugin. Ist schon eine Weile her -- du erinnerst dich vielleicht noch??? Da war so etwas schon eingebaut.

Edit: hab's auf Github vermerkt.

frase
Posts: 3515
Joined: Thu Apr 21, 2016 6:32 am
Location: Saxony
Contact:

Re: Neues "MultiOnePage" - Plugin

Post by frase » Fri Aug 28, 2020 9:25 am

Holger wrote:
Mon Aug 26, 2019 6:03 am
frase wrote:
Sun Aug 25, 2019 9:16 pm
Aber, wie du schon sagst, $onepage_structure gibt es wohl in der Form nicht mehr.
Richtig. Da gab es in der Diskussion (zum Original-Plugin) damals keine allgemeine Unterstützung, wobei die Definition per globaler Variable eh Murks war. Stattdessen kam dann die zusätzliche, per config.php benennbare, Klasse.

Geänderte Strukturen musst du somit mittels eigener Methode definieren.
Eigene Methode? Wie? Was?
Ich wünsche mir die $onepage_structure sehnlichst zurück :!:
Ich habe nun schon zwei Fälle, die ohne das Ding einfach nicht zu realisieren sind.
Und beim Template fhs-op2 muss man auch das alte Onepage-Plugin verwenden und Holgers JS - sonst geht nix.
Wie müsste denn so eine "eigene Methode" aussehen und wohin käme die?

Holger
Site Admin
Posts: 3236
Joined: Mon May 19, 2008 7:10 pm
Location: Hessen, Germany
Contact:

Re: Neues "MultiOnePage" - Plugin

Post by Holger » Sun Aug 30, 2020 9:01 pm

frase wrote:
Fri Aug 28, 2020 9:25 am
Wie müsste denn so eine "eigene Methode" aussehen und wohin käme die?
Die Methode käme sinnigerweise direkt in die template.htm oder wird über include() / require() dort eingebunden. Genau so, wie auch z.B. eine geänderte Menüstruktur erzeugt wird (Stichwort: myLi();).
Wie sie aussehen muss hängt davon ab wie die Struktur aussehen soll.

Alternativ könnte man die Ausgabe auch mittels "Templates" (Views) erzeugen. Wäre vielleicht auch eine Überlegung wert....

frase
Posts: 3515
Joined: Thu Apr 21, 2016 6:32 am
Location: Saxony
Contact:

Re: Neues "MultiOnePage" - Plugin

Post by frase » Mon Aug 31, 2020 4:52 am

Holger wrote:
Sun Aug 30, 2020 9:01 pm
Alternativ könnte man die Ausgabe auch mittels "Templates" (Views) erzeugen. Wäre vielleicht auch eine Überlegung wert....
Damit wäre das "wo" andeutungsweise geklärt, aber nicht das "wie" und "was". (bedenke: Du hast es hier mit "mir" zu tun ;-) )

Vorläufig habe ich mir mit einer händischen Änderung in Controller.php geholfen:

Code: Select all

    public static function getContent($pages) {
...
                $contents .= sprintf( '
<article id="%s" class="section-fullpage %s">
<div class="section-wrapper">%s
</div>
</article>',
                        $url,
                        $pageData['multionepage_class'],
                        sprintf( '
<div class="%s">%s</div>',
                                $plugin_cf['multionepage']['inner_class'],
                                $content
...
Das funktioniert zwar, ist aber doch wohl nur eine Krücke und beim nächsten Plugin-Update kaputt.
Es kommt eben immer wieder vor, dass man eine etwas andere Struktur braucht.
Ich habe versucht, das Ganze (wie du früher schon einmal) mit einer Variablen "$onepage_structure" über das Template zu lösen - ging aber schief (und den Controller hätte ich dann auch ändern müssen).

Tatsächlich wäre es schön, wenn die flexible Struktur (inkl. felxibler Klassennnamen) sowohl im Onepage- als auch im Multionepage-Plugin Einzug hielten.
Warum du damals für deine Vorschläge nicht ausreichend Zustimmung bekamst, weiß ich nicht mehr. Vielleicht habe ich da gepennt (oder hab's nicht verstanden). - Jetzt bereue ich die mangelnde Unterstützung für dich.

---
Kleine Nebenbemerkung:
Bei euch Programmierern sieht der Code für html-Ausgaben z.B. oft so aus:

Code: Select all

sprintf(
                        '<div id="%s" ...
Vielleich verwundert euch, wie ich das geschrieben habe:

Code: Select all

sprintf( '
<div class="%s" ...
Im gerenderten Code der ausgelieferten Seite entstehen so Zeilenschaltungen an der richtigen Stelle. Für mich ist das dann lesbarer, wenn ich mir den Quelltext eine Seite anschaue.

olape
Posts: 1279
Joined: Fri Mar 13, 2015 8:47 am
Contact:

Re: Neues "MultiOnePage" - Plugin

Post by olape » Mon Aug 31, 2020 5:56 am

frase wrote:
Mon Aug 31, 2020 4:52 am
Für mich ist das dann lesbarer, wenn ich mir den Quelltext eine Seite anschaue.
Genau der gleichen Grund ist es, warum es in PHP so aussieht wie es aussieht. ;)

frase
Posts: 3515
Joined: Thu Apr 21, 2016 6:32 am
Location: Saxony
Contact:

Re: Neues "MultiOnePage" - Plugin

Post by frase » Mon Aug 31, 2020 6:03 am

olape wrote:
Mon Aug 31, 2020 5:56 am
Genau der gleichen Grund ist es, warum es in PHP so aussieht wie es aussieht. ;)
Genau.
Deshalb habe ich ja auch die PHP-Einrückungen nicht verändert, sondern nur die html-Ausgabe (nach dem ' bzw. innerhalb '...' ).

Holger
Site Admin
Posts: 3236
Joined: Mon May 19, 2008 7:10 pm
Location: Hessen, Germany
Contact:

Re: Neues "MultiOnePage" - Plugin

Post by Holger » Mon Aug 31, 2020 9:21 pm

frase wrote:
Mon Aug 31, 2020 4:52 am
Vorläufig habe ich mir mit einer händischen Änderung in Controller.php geholfen:
Okay, mit dem Code kann ich etwas anfangen und dir einen Lösungsvorschlag anbieten:

was du brauchst, ist eine angepasste Methode "getContent()" aus der Klasse Multionepage\Controller.
Dafür musst du die bestehende Controller-Klasse um die gewünschten Änderungen erweitern.
Du legst dazu eine neue Klasse, z.B. "TplnameController" an, die nur die geänderte Methode "getContent()" enthält.
Der Code dazu sieht so aus:

Code: Select all

<?php

class TplnameController extends Multionepage\Controller {
    
    public static function getContent($pages) {
        global $s, $o, $c, $edit, $plugin_cf, $pd_router;

        if (!($edit && XH_ADM) && $s > -1) {
            $contents = '';
            foreach ($pages as $i) {
                if ($plugin_cf['multionepage']['url_numeric']) {
                    $url = $i;
                } else {
                    $url = Multionepage\Urlify::makeUniqueUrl($i);
                }
                $pageData = $pd_router->find_page($i);
                $content = self::replaceAlternativeHeading($c[$i], $pageData);
                if (XH_ADM && !$edit) {
                    $content = self::renderEditlink($i) . $content;
                }
                $contents .= sprintf('
                    <article id="%s" class="section-fullpage %s">
                    <div class="section-wrapper">%s
                    </div>
                    </article>',
                    $url,
                    $pageData['multionepage_class'],
                    sprintf( '
                        <div class="%s">%s</div>',
                        $plugin_cf['multionepage']['inner_class'],
                        $content
                    )
                );
            }
            $o .= preg_replace('/#CMSimple (.*?)#/is', '', $contents);
        }
        return preg_replace('/<!--XH_ml[1-9]:.*?-->/is', '', $o);
    }
}
Die erste Zeile sagt ja schon worum es geht: Klasse TplnameController erweitert die bestehende Klasse Multionepage\Controller. Alle Eigenschaften und Methoden, die in der Original-Klasse vorhanden sind, gibt es auch in der neuen Klasse. Nur die Methode getContent() wird nach den neuen Erfordernissen an die Struktur geändert.

Das war der halbe Weg.
Um nun die neue Klasse / Methode auch zur Ausgabe zu verwenden, braucht es noch eine entsprechende Template-Funktion. Im konkreten Fall muss also ein Ersatz für die Template-Funktion "Multionepage_Content()" her.
Im Prinzip ist das auch nur eine Kopie der bestehenden Funktion. Lediglich der Aufruf von getContent() muss natürlich aus der neuen Klasse verwendet werden:

Code: Select all

function Tplname_multionepage_content() {
    global $bjs, $edit, $l, $u, $s, $sn, $pd_router;

    if ($s > -1 && $l[$s] > 1 && (!XH_ADM || (XH_ADM && !$edit))) {
        $pageData = $pd_router->find_page($s);
        if ($pageData['multionepage_access']) {
            $bjs .= '<script>jQuery(".onepage_menu").hide();</script>';
            return TplnameController::getContent(array($s));
        }
        $t = Multionepage\Controller::getRoot($s);
        if (hide($t)) {
            return shead(404);
        } else {
            $path = $sn . '?' . $u[$t];
            header("Location: $path", true, 301);
            exit;
        }
    } else {
        $pages = Multionepage\Controller::getSubPages();
        return TplnameController::getContent($pages);
    }
}
Die entscheidende Codezeile ist hier "return TplnameController::getContent($pages);". Im Original wurde "Multionepage\Controller::getContent($pages)" verwendet.

Beide Codeblöcke kannst du direkt am Anfang des Templates einfügen, oder über eine externe Datei im Template-Ordner per include() / require() einbinden. Im Template ersetzt du dann noch <?=Multionepage_content();?> mit
<?=Tplname_multionepage_content();?>.

Bei der Namensgebung der Klasse und der Methode solltest du noch Anpassungen machen. Tplname sollte einen sinnvollen und eindeutigen Namen haben.

frase wrote:
Fri Aug 28, 2020 9:25 am
Ich wünsche mir die $onepage_structure sehnlichst zurück
Solche Anpassungen per globaler Variable zu definieren ist Murks. Und ehrlich gesagt war ich überrascht, dass das überhaupt funktioniert hat (eventuell kann Christoph da Licht hinein bringen?). Jedenfalls kann die Variablen-Lösung nur genau diese Änderung an genau dieser Code-Position ermöglichen. Was aber, wenn du auch in der Menüstruktur irgendwo Änderungen brauchst? Die Lösung kann dann ja nicht eine weitere globale Variable im nächsten Plugin-Update sein.
Analog zu obigem Beispiel lassen sich die meisten Methoden des Plugins anpassen. Und natürlich lassen sich auch zusätzliche Methoden definieren. Alles über das Template. Und somit (nahezu) updatesicher.
Last edited by Holger on Tue Sep 08, 2020 1:02 pm, edited 1 time in total.
Reason: Fixed Bug in Tplname_multionepage_content()

cmb
Posts: 13396
Joined: Tue Jun 21, 2011 11:04 am
Location: Mü-Sa, RLP, DE
Contact:

Re: Neues "MultiOnePage" - Plugin

Post by cmb » Mon Aug 31, 2020 9:51 pm

Holger wrote:
Mon Aug 31, 2020 9:21 pm
frase wrote:
Fri Aug 28, 2020 9:25 am
Ich wünsche mir die $onepage_structure sehnlichst zurück
Solche Anpassungen per globaler Variable zu definieren ist Murks. Und ehrlich gesagt war ich überrascht, dass das überhaupt funktioniert hat (eventuell kann Christoph da Licht hinein bringen?).
Aus dem Kopf: das ist in der Tat sehr minimalistisch, und basiert auf sprintf() mit dem ein einziges %s in dem Variablenwert durch die innere Struktur ersetzt wird.
Christoph M. Becker – Plugins for CMSimple_XH

Holger
Site Admin
Posts: 3236
Joined: Mon May 19, 2008 7:10 pm
Location: Hessen, Germany
Contact:

Re: Neues "MultiOnePage" - Plugin

Post by Holger » Mon Aug 31, 2020 10:06 pm

cmb wrote:
Mon Aug 31, 2020 9:51 pm
Aus dem Kopf: das ist in der Tat sehr minimalistisch, und basiert auf sprintf() mit dem ein einziges %s in dem Variablenwert durch die innere Struktur ersetzt wird.
Nicht ganz, siehe hier: http://holgerirmler.de/op_jquery/#OnePage-Container

Die "Lösung" war, hier "konkreten PHP-Code" in einer globalen Variable zu speichern. Das folgende Codeschnipsel hat wirklich so funktioniert...

Code: Select all

<?php $onepage_structure =
    '<div class="onepage_page_outer">
        <div id="%s" class="onepage_page container">
            <div class="onepage_page_inner">
                %s
            </div>
        </div>
    </div>';
?>
... und das finde ich eigentlich merkwürdig :? .

Hier noch die Methode im Plugin, in der $onepage_structure verwendet wurde:

Code: Select all

public static function getContent()
    {
        global $s, $o, $hc, $c, $u, $edit, $plugin_cf, $onepage_structure;

        if (!($edit && XH_ADM) && $s > -1) {
            if (!isset($onepage_structure)) {
                //Default-Struktur definieren
                $onepage_structure = '<div id="%s" class="onepage_page">%s</div>';
            }
            $contents = '';
            $oldS = $s;
            foreach ($hc as $i) {
                $s = $i;
                $url = $plugin_cf['onepage']['url_numeric']
                    ? $i
                    : XH_hsc(urldecode($u[$i]));
                $contents .= sprintf(
                    $onepage_structure,
                    $url, evaluate_scripting($c[$i])
                );
            }
            $s = $oldS;
            return $o . preg_replace('/#CMSimple (.*?)#/is', '', $contents);
        } else {
            return $o;
        }
    }
Aber egal. Es ist Murks (nicht minimalistisch).

Post Reply