Bug in Contenido_FrontendNavigation::isActiveChild

sier
Beiträge: 10
Registriert: Di 28. Apr 2009, 13:45
Kontaktdaten:

Bug in Contenido_FrontendNavigation::isActiveChild

Beitrag von sier » Di 28. Apr 2009, 13:53

Hallo

musste etwas an der Top-Navigation herumbasteln. Dabei habe ich nachfolgenden Bug entdeckt. Wie und wo werden eigentlich Bug gemeldet??

Code: Alles auswählen

	public function isActiveChild(Contenido_Category $oCategory, $iCurrentIdcat) {
		if ($oCategory->getSubCategories()->count() > 0) {
			$iCurrentIdcat = (int) $iCurrentIdcat;
			$oChildCategories = $oCategory->getSubCategories();
			foreach ($oChildCategories as $oChildCat) {
				if ($oChildCat->getIdCat() == $iCurrentIdcat) {
					return true;
				}
				$this->isActiveChild($oChildCat, $iCurrentIdcat)
			}
			return false;
		}
		return false;
	}
Richtig wäre aber :

Code: Alles auswählen

	public function isActiveChild(Contenido_Category $oCategory, $iCurrentIdcat) {
		if ($oCategory->getSubCategories()->count() > 0) {
			$iCurrentIdcat = (int) $iCurrentIdcat;
			$oChildCategories = $oCategory->getSubCategories();
			foreach ($oChildCategories as $oChildCat) {
				if ($oChildCat->getIdCat() == $iCurrentIdcat) {
					return true;
				}
				if ($this->isActiveChild($oChildCat, $iCurrentIdcat)) {
					return true;
				}
			}
			return false;
		}
		return false;
	}
Zuletzt geändert von sier am Di 28. Apr 2009, 16:40, insgesamt 1-mal geändert.

idea-tec
Beiträge: 1242
Registriert: Do 19. Sep 2002, 14:41
Wohnort: Dichtelbach
Kontaktdaten:

Re: Bug in Contenido_FrontendNavigation::isActiveChild

Beitrag von idea-tec » Di 28. Apr 2009, 13:55

Wo Bugs drauf steht ist auch Bugs drin:
http://forum.contenido.org/viewforum.php?f=63
MfG, Karsten
Nicht Können bedeutet nicht, dass man etwas nicht beherrscht, sondern lediglich, dass man sich nicht traut es zu tun ;-)
| Internet | Ihr Logo deutschlandweit auf T-Shirts |
Diplomatie: Jemanden so in die Hölle zu schicken, dass er sich auf die Reise freut!!! ;-)

_wiewo_
Beiträge: 358
Registriert: Mo 8. Sep 2008, 11:12

Re: Bug in Contenido_FrontendNavigation::isActiveChild

Beitrag von _wiewo_ » Di 28. Apr 2009, 14:25

Ähm bin ich gerade nur blöd oder blind?
Der originalcode is doch 100% richtig oder? oO
is doch alles genau wie es soll

wozu nen if nochmal rumpacken wenns doch eh nochmal neu durchläuft,
nene, kein bug =)

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

Re: Bug in Contenido_FrontendNavigation::isActiveChild

Beitrag von Oldperl » Di 28. Apr 2009, 14:38

Kein Bug :!:
Die Funktion wird rekursiv aufgerufen bis die Bedingung passt oder keine weiteren Elemente zu prüfen sind. Die Rückgaben sollten dementsprechend korrekt sein.

Gruß aus Franken

Ortwin
ConLite 2.1, alternatives und stabiles Update von Contenido 4.8.x unter PHP 7.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

sier
Beiträge: 10
Registriert: Di 28. Apr 2009, 13:45
Kontaktdaten:

Re: Bug in Contenido_FrontendNavigation::isActiveChild

Beitrag von sier » Di 28. Apr 2009, 16:33

welche rückgabe? bei rekursiven aufruf wird die rückgabe ja gar nie abgefragt/berücksichtigt.

Code: Alles auswählen

         foreach ($oChildCategories as $oChildCat) {
            if ($oChildCat->getIdCat() == $iCurrentIdcat) {
               return true;
            }
            $this->isActiveChild($oChildCat, $iCurrentIdcat) --> WENN hier TRUE zurückkommt muss der foreach abgebrochen werden
         }

_wiewo_
Beiträge: 358
Registriert: Mo 8. Sep 2008, 11:12

