count()-Fehler in ContentType Teaser

Fragen zur Installation von CONTENIDO 4.10? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
achiboy
Beiträge: 117
Registriert: Do 26. Aug 2004, 05:05
Kontaktdaten:

count()-Fehler in ContentType Teaser

Beitrag von achiboy » Mi 5. Feb 2020, 07:49

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?

Faar
Beiträge: 1561
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: count()-Fehler in ContentType Teaser

Beitrag von Faar » Mi 5. Feb 2020, 12:12

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.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

achiboy
Beiträge: 117
Registriert: Do 26. Aug 2004, 05:05
Kontaktdaten:

Re: count()-Fehler in ContentType Teaser

Beitrag von achiboy » Mi 5. Feb 2020, 20:11

also eigentlich habe ich die neueste Version in Betrieb

Faar
Beiträge: 1561
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: count()-Fehler in ContentType Teaser

Beitrag von Faar » Do 6. Feb 2020, 09:45

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.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

xmurrix
Beiträge: 2814
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: count()-Fehler in ContentType Teaser

Beitrag von xmurrix » Do 6. Feb 2020, 21:52

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
CONTENIDO downloads: CONTENIDO 4.10.1
CONTENIDO links: Documentation, API documentation
CONTENIDO @ Github: CONTENIDO 4.10

achiboy
Beiträge: 117
Registriert: Do 26. Aug 2004, 05:05
Kontaktdaten:

Re: count()-Fehler in ContentType Teaser

Beitrag von achiboy » Fr 7. Feb 2020, 15:26

funktioniert das auch, wenn nur ein Artikel ausgewählt wurde?
Dann ist ja eben kein Array ;-)

xmurrix
Beiträge: 2814
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: count()-Fehler in ContentType Teaser

Beitrag von xmurrix » Mo 10. Feb 2020, 09:28

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.
CONTENIDO downloads: CONTENIDO 4.10.1
CONTENIDO links: Documentation, API documentation
CONTENIDO @ Github: CONTENIDO 4.10

achiboy
Beiträge: 117
Registriert: Do 26. Aug 2004, 05:05
Kontaktdaten:

Re: count()-Fehler in ContentType Teaser

Beitrag von achiboy » Di 18. Feb 2020, 09:37

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.

xmurrix
Beiträge: 2814
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: count()-Fehler in ContentType Teaser

Beitrag von xmurrix » Di 18. Feb 2020, 09:56

Stimmt, die Verwendung von !empty ist die Lösung für das Problem. Danke für den Tipp.
CONTENIDO downloads: CONTENIDO 4.10.1
CONTENIDO links: Documentation, API documentation
CONTENIDO @ Github: CONTENIDO 4.10

Faar
Beiträge: 1561
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: count()-Fehler in ContentType Teaser

Beitrag von Faar » Di 18. Feb 2020, 10:18

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?
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Oldperl
Beiträge: 4102
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Kontaktdaten:

Re: count()-Fehler in ContentType Teaser

Beitrag von Oldperl » Di 18. Feb 2020, 13:33

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
CONTENIDO 4.9 Entwickler-Handbuch - Publikation auf medium.com zu meinem angedachten Entwickler-Buch zu CONTENIDO 4.9
ConLite 2.0, alternatives und stabiles Update von Contenido 4.8.x
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

Faar
Beiträge: 1561
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: count()-Fehler in ContentType Teaser

Beitrag von Faar » Di 18. Feb 2020, 17:45

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.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

xmurrix
Beiträge: 2814
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: count()-Fehler in ContentType Teaser

Beitrag von xmurrix » Mi 19. Feb 2020, 09:23

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.
CONTENIDO downloads: CONTENIDO 4.10.1
CONTENIDO links: Documentation, API documentation
CONTENIDO @ Github: CONTENIDO 4.10

Faar
Beiträge: 1561
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: count()-Fehler in ContentType Teaser

Beitrag von Faar » Mi 19. Feb 2020, 12:31

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.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Oldperl
Beiträge: 4102
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Kontaktdaten:

Re: count()-Fehler in ContentType Teaser

Beitrag von Oldperl » Mi 19. Feb 2020, 13:14

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
CONTENIDO 4.9 Entwickler-Handbuch - Publikation auf medium.com zu meinem angedachten Entwickler-Buch zu CONTENIDO 4.9
ConLite 2.0, alternatives und stabiles Update von Contenido 4.8.x
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

Antworten