Page 3 of 3

Re: New AddOn: recently_changed

Posted: Sun Mar 18, 2018 10:43 pm
by cmb
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)) {

Re: New AddOn: recently_changed

Posted: Mon Mar 19, 2018 7:05 am
by olape
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:

recently_changed in Plugin SimplePlugins_XH-Edition-KRL

Posted: Mon Jun 07, 2021 11:21 am
by Caravaner
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