242 lines
6.6 KiB
PHP
242 lines
6.6 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @copyright Copyright (c) 2009-2022 Ryan Demmer. All rights reserved
|
|
* @license GNU/GPL 2 or later - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
* JCE is free software. This version may have been modified pursuant
|
|
* to the GNU General Public License, and as distributed it includes or
|
|
* is derivative of works licensed under the GNU General Public License or
|
|
* other free or open source software licenses
|
|
*/
|
|
defined('JPATH_PLATFORM') or die;
|
|
|
|
class WFLinkExtension extends WFExtension
|
|
{
|
|
/*
|
|
* @var varchar
|
|
*/
|
|
|
|
private $extensions = array();
|
|
protected static $instance;
|
|
protected static $links = array();
|
|
|
|
/**
|
|
* Constructor activating the default information of the class.
|
|
*/
|
|
public function __construct()
|
|
{
|
|
parent::__construct();
|
|
|
|
$extensions = self::loadExtensions('links');
|
|
|
|
// Load all link extensions
|
|
foreach ($extensions as $link) {
|
|
$this->extensions[] = $this->getLinkExtension($link->name);
|
|
}
|
|
|
|
$request = WFRequest::getInstance();
|
|
$request->setRequest(array($this, 'getLinks'));
|
|
}
|
|
|
|
public static function getInstance($config = array())
|
|
{
|
|
if (!isset(self::$instance)) {
|
|
self::$instance = new self($config);
|
|
}
|
|
|
|
return self::$instance;
|
|
}
|
|
|
|
public function display()
|
|
{
|
|
parent::display();
|
|
|
|
foreach ($this->extensions as $extension) {
|
|
$extension->display();
|
|
}
|
|
}
|
|
|
|
private function getLinkExtension($name)
|
|
{
|
|
if (array_key_exists($name, self::$links) === false || empty(self::$links[$name])) {
|
|
$classname = 'WFLinkBrowser_' . ucfirst($name);
|
|
// create class
|
|
if (class_exists($classname)) {
|
|
self::$links[$name] = new $classname();
|
|
}
|
|
}
|
|
|
|
return self::$links[$name];
|
|
}
|
|
|
|
public function getLists()
|
|
{
|
|
$list = array();
|
|
|
|
foreach ($this->extensions as $extension) {
|
|
if ($extension->isEnabled()) {
|
|
$list[] = $extension->getList();
|
|
}
|
|
}
|
|
|
|
return $list;
|
|
}
|
|
|
|
public function render()
|
|
{
|
|
$list = $this->getLists();
|
|
|
|
if (empty($list)) {
|
|
return '';
|
|
}
|
|
|
|
$view = $this->getView(array('name' => 'links', 'layout' => 'links'));
|
|
$view->list = implode("\n", $list);
|
|
$view->display();
|
|
}
|
|
|
|
private static function cleanInput($args, $method = 'string')
|
|
{
|
|
$filter = JFilterInput::getInstance();
|
|
|
|
foreach ($args as $k => $v) {
|
|
$args->$k = $filter->clean($v, $method);
|
|
$args->$k = (string) filter_var($args->$k, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_BACKTICK);
|
|
$args->$k = htmlspecialchars(strip_tags($args->$k));
|
|
}
|
|
|
|
return $args;
|
|
}
|
|
|
|
public function getLinks($args)
|
|
{
|
|
$args = self::cleanInput($args, 'STRING');
|
|
|
|
foreach ($this->extensions as $extension) {
|
|
if (in_array($args->option, $extension->getOption())) {
|
|
$items = $extension->getLinks($args);
|
|
}
|
|
}
|
|
$array = array();
|
|
$result = array();
|
|
if (isset($items)) {
|
|
foreach ($items as $item) {
|
|
$array[] = array(
|
|
'id' => isset($item['id']) ? self::xmlEncode($item['id']) : '',
|
|
'url' => isset($item['url']) ? self::xmlEncode($item['url']) : '',
|
|
'name' => self::xmlEncode($item['name']), 'class' => $item['class'],
|
|
);
|
|
}
|
|
$result = array('folders' => $array);
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Category function used by many extensions.
|
|
*
|
|
* @return Category list object
|
|
*
|
|
* @since 1.5
|
|
*/
|
|
public static function getCategory($section, $parent = 1)
|
|
{
|
|
$db = JFactory::getDBO();
|
|
$user = JFactory::getUser();
|
|
$wf = WFEditorPlugin::getInstance();
|
|
|
|
$query = $db->getQuery(true);
|
|
|
|
$where = array();
|
|
|
|
$version = new JVersion();
|
|
$language = $version->isCompatible('3.0') ? ', language' : '';
|
|
|
|
$where[] = 'parent_id = ' . (int) $parent;
|
|
$where[] = 'extension = ' . $db->Quote($section);
|
|
|
|
if (!$user->authorise('core.admin')) {
|
|
$where[] = 'access IN (' . implode(',', $user->getAuthorisedViewLevels()) . ')';
|
|
}
|
|
|
|
if (!$wf->checkAccess('static', 1)) {
|
|
$where[] = 'path != ' . $db->Quote('uncategorised');
|
|
}
|
|
|
|
$case = '';
|
|
|
|
if ($wf->getParam('category_alias', 1) == 1) {
|
|
//sqlsrv changes
|
|
$case = ', CASE WHEN ';
|
|
$case .= $query->charLength('alias', '!=', '0');
|
|
$case .= ' THEN ';
|
|
$a_id = $query->castAsChar('id');
|
|
$case .= $query->concatenate(array($a_id, 'alias'), ':');
|
|
$case .= ' ELSE ';
|
|
$case .= $a_id . ' END as slug';
|
|
}
|
|
|
|
$where[] = 'published = 1';
|
|
$query->select('id AS slug, id AS id, title, alias, access' . $language . $case)->from('#__categories')->where($where)->order('title');
|
|
|
|
$db->setQuery($query);
|
|
|
|
return $db->loadObjectList();
|
|
}
|
|
|
|
/**
|
|
* (Attempt to) Get an Itemid.
|
|
*
|
|
* @param string $component
|
|
* @param array $needles
|
|
*
|
|
* @return Category list object
|
|
*/
|
|
public function getItemId($component, $needles = array())
|
|
{
|
|
$match = null;
|
|
|
|
//require_once(JPATH_SITE . '/includes/application.php');
|
|
$app = JApplication::getInstance('site');
|
|
|
|
$tag = defined('JPATH_PLATFORM') ? 'component_id' : 'componentid';
|
|
|
|
$component = JComponentHelper::getComponent($component);
|
|
$menu = $app->getMenu('site');
|
|
$items = $menu->getItems($tag, $component->id);
|
|
|
|
if ($items) {
|
|
foreach ($needles as $needle => $id) {
|
|
foreach ($items as $item) {
|
|
if ((@$item->query['view'] == $needle) && (@$item->query['id'] == $id)) {
|
|
$match = $item->id;
|
|
break;
|
|
}
|
|
}
|
|
if (isset($match)) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return $match ? '&Itemid=' . $match : '';
|
|
}
|
|
|
|
/**
|
|
* XML encode a string.
|
|
*
|
|
* @param string String to encode
|
|
*
|
|
* @return string Encoded string
|
|
*/
|
|
private static function xmlEncode($string)
|
|
{
|
|
return str_replace(array('&', '<', '>', "'", '"'), array('&', '<', '>', ''', '"'), $string);
|
|
}
|
|
}
|
|
|
|
abstract class WFLinkBrowser extends WFLinkExtension
|
|
{
|
|
}
|