Der Sinn von Klassen und wie ich ihn wahrscheinlich verfehle

diggity

Erfahrenes Mitglied
Hallo Leute!

Ich hab mir gestern mal die PHP Doku bezüglich Klassen durchgelesen, und das Ganze auch gleich selbst anhand eines kleinen Webshops versucht.
Meine Klasse sieht folgendermaßen aus:
PHP:
<?php
class Warenkorb {
        // var $items;        
        function show_cart() {
                if($_SESSION["cart"]) {                        
                        include("./inc/functions.php");
                        include("./inc/db.php");
                        db_connect($dbhost, $dbuser, $dbpass, $dbase);
                        foreach($_SESSION["cart"] as $art_nr => $anz) {
                                if($anz > 0) {                                        
                                        $query = "SELECT * FROM produkte WHERE art_nr = '".$art_nr."'";
                                        $res = mysql_query($query);
                                        $prod = mysql_fetch_object($res);
                                        $art_summe = $anz * $prod->preis; //
                                        $ges_summe += $art_summe;
                                        echo '<form name="update'. $prod->art_nr .'" method="post"
action="warenkorb.php">';                
                                        echo
                                        '
                                                <table width="100%" border="0">
                                                  <tr>
                                                        <td width="46%">'. $prod->name .'</td>
                                                        <td width="11%">'. $prod->art_nr .'</td>
                                                        <td width="9%">'. $prod->preis .'&euro;</td>
                                                        <td width="6%">
                                                                <input type="hidden" name="art_nr" value="'. $prod->art_nr .'" />
                                                                x <input type="text" name="anzahl" value="'. $anz .'" size="2" />
                                                        </td>
                                                        <td width="10%"><input type="submit" name="update" value="&auml;ndern" /></td>
                                                        <td width="9%">'. $art_summe .'&euro;</td>
                                                        <td width="9%"><a href="./index.php?action=warenkorb&amp;del&id='.
$prod->art_nr .'">löschen</a></td>
                                                  </tr>
                                                </table>
                                        ';                                        
                                        echo '</form>';
                                        echo "\n";
                                } 
                        } 
                        echo 
                                '<table width="100%" border="0">
                                  <tr>
                                        <td width="46%">&nbsp;</td>
                                        <td width="11%">&nbsp;</td>
                                        <td width="9%">&nbsp;</td>
                                        <td width="16%">Gesamtsumme:</td>
                                        <td width="18%">'. $ges_summe .'&euro;</td>
                                  </tr>
                                  </table>
                                ';
                } else {
                        echo 'Ihr Warenkorb ist noch leer!';
                }                
        }
        
        function add_item($id, $num) {
                session_start();
                //$id = $this->items[$id];
                $_SESSION["cart"][$id] += $num;
                //$this->items[$id] += $num;
        }
        
        function update_item($id, $num) {
                session_start();
                if($_SESSION["cart"][$id]) {
                        if($num > 0) {
                                $_SESSION["cart"][$id] = $num;
                                return true;
                        } else {
                                unset($_SESSION["cart"][$id]);
                                return false;
                        }
                } else {
                        return false;
                }
        }

        function del_item($id) {
                session_start();
                if($_SESSION["cart"][$id]) {
                        unset($_SESSION["cart"][$id]);
                        return true;
                } else {
                        return false;
                }
        }

        
}
?>

Gehe ich recht in der Annahme, dass das nicht ganz dem Sinn von der Trennung von Design und Code entspricht? Ich meine die Ausgabe der Artikel in der show_cart() - Funktion ...
Ich weiß aber nicht wie ich das auf anderem Wege anstellen soll!?
 
Gehe ich recht in der Annahme, dass das nicht ganz dem Sinn von der Trennung von Design und Code entspricht?
Nun ja, ein besondere Nutzung der HTML-eigenen Design-Elemente/-Attribute kann ich nicht feststellen. Ist es wirklich nur das, was du wissen möchtest?
 
