Code - Fragen

Ein CMSimple Support Forum für deutsch sprechende Nutzer und Entwickler
lck
Posts: 1861
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: 3180
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: 1861
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: 3180
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: 1861
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

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

Re: Code - Fragen

Post by lck » Sat Feb 01, 2020 1:38 pm

Ich möchte im Backend nur im Template-Vorschau-Modus bestimmte Bereiche des XH-Adminmenüs ausblenden.
Gelöst habe ich das momentan so.

Code: Select all

<?php
if ((!$edit && ($s > -1)) || (!$edit && ($s === -1) && $sitemap)) :?>
<style>
...
</style>
<?php endif?>
So geht es auch

Code: Select all

<?php
if ((!$edit && ($s > -1)) || (!$edit && ($s < 0) && $sitemap)) :?>
<style>
...
</style>
<?php endif?>
Frage: Was wäre hier der „richtigere“ Weg oder gibt es gar einen anderen?
„Bevor du den Pfeil der Wahrheit abschießt, tauche die Spitze in Honig!“   👉 Ludwig's XH-Templates for MultiPage & OnePage

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

Re: Code - Fragen

Post by frase » Sat Feb 01, 2020 2:10 pm

lck wrote:
Sat Feb 01, 2020 1:38 pm
Frage: Was wäre hier der „richtigere“ Weg oder gibt es gar einen anderen?
Ob es einen "richtigeren" Weg gibt, weiß ich nicht.
Habe beide Varianten probiert - und sie funktionieren beide.
Klar, die Bedingung ob $s gleich -1 oder kleiner Null ist, ist ja auch beinahe dasselbe.
An deiner Stelle tät' ich es so nehmen, wenns denn funktioniert.
Oder du wartest auf CMB oder auf Holger ;-)
Ineressant wäre zu erfahren, was du vorhast. Das klingt wieder spannend.

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

Re: Code - Fragen

Post by lck » Sat Feb 01, 2020 2:46 pm

frase wrote:
Sat Feb 01, 2020 2:10 pm
Ob es einen "richtigeren" Weg gibt, weiß ich nicht.
Wege gibt es bestimmt, aber ob es einfacher ist, das ist hier auch die Frage.
Jetzt ist mir gerade noch aufgefallen, dass die Suche wohl auch noch berücksichtigt werden müsste. Aber wer sucht schon im Template-Vorschau-Modus. :)
frase wrote:
Sat Feb 01, 2020 2:10 pm
Ineressant wäre zu erfahren, was du vorhast. Das klingt wieder spannend.
Habe ich oben ja schon angedeutet.
Genauer gesagt, bei den heutigen Templates ist das Backend ja nicht immer so nutzbar, wie es eigentlich vorgesehen ist. Das weißt du ja selber zur Genüge, man muss sich da schon ganz schön verbiegen und wieder einiges zurecht rücken, oder halt ein Plugin wie hi_admin einsetzen. Aber selbst damit ist es noch nicht getan, außer man verzichtet, wie früher, dass im Editor die Seite nicht 1zu1 dargestellt wird. Aber das haben wir ja schon genügend oft diskutiert und ich will jetzt da nicht erneut damit anfangen. Ist halt so, momentan. Eine Universallösung wird es sowieso nicht geben. Aber das ist hier OT.

Im konkreten Fall geht es um ein Template mit fixed'en Bereichen unter anderem die Menüs. Ich hatte das schon anders gelöst, ist halt dann wieder nicht eine 100%ige Vorschau, sondern nur eine 99%ige. Dann hatte ich die Idee, für die Template-Vorschau braucht man das Admin-Menü doch gar nicht, sondern eigentlich nur einen Button um in den Bearbeitungs-Modus zurück zu wechseln. Erst hier wird dann das komplette Admin-Menü angezeigt und auch in den anderen Bereichen.
„Bevor du den Pfeil der Wahrheit abschießt, tauche die Spitze in Honig!“   👉 Ludwig's XH-Templates for MultiPage & OnePage

Post Reply