// lastpostings 0.7.0 // Hubzilla-Umgebung laden require_once '/var/www/my_webapp/www/boot.php'; // Anzahl der anzuzeigenden Postings define('NUMOFPOSTS', 5); // Postings oder Karten oder Artikel define('ITEMTYPE', 0); // 0 = Posting, 6 = Karte, 7 = Artikel // Länge des angezeigten Auszugs define('EXCERPT', 512); // Kanal-ID und Kanalname – nur als Fallback, eigentlich nicht nötig define('MYUID', 51); define('CHANNAME', 'pepechan'); // Bild-Anzeige: 0 = keine Bilder, 1 = unverändert (Default), 2 = skaliert (max. 380×256) define('SHOWIMG', 1); // Bilder im gerenderten HTML je nach SHOWIMG darstellen function process_images($html) { if (SHOWIMG === 0) { // Bilder komplett entfernen return preg_replace('/]*>/i', '', $html); } if (SHOWIMG === 2) { // Bilder skalieren: max. 380px breit, max. 256px hoch, Seitenverhältnis bleibt erhalten return preg_replace_callback( '/]*>/i', function ($m) { $tag = $m[0]; // Vorhandene width/height-Angaben entfernen, damit CSS greift $tag = preg_replace('/\s(width|height)\s*=\s*("[^"]*"|\'[^\']*\'|\S+)/i', '', $tag); // Skalierungs-Style einfügen if (preg_match('/\bstyle\s*=\s*("([^"]*)"|\'([^\']*)\')/i', $tag, $s)) { $style = $s[2] . ' max-width:380px; max-height:256px; width:auto; height:auto;'; $tag = str_replace($s[0], 'style="' . $style . '"', $tag); } else { $tag = preg_replace('/channel['channel_name']) ? $a->channel['channel_name'] : CHANNAME; // SQL-Abfrage: Nur eigene, sichtbare, öffentliche Postings // allen anderen Kram rigoros aussortieren… vor allem die gelöschten Items $sql = sprintf( "SELECT id, mid, llink, title, body, created FROM item WHERE uid = %d AND item_origin = 1 AND item_deleted = 0 AND item_unpublished = 0 AND item_hidden = 0 AND item_pending_remove = 0 AND item_private = 0 AND verb = 'Create' AND obj_type = 'Note' AND item_type = %d AND mimetype = 'text/bbcode' ORDER BY id DESC LIMIT %d", intval($channel_id), ITEMTYPE, NUMOFPOSTS ); $result = q($sql); // Ergebnisse verarbeiten für MySQL UND PostgreSQL $items = []; if (is_array($result)) { $items = $result; } elseif ($result && property_exists($result, 'num_rows') && $result->num_rows > 0) { while ($item = $result->fetch()) { $items[] = $item; } } // Ausgabe if (!empty($items)) { echo '
'; foreach ($items as $item) { $title = htmlspecialchars($item['title'] ?? '', ENT_QUOTES, 'UTF-8'); // BBCode in HTML umwandeln und Bilder gemäß SHOWIMG darstellen $body = process_images(bbcode($item['body'] ?? '')); // Excerpt nach sichtbarem Text kürzen: // HTML-Tags (inkl. Attributwerte wie Bildpfade) zählen nicht ins Zeichenbudget. if (mb_strlen(strip_tags($body), 'UTF-8') > EXCERPT) { $summary = ''; $visible = 0; // Anzahl gezählter sichtbarer Zeichen $len = mb_strlen($body, 'UTF-8'); $i = 0; while ($i < $len) { $char = mb_substr($body, $i, 1, 'UTF-8'); if ($char === '<') { // Kompletten Tag übernehmen (zählt nicht ins Budget) $tagEnd = mb_strpos($body, '>', $i, 'UTF-8'); if ($tagEnd === false) { // kein schließendes '>' mehr → Tag nicht übernehmen, fertig break; } $summary .= mb_substr($body, $i, $tagEnd - $i + 1, 'UTF-8'); $i = $tagEnd + 1; } else { // Sichtbares Textzeichen: zählt ins Budget $summary .= $char; $visible++; $i++; if ($visible >= EXCERPT) { break; } } } $summary .= '…'; } else { $summary = $body; } // Datum ins deutsche Format (TT.MM.JJJJ) $created = date('d.m.Y', strtotime($item['created'])); // Weiterlesen-Link über llink (display erscheint mir "krisensicherer") $llink = $item['llink'] ?? ''; $read_more_link = $llink ? '..::Weiterlesen::..' : ''; echo '
'; if ($title) { echo '
' . $title . '
'; } echo '
' . $created . '
'; echo '
' . $summary . '
'; echo $read_more_link; echo '
'; } echo '
'; } else { echo '

Keine eigenen Beiträge gefunden.

'; }