Code - Fragen

Ein CMSimple Support Forum für deutsch sprechende Nutzer und Entwickler
lck
Posts: 1819
Joined: Wed Mar 23, 2011 11:43 am
Contact:

Re: Code - Fragen

Post by lck » Fri Nov 22, 2019 11:19 am

Holger wrote:
Thu Nov 21, 2019 9:44 pm
Kannst Du die Sache etwas genauer beschreiben?
Beispiel, Istzustand (Seitenausgabe)

Code: Select all

<div id="Start" class="onepage_page ">
<div class="onepage_page_inner">
<input type="checkbox" class="lck_acc-toggle" checked="">
<i class="lck_acc-toggle-icon"></i>
<h1>Start</h1>
<p>Ich bin ein Absatz voll mit Inhalt.</p>
<p>Ich bin ein <span>weiterer Absatz</span> voll mit Inhalt</p>
<img src="test.jpg" alt="Testbild" />
<h2>Ich bin eine Zwischenüberschrit</h2>
<p>Ich bin noch ein Absatz, aber ich habe einen <a href="#" title="Beispiellink">Link</a> in mir.</p>
...
</div>
</div>

<!-- Hier beginnt eine neue Seite -->
<div id="Start" class="onepage_page ">
<div class="onepage_page_inner">
<input type="checkbox" class="lck_acc-toggle" checked="">
<i class="lck_acc-toggle-icon"></i>
<h1>Start</h1>
...
</div>
</div>
Sollzustand

Code: Select all

<div id="Start" class="onepage_page ">
<div class="onepage_page_inner">
<input type="checkbox" class="lck_acc-toggle" checked="">
<i class="lck_acc-toggle-icon"></i>
<h1>Start</h1>

<div class="page-content"> <!-- dieses div sollte automatisch erzeugt werden -->
<p>Ich bin ein Absatz voll mit Inhalt.</p>
<p>Ich bin ein <span>weiterer Absatz</span> voll mit Inhalt</p>
<img src="test.jpg" alt="Testbild" />
<h2>Ich bin eine Zwischenüberschrit</h2>
<p>Ich bin noch ein Absatz, aber ich habe einen <a href="#" title="Beispiellink">Link</a> in mir.</p>
...
</div> <!-- End div class="page-content" -->

</div>
</div>
Es soll also ein div mit der Klasse page-content den gesamten Bereich nach der Überschrift h1 umschließen, bis zum Anfang der nächsten Seite.

Mit jQuery würde die Lösung so aussehen

Code: Select all

$(".onepage_page_inner > .lck_acc-toggle ~ h1").nextUntil(".onepage_page").wrap("<div class='page-content'></div>");
:) Mit jQuery wäre alles so einfach, aber es gibt ja immer wieder Bedenken hinsichtlich Besucher die Javascript deaktiviert haben könnten. Deswegen hätte ich gerne eine PHP-Lösung, wenn möglich.
„Bevor du den Pfeil der Wahrheit abschießt, tauche die Spitze in Honig!“   👉 Ludwig's XH-Templates for MultiPage & OnePage

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

Re: Code - Fragen

Post by Holger » Fri Nov 22, 2019 12:26 pm

Okay, kapiert. Aber warum willst Du das nachträglich machen? Besser wäre wohl die entsprechende Content - Methode angepasst per Template zur Verfügung zu stellen. Welches Onepage-Plugin möchtest Du verwenden? Dann schau ich mal.

BTW: die Sache damals mit Onepage_Structure war scheinbar doch nicht so 'ne blöde Idee. Man müsste es nur anders umsetzen.

lck
Posts: 1819
Joined: Wed Mar 23, 2011 11:43 am
Contact:

Re: Code - Fragen

Post by lck » Fri Nov 22, 2019 5:11 pm

Holger wrote:
Fri Nov 22, 2019 12:26 pm
Okay, kapiert. Aber warum willst Du das nachträglich machen? Besser wäre wohl die entsprechende Content - Methode angepasst per Template zur Verfügung zu stellen.
Weil ich es nicht anders kann :roll: :) .
Holger wrote:
Fri Nov 22, 2019 12:26 pm
Welches Onepage-Plugin möchtest Du verwenden? Dann schau ich mal.
Christoph's Version Onepage_XH.
„Bevor du den Pfeil der Wahrheit abschießt, tauche die Spitze in Honig!“   👉 Ludwig's XH-Templates for MultiPage & OnePage

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

