Source for file Builder.class.php
Documentation is available at Builder.class.php
* @copyright Energine 2006
* Создаёт XML-документ основываясь на переданных ему данных и мета-данных.
* @var DataDescription мета-данные
* @var DOMDocument результирующий документ
* Устанавливает мета-данные.
* @param DataDescription $dataDescription мета-данные
* @param Data $data данные
public function setData(Data $data) {
* Создаёт результирующий XML-документ.
public function build() {
$this->result = new DOMDocument('1.0', 'UTF-8');
// если отсутствует описание данных - построение невозможно
return ($this->result instanceof DOMDocument ? true : false);
* Возвращает результат работы построителя.
return $this->result->documentElement;
* Используется в производных классах для построения результата.
* Результат должен быть записан в Builder::$result.
protected function run() {
* Создаёт XML-описание поля данных.
* @param string $fieldName
* @param FieldDescription $fieldInfo
* @param mixed $fieldValue
* @param mixed $fieldProperties
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();
$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);
foreach ($fieldProperties as $propName => $propValue) {
$result->setAttribute($propName, $propValue);
if (($fieldValue instanceof DOMNode) || ($fieldValue instanceof DOMElement)) {
$result->appendChild($fieldValue);
$result->appendChild($this->result->importNode($fieldValue,true));
elseif(($fieldInfo->getType() == FieldDescription::FIELD_TYPE_IMAGE) && $fieldValue){
$img = $this->result->createElement('image');
$img->setAttribute('width', $width);
$img->setAttribute('height', $height);
$img->setAttribute('name', 'main');
$img->nodeValue = $fieldValue;
$result->appendChild($img);
$width = (int) $thumbnail->width,
$height = (int) $thumbnail->height
$img = $this->result->createElement(
$img->setAttribute('width', $width);
$img->setAttribute('height', $height);
$img->setAttribute('name',(string) $thumbnail['name']);
$img->nodeValue = $thumbnailFile;
$result->appendChild($img);
elseif ($fieldValue !== false) {
if (!empty($fieldValue)) {
switch ($fieldInfo->getType()) {
$result->setAttribute('date', @strftime('%d-%m-%Y-%H-%S', $fieldValue));
$fieldValue = @strftime($fieldInfo->getPropertyValue('outputFormat'), $fieldValue);
catch (Exception $dummy){
$result->nodeValue = str_replace('&', '&', $fieldValue);
* Создает набор возможных значений поля типа select.
* @param FieldDescription $fieldInfo
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
$dom_option->setAttribute('selected', 'selected');
$fieldValue->appendChild($dom_option);
|