Seite 1 von 2

count()-Fehler in ContentType Teaser

Verfasst: Mi 5. Feb 2020, 07:49
von achiboy
Hallo zusammen
Wenn ich beim Content-Type Teaser die Artikel manuell auswähle, kommt es schon mal vor, dass ich nur einen einzigen Artikel drin habe. In diesem Fall wird der folgende Fehler geloggt:
PHP Warning: count(): Parameter must be an array or an object that implements Countable in /.../contenido/classes/content_types/class.content.type.teaser.php on line 278
Bei Recherchen habe ich verschiedene Varianten gesehen, wie man das lösen könnte. Ganz einfach wäre, das entsprechende IF-Statement zu ändern. Beim Herumstöbern habe ich aber gesehen, dass es bei class.content.type.abstract.php in "_storeSettings" eine Unterscheidung von Settings als Array oder Nicht-Array gibt. Würde es Sinn machen, den Namen von "teaser_manual_art" auf "teaser_array_manual_art" zu ändern?

Re: count()-Fehler in ContentType Teaser

Verfasst: Mi 5. Feb 2020, 12:12
von Faar
Ich würde ein Update machen, das ist noch alter Code der nicht ganz kompatibel zu PHP 7.2 ist.
In der Klasse fehlt vermutlich die Methode count() aber einfacher wäre es, also Notlösung, eine IF -Abfrage ob der PAramter ein Array oder Objekt ist.
Falls ein Update nicht so einfach möglich wäre.

Re: count()-Fehler in ContentType Teaser

Verfasst: Mi 5. Feb 2020, 20:11
von achiboy
also eigentlich habe ich die neueste Version in Betrieb

Re: count()-Fehler in ContentType Teaser

Verfasst: Do 6. Feb 2020, 09:45
von Faar
Ok, das stimmt, hab nachgeschaut, countable ist noch nicht in dieser Klasse eingebaut.
Dazu müsste etwas in der Art in der Klasse sein:
https://www.php.net/manual/en/class.countable.php
https://www.php.net/manual/en/countable.count.php

Aber Problem ist vermutlich schon der einzelne Artikel, der vermutlich nicht als Array mit einem Inhalt gespeichert wird sondern in einer Variablen und die ist nicht zählbar.
Ich kann aus zeitlichen Gründen jetzt nicht alle Klassen absuchen, ob irgendwo ein Beispiel für Count eingebaut ist aber vielleicht kannst Du IF(is_array() || is_object()) einbauen?
In älteren PHP Versionen wurde dieser Fehler einfach nie angezeigt.
So gesehen ist PHP 7.x schon toll, kommt mal ans Licht was alles im Verborgenen blieb.
Ich muss bald weg und kann dir das nicht so schnell lösen.

Re: count()-Fehler in ContentType Teaser

Verfasst: Do 6. Feb 2020, 21:52
von xmurrix
Hallo achiboy,

vielen Dank für den Hinweis, ich habe ein Ticket dafür erstellt:
https://github.com/CONTENIDO/CONTENIDO/issues/123

Wie Faar vorgeschlagen hat, kann man das mit einer zusätzlichen is_array() Prüfung in Zeile 278 wie folgt lösen:

Code: Alles auswählen

        if ($this->_settings['teaser_manual'] == 'true' && is_array($this->_settings['teaser_manual_art']) && count($this->_settings['teaser_manual_art']) > 0) {
Grüße
xmurrix

Re: count()-Fehler in ContentType Teaser

Verfasst: Fr 7. Feb 2020, 15:26
von achiboy
funktioniert das auch, wenn nur ein Artikel ausgewählt wurde?
Dann ist ja eben kein Array ;-)

Re: count()-Fehler in ContentType Teaser

Verfasst: Mo 10. Feb 2020, 09:28
von xmurrix
achiboy hat geschrieben:
Fr 7. Feb 2020, 15:26
funktioniert das auch, wenn nur ein Artikel ausgewählt wurde?
Dann ist ja eben kein Array ;-)
Wenn der Typ der Variable bei einem Artikel keine Liste ist und bei mehreren Artikeln eine Liste, dann funktioniert das mit der zusätzlichen is_array() Prüfung nicht. Hier muss der betroffene Code-Block überarbeitet werden.

Re: count()-Fehler in ContentType Teaser

Verfasst: Di 18. Feb 2020, 09:37
von achiboy
Eigentlich müsste die folgende Änderung in class.content.type.teaser.php ausreichen:
Zeile 279 alt:

Code: Alles auswählen

        if ($this->_settings['teaser_manual'] == 'true' && count($this->_settings['teaser_manual_art']) > 0) {
Zeile 279 neu:

Code: Alles auswählen

        if ($this->_settings['teaser_manual'] == 'true' && !empty($this->_settings['teaser_manual_art'])) {
Falls _settings['teaser_manual_art'] nicht als Array daherkommt (z.B. bei einem einzelnen Eintrag), würde dies in den nachfolgenden Zeilen abgehandelt.

Re: count()-Fehler in ContentType Teaser

Verfasst: Di 18. Feb 2020, 09:56
von xmurrix
Stimmt, die Verwendung von !empty ist die Lösung für das Problem. Danke für den Tipp.

Re: count()-Fehler in ContentType Teaser

Verfasst: Di 18. Feb 2020, 10:18
von Faar
xmurrix hat geschrieben:
Di 18. Feb 2020, 09:56
Stimmt, die Verwendung von !empty ist die Lösung für das Problem. Danke für den Tipp.
Wobei ich bei "0" als Zeichenkette meine Benken hätte, denn "0" ist nicht gleich 0.
Ebenso bei dem Integer Wert 0, der ist auch nicht NULL oder FALSE.
https://www.php.net/manual/de/function.empty.php
Mir gefällt das nicht, weil es nicht eindeutig ist.
"" ist leer, " " ist es nicht und "0" schon gar nicht.

Aber hier in dem Fall kann es funktionieren.
Wobei ich öfter mal einer Contenido Variablen eine ID = 0 gegeben habe.
Oder sehe ich das alles falsch?

Re: count()-Fehler in ContentType Teaser

Verfasst: Di 18. Feb 2020, 13:33
von Oldperl
Servus,

vielleicht wäre es hilfreich zuerst einmal zu schauen, welche möglichen Inhalte die Variable haben kann. Erst dann kann man wirklich überlegen wie eine Prüfung und Umformatierung zur Verarbeitung aussehen könnte.

Gruß aus Franken

Ortwin

Re: count()-Fehler in ContentType Teaser

Verfasst: Di 18. Feb 2020, 17:45
von Faar
Oldperl hat geschrieben:
Di 18. Feb 2020, 13:33
vielleicht wäre es hilfreich zuerst einmal zu schauen, welche möglichen Inhalte die Variable haben kann. Erst dann kann man wirklich überlegen wie eine Prüfung und Umformatierung zur Verarbeitung aussehen könnte.
:!:
Ja, und das wird auch das Ursprungsproblem überhaupt sein, weil weder Array() noch Object() ankommt, sondern irgendwas.

Re: count()-Fehler in ContentType Teaser

Verfasst: Mi 19. Feb 2020, 09:23
von xmurrix
Hier die Zustände, die die Variable $this->_settings['teaser_manual_art'] haben kann.

1. Initial, also wenn noch nie "Manueller Teaser" gewählt: 2. "Manueller Teaser" gewählt, aber ohne Artikel:

Code: Alles auswählen

String ''
3. "Manueller Teaser" abgewählt:

Code: Alles auswählen

String ''
4. "Manueller Teaser" gewählt, inkl. einem Artikel:

Code: Alles auswählen

String '{artikelid}'
5. "Manueller Teaser" gewählt, inkl. mehrerer Artikel:

Code: Alles auswählen

Array.<String> [
    '{artikelid}',
    '{artikelid}'
]
Also sollte die Prüfung !empty dafür vollkommen ausreichen, da dies null, Leerstring und leere Liste abdeckt. Der weitere Wert (String oder Liste) wird innerhalb de if-Blocks behandelt.

Re: count()-Fehler in ContentType Teaser

Verfasst: Mi 19. Feb 2020, 12:31
von Faar
xmurrix hat geschrieben:
Mi 19. Feb 2020, 09:23
Also sollte die Prüfung !empty dafür vollkommen ausreichen, da dies null und Leerstring abdeckt. Der weitere Wert (String oder Liste) wird innerhalb de if-Blocks behandelt.
In den Fällen ja, wenn nicht NULL und "" irgendwie zur Auswertung heran gezogen werden.
Aber... wer hat sich denn diese Heterogenität ausgedacht, mal Leerstring und mal String mit einem Wert und dann mal Array zu benutzen? :shock:
Wäre da nicht entweder NULL oder Array() sinnvoller? :roll:
Also nur die zwei Möglichkeiten und nicht noch String dazu.

Re: count()-Fehler in ContentType Teaser

Verfasst: Mi 19. Feb 2020, 13:14
von Oldperl
Faar hat geschrieben:
Mi 19. Feb 2020, 12:31
Aber... wer hat sich denn diese Heterogenität ausgedacht, mal Leerstring und mal String mit einem Wert und dann mal Array zu benutzen? :shock:
"Heterogenität" - bei CONTENIDO? Wie lange bist Du jetzt schon mit CONTENIDO unterwegs, Frank?
Wenn sich, auch und gerade, im Core kaum einer wirklich an Coding-Conventions hält, Murat mal ausgenommen, wenn jeder sein eigenes Süppchen kocht, weil es ein Projektmanagement, und eine(n) Projekt-Manager*in, offensichtlich nur auf dem Papier gibt, wenn klare, selbst vorgegebene, Regeln fortwährend nicht angewendet oder gebrochen werden - Beispiel ist die Versionserhöhung bei Änderungen an Plugins - und wenn ein Review von Erweiterungen und Änderungen nur in einer Funktionsprüfung enden, so muss sich niemand wundern.

"Wenn du merkst, dass du ein totes Pferd reitest – steige ab!"
uralte Weisheit der Dakota-Indianer

Ich war schon oft soweit, habe es aber jedes Mal dann doch nicht gemacht, wohl deswegen, weil ich in CONTENIDO ein tolles CMS sehe. Darum auch mein Fork mit ConLite, denn schon die "uralte" 4.8er Version ist eines der stabilsten und sichersten Content-Management-Systeme, die ich kenne, und mit der aktuellen ConLite auch unter PHP 7.3 weiterhin nutzbar.

Keine Ahnung was Offenbach noch mit CONTENIDO vor hat?! Sehe ich, wie lange der Dokumentations-Bereich schon wieder offline ist, dann kommen mir wieder so meine Zweifel ob ein festhalten an CONTENIDO 4.10 wirklich richtig ist.
Aber wie auch immer, ich bleibe dem System wohl so lange erhalten, wie es noch Forum und von Zeit zu Zeit mal irgendein Update gibt. Jedoch werde ich bis auf weiteres mein Programmierkönnen in meine ConLite, die nun auch ein eigenes GIT bekommen hat, investieren, soweit es meine andere Arbeit zulässt.

Gruß aus Franken

Ortwin