Commit b0da597e by Scott

Coding style (Joomla integration)

Also merge Joomla helper into external users file.
parent 45960521
......@@ -25,7 +25,6 @@ if (!defined('QA_VERSION')) { // don't allow this page to be requested directly
exit;
}
require('qa-joomla-helper.php');
function qa_get_mysql_user_column_type()
{
......@@ -50,19 +49,29 @@ function qa_get_logged_in_user()
$user = $jhelper->get_user();
$config_urls = $jhelper->trigger_get_urls_event();
if($user) {
if($user->guest || $user->block) {
if ($user) {
if ($user->guest || $user->block) {
return null;
}
$access = $jhelper->trigger_access_event($user);
$level = QA_USER_LEVEL_BASIC;
if($access['post']) {$level = QA_USER_LEVEL_APPROVED;}
if($access['edit']) {$level = QA_USER_LEVEL_EDITOR;}
if($access['mod']) {$level = QA_USER_LEVEL_MODERATOR;}
if($access['admin']) {$level = QA_USER_LEVEL_ADMIN;}
if($access['super'] || $user->get('isRoot')) {$level = QA_USER_LEVEL_SUPER;}
if ($access['post']) {
$level = QA_USER_LEVEL_APPROVED;
}
if ($access['edit']) {
$level = QA_USER_LEVEL_EDITOR;
}
if ($access['mod']) {
$level = QA_USER_LEVEL_MODERATOR;
}
if ($access['admin']) {
$level = QA_USER_LEVEL_ADMIN;
}
if ($access['super'] || $user->get('isRoot')) {
$level = QA_USER_LEVEL_SUPER;
}
$teamGroup = $jhelper->trigger_team_group_event($user);
......@@ -82,7 +91,7 @@ function qa_get_user_email($userid)
$jhelper = new qa_joomla_helper();
$user = $jhelper->get_user($userid);
if($user) {
if ($user) {
return $user->email;
}
......@@ -92,9 +101,9 @@ function qa_get_user_email($userid)
function qa_get_userids_from_public($publicusernames)
{
$output = array();
if(count($publicusernames)) {
if (count($publicusernames)) {
$jhelper = new qa_joomla_helper();
foreach($publicusernames as $username) {
foreach ($publicusernames as $username) {
$output[$username] = $jhelper->get_userid($username);
}
}
......@@ -104,11 +113,10 @@ function qa_get_userids_from_public($publicusernames)
function qa_get_public_from_userids($userids)
{
$output = array();
if(count($userids)) {
if (count($userids)) {
$jhelper = new qa_joomla_helper();
foreach($userids as $userID) {
foreach ($userids as $userID) {
$user = $jhelper->get_user($userID);
$teamGroup = $jhelper->trigger_team_group_event($user);
$output[$userID] = $user->username;
}
}
......@@ -117,8 +125,8 @@ function qa_get_public_from_userids($userids)
function qa_get_logged_in_user_html($logged_in_user, $relative_url_prefix)
{
$publicusername=$logged_in_user['publicusername'];
return '<a href="'.qa_path_html('user/'.$publicusername).'" class="qa-user-link">'.htmlspecialchars($publicusername).'</a>';
$publicusername = $logged_in_user['publicusername'];
return '<a href="' . qa_path_html('user/' . $publicusername) . '" class="qa-user-link">' . htmlspecialchars($publicusername) . '</a>';
}
function qa_get_users_html($userids, $should_include_link, $relative_url_prefix)
......@@ -131,7 +139,7 @@ function qa_get_users_html($userids, $should_include_link, $relative_url_prefix)
$usershtml[$userid] = htmlspecialchars($publicusername);
if ($should_include_link) {
$usershtml[$userid]='<a href="'.qa_path_html('user/'.$publicusername).'" class="qa-user-link">'.$usershtml[$userid].'</a>';
$usershtml[$userid] = '<a href="' . qa_path_html('user/' . $publicusername) . '" class="qa-user-link">' . $usershtml[$userid] . '</a>';
}
}
......@@ -145,7 +153,7 @@ function qa_avatar_html_from_userid($userid, $size, $padding)
$avatarHTML = $avatarURL ? "<img src='{$avatarURL}' class='qa-avatar-image' alt=''/>" : '';
if ($padding) {
//If $padding is true, the HTML you return should render to a square of $size x $size pixels, even if the avatar is not square.
// If $padding is true, the HTML you return should render to a square of $size x $size pixels, even if the avatar is not square.
$avatarHTML = "<span style='display:inline-block; width:{$size}px; height:{$size}px; overflow:hidden;'>{$avatarHTML}</span>";
}
return $avatarHTML;
......@@ -157,6 +165,173 @@ function qa_user_report_action($userid, $action)
$jhelper->trigger_log_event($userid, $action);
}
/*
Omit PHP closing tag to help avoid accidental output
*/
/**
* Link to Joomla app.
*/
class qa_joomla_helper
{
private $app;
public function __construct()
{
$this->find_joomla_path();
$this->load_joomla_app();
}
private function find_joomla_path()
{
// JPATH_BASE must be defined for Joomla to work
if (!defined('JPATH_BASE')) {
define('JPATH_BASE', QA_FINAL_JOOMLA_INTEGRATE_PATH);
}
}
private function load_joomla_app()
{
// This will define the _JEXEC constant that will allow us to access the rest of the Joomla framework
if (!defined('_JEXEC')) {
define('_JEXEC', 1);
}
require_once(JPATH_BASE . '/includes/defines.php');
require_once(JPATH_BASE . '/includes/framework.php');
// Instantiate the application.
$this->app = JFactory::getApplication('site');
// Initialise the application.
$this->app->initialise();
}
public function get_app()
{
return $this->app;
}
public function get_user($userid = null)
{
return JFactory::getUser($userid);
}
public function get_userid($username)
{
return JUserHelper::getUserId($username);
}
public function trigger_access_event($user)
{
return $this->trigger_joomla_event('onQnaAccess', array($user));
}
public function trigger_team_group_event($user)
{
return $this->trigger_joomla_event('onTeamGroup', array($user));
}
public function trigger_get_urls_event()
{
return $this->trigger_joomla_event('onGetURLs', array());
}
public function trigger_get_avatar_event($userid, $size)
{
return $this->trigger_joomla_event('onGetAvatar', array($userid, $size));
}
public function trigger_log_event($userid, $action)
{
return $this->trigger_joomla_event('onWriteLog', array($userid, $action), false);
}
private function trigger_joomla_event($event, $args = array(), $expectResponse = true)
{
JPluginHelper::importPlugin('q2a');
$dispatcher = JEventDispatcher::getInstance();
$results = $dispatcher->trigger($event, $args);
if ($expectResponse && (!is_array($results) || count($results) < 1)) {
// no Q2A plugins installed in Joomla, so we'll have to resort to defaults
$results = $this->default_response($event, $args);
}
return array_pop($results);
}
private function default_response($event, $args)
{
return array(qa_joomla_default_integration::$event($args));
}
}
/**
* Implements the same methods as a Joomla plugin would implement, but called locally within Q2A.
* This is intended as a set of default actions in case no Joomla plugin has been installed. It's
* recommended to install the Joomla QAIntegration plugin for additional user-access control.
*/
class qa_joomla_default_integration
{
/**
* If you're relying on the defaults, you must make sure that your Joomla instance has the following pages configured.
*/
public static function onGetURLs()
{
$login = 'index.php?option=com_users&view=login';
$logout = 'index.php?option=com_users&task=user.logout&' . JSession::getFormToken() . '=1&return=' . urlencode(base64_encode('index.php'));
$reg = 'index.php?option=com_users&view=registration';
return array(
// undo Joomla's escaping of characters since Q2A also escapes
'login' => htmlspecialchars_decode(JRoute::_($login)),
'logout' => htmlspecialchars_decode(JRoute::_($logout)),
'reg' => htmlspecialchars_decode(JRoute::_($reg)),
'denied' => htmlspecialchars_decode(JRoute::_('index.php')),
);
}
/**
* Return the access levels available to the user. A proper Joomla plugin would allow you to fine tune this in as much
* detail as you needed, but this default method can only look at the core Joomla system permissions and try to map
* those to the Q2A perms. Not ideal; enough to get started, but recommend switching to the Joomla plugin if possible.
*/
public static function onQnaAccess(array $args)
{
list($user) = $args;
return array(
'view' => true,
'post' => !($user->guest || $user->block),
'edit' => $user->authorise('core.edit'),
'mod' => $user->authorise('core.edit.state'),
'admin' => $user->authorise('core.manage'),
'super' => $user->authorise('core.admin') || $user->get('isRoot'),
);
}
/**
* Return the group name (if any) that was responsible for granting the user access to the given view level.
* For this default method, we just won't return anything.
*/
public static function onTeamGroup($args)
{
list($user) = $args;
return null;
}
/**
* This method would be used to ask Joomla to supply an avatar for a user.
* For this default method, we just won't do anything.
*/
public static function onGetAvatar($args)
{
list($userid, $size) = $args;
return null;
}
/**
* This method would be used to notify Joomla of a Q2A action, eg so it could write a log entry.
* For this default method, we just won't do anything.
*/
public static function onWriteLog($args)
{
list($userid, $action) = $args;
return null;
}
}
<?php
/*
Question2Answer by Gideon Greenspan and contributors
http://www.question2answer.org/
File: qa-include/qa-external-users-joomla.php
Description: External user functions for basic Joomla integration
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
More about this license: http://www.question2answer.org/license.php
*/
/**
* Link to Joomla app.
*/
class qa_joomla_helper {
private $app;
public function __construct()
{
$this->find_joomla_path();
$this->load_joomla_app();
}
private function find_joomla_path()
{
// JPATH_BASE must be defined for Joomla to work
if (!defined('JPATH_BASE')) {
define('JPATH_BASE', QA_FINAL_JOOMLA_INTEGRATE_PATH);
}
}
private function load_joomla_app()
{
// This will define the _JEXEC constant that will allow us to access the rest of the Joomla framework
if (!defined('_JEXEC')) {
define('_JEXEC', 1);
}
require_once(JPATH_BASE.'/includes/defines.php' );
require_once(JPATH_BASE.'/includes/framework.php' );
// Instantiate the application.
$this->app = JFactory::getApplication('site');
// Initialise the application.
$this->app->initialise();
}
public function get_app()
{
return $this->app;
}
public function get_user($userid = null)
{
return JFactory::getUser($userid);
}
public function get_userid($username)
{
return JUserHelper::getUserId($username);
}
function trigger_access_event($user)
{
return $this->trigger_joomla_event('onQnaAccess', array($user));
}
function trigger_team_group_event($user)
{
return $this->trigger_joomla_event('onTeamGroup', array($user));
}
function trigger_get_urls_event()
{
return $this->trigger_joomla_event('onGetURLs', array());
}
function trigger_get_avatar_event($userid, $size)
{
return $this->trigger_joomla_event('onGetAvatar', array($userid, $size));
}
function trigger_log_event($userid, $action)
{
return $this->trigger_joomla_event('onWriteLog', array($userid, $action), false);
}
private function trigger_joomla_event($event, $args = array(), $expectResponse = true)
{
JPluginHelper::importPlugin('q2a');
$dispatcher = JEventDispatcher::getInstance();
$results = $dispatcher->trigger($event, $args);
if ($expectResponse && (!is_array($results) || count($results) < 1)) {
//no Q2A plugins installed in Joomla, so we'll have to resort to defaults
$results = $this->default_response($event, $args);
}
return array_pop($results);
}
private function default_response($event, $args)
{
return array(qa_joomla_default_integration::$event($args));
}
}
/**
* Implements the same methods as a Joomla plugin would implement, but called locally within Q2A.
* This is intended as a set of default actions in case no Joomla plugin has been installed. It's
* recommended to install the Joomla QAIntegration plugin for additional user-access control.
*/
class qa_joomla_default_integration
{
/**
* If you're relying on the defaults, you must make sure that your Joomla instance has the following pages configured.
*/
public static function onGetURLs()
{
$login = 'index.php?option=com_users&view=login';
$logout = 'index.php?option=com_users&task=user.logout&'.JSession::getFormToken().'=1&return='.urlencode(base64_encode('index.php'));
$reg = 'index.php?option=com_users&view=registration';
return array(
// undo Joomla's escaping of characters since Q2A also escapes
'login' => htmlspecialchars_decode(JRoute::_($login)),
'logout' => htmlspecialchars_decode(JRoute::_($logout)),
'reg' => htmlspecialchars_decode(JRoute::_($reg)),
'denied' => htmlspecialchars_decode(JRoute::_('index.php')),
);
}
/**
* Return the access levels available to the user. A proper Joomla plugin would allow you to fine tune this in as much
* detail as you needed, but this default method can only look at the core Joomla system permissions and try to map
* those to the Q2A perms. Not ideal; enough to get started, but recommend switching to the Joomla plugin if possible.
*/
public static function onQnaAccess(array $args)
{
list($user) = $args;
return array(
'view' => true,
'post' => !($user->guest || $user->block),
'edit' => $user->authorise('core.edit'),
'mod' => $user->authorise('core.edit.state'),
'admin'=> $user->authorise('core.manage'),
'super'=> $user->authorise('core.admin') || $user->get('isRoot'),
);
}
/**
* Return the group name (if any) that was responsible for granting the user access to the given view level.
* For this default method, we just won't return anything.
*/
public static function onTeamGroup($args)
{
list($user) = $args;
return null;
}
/**
* This method would be used to ask Joomla to supply an avatar for a user.
* For this default method, we just won't do anything.
*/
public static function onGetAvatar($args)
{
list($userid, $size) = $args;
return null;
}
/**
* This method would be used to notify Joomla of a Q2A action, eg so it could write a log entry.
* For this default method, we just won't do anything.
*/
public static function onWriteLog($args)
{
list($userid, $action) = $args;
return null;
}
}
/*
Omit PHP closing tag to help avoid accidental output
*/
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment