Отображать только объект XML, если теж определенный атрибут в PHP Codeigniter

StackOverflow https://stackoverflow.com/questions/19855163

  •  29-07-2022
  •  | 
  •  

Вопрос

У меня есть следующий XML -файл:

<?xml version="1.0" ?>
<Videos>
    <video>
        <Title>Video Title</Title>
        <SubHeading>SubTitle</SubHeading>
        <url>UIIArHNaKtE</url>
        <image>image.png</image>
        <category>3</category>
        <latest>0</latest>
    </video>
    <video>
        <Title>Video Title</Title>
        <SubHeading>SubTitle</SubHeading>
        <url>UIIArHNaKtE</url>
        <image>image.png</image>
        <category>3</category>
        <latest>0</latest>
    </video>
    <video>
        <Title>Video Title</Title>
        <SubHeading>SubTitle</SubHeading>
        <url>UIIArHNaKtE</url>
        <image>image.png</image>
        <category>3</category>
        <latest>0</latest>
    </video>
</Videos>

С модельным файлом:

<?php
class xmlmodel extends CI_Model{

    public function catalog(){

    $doc = new DOMDocument();
    $path = '../application/libraries/VideoData.xml';
    $doc->load($path);//xml file loading here

    $data = $doc->getElementsByTagName('video');

    return $data;
}
}

Контроллер:

<?php

class SixD extends CI_Controller {

    public function index($sixD = 'latestadditions') {

        if (!file_exists('../application/views/page/' . $sixD . '.php')) {
            // Whoops, we don't have a page for that!
            show_404();
        }
        $this->load->model('xmlmodel');
        $data['category_catalog_entity'] = $this->xmlmodel->catalog();

        $this->lang->load('common/menu.php');
        $this->lang->load('common/headings.php');
        $this->lang->load('common/links.php');
        $this->lang->load('common/footer.php');
        $this->lang->load('page/' . $sixD . '.php');        

        $this->load->view('templates/common/header');
        $this->load->view('page/' . $sixD, $data);
        $this->load->view('templates/common/footer');
    }
}

И просмотреть:

<div class="container">
    <h1 class="pageheading">
        <?php echo lang('heading_pageheading'); ?>
    </h1>
    <hr class="heading" />
    <div class="row">
        <div class="col-sm-12">
            <div class="row">
                <div class="col-sm-8 col-lg-9">
                <?php foreach($category_catalog_entity as $result){ ?>              
                    <div class="row videopane software">
                        <div class="col-sm-7 col-sm-push-5">
                            <h3 class="pageheading"><?php echo anchor('http://youtu.be/' . $result->getElementsByTagName('url')->item(0)->nodeValue, $result->getElementsByTagName('Title')->item(0)->nodeValue . '<br /><small>' . $result->getElementsByTagName( "SubHeading" )->item(0)->nodeValue . '</small>', array('class' => 'fancybox-media'));?></h3>
                        </div>
                        <div class="col-sm-5 col-sm-pull-7 text-center">
                        <?php echo anchor('http://youtu.be/' . $result->getElementsByTagName('url')->item(0)->nodeValue . '?autoplay=1', img("Thumbnails/" . $result->getElementsByTagName('image')->item(0)->nodeValue,  $result->getElementsByTagName('Title')->item(0)->nodeValue,  $result->getElementsByTagName('Title')->item(0)->nodeValue, "img-responsive img-thumbnail"), array('class' => 'fancybox-media')); ?>
                        </div>
                    </div>
                <?php }
                } ?>
                </div>              
                <div class="col-sm-4 col-lg-3 software">
                    <?php $this->load->view('modules/menu'); ?>
                </div>
            </div>
        </div>
    </div>
</div>

Все это работает, однако я хочу определить, какая видео отображает на какой странице, поэтому у меня есть 2 тега:

<category>3</category>
<latest>1</latest>

И то, что я хочу сделать, это иметь все видео, которые имеют категорию 3, чтобы отображать на этой странице, и игнорировать любой другой номер категории. Последний тег используется для новых видео, так что это будет либо 1 для активного, либо 0 для не отображения.

Я должен указать, что на каждой странице есть отдельная страница просмотра, но в основном используется один и тот же формат. Там нет базы данных, поэтому я использую XML для управления этим, если кто -то может дать мне некоторые указатели, будет очень полезным.

Это было полезно?

Решение 2

ОК Решено.

