Использование DOMIT в Joomla 1.0

  • 08.10.2007

Статья об использовании библиотеки DOMIT для работы с файлами формата XML. В статье рассмотрены различные аспекты применения библиотеки на примере работы с файлом данных для компонента галереи изображений.

Если вы хотите сделать интересное клиентское приложение (приложение работающее на стороне клиента, т.е. в браузере), то без Ajax или Flash/Flex вам не обойтись. А, как известно, обе эти технологии любят получать данные из XML файлов.

У вас есть два варианта:

  1. Генерировать XML-файлы “налету” средствами серверного языка, например php. Например show_xml.php:
    print "<?xml version='1.0'?>";
    print "<images>";
    for ($i=0; $i<count($img_array); $i++)
    	print "<name>$imgs_array[$i]</name>";
    print "</images>";
    где $img_array – это массив имен изображений
  2. Хранить на сервере статичные XML файлы. Например, imges.xml:
    <?xml version='1.0'?>
    <images>
    <name>img1.gif</name>
    <name>img2.gif</name>
    <name>img3.gif</name>
    </images>

Если вы выбираете второй вариант то, скорее всего вам понадобится вносить изменения в эти файлы, создавать новые. Не делать же все это вручную! Не поможет вам в этом и ваше клиентское приложение на Ajax или Flash — эти операции можно выполнить только на сервере. Вот тут и пригодится библиотека для php DOMIT!. Библиотека уже есть в стандартной поставке Joomla! – вам не потребуется ничего устанавливать дополнительно.

Получение данных из XML файла

Предположим на сервере лежит gallery.xml, содержащий информацию о изображениях в галерее (все примеры в статье будут использовать этот файл):

<?xml version="1.0"?>
<gallery>
  <image id="1">
    <name>Clifford tower</name>
    <img>images/Cliffordtower.jpg</img>
    <thumbnail>images/Cliffordtower_tumb.jpg</thumbnail>
  </image>
  <image id="2">
    <name>Three little blue leaves</name>
    <img>images/Threelittleblueleaves.jpg</img>
    <thumbnail>images/Threelittleblueleaves_tumb.jpg</thumbnail>
  </image>
  <image id="3">
    <name>Expansion</name>
    <img>images/Expansion.jpg</img>
    <thumbnail>images/Expansion_tumb.jpg</thumbnail>
  </image>
</gallery>

Задача: необходимо получить адрес уменьшенного изображения с id равным 2.

Сам по себе узел image с id равным 2 выглядит следующим образом:

<image id="2">
	<name>Three little blue leaves</name>
	<img>images/Threelittleblueleaves.jpg</img>
	<thumbnail>images/Threelittleblueleaves_tumb.jpg</thumbnail>
</image>

Нас непосредственно интересует содержимое этого узла, в частности значение элемента thumbnail.

Первое что необходимо сделать это подключить к нашему php скрипту библиотеку DOMIT!. И создать объект, чьи методы мы будет использовать.

//подключим библиотеку
include_once($mosConfig_absolute_path.'/includes/domit/xml_domit_include.php');

//создадим объект
$gallery =& new DOMIT_Document();

Теперь загрузим XML файл:

$path_to_galleryXML = $mosConfig_absolute_path.'/gallery/gallery.xml';
$load_result = $gallery->loadXML($path_to_galleryXML);

В переменной $load_result будет результат загрузки XML файла – False, если файл не загрузился или True – если загрузка прошла успешно.

На этом приготовления заканчиваются. Далее схема работы такая: получить нужный узел XML и прочитать его значение.Напомню, что получить нам надо узел <thumbnail>images/Threelittleblueleaves_tumb.jpg</thumbnail>, а его значением является строка "images/Threelittleblueleaves_tumb.jpg".

Существует несколько вариантов получить нужный узел, мы будем использовать самый прогрессивный (на мой взгляд) – Xpath.

//получим ссылку на нужный узел
$node =& $gallery->selectNodes("/gallery/image[@id='2']/thumbnail", 1);

