ФорумПрограммированиеPHP для идиотов → Помогите!!! Постраничный вывод DOM элементов

Помогите!!! Постраничный вывод DOM элементов

  • kichSman

    Сообщения: 30 Репутация: N Группа: Кто попало

    Spritz 26 февраля 2009 г. 13:35

    На многих темах в мою сторону уже косо смотрят с моим вопросом, предлагали много решений:
    http://phpforum.ru/index.php?showtopic=16204&st=0
    http://forum.vingrad.ru/forum/topic-249208/unread-1/anchor-entry1797284/0.html
    А где то и вовсе игнорили: http://sql.ru/forum/actualthread.aspx?bid=18&tid=642714&pg=-1
    (и это только сегодняшние, не считая вчерашних и позавчерашних)

    суть проблемы в том, что у меня есть скрипт, который через DOM получает из xml перечень данных:

    $basename='base.xml';
    $doc = new DomDocument();
    $doc = DOMDocument::load($basename);
    $params = $doc->getElementsByTagName("FILE");
    foreach ($params as $param) {
    $nameAdr=iconv("UTF-8", "WINDOWS-1251",$param->attributes->getNamedItem("name")->nodeValue);
    $date=iconv("UTF-8", "WINDOWS-1251",$param->attributes->getNamedItem("date")->nodeValue);
    $account=iconv("UTF-8", "WINDOWS-1251",$param->attributes->getNamedItem("account")->nodeValue);
    $itas=$param->getElementsByTagName('TITLE');
    foreach ($itas as $ita){
    $title=iconv("UTF-8", "WINDOWS-1251",$ita->nodeValue);
    }
    $bodyData=$param->getElementsByTagName('COMMENT');
    foreach ($bodyData as $bodyD){
    $comment=iconv("UTF-8", "WINDOWS-1251",$bodyD->nodeValue);
    }
    $kolobok.= "<p><b><a href=\"../articles/artic/$nameAdr\">$title</a></b><br />$comment<br /><b style=\"font-size:10px;color:#999\">$date&#38;nbsp;[Просмотров: $account]</b></p>";
    }
    print "<p>Всего строк: <b>$params->length</b></p>";


    Где xml содержит следующее:

    <?xml version="1.0" encoding="windows-1251"?>
    <ARTICLES>
    <FILE name="dostavka.php" date="ноябрь 2008" account="2">
    <TITLE>Продажа на дистанции. Оформление сделки</TITLE>
    <COMMENT>В настоящее время предприниматели начали серьезно рассматривать дистанционный способ торговли, то есть без личной встречи с покупателем и отсутствием возможности непосредственного ознакомления покупателя с товаром. В целом подобный вариант торговли выгоден бизнесменам. В частности, дистанционная торговля минимизирует затраты на аренду, оформление магазина…</COMMENT>
    </FILE>
    <FILE name="electronic.php" date="июль 2008" account="1">
    <TITLE>Сдача отчетности в электронном виде. Право и обязанность</TITLE>
    <COMMENT>Налоговый кодекс предусматривает два варианта представления отчетности: на бумажном носителе либо в электронном виде. Нередко инспекторы отказываются принимать у ИП отчеты на бумаге. В то же время обязанность сдавать отчетность в электронном виде распространяется лишь на некоторые категории налогоплательщиков…</COMMENT>
    </FILE>

    </ARTICLES>


    Я взял скрипт, точнее слизал, постраничного вывода, скрипт рабочий:

    <!– Отображение пострачного вывода –>
    <?php
    $N = 145;
    $perPage = 10;
    $currOffset = 70;
    if (isset($_GET['st'])) $currOffset = $_GET['st'];

    // Количество соседних номеров страниц с каждой стороны,
    // отображающихся рядом с текущей страницей
    $xwidth = 2;

    $currNum = 0;
    $prevOffset = -1;
    if ($currOffset - $perPage >= 0) $prevOffset = $currOffset - $perPage;

    $nextOffset = 0;
    if ($currOffset + $perPage < $N) $nextOffset = $currOffset + $perPage;

    if ($prevOffset >= 0) {
       print ' <a href="?st='.$prevOffset.'">Предыдущая страница</a> ';
    }

    // Флаги вывода левого и правого многоточия
    $leftBlankOut = $rightBlankOut = false;
    for ($i = 0; $i < $N; $i += $perPage) {
       $currNum++;

       // Манипулируем выводом левого многоточия
       if ($i > 0 &#38;&#38; ($i <= $currOffset - $xwidth * $perPage - $perPage)) {
           if (!$leftBlankOut) print '…';
           $leftBlankOut = true;
           continue;
       }

       // Манипулируем выводом правого многоточия
       if ($i < ($N - $perPage) &#38;&#38; ($i >= $currOffset + $xwidth * $perPage + $perPage)) {
           if (!$rightBlankOut) print '…';
           $rightBlankOut = true;
           continue;
       }

       if ($i == $currOffset) {
           print ' <b>'.$currNum.'</b> ';
       } else {
           print ' <a href="?st='.$i.'">'.$currNum.'</a> ';
       }
    }

    if ($nextOffset) {
       print ' <a href="?st='.$nextOffset.'">Следующая страница</a> ';
    }

    print "<br><br>";
    ?>

    <!– Отображение данных(объектов) текущей страницы –>
    <b>Объекты</b>:<br>
    <?php
    $end = $currOffset + $perPage;
    if ($end > $N) $end = $N;
    for ($i = $currOffset; $i < $end; $i++) {
       print ($i+1).'<br>';
    }
    ?>

    результатом скрипта является разбивка контента по следующему принципу
    предыдущая(6) 1 … 5 6 7 8 9 … 15  следующая(8)

    И теперь все никак не могу понять, как можно вывести полученный через DOM перечень постранично/
  • AzeriFire

    Сообщения: 2 Репутация: N Группа: Кто попало

    Spritz 26 февраля 2009 г. 13:46, спустя 11 минут 28 секунд

    Может так? $N=count($bodyD); (Не точно так. показываю как пример)

  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи
  • AzeriFire

    Сообщения: 2 Репутация: N Группа: Кто попало

    Spritz 26 февраля 2009 г. 13:54, спустя 4 минуты 31 секунду

    и еще есть Digg Style Pagination
  • kichSman

    Сообщения: 30 Репутация: N Группа: Кто попало

    Spritz 26 февраля 2009 г. 14:04, спустя 10 минут 16 секунд


    Может так? $N=count($bodyD); (Не точно так. показываю как пример)

    нормально это выглядит так
    $N=$params->length;

    но не в этом основная проблема
  • kichSman

    Сообщения: 30 Репутация: N Группа: Кто попало

    Spritz 26 февраля 2009 г. 14:15, спустя 10 минут 50 секунд


    http://pyha.ru/forum/topic/299.0

    Дынные формируются в переменной $kolobok(всем списком) вот в этом и загвоздка, как эту переменную использовать на примере с mysql сложно приходит в голову, или потому, что мне уже в голову ничего не приходит

    http://pyha.ru/forum/topic/32.0

    Статья полезная, но с учетом получения данных в поставленной задаче, она не подойдет
  • kichSman

    Сообщения: 30 Репутация: N Группа: Кто попало

    Spritz 26 февраля 2009 г. 14:30, спустя 14 минут 36 секунд


    http://pyha.ru/forum/topic/299.0

    Что вывод данных почти аналогичен выводу из базы, но вот только не пойму как применить этот код
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 26 февраля 2009 г. 22:02, спустя 7 часов 31 минуту 55 секунд

    <?php
    // Номер страницы и количество элементов на страницу
    $page_num = (isset($_GET['page_num'])) ? abs(intval($_GET['page_num'])) : 1;
    $page_size = 3;

    // Номера первого и последнего элемента на странице
    $last = $page_size * $page_num;
    $first = $last - $page_size;

    $doc = new DOMDocument('1.0', 'windows-1251');
    $doc->load('articles.xml');
    $el_file_list = $doc->firstChild->getElementsByTagName('FILE');

    // Проверяем корректность номера страницы,
    // в случае ошибки считаем, что страница - первая
    if ($first >= $el_file_list->length) {
    $page_num = 1;
    $first = 0;
    $last = $page_size;
    }
    if ($last > $el_file_list->length) {
    $last = $el_file_list->length;
    }

    // Выводим элементы
    for ($i = $first; $i < $last; ++$i) {
    $el_file = $el_file_list->item($i);
    $el_title = $el_file->firstChild;
    $el_comment = $el_file->lastChild;
    print '<li>' . $el_file->getAttribute('name')
    . ', ' . $el_file->getAttribute('date')
    . ', ' . $el_file->getAttribute('account')
    . '<h3>' . $el_title->nodeValue . '</h3>'
    . '<p>' . $el_comment->nodeValue . '</p>';
    }

    // Общее количество страниц
    $pages_count = ceil($el_file_list->length / $page_size);

    // Формируем навигацию
    if ($page_num > 1) {
    print '<a href="?page_num='
    . ($page_num - 1)
    . '">Предыдущая ('
    . ($page_num - 1) . ')</a> ';
    }
    for ($i = 1; $i <= $pages_count; ++$i) {
    if ($i == $page_num) {
    print "<span>$i</span> ";
    } else {
    print "<a href=\"?page_num=$i\">$i</a> ";
    }
    }
    if ($page_num < $pages_count) {
    print '<a href="?page_num='
    . ($page_num + 1)
    . '">Следующая ('
    . ($pages_count - $page_num)
    . ')</a>';
    }
  • kichSman

    Сообщения: 30 Репутация: N Группа: Кто попало

    Spritz 27 февраля 2009 г. 1:02, спустя 3 часа 55 секунд


    <?php
    // Выводим элементы
    for ($i = $first; $i < $last; ++$i) {
    $el_file = $el_file_list->item($i);
    $el_title = $el_file->firstChild;
    $el_comment = $el_file->lastChild;
    print '<li>' . $el_file->getAttribute('name')
    . ', ' . $el_file->getAttribute('date')
    . ', ' . $el_file->getAttribute('account')
    . '<h3>' . $el_title->nodeValue . '</h3>'
    . '<p>' . $el_comment->nodeValue . '</p>';
    }


    Спасибоще огромное!))) Теперь знаю в каком направлении двигаться. Вот только была проблема с кодировкой и отображением содержимого тегов, находящихся внутри дерева, решение проблемы было дело техники)):

    for ($i = $first; $i < $last; ++$i) {
    $el_file = $el_file_list->item($i);
    $itas = $el_file->getElementsByTagName('TITLE');
    foreach ($itas as $ita){
    $el_title=$ita->nodeValue;
    }
    $bodyData=$el_file->getElementsByTagName('COMMENT');
    foreach ($bodyData as $bodyD){
    $el_comment=$bodyD->nodeValue;
    }
    print iconv("UTF-8", "WINDOWS-1251",
    $el_file->getAttribute('name').', '
    . $el_file->getAttribute('date').', '
    . $el_file->getAttribute('account').'<h3>'
    . $el_title.'</h3>'.'<p>'
    . $el_comment.'</p>');
    }


    Спасибо;)

Пожалуйста, авторизуйтесь, чтобы написать комментарий!