WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   merge feeds med ID åt varje feed... (https://www.wn.se/forum/showthread.php?t=29884)

Mortekai 2008-06-12 22:31

Vi testar och ser om det finns någon här med lite PHP vana som kan knäcka mitt lilla problem, för här går jag bet :)

Jag håller på att lägga in en samlad RSS feed genom magpie och allt fungerar fint, men nu vill jag ge varje item en egen klass så jag sedan kan styla varje item beroende på vilken feed den tillhör...där blir det lite svårare :)

Så här ser koden ut:
Kod:

<?php

define('MAX_ITEMS', 25);

require_once('rss_fetch.inc');

$urls = array(
    'nyheter' => 'http://www.mortfiles.se/kundcenter/announcements.xml',
        'blog' => 'http://www.mortfiles.se/blog/feed',
        'forum' => 'http://www.mortfiles.se/diskussion/index.php?act=rssout&id=5',
        'lankar' => 'http://www.mortfiles.se/lankar/rss.php?c=3&s=P&p=1',
        'itnyheter' => 'http://www.mortfiles.se/nyheter/rss'
);


$items = array();

// loop thru all urls & merge feeds into master array
foreach ( $urls as $url ) {
  $rss = fetch_rss($url);
  if (!$rss) continue;
  $items = array_merge($items, $rss->items);
}

// sort all items in array by date
usort($items, 'date_cmp');

// generate ouput array
$out = array();

foreach ($items as $item) {
  $href  = $item['link'];
  $title  = $item['title'];
  $out[] = '<li><a href="'.$href.'" title="'.$title.'">'.$title.'</a></li>';
}

if (count($out) > MAX_ITEMS)
  $out = array_slice($out,0,MAX_ITEMS);

echo ($out)
  ? "<ul>\n".join("\n",$out)."\n</ul>"
  : '';


// sorts feed array based on published date (used with usort)
// -------------------------------------------------------------
  function date_cmp($a, $b)
  {
    $atime = (empty($a['date_timestamp']))
      ? strtotime($a['dc']['date'])
      : $a['date_timestamp'];

    $btime = (empty($b['date_timestamp']))
      ? strtotime($b['dc']['date'])
      : $b['date_timestamp'];

    if ($atime == $btime)
      return 0;
 
    return ($atime > $btime) ? -1 : 1;
  }

?>

så på något sätt vill jag kunna lägga in en class i output <li class="$class"> till exempel, men jag är inte tillräckligt bra på PHP för att klura ut hur jag får in det i koden....hjälp mottages med tacksamhet :)

Osiris 2008-06-12 23:39

Nu kan inte jag ett skit PHP, men kolla på följande del:
Kod:

foreach ($items as $item) {
  $href  = $item['link'];
  $title  = $item['title'];
  $out[] = '<li><a href="'.$href.'" title="'.$title.'">'.$title.'</a></li>';
}

Innan ska du ha en räknare som börjar på exempelvis 0.
I foreach-satsen sätter du upp värdet på räknaren med 1 för varje varv.
Ändra i $out[] = '[*]...'; till, typ, $out[] = '<li class='itemRÄKNARE'>...';

Sedan fixar du i CSS:en så den har item0, item1, item2 etcetera.

Drew 2008-06-12 23:42

Det hela skulle kunna göras mycket enklare. Men lägg till klassen i $items, du kan ju ta nyckeln från $urls.

Mortekai 2008-06-13 08:29

Osiris: Om jag förstår dig rätt så sättter du in en räknare i output, vilket ger en lista med rakt nedstigande nummer? Det jag behöver är att om item 1, 5 och 11 kommer från feed 1 så ska det läggas till en class och om det kommer från feed 2 ska en annan klass ges osv. Om jag förstår ditt exempel rätt så skulle det se ut så här:

Kod:

<li class="item1"><a href="http://...">Titel</a></li>
<li class="item2"><a href="http://...">Titel</a></li>
<li class="item3"><a href="http://...">Titel</a></li>
<li class="item4"><a href="http://...">Titel</a></li>
<li class="item5"><a href="http://...">Titel</a></li>
....

och det jag vill få till är tex (beroende på vilka feed items kommer ifrån):

Kod:

<li class="nyheter"><a href="http://...">Titel</a></li>
<li class="blog"><a href="http://...">Titel</a></li>
<li class="blog"><a href="http://...">Titel</a></li>
<li class="forum"><a href="http://...">Titel</a></li>
<li class="itnyheter"><a href="http://...">Titel</a></li>
....



Drew: Ge gärna ett exempel på hur det kan förenklas, jag inte någon expert på PHP och all hjälp mottages med tacksamhet :)

Jag är lite osäker på hur du menar att jag ska lägga till det i items, skulle du kunna visa ett exempel?

Om jag inte är helt ute och cyklar så måste en class läggas till före eller direkt i "blandaren" så att rätt feed får rätt klass?

Kod:

$items = array();

// loop thru all urls & merge feeds into master array
foreach ( $urls as $url ) {
  $rss = fetch_rss($url);
  if (!$rss) continue;
  $items = array_merge($items, $rss->items);
}


Jonathan P 2008-06-13 09:52

Kod:

<?php

define('MAX_ITEMS', 25);

require_once('rss_fetch.inc');

$urls = array(
    'nyheter' => 'http://www.mortfiles.se/kundcenter/announcements.xml',
    'blog' => 'http://www.mortfiles.se/blog/feed',
    'forum' => 'http://www.mortfiles.se/diskussion/index.php?act=rssout&id=5',
    'lankar' => 'http://www.mortfiles.se/lankar/rss.php?c=3&s=P&p=1',
    'itnyheter' => 'http://www.mortfiles.se/nyheter/rss'
);