<Videos>
    <video type="Module">
        <Title>TITLE</Title>
        <SubHeading>SUBHEADING</SubHeading>
        <url>YOUTUBECODE</url>
        <image>IMAGE.png</image>
        <description>DESCRIPTIOM</description>
        <link><![CDATA[<a href="/URL"><i class='fa-li fa fa-angle-double-right'></i>LINK</a>]]></link>
        <link2><![CDATA[<a href="/URL"><i class='fa-li fa fa-angle-double-right'></i>LINK</a>]]></link2>
    </video>
    <video type="Module" id="1">
        <Title>TITLE</Title>
        <SubHeading>SUBHEADING</SubHeading>
        <url>YOUTUBECODE</url>
        <image>IMAGE.png</image>
        <description>DESCRIPTIOM</description>
        <link><![CDATA[<a href="/URL"><i class='fa-li fa fa-angle-double-right'></i>LINK</a>]]></link>
        <link2><![CDATA[<a href="/URL"><i class='fa-li fa fa-angle-double-right'></i>LINK</a>]]></link2>
    </video>
    <video type="Common" id="1">
        <Title>TITLE</Title>
        <SubHeading>SUBHEADING</SubHeading>
        <url>YOUTUBECODE</url>
        <image>IMAGE.png</image>
        <description>DESCRIPTIOM</description>
        <link><![CDATA[<a href="/URL"><i class='fa-li fa fa-angle-double-right'></i>LINK</a>]]></link>
        <link2><![CDATA[<a href="/URL"><i class='fa-li fa fa-angle-double-right'></i>LINK</a>]]></link2>
    </video>
</Videos>

Это позволило мне отображать индивидуальные «видео» на страницах, которые я хотел. С использованием:

<div class="col-sm-8 col-lg-9">
                    <?php if(file_exists('../application/libraries/VideoData.xml')) {
                        $xml = simplexml_load_file('../application/libraries/VideoData.xml');
                        $count = 0;
                        $counts = 0;
                        foreach($xml->children() as $child) {
                            $role = $child->attributes(); { 
                                if($role["1"])
                                    echo('<div class="media thumbnail software"><div class="' . (++$counts%2 ? "col-sm-5 text-center" : "col-sm-5 col-sm-push-7 text-center") . '">' . anchor('http://youtu.be/' . $child->url . '?autoplay=1', img("Thumbnails/" . $child->image,  $child->Title,  $child->Title, "media-object img-responsive img-thumbnail"), array('class' => 'fancybox-media')) . '</div><div class="media-body ' . (++$count%2 ? "col-sm-7" : "col-sm-7 col-sm-pull-5") . '"><h3 class="media-heading pageheading">'.anchor('http://youtu.be/' . $child->url . '?autoplay=1', $child->Title . '<br /><small>' . $child->SubHeading . '</small>', array('class' => 'fancybox-media')) . '</h3><hr class="heading"><p>'. $child->description .'</p><ul class="fa-ul"><li>' . $child->link .'</li></ul></div></div>');
                            }
                        }
                    } ?>
                </div>

Или же:

<div class="col-sm-8 col-lg-9">
                    <?php if(file_exists('../application/libraries/VideoData.xml')) {
                        $xml = simplexml_load_file('../application/libraries/VideoData.xml');
                        $count = 0;
                        $counts = 0;
                        foreach($xml->children() as $child) {
                            $role = $child->attributes(); { 
                                if($role == "Module")
                                    echo('<div class="media thumbnail software"><div class="' . (++$counts%2 ? "col-sm-5 text-center" : "col-sm-5 col-sm-push-7 text-center") . '">' . anchor('http://youtu.be/' . $child->url . '?autoplay=1', img("Thumbnails/" . $child->image,  $child->Title,  $child->Title, "media-object img-responsive img-thumbnail"), array('class' => 'fancybox-media')) . '</div><div class="media-body ' . (++$count%2 ? "col-sm-7" : "col-sm-7 col-sm-pull-5") . '"><h3 class="media-heading pageheading">'.anchor('http://youtu.be/' . $child->url . '?autoplay=1', $child->Title . '<br /><small>' . $child->SubHeading . '</small>', array('class' => 'fancybox-media')) . '</h3><hr class="heading"><p>'. $child->description .'</p><ul class="fa-ul"><li>' . $child->link2 .'</li></ul></div></div>');
                            }
                        }
                    } ?>
                </div>

В зависимости от того, что я хотел показать. Спасибо за помощь Курна, так как это заставило меня взглянуть на разные способы достижения этого и в итоге использовал:

http://us3.php.net/manual/en/simplexmlelement.attributes.php#113164

Чтобы помочь мне. Надеюсь, это поможет кому -либо еще :)

Другие советы

Я не знаю, как вы справляетесь с всем случаем с видами/моделями. Но с фактической архитектурой вы не получите желаемый результат.

Теперь я сделал быструю и грязную версию, как бы я это реализовал.

public function catalog($category_id = 1)
{
    $data = array();

    //$path = '../application/libraries/VideoData.xml';
    $path = '1.xml';
    $xml = simplexml_load_file($path);
    $json = json_encode($xml);
    $array = json_decode($json, TRUE);

    foreach ($array['video'] as $video)
    {
        if ($video['category'] == $category_id)
        {
            $data[] = $video;
        }
    }

    return $data;
}

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

Таким образом, вы можете позвонить в свой контроллер с помощью категории URL-адреса и вернуть только отфильтрованный результат в вашу точку зрения

*РЕДАКТИРОВАТЬ: Как я уже сказал

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top