Re: Bug in Contenido_FrontendNavigation::isActiveChild

Beitrag von _wiewo_ » Di 28. Apr 2009, 16:41

Code: Alles auswählen

foreach ($oChildCategories as $oChildCat){
if ($oChildCat->getIdCat() == $iCurrentIdcat) {
  return true;
}
$this->isActiveChild($oChildCat, $iCurrentIdcat);
}
if, also "wenns" so ist, dann returnd er true und fertig is die kiste
nachem return is aus die maus
wenn nich true dann rufter die funktion nochmal auf
isses wieder nich true rufterse nochmal auf
usw,
daher ist das alles schon so richtig wie es da ist

man könnt auch schreiben

Code: Alles auswählen

foreach ($oChildCategories as $oChildCat) {
if ($oChildCat->getIdCat() == $iCurrentIdcat) {
  return true;
} else
{
  $this->isActiveChild($oChildCat, $iCurrentIdcat);
}
}
was aber aufs gleiche hinausläuft

sier
Beiträge: 10
Registriert: Di 28. Apr 2009, 13:45
Kontaktdaten:

Re: Bug in Contenido_FrontendNavigation::isActiveChild

Beitrag von sier » Di 28. Apr 2009, 17:02

nein der code funktioniert nicht.
glaubs mir, mein code macht völlig etwas anders.
in deinem code wird die suche nicht abgebrochen wenn das durchsuchen der unterkategorien erfolgreich war.
dein code funktioniert nur auf dem einem level

gruss
rocco

idea-tec
Beiträge: 1242
Registriert: Do 19. Sep 2002, 14:41
Wohnort: Dichtelbach
Kontaktdaten:

Re: Bug in Contenido_FrontendNavigation::isActiveChild

Beitrag von idea-tec » Di 28. Apr 2009, 17:12

wäre es möglich, dass hier verschiedene Gedankengänge über die Arbeitsweise der Funktion existieren? 8)
MfG, Karsten
Nicht Können bedeutet nicht, dass man etwas nicht beherrscht, sondern lediglich, dass man sich nicht traut es zu tun ;-)
| Internet | Ihr Logo deutschlandweit auf T-Shirts |
Diplomatie: Jemanden so in die Hölle zu schicken, dass er sich auf die Reise freut!!! ;-)

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

Re: Bug in Contenido_FrontendNavigation::isActiveChild

Beitrag von Oldperl » Di 28. Apr 2009, 17:16

nach ein bisserl Nachdenken im Kämmerchen glaube ich das rocco Recht hat. Es fehlt zwar keine if-Bedingung, bzw. diese ist hier nicht nötig, denn es reicht einfach das Ergebnis des rekursiven Aufrufes zu returnen, da hierbei auf alle Fälle entweder False oder True zurückkommt.

Code: Alles auswählen

foreach ($oChildCategories as $oChildCat){
if ($oChildCat->getIdCat() == $iCurrentIdcat) {
  return true;
}
return $this->isActiveChild($oChildCat, $iCurrentIdcat);
}
Bevor ich das aber nach Bugs verschiebe werde ich mir das in einer 4.8.12er mal genauer anschauen.

Gruß aus Franken

Ortwin
ConLite 2.1, alternatives und stabiles Update von Contenido 4.8.x unter PHP 7.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

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

Re: Bug in Contenido_FrontendNavigation::isActiveChild

Beitrag von Oldperl » Di 28. Apr 2009, 17:18

idea-tec hat geschrieben:wäre es möglich, dass hier verschiedene Gedankengänge über die Arbeitsweise der Funktion existieren? 8)
@Karsten
ich denke nicht, bei mir wars einfach beim Überfliegen mal wieder zu schnell gewesen :roll:

Gruß aus Franken

Ortwin
ConLite 2.1, alternatives und stabiles Update von Contenido 4.8.x unter PHP 7.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

sier
Beiträge: 10
Registriert: Di 28. Apr 2009, 13:45
Kontaktdaten:

Re: Bug in Contenido_FrontendNavigation::isActiveChild

Beitrag von sier » Di 28. Apr 2009, 17:27

idea-tec hat geschrieben:wäre es möglich, dass hier verschiedene Gedankengänge über die Arbeitsweise der Funktion existieren? 8)
schon möglich, hier die funktionsbeschreibung: "Check if current idcat is an active child category of a given Contenido_Category"

aber der aufruf

Code: Alles auswählen

