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 » Mon Aug 26, 2019 10:22 am

cmb wrote:
Sat Aug 24, 2019 5:58 pm
Wenn die Anpassung in template.htm erfolgen soll, dann müsste man ein alternatives Onepage_content() zur Verfügung stellen. Die eigentliche Implementierung ist kein Hexenwerk, so dass man das mit Copy&Paste und ein bisschen Anpassung machen könnte.
Na ja, relativ gesehen. Ich werd's mal versuchen.
„Bevor du den Pfeil der Wahrheit abschießt, tauche die Spitze in Honig!“   👉 Ludwig's XH-Templates for MultiPage & OnePage

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

Re: Code - Fragen

Post by lck » Fri Aug 30, 2019 11:36 am

lck wrote:
Mon Aug 26, 2019 10:22 am
Ich werd's mal versuchen.
Versuche fehlgeschlagen, brauche Hilfe vom Profi.

Betrifft Controller.php Zeile 156 - 182:
Diesen Bereich, besser gesagt eigentlich nur eine Zeile (173), will ich per template.htm anders ausgeben.

Code: Select all

'<div class="%s">%s</div>',
Sollte geändert werden zu

Code: Select all

'<div class="%s"><input type="checkbox" class="lck_acc-toggle" checked><i class="lck_acc-toggle-icon"></i>%s</div>',
„Bevor du den Pfeil der Wahrheit abschießt, tauche die Spitze in Honig!“   👉 Ludwig's XH-Templates for MultiPage & OnePage

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

Re: Code - Fragen

Post by cmb » Sat Aug 31, 2019 7:40 am

Was ich im Sinn hatte war etwa folgende content.php im Template-Ordner:

Code: Select all

<?php

function lck_onepage_content()
{
    return Lck_Onepage::getContent();
}

class Lck_Onepage
{
    /**
     * @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);
                $contents .= sprintf(
                    '<div id="%s" class="onepage_page %s">%s</div>',
                    $url,
                    $pageData['onepage_class'],
                    sprintf(
                        '<div class="%s"><input type="checkbox" class="lck_acc-toggle" checked><i class="lck_acc-toggle-icon"></i>%s</div>',
                        $plugin_cf['onepage']['inner_class'],
                        $content
                    )
                );
            }
            $o .= preg_replace('/#CMSimple (.*?)#/is', '', $contents);
        }
        return preg_replace('/<!--XH_ml[1-9]:.*?-->/is', '', $o);
    }

    /**
     * @param string $content
     * @return string
     * @todo Use Pageparams_replaceAlternativeHeading() if available.
     */
    protected static function replaceAlternativeHeading($content, array $pageData)
    {
        global $cf;

        if (isset($pageData['show_heading']) && $pageData['show_heading'] == '1') {
            $pattern = '/(<h[1-' . $cf['menu']['levels'] . '].*>).+(<\/h[1-'
                . $cf['menu']['levels'] . ']>)/isU';
            if (trim($pageData['heading']) == '') {
                return preg_replace($pattern, '', $content);
            } else {
                return preg_replace(
                    $pattern,
                    '${1}' . addcslashes($pageData['heading'], '$\\') . '$2',
                    $content
                );
            }
        } else {
            return $content;
        }
    }
}
Diese Datei wird dann in template.htm eingebunden:

Code: Select all

<?php
require_once "{$pth['folder']['template']}content.php";
?>
Und dann wird der Aufruf von Onepage_content() durch lck_onepage_content() ersetzt.

Das ist natürlich für die kleine Anpassung ziemlich aufwendig, und auch bezüglich möglicher Änderungen an Onepage_XH nicht gerade elegant. Vielleicht etwas besser ist ein kleiner Hack, mit dem dem das erzeugte HTML nachträglich angepasst wird. Dazu einfach nur in template.htm die Funktion definieren:

Code: Select all

function lck_onepage_content()
{
    global $plugin_cf;

    $content = Onepage_content();
    $innerclass = $plugin_cf['onepage']['inner_class'];
    return preg_replace(
        "/<div class=\"($innerclass)\">/u",
        '<div class="\\1"><input type="checkbox" class="lck_acc-toggle" checked><i class="lck_acc-toggle-icon"></i>',
        $content);
}
Und dann eben auch den Aufruf von Onepage_content() durch lck_onepage_content() ersetzen. content.php wird hier gar nicht benötigt.

