1
0
mirror of https://github.com/chylex/Nextcloud-News.git synced 2025-05-11 22:34:06 +02:00
Nextcloud-News/lib/Config/AppConfig.php
2016-07-23 21:32:42 +02:00

138 lines
3.7 KiB
PHP

<?php
/**
* Nextcloud - News
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Alessandro Cosentino <cosenal@gmail.com>
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @copyright Alessandro Cosentino 2012
* @copyright Bernhard Posselt 2012, 2014
*/
namespace OCA\News\Config;
use SimpleXMLElement;
use OCP\INavigationManager;
use OCP\IURLGenerator;
use OCP\Util;
use OCP\App;
// Used to parse app.json file, should be in core at some point
class AppConfig {
private $config;
private $navigationManager;
private $urlGenerator;
/**
* TODO: External deps that are needed:
* - add jobs
* - connect to hooks
*/
public function __construct(INavigationManager $navigationManager,
IURLGenerator $urlGenerator) {
$this->navigationManager = $navigationManager;
$this->urlGenerator = $urlGenerator;
$this->config = [];
}
/**
* Parse an xml config
*/
private function parseConfig($string) {
// no need to worry about XXE since local file
$xml = simplexml_load_string($string, 'SimpleXMLElement');
return json_decode(json_encode((array)$xml), true);
}
/**
* @param string|array $data path to the config file or an array with the
* config
*/
public function loadConfig($data) {
if(is_array($data)) {
$this->config = $data;
} else {
$this->config = $this->parseConfig($data);
}
}
/**
* @param string $key if given returns the value of the config at index $key
* @return array|mixed the config
*/
public function getConfig($key=null) {
// FIXME: is this function interface a good idea?
if($key !== null) {
return $this->config[$key];
} else {
return $this->config;
}
}
/**
* Registers all config options
*/
public function registerAll() {
$this->registerNavigation();
$this->registerHooks();
// IJob API is fucked up, so silence the code checker
$class = '\OCP\BackgroundJob';
$class::addRegularTask($this->config['cron']['job'], 'run');
App::registerAdmin($this->config['id'], $this->config['admin']);
}
/**
* Parses the navigation and creates a navigation entry if needed
*/
public function registerNavigation() {
if (array_key_exists('navigation', $this->config)) {
$this->navigationManager->add(function () {
$nav =& $this->config['navigation'];
$navConfig = [
'id' => $this->config['id'],
'order' => $nav['order'],
'name' => $nav['name']
];
$navConfig['href'] = $this->urlGenerator->linkToRoute(
$nav['route']
);
$navConfig['icon'] = $this->urlGenerator->imagePath(
$this->config['id'], $nav['icon']
);
return $navConfig;
});
}
}
/**
* Registers all hooks in the config
*/
public function registerHooks() {
// FIXME: this is temporarily static because core emitters are not
// future proof, therefore legacy code in here
foreach ($this->config['hooks'] as $hook) {
$listener = explode('::', $hook['channel']);
$reaction = explode('::', $hook['subscriber']);
// config is written like HookNamespace::method => Class::method
Util::connectHook($listener[0], $listener[1], $reaction[0],
$reaction[1]);
}
}
}