parent
d22360dd89
commit
bf0d9ebebd
@ -0,0 +1,132 @@ |
||||
<?php |
||||
|
||||
declare(strict_types=1); |
||||
|
||||
/** |
||||
* @author Robert Strutts <Bob_586@Yahoo.com> |
||||
* @copyright (c) 2025, Robert Strutts |
||||
* @license MIT |
||||
*/ |
||||
|
||||
namespace CodeHydrater; |
||||
|
||||
class rss_feed { |
||||
|
||||
public static function generate_rss_feed(array $root, array $items) { |
||||
|
||||
// Create the XML document |
||||
$rss = new \DOMDocument('1.0', 'UTF-8'); |
||||
$rss->formatOutput = true; |
||||
|
||||
// Create the RSS root element |
||||
$rssElement = $rss->createElement('rss'); |
||||
$rssElement->setAttribute('version', '2.0'); |
||||
$rssElement->setAttribute('xmlns:atom', 'http://www.w3.org/2005/Atom'); |
||||
$rssRoot = $rss->appendChild($rssElement); |
||||
|
||||
// Create the channel element |
||||
$channel = $rss->createElement('channel'); |
||||
$channel = $rssRoot->appendChild($channel); |
||||
|
||||
// Add atom:link for self-reference |
||||
$atomLink = $rss->createElement('atom:link'); |
||||
$rss_feed_link = $root['feed_link'] ?? false; |
||||
if ($rss_feed_link === false) { |
||||
throw new \Exception("Unknown Feed Link"); |
||||
} |
||||
$atomLink->setAttribute('href', $rss_feed_link); |
||||
$atomLink->setAttribute('rel', 'self'); |
||||
$atomLink->setAttribute('type', 'application/rss+xml'); |
||||
$channel->appendChild($atomLink); |
||||
|
||||
// Add required channel elements |
||||
$title = $root["title"] ?? "News"; |
||||
$channel->appendChild($rss->createElement('title', $title)); |
||||
$site_link = $root["site_link"] ?? false; |
||||
if ($site_link === false) { |
||||
throw new \Exception("Unknown Site Link"); |
||||
} |
||||
$channel->appendChild($rss->createElement('link', $site_link)); |
||||
$desc = $root["description"] ?? "Latest news from My Website"; |
||||
$channel->appendChild($rss->createElement('description', $desc)); |
||||
|
||||
// Optional channel elements |
||||
$lang = $root['lang'] ?? "en-us"; |
||||
$channel->appendChild($rss->createElement('language', $lang)); |
||||
$pub_date = $root['pub_date'] ?? date(DATE_RSS); |
||||
$channel->appendChild($rss->createElement('pubDate', $pub_date)); |
||||
$build_date = $root['last_build_date'] ?? date(DATE_RSS); |
||||
$channel->appendChild($rss->createElement('lastBuildDate', $build_date)); |
||||
$channel->appendChild($rss->createElement('generator', 'RSS Generator')); |
||||
|
||||
// Add items to the channel |
||||
foreach ($items as $itemData) { |
||||
$item = $rss->createElement('item'); |
||||
$item = $channel->appendChild($item); |
||||
|
||||
$item->appendChild($rss->createElement('title', $itemData['title'])); |
||||
$item->appendChild($rss->createElement('link', $itemData['link'])); |
||||
$item->appendChild($rss->createElement('description', $itemData['description'])); |
||||
$item->appendChild($rss->createElement('pubDate', $itemData['pubDate'])); |
||||
|
||||
// GUID should be a permalink |
||||
$guid = $rss->createElement('guid', $itemData['guid']); |
||||
$guid->setAttribute('isPermaLink', 'true'); |
||||
$item->appendChild($guid); |
||||
|
||||
// Optional item elements |
||||
if (isset($itemData['author'])) { |
||||
$item->appendChild($rss->createElement('author', $itemData['author'])); |
||||
} |
||||
} |
||||
|
||||
return $rss; |
||||
|
||||
} |
||||
|
||||
public static function save_to_xml_file(\DOMDocument $rss, string $filename = "feed") { |
||||
if (! defined("BaseDir") ) { |
||||
throw new \Exception("BaseDir not Set!"); |
||||
} |
||||
$safe_file = BaseDir . "/public/" . preg_replace('/[^A-Za-z0-9]/', '', $filename) . ".xml"; |
||||
|
||||
$result = $rss->save($safe_file); |
||||
if ($result === false) { |
||||
throw new \Exception("Failed to save RSS feed to file"); |
||||
} |
||||
|
||||
// echo "Saved XML file: " . $safe_file; |
||||
|
||||
return true; |
||||
} |
||||
|
||||
|
||||
public static function output_rss(\DOMDocument $rss): void { |
||||
// Set the content type to XML |
||||
header('Content-Type: application/rss+xml; charset=utf-8'); |
||||
echo $rss->saveXML(); |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
// Sample items - in a real application, these would come from a database |
||||
$items = [ |
||||
[ |
||||
'title' => 'First Article', |
||||
'link' => 'http://example.com/article1', |
||||
'description' => 'This is the description of the first article.', |
||||
'pubDate' => date(DATE_RSS, strtotime('-2 days')), |
||||
'guid' => 'http://example.com/article1', |
||||
'author' => 'author@example.com (John Doe)' |
||||
], |
||||
[ |
||||
'title' => 'Second Article', |
||||
'link' => 'http://example.com/article2', |
||||
'description' => 'This is the description of the second article.', |
||||
'pubDate' => date(DATE_RSS, strtotime('-1 day')), |
||||
'guid' => 'http://example.com/article2', |
||||
'author' => 'author@example.com (Jane Smith)' |
||||
] |
||||
]; |
||||
*/ |
||||
Loading…
Reference in new issue