Moin,
OK... Ein Beispiel (gekürzt):
<?php
declare(strict_types=1);
namespace orm;
use DateTime;
use stdClass;
/**
* Class Content
* @package orm
* @table content
*/
class Content extends Orm {
/**
* ID
* @var integer
*/
private $id = 0;
/**
* Artikeltitel
* @var string
* @I18N
*/
private $title = '';
/**
* Konstruktor
* @param stdClass|null $content
* @throws \ReflectionException
*/
public function __construct( stdClass $content = null ){
parent::__construct( $content );
}
/**
* ID Setter
* @param int $id
*/
public function setId( int $id ) :void {
$this->id = $id;
}
/**
* Setter Titel
* @param string $title
*/
public function setTitle( string $title ) :void {
$this->title = $title;
}
/**
* getter Id
* @return int id
*/
public function getId():int {
return (int) $this->id;
}
/**
* Getter Title
* @return string Title
*/
public function getTitle():string {
return (string) $this->title;
}
}
das wäre eine einfache ORM-Entität. Das soll auch wirklich nicht mehr drin stehn. So dazu gibt es die Klasse ORM
<?php
declare( strict_types = 1);
namespace orm;
use inc\{
BasicDb
};
use PDOStatement;
/**
* ORM Class Main ORM Class
*/
class Orm extends BasicDb {
/**
* Pointer for internal list counting
* @var int
*/
private $point = -1;
/**
* Query->Builder Object
* @var string
*/
private $queryVars;
/**
* result array
* @var array
*/
private $list = array();
/**
* Construktor
* @param \stdClass|null $obj
* @throws \ReflectionException
*/
public function __construct( \stdClass $obj = null ) {
// call parent constructor
parent::__construct();
// initialize queryVars- QueryBuilder object
$this->queryVars = (object) array();
// if get a stdClass Object (from addToListFunction)
if($obj !== null ):
// an dieser Stelle werden die Eigenschaften über eine reflection ausgelesen und das Object entsprechend erzeugt
endif;
}
/**
* Methode to set a table
* @param string $table
*/
protected function setTable(string $table) {
// setzt tabelle (Code gerade unwichtig)
}
/**
* Methode to add criterias to query builder
* @param string $typ wich criteria type
* @param string|array|object|int|boolean $value Value
* @param string|array|object|int|boolean $arrvalue optional Arrayvalue
*/
public function addCriteria(string $typ, $value, $arrvalue = null) {
if($arrvalue === null)
$this->queryVars->$typ = $value;
else
$this->queryVars->$typ[$value] = $arrvalue;
}
/**
* Query start
* @param bool $debug
* @return array result array
*/
protected function startQuery(bool $debug=false):array{
if($debug!==false)
return parent::createQuery($this->queryVars,false,true);
return parent::createQuery($this->queryVars );
}
/**
* get actually pointer from internal list
* @return int
*/
public function getPointer() : int {
return $this->point;
}
/**
* add 1 to pointer
* set ponter to -1 if end of list
* @return int
*/
protected function setPointer():int{
$this->point = $this->point+1;
if($this->point >= sizeof($this->list)):
$this->point=-1;
endif;
return $this->point;
}
/**
* get result list
* @return array
*/
public function getList():array {
return $this->list;
}
/**
* add 1 object to list
* @param $obj
* @param \stdClass $data
*/
protected function addToList( $obj, \stdClass $data = null ) : void {
foreach($this->extFields AS $key => $value)
$this->setExtData($obj, $key, $value, $data);
$this->list[] = $obj;
}
/**
* @param bool $noduplicate
* @return int
* @throws \ReflectionException
*/
public function save( bool $noduplicate = false ) : int {
// methode zum Speichern der DAten. Wird wieder gesteuert über die Flags in der Entität
}
/**
* Methode to delete a Element
* @return number[]|string[]|PDOStatement
*/
protected function deleteElement(){
// löschmethode
}
/**
* Method to get all Entrys of an ORM-Class
* this method will calling from getById() and getBy() too
* @param int $anzahl
* @return OrmDb ORM-Object with result List
* @throws \ReflectionException
*/
public static function getAll($anzahl = null) : OrmDb {
// Name from the calling Class
$objectname = static::class;
// new orm object for result return
$ormobj = new OrmDb();
// set table name
if(empty($ormobj->queryVars->table))
$ormobj->setTable(self::getTable($objectname));
// do request
if( $anzahl !== null )
$ormobj->addCriteria( 'cps', $anzahl );
foreach( (array) $ormobj->startQuery() as $obj )
$ormobj->addToList( new $objectname( $obj ),$obj );
// return ORM object wirth result list
return $ormobj;
}
/**
* Method to get the next Entry of List
* return next entry
* @return mixed
*/
public function getEntry() {
return $this->list[ $this->setPointer() ];
}
/**
* Method to get Table from PHPDoc or from static var (old system)
* @param string $objectname
* @return mixed
* @throws \ReflectionException
*/
public static function getTable( string $objectname ) {
// new Reflection Class to read PHPDoc
$r = new \ReflectionClass(static::class );
// get Class Comment
$doc = $r->getDocComment();
// seperater the Tbale declaration
preg_match('~@table ([^ \n\r]*)~',(string) $doc, $erg);
return $erg[1];
}
}
Das erstmal die grobe Struktur.
Aufgerufen wie folgt:
$contentfactory = \orm\Content::getAll();
$content = $contentfactory->getEntry();
echo $content->getTitle();
Und genau am letzten Punkt soll eben abgefangen werden dass die EIgenschaft "Title" ein Flag @I18N hat und dann entsprechend übersetzt wird. Dazu habe ich jetzt den Getter für Titel auuf private gesetzt und eine __call()-methode eingefügt. Diese liefert auch die Übersetzung. ich möchte aber, wenn keine Übersetzung vorhanden ist, den originaltext aus $title anzeigen lassen. Da ich aber $titel und den getter auf private stehen habe, erlange ich keinen Zugriff darauf.
(Der Code ist übrigens stark gekürzt, aber ich denke das relevante ist dabei)
Gruß Bobby
-> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)