New AddOn: recently_changed

Third Party Plugins to CMSimple - how to install, use and create plugins

Moderator: Tata

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

Re: New AddOn: recently_changed

Post by cmb » Sun Mar 18, 2018 10:43 pm

olape wrote:
Sun Mar 18, 2018 6:33 pm
olape wrote:
Tue Mar 06, 2018 2:32 pm

Code: Select all

			$linktext_length = strlen($linktext);
			if($linktext_length > $length) {
				$linktext = substr($linktext, -$length);
				$stringpos = strpos($linktext, ' ');
				$linktext = substr($linktext, (-$length + $stringpos));
			}
Das sieht nicht korrekt aus. strlen(), substr() und strpos() sind im Allgemeinen nicht für UTF-8 kodierte Zeichenketten geeignet. Einfaches Beispiel: https://3v4l.org/N1hD5

Korrekter ist die Verwendung der entsprechenden utf8_* Funktionen. Wirklich korrekt wäre die Verwendung der grapheme_* Funktionen; diese erfordern allerdings die Intl-Extension von PHP, die oft nicht verfügbar ist.

Und vielleicht wäre ein regulärer Ausdruck die beste Lösung.
olape wrote:
Sun Mar 18, 2018 6:33 pm
olape wrote:
Tue Mar 06, 2018 2:32 pm

Code: Select all

	$i = 0;
	foreach (array_keys($pageData) as $page) {
		if ($i < $count) {
			if (!hide($page)) {
				$timestamp = $pageData[$page]['last_edit'];
				$date = date('d.m.Y', $timestamp);
				$pages[$date][] = $page;
			}
			$i++;
		} else {
			break;
		}
	}
Das $i wird hochgezählt, auch wenn die Seite gar nicht erfasst wird. Das $i++ müsste also eine Zeile nach oben verschoben werden (also mit dem } vertauscht). Und dann könnte man auch die beiden if Anweisungen zusammenfassen:

Code: Select all

if ($i < $count) && !hide($page)) {
Christoph M. Becker – Plugins for CMSimple_XH

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

Re: New AddOn: recently_changed

Post by olape » Mon Mar 19, 2018 7:05 am

cmb wrote:
Sun Mar 18, 2018 10:43 pm
Das sieht nicht korrekt aus. strlen(), substr() und strpos() sind im Allgemeinen nicht für UTF-8 kodierte Zeichenketten geeignet. Einfaches Beispiel: https://3v4l.org/N1hD5
Da hast du Recht.

cmb wrote:
Sun Mar 18, 2018 10:43 pm
Das $i wird hochgezählt, auch wenn die Seite gar nicht erfasst wird. Das $i++ müsste also eine Zeile nach oben verschoben werden (also mit dem } vertauscht). Und dann könnte man auch die beiden if Anweisungen zusammenfassen:
Das ist die Lösung.
Hätte ich auch selber drauf kommen können. :oops:
Gruß Olaf, Plugins for CMSimple_XH

Ich habe schon lange den Verdacht, dass so viele so eifrig auf Gender, Trans und Queer machen:
Weil sie für das Fachliche ganz einfach zu doof sind.

Caravaner
Posts: 112
Joined: Sat Oct 05, 2019 5:20 pm
Location: Wadgassen (Saarland)
Contact:

recently_changed in Plugin SimplePlugins_XH-Edition-KRL

Post by Caravaner » Mon Jun 07, 2021 11:21 am

Nachdem ich diese Beiträge gelesen hatte, entschloss ich mich, diese Funktion in das Plugin simpleplugins_xh einzubauen.
Dann habe ich utf8 konforme Stringoperationen eingebaut und bei der Gelegenheit eine etwas (nach meiner Meinung) schönere Formatierung eingefügt, die über CSS für Benutzerwünsche zugänglicher ist.
Und schließlich habe ich von dem Plugin simpleplugins_xh eine eigene Edition zusammengestellt.
https://lembach-cmsimple.de/?Plugins/Si ... dition-KRL
Jetzt gerade habe ich diesen Beitrag viewtopic.php?f=12&t=17105&p=79157&hili ... ged#p79157 von olape gefunden. Darin ist ein Großteil, dessen, was ich gemacht habe, schon beschrieben.
Da jedoch ein paar Kleinigkeiten in meiner Arbeit über die Lösung von olape hinausgehen, habe ich mich entschlossen diesen Post dennoch zu veröffentlichen.

