<?php
/**
* ÐлаÑÑ Builder.
*
* @package energine
* @subpackage core
* @author dr.Pavka
* @copyright ColoCall 2006
* @version $Id: Builder.class.php,v 1.7 2008/03/14 15:18:41 pavka Exp $
*/
//require_once('core/framework/DBWorker.class.php');
//require_once('core/framework/DataDescription.class.php');
//require_once('core/framework/Data.class.php');
/**
* ÐоÑÑÑоиÑелÑ.
* СоздаÑÑ XML-докÑÐ¼ÐµÐ½Ñ Ð¾ÑновÑваÑÑÑ Ð½Ð° пеÑеданнÑÑ
ÐµÐ¼Ñ Ð´Ð°Ð½Ð½ÑÑ
и меÑа-даннÑÑ
.
*
* @package energine
* @subpackage core
* @abstract
*/
abstract class Builder extends DBWorker {
/**
* @access protected
* @var DataDescription меÑа-даннÑе
*/
protected $dataDescription;
/**
* @access protected
* @var Data даннÑе
*/
protected $data;
/**
* @access protected
* @var DOMDocument ÑезÑлÑÑиÑÑÑÑий докÑменÑ
*/
protected $result;
/**
* ÐонÑÑÑÑкÑÐ¾Ñ ÐºÐ»Ð°ÑÑа.
*
* @access public
* @return void
*/
public function __construct() {
parent::__construct();
$this->dataDescription = false;
$this->data = false;
$this->result = new DOMDocument('1.0', 'UTF-8');
}
/**
* УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¼ÐµÑа-даннÑе.
*
* @access public
* @param DataDescription $dataDescription меÑа-даннÑе
* @return void
*/
public function setDataDescription(DataDescription $dataDescription) {
$this->dataDescription = $dataDescription;
}
/**
* УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð´Ð°Ð½Ð½Ñе.
*
* @access public
* @param Data $data даннÑе
* @return void
*/
public function setData(Data $data) {
$this->data = $data;
}
/**
* СоздаÑÑ ÑезÑлÑÑиÑÑÑÑий XML-докÑменÑ.
*
* @access public
* @return boolean
*/
public function build() {
// еÑли оÑÑÑÑÑÑвÑÐµÑ Ð¾Ð¿Ð¸Ñание даннÑÑ
- поÑÑÑоение невозможно
if ($this->dataDescription == false) {
throw new SystemException('ERR_DEV_NO_DATA_DESCRIPTION', SystemException::ERR_DEVELOPER);
}
$this->run();
return ($this->result instanceof DOMDocument ? true : false);
}
/**
* ÐозвÑаÑÐ°ÐµÑ ÑезÑлÑÑÐ°Ñ ÑабоÑÑ Ð¿Ð¾ÑÑÑоиÑелÑ.
*
* @access public
* @return DOMNode
*/
public function getResult() {
return $this->result->documentElement;
}
/**
* ÐÑполÑзÑеÑÑÑ Ð² пÑоизводнÑÑ
клаÑÑаÑ
Ð´Ð»Ñ Ð¿Ð¾ÑÑÑÐ¾ÐµÐ½Ð¸Ñ ÑезÑлÑÑаÑа.
* РезÑлÑÑÐ°Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð·Ð°Ð¿Ð¸Ñан в Builder::$result.
*
* @access protected
* @return void
*/
protected function run() {
}
/**
* СоздаÑÑ XML-опиÑание Ð¿Ð¾Ð»Ñ Ð´Ð°Ð½Ð½ÑÑ
.
*
* @access protected
* @param string $fieldName
* @param FieldDescription $fieldInfo
* @param mixed $fieldValue
* @param mixed $fieldProperties
* @return DOMNode
*/
protected function createField($fieldName, FieldDescription $fieldInfo, $fieldValue = false, $fieldProperties = false) {
$result = $this->result->createElement('field');
$result->setAttribute('name', $fieldName);
$result->setAttribute('type', $fieldInfo->getType());
$length = $fieldInfo->getLength();
if ($length !== true) {
$result->setAttribute('length', $length);
}
$result->setAttribute('mode', $fieldInfo->getMode());
foreach ($fieldInfo->getPropertyNames() as $propName) {
$propValue = $fieldInfo->getPropertyValue($propName);
if ($propValue != '' && !is_array($propValue)) {
$result->setAttribute($propName, $propValue);
}
}
if ($fieldProperties) {
foreach ($fieldProperties as $propName => $propValue) {
$result->setAttribute($propName, $propValue);
}
}
if ($fieldValue instanceof DOMNode) {
try {
$result->appendChild($fieldValue);
}
catch (Exception $e) {
$result->appendChild($this->result->importNode($fieldValue,true));
}
}
elseif ($fieldValue !== false) {
if (!empty($fieldValue)) {
switch ($fieldInfo->getType()) {
case FieldDescription::FIELD_TYPE_DATETIME:
case FieldDescription::FIELD_TYPE_DATE:
case FieldDescription::FIELD_TYPE_HIDDEN:
try {
$fieldValue = @strftime($fieldInfo->getPropertyValue('outputFormat'), $fieldValue);
}
catch (Exception $dummy){};
break;
default: // not used
}
}
$result->nodeValue = str_replace('&', '&', $fieldValue);
}
return $result;
}
/**
* Ð¡Ð¾Ð·Ð´Ð°ÐµÑ Ð½Ð°Ð±Ð¾Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½ÑÑ
знаÑений Ð¿Ð¾Ð»Ñ Ñипа select.
*
* @access protected
* @param FieldDescription $fieldInfo
* @param mixed $data
* @return DOMNode
*/
protected function createOptions(FieldDescription $fieldInfo, $data = false) {
$fieldValue = $this->result->createElement('options');
if(is_array($fieldInfo->getAvailableValues()))
foreach ($fieldInfo->getAvailableValues() as $key => $option) {
$dom_option = $this->result->createElement('option', str_replace('&', '&', $option['value']));
$dom_option->setAttribute('id', $key);
if ($option['attributes']) {
foreach ($option['attributes'] as $attrName => $attrValue) {
$dom_option->setAttribute($attrName, $attrValue);
}
}
// Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ Ñипа multi-select
if (is_array($data) && in_array($key, $data)) {
$dom_option->setAttribute('selected', 'selected');
}
$fieldValue->appendChild($dom_option);
}
return $fieldValue;
}
}