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

  • Понедельник, 08 октября 2007

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

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

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

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

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

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

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



    
        Clifford tower
        images/Cliffordtower.jpg
        images/Cliffordtower_tumb.jpg
    
    
        Three little blue leaves
        images/Threelittleblueleaves.jpg
        images/Threelittleblueleaves_tumb.jpg
    
    
        Expansion
        images/Expansion.jpg
        images/Expansion_tumb.jpg
    

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

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


	Three little blue leaves
	images/Threelittleblueleaves.jpg
	images/Threelittleblueleaves_tumb.jpg

Нас непосредственно интересует содержимое этого узла, в частности значение элемента 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.



    
        Clifford tower
        images/Cliffordtower.jpg
        images/Cliffordtower_tumb.jpg
    
    
        Three little blue leaves
        images/Threelittleblueleaves.jpg
        images/Threelittleblueleaves_tumb.jpg
    
    
        Expansion
        images/Expansion.jpg
        images/Expansion_tumb.jpg
    
    
        Sky
        images/sky.jpg
        images/sky_tumb.jpg
    

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

    
        Sky
        images/sky.jpg
        images/sky_tumb.jpg
    

есть три дочерних узла: 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);

}

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

//проверим, есть ли дочерние узлы у коневого узла
//$gallery->documentElement – это и есть ссылка на корневой узел,
//в нашем случаи корневым является узел 
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 – это и есть ссылка на корневой узел,
		//в нашем случаи корневым является узел 
		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:


Иван Иванов 15 августа 2007 15 августа 2007

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

Бойко А. C. aka Alex_B

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

Логотип Joomla

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

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

Свернуть

Коротко о главном в Joomla

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

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

Видео

Форум о Joomla