Clean URLs

Please post answers on the most frequently asked questions about CMSimple
cmss
Posts: 244
Joined: Mon Jan 02, 2017 6:15 pm

Re: Clean URLs

Post by cmss » Tue Apr 04, 2017 9:49 am

Das Problem ist doch noch ganz anders : Will ich Bootstrap (o.ä.) benutzen, so muss eine UL mit Menülevel 1 die Klasse 'dropdown-menu' bekommen - genau wie Verzweigungslinks(Einige Anker evtl. auch). Andere Templates wollen andere Klassen-Namen.
Ich kann aber beim UL nur den Inhalt hinzufügen und keinen Klassennamen (wer hier eine Lösung hat ist willkommen). Mit Jquery-add und php-Script kann man hier ein wenig nachhelfen. Jede Seite kann ein anderes Standardtemplate haben (im Extremfall) unabhängig von einem Themeswitcher. Dazu hilft eine Variable 'aktuelles Template'.

Habe ich mehrere Templates, so kommen sich die Styles in die Quere. Daher mein Vorschlag : Ein Textfeld statt einer Zeile und eine Auswertung per php mit if then o.ä.(habe ich schon anderweitig gesehen, e107 zb.)
Templatename1: Klasse 1 , Klasse 2, Klasse 3 , Klasse 4....;
Templatename2: Klasse 1 , Klasse 2, Klasse 3 , Klasse 4....;
.....

Man könnte dann eine styles.php zu jedem Template hinzufügen und diese auswerten und/oder eine template.php im System.
Ich möchte dazu nur noch eins bemerken. Es gibt auch Cmsse wie Typesetter, die nur ein CSS benötigen ohne all das - warum nicht auch ein künftiges Cmsimple.

Zum Stylen eine Interessante Quelle : https://github.com/pear/HTML_CSS

cmss
Posts: 244
Joined: Mon Jan 02, 2017 6:15 pm

Re: Clean URLs

Post by cmss » Wed Apr 05, 2017 6:38 pm

Ich suche eine Methode, um mit preg-replace oder mit str_replace eine Klasse in einem ul oder li nur für das momentane Template zu ändern
echo preg_replace($suchmuster, $ersetzung, $zeichenkette); oder mit
string str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )

also : <ul class=klasse1> nach <ul class= klasse2> ändern etc.

Eine Methode ist DomDocumentObjekt. Nur wie binde ich das in das System ein : str_replace(" docs ", " doc111 ", $text);

Übrigens geht "php auch in Javascript" : https://github.com/kvz/locutus (http://locutus.io)

P.S. .... Die Lösung geht wohl über Cmsimple-Script wie auf http://www.w3nord.de/cmsimple/?CMSimple_Hilfe:Tricks erläutert (# CMSimple $output=preg_replace(...). #
So kann man in Toxic eine Klasse definieren und sie dann in allen Templates verschieden ersetzen. Dies Ersetzung liesse sich als als styles.php ins Template einbinden.

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Clean URLs

Post by cmb » Fri Apr 14, 2017 5:52 pm

cmss wrote:Übrigens geht "php auch in Javascript" : https://github.com/kvz/locutus (http://locutus.io)
Süß.
cmss wrote:So kann man in Toxic eine Klasse definieren und sie dann in allen Templates verschieden ersetzen.
Warum nicht einfach die definierte Klasse in allen Templates passend stylen?
Christoph M. Becker – Plugins for CMSimple_XH

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Clean URLs

Post by cmb » Fri Apr 14, 2017 6:07 pm

cmss wrote:Das Problem ist doch noch ganz anders : Will ich Bootstrap (o.ä.) benutzen, so muss eine UL mit Menülevel 1 die Klasse 'dropdown-menu' bekommen - genau wie Verzweigungslinks(Einige Anker evtl. auch). Andere Templates wollen andere Klassen-Namen.
Ah – verstehe. Wenn sowieso Bootstrap im Einsatz ist, dann kann man wohl JavaScript beim Besucher voraussetzen, und das Problem auch damit lösen. Man kann dann z.B. per Toxic_XH die Klasse meine_klasse vergeben, und diese dann in dropdown-menu wandeln:

Code: Select all

<script>
jQuery(function ($) {
    $(".meine_klasse").removeClass("meine_klasse").addClass("dropdown-menu");
});
</script>
Christoph M. Becker – Plugins for CMSimple_XH

cmss
Posts: 244
Joined: Mon Jan 02, 2017 6:15 pm

Re: Clean URLs

Post by cmss » Sat Apr 15, 2017 10:04 am

*Mit jquery addclass-removeclass geht es natürlich - man müsste dazu eine Tabelle mit den Ersetzungen entwerfen.

Dazu auch https://github.com/alexanderkx/xDomClass
Für mehrere Klassen : https://github.com/SeanJM/jquery.removeClass

* Eine weitere Möglichkeit wäre in menu.php (oder sonstwo) die Funktion setClassname (i) hinzuzufügen.

s.a. http://stackoverflow.com/questions/2108 ... m-html-tag

* Ich werde aber auch erst einmal mit #Cmsimple ... und styles.php versuchen

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Clean URLs

Post by cmb » Sat Apr 15, 2017 1:27 pm

cmss wrote:*Mit jquery addclass-removeclass geht es natürlich - man müsste dazu eine Tabelle mit den Ersetzungen entwerfen.
Ja, genau, zumindest wenn unterschiedliche Ersetzungen nötig sind.
cmss wrote:* Eine weitere Möglichkeit wäre in menu.php (oder sonstwo) die Funktion setClassname (i) hinzuzufügen.
Eine solche Funktion ist überflüssig, weil man ja auch gleich die gewünschte Klasse ausgeben könnte.
cmss wrote:Ich werde aber auch erst einmal mit #Cmsimple ... und styles.php versuchen
Das geht nicht, weil $output nur das HTML des Inhaltsbereiches enthält, nicht aber dasjenige des Menüs. Ab XH 1.7 wird es möglicherweise einen "final-clean-up" Hook geben, der dann genutzt werden könnte. Aber selbst wenn dieser zur Verfügung stünde, ist eine JavaScript-Lösung einfacher oder zumindest kürzer, und diese könnte ja direkt im Template eingebunden werden, so dass eine Ersetzungstabelle eventuell gar nicht mehr nötig ist.
Christoph M. Becker – Plugins for CMSimple_XH

cmss
Posts: 244
Joined: Mon Jan 02, 2017 6:15 pm

Re: Clean URLs

Post by cmss » Sat Apr 15, 2017 8:18 pm

Im Augenblick bin ich etwas ratlos. Obiges : <script>
jQuery(function ($) { $(".meine_klasse").removeClass("meine_klasse").addClass("dropdown-menu");
}); </script>
unten vor dem body hat keine Wirkung und auch nicht so etwas wie

$( "ul" ).addClass(function( index, currentClass ) {
var addedClass;
if ( currentClass === "red" ) {
addedClass = "green";

nach https://api.jquery.com/addclass/

ich werde mal nach https://www.w3schools.com/jquery/tryit. ... m_addclass weiterversuchen....

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Clean URLs

Post by cmb » Sat Apr 15, 2017 10:03 pm

cmss wrote:Obiges : <script>
jQuery(function ($) { $(".meine_klasse").removeClass("meine_klasse").addClass("dropdown-menu");
}); </script>
unten vor dem body hat keine Wirkung […]
Hm, hat es wirklich keine Wirkung, oder nur keine sichtbare? Sprich, wenn es irgendwo im erzeugten HTML-Quelltext ein Element mit der Klasse meine_klasse gibt, wird diese dann im DOM (Kontextmenü → Element untersuchen) nicht durch die Klasse dropdown-menu ersetzt?
cmss wrote:$( "ul" ).addClass(function( index, currentClass ) {
var addedClass;
if ( currentClass === "red" ) {
addedClass = "green";
Das müsste einen JavaScript-Fehler erzeugen, da das Script "mitten drin" einfach aufhört. :?
Christoph M. Becker – Plugins for CMSimple_XH

cmss
Posts: 244
Joined: Mon Jan 02, 2017 6:15 pm

Re: Clean URLs

Post by cmss » Sun Apr 16, 2017 12:32 pm

Der Code endet natürlich mit
} return addedClass; });

Allerdings hat obiges <script> jQuery(function ($) { $(".meine_klasse").removeClass("meine_klasse").addClass("dropdown-menu"); }); </script> keine Wirkung (Seitenquelltext im Firefox) - jquery ist an - mein Templateswitcher läuft auch!

$( "ul.menulevel1" ).addClass( "dropdown1" ).removeClass( "menulevel1" ); bzw.
$('div.nav ul:first').addClass('dropdown-menu'); -
als Beispiele - gehen mit Webdeveloper : Quelltext--->erzeugten Quelltext.. (s.u.) - nachprüfbar
------------------------------------
Es gibt natürlich immer noch eine Möglichkeit Bootstrap umzusetzen : Man kann im Style.css die menulevelx-Klassen in allen Einzelheiten so nachstylen wie die Dropdown-menu-Klasse im bootstrap-css und evtl. zusätzliche Klassen in Reihe dahinter.
Man kann dann allerdings das Toxic nur einmal einsetzen - es gibt da mehrere bootstrap-Menüarten(bootsnip.com!)

Schön wäre auch ein oben erwähnter Hook zum Zugriff per php - auch als Patch für 1.69 und auch die Möglichkeit ein smartmenu mit smart-jquery und ein material-css einsetzen zu können. Das macht das System für viele User sehr viel attraktiver. Wie gesagt kann z.B. Typesetter das automatisch - es benötigt nur ein (s)css und fügt die Klassen automatisch ein - andere Systeme haben ein menu.php o.ä. im Template. Es gibt da viele Wege und man braucht auch die Zeit dafür.
Last edited by cmss on Sun Apr 16, 2017 6:03 pm, edited 2 times in total.

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Clean URLs

Post by cmb » Sun Apr 16, 2017 1:08 pm

cmss wrote:Allerdings hat obiges <script> jQuery(function ($) { $(".meine_klasse").removeClass("meine_klasse").addClass("dropdown-menu"); }); </script> keine Wirkung (Seitenquelltext im Firefox) - jquery ist an - mein Templateswitcher läuft auch!
Der Seitenquelltext ist das von PHP generierte HTML, und kann nicht durch JavaScript manipuliert werden. Änderungen kann man nur im DOM-Fenster der Entwicklerkonsole des Browsers sehen.
cmss wrote:[…] andere Systeme haben ein menu.php o.ä. im Template.
Das ist natürlich auch bei CMSimple_XH möglich, und einige Templates machen das auch so. Seit CMSimple_XH 1.6.3 kann ein eigenes Menü unter Umständen sehr einfach implementiert werden; ich habe mal gezeigt wie ein der üblichen Varianten von xtoc (einem älteren, eigenständigen Menüsystem) nun mit wenigen Zeile Code implementiert werden kann. Für Deinen Zweck könnte in etwa folgendes genutzt werden:

Code: Select all

<?php

require_once $pth['folder']['classes'] . 'Menu.php';

class MyLi extends XH_Li
{
    function renderULStartTags($i)
    {
        global $l;

        $lines = array();
        for ($k = $this->getMenuLevel($i - 1); $k < $this->getMenuLevel($i); $k++) {
            $lines[] = "\n" . '<ul class="' . $this->st . ($k + 1) . ' dropdown-menu">' . "\n"; // set class here
        }
        return implode('<li>' . "\n", $lines);
    }
}

function cmss_menu($start = null, $end = null)
{
    return toc($start, $end, array(new MyLi, 'render'));
}

?>
Diese Datei dann früh in template.htm includen, und statt toc() eben cmss_menu() aufrufen. Je nach Bedarf dann die kommentierte Zeile ("set class here") modifizieren.
Christoph M. Becker – Plugins for CMSimple_XH

Post Reply