gallery – это корневой узел, среди его “детей” (дочерних узлов) ищем узел image, у которого атрибут id равен 2. Далее среди дочерних узлов ищем узел thumbnail. Единичка во втором параметре метода selectNodes говорит о том, что нам нужен не список всех узлов соответствующих критериям отбора, а только первый из них.

Теперь прочитаем значение найденного узла:

//получим значение найденного узла
$childText = $node->getText();

Все вместе:

//подключим библиотеку
include_once($mosConfig_absolute_path.'/includes/domit/xml_domit_include.php');

//создадим объект
$gallery =& new DOMIT_Document();

//загрузим XML файл
$path_to_galleryXML = $mosConfig_absolute_path.'/gallery/gallery.xml';
$load_result = $gallery->loadXML($path_to_galleryXML, true);

//если загрузка XML файла прошла успешно
if($load_result){
	//получим ссылку на нужный узел
	$node =& $gallery->selectNodes("/gallery/image[@id='2']/thumbnail", 1);

	//получим значение найденного узла
	$childText = $node->getText();
	echo $childText;
}

Редактирование XML файла

Теперь предположим, что нам нужно изменить имя изображения с id равным 3. Все тоже самое: подключаем библиотеку, создаем объект, получаем ссылку на нужный узел (<name>Expansion</name>). Только в конце не получаем значение узла, а устанавливаем его (переписываем) в нужное значение.

//подключим библиотеку
include_once($mosConfig_absolute_path.'/includes/domit/xml_domit_include.php');

//создадим объект
$gallery =& new DOMIT_Document();

//загрузим XML файл
$path_to_galleryXML = $mosConfig_absolute_path.'/gallery/gallery.xml';
$load_result = $gallery->loadXML($path_to_galleryXML, true);

//если загрузка XML файла прошла успешно
if($load_result){
	//получим ссылку на нужный узел
	$node =& $gallery->selectNodes("/gallery/image[@id='3']/name ", 1);

	//изменим значение найденного узла
	$new_name = 'Экспансия';
	$node ->setText($new_name);

	//сохраним изменения
	$gallery ->saveXML($path_to_galleryXML, true);
}

Добавление узла в XML файл

Следующей задачей является добавление изображения в галерею. Для этого нам нужно добавить еще один узел image в файл gallery.xml.

<?xml version="1.0"?>
<gallery>
  <image id="1">
    <name>Clifford tower</name>
    <img>images/Cliffordtower.jpg</img>
    <thumbnail>images/Cliffordtower_tumb.jpg</thumbnail>
  </image>
  <image id="2">
    <name>Three little blue leaves</name>
    <img>images/Threelittleblueleaves.jpg</img>
    <thumbnail>images/Threelittleblueleaves_tumb.jpg</thumbnail>
  </image>
  <image id="3">
    <name>Expansion</name>
    <img>images/Expansion.jpg</img>
    <thumbnail>images/Expansion_tumb.jpg</thumbnail>
  </image>
  <image id="4">
    <name>Sky</name>
    <img>images/sky.jpg</img>
    <thumbnail>images/sky_tumb.jpg</thumbnail>
  </image>
</gallery>

У нового узла:

  <image id="4">
    <name>Sky</name>
    <img>images/sky.jpg</img>
    <thumbnail>images/sky_tumb.jpg</thumbnail>
  </image>

есть три дочерних узла: name, img и thumbnail, а также атрибут id. Сначала мы создадим узел image:

//подключим библиотеку
include_once($mosConfig_absolute_path.'/includes/domit/xml_domit_include.php');

//создадим объект
$gallery =& new DOMIT_Document();

//загрузим XML файл
$path_to_galleryXML = $mosConfig_absolute_path.'/gallery/gallery.xml';
$load_result = $gallery->loadXML($path_to_galleryXML, true);

//если загрузка XML файла прошла успешно
if($load_result){
	//создадим узел image
$new_image =& $gallery->createElement("image");
}

, затем создадим три узла name, img и thumbnail.

