first commit
This commit is contained in:
95
class/smarty_plugins/function.insert_external_feed.php
Normal file
95
class/smarty_plugins/function.insert_external_feed.php
Normal file
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
function smarty_function_insert_external_feed($params, &$smarty)
|
||||
{
|
||||
if (empty($params['url']) || empty($params['count'])) {
|
||||
throw new InvalidArgumentException('Missing required parameter \'url\' or \'count\'');
|
||||
}
|
||||
|
||||
$default = [
|
||||
'template' => 'block.external_feed.rss.tpl',
|
||||
'cache' => 1,
|
||||
'type' => 'rss',
|
||||
'ttl' => 7200,
|
||||
'cache_key' => function ($params) {
|
||||
return ['insert_external_feed', $params['template'], $params['type'], $params['url'], $params['count']];
|
||||
},
|
||||
];
|
||||
|
||||
$params = array_merge($default, $params);
|
||||
|
||||
$params['get_data_function'] = function (&$params) {
|
||||
$feed = simplexml_load_file($params['url'], null, LIBXML_NOCDATA);
|
||||
if ($feed === false) {
|
||||
$params['ttl'] = 5;
|
||||
}
|
||||
$params['items'] = [];
|
||||
switch ($params['type']) {
|
||||
case 'rss':
|
||||
foreach ($feed->channel->item as $item) {
|
||||
$params['items'][] = xml2array($item);
|
||||
}
|
||||
break;
|
||||
case 'atom':
|
||||
foreach ($feed->entry as $item) {
|
||||
$params['items'][] = xml2array($item);
|
||||
}
|
||||
break;
|
||||
case 'heureka_review':
|
||||
foreach ($feed->review as $item) {
|
||||
$params['items'][] = xml2array($item);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new InvalidArgumentException('Type \''.$params['type'].'\' is not supported');
|
||||
}
|
||||
|
||||
$params['items'] = array_slice($params['items'], 0, $params['count']);
|
||||
};
|
||||
|
||||
if (!empty($params['template'])) {
|
||||
$smarty->loadPlugin('Smarty_function_include_cached');
|
||||
smarty_function_include_cached_optional($params, $smarty);
|
||||
}
|
||||
|
||||
if (!empty($params['assign'])) {
|
||||
if (empty($params['template'])) {
|
||||
$params['get_data_function']($params);
|
||||
}
|
||||
|
||||
$smarty->assign($params['assign'], $params);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function xml2array($xmlObject, $out = [])
|
||||
{
|
||||
foreach ((array) $xmlObject as $index => $node) {
|
||||
$out[$index] = (is_object($node) || is_array($node)) ? xml2array($node) : (string) $node;
|
||||
}
|
||||
|
||||
if (is_object($xmlObject)) {
|
||||
foreach ($xmlObject->attributes() as $name => $attribute) {
|
||||
$out["@{$name}"] = (string) $attribute;
|
||||
}
|
||||
|
||||
foreach ($xmlObject->getDocNamespaces() as $namespace) {
|
||||
foreach ($xmlObject->children($namespace) as $index => $node) {
|
||||
$out[$index] = (is_object($node) || is_array($node)) ? xml2array($node) : (string) $node;
|
||||
}
|
||||
|
||||
foreach ($xmlObject->attributes($namespace) as $name => $attribute) {
|
||||
$out["@{$name}"] = (string) $attribute;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($out as $key => $item) {
|
||||
if (is_array($item) && count($item) === 1 && key($item) == 0) {
|
||||
$out[$key] = reset($item);
|
||||
}
|
||||
}
|
||||
|
||||
return $out;
|
||||
}
|
||||
Reference in New Issue
Block a user