phplibrary/core/mapper/mapper.php
2016-06-29 18:51:32 +03:00

267 lines
No EOL
7.9 KiB
PHP

<?php
require_once 'core/primitive.php';
/**
* Èñïîëüçîâàòü èíòåðôåéñû ÷òîáû îïðåäåëèòü êàêèå äåéñòâèÿ ìîæíî ñîâåðøàòü ñ îáüåêòîì è òàêèì îáðàçîì
* Ñòðîèòü íàáîð äåéñòâèé Action è îòîáðàæåíèé View äëÿ îáüåêòà
* Ò.ê îòîáðàæåíèå äàííûõ ìîæåò áûòü íå òîëüêî íà òàáëèöó áàç äàííûõ
* È âîçìîæíî ðåàëèçîâàííû âñå èíòåðôåéñû
*/
interface IDataList
{
function findAll (Collection $request, $id = null);
function findById ($id);
function getCount (Collection $request, $id);
}
interface IDataSave
{
function saveTo ($o);
function updateTo ($o);
}
/**
* Îòîáðàæåíèå òàáëèöû áàçû äàííûõ â îáüåêòû
* Mapper -> DataMapper implements IDataList, IDataSave, IDataSort, IDataDelete ...
*
* @package core
*/
class DataMapper implements IDataList
{
/* Õðàíèòü ìåòàäàííûå â ñòàòè÷åñêîì ñâîéñòâå êëàññà äëÿ îòîòáðàæåíèÿ ?!, + Ñêðèïò äëÿ ãåíåðàöèè ìåòàäàííûõ!!
*/
public $factory;
public $className; /* Êëàññ íà êîòîðûé áóäåò îòîáðàæàòüñÿ ñòðî÷êà òàáëèöû */
public $filter = ""; /* */
public $schema = array (); /* Ñîîòâåòñòâèå ìåæäó ñâîéñòâîì îáüåêòà è ñòîëáöîì, äîáàâèòü òèï äëÿ çàïèñåé !! */
public $database; /* Òàáëèöà */
public $index; /* Èíäåêñíûé ñòîëáåö */
public $db; /* Ñîåäèíåíèå ñ áàçîé äàííûõ */
public $reference = array (null, null);
public function __construct ()
{
}
public function setRange ($stmt, $page, $size)
{
$stmt->setLimit ($size);
$stmt->setOffset (($page-1) * $size);
}
public function listSQL (array $list)
{
return implode ($list, ",");
}
/**
* Ïîèñê ñòðîêè â òàáëèöå ïî èäåíòèôèêàòîðó
* @param $id Çíà÷åíèå èäåíòèôèêàòîðà
* @return Îáüåêò êëàññà $className
*/
public function findById ($id)
{
// Ñòðîêè çàïðîñà ïðåîáðàçîâàòü â ìåòîäû (getSQLSelect ...)
// Query::from($this->database)->where ($this->index, "=", $id)->select();
$stmt = $this->db->prepareStatement ("SELECT * FROM ".$this->database." WHERE ".$this->index." = ?");
$stmt->setInt (1, $id);
$rs = $stmt->executeQuery ();
$rs->next ();
return $this->mapOne ($rs);
}
/**
* Ïðåîáðàçóåò parseResult â îáüåêò
*/
public /* private */ function mapOne ($rs)
{
$result = new $this->className ();
foreach ($this->schema as $key => $value) {
list($value) = $value;
$result->$value->setRes($rs, $key);
}
return $result;
}
public /* private */ function mapAll ($rs)
{
$result = array ();
// Ïðåîáðàçîâàíèå SQL â îáüåêò
while ($rs->next ()) {
$result[] = $this->mapOne ($rs);
}
return $result;
}
private function clean ($value) {
return strtolower(trim(iconv('utf-8', 'cp1251', $value)));
}
/**
* Ïðåîáðàçóåò ïàðàìåòðû ôîðìû â SQL çàïðîñ WHERE
* @param array $params
* @param array $schema
* @return string
*/
public function requestToSQL (Collection $request, array $schema)
{
$result = array ();
foreach ($schema as $key => $value) {
$param = $request->get ($key);
if ($param) {
array_push ($result, "lower (".$value.") LIKE '".$this->clean ($param)."%'");
}
}
if (empty ($result)) return null;
return implode ($result, " AND ");
}
/**
* Óäàëåíèå ñòðîê èç òàáëèöû ñ çàäàííûìè èíäåêñàìè
* @param $list array Ìàññèâ èäåíòåôèêàòîðîâ
*/
public function deleteList (array $list)
{
// Query::from($this->database)->where($this->index, "in", $list)->delete();
$sql = "DELETE FROM " . $this->database . " WHERE " . $this->index . " IN (" . $this->listSQL ($list) . ")";
return $this->db->executeQuery ($sql);
}
public static function findKey (array $schema, $sort)
{
foreach ($schema as $key => $item) {
list($item) = $item;
if ($item == $sort) {
return $key;
}
}
return $sort;
}
public function getOrder (Collection $request)
{
$order = "";
$sort = $request->get('key');
$desc = ($request->get('desc') == 0)? 'DESC' : 'ASC';
if ($sort) {
$sort = self::findKey ($this->schema, $sort);
$order = " ORDER BY $sort $desc";
}
return $order;
}
/**
* Èçâëåêàåò ñïèñîê çàïèñåé èç áàçû äàííûõ
*/
public function findAll (Collection $request, $id = null)
{
$name0 = $this->database;
$foreign = $this->reference[1];
// Ïåðåïèñàòü èñïîëüçóÿ Query !!!
if ($foreign && $id) {
$filter = ($this->filter)?$filter = " AND ".$this->filter: "";
$sql = "SELECT t1.* FROM $name0 as t1 WHERE t1.$foreign = $id " . $filter.self::getOrder($request);
} else {
$filter = ($this->filter)?$filter = " WHERE " . $this->filter: "";
$sql = "SELECT * FROM $name0 " . $filter . self::getOrder($request);
}
$stmt = $this->db->prepareStatement ($sql);
$page = $request->get('page');
$limit = $request->get('size');
if ($page && $limit) {
$this->setRange($stmt, $page, $limit);
}
return $this->mapAll($stmt->executeQuery());
}
public function getCount (Collection $request, $id)
{
$name0 = $this->database;
$foreign = $this->reference[1];
// Ïåðåïèñàòü èñïîëüçóÿ Query !!!
if ($foreign && $id) {
$filter = ($this->filter)?$filter = " AND " . $this->filter: "";
$sql = "SELECT count(t1.*) as length FROM $name0 as t1 WHERE t1.$foreign = $id " . $filter;
} else {
$filter = ($this->filter)?$filter = " WHERE " . $this->filter: "";
$sql = "SELECT count(*) as length FROM $name0 " . $filter;
}
$rs = $this->db->executeQuery($sql);
$rs->next();
return $rs->getInt('length');
}
/**
* Äîáàâëåíèå çàïèñè â áàçó äàííûõ
* @param $o Îáüåêò äëÿ çàïèñè â áàçó äàííûõ
*/
public function saveTo (Model $o)
{
$keys = array ();
$values = array ();
foreach ($this->schema as $key => $value) {
list($value) = $value;
if ($key != $this->index) {
$keys[] = $key;
$values[] = "'".$o->$value."'";
}
}
$stmt = $this->db->prepareStatement ("INSERT INTO ".$this->database." (".implode ($keys, ",").") VALUES (".implode ($values, ",").")");
$stmt->executeQuery ();
}
/**
* Îáíîâëÿåò çàïèñü â áàçå äàííûõ
* @param $o Îáüåêò äëÿ îáíîâëåíèÿ
*/
public function updateTo (Model $o)
{
$keys_values = array ();
foreach ($this->schema as $key => $value) {
list($value) = $value;
if ($key != $this->index && !($o->$value instanceof FKey)) {
$keys_values[] = $key." = '".$o->$value."'";
}
}
// Äëÿ âñåõ äîëæåí áûòü èäåíòåôèêàòîð id
$stmt = $this->db->prepareStatement ("UPDATE ".$this->database." SET ".implode($keys_values, ",")." WHERE ".$this->index." = ".$o->id);
$stmt->executeQuery ();
}
function saveDB (Model $o)
{
if ($o->id) {
$this->updateTo($o);
} else {
$this->saveTo($o);
}
}
function getModel($name)
{
require_once 'core/Mapper/Factory.php';
if (!$this->factory) {
$this->factory = new ModelFactory($this->db);
}
return $this->factory->getModel($name);
}
}
/**
*
*/
class Model
{
public function __construct ()
{
foreach (get_class_vars (get_class ($this)) as $key => $value) {
$this->$key = new Primitive ();
}
}
// __get, __set ìåòîäû. Â ìåòàäàííûõ õðàíèòñÿ òèï ñâîéñòâ, ïðîâåðÿòü ïðè ïðèñâàèâàíèè!!
}
?>