| Current Path : /home/w/u/e/wuectly/www/03cbe/ |
| Current File : /home/w/u/e/wuectly/www/03cbe/profile.php.tar |
home/wuectly/www/plugins/user/profile/profile.php 0000604 00000032073 15245611150 0016265 0 ustar 00 <?php
/**
* @package Joomla.Plugin
* @subpackage User.profile
*
* @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
defined('_JEXEC') or die;
use Joomla\CMS\Date\Date;
use Joomla\CMS\Factory;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Form\FormHelper;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\String\PunycodeHelper;
use Joomla\Utilities\ArrayHelper;
/**
* An example custom profile plugin.
*
* @since 1.6
*/
class PlgUserProfile extends JPlugin
{
/**
* Date of birth.
*
* @var string
* @since 3.1
*/
private $date = '';
/**
* Load the language file on instantiation.
*
* @var boolean
* @since 3.1
*/
protected $autoloadLanguage = true;
/**
* Constructor
*
* @param object &$subject The object to observe
* @param array $config An array that holds the plugin configuration
*
* @since 1.5
*/
public function __construct(& $subject, $config)
{
parent::__construct($subject, $config);
FormHelper::addFieldPath(__DIR__ . '/field');
}
/**
* Runs on content preparation
*
* @param string $context The context for the data
* @param object $data An object containing the data for the form.
*
* @return boolean
*
* @since 1.6
*/
public function onContentPrepareData($context, $data)
{
// Check we are manipulating a valid form.
if (!in_array($context, array('com_users.profile', 'com_users.user', 'com_users.registration', 'com_admin.profile')))
{
return true;
}
if (is_object($data))
{
$userId = isset($data->id) ? $data->id : 0;
if (!isset($data->profile) && $userId > 0)
{
// Load the profile data from the database.
$db = Factory::getDbo();
$db->setQuery(
'SELECT profile_key, profile_value FROM #__user_profiles'
. ' WHERE user_id = ' . (int) $userId . " AND profile_key LIKE 'profile.%'"
. ' ORDER BY ordering'
);
try
{
$results = $db->loadRowList();
}
catch (RuntimeException $e)
{
$this->_subject->setError($e->getMessage());
return false;
}
// Merge the profile data.
$data->profile = array();
foreach ($results as $v)
{
$k = str_replace('profile.', '', $v[0]);
$data->profile[$k] = json_decode($v[1], true);
if ($data->profile[$k] === null)
{
$data->profile[$k] = $v[1];
}
}
}
if (!HTMLHelper::isRegistered('users.url'))
{
HTMLHelper::register('users.url', array(__CLASS__, 'url'));
}
if (!HTMLHelper::isRegistered('users.calendar'))
{
HTMLHelper::register('users.calendar', array(__CLASS__, 'calendar'));
}
if (!HTMLHelper::isRegistered('users.tos'))
{
HTMLHelper::register('users.tos', array(__CLASS__, 'tos'));
}
if (!HTMLHelper::isRegistered('users.dob'))
{
HTMLHelper::register('users.dob', array(__CLASS__, 'dob'));
}
}
return true;
}
/**
* Returns an anchor tag generated from a given value
*
* @param string $value URL to use
*
* @return mixed|string
*/
public static function url($value)
{
if (empty($value))
{
return HTMLHelper::_('users.value', $value);
}
else
{
// Convert website URL to utf8 for display
$value = PunycodeHelper::urlToUTF8(htmlspecialchars($value));
if (strpos($value, 'http') === 0)
{
return '<a href="' . $value . '">' . $value . '</a>';
}
else
{
return '<a href="http://' . $value . '">' . $value . '</a>';
}
}
}
/**
* Returns html markup showing a date picker
*
* @param string $value valid date string
*
* @return mixed
*/
public static function calendar($value)
{
if (empty($value))
{
return HTMLHelper::_('users.value', $value);
}
else
{
return HTMLHelper::_('date', $value, null, null);
}
}
/**
* Returns the date of birth formatted and calculated using server timezone.
*
* @param string $value valid date string
*
* @return mixed
*/
public static function dob($value)
{
if (!$value)
{
return '';
}
return HTMLHelper::_('date', $value, Text::_('DATE_FORMAT_LC1'), false);
}
/**
* Return the translated strings yes or no depending on the value
*
* @param boolean $value input value
*
* @return string
*/
public static function tos($value)
{
if ($value)
{
return Text::_('JYES');
}
else
{
return Text::_('JNO');
}
}
/**
* Adds additional fields to the user editing form
*
* @param Form $form The form to be altered.
* @param mixed $data The associated data for the form.
*
* @return boolean
*
* @since 1.6
*/
public function onContentPrepareForm(Form $form, $data)
{
// Check we are manipulating a valid form.
$name = $form->getName();
if (!in_array($name, array('com_admin.profile', 'com_users.user', 'com_users.profile', 'com_users.registration')))
{
return true;
}
// Add the registration fields to the form.
Form::addFormPath(__DIR__ . '/profiles');
$form->loadFile('profile');
$fields = array(
'address1',
'address2',
'city',
'region',
'country',
'postal_code',
'phone',
'website',
'favoritebook',
'aboutme',
'dob',
'tos',
);
// Change fields description when displayed in frontend or backend profile editing
$app = Factory::getApplication();
if ($app->isClient('site') || $name === 'com_users.user' || $name === 'com_admin.profile')
{
$form->setFieldAttribute('address1', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
$form->setFieldAttribute('address2', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
$form->setFieldAttribute('city', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
$form->setFieldAttribute('region', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
$form->setFieldAttribute('country', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
$form->setFieldAttribute('postal_code', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
$form->setFieldAttribute('phone', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
$form->setFieldAttribute('website', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
$form->setFieldAttribute('favoritebook', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
$form->setFieldAttribute('aboutme', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
$form->setFieldAttribute('dob', 'description', 'PLG_USER_PROFILE_FILL_FIELD_DESC_SITE', 'profile');
$form->setFieldAttribute('tos', 'description', 'PLG_USER_PROFILE_FIELD_TOS_DESC_SITE', 'profile');
}
$tosArticle = $this->params->get('register_tos_article');
$tosEnabled = $this->params->get('register-require_tos', 0);
// We need to be in the registration form and field needs to be enabled
if ($name !== 'com_users.registration' || !$tosEnabled)
{
// We only want the TOS in the registration form
$form->removeField('tos', 'profile');
}
else
{
// Push the TOS article ID into the TOS field.
$form->setFieldAttribute('tos', 'article', $tosArticle, 'profile');
}
foreach ($fields as $field)
{
// Case using the users manager in admin
if ($name === 'com_users.user')
{
// Toggle whether the field is required.
if ($this->params->get('profile-require_' . $field, 1) > 0)
{
$form->setFieldAttribute($field, 'required', ($this->params->get('profile-require_' . $field) == 2) ? 'required' : '', 'profile');
}
// Remove the field if it is disabled in registration and profile
elseif ($this->params->get('register-require_' . $field, 1) == 0
&& $this->params->get('profile-require_' . $field, 1) == 0)
{
$form->removeField($field, 'profile');
}
}
// Case registration
elseif ($name === 'com_users.registration')
{
// Toggle whether the field is required.
if ($this->params->get('register-require_' . $field, 1) > 0)
{
$form->setFieldAttribute($field, 'required', ($this->params->get('register-require_' . $field) == 2) ? 'required' : '', 'profile');
}
else
{
$form->removeField($field, 'profile');
}
}
// Case profile in site or admin
elseif ($name === 'com_users.profile' || $name === 'com_admin.profile')
{
// Toggle whether the field is required.
if ($this->params->get('profile-require_' . $field, 1) > 0)
{
$form->setFieldAttribute($field, 'required', ($this->params->get('profile-require_' . $field) == 2) ? 'required' : '', 'profile');
}
else
{
$form->removeField($field, 'profile');
}
}
}
// Drop the profile form entirely if there aren't any fields to display.
$remainingfields = $form->getGroup('profile');
if (!count($remainingfields))
{
$form->removeGroup('profile');
}
return true;
}
/**
* Method is called before user data is stored in the database
*
* @param array $user Holds the old user data.
* @param boolean $isnew True if a new user is stored.
* @param array $data Holds the new user data.
*
* @return boolean
*
* @since 3.1
* @throws InvalidArgumentException on invalid date.
*/
public function onUserBeforeSave($user, $isnew, $data)
{
// Check that the date is valid.
if (!empty($data['profile']['dob']))
{
try
{
$date = new Date($data['profile']['dob']);
$this->date = $date->format('Y-m-d H:i:s');
}
catch (Exception $e)
{
// Throw an exception if date is not valid.
throw new InvalidArgumentException(Text::_('PLG_USER_PROFILE_ERROR_INVALID_DOB'));
}
if (Date::getInstance('now') < $date)
{
// Throw an exception if dob is greater than now.
throw new InvalidArgumentException(Text::_('PLG_USER_PROFILE_ERROR_INVALID_DOB_FUTURE_DATE'));
}
}
// Check that the tos is checked if required ie only in registration from frontend.
$task = Factory::getApplication()->input->getCmd('task');
$option = Factory::getApplication()->input->getCmd('option');
$tosArticle = $this->params->get('register_tos_article');
$tosEnabled = ($this->params->get('register-require_tos', 0) == 2);
// Check that the tos is checked.
if ($task === 'register' && $tosEnabled && $tosArticle && $option === 'com_users' && !$data['profile']['tos'])
{
throw new InvalidArgumentException(Text::_('PLG_USER_PROFILE_FIELD_TOS_DESC_SITE'));
}
return true;
}
/**
* Saves user profile data
*
* @param array $data entered user data
* @param boolean $isNew true if this is a new user
* @param boolean $result true if saving the user worked
* @param string $error error message
*
* @return boolean
*/
public function onUserAfterSave($data, $isNew, $result, $error)
{
$userId = ArrayHelper::getValue($data, 'id', 0, 'int');
if ($userId && $result && isset($data['profile']) && count($data['profile']))
{
try
{
$db = Factory::getDbo();
// Sanitize the date
if (!empty($data['profile']['dob']))
{
$data['profile']['dob'] = $this->date;
}
$keys = array_keys($data['profile']);
foreach ($keys as &$key)
{
$key = 'profile.' . $key;
$key = $db->quote($key);
}
$query = $db->getQuery(true)
->delete($db->quoteName('#__user_profiles'))
->where($db->quoteName('user_id') . ' = ' . (int) $userId)
->where($db->quoteName('profile_key') . ' IN (' . implode(',', $keys) . ')');
$db->setQuery($query);
$db->execute();
$query = $db->getQuery(true)
->select($db->quoteName('ordering'))
->from($db->quoteName('#__user_profiles'))
->where($db->quoteName('user_id') . ' = ' . (int) $userId);
$db->setQuery($query);
$usedOrdering = $db->loadColumn();
$tuples = array();
$order = 1;
foreach ($data['profile'] as $k => $v)
{
while (in_array($order, $usedOrdering))
{
$order++;
}
$tuples[] = '(' . $userId . ', ' . $db->quote('profile.' . $k) . ', ' . $db->quote(json_encode($v)) . ', ' . ($order++) . ')';
}
$db->setQuery('INSERT INTO #__user_profiles VALUES ' . implode(', ', $tuples));
$db->execute();
}
catch (RuntimeException $e)
{
$this->_subject->setError($e->getMessage());
return false;
}
}
return true;
}
/**
* Remove all user profile information for the given user ID
*
* Method is called after user data is deleted from the database
*
* @param array $user Holds the user data
* @param boolean $success True if user was successfully stored in the database
* @param string $msg Message
*
* @return boolean
*/
public function onUserAfterDelete($user, $success, $msg)
{
if (!$success)
{
return false;
}
$userId = ArrayHelper::getValue($user, 'id', 0, 'int');
if ($userId)
{
try
{
$db = Factory::getDbo();
$db->setQuery(
'DELETE FROM #__user_profiles WHERE user_id = ' . $userId
. " AND profile_key LIKE 'profile.%'"
);
$db->execute();
}
catch (Exception $e)
{
$this->_subject->setError($e->getMessage());
return false;
}
}
return true;
}
}
home/wuectly/www/administrator/components/com_admin/models/profile.php 0000604 00000016576 15245657657 0022504 0 ustar 00 <?php
/**
* @package Joomla.Administrator
* @subpackage com_admin
*
* @copyright (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
defined('_JEXEC') or die;
// Load the helper and model used for two factor authentication
JLoader::register('UsersModelUser', JPATH_ADMINISTRATOR . '/components/com_users/models/user.php');
JLoader::register('UsersHelper', JPATH_ADMINISTRATOR . '/components/com_users/helpers/users.php');
/**
* User model.
*
* @since 1.6
*/
class AdminModelProfile extends UsersModelUser
{
/**
* Method to get the record form.
*
* @param array $data An optional array of data for the form to interrogate.
* @param boolean $loadData True if the form is to load its own data (default case), false if not.
*
* @return JForm A JForm object on success, false on failure
*
* @since 1.6
*/
public function getForm($data = array(), $loadData = true)
{
// Get the form.
$form = $this->loadForm('com_admin.profile', 'profile', array('control' => 'jform', 'load_data' => $loadData));
if (empty($form))
{
return false;
}
// Check for username compliance and parameter set
$isUsernameCompliant = true;
if ($this->loadFormData()->username)
{
$username = $this->loadFormData()->username;
$isUsernameCompliant = !(preg_match('#[<>"\'%;()&\\\\]|\\.\\./#', $username) || strlen(utf8_decode($username)) < 2
|| trim($username) != $username);
}
$this->setState('user.username.compliant', $isUsernameCompliant);
if (!JComponentHelper::getParams('com_users')->get('change_login_name') && $isUsernameCompliant)
{
$form->setFieldAttribute('username', 'required', 'false');
$form->setFieldAttribute('username', 'readonly', 'true');
$form->setFieldAttribute('username', 'description', 'COM_ADMIN_USER_FIELD_NOCHANGE_USERNAME_DESC');
}
// When multilanguage is set, a user's default site language should also be a Content Language
if (JLanguageMultilang::isEnabled())
{
$form->setFieldAttribute('language', 'type', 'frontend_language', 'params');
}
// If the user needs to change their password, mark the password fields as required
if (JFactory::getUser()->requireReset)
{
$form->setFieldAttribute('password', 'required', 'true');
$form->setFieldAttribute('password2', 'required', 'true');
}
return $form;
}
/**
* Method to get the data that should be injected in the form.
*
* @return mixed The data for the form.
*
* @since 1.6
*/
protected function loadFormData()
{
// Check the session for previously entered form data.
$data = JFactory::getApplication()->getUserState('com_users.edit.user.data', array());
if (empty($data))
{
$data = $this->getItem();
}
// Load the users plugins.
JPluginHelper::importPlugin('user');
$this->preprocessData('com_admin.profile', $data);
return $data;
}
/**
* Method to get a single record.
*
* @param integer $pk The id of the primary key.
*
* @return mixed Object on success, false on failure.
*
* @since 1.6
*/
public function getItem($pk = null)
{
return parent::getItem(JFactory::getUser()->id);
}
/**
* Method to save the form data.
*
* @param array $data The form data.
*
* @return boolean True on success.
*
* @since 1.6
*/
public function save($data)
{
$user = JFactory::getUser();
unset($data['id']);
unset($data['groups']);
unset($data['sendEmail']);
unset($data['block']);
$isUsernameCompliant = $this->getState('user.username.compliant');
if (!JComponentHelper::getParams('com_users')->get('change_login_name') && $isUsernameCompliant)
{
unset($data['username']);
}
// Handle the two factor authentication setup
if (isset($data['twofactor']['method']))
{
$twoFactorMethod = $data['twofactor']['method'];
// Get the current One Time Password (two factor auth) configuration
$otpConfig = $this->getOtpConfig($user->id);
if ($twoFactorMethod !== 'none')
{
// Run the plugins
FOFPlatform::getInstance()->importPlugin('twofactorauth');
$otpConfigReplies = FOFPlatform::getInstance()->runPlugins('onUserTwofactorApplyConfiguration', array($twoFactorMethod));
// Look for a valid reply
foreach ($otpConfigReplies as $reply)
{
if (!is_object($reply) || empty($reply->method) || ($reply->method != $twoFactorMethod))
{
continue;
}
$otpConfig->method = $reply->method;
$otpConfig->config = $reply->config;
break;
}
// Save OTP configuration.
$this->setOtpConfig($user->id, $otpConfig);
// Generate one time emergency passwords if required (depleted or not set)
if (empty($otpConfig->otep))
{
$this->generateOteps($user->id);
}
}
else
{
$otpConfig->method = 'none';
$otpConfig->config = array();
$this->setOtpConfig($user->id, $otpConfig);
}
// Unset the raw data
unset($data['twofactor']);
// Reload the user record with the updated OTP configuration
$user->load($user->id);
}
// Bind the data.
if (!$user->bind($data))
{
$this->setError($user->getError());
return false;
}
$user->groups = null;
// Store the data.
if (!$user->save())
{
$this->setError($user->getError());
return false;
}
$this->setState('user.id', $user->id);
return true;
}
/**
* Gets the configuration forms for all two-factor authentication methods
* in an array.
*
* @param integer $userId The user ID to load the forms for (optional)
*
* @return array
*
* @since __DEPOLOY_VERSION__
*/
public function getTwofactorform($userId = null)
{
$userId = (!empty($userId)) ? $userId : (int) JFactory::getUser()->id;
$model = new UsersModelUser;
return $model->getTwofactorform($userId);
}
/**
* Returns the one time password (OTP) – a.k.a. two factor authentication –
* configuration for a particular user.
*
* @param integer $userId The numeric ID of the user
*
* @return stdClass An object holding the OTP configuration for this user
*
* @since __DEPOLOY_VERSION__
*/
public function getOtpConfig($userId = null)
{
$userId = (!empty($userId)) ? $userId : (int) JFactory::getUser()->id;
$model = new UsersModelUser;
return $model->getOtpConfig($userId);
}
/**
* Sets the one time password (OTP) – a.k.a. two factor authentication –
* configuration for a particular user. The $otpConfig object is the same as
* the one returned by the getOtpConfig method.
*
* @param integer $userId The numeric ID of the user
* @param stdClass $otpConfig The OTP configuration object
*
* @return boolean True on success
*
* @since __DEPOLOY_VERSION__
*/
public function setOtpConfig($userId, $otpConfig)
{
$userId = (!empty($userId)) ? $userId : (int) JFactory::getUser()->id;
$model = new UsersModelUser;
return $model->setOtpConfig($userId, $otpConfig);
}
/**
* Generates a new set of One Time Emergency Passwords (OTEPs) for a given user.
*
* @param integer $userId The user ID
* @param integer $count How many OTEPs to generate? Default: 10
*
* @return array The generated OTEPs
*
* @since __DEPOLOY_VERSION__
*/
public function generateOteps($userId, $count = 10)
{
$userId = (!empty($userId)) ? $userId : (int) JFactory::getUser()->id;
$model = new UsersModelUser;
return $model->generateOteps($userId, $count);
}
}
home/wuectly/www/administrator/components/com_jce/models/profile.php 0000604 00000073651 15245703255 0022134 0 ustar 00 <?php
/**
* @package JCE
* @subpackage Admin
*
* @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
* @copyright Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
\defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\Filesystem\File;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Form\FormHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Model\AdminModel;
use Joomla\CMS\Session\Session;
use Joomla\CMS\Table\Table;
use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Event\DispatcherAwareInterface;
require JPATH_SITE . '/components/com_jce/editor/libraries/classes/editor.php';
require JPATH_ADMINISTRATOR . '/components/com_jce/helpers/plugins.php';
require JPATH_ADMINISTRATOR . '/components/com_jce/helpers/profiles.php';
/**
* Item Model for a Profile.
*
* @since 1.6
*/
class JceModelProfile extends AdminModel
{
/**
* The type alias for this content type.
*
* @var string
*
* @since 3.2
*/
public $typeAlias = 'com_jce.profile';
/**
* The prefix to use with controller messages.
*
* @var string
*
* @since 1.6
*/
protected $text_prefix = 'COM_JCE';
public function __construct($config = array())
{
if ($this instanceof DispatcherAwareInterface) {
$this->setDispatcher(Factory::getApplication()->getDispatcher());
}
parent::__construct($config);
}
/**
* Returns a Table object, always creating it.
*
* @param type $type The table type to instantiate
* @param string $prefix A prefix for the table class name. Optional
* @param array $config Configuration array for model. Optional
*
* @return JTable A database object
*
* @since 1.6
*/
public function getTable($type = 'Profiles', $prefix = 'JceTable', $config = array())
{
return Table::getInstance($type, $prefix, $config);
}
/* Override to prevent plugins from processing form data */
protected function preprocessData($context, &$data, $group = 'system')
{
if (!isset($data->config)) {
return;
}
$config = $data->config;
if (is_string($config)) {
$config = json_decode($config, true);
}
if (empty($config)) {
return;
}
// editor parameters
if (isset($config['editor'])) {
if (!empty($config['editor']['toolbar_theme']) && $config['editor']['toolbar_theme'] === 'mobile') {
$config['editor']['toolbar_theme'] = 'default.touch';
}
if (isset($config['editor']['relative_urls']) && !isset($config['editor']['convert_urls'])) {
$config['editor']['convert_urls'] = $config['editor']['relative_urls'] == 0 ? 'absolute' : 'relative';
}
}
// decode config values for display
array_walk_recursive($config, function (&$value) {
$value = htmlspecialchars_decode($value);
});
$data->config = $config;
}
/**
* Method to allow derived classes to preprocess the form.
*
* @param JForm $form A JForm object
* @param mixed $data The data expected for the form
* @param string $group The name of the plugin group to import (defaults to "content")
*
* @see JFormField
* @since 1.6
*
* @throws Exception if there is an error in the form event
*/
protected function preprocessForm(Form $form, $data, $group = 'content')
{
if (!empty($data)) {
$registry = new Registry($data->config);
// process individual fields to remove default value if required
$fields = $form->getFieldset();
foreach ($fields as $field) {
$name = $field->getAttribute('name');
// get the field group and add the field name
$group = (string) $field->group;
// must be a grouped parameter, eg: editor, imgmanager etc.
if (!$group) {
continue;
}
// create key from group and name
$group = $group . '.' . $name;
// explode group to array
$parts = explode('.', $group);
// remove "config" from group name so it matches params data object
if ($parts[0] === "config") {
array_shift($parts);
$group = implode('.', $parts);
}
// reset the "default" attribute value if a value is set
if ($registry->exists($group)) {
$form->setFieldAttribute($name, 'default', '', (string) $field->group);
}
}
}
if ($form->getName() == 'com_jce.profile') {
// editor manifest
$manifest = __DIR__ . '/forms/editor.xml';
// load editor manifest
if (is_file($manifest)) {
if ($editor_xml = simplexml_load_file($manifest)) {
$form->setField($editor_xml, 'config');
}
}
}
// Allow for additional modification of the form, and events to be triggered.
// We pass the data because plugins may require it.
parent::preprocessForm($form, $data);
// Load the data into the form after the plugins have operated.
$form->bind($data);
}
public function getForm($data = array(), $loadData = true)
{
if ($this instanceof DispatcherAwareInterface) {
$this->setDispatcher(Factory::getApplication()->getDispatcher());
}
FormHelper::addFieldPath('JPATH_ADMINISTRATOR/components/com_jce/models/fields');
// Get the setup form.
return $this->loadForm('com_jce.profile', 'profile', array('control' => 'jform', 'load_data' => true));
}
/**
* Method to get the data that should be injected in the form.
*
* @return mixed The data for the form
*
* @since 1.6
*/
protected function loadFormData()
{
$data = $this->getItem();
// convert 0 value to null to force defaults
if (empty($data->area)) {
$data->area = null;
}
// convert to array if set
if (!empty($data->device)) {
$data->device = explode(',', $data->device);
}
if (!empty($data->components)) {
$data->components = explode(',', $data->components);
$data->components_select = 1;
}
if (!empty($data->types)) {
$data->types = explode(',', $data->types);
}
$data->config = $data->params;
$this->preprocessData('com_jce.profiles', $data);
return $data;
}
public function getRows()
{
$data = $this->getItem();
$array = array();
$rows = empty($data->rows) ? array() : explode(';', $data->rows);
$plugins = $this->getButtons();
$i = 1;
foreach ($rows as $row) {
$groups = array();
// remove spacers
$row = str_replace(array('|', 'spacer'), '', $row);
foreach (explode('spacer', $row) as $group) {
// get items in group
$items = explode(',', $group);
$buttons = array();
// remove duplicates
$items = array_unique($items);
foreach ($items as $x => $item) {
if ($item === 'spacer') {
unset($items[$x]);
continue;
}
// not in the list...
if (empty($item) || array_key_exists($item, $plugins) === false) {
continue;
}
// must be assigned...
if (!$plugins[$item]->active) {
continue;
}
// assign icon
$buttons[] = $plugins[$item];
}
$groups[] = $buttons;
}
$array[$i] = $groups;
++$i;
}
// allow for empty toolbar row when creating a new profile
if (empty($array)) {
$array[$i] = array();
}
return $array;
}
/**
* An array of buttons not in the current editor layout.
*
* @return array
*/
public function getAvailableButtons()
{
$plugins = $this->getButtons();
$available = array_filter($plugins, function ($plugin) {
return !$plugin->active;
});
return $available;
}
public function getAdditionalPlugins()
{
$plugins = $this->getButtons();
$additional = array_filter($plugins, function ($plugin) {
return $plugin->editable && !$plugin->row;
});
return $additional;
}
public function getButtons()
{
$commands = $this->getCommands();
$plugins = $this->getPlugins();
return array_merge($commands, $plugins);
}
public function getCommands()
{
static $commands;
if (empty($commands)) {
$data = $this->getItem();
$rows = empty($data->rows) ? array() : preg_split('#[;,]#', $data->rows);
$commands = array();
foreach (JcePluginsHelper::getCommands() as $name => $command) {
// set as active
$command->active = in_array($name, $rows);
$command->icon = explode(',', $command->icon);
// set default empty value
$command->image = '';
// ui class, default is blank
if (empty($command->class)) {
$command->class = '';
}
// cast row to integer
$command->row = (int) $command->row;
// cast editable to integer
$command->editable = (int) $command->editable;
// translate title
$command->title = Text::_($command->title);
// translate description
$command->description = Text::_($command->description);
$command->name = $name;
$commands[$name] = $command;
}
}
// merge plugins and commands
return $commands;
}
public function getPlugins()
{
static $plugins;
if (empty($plugins)) {
$plugins = array();
$data = $this->loadFormData();
// array or profile plugin items
$rows = empty($data->plugins) ? array() : explode(',', $data->plugins);
// remove duplicates
$rows = array_unique($rows);
$extensions = JcePluginsHelper::getExtensions();
// only need plugins with xml files
foreach (JcePluginsHelper::getPlugins() as $name => $plugin) {
$plugin->icon = empty($plugin->icon) ? array() : explode(',', $plugin->icon);
// set as active if it is in the profile
$plugin->active = in_array($plugin->name, $rows);
// ui class, default is blank
if (empty($plugin->class)) {
$plugin->class = '';
}
$plugin->class = preg_replace_callback('#\b([a-z0-9]+)-([a-z0-9]+)\b#', function ($matches) {
return 'mce' . ucfirst($matches[1]) . ucfirst($matches[2]);
}, $plugin->class);
// translate title
$plugin->title = Text::_($plugin->title);
// translate description
$plugin->description = Text::_($plugin->description);
// cast row to integer
$plugin->row = (int) $plugin->row;
// cast editable to integer
$plugin->editable = (int) $plugin->editable;
// plugin extensions
$plugin->extensions = array();
if (is_file($plugin->manifest)) {
$plugin->form = $this->loadForm('com_jce.profile.' . $plugin->name, $plugin->manifest, array('control' => 'jform[config]', 'load_data' => true), true, '//extension');
$plugin->formclass = 'options-grid-form options-grid-form-full';
$fieldsets = $plugin->form->getFieldsets();
// no parameter fields
if (empty($fieldsets)) {
$plugin->form = false;
$plugins[$name] = $plugin;
continue;
}
// bind data to the form
$plugin->form->bind($data->params);
foreach ($extensions as $type => $items) {
$item = new StdClass;
$item->name = '';
$item->title = '';
$item->manifest = WF_EDITOR_LIBRARIES . '/xml/config/' . $type . '.xml';
$item->context = '';
array_unshift($items, $item);
foreach ($items as $p) {
// check for plugin fieldset using xpath, as fieldset can be empty
$fieldset = $plugin->form->getXml()->xpath('(//fieldset[@name="plugin.' . $type . '"])');
// not supported, move along...
if (empty($fieldset)) {
continue;
}
$context = (string) $fieldset[0]->attributes()->context;
// check for a context, eg: images, web, video
if ($context && !in_array($p->context, explode(',', $context))) {
continue;
}
if (is_file($p->manifest)) {
$path = array($plugin->name, $type, $p->name);
// create new extension object
$extension = new StdClass;
// set extension name as the plugin name
$extension->name = $p->name;
// set extension title
$extension->title = $p->title;
// load form
$extension->form = $this->loadForm('com_jce.profile.' . implode('.', $path), $p->manifest, array('control' => 'jform[config][' . $plugin->name . '][' . $type . ']', 'load_data' => true), true, '//extension');
$extension->formclass = 'options-grid-form options-grid-form-full';
// get fieldsets if any
$fieldsets = $extension->form->getFieldsets();
foreach ($fieldsets as $fieldset) {
// load form
$plugin->extensions[$type][$p->name] = $extension;
if (!isset($data->params[$plugin->name])) {
continue;
}
if (!isset($data->params[$plugin->name][$type])) {
continue;
}
// bind data to the form
$extension->form->bind($data->params[$plugin->name][$type]);
}
}
}
}
}
// add to array
$plugins[$name] = $plugin;
}
}
return $plugins;
}
/**
* Prepare and sanitise the table data prior to saving.
*
* @param JTable $table A reference to a JTable object
*
* @since 1.6
*/
protected function prepareTable($table)
{
$filter = InputFilter::getInstance();
foreach ($table->getProperties() as $key => $value) {
switch ($key) {
case 'name':
case 'description':
$value = $filter->clean($value, 'STRING');
break;
case 'device':
$value = $filter->clean($value, 'STRING');
if (is_array($value)) {
$value = implode(',', $value);
}
break;
case 'area':
if (is_array($value)) {
// remove empty value
$value = array_filter($value, 'strlen');
// for simplicity, set multiple area selections as "0"
if (count($value) > 1) {
$value = 0;
} else {
$value = $value[0];
}
}
$value = $value;
break;
case 'components':
$value = $filter->clean($value, 'STRING');
if (is_array($value)) {
$value = implode(',', $value);
}
break;
case 'params':
break;
case 'types':
case 'users':
$value = $filter->clean($value, 'INT');
if (is_array($value)) {
$value = implode(',', $value);
}
break;
case 'plugins':
$value = preg_replace('#[^\w_,]+#', '', $value);
break;
case 'rows':
$value = preg_replace('#[^\w,;]+#', '', $value);
break;
case 'params':
break;
}
$table->$key = $value;
}
if (empty($table->id)) {
// Set ordering to the last item if not set
if (empty($table->ordering)) {
$db = $this->getDbo();
$query = $db->getQuery(true)
->select('MAX(ordering)')
->from($db->quoteName('#__wf_profiles'));
$db->setQuery($query);
$max = $db->loadResult();
$table->ordering = $max + 1;
}
}
}
public function validate($form, $data, $group = null)
{
$filter = InputFilter::getInstance();
// get unfiltered config data
$config = isset($data['config']) ? $data['config'] : array();
// get layout rows and plugins data
$rows = isset($data['rows']) ? $data['rows'] : '';
$plugins = isset($data['plugins']) ? $data['plugins'] : '';
// clean layout rows and plugins data
$data['rows'] = $filter->clean($rows, 'STRING');
$data['plugins'] = $filter->clean($plugins, 'STRING');
// add back config data
$data['params'] = json_encode($filter->clean($config, 'ARRAY'));
if (empty($data['components']) || empty($data['components_select'])) {
$data['components'] = '';
}
if (empty($data['users'])) {
$data['users'] = '';
}
if (empty($data['types'])) {
$data['types'] = '';
}
return $data;
}
private static function cleanParamData($data)
{
// clean up link plugin parameters
array_walk($data, function (&$params, $plugin) {
if ($plugin === "link") {
if (isset($params['dir'])) {
if (!empty($params['dir']) && empty($params['direction'])) {
$params['direction'] = $params['dir'];
}
unset($params['dir']);
}
}
if (is_array($params) && WFUtility::is_associative_array($params)) {
array_walk($params, function (&$value, $key) {
if (is_string($value) && WFUtility::isJson($value)) {
$value = json_decode($value, true);
}
});
}
});
return $data;
}
/**
* Recursively normalizes parameter structures:
* - If a string looks like JSON ({...} or [...]) and decodes cleanly, decode it.
* - If an array entry is a key/value pair and both are empty, drop it.
* - Recurse into arrays and keep original scalar types.
*/
private static function normalizeParams($node)
{
// 1) Strings: decode JSON-in-strings when safe
if (is_string($node)) {
$trim = ltrim($node);
if ($trim !== '' && ($trim[0] === '{' || $trim[0] === '[')) {
$decoded = json_decode($node, true);
if (json_last_error() === JSON_ERROR_NONE) {
return self::normalizeParams($decoded);
}
}
return $node;
}
// 2) Arrays: handle key/value pairs & recurse
if (is_array($node)) {
// Drop empty key/value pair objects
if (array_key_exists('name', $node) && array_key_exists('value', $node)) {
$name = trim((string) ($node['name'] ?? ''));
$value = $node['value'] ?? '';
$valueIsEmpty =
(is_string($value) && trim($value) === '') ||
$value === null ||
(is_array($value) && $value === []);
if ($name === '' && $valueIsEmpty) {
return null; // signal to remove
}
}
$result = [];
// Preserve numeric indexes for lists; associative for objects
foreach ($node as $k => $v) {
$normalized = self::normalizeParams($v);
// Skip nulls returned from empty key/value pairs
if ($normalized === null) {
continue;
}
$result[$k] = $normalized;
}
return $result;
}
// 3) Other scalars / objects: return as-is
return $node;
}
/**
* Method to save the form data.
*
* @param array The form data
*
* @return bool True on success
*
* @since 2.7
*/
public function save($data)
{
$app = Factory::getApplication();
// get profile table
$table = $this->getTable();
// Alter the title for save as copy
if ($app->input->get('task') == 'save2copy') {
// Alter the title
$name = $data['name'];
while ($table->load(array('name' => $name))) {
if ($name == $table->name) {
$name = StringHelper::increment($name);
}
}
$data['name'] = $name;
$data['published'] = 0;
}
$key = $table->getKeyName();
$pk = (!empty($data[$key])) ? $data[$key] : (int) $this->getState($this->getName() . '.id');
if ($pk && $table->load($pk)) {
if (empty($data['rows'])) {
$data['rows'] = $table->rows;
}
if (empty($data['plugins'])) {
$data['plugins'] = $table->plugins;
}
$json = array();
$params = empty($table->params) ? '' : $table->params;
// convert params to json data array
$params = (array) json_decode($params, true);
$plugins = isset($data['plugins']) ? $data['plugins'] : $table->plugins;
// get plugins
$items = explode(',', $plugins);
// add "editor" for editor parameters
$items[] = 'editor';
// add "setup" for setup parameters (via plugins, eg: jcepro)
$items[] = 'setup';
if (is_string($data['params'])) {
$data['params'] = json_decode($data['params'], true);
}
// make sure we have a value
if (empty($data['params'])) {
$data['params'] = array();
}
$data['params'] = self::cleanParamData($data['params']);
// data for editor and plugins
foreach ($items as $item) {
// add config data
if (array_key_exists($item, $data['params'])) {
$value = $data['params'][$item];
// normalize the value
$value = self::normalizeParams($value);
// Add to json array for merging
$json[$item] = $value;
}
}
// merge and encode as json string
$data['params'] = json_encode(WFUtility::array_merge_recursive_distinct($params, $json));
}
// set a default value for validation
if (empty($data['params'])) {
$data['params'] = '{}';
}
if (parent::save($data)) {
return true;
}
return false;
}
public function copy($ids)
{
// Check for request forgeries
Session::checkToken() or jexit(Text::_('JINVALID_TOKEN'));
$table = $this->getTable();
foreach ($ids as $id) {
if (!$table->load($id)) {
$this->setError($table->getError());
} else {
$name = Text::sprintf('WF_PROFILES_COPY_OF', $table->name);
$table->name = $name;
$table->id = 0;
$table->published = 0;
}
// Check the row.
if (!$table->check()) {
$this->setError($table->getError());
return false;
}
// Store the row.
if (!$table->store()) {
$this->setError($table->getError());
return false;
}
}
return true;
}
public function export($ids)
{
$db = Factory::getDBO();
$buffer = '<?xml version="1.0" encoding="utf-8" standalone="yes"?>';
$buffer .= "\n" . '<export type="profiles">';
$buffer .= "\n\t" . '<profiles>';
$validFields = array('name', 'description', 'users', 'types', 'components', 'area', 'device', 'rows', 'plugins', 'published', 'ordering', 'params');
foreach ($ids as $id) {
$table = $this->getTable();
if (!$table->load($id)) {
continue;
}
$buffer .= "\n\t\t";
$buffer .= '<profile>';
$fields = $table->getProperties();
foreach ($fields as $key => $value) {
// only allow a subset of fields
if (false == in_array($key, $validFields)) {
continue;
}
// set published to 0
if ($key === "published") {
$value = 0;
}
if ($key == 'params') {
$buffer .= "\n\t\t\t" . '<' . $key . '><![CDATA[' . trim($value) . ']]></' . $key . '>';
} else {
$buffer .= "\n\t\t\t" . '<' . $key . '>' . JceProfilesHelper::encodeData($value) . '</' . $key . '>';
}
}
$buffer .= "\n\t\t</profile>";
}
$buffer .= "\n\t</profiles>";
$buffer .= "\n</export>";
// set_time_limit doesn't work in safe mode
if (!ini_get('safe_mode')) {
@set_time_limit(0);
}
$name = 'jce_editor_profile_' . date('Y_m_d') . '.xml';
$app = Factory::getApplication();
$app->allowCache(false);
$app->setHeader('Content-Transfer-Encoding', 'binary');
$app->setHeader('Content-Type', 'text/xml');
$app->setHeader('Content-Disposition', 'attachment;filename="' . $name . '";');
// set output content
$app->setBody($buffer);
// stream to client
echo $app->toString();
jexit();
}
/**
* Process XML restore file.
*
* @param object $xml
*
* @return bool
*/
public function import()
{
// Check for request forgeries
Session::checkToken() or jexit(Text::_('JINVALID_TOKEN'));
jimport('joomla.filesystem.file');
$app = Factory::getApplication();
$tmp = $app->getCfg('tmp_path');
jimport('joomla.filesystem.file');
$file = $app->input->files->get('profile_file', null, 'raw');
// check for valid uploaded file
if (empty($file) || !is_uploaded_file($file['tmp_name'])) {
$app->enqueueMessage(Text::_('WF_PROFILES_UPLOAD_NOFILE'), 'error');
return false;
}
if ($file['error'] || $file['size'] < 1) {
$app->enqueueMessage(Text::_('WF_PROFILES_UPLOAD_NOFILE'), 'error');
return false;
}
// sanitize the file name
$name = File::makeSafe($file['name']);
if (empty($name)) {
$app->enqueueMessage(Text::_('WF_PROFILES_IMPORT_ERROR'), 'error');
return false;
}
// Build the appropriate paths.
$config = Factory::getConfig();
$destination = $config->get('tmp_path') . '/' . $name;
$source = $file['tmp_name'];
// Move uploaded file.
File::upload($source, $destination, false, true);
if (!is_file($destination)) {
$app->enqueueMessage(Text::_('WF_PROFILES_UPLOAD_FAILED'), 'error');
return false;
}
$result = JceProfilesHelper::processImport($destination);
if ($result === false) {
$app->enqueueMessage(Text::_('WF_PROFILES_IMPORT_ERROR'), 'error');
return false;
}
$app->enqueueMessage(Text::sprintf('WF_PROFILES_IMPORT_SUCCESS', $result));
return true;
}
} home/wuectly/www/plugins/system/t3/includes/depend/tpls/profile.php 0000604 00000010713 15245703275 0021557 0 ustar 00 <?php
/**
*------------------------------------------------------------------------------
* @package T3 Framework for Joomla!
*------------------------------------------------------------------------------
* @copyright Copyright (C) 2004-2013 JoomlArt.com. All Rights Reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
* @authors JoomlArt, JoomlaBamboo, (contribute to this project at github
* & Google group to become co-author)
* @Google group: https://groups.google.com/forum/#!forum/t3fw
* @Link: http://t3-framework.org
*------------------------------------------------------------------------------
*/
// no direct access
defined ( '_JEXEC' ) or die ( 'Restricted access' );
$javersion = new JVersion;
?>
<script type="text/javascript">
!function($){
var JAFileConfig = window.JAFileConfig || {};
JAFileConfig.profiles = <?php echo json_encode($jsonData)?>;
JAFileConfig.mod_url = '<?php echo JURI::base(true) ?>/modules/<?php echo $module; ?>/helper.php';
JAFileConfig.template = '<?php echo $template ?>';
JAFileConfig.langs = <?php json_encode(array(
'confirmCancel' => JText::_('ARE_YOUR_SURE_TO_CANCEL'),
'enterName' => JText::_('ENTER_PROFILE_NAME'),
'correctName' => JText::_('PROFILE_NAME_NOT_EMPTY'),
'confirmDelete' => JText::_('CONFIRM_DELETE_PROFILE')
)); ?>;
$(window).on('load', function(){
JAFileConfig.initialize('jformparams<?php echo str_replace('holder', '', $this->fieldname);?>');
JAFileConfig.changeProfile($('jformparams<?php echo str_replace('holder', '', $this->fieldname);?>').val());
});
}(jQuery);
</script>
<div class="t3-profile">
<label class="hasTip" for="jform_params_<?php echo $this->field_name?>" id="jform_params_<?php echo $this->field_name?>-lbl" title="<?php echo JText::_($this->element['description'])?>"><?php echo JText::_($this->element["label"])?></label>
<?php echo $profileHTML; ?>
<div class="profile_action">
<span class="clone">
<a href="javascript:void(0)" onclick="JAFileConfig.cloneProfile()" title="<?php echo JText::_('CLONE_DESC')?>"><?php echo JText::_('Clone')?></a>
</span>
|
<span class="delete">
<a href="javascript:void(0)" onclick="JAFileConfig.deleteProfile()" title="<?php echo JText::_('DELETE_DESC')?>"><?php echo JText::_('Delete')?></a>
</span>
</div>
</div>
<?php if($javersion->isCompatible('3.0')) : ?>
</div>
</div>
<?php else : ?>
</li>
<?php endif; ?>
<?php
$fieldSets = $t3form->getFieldsets('params');
foreach ($fieldSets as $name => $fieldSet) :
if (isset($fieldSet->description) && trim($fieldSet->description)){
echo '<p class="tip">'.JText::_($fieldSet->description).'</p>';
}
$hidden_fields = '';
foreach ($t3form->getFieldset($name) as $field) :
if (!$field->hidden) :
if($javersion->isCompatible('3.0')) : ?>
<div class="control-group t3-control-group">
<div class="control-label t3-control-label">
<?php else: ?>
<li>
<?php endif;
echo $t3form->getLabel($field->fieldname,$field->group);
if($javersion->isCompatible('3.0')) : ?>
</div>
<div class="controls t3-controls">
<?php endif;
echo $t3form->getInput($field->fieldname,$field->group);
if($javersion->isCompatible('3.0')) : ?>
</div>
</div>
<?php else: ?>
</li>
<?php endif;
else :
$hidden_fields .= $t3form->getInput($field->fieldname,$field->group);
endif;
endforeach;
echo $hidden_fields;
endforeach;
?>
<?php
if($javersion->isCompatible('3.0')) : ?>
<div class="control-group t3-control-group hide">
<div class="control-label t3-control-label"></div>
<div class="controls t3-controls">
<?php else: ?>
<li>
<?php endif; ?>
<script type="text/javascript">
// <![CDATA[
window.addEvent('load', function(){
Joomla.submitbutton = function(task){
if (task == 'module.cancel' || document.formvalidator.isValid(document.getElementById('module-form'))) {
if(task != 'module.cancel' && document.formvalidator.isValid(document.getElementById('module-form'))){
JAFileConfig.saveProfile(task);
}else if(task == 'module.cancel' || document.formvalidator.isValid(document.getElementById('module-form'))){
Joomla.submitform(task, document.getElementById('module-form'));
}
if (self != top) {
window.top.setTimeout('window.parent.SqueezeBox.close()', 1000);
}
} else {
alert('Invalid form');
}
}
});
// ]]>
</script>