Подробно рассмотрим создание узла <name>Sky</name>. Значение узла (строка "Sky") это тоже узел, только текстовый. Алгоритм следующий:

  1. Создаем узел name
  2. Создаем текстовый узел
  3. Добавляем текстовый узел как дочерний к ранее созданному узлу name
//создадим узел name
$new_name =& $gallery->createElement("name");

//создадим текстовый узел
$txtNode = $gallery->createTextNode('Sky')

//добавим текстовый узел к узлу name
$new_name->appendChild($txtNode);

Аналогично создаются и два других узла(img и thumbnail). Новые узлы нужно добавить к узлу image. Все вместе будет выглядеть вот так:

…
//если загрузка XML файла прошла успешно
if($load_result){
	//создадим узел image
	$new_image =& $gallery->createElement("image");

		//создадим узел name и добавим его к image
		$new_name =& $gallery->createElement("name");
		$new_name->appendChild($gallery->createTextNode('Sky'));
		$new_image->appendChild($new_name);

		//создадим узел img и добавим его к image
		$new_img =& $gallery->createElement("img");
		$new_img->appendChild($gallery->createTextNode('images/sky.jpg'));
		$new_image->appendChild($new_img);

		//создадим узел thumbnail и добавим его к image
		$new_thumbnail =& $gallery->createElement("thumbnail");
		$new_thumbnail->appendChild($gallery->createTextNode('images/sky_tumb.jpg'));
		$new_image->appendChild($new_thumbnail);

}

У нас получился вот такой узел:

  <image>
    <name>Sky</name>
    <img>images/sky.jpg</img>
    <thumbnail>images/sky_tumb.jpg</thumbnail>
  </image>

Он почти готов, осталось присвоить ему атрибут id. Но прежде, необходимо узнать значение этого атрибута. Для этого нам нужно:

  1. В файле gallery.xml найти последний узел image
  2. Узнать id этого последнего узла
  3. Увеличить id на единичку и присвоить полученное значение в качестве атрибута для нового узла, который мы создали ранее.
//проверим, есть ли дочерние узлы у коневого узла
//$gallery->documentElement – это и есть ссылка на корневой узел,
//в нашем случаи корневым является узел <gallery>
if ($gallery->documentElement->hasChildNodes()){
	//получим последний узел среди всех “детей” корневого узла
	$lastimg =& $gallery->documentElement->lastChild;

	//получим значение атрибута id последнего узла
	//и увеличим его не единичку
$new_id = $lastimg->getAttribute("id")+1;
}
//если у корневого узла нет “детей” значит, наш узел будет первым
else{
	$new_id = 1;
}

//добавим атрибут id новому узлу image
$new_image->setAttribute('id', $new_id);

Соберем все вместе:

//подключим библиотеку
include_once($mosConfig_absolute_path.'/includes/domit/xml_domit_include.php');

//создадим объект
$gallery =& new DOMIT_Document();

//загрузим XML файл
$path_to_galleryXML = $mosConfig_absolute_path.'/gallery/gallery.xml';
$load_result = $gallery->loadXML($path_to_galleryXML, true);

