Beiträge getaggt mit news

Bug? Falsche Artikelauswahl auf der News-Seite

Ok, ich versuche mal mein Setup zu beschreiben.

Kategorien sehen ungefähr so aus:

  • Kategorie Eins
    • Subkategorie EinsEins
    • Subkategorie EinsZwei
  • Kategorie Zwe
    • Subkategorie ZweiEins
    • Subkategorie ZweiZwei
  • Kategorie Drei

Dann sind da natürlich News-Beiträge, die immer einer Hauptkategorie und (falls diese Unterkategorien hat) Unterkategorien zugewiesen sind. Pro Hauptkategorie gibt es jeweils eine Ausgabe-Seite, die in der Hauptspalte ein Plugin enthält, wo eingestellt ist, dass nur Beiträge einer Kategorie angezeigt werden. So weit passt alles.

Und auf einmal werden auf der Seite in Plugin, das eigentlich nur Beiträge der Kategorie „Kategorie Eins“ und Unterkategorien anzeigen soll, auch Beiträge der Kategorie Zwei angezeigt. Ich habe alles überprüft: Ist die Zuordnung im Artikel richtig gesetzt? Ist das Plugin auf der Seite richtig konfiguriert? Sieht alles gut aus. Hab schon angefangen an meinem Verstand zu zweifeln und an einen mysteriösen Bug in News geglaubt.

Lösung: Damit nur Artikel einer bestimmten Kategorie ausgegeben werden, muss im News-Plugin in der Kategorieauswahl „Show items with selected categories“ ausgewählt werden. Wenn man keine weiteren Einstellungen vornimmt, dann kann damit durch URL Parameter die Kategorieauswahl überschrieben werden. Wenn man RealURL verwendet, merkt man das nicht so schnell. Im RealURL Cache für diese Seite war nämlich ungefähr folgende URL eingetragen: seite/?tx_news_pi1[overwriteDemand][categories]=0 und die auch noch an erster Stelle. d.h. Wenn man die Seite aufruft, dann wird die sprechende URL so umgewandelt, dass die Kategorieauswahl aufgehoben wird.

Damit das nicht wieder passiert, kann man im News-Plugin das Überschreiben von Kategorien per URL deaktivieren: im Tab „Additional“ unter „Disable override demand“.

News-Kategorie auf Detailansicht in Kategoriebaum hervorheben

Folgendes Setup: Seite mit News-Plugins: Links ein Kategoriebaum, rechts die dadurch gefilterte Listenansicht. Dann gibt es da noch eine Detailseite, auf der dann das Plugin für die Detailansicht ist. Nun will mein Kunde auf der Detailansicht links ebenfalls den Kategoriebaum haben und dabei soll die aktuelle Kategorie der News hervorgehoben sein. Und das funktioniert so:

Die Extension news ist ziemlich genial – es gibt dort Signals, die aus dem Controller aufgerufen werden und so das Manipulieren von Daten möglich machen. Dann muss man nur eine eigene Klasse registrieren (ext_localconf.php)

$signalSlotDispatcher = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\SignalSlot\\Dispatcher');
$signalSlotDispatcher->connect(
    'GeorgRinger\\News\\Controller\\CategoryController',
    'listAction',
    'My\\Extension\\Signals\\CategoryController', // fully your choice
    'listActionSlot', // fully your choice
    TRUE
);

Und dann entsprechend die Funktion implementieren. In meinem Fall war es etwas komplizierter, da jede News mehreren Kategorien zugewiesen wurde und die Kategorien verschachtelt waren. Da ich nur eine Kategorie hervorheben kann, habe ich mich dann dafür entschieden, die Kategorie ohne Unterkategorien zu wählen.

/**
 * get current news item category and set in overwrite demand
 *
 * @param array $categories
 * @param array $overwriteDemand
 * @param array $demand
 * @param array $extendedVariables
 */
public function listActionSlot($categories, $overwriteDemand, $demand, $extendedVariables)
{
	$newsArguments = GeneralUtility::_GET('tx_news_pi1');
	$newsUid = (int)$newsArguments['news'];
 
	if($newsUid > 0) {
		/** @var $db TYPO3\CMS\Core\Database\DatabaseConnection */
		$db = $GLOBALS['TYPO3_DB'];
 
		$result = $db->exec_SELECT_mm_query(
			'sys_category.*',
			'sys_category',
			'sys_category_record_mm',
			'tx_news_domain_model_news',
			'AND tablenames = \'tx_news_domain_model_news\' AND fieldname=\'categories\' AND uid_foreign = '.$newsUid
		);
		$parentUids = array();
		$uids = array();
		while($row = $db->sql_fetch_assoc($result)) {
			$parentUids[] = $row['parent'];
			$uids[] = $row['uid'];
		}
		/* find category that is not a parent */
		$categoryUid = array_shift(array_diff($uids, $parentUids));
		return [
			'categories' => $categories,
			'overwriteDemand' => ['categories' => $categoryUid],
			'demand' => $demand,
			'extendedVariables' => $extendedVariables
		];
	}
	return [
		'categories' => $categories,
		'overwriteDemand' => $overwriteDemand,
		'demand' => $demand,
		'extendedVariables' => $extendedVariables
	];
}

Und so klappts dann bei mir 🙂

News-Liste durch Kategorie-Liste filtern

Wer zu ungeduldig ist, gleich nach unten scollen und den letzten Absatz lesen.

Folgendes Setup: Auf einer Seite befinden sich in einer Spalte das News-Plugin mit der Liste, in der Spalte nebendran das News-Plugin mit der Kategorieliste. Wenn nun eine Kategorie angeklickt wird in der Kategorie-Liste, dann möchten man, dass diese Kategorie in der Liste hervorgehoben wird und dass nur die News dieser Kategorie angezeigt werden. Das erste hat gut geklappt.

Nun hat sich die News-Liste trotz aller meiner Bemühungen von der in der URL gesetzten Ketegorie unbeindruckt gezeigt. Dabei war der Haken bei Disable override demand NICHT gesetzt. Ich hatte auch gegoogelt und nur einen Forums-Beitrag gefunden mit dem gleichen Problem, leider ohne Antwort. Ich hane angefangen mich durch den Code der News-Extension zu debuggen, um rauszufinden, wo der Parameter flöten gehen könnte.

In der Klasse NewsRepository Zeile 52 dann die Antwort:

// If "ignore category selection" is used, nothing needs to be done
if (empty($conjunction)) {
    return $constraint;
}

An dieser Stelle bricht das ab und der Filter wird nicht angewendet.

Lösung: im Backend-Formular des Plugins muss im Category mode am besten „Show items with selected categories (OR)“ eingestellt werden. Das ist alles!
2016-06-13 14-58-50

Bestimmt denken sich nun manche: Das steht doch genau so da…, wer lesen kann… , blablabla. Meine Antwort darauf: In erster Linie will ich ja keine Filterung, daher ist die erste Auswahl (zeige alle Kategorien) ja eigentlich richtig. Ich finde es eher verwirrend, dass obwohl ich keine Kategorien initial ausgewählt habe, alle angezeigt werden. Vielleicht ist mit diesem Beitrag doch mal jemandem geholfen.