Библиотека для cis, online, cms1
This commit is contained in:
commit
3c2e614d87
269 changed files with 39854 additions and 0 deletions
30
core/mapper/factory.php
Normal file
30
core/mapper/factory.php
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
<?php
|
||||
|
||||
class ModelFactory
|
||||
{
|
||||
static $shortcut = "model";
|
||||
|
||||
public function __construct (Connection $db)
|
||||
{
|
||||
$this->db = $db;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ñîçäàåò ìîäåëü
|
||||
* @param string $name
|
||||
* @return model
|
||||
*/
|
||||
public function getModel ($name)
|
||||
{
|
||||
require_once 'core/mapper/mapper.php'; // ????
|
||||
|
||||
require_once (Shortcut::getUrl(self::$shortcut, $name));
|
||||
$modelName = $name . "Mapper";
|
||||
$model = new $modelName();
|
||||
$model->db = $this->db;
|
||||
$model->factory = $this;
|
||||
return $model;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
267
core/mapper/mapper.php
Normal file
267
core/mapper/mapper.php
Normal file
|
|
@ -0,0 +1,267 @@
|
|||
<?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 ìåòîäû. Â ìåòàäàííûõ õðàíèòñÿ òèï ñâîéñòâ, ïðîâåðÿòü ïðè ïðèñâàèâàíèè!!
|
||||
}
|
||||
|
||||
?>
|
||||
78
core/mapper/pathmapper.php
Normal file
78
core/mapper/pathmapper.php
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Îòîáðàæåíèå ñïèñêà ïàïîê ñ íàñòðîéêàìè íà îáüåêò
|
||||
*/
|
||||
class PathMapper
|
||||
{
|
||||
private $count;
|
||||
private $base = null;
|
||||
public $reference = null;
|
||||
|
||||
function plane (&$target, Collection $array)
|
||||
{
|
||||
$vars = get_class_vars(get_class($target));
|
||||
foreach ($vars as $name => $value) {
|
||||
$target->$name = $array->get($name);
|
||||
}
|
||||
}
|
||||
|
||||
function basePath ()
|
||||
{
|
||||
if ( ! $this->base) $this->base = $this->getBasePath();
|
||||
return $this->base;
|
||||
}
|
||||
|
||||
function findAll (Collection $request, $id = null)
|
||||
{
|
||||
require_once "core/settings.php";
|
||||
require_once "core/path.php";
|
||||
|
||||
$this->reference = $id;
|
||||
|
||||
$base = $this->basePath ();
|
||||
$path = new Path($base);
|
||||
$list = $path->getContent();
|
||||
|
||||
$result = array ();
|
||||
$this->count = 0;
|
||||
foreach ($list as $name) {
|
||||
if (is_dir (Path::join($this->basePath (), $name))
|
||||
&& $module = $this->findById ($name)) {
|
||||
$this->count++;
|
||||
$result [] = $module;
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
function findById ($name)
|
||||
{
|
||||
$file = Path::join($this->basePath(), $this->getSettingsFile ($name));
|
||||
if (file_exists($file)) {
|
||||
$settings = new Settings($file);
|
||||
$settings->read();
|
||||
return $this->settingsMap($name, $settings);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* ×èñëî ïàïîê
|
||||
*/
|
||||
function getCount ()
|
||||
{
|
||||
return $this->count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Óäàëåíèå ñïèñêà ïàïîê
|
||||
*/
|
||||
function deleteList(array $list)
|
||||
{
|
||||
foreach ($list as $name)
|
||||
Path::delete(Path::join($this->getBasePath(), $name));
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
Loading…
Add table
Add a link
Reference in a new issue