XML - Новостная лента

Discussion in 'PHP' started by Lionis, 22 Dec 2008.

  1. Lionis

    Lionis Member

    Joined:
    13 Dec 2008
    Messages:
    94
    Likes Received:
    7
    Reputations:
    0
    XML - Новостная лента (help за символические WMZ)

    Мне нужен скрипт - новостное ленты работающей не с MySQL а с XML .
    Скрипт вида :
    1.Главная страница
    [отображение новостей : название новости , кратное описание ]
    [​IMG]
    2.Открытая новость
    [Полное описание + фото,переход между новостями]
    [​IMG]
    3.Админ панель
    [отображение загруженных новостей - (удаление/редактирование)
    Добавление новости:
    Название новости
    Краткое описание
    Полное описание
    Добавление изображения]
    [​IMG]
    4.Редактирование
    [отображение загруженных новостей - (удаление/редактирование)
    Добавление новости:
    Редактирование названия новости
    Редактирование краткого описания
    Редактирование полного описания
    Выбор нового загружаемого изображения]
    [​IMG]

    _______________________________________________

    У кого есть скрипт подобного рода , работающий с XML
    или же способен создать.
    Буду рад каждому ответу .
    спасибо .
     
    #1 Lionis, 22 Dec 2008
    Last edited: 22 Dec 2008
    1 person likes this.
  2. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Тут почитай:

    http://www.linuxcenter.ru/lib/articles/programming/xml_news.phtml

    http://www.realcoding.net/article/view/4182
     
    #2 Pashkela, 22 Dec 2008
    Last edited: 22 Dec 2008
  3. Lionis

    Lionis Member

    Joined:
    13 Dec 2008
    Messages:
    94
    Likes Received:
    7
    Reputations:
    0
    ___
    спасибо большое - но там слишком просто .
    Надо именно под мои требования :
    Кто поможет - в знак благодарности дам 3 WMZ - это все что есть .
     
  4. ss88

    ss88 Banned

    Joined:
    27 Nov 2008
    Messages:
    160
    Likes Received:
    44
    Reputations:
    5
    Если хочешь, могу сделать несложную структуру документа и класс, который будет располагать средствами обработки... Но без XSLT
     
  5. FeoЩту

    FeoЩту New Member

    Joined:
    13 Nov 2008
    Messages:
    29
    Likes Received:
    4
    Reputations:
    0
    зачем тут XSLT??
    по сабжу - http://ua2.php.net/manual/ru/book.simplexml.php
     
  6. ss88

    ss88 Banned

    Joined:
    27 Nov 2008
    Messages:
    160
    Likes Received:
    44
    Reputations:
    5
    Потому что в примерах, которые привел Pashkella юзается еще и XSLT
    А SimpleXML я обычно не пользуюсь, пусть он простой и быстрый, но не совсем универсальный, а юзаю DOM.
     
  7. -Hormold-

    -Hormold- Кто, если не ты?

    Joined:
    29 Sep 2007
    Messages:
    418
    Likes Received:
    290
    Reputations:
    44
    Для редактирования тебе их нужно заносить в файл или mysql.
    Напиши в icq. Всё расскажу, возможно сделаю!
     
  8. ss88

    ss88 Banned

    Joined:
    27 Nov 2008
    Messages:
    160
    Likes Received:
    44
    Reputations:
    5
    PHP:
    <?php
    /*****************************************************************************
     * класс для работы с новостной лентой. автор - ss88                         *
     ***************************************************************************** 
     */
    class newsList
    {
        protected 
    $newsList,//массив со всеми выбранными новостями 
                    
    $xDoc,//xml-документ
                    
    $newsNodeList,
                    
    $newsCount,//количество новостей в базе
                    
    $newsPerPage,//кол-во новостей на страницу
                    
    $fileName,//имя файла базы
                    
    $maxId;//максимальный из присутствующих идентификаторов
        //конструктор            
        
    function __construct($filename,$newsPerPage)
        {
            if(
    file_exists($filename))
                
    $this->xDoc=new DOMDocument();
            else 
                echo 
    "Ошибка открытия файла";
                
            
    $this->newsPerPage=$newsPerPage;
            
    $this->fileName=$filename;
            
    //открыть базу
            
    $this->xDoc->load($this->fileName);
            
    $this->xDoc->formatOutput=TRUE;
            
    //получить корневую часть
            
    $this->newsNodeList=$this->xDoc->getElementsByTagName("newsItem");    
            
    //чтение и инициализация
            
    $this->initRead();
        }
        
        
    //получить весь список новостей
        
    function getAllNews()
        {
            return 
    $this->newsList;
        }
        
        
    //получить новость по идентификатору
        
    function getById($id)
        {
            if(
    $this->newsCount<1)
                return 
    NULL;
            else 
            {
                foreach(
    $this->newsList as $oneItem)
                    if(
    $oneItem['id']==$id)
                        return 
    $oneItem;
                return 
    NULL;
            }
        }
        
        
    //получить страницу
        
    function getPage($pageNum)
        {
            if((
    $this->newsCount $this->newsPerPage*($pageNum-1))>0)
            {
                
    $arPage=array();
                for(
    $i=$this->newsPerPage*($pageNum-1);isset($this->newsList[$i])&&($i<$this->newsPerPage*($pageNum-1)+$this->newsPerPage);$i++)
                    
    array_push($arPage,$this->newsList[$i]);
                return 
    $arPage;
            }
            else 
                return 
    NULL;
        }
        
        
    //редактировать новость
        
    function editItem($id,$bind)
        {
            if(
    $item=$this->getById($id))
            {
                for(
    $i=0;$i<$this->newsNodeList->length;$i++)
                    if((
    $this->newsNodeList->item($i)->childNodes->item(0)->nodeValue)==$id)
                    {
                        
    $oldNode=$this->newsNodeList->item($i);
                        if(
    $i!=$this->newsNodeList->length-1)
                            
    $nextNode=$this->newsNodeList->item($i);
                        break;
                    }
                
    $newNode=$this->makeNewNode($bind,$id);
                
                
    $bigNode=$this->xDoc->getElementsByTagName("newsList")->item(0);
                
    $bigNode->replaceChild($newNode,$oldNode);
                
                
    $this->xDoc->save($this->fileName);
                
    $this->initRead();
                
                return 
    $this->getById($id);
            }
            else
                return 
    NULL;
        }
        
        
    //добавить новость
        
    function addItem($bind)
        {
            if(!
    is_array($bind))
                return 
    NULL;
            else 
            {
                
    $newNode=$this->makeNewNode($bind);
                
                
    $bigNode=$this->xDoc->getElementsByTagName("newsList")->item(0);
                
    $bigNode->appendChild($newNode);
                
                
    $this->xDoc->save($this->fileName);
                
    $this->initRead();
                
                return 
    $this->getById($this->maxId);
            }
        }
        
        
    //удалить новость
        
    function removeItem($id)
        {
            if(
    $this->getById($id))
            {
                for(
    $i=0;$i<$this->newsNodeList->length;$i++)
                    if((
    $this->newsNodeList->item($i)->childNodes->item(0)->nodeValue)==$id)
                    {
                        
    $delNode=$this->newsNodeList->item($i);
                        break;
                    }
                
    $bigNode=$this->xDoc->getElementsByTagName("newsList")->item(0);
                
    $bigNode->removeChild($delNode);
                
    $this->xDoc->save($this->fileName);
            }
            else
                return 
    FALSE;
        }
        
        
    //сервисная защищенная функция для формирования nod'а
        
    protected function makeNewNode($bind,$id=-1)
        {
                
    $newNode=$this->xDoc->createElement("newsItem");
                
    $newNode->appendChild($this->xDoc->createElement("id",($id==-1)?($this->maxId+1):$id));
                
    $newNode->appendChild($this->xDoc->createElement("name",$bind['title']));
                
    $newNode->appendChild($this->xDoc->createElement("shortDescription",$bind['description']));
                
    $newNode->appendChild($this->xDoc->createElement("extDescription",$bind['extDescription']));
                
    $newNode->appendChild($this->xDoc->createElement("pictureFile",$bind['picture']));
                
    $newNode->appendChild($this->xDoc->createElement("date",$bind['date']));
                return 
    $newNode;
        }
        
    //защищенная ф-ция. чтение и инициализация, всего, что связано с новостями
        
    protected function initRead()
        {
            
            
    $this->newsList=array();
            if(!
    $this->newsNodeList->length)
                return;
            else
            {
                
    $this->maxId=-1;
                for(
    $i=0$i<$this->newsNodeList->length;$i++)
                {
                    
    $xItem=$this->newsNodeList->item($i);
                    if(
    $this->maxId<$xItem->childNodes->item(0)->nodeValue)
                        
    $this->maxId=$xItem->childNodes->item(0)->nodeValue;
                    
    $oneItem=array
                                (
                                
    "id"=>$xItem->childNodes->item(0)->nodeValue,
                                
    "title"=>$xItem->childNodes->item(1)->nodeValue,
                                
    "description"=>$xItem->childNodes->item(2)->nodeValue,
                                
    "extDescription"=>$xItem->childNodes->item(3)->nodeValue,
                                
    "picture"=>$xItem->childNodes->item(4)->nodeValue,
                                
    "date"=>$xItem->childNodes->item(5)->nodeValue
                                
    );
                     
    array_push($this->newsList,$oneItem);
                }
                
    $this->newsCount=count($this->newsList);
            }
        }
    }
    ?>
    Вот такой вот примерчик работы с новостями без БД. Конечно, он сделан на скорую руку и оптимальностью не блещет, но пригоден для использования. Для оптимизации (если, например, разведется несколько тысяч новостей) можно для чтения файла использовать более шустрый, нежели DOM, интерфейся, благо, парочка таких альтернатив имеется + нужно уже будет вычитывать не всю базу, а кусками, потому что ресурсы сервера нихрена не резиновые.
    xml
    PHP:
    <?xml version="1.0"?>
    <newsList>
        <newsItem><id>1</id><name>Edited Name Of First Item 666</name><shortDescription>
            short decription of the first item
            </shortDescription><extDescription>
            extended decription of the first item
            </extDescription><pictureFile>
            1.jpg
            </pictureFile><date>10.10.1666</date></newsItem>
        
        <newsItem><id>2</id><name>Edited Name</name><shortDescription>
            short decription of the SECOND item
            </shortDescription><extDescription>
            extended decription of the SECOND item
            </extDescription><pictureFile>
            2.jpg
            </pictureFile><date>10.11.1666</date></newsItem>
    <newsItem><id>3</id><name>We wish to work well</name><shortDescription>
            short decription of the first item
            </shortDescription><extDescription>
            extended decription of the first item
            </extDescription><pictureFile>
            1.jpg
            </pictureFile><date>10.10.1666</date></newsItem>
    </newsList>
    Вот так выглядит сам файл с новостями
     
    1 person likes this.
  9. fucker"ok

    fucker"ok Elder - Старейшина

    Joined:
    21 Nov 2004
    Messages:
    580
    Likes Received:
    279
    Reputations:
    91
  10. FeoЩту

    FeoЩту New Member

    Joined:
    13 Nov 2008
    Messages:
    29
    Likes Received:
    4
    Reputations:
    0
    покажи где ты это увидел?
     
  11. ss88

    ss88 Banned

    Joined:
    27 Nov 2008
    Messages:
    160
    Likes Received:
    44
    Reputations:
    5
    раззуй глаза и посмотри
    Ну конечно же можно было ;) Хотя, иногда полезно их изобретать, например, для освежения мозга, просто для разминки. А XML-Parser я и сам раньше юзал, сейчас обхожусь Zend_Dom, мне хватает :)
     
    #11 ss88, 22 Dec 2008
    Last edited: 22 Dec 2008