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?
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 ragtekvbulletoscommerce;
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;
}
}