Ich habe eine Klasse erstellt, die mir Artikel aus einem Shop anzeigt.
Mein Problem ist nun, dass diese ziemlich unflexibel ist.
Im Moment hat diese nur 2 "Verwendungsmöglichkeiten" =>neueste & spezial Artikel anzeigen
Meine 1. Überlegung war, dass ich es für den Benutzer so einfach wie möglich mache und dieser einfach eine der 2 show Methoden aufzurufen braucht.
Mit der Zeit werden hier aber noch xxx neue Ausgaben dazukommen.
Jetzt ist es doch Schwachsinn das ich für jede neue MÖglichkeit 2 neue Methoden (showXXX und fetchQueryXXX) erstelle und den Switch Teil in der fetchItems Methode anpassen.
Was wäre hier nun die eleganteste Möglichkeit?
Mein Problem ist nun, dass diese ziemlich unflexibel ist.
Im Moment hat diese nur 2 "Verwendungsmöglichkeiten" =>neueste & spezial Artikel anzeigen
Meine 1. Überlegung war, dass ich es für den Benutzer so einfach wie möglich mache und dieser einfach eine der 2 show Methoden aufzurufen braucht.
Mit der Zeit werden hier aber noch xxx neue Ausgaben dazukommen.
Jetzt ist es doch Schwachsinn das ich für jede neue MÖglichkeit 2 neue Methoden (showXXX und fetchQueryXXX) erstelle und den Switch Teil in der fetchItems Methode anpassen.
Was wäre hier nun die eleganteste Möglichkeit?
PHP-Code:
<?php
// change 27.3 : vb registry entfernt
// da die klasse soweit ich das merke keine vb Registry benögtigt, wurde sie ausgebaut
//
namespace ragtek\vbullet\oscommerce;
class widget
{
// oscommerce db connection
private $osdb;
// saves if we want to show newest or special articles
private $called;
private $queryresult;
public function __construct(vB_Database $osdb = null)
{
$this->osdb = $osdb;
}
public function showNewest($counter = 5, $show = true)
{
$this->fetchItems('new', $counter);
if ($show == true)
{
return $this->generateOutput();
}
else
{
return $this->queryresult;
}
}
/**
* return the special x items or the parsed template with them
* @param <int> how many items should be fetched
* @param <bool> parse the template?
* @return <mixed >
*/
public function showSpecial($counter = 5, $show = true)
{
$this->fetchItems('special', $counter);
if ($show == true)
{
return $this->generateOutput();
}
else
{
return $this->queryresult;
}
}
/**
*
* @param <int> $counter
* @return <string> query
*/
private function fetchNewestQuery($counter)
{
$query = "xx";
return $query;
}
/**
*
* @param <int> $counter
* @return <string> query
*/
private function fetchSpecialQuery($counter)
{
$query = "xx";
return $query;
}
/**
* fetch items from the database and save them into $this->queryresult
* @param <type> what should be fetched ? special, new
* @param <type> how many items should be fetched?
* @return <array> $this->queryresult
*/
protected function fetchItems($what, $counter){
$this->called = $what;
switch ($what) {
case 'special':
$query = $this->fetchSpecialQuery($counter);
break;
case 'new':
$query = $this->fetchNewestQuery($counter);
break;
default:
throw new Exception('Keine gültige Aktion ausgewählt'); // über phrase lösen
#throw new Exception($vbphrase['no_valid_action']);
}
$articles = $this->odb->query($query);
while ($article = $this->odb->fetch_array($articles) )
{
$this->queryresult["$article[products_id]"] = $article[];
}
$this->odb->free_result();
return $this->queryresult;
}
private function generateOutput()
{
if (count($this->queryresult) == 0)
{
// todo hier auch noch etwas einfallen lassen für die ausgabe. eventuell phrase
return '0';
}
$output = '';
foreach ($this->queryresult as $article) {
$article['price'] = number_format($article['products_price'], 2);
if ($this->called == 'special')
{
$article['new_price'] = number_format($article['specials_new_products_price'], 2);
}
$templater = vB_Template::create('oscommerce_product');
$templater->register('article', $article);
$templater->register('g', $templateglobals);
$output .= $templater->render();
}
return $output;
}
}
Kommentar