$this->isActiveChild($oChildCat, $iCurrentIdcat)
innerhalb der foreach-scheife im orignal code ist ein bug, unabhängig wie der arbeitsweise gemeint ist.

gruss
rocco

idea-tec
Beiträge: 1242
Registriert: Do 19. Sep 2002, 14:41
Wohnort: Dichtelbach
Kontaktdaten:

Re: Bug in Contenido_FrontendNavigation::isActiveChild

Beitrag von idea-tec » Di 28. Apr 2009, 17:34

wenn es am ende so etwas wie ein bug war/ist, und er wird beseitigt, und wir reduzieren dadurch das feuer auf die db -> SUPER!!! :roll:

@Oldperl:
ich hatte mir das "nachsehen" auch notiert (aus reiner neugier), stecke aber zu tief in den letzten Zügen meines projektes und komme vor mitte/ende nächster woche sicher nicht dazu.
von daher, streiche ich mir das wieder, da ich das "genauer anschauen" nun in guten Augen weiß. ;-)
MfG, Karsten
Nicht Können bedeutet nicht, dass man etwas nicht beherrscht, sondern lediglich, dass man sich nicht traut es zu tun ;-)
| Internet | Ihr Logo deutschlandweit auf T-Shirts |
Diplomatie: Jemanden so in die Hölle zu schicken, dass er sich auf die Reise freut!!! ;-)

_wiewo_
Beiträge: 358
Registriert: Mo 8. Sep 2008, 11:12

Re: Bug in Contenido_FrontendNavigation::isActiveChild

Beitrag von _wiewo_ » Mi 29. Apr 2009, 08:05

von der PHP Seite... (http://php.net/manual/de/functions.user-defined.php)

Beispiel #4 Rekursive Funktionen

Code: Alles auswählen

<?php
function recursion($a)
{
    if ($a < 20) {
        echo "$a\n";
        recursion($a + 1);
    }
}
?>
oder

http://pear.php.net/manual/de/standars.errors.php

Code: Alles auswählen

<?php
/**
 * Rekursive Suche in einem Baum nach einem String
 * @throws ResultException
 */
public function search(TreeNode $node, $data)  
{
    if ($node->data === $data) {
         throw new ResultException( $node );
    } else {
         search( $node->leftChild, $data );
         search( $node->rightChild, $data );
    }
}
?> 
Also die Funktion einfach so wieder aufrufen ist vom PHP Sinn der Rekursion
Das sind zwar keine Beispiele mit return, aber...
Ein return mittendrin einzubauen wäre meines Erachtens kein sauberer CodingStyle.
Ich würde niemals direkt vor einen Funktionsaufruf ein Return setzen, das gehört sich nich. meines Erachtes, Für andere Meinungen bin ich offen ;)
Finde das ein Interessantes Thema

idea-tec
Beiträge: 1242
Registriert: Do 19. Sep 2002, 14:41
Wohnort: Dichtelbach
Kontaktdaten:

Re: Bug in Contenido_FrontendNavigation::isActiveChild

Beitrag von idea-tec » Mi 29. Apr 2009, 08:10

ich bin ja nun selfmade-php und denke, dass das mit dem return schon geht.
ich würde dann allerdings auf jeden fall direkt hinter das return ein exit setzen, weil ich ja mein "ergebnis" habe und auf keinen fall will, dass das ding weiter da durchrauscht.
vor allem könnte es ja auch sein, dass ich das ergebnis nach der 4. von 120 schleifen habe und dann rauscht das noch weitere 116 schleifen da durch, ohne sinn und zweck
MfG, Karsten
Nicht Können bedeutet nicht, dass man etwas nicht beherrscht, sondern lediglich, dass man sich nicht traut es zu tun ;-)
| Internet | Ihr Logo deutschlandweit auf T-Shirts |
Diplomatie: Jemanden so in die Hölle zu schicken, dass er sich auf die Reise freut!!! ;-)

_wiewo_
Beiträge: 358
Registriert: Mo 8. Sep 2008, 11:12

Re: Bug in Contenido_FrontendNavigation::isActiveChild

Beitrag von _wiewo_ » Mi 29. Apr 2009, 08:31

nach nem return bricht er eigentlich sofort ab
return

Wird die return() Anweisung innerhalb einer Funktion aufgerufen, wird die Ausführung der Funktion sofort beendet und das Argument als Wert des Funktionsaufrufs zurückgegeben.
http://www.php-resource.de/handbuch/function.return.htm

Gesperrt