<?php
/**
* ÐлаÑÑ DataDescription.
*
* @package energine
* @subpackage core
* @author dr.Pavka
* @copyright ColoCall 2006
* @version $Id: DataDescription.class.php,v 1.5 2007/12/17 14:16:03 pavka Exp $
*/
//require_once('core/framework/Object.class.php');
//require_once('core/framework/FieldDescription.class.php');
/**
* ÐеÑа-даннÑе.
*
* @package energine
* @subpackage core
*/
class DataDescription extends Object implements Iterator {
/**
* @access private
* @var array меÑа-даннÑе полей
*/
private $fieldDescriptions;
/**
* @access private
* @var int колиÑеÑÑво полей даннÑÑ
*/
private $length;
/**
* @access private
* @var int Ð¸Ð½Ð´ÐµÐºÑ ÑекÑÑего ÑлеменÑа (иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¸ÑеÑаÑии)
*/
private $currentIndex = 0;
/**
* ÐонÑÑÑÑкÑÐ¾Ñ ÐºÐ»Ð°ÑÑа.
*
* @access public
* @return void
*/
public function __construct() {
parent::__construct();
$this->fieldDescriptions = array();
$this->length = 0;
}
/**
* ÐагÑÑÐ¶Ð°ÐµÑ Ð¾Ð¿Ð¸Ñание даннÑÑ
полÑÑеннÑÑ
из ÐÐ.
*
* @access public
* @param array $columnsInfo
* @return void
* @see DBA::getColumnsInfo()
*/
public function load(array $columnsInfo) {
foreach ($columnsInfo as $columnName => $columnInfo) {
$fieldDescr = new FieldDescription($columnName);
$fieldDescr->loadArray($columnInfo);
$this->addFieldDescription($fieldDescr);
}
}
/**
* ÐагÑÑÐ¶Ð°ÐµÑ Ð¾Ð¿Ð¸Ñание даннÑÑ
полÑÑеннÑÑ
из конÑигÑÑаÑионного XML Ñайла.
*
* @access public
* @param SimpleXMLElement $xmlDescr
* @return void
*/
public function loadXML(SimpleXMLElement $xmlDescr) {
if (!empty($xmlDescr))
foreach ($xmlDescr->field as $fieldXmlDescr) {
$fieldDescr = new FieldDescription();
$fieldDescr->loadXML($fieldXmlDescr);
$this->addFieldDescription($fieldDescr);
}
}
/**
* ÐобавлÑÐµÑ Ð¾Ð¿Ð¸Ñание Ð¿Ð¾Ð»Ñ Ð´Ð°Ð½Ð½ÑÑ
.
*
* @access public
* @param FieldDescription $fieldDescription
* @return void
*/
public function addFieldDescription(FieldDescription $fieldDescription) {
$this->fieldDescriptions[$fieldDescription->getName()] = $fieldDescription;
$this->length++;
}
/**
* УдалÑÐµÑ Ð¾Ð¿Ð¸Ñание Ð¿Ð¾Ð»Ñ Ð´Ð°Ð½Ð½ÑÑ
.
*
* @access public
* @param FieldDescription $fieldDescription
* @return void
*/
public function removeFieldDescription(FieldDescription $fieldDescription) {
if (isset($this->fieldDescriptions[$fieldDescription->getName()])) {
unset($this->fieldDescriptions[$fieldDescription->getName()]);
$this->length--;
}
}
/**
* ÐозвÑаÑÐ°ÐµÑ Ð¾Ð¿Ð¸Ñание Ð¿Ð¾Ð»Ñ Ð´Ð°Ð½Ð½ÑÑ
по имени полÑ,
* или false, еÑли Ñакого Ð¿Ð¾Ð»Ñ Ð½Ðµ ÑÑÑеÑÑвÑеÑ.
*
* @access public
* @param string $name
* @return FieldDescription
*/
public function getFieldDescriptionByName($name) {
$fieldDescription = false;
if (isset($this->fieldDescriptions[$name])) {
$fieldDescription = $this->fieldDescriptions[$name];
}
return $fieldDescription;
}
/**
* ÐозвÑаÑÐ°ÐµÑ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹ даннÑÑ
.
*
* @access public
* @return array
*/
public function getFieldDescriptions() {
return $this->fieldDescriptions;
}
/**
* ÐозвÑаÑÐ°ÐµÑ ÑпиÑок имÑн полей даннÑÑ
.
*
* @return array
* @access public
*/
public function getFieldDescriptionList() {
return array_keys($this->fieldDescriptions);
}
/**
* ÐозвÑаÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво полей даннÑÑ
.
*
* @access public
* @return int
*/
public function getLength() {
return $this->length;
}
/**
* СоздаÑÑ Ð¿ÐµÑеÑеÑение опиÑÐ°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
Ñ Ð´ÑÑгим опиÑанием даннÑÑ
.
*
* @access public
* @param DataDescription $otherDataDescr
* @return DataDescription
*/
public function intersect(DataDescription $otherDataDescr) {
$result = false;
if ($this->getLength() == 0) {
$result = $otherDataDescr;
}
else {
// пÑоÑ
одимÑÑ Ð¿Ð¾ опиÑаниÑм полей ÑекÑÑего обÑекÑа
foreach ($this->fieldDescriptions as $fieldName => $fieldDescription) {
// еÑли ÑÑÑеÑÑвÑÐµÑ Ð¾Ð¿Ð¸Ñание из ÐÐ - пеÑеÑекаем Ñ Ð½Ð¸Ð¼
if ($otherDataDescr->getFieldDescriptionByName($fieldName)) {
$this->fieldDescriptions[$fieldName] = FieldDescription::intersect(
$this->fieldDescriptions[$fieldName],
$otherDataDescr->getFieldDescriptionByName($fieldName)
);
}
/*
* ÐÑли опиÑÐ°Ð½Ð¸Ñ Ð¸Ð· ÐРоÑÑÑÑÑÑвÑеÑ, ÑÑÑанавливаем дополниÑелÑное ÑвойÑÑво customField,
* коÑоÑое ÑказÑÐ²Ð°ÐµÑ Ð½Ð° Ñо, ÑÑо даннÑе ÑÑого Ð¿Ð¾Ð»Ñ ÑоÑ
ÑанÑÑÑ Ð² ÐРне нÑжно.
*/
else {
$this->getFieldDescriptionByName($fieldName)->addProperty('customField', 'customField');
}
}
$result = $this;
}
return $result;
}
/**
* ÐеÑемеÑÐ°ÐµÑ Ð¸ÑеÑаÑÐ¾Ñ Ð½Ð° пеÑвÑй ÑлеменÑ.
*
* @access public
* @return void
*/
public function rewind() {
$this->currentIndex = 0;
}
/**
* ÐозвÑаÑÐ°ÐµÑ ÑекÑÑий ÑлеменÑ.
*
* @access public
* @return mixed
*/
public function current() {
$fieldNames = $this->getFieldDescriptionList();
return $this->fieldDescriptions[$fieldNames[$this->currentIndex]];
}
/**
* ÐозвÑаÑÐ°ÐµÑ ÐºÐ»ÑÑ ÑекÑÑего ÑлеменÑа.
*
* @access public
* @return mixed
*/
public function key() {
$fieldNames = $this->getFieldDescriptionList();
return $fieldNames[$this->currentIndex];
}
/**
* ÐеÑемеÑÐ°ÐµÑ Ð¸ÑеÑаÑÐ¾Ñ Ð½Ð° ÑледÑÑÑий ÑлеменÑ.
*
* @access public
* @return void
*/
public function next() {
$this->currentIndex++;
}
/**
* ÐÑовеÑÑеÑ, ÑÑÑеÑÑвÑÐµÑ Ð»Ð¸ ÑекÑÑий ÑлеменÑ.
*
* @access public
* @return boolean
*/
public function valid() {
return ($this->currentIndex < $this->length);
}
}