//если загрузка XML файла прошла успешно
if($load_result){
	//создадим узел image
	$new_image =& $gallery->createElement("image");

		//создадим узел name и добавим его к image
		$new_name =& $gallery->createElement("name");
		$new_name->appendChild($gallery->createTextNode('Sky'));
		$new_image->appendChild($new_name);

		//создадим узел img и добавим его к image
		$new_img =& $gallery->createElement("img");
		$new_img->appendChild($gallery->createTextNode('images/sky.jpg'));
		$new_image->appendChild($new_img);

		//создадим узел thumbnail и добавим его к image
		$new_thumbnail =& $gallery->createElement("thumbnail");
		$new_thumbnail->appendChild($gallery->createTextNode('images/sky_tumb.jpg'));
		$new_image->appendChild($new_thumbnail);


		
		//проверим, есть ли дочерние узлы у коневого узла
		//$gallery->documentElement – это и есть ссылка на корневой узел,
		//в нашем случаи корневым является узел <gallery>
		if ($gallery->documentElement->hasChildNodes()){
			//получим последний узел среди всех “детей” корневого узла
			$lastimg =& $gallery->documentElement->lastChild;

			//получим значение атрибута id последнего узла
			//и увеличим его не единичку
			$new_id = $lastimg->getAttribute("id")+1;
		}
		//если у корневого узла нет “детей” значит, наш узел будет первым
		else{
			$new_id = 1;
		}

		//добавим атрибут id новому узлу image
		$new_image->setAttribute('id', $new_id);

	//добавим только что созданный узел image
	//в качестве дочернего к корневому узлу
	$gallery->documentElement->appendChild($new_image);

	//сохраним изменения	
	$gallery->saveXML($path_to_galleryXML, true);
}

Удаление узла из XML файла

Удаление узла состоит из трех этапов:

  1. Найти удаляемый узел (Для нахождения узла опять будем использовать Xpath).
  2. Непосредственно удаление
  3. Сохранение изменений

Предположим, что мы хотим удалить узел image с id равным 1.

Получить удаляемый узел достаточно просто:

//получим удаляемый узел
$node =& $gallery->selectNodes("/gallery/image[@id='1']", 1);

Что бы удалить узел нужно использовать метод removeChild() родительского узла Родительским узлом для узла image будет gallery, он же и корневой узел. Как мы помним ссылку на корневой узел можно получить так:

$gallery->documentElement

Теперь все вместе:

//получим удаляемый узел
$node =& $gallery->selectNodes("/gallery/image[@id='1']", 1);

//удалим узел
$gallery->documentElement->removeChild($node);

//сохраним изменения
$gallery->saveXML($path_to_galleryXML, true);

Создание нового XML файла

Эта операция не сложнее рассмотренных ранее, поэтому я не буду подробно её описывать. Скорее всего, вопросов у вас возникнуть не должно.

//подключим библиотеку
include_once($mosConfig_absolute_path.'/includes/domit/xml_domit_include.php');

//создадим объект
$det =& new DOMIT_Document();

//создадим XML declaration
$xmlDecl =& $det->createProcessingInstruction('xml', 'version="1.0"');
$det->appendChild($xmlDecl);

//определим переменные
$img_autor = 'Иван Иванов';
$img_date = '15 августа 2007';
$img_comment =c;

//создадим корневой элемент
$rootElement =& $det->createElement('details');

$new_autor =& $det->createElement("autor");
$new_autor->appendChild($det->createTextNode($img_autor));
$rootElement->appendChild($new_autor);

$new_date =& $det->createElement("date");
$new_date->appendChild($det->createTextNode($img_date));
$rootElement->appendChild($new_date);

$new_comment =& $det->createElement("comment");
$new_comment->appendChild($det->createTextNode($img_comment));
$rootElement->appendChild($new_comment);

//добавим корневой элемент
$det->appendChild($rootElement);

//сохраним документ XML
$det->saveXML('details.xml', true);

В итоге получится вот такой XML файл details.xml:

<?xml version="1.0"?>
<details>
  <autor> Иван Иванов</autor>
  <date>15 августа 2007</date>
  <comment>15 августа 2007</comment>
</details>

Желаем успешных экспериментов и ждем отзывов и вопросов на форуме.

Бойко А. C. aka Alex_B

Для того, чтоб оставить комментарий, авторизуйтесь через социальные сети.

Joomla!® CMS — пожалуй, лучшая система управления контентом с открытым исходным кодом

Joomla! — это больше, чем просто программное обеспечение, это люди, включающие разработчиков, дизайнеров, системных администраторов, переводчиков, копирайтеров, и, что самое главное — простых пользователей.

Мы рады пригласить вас в ряды нашего сообщества!

Скачать Joomla! 3.9.3 Документация Joomla! CMS Свернуть

Расширения Joomla

Новости портала

Новое в блогах