Cайты "под ключ"

Акция - Сайт визитка от 199 евро

Предложение

team.png Портал AMARENO приглашает в команду людей, причастных к веб-разработкам...

Продвижие (SEO). Реклама

Поисковое продвижение, раскрутка, реклама
Главная arrow Сообщество arrow Статьи arrow Использование DOMIT в Joomla
Использование DOMIT в Joomla Версия для печати
(0 голосов)
tag Все о СMS Joomla!
Flex
  

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

Статья об использовании библиотеки 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

По материалам: joomlaportal.ru

 
  Нет комментариев.

Быстрое сообщение

Комментарии (0)
< Пред.   След. >

Мы производим бурение скважин подробности на нашем вебсайте www.burenie.ru.

Who's Online

Сейчас на сайте: 20

Заказать услугу

order

Форум

RSS


RSS 2.0



Интернет магазин

Интернет магазин. Разработка

Сопровождение

Поддержка и сопровождение сайтов

Администрирование

Администрирование серверов. Установка серверных приложений

Хостинг и домены

Профессиональный хостинг, регистрация доменов