Всем привет.
Столкнулся с такой задачей:
Есть модель Авто.
У нее есть параметры такие как : цвет, кузов, колеса и т.д.
Для каждого параметра своя модель и своя таблица в БД.
Так как параметры имеют схожие поля (id, name, datCreate) реализован родительский класс TechnicalData
class TechnicalData
{
protected $id;
protected $name;
protected $tableName;
protected $error;
protected $DB;
public function __construct()
{
$this->DB = new DB();
}
public function getAllRecords() {
$data = $this->DB->Select("SELECT * FROM " . $this->tableName . " LIMIT 20");
if(isset($this->DB->error)) {
$this->error = "M_TechnicalData->getAllRecords => " . $this->DB->error;
return false;
}
return $data;
}
}
Наследники выглядят так:
include_once('M_TechnicalData.php');
class Body extends TechnicalData
{
public function __construct()
{
parent::__construct();
$this->tableName = 'body';
$this->modelName = 'body';
}
public function getError() {
parent::getError();
return $this->modelName . " => ". $this->error;
}
}
Для того что бы вывести все возможные данные о Авто реализован класс SpecialOffers
То есть я хочу создать машину, нужно выбрать цвет из возможных, колеса из возможных (то есть все записи соответствующей таблицы)
class SpecialOffers
{
public $id;
protected $modelId;
protected $Manufacturer;
protected $manufacturerId;
protected $bodyId;
/* И Т.Д. */
public $error;
protected static $_instance;
// ПРИВЕДЕНЫ Не Все методы !!!
public function getColors() {
$this->Model('Color');
$this->Color = new Color();
$allColors = $this->Color->getAllRecords();
if($allColors == false ) {
$this->error = "M_SpecialOffers->getColors => " . $this->Color->getError();
return false;
} else {
return $allColors;
}
}
public function getRings() {
$this->Model('Ring');
$this->Ring = new Ring();
$allRings = $this->Ring->getAllRecords();
if($allRings == false ) {
$this->error = "M_SpecialOffers->getRings => " . $this->Ring->getError();
return false;
} else {
return $allRings;
}
}
private function __clone()
{
}
public static function Instance()
{
// проверяем актуальность экземпляра
if (null === self::$_instance) {
// создаем новый экземпляр
self::$_instance = new self();
}
// возвращаем созданный или существующий экземпляр
return self::$_instance;
}
public function getError() {
return $this->error;
}
protected function Model($fileName)
{
include_once("m/M_".$fileName.".php");
}
}
Как вы понимаете на страничке создания в контроллере вот такой код идет :
//КУСОК КОДА
$this->Model('M_SpecialOffers');
$SpecialOffers = SpecialOffers::Instance();
print_r($SpecialOffers->getManufacturers());
echo "<br/>";
print_r($SpecialOffers->getModels());
echo "<br/>";
print_r($SpecialOffers->getBodys());
echo "<br/>";
print_r($SpecialOffers->getColors());
echo "<br/>";
print_r($SpecialOffers->getMotors());
echo "<br/>";
print_r($SpecialOffers->getPpcs());
echo "<br/>";
print_r($SpecialOffers->getRings());
echo "<br/>";
print_r($SpecialOffers->getPrices());
// Пусть название вида вас не пугает и параметры будут передаваться только не реализовано пока
$this->title = 'saleBook';
$this->content = $this->View('V_CreateSpecialOffer',array('title'=>$this->title));
break;
Например можно реализовать вызов всех параметров авто через доп. метод класса SpecialOffers такой как getAllAttributes который будет делать действия которые сейчас делает контроллер но вопрос в другом
Как можно убрать избыточност кода класса SpecialOffers
Как видите все методы идентичны что мне не нравится и думаю что есть способ сделать это более компактно!
Класс TechnicalData -> с методами для работы с БД которые идентичны во всех моделях наследниках (параметрах авто)
Класс Body и ему подобные (параметры) наследуются от TechnicalData
Класс SpecialOffers предназначен для удобства выбора параметров авто и в случае надобности для сохранения значений новых параметров.