Сообщество
Статьи
Использование DOMIT в Joomla | Использование DOMIT в Joomla |
|
Все о СMS Joomla!
| |
Flex |
|
|
Статья об использовании библиотеки DOMIT для работы с файлами формата XML. В статье рассмотрены различные аспекты применения библиотеки на примере работы с файлом данных для компонента галереи изображений. Статья об использовании библиотеки DOMIT для работы с файлами формата XML. В статье рассмотрены различные аспекты применения библиотеки на примере работы с файлом данных для компонента галереи изображений. Если вы хотите сделать интересное клиентское приложение (приложение работающее на стороне клиента, т.е. в браузере), то без Ajax или Flash/Flex вам не обойтись. А, как известно, обе эти технологии любят получать данные из XML файлов. У вас есть два варианта:
Если вы выбираете второй вариант то, скорее всего вам понадобится вносить изменения в эти файлы, создавать новые. Не делать же все это вручную! Не поможет вам в этом и ваше клиентское приложение на 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") это тоже узел, только текстовый. Алгоритм следующий:
//создадим узел 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. Но прежде, необходимо узнать значение этого атрибута. Для этого нам нужно:
//проверим, есть ли дочерние узлы у коневого узла //$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 файлаУдаление узла состоит из трех этапов:
Предположим, что мы хотим удалить узел 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.
Добавить в закладки
RSS
Login




Flex 





