| Current Path : /home/sunflowe/www2/vacancesfloride/administrator/components/com_gantry/models/ |
| Current File : /home/sunflowe/www2/vacancesfloride/administrator/components/com_gantry/models/template.php |
<?php
/**
* @package gantry
* @subpackage core
* @version 4.1.32 September 14, 2016
* @author RocketTheme http://www.rockettheme.com
* @copyright Copyright (C) 2007 - 2016 RocketTheme, LLC
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 only
*
* Gantry uses the Joomla Framework (http://www.joomla.org), a GNU/GPLv2 content management system
*
*/
// No direct access.
defined('_JEXEC') or die;
jimport('joomla.application.component.modeladmin');
if (version_compare(JVERSION, '3.0', '<')) {
abstract class GantryModelTemplateIntermediate extends JModelAdmin
{
protected function prepareTable(&$table)
{
$this->gPrepareTable($table);
}
abstract protected function gPrepareTable($table);
}
} else {
abstract class GantryModelTemplateIntermediate extends JModelAdmin
{
protected function prepareTable($table)
{
$this->gPrepareTable($table);
}
abstract protected function gPrepareTable($table);
}
}
/**
* Template style model.
*
* @package Joomla.Administrator
* @subpackage com_templates
* @since 1.6
*/
class GantryModelTemplate extends GantryModelTemplateIntermediate
{
/**
* @var string The help screen key for the module.
* @since 1.6
*/
protected $helpKey = 'JHELP_EXTENSIONS_TEMPLATE_MANAGER_STYLES_EDIT';
/**
* @var string The help screen base URL for the module.
* @since 1.6
*/
protected $helpURL;
/**
* Item cache.
*/
private $_cache = array();
private $_formCache = array();
/**
* Method to auto-populate the model state.
*
* Note. Calling getState in this method will result in recursion.
*
* @since 1.6
*/
protected function populateState()
{
$app = JFactory::getApplication('administrator');
// Load the User state.
$pk = (int)$app->input->getInt('id');
$this->setState('template.id', $pk);
// Load the parameters.
$params = JComponentHelper::getParams('com_gantry');
$this->setState('params', $params);
}
/**
* Method to get the record form.
*
* @param array $data An optional array of data for the form to interogate.
* @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)
{
// Initialise variables.
$app = JFactory::getApplication();
// The folder and element vars are passed when saving the form.
if (empty($data)) {
$item = $this->getItem();
$clientId = $item->client_id;
$template = $item->template;
} else {
$clientId = JArrayHelper::getValue($data, 'client_id');
$template = JArrayHelper::getValue($data, 'template');
}
// These variables are used to add data from the plugin XML files.
$this->setState('item.client_id', $clientId);
$this->setState('item.template', $template);
// Get the form.
$form = $this->loadForm('com_gantry.template', 'template', array(
'control' => 'jform', 'load_data' => $loadData
));
if (empty($form)) {
return false;
}
// Modify the form based on access controls.
if (!$this->canEditState((object)$data)) {
// Disable fields for display.
$form->setFieldAttribute('home', 'disabled', 'true');
// Disable fields while saving.
// The controller has already verified this is a record you can edit.
$form->setFieldAttribute('home', 'filter', 'unset');
}
return $form;
}
protected function canEditState($record)
{
$user = JFactory::getUser();
return $user->authorise('core.edit.state', 'com_templates');
}
public function getGantryForm()
{
gantry_import('core.config.gantryform');
gantry_import('core.config.gantryformnaminghelper');
$pk = (!empty($pk)) ? $pk : (int)$this->getState('template.id');
$item = $this->getItem($pk);
$item->params['current_id'] = $pk;
if (!isset($this->_formCache[$pk])) {
$naming_helper = GantryFormNamingHelper::getInstance();
$form = GantryForm::getInstance($naming_helper, 'template-options', 'template-options', array(), true, "//form");
$form->bind($item->params);
$this->_formCache[$pk] = $form;
}
return $this->_formCache[$pk];
}
public function checkForGantryUpdate()
{
try {
gantry_import('core.gantryupdates');
$gantry_updates = GantryUpdates::getInstance();
$last_updated = $gantry_updates->getLastUpdated();
$diff = time() - $last_updated;
if ($diff > (60 * 60 * 24)) {
jimport('joomla.updater.updater');
// check for update
$updater = JUpdater::getInstance();
$results = @$updater->findUpdates($gantry_updates->getGantryExtensionId());
$gantry_updates->setLastChecked(time());
}
} catch (Exception $e) {
if (!($e->getCode() == 0 && $e->getMessage() == 'No HTTP response received.'))
{
throw $e;
}
}
}
/**
* 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_templates.edit.style.data', array());
if (empty($data)) {
$data = $this->getItem();
}
return $data;
}
/**
* Method to get a single record.
*
* @param integer The id of the primary key.
*
* @return mixed Object on success, false on failure.
*/
public function getItem($pk = null)
{
// Initialise variables.
$pk = (!empty($pk)) ? $pk : (int)$this->getState('template.id');
if (!isset($this->_cache[$pk])) {
$false = false;
// Get a row instance.
$table = $this->getTable();
// Attempt to load the row.
$return = $table->load($pk);
// Check for a table object error.
if ($return === false && $table->getError()) {
$this->setError($table->getError());
return $false;
}
// Convert to the JObject before adding other data.
$table_props = $table->getProperties(1);
$this->_cache[$pk] = JArrayHelper::toObject($table_props, 'JObject');
// Convert the params field to an array.
$registry = new JRegistry;
$registry->loadString($table->params);
$item_params = $registry->toArray();
if (array_key_exists('master', $item_params) && $item_params['master'] != 'true') {
$master_params = $this->getItem((int)$item_params['master'])->params;
if (count($master_params) <= 1)
{
$default_params = $this->getDefaultTemplateParams($table->template);
$master_params = $this->array_join($master_params, $default_params);
}
$item_params = $this->array_join($master_params, $item_params);
}
if(@ini_get('magic_quotes_gpc')=='1'){
$item_params = self::_stripSlashesRecursive($item_params);
}
$this->_cache[$pk]->params = $item_params;
}
return $this->_cache[$pk];
}
protected function getDefaultTemplateParams($template_name)
{
// xpath for names //form//field|//form//fields[@default]|//form//fields[@value]
// xpath for parents ancestor::fields[@name][not(@ignore-group)]/@name|ancestor::set[@name]/@name
$xml = JFactory::getXML(JPATH_SITE . '/templates/' . $template_name . '/template-options.xml');
$params = $xml->xpath('//form//field|//form//fields[@default]|//form//fields[@value]');
$defaults = array();
foreach ($params as $param) {
$attrs = $param->xpath('ancestor::fields[@name][not(@ignore-group)]/@name|ancestor::set[@name]/@name');
$groups = array_map('strval', $attrs ? $attrs : array());
$groups[] = (string)$param['name'];
array_walk($groups, create_function('&$value,$key', '$value = \'[\\\'\'.$value.\'\\\']\';'));
//array_walk($groups, create_function('&$item,$k', '$item = "[\'" . $item . "\']");'));
$def_array_eval = '$defaults' . implode('', $groups) . ' = (string)$param[\'default\'];';
if ($param['default']) @eval($def_array_eval);
}
//$defaults = $this->arrayToObject($defaults);
return $defaults;
}
public function getOverride($pk = null)
{
$pk = (!empty($pk)) ? $pk : (int)$this->getState('template.id');
$params = $this->getItem($pk)->params;
if (array_key_exists('master', $params) && $params['master'] != 'true') {
return true;
}
return false;
}
public function getBaseData($pk = null)
{
$pk = (!empty($pk)) ? $pk : (int)$this->getState('template.id');
$params = $this->getItem($pk)->params;
if ($params->get('master') != 'true') {
$params = $this->getItem($params->get('master'));
}
return $params;
}
/**
* Returns a reference to the a Table object, always creating it.
*
* @param type The table type to instantiate
* @param string A prefix for the table class name. Optional.
* @param array Configuration array for model. Optional.
*
* @return JTable A database object
*/
public function getTable($type = 'Style', $prefix = 'TemplatesTable', $config = array())
{
JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_templates/tables');
return JTable::getInstance($type, $prefix, $config);
}
/**
* Prepare and sanitise the table prior to saving.
*/
protected function gPrepareTable($table)
{
$table;
}
/**
* @param object A form object.
* @param mixed The data expected for the form.
*
* @throws Exception if there is an error in the form event.
* @since 1.6
*/
protected function preprocessForm(JForm $form, $data, $group = 'content')
{
// Initialise variables.
$clientId = $this->getState('item.client_id');
$template = $this->getState('item.template');
$lang = JFactory::getLanguage();
$client = JApplicationHelper::getClientInfo($clientId);
if (!$form->loadFile('template_' . $client->name, true)) {
throw new Exception(JText::_('JERROR_LOADFILE_FAILED'));
}
jimport('joomla.filesystem.file');
jimport('joomla.filesystem.folder');
$formFile = JPath::clean($client->path . '/templates/' . $template . '/templateDetails.xml');
// Load the core and/or local language file(s).
$lang->load('tpl_' . $template, $client->path, null, false, false) || $lang->load('tpl_' . $template, $client->path . '/templates/' . $template, null, false, false) || $lang->load('tpl_' . $template, $client->path, $lang->getDefault(), false, false) || $lang->load('tpl_' . $template, $client->path . '/templates/' . $template, $lang->getDefault(), false, false);
if (file_exists($formFile)) {
// Get the template form.
if (!$form->loadFile($formFile, false, '//config')) {
throw new Exception(JText::_('JERROR_LOADFILE_FAILED'));
}
}
// Disable home field if it is default style
if ((is_array($data) && array_key_exists('home', $data)) || ((is_object($data) && $data->home))) {
$form->setFieldAttribute('home', 'readonly', 'true');
}
// Attempt to load the xml file.
if (!$xml = simplexml_load_file($formFile)) {
throw new Exception(JText::_('JERROR_LOADFILE_FAILED'));
}
// Get the help data from the XML file if present.
$help = $xml->xpath('/extension/help');
if (!empty($help)) {
$helpKey = trim((string)$help[0]['key']);
$helpURL = trim((string)$help[0]['url']);
$this->helpKey = $helpKey ? $helpKey : $this->helpKey;
$this->helpURL = $helpURL ? $helpURL : $this->helpURL;
}
// Trigger the default form events.
parent::preprocessForm($form, $data, $group);
}
/**
* Method to save the form data.
*
* @param array The form data.
*
* @return boolean True on success.
*/
public function save($data)
{
require_once(JPATH_LIBRARIES . "/gantry/gantry.php");
// Initialise variables;
$dispatcher = JDispatcher::getInstance();
$table = $this->getTable();
$pk = (!empty($data['id'])) ? $data['id'] : (int)$this->getState('template.id');
$isNew = true;
// Include the extension plugins for the save events.
JPluginHelper::importPlugin('extension');
// Load the row if saving an existing record.
if ($pk > 0) {
$table->load($pk);
$isNew = false;
}
if (!array_key_exists('home', $data)) {
$data['home'] = 0;
}
// see if its a override and set params to only different data
if (array_key_exists('master', $data['params']) && $data['params']['master'] != 'true') {
$master_params = $this->getItem($data['params']['master'])->params;
$data['params'] = $this->array_diff($data['params'], $master_params);
}
if(@ini_get('magic_quotes_gpc')=='1'){
$data['params'] = self::_stripSlashesRecursive($data['params']);
}
// Bind the data.
if (!$table->bind($data)) {
$this->setError($table->getError());
return false;
}
// Prepare the row for saving
$this->prepareTable($table);
// Check the data.
if (!$table->check()) {
$this->setError($table->getError());
return false;
}
// Trigger the onExtensionBeforeSave event.
$result = $dispatcher->trigger('onExtensionBeforeSave', array('com_templates.style', &$table, $isNew));
if (in_array(false, $result, true)) {
$this->setError($table->getError());
return false;
}
// Store the data.
if (!$table->store()) {
$this->setError($table->getError());
return false;
}
$user = JFactory::getUser();
if ($user->authorise('core.edit', 'com_menus') && $table->client_id == 0) {
$n = 0;
$db = JFactory::getDbo();
$user = JFactory::getUser();
if (empty($data['assigned']) || $data['assigned'] !== false) {
if (!empty($data['assigned'])) {
JArrayHelper::toInteger($data['assigned']);
// Update the mapping for menu items that this style IS assigned to.
$query = $db->getQuery(true);
$query->update('#__menu');
$query->set('template_style_id=' . (int)$table->id);
$query->where('id IN (' . implode(',', $data['assigned']) . ')');
$query->where('template_style_id!=' . (int)$table->id);
$query->where('checked_out in (0,' . (int)$user->id . ')');
$db->setQuery($query);
$db->query();
$n += $db->getAffectedRows();
}
// Remove style mappings for menu items this style is NOT assigned to.
// If unassigned then all existing maps will be removed.
$query = $db->getQuery(true);
$query->update('#__menu');
$query->set('template_style_id=0');
if (!empty($data['assigned'])) {
$query->where('id NOT IN (' . implode(',', $data['assigned']) . ')');
}
$query->where('template_style_id=' . (int)$table->id);
$query->where('checked_out in (0,' . (int)$user->id . ')');
$db->setQuery($query);
$db->query();
$n += $db->getAffectedRows();
if ($n > 0) {
$app = JFactory::getApplication();
$app->enQueueMessage(JText::plural('COM_TEMPLATES_MENU_CHANGED', $n));
}
}
}
// Clean the cache.
$cache = JFactory::getCache();
$cache->clean('com_templates');
$gcache = GantryCache::getCache(GantryCache::GROUP_NAME);
$gcache->getCacheLib()->getDriver()->getCache()->cache->_options['cachebase'] = JPATH_ROOT.'/cache';
$gcache->clearGroupCache();
$gacache = GantryCache::getCache(GantryCache::ADMIN_GROUP_NAME);
$gacache->clearGroupCache();
gantry_admin_setup();
// Trigger the onExtensionAfterSave event.
$dispatcher->trigger('onExtensionAfterSave', array('com_templates.style', &$table, $isNew));
$this->setState('template.id', $table->id);
return true;
}
/**
* Get the necessary data to load an item help screen.
*
* @return object An object with key, url, and local properties for loading the item help screen.
* @since 1.6
*/
public function getHelp()
{
return (object)array('key' => $this->helpKey, 'url' => $this->helpURL);
}
/**
* Method to get a form object.
*
* @param string $name The name of the form.
* @param string $source The form source. Can be XML string if file flag is set to false.
* @param array $options Optional array of options for the form creation.
* @param boolean $clear Optional argument to force load a new form.
* @param string $xpath An optional xpath to search for the fields.
*
* @return mixed JForm object on success, False on error.
*/
protected function loadForm($name, $source = null, $options = array(), $clear = false, $xpath = false)
{
// Handle the optional arguments.
$options['control'] = JArrayHelper::getValue($options, 'control', false);
// Create a signature hash.
$hash = md5($source . serialize($options));
// Check if we can use a previously loaded form.
if (isset($this->_forms[$hash]) && !$clear) {
return $this->_forms[$hash];
}
// Get the form.
JForm::addFormPath(JPATH_COMPONENT . '/models/forms');
JForm::addFieldPath(JPATH_COMPONENT . '/models/fields');
try {
$form = JForm::getInstance($name, $source, $options, false, $xpath);
if (isset($options['load_data']) && $options['load_data']) {
// Get the data for the form.
$data = $this->loadFormData();
} else {
$data = array();
}
// Allow for additional modification of the form, and events to be triggered.
// We pass the data because plugins may require it.
$this->preprocessForm($form, $data);
// Load the data into the form after the plugins have operated.
$form->bind($data);
} catch (Exception $e) {
$this->setError($e->getMessage());
return false;
}
// Store the form for later.
$this->_forms[$hash] = $form;
return $form;
}
protected function array_join()
{
// Get array arguments
$arrays = func_get_args();
// Define the original array
$original = array_shift($arrays);
// Loop through arrays
foreach ($arrays as $array) {
// Loop through array key/value pairs
foreach ($array as $key => $value) {
// Value is an array
if (is_array($value)) {
// Traverse the array; replace or add result to original array
@$original[$key] = $this->array_join($original[$key], $array[$key]);
} // Value is not an array
else {
// Replace or add current value to original array
@$original[$key] = $value;
}
}
}
// Return the joined array
return $original;
}
protected function array_diff($aArray1, $aArray2)
{
$aReturn = array();
foreach ($aArray1 as $mKey => $mValue) {
if (array_key_exists($mKey, $aArray2)) {
if (is_array($mValue)) {
$aRecursiveDiff = $this->array_diff($mValue, $aArray2[$mKey]);
if (count($aRecursiveDiff)) {
$aReturn[$mKey] = $aRecursiveDiff;
}
} else {
if ($mValue != $aArray2[$mKey]) {
$aReturn[$mKey] = $mValue;
}
}
} else {
$aReturn[$mKey] = $mValue;
}
}
return $aReturn;
}
/**
* Method to duplicate styles.
*
* @param array An array of primary key IDs.
*
* @return boolean True if successful.
* @throws Exception
*/
public function duplicate(&$pks)
{
// Initialise variables.
$user = JFactory::getUser();
$db = $this->getDbo();
// Access checks.
if (!$user->authorise('core.create', 'com_templates')) {
throw new Exception(JText::_('JERROR_CORE_CREATE_NOT_PERMITTED'));
}
$table = $this->getTable();
foreach ($pks as $pk) {
if ($table->load($pk, true)) {
// Reset the id to create a new record.
$table->id = 0;
// Reset the home (don't want dupes of that field).
$table->home = 0;
// Alter the title.
$m = null;
if (preg_match('#\((\d+)\)$#', $table->title, $m)) {
$table->title = preg_replace('#\(\d+\)$#', '(' . ($m[1] + 1) . ')', $table->title);
} else {
$table->title .= ' (2)';
}
if ($this->isGantryTemplate($table)) {
$template_params = new JRegistry();
$template_params->loadString($table->params);
if ($template_params->get('master') == 'true') {
$base_params = $template_params->toArray();
$template_params->set('master', $pk);
$copy_params = $template_params->toArray();
$copy_params = $this->array_diff($copy_params, $base_params);
$template_params = new JRegistry();
$template_params->loadArray($copy_params);
}
$table->params = $template_params->toString();
}
if (!$table->check() || !$table->store()) {
throw new Exception($table->getError());
}
} else {
throw new Exception($table->getError());
}
}
$cache = JFactory::getCache();
$cache->clean('com_templates');
$cache->clean('_system');
return true;
}
/**
* Method to delete rows.
*
* @param array An array of item ids.
*
* @return boolean Returns true on success, false on failure.
*/
public function delete(&$pks)
{
// Initialise variables.
$pks = (array)$pks;
$user = JFactory::getUser();
$table = $this->getTable();
$language = JFactory::getLanguage();
$language->load('com_gantry');
// Iterate the items to delete each one.
foreach ($pks as $i => $pk) {
if ($table->load($pk)) {
// Access checks.
if (!$user->authorise('core.delete', 'com_templates')) {
throw new Exception(JText::_('JERROR_CORE_DELETE_NOT_PERMITTED'));
}
if ($this->isGantryTemplate($table)) {
$template_params = new JRegistry();
$template_params->loadString($table->params);
if ($template_params->get('master') == 'true') {
$this->setError(JText::_('Cannot delete a Gantry Template Master Style'));
return false;
}
}
if (!$table->delete($pk)) {
$this->setError($table->getError());
return false;
}
} else {
$this->setError($table->getError());
return false;
}
}
$cache = JFactory::getCache();
$cache->clean('com_templates');
$cache->clean('_system');
return true;
}
/**
* Check if template is based on gantry
*
* @param string $id
*
* @return boolean
*/
private function isGantryTemplate($table)
{
$template = $table->template;
return file_exists(JPATH_SITE . '/' . 'templates' . '/' . $template . '/' . 'lib' . '/' . 'gantry' . '/' . 'gantry.php');
}
/**
*
* @param $value
*
* @return array|string
*/
protected static function _stripSlashesRecursive($value)
{
$value = is_array($value) ? array_map(array( 'GantryModelTemplate', '_stripSlashesRecursive'), $value) : stripslashes($value);
return $value;
}
}