Ja stimmt, es wird ja nur die Tabelle und das Formular mit den Produkten ausgegeben. Aber mir erscheint das nicht "schön", das in dieser Funktion unterzubringen. Gäbe es da andere Wege & Möglichkeiten?
 
Die Auflistung von Artikeln in einer Tabelle zu verpacken, ist eine gängige Art. Hier Listen oder andere Elemente einzusetzen, würde wahrscheinlich nur verwirren, wenn eine gleichmäßige Darstellung nicht gewähleistet werden kann.

Du solltest jedoch versuchen, die Verarbeitung der Daten noch von der Auszeichnung zu trennen. Damit bliebe die Klasse noch flexibler in ihrer Anwendung.
 
Jap, es geht mir aber nicht darum, wie ich die Produkte ausgebe (also das Markup), sondern wo ich sie ausgebe!
Bei Templates zB wird doch innerhalb der Funktionen auch kein Markup ausgegeben, oder? Hmmm ... ich glaub ich hab da irgendeinen Denkfehler...



Gumbo hat gesagt.:
Du solltest jedoch versuchen, die Verarbeitung der Daten noch von der Auszeichnung zu trennen. Damit bliebe die Klasse noch flexibler in ihrer Anwendung.

Aha, interessant interessant +g+
Was meinst du mit Auszeichnung?
 
Also ich würde das ganze mit einem Array zurück geben.
Dadurch bin ich im design flexibel und kann die klasse somit eigentlich auch öfter verwenden.

Ich würde noch Konfigurationsvariablen für die Datenbankverbindung usw erstellen und wenn möglich keine externe Funktionen laden, damit ich die Klasse alleine verwenden kann.
 
So, ich habs jetzt so probiert, dass ich mir ein Array zurückgeben lassen, Markup will ich ja innerhalb der Funktion keines ausgeben ;P

PHP:
	function show_cart() {
		session_start();
		if($_SESSION["cart"]) {			
			include("./inc/functions.php");
			include("./inc/conf.inc.php");
			db_connect($dbhost, $dbuser, $dbpass, $dbase);
			foreach($_SESSION["cart"] as $art_nr => $anz) {
				if($anz > 0) {					
					$query = "SELECT * FROM ".$produkt_tab." WHERE art_nr = '".$art_nr."'";
					$res = mysql_query($query);
					$artikel = mysql_fetch_object($res);

					$einzelpreis_summe	=	$anz * $artikel->preis;
					$gesamt_summe		+=	$einzelpreis_summe;

					
					$warenkorb = array
						(
						$art_nr => 
							array
							(
							"art_nr" 		=> $artikel->art_nr,
							"art_name" 		=> $artikel->name,
							"art_menge"		=> $anz,
							"einzelpreis" 		=> $artikel->preis,
							"einzelpreis_summe"	=> $einzelpreis_summe
							),
						"gesamt_summe"	=> $gesamt_summe
						);
					
					return $warenkorb;
				}
			} 
		} else {
			echo $msg_warenkorb_leer;
		}		
	}

Das Problem hierbei ist, dass dann logischerweise nur ein Artikel im Array steht ... ich weiß nicht wie ich es anstellen soll, dass er alle Artikel ins Array schreibt.
So wie's jett ist, wird ja bei jedem Durchlauf der foreach Schleife das Array neu befüllt, und im Endeffekt steht dann nur der Artikel des letzten Durchlaufs im Array.
 
Als Anregung:
PHP:
function get_cart() { // es wird nichts mehr gezeigt, daher neuer Name
    //...
    $warenkorb=array('items' => array(), 'gesamtsumme' => 0);
    if($_SESSION["cart"]) { 
        //...
        foreach(/* ... */) {
            //...
            $warenkorb['items'][]=array (
                    "art_nr" => $artikel->art_nr,
                    "art_name" => $artikel->name,
                    "art_menge" => $anz,
                    "einzelpreis" => $artikel->preis,
                    "einzelpreis_summe" => $einzelpreis_summe);
            $warenkorb['gesamtsumme'] += $einzelpreis_summe;
        }
    }
    return $warenkorb;
}
Gruß hpvw
 
Zurück