Auch ein bisschen problematisch wegen eventueller Onepage_XH Updates. Die eigentlich beste Lösung wäre eine Anpassung von Onepage_XH, etwa dass man als Designer ein kleines Template für den Seiteninhalt vorgeben kann wie es mal von Holger vorgeschlagen wurde.

Oder halt ganz hackish, ohne Programmanpassung, einfach nur config.php anpassen:

Code: Select all

$plugin_cf['onepage']['inner_class']="onepage_page_inner\"><input type=\"checkbox\" class=\"lck_acc-toggle\" checked><i class=\"lck_acc-toggle-icon\"></i class=\"";
Christoph M. Becker – Plugins for CMSimple_XH

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

Re: Code - Fragen

Post by lck » Sat Aug 31, 2019 10:13 am

Sehr schön Christoph, besten Dank!

Version 1 per content.php: Ja, das wäre für die kleine Änderung wohl zu umfangreich, aber gut zu wissen.
Version 2 per template.htm: Gefällt mir gut, genau das, was ich gesucht habe.
Version 3 per config.php: Gefällt mir noch besser. Einfach und kurz, ist halt nicht updatesicher und müsste mit ausgeliefert oder dokumentiert werden :? .
„Bevor du den Pfeil der Wahrheit abschießt, tauche die Spitze in Honig!“   👉 Ludwig's XH-Templates for MultiPage & OnePage

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

Re: Code - Fragen

Post by cmb » Sat Aug 31, 2019 11:40 am

lck wrote:
Sat Aug 31, 2019 10:13 am
Version 3 per config.php: Gefällt mir noch besser. Einfach und kurz, ist halt nicht updatesicher und müsste mit ausgeliefert oder dokumentiert werden :? .
Ja (dynamische Änderungen von $plugin_cf ist seit XH 1.7 nicht mehr möglich). Aber darüber hinaus ist es eben sehr hackish, da folgendes erzeugt wird:

Code: Select all

</i class="">
Auch wenn Browser damit kein Problem haben sollten, ist es halt nicht schön.

Version 2 wäre so gesehen zu bevorzugen.
Christoph M. Becker – Plugins for CMSimple_XH

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

Re: Code - Fragen

Post by lck » Thu Nov 21, 2019 8:36 pm

Gibt es in PHP auch eine wrap-Function, so wie bei jQuery?

Vorgabe: Suche erste h1 in einer Seite und umschließe den nachfolgenden content bis zum Ende (bevor einer bestimmten Klasse) mit einem div, zum Beispiel <div class="php-wrapper">...</div>.
„Bevor du den Pfeil der Wahrheit abschießt, tauche die Spitze in Honig!“   👉 Ludwig's XH-Templates for MultiPage & OnePage

manu
Posts: 751
Joined: Wed Jun 04, 2008 12:05 pm
Location: St. Gallen - Schweiz
Contact:

Re: Code - Fragen

Post by manu » Thu Nov 21, 2019 8:54 pm

preg_replace ist da so ein Ansatz. Chrstoph kennt wohl den regex pattern aus dem Stegreif.

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

Re: Code - Fragen

Post by Holger » Thu Nov 21, 2019 9:06 pm

Oder DOMDocumet / DOMXPath (auch gefrickel).

Kannst Du mal ein konkretes Beispiel posten? Das mit
...den nachfolgenden content bis zum Ende (bevor einer bestimmten Klasse)
verstehe ich nicht wirklich.
Bis zu einem beliebigen Element mit einer bestimmten Klasse?

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

Re: Code - Fragen

Post by lck » Thu Nov 21, 2019 9:13 pm

Holger wrote:
Thu Nov 21, 2019 9:06 pm
Kannst Du mal ein konkretes Beispiel posten?
Im Prinzip so wie hier.
„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 » Thu Nov 21, 2019 9:44 pm

lck wrote:
Thu Nov 21, 2019 9:13 pm
Im Prinzip so wie hier.
Also immer alles von <h2> bis zum nächsten <h2> "wrappen"?

Eine einfache Funktion, wie mit jQuery, gibt es nicht in PHP. Dafür muss eine eigene Funktion erstellt werden. Die Randbedingungen müssen aber genau bekannt sein.
Das, was Du suchst, ist vermutlich so wie das Seitensplitting von XH.
Kannst Du die Sache etwas genauer beschreiben?

Post Reply