$items = array();

// loop thru all urls & merge feeds into master array
foreach ( $urls as $class => $url ) {
  $rss = fetch_rss($url);
  if (!$rss) continue;
  $items = array_merge($items, array($class => $rss->items));
}

// sort all items in array by date
usort($items, 'date_cmp');

// generate ouput array
$out = array();

foreach ($items as $class => $item) {
  $href  = $item['link'];
  $title  = $item['title'];
  $out[] = '<li><a href="'.$href.'" title="'.$title.'" class="'.$class.'">'.$title.'</a></li>';
}

if (count($out) > MAX_ITEMS)
  $out = array_slice($out,0,MAX_ITEMS);

echo ($out)
  ? "<ul>\n".join("\n",$out)."\n</ul>"
  : '';


// sorts feed array based on published date (used with usort)
// -------------------------------------------------------------
  function date_cmp($a, $b)
  {
    $atime = (empty($a['date_timestamp']))
      ? strtotime($a['dc']['date'])
      : $a['date_timestamp'];

    $btime = (empty($b['date_timestamp']))
      ? strtotime($b['dc']['date'])
      : $b['date_timestamp'];

    if ($atime == $btime)
      return 0;
 
    return ($atime > $btime) ? -1 : 1;
  }

?>


Mortekai 2008-06-13 10:16

Fungerade inte....får inget output alls :(

Jonathan P 2008-06-13 10:50

Citat:

Originally posted by Mortekai@Jun 13 2008, 10:16
Fungerade inte....får inget output alls :(
Jag hade inte möjlighet att testa koden då jag inte har tillgång till den inkluderade filen rss_fetch.inc, men teoretiskt sätt ska korrigeringarna jag gjorde lösa ditt problem.
Kan innehålla syntax-fel dock... Skicka ett PM om du lyckas få fram ngn debug info så kan jag hjälpa dig.

Mortekai 2008-06-13 11:05

2 bifogad(e) fil(er)
Ah, förlåt, skulla ha bifogat den så klart.... :rolleyes:
Här är den.

Jag ska iväg på studentfirande, men jag återkommer så snart jag kan med debug.

Drew 2008-06-13 18:21

Det är ändingar på 2 ställen i skriptet som behöver göras (eller 4 beroende på hur du räknar).

Ändra
Kod:

// loop thru all urls & merge feeds into master array
foreach ( $urls as $url ) {
  $rss = fetch_rss($url);
  if (!$rss) continue;
  $items = array_merge($items, $rss->items);
}

till
Kod:

// loop thru all urls & merge feeds into master array
foreach ( $urls as $class => $url ) {
  $rss = fetch_rss($url);
  if (!$rss) continue;
 $rss->items = array_merge($rss->items, array('class' => $class));
  $items = array_merge($items, $rss->items);
}

Och
Kod:

foreach ($items as $item) {
  $href  = $item['link'];
  $title  = $item['title'];
  $out[] = '<li><a href="'.$href.'" title="'.$title.'">'.$title.'</a></li>';
}

till
Kod:

foreach ($items as $item) {
  $href  = $item['link'];
  $title  = $item['title'];
 $class = $item['class'];
  $out[] = '<li class="' . $class . '"><a href="'.$href.'" title="'.$title.'">'.$title.'</a></li>';
}

Då hamnar nyheter, blog, forum osv i <li class="' . $class . '">.

Mortekai 2008-06-13 19:57

Så här menar du Drew?
Kod:

<?php

define('MAX_ITEMS', 25);

require_once('rss_fetch.inc');

$urls = array(
    'nyheter' => 'http://www.mortfiles.se/kundcenter/announcements.xml',
'blog' => 'http://www.mortfiles.se/blog/feed',
'forum' => 'http://www.mortfiles.se/diskussion/index.php?act=rssout&id=5',
'lankar' => 'http://www.mortfiles.se/lankar/rss.php?c=3&s=P&p=1',
'itnyheter' => 'http://www.mortfiles.se/nyheter/rss'
);


$items = array();

// loop thru all urls & merge feeds into master array
foreach ( $urls as $class => $url ) {
 $rss = fetch_rss($url);
 if (!$rss) continue;
 $rss->items = array_merge($rss->items, array('class' => $class));
 $items = array_merge($items, $rss->items);
}

// sort all items in array by date
usort($items, 'date_cmp');

// generate ouput array
$out = array();

foreach ($items as $item) {
 $href  = $item['link'];
 $title  = $item['title'];
 $class = $item['class'];
 $out[] = '<li class="' . $class . '"><a href="'.$href.'" title="'.$title.'">'.$title.'</a></li>';
}

if (count($out) > MAX_ITEMS)
  $out = array_slice($out,0,MAX_ITEMS);

echo ($out)
  ? "<ul>\n".join("\n",$out)."\n</ul>"
  : '';


// sorts feed array based on published date (used with usort)
// -------------------------------------------------------------
  function date_cmp($a, $b)
  {
    $atime = (empty($a['date_timestamp']))
      ? strtotime($a['dc']['date'])
      : $a['date_timestamp'];

    $btime = (empty($b['date_timestamp']))
      ? strtotime($b['dc']['date'])
      : $b['date_timestamp'];

    if ($atime == $btime)
      return 0;
 
    return ($atime > $btime) ? -1 : 1;
  }

?>

Det fungerar tyvärr inte utand det blir <li class=""> utan något värde i $class...


Alla tider är GMT +2. Klockan är nu 14:56.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson