Галерея PHP + XML

ygerz

Новичок
Галерея PHP + XML

Написал скрипт и попал в тупик... не знаю как лучше реализовать разбивку на страницы.
Тут в ручную, хочется чтобы они генерировались автоматически, исходя з того, что на странице
должно быть 6 рисунков.
Может добавить новый тэг в xml-файл и использовать его? не знаю. посоветуйте с примером.

вот код xml-структуры:
PHP:
<?xml version="1.0" encoding="utf-8"?>
<Photos> 
<photo>
	 <part>1</part> 
     <name>One</name> 
     <img>images/small/images1.jpg</img> 
</photo>
<photo> 
	 <part>1</part> 
	 <name>Two</name> 
     <img>images/small/images2.jpg</img> 
</photo> 
<photo> 
	 <part>1</part> 
     <name>One</name> 
     <img>images/small/images1.jpg</img> 
</photo> 
<photo> 
	 <part>1</part> 
     <name>Two</name> 
     <img>images/small/images2.jpg</img> 
</photo> 
<photo> 
	 <part>1</part> 
     <name>One</name> 
     <img>images/small/images1.jpg</img> 
</photo>
<photo> 
	 <part>1</part> 
     <name>Two</name> 
     <img>images/small/images2.jpg</img> 
</photo> 
<photo> 
	 <part>2</part> 
     <name>One</name> 
     <img>images/small/images6.jpg</img> 
</photo> 
<photo> 
	 <part>2</part> 
     <name>Two</name> 
     <img>images/small/images7.jpg</img> 
</photo> 
</Photos>
Вот код галереи:
PHP:
<?php
print "<table border='0' cellpadding='0' cellspacing='0'><tr>";
$photos = simplexml_load_file('photos.xml'); 
foreach ($photos->photo as $photo) { 
if ($photo->part == $_GET['part']){
print "<td align='center'>$photo->name <br><hr noshade='noshade' size='1px'/><img src='$photo->img'></td><td width='1px'><td>"; } }
print "</tr></table>";

for ($i=1; $i<3; $i++){
print "<a href='?part=$i'>[$i]&nbsp;</a>";
}
?>
 

Beavis

Banned
а чем вызвано желание использовать в качестве базы данных XML ?
 

Фанат

oncle terrible
Команда форума
Beavis
на самом деле, идея не хуже, чем любая другая.

ygerz у тебя же ведь photos->photo - массив? какая проблема выводить не весь массив, а его часть?
 

AmdY

Пью пиво
Команда форума
решение половинчатое, раз хранишь инфу в xml, так используй
xsl, чтобы этот xml одевать, а xpath, чтобы делать выборку.
 

Фанат

oncle terrible
Команда форума
AmdY
ой, только не надо вот этого экстремизма.
а если я конфиг храню в XML - я к нему тоже должен шаблон присобачивать?
 

ygerz

Новичок
*****
Собственно говоря, вот это условие
if ($photo->part == $_GET['part'])
и выводит часть массива, а именно <part>$i</part>.
AmdY
наверно можно обойтись и без xsl, как считаешь?
 

AmdY

Пью пиво
Команда форума
Я предложил удобный способ, который значительно лучше смеси РНР с HTML, мне кажется что он наиболее прост и правилен в данной ситуации. А вот экстремизма я здесь совсем не вижу.
Фaнат, а для конфига ты делаешь вывод в HTML, если, да, то это имеет смысл.
 

ygerz

Новичок
если каким-то образом получить значение между тегами <part></part> в последнем ноде
 

Фанат

oncle terrible
Команда форума
а зачем вообще тебе эта парта?
ты руками парты расставляешь? а зачем? если программа сама вполне может вывести часть массива по счету. с первого по 10 элемент, например
 

AmdY

Пью пиво
Команда форума
поробуй count($photos)
сорри, больше не могу, заскочил в форум на минутку.
 

ygerz

Новичок
*****
для теории.
понятно, что на практике, можно просто добавить страницы вручную.

AmdY
можешь привести на примере то, что ты имеешь ввиду под простотой?

-~{}~ 19.12.07 01:27:

Можно сделать так:
$col = ceil(count($photos)/6);
Т.е. count($photos) посчитает сколько всего в файле нодов, в данном примере их 8. Дальше делим это на 6(требуемое кол-во для отображения) с округлением большую сторону.
получаем 2. Что есть истина )))
Получился следующий код, с автоматической разбивкой на страницы при добавлении картинок в файл xml.
PHP:
<?php
print "<table border='0' cellpadding='0' cellspacing='0'><tr>";
$photos = simplexml_load_file('photos.xml'); 
foreach ($photos->photo as $photo) { 
if ($photo->part == $_GET['part']){
print "<td align='center'>$photo->name <br><hr noshade='noshade' size='1px'/><img src='$photo->img'></td><td width='1px'><td>"; } }
print "</tr></table>";
$col = ceil(count($photos)/6);

for ($i=1; $i<($col+1); $i++){
print "<a href='?part=$i'>[$i]&nbsp;</a>";
}
?>
 

AmdY

Пью пиво
Команда форума
PHP:
$sXSL = '
<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns[b]:[/b]php="http://php.net/xsl">
 <xsl[b]:[/b]output method="html" encoding="utf-8" indent="no"/>
 <xsl:template match="Photos">
  <table border="1" cellpadding="0" cellspacing="0"><tr>
   <xsl:for-each select="//photo[part=php:function(\'getGet\', \'part\', 1)]">
    <td  align="center"><xsl:value-of select="php:function(\'ucfirst\', string(name))"/>
          <br/><hr noshade="noshade" size="1px"/>
          <img src="@img"/>
      </td>
      <td></td>
   </xsl:for-each>
  </tr></table>
 </xsl:template>
</xsl:stylesheet>';

$xmldoc = DOMDocument::loadXML($sXML);
$xsldoc = DOMDocument::loadXML($sXSL);
$proc = new XSLTProcessor();
$proc->registerPHPFunctions();
$proc->importStyleSheet($xsldoc);
echo $proc->transformToXML($xmldoc);
function getGet($sName='part', $mDefault=1) {
  return isset($_GET[$sName]) ? $_GET[$sName] : $mDefault;
}
P.S.интересно, зачем форум ищет смайлы в РНР коде.
 

ygerz

Новичок
Что-то я тут намудрил, как-то неудобно реализовал вывод большого рисунка.
Превью находятся в папке images/small/
Большие картинки в папке images/
В xml файл был добавлен тэг <bigimg> с сылкой на большой рисунок:
PHP:
<photo>
     <part>1</part> 
     <name>One</name> 
     <img>images/small/images1.jpg</img>
     <bigimg>images/images1.jpg</bigimg> 
</photo>
Я вывожу превьшки и делаю для них ссылку вида ?part=1&image=1
, где номер image взят регулярными выражениями из имени файла.
Этот способ не удобен, т.к. я получается, привязан к строгому соблюдению имени файла.

Можно написать гораздо проще, используя массив $photos.

Вот код:
PHP:
<?php
print "<table border='0' cellpadding='0' cellspacing='0'><tr>";
$photos = simplexml_load_file('photos.xml'); 
foreach ($photos->photo as $photo) { 
	if ($photo->part == $_GET['part']){
//имена файлов вида images1.jpg, поэтому можно выдрать номер текущего рисунка
$obrezDoNum = ereg_replace('images/images','',$photo->bigimg);
$obrez = ereg_replace('.jpg','',$obrezDoNum);
//выводим превьюшки
print "<td align='center'>$photo->name <br><hr noshade='noshade' size='1px'/><a href='?part=".$_GET['part']."&image=$obrez'><img src='$photo->img'></a></td><td width='1px'><td>"; 

	} 
}
     print "</tr></table>";
//считаем количество рисунков в файле и разбиваем на страницы
$col = ceil(count($photos)/6);
for ($i=1; $i<($col+1); $i++){
print "<a href='?part=$i'>[$i]&nbsp;</a>";
}
//Используем выдранный ранее номер текущего рисунка из адресной строки и выводим большой рисунок.
print "<br><br><br><img src='images/images".$_GET['image'].".jpg'>";
?>
 

AmdY

Пью пиво
Команда форума
Регулярка неправильная используй $
И она вовсе ненужна, можно просто обрезать 4 символа.
Но и это ненужно в папке заведи попку images в теге img храни только имя_файла.jpg плюс превьюшка превью_имя_файла.jpg
 

AmdY

Пью пиво
Команда форума
Мне на js такие вещи больше нравятся и нагрузку снижает
 

AmdY

Пью пиво
Команда форума
не только нагрузка. но и юзабельность, никаких перезагрузок, но есть проблема с разбивкой страниц :(
 

ygerz

Новичок
дай ссылочки, где про юзабельность почитать, может переделаю.
 
Сверху