Re: Code - Fragen

Post by Holger » Sun Nov 24, 2019 3:30 pm

Okay,
lck wrote:
Fri Nov 22, 2019 5:11 pm
Christoph's Version Onepage_XH.
Vom Prinzip her kann man das genau so machen, wie schon von My_LI() bekannt.
Du suchst im OnePage-Plugin die Klasse / Methode die für den Zusammenbau der Ausgabe verantwortlich ist, leitest davon eine eigene Klasse ab und veränderst die entsprechende(n) Methode(n) für Deine Ansprüche.
Konkret brauchen wir die Methode getContent() aus Onepage\Controller. Der Code kann direkt in die template.htm oder extern per include() über die template.htm geladen werden. Danach muss die veränderte getContent-Methode über eine neu definierte Template-Funktion noch im Template aufgerufen werden.

Ich dachte erst, dass die Sache ganz simpel ist. Wenn es nur eine <h1> Überschrift auf der "Onepage-Seite" gibt, wäre ein simples und schnelles str_replace() schon die Lösung. Aber wie kannst Du sicher sein, dass es nicht mehr als eine <h1> gibt, oder dass die erste Überschrift auch ersten Grades ist :?
Ich habe dann den etwas rechenintensiveren Weg über RegExp gewählt. Und ja, ich weiß, niemals so was für HTML-Elemete nehmen :roll: . Meine angepasste Methode sucht alle Überschriften in einer "Seite" und hängt an den zuerst gefundenen Treffer - egal welchen Grades - das öffnende <div class="page-content"> an. Am Seitenende wird dann noch das </div> angehängt.

Hier der Code dazu:

Code: Select all

<?php

class TplName_Controller extends Onepage\Controller
{

    /**
     * @return string
     */
    public static function getContent()
    {
        global $s, $o, $hc, $c, $u, $edit, $plugin_cf, $pd_router;

        if (!($edit && XH_ADM) && $s > -1) {
            $contents = '';
            foreach ($hc as $i) {
                $url = $plugin_cf['onepage']['url_numeric']
                    ? $i
                    : XH_hsc(urldecode($u[$i]));
                $pageData = $pd_router->find_page($i);
                $content = self::replaceAlternativeHeading($c[$i], $pageData);
                preg_match( '|<h[^>]+>(.*)</h[^>]+>|iU', $content, $headings);
                $content = str_replace($headings[0], $headings[0] . '<div class="page-content">', $content);
                $content .= '</div>';
                $contents .= sprintf(
                    '<div id="%s" class="onepage_page %s">%s</div>',
                    $url,
                    $pageData['onepage_class'],
                    sprintf(
                        '<div class="%s">%s</div>',
                        $plugin_cf['onepage']['inner_class'],
                        $content
                    )
                );
            }
            $o .= preg_replace('/#CMSimple (.*?)#/is', '', $contents);
        }
        return preg_replace('/<!--XH_ml[1-9]:.*?-->/is', '', $o);
    }
    
}

function TplName_Onepage_Content()
{
    return TplName_Controller::getContent();
}
Der Aufruf im Template wäre dann

Code: Select all

<?php echo TplName_Onepage_Content();?>
anstatt

Code: Select all

<?php echo Onepage_Content();?>
Bitte noch "TplName" überall ensprechend eindeutig umbenennen.

lck
Posts: 1819
Joined: Wed Mar 23, 2011 11:43 am
Contact:

Re: Code - Fragen

Post by lck » Sun Nov 24, 2019 7:16 pm

Holger wrote:
Sun Nov 24, 2019 3:30 pm
Hier der Code dazu:
...
Du bist der Hammer Holger! Funktioniert, dankeschön!
„Bevor du den Pfeil der Wahrheit abschießt, tauche die Spitze in Honig!“   👉 Ludwig's XH-Templates for MultiPage & OnePage

Post Reply