Code: Select all

if (!function_exists('recently_changed')) {

/**
 * @copyright 2016 Christoph M. Becker
 * @copyright 2016 (for some additions) by svasti
 * 2018 small modifications by olape
 * 2021 modifications (utf8 conform string operation and others) by Karl Richard Lembach (Caravaner)
 * danach habe ich dieses gefunden: https://cmsimpleforum.com/viewtopic.php?f=12&t=17105&p=79157&hilit=racently_changed#p79157 von olape
 * @license   GPLv3
 */
/*
	{{{recently_changed()}}}, {{{recently_changed(10)}}}, {{{PLUGIN:recently_changed(10,24);}}}, {{{PLUGIN:recently_changed('',24);}}}
	oder im Template:
	<?php echo recently_changed()?>, <?php echo recently_changed(10)?>, <?php echo recently_changed(10,24)?>, <?php echo recently_changed('',24)?>
*/

function recently_changed($count = 5, $length = 100)
{
	global $pd_router, $cf;

	$pageData = $pd_router->find_all();
	uasort($pageData, function ($a, $b) {
		return $b['last_edit'] - $a['last_edit'];
	});

	$pages = array();
	$i = 0;
	foreach (array_keys($pageData) as $page) {
		if ($i < $count) {
			if (!hide($page)) {
				$timestamp = $pageData[$page]['last_edit'];
				$date = date('d. M Y - H:m', $timestamp);
				$pages[$date][] = $page;
				$i++;
			}			
		} else {
			break;
		}
	}

	global $sn, $h, $u;

	$html = '<dl class="recently_changed">';
	foreach ($pages as $date => $group) {
		$html .= '<div class="recently_changed"><dt>' . $date . '</dt>';
		foreach ($group as $page) {
			$linktext = str_replace($cf['uri']['seperator'], '/', $u[$page]);
			$linktext_length = mb_strlen($linktext,'utf8');
			if($linktext_length > $length) {
				$linktext = mb_substr($linktext, -$length, null, 'utf8');
				$stringpos = mb_strpos($linktext, '/',0,'utf8');
				$linktext = '...'.mb_substr($linktext, (-$length + $stringpos), null, 'utf8');
			}
			$html .= '<dd><a href="' . "$sn?$u[$page]" . '">/' . $linktext . '</a></dd>';
		}
		$html .= '</div>';
	}
	$html .= '</dl><p class="clear" style="font-size: 1px;"></p>';
	return $html;
}

}
?>
Dazu kann man diesen Style in der stylesheet.css einbauen:

Code: Select all

:root {
    --hintergrund: #fff;
    --imageborder: rgba(0,0,0,.15);
    --imagebackground: rgba(0,0,0,.05);
}    

.recently_changed {
    padding: .3em .3em .03em .3em;
}
dl.recently_changed {
    border: 1px solid var(--imageborder);
    float:left;
    margin-bottom: .3em;
}        
.recently_changed div {
    background-color: var(--imagebackground);
    border: 1px solid var(--imageborder);
    margin-bottom: .3em;
}
.recently_changed dt {
    background-color: var(--hintergrund);
    border: 1px solid var(--imageborder);
    padding: .3em 0px .3em .3em;
    margin-bottom: .3em;
}
.recently_changed dd {
    padding: 0 0 .2em 2em;
}
So sieht es aus mit bis zu 100 Zeichen in der Pfadlänge: https://lembach-cmsimple.de/?last-changed
so sieht es mit bis zu 50 Zeichen aus (rechts in der Newsbox): https://lembach-cmsimple.de/?Plugins/Si ... dition-KRL
Ich bin > 69 und lerne fast jeden Tag was Neues. Dafür vergesse ich was Anderes.
Der Trick ist, sich nicht darüber aufzuregen und morgen zu lernen, was man vorgestern vergessen hat. ;)
https://lembach-cmsimple.de

Post Reply