Llewellyn van der Merwe
f15b67cff1
Resolved gh-146 compiler error on joined db in dinamic get thanks to @mwweb & @ro-ot Resolved gh-147 by adding the sort of fields back into the save method Resolved gh-144 to ensure that the published tab (fields overwriting and adding) option is available again. Resolved gh-145 by moving the subforms to their own tab in dynamic get view Converted all repeatable fields to subform fields in Joomla component view Moved 9 subforms and other fields to their own table and view (decopuling them fom Joomla component view), that means we added 9 more views and tables to JCB Added all the ajax for buttons and display views to Joomla component view Added tmp scripts all across the new areas with subforms to ensure all repeatable fields are converted. Will be removed in v2.7.0 Added synced copy, change state and delete in Joomla components view in relation to all tables linked to it (same as with admin views)
431 lines
13 KiB
PHP
431 lines
13 KiB
PHP
<?php
|
|
/*--------------------------------------------------------------------------------------------------------| www.vdm.io |------/
|
|
__ __ _ _____ _ _ __ __ _ _ _
|
|
\ \ / / | | | __ \ | | | | | \/ | | | | | | |
|
|
\ \ / /_ _ ___| |_ | | | | _____ _____| | ___ _ __ _ __ ___ ___ _ __ | |_ | \ / | ___| |_| |__ ___ __| |
|
|
\ \/ / _` / __| __| | | | |/ _ \ \ / / _ \ |/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __| | |\/| |/ _ \ __| '_ \ / _ \ / _` |
|
|
\ / (_| \__ \ |_ | |__| | __/\ V / __/ | (_) | |_) | | | | | | __/ | | | |_ | | | | __/ |_| | | | (_) | (_| |
|
|
\/ \__,_|___/\__| |_____/ \___| \_/ \___|_|\___/| .__/|_| |_| |_|\___|_| |_|\__| |_| |_|\___|\__|_| |_|\___/ \__,_|
|
|
| |
|
|
|_|
|
|
/-------------------------------------------------------------------------------------------------------------------------------/
|
|
|
|
@version @update number 17 of this MVC
|
|
@build 25th October, 2017
|
|
@created 19th May, 2015
|
|
@package Component Builder
|
|
@subpackage snippets.php
|
|
@author Llewellyn van der Merwe <http://vdm.bz/component-builder>
|
|
@copyright Copyright (C) 2015. All Rights Reserved
|
|
@license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
|
|
|
|
Builds Complex Joomla Components
|
|
|
|
/-----------------------------------------------------------------------------------------------------------------------------*/
|
|
|
|
// No direct access to this file
|
|
defined('_JEXEC') or die('Restricted access');
|
|
|
|
// import the Joomla modellist library
|
|
jimport('joomla.application.component.modellist');
|
|
|
|
/**
|
|
* Snippets Model
|
|
*/
|
|
class ComponentbuilderModelSnippets extends JModelList
|
|
{
|
|
public function __construct($config = array())
|
|
{
|
|
if (empty($config['filter_fields']))
|
|
{
|
|
$config['filter_fields'] = array(
|
|
'a.id','id',
|
|
'a.published','published',
|
|
'a.ordering','ordering',
|
|
'a.created_by','created_by',
|
|
'a.modified_by','modified_by',
|
|
'a.name','name',
|
|
'a.url','url',
|
|
'a.type','type',
|
|
'a.heading','heading'
|
|
);
|
|
}
|
|
|
|
parent::__construct($config);
|
|
}
|
|
|
|
/**
|
|
* Method to auto-populate the model state.
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function populateState($ordering = null, $direction = null)
|
|
{
|
|
$app = JFactory::getApplication();
|
|
|
|
// Adjust the context to support modal layouts.
|
|
if ($layout = $app->input->get('layout'))
|
|
{
|
|
$this->context .= '.' . $layout;
|
|
}
|
|
$name = $this->getUserStateFromRequest($this->context . '.filter.name', 'filter_name');
|
|
$this->setState('filter.name', $name);
|
|
|
|
$url = $this->getUserStateFromRequest($this->context . '.filter.url', 'filter_url');
|
|
$this->setState('filter.url', $url);
|
|
|
|
$type = $this->getUserStateFromRequest($this->context . '.filter.type', 'filter_type');
|
|
$this->setState('filter.type', $type);
|
|
|
|
$heading = $this->getUserStateFromRequest($this->context . '.filter.heading', 'filter_heading');
|
|
$this->setState('filter.heading', $heading);
|
|
|
|
$sorting = $this->getUserStateFromRequest($this->context . '.filter.sorting', 'filter_sorting', 0, 'int');
|
|
$this->setState('filter.sorting', $sorting);
|
|
|
|
$access = $this->getUserStateFromRequest($this->context . '.filter.access', 'filter_access', 0, 'int');
|
|
$this->setState('filter.access', $access);
|
|
|
|
$search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search');
|
|
$this->setState('filter.search', $search);
|
|
|
|
$published = $this->getUserStateFromRequest($this->context . '.filter.published', 'filter_published', '');
|
|
$this->setState('filter.published', $published);
|
|
|
|
$created_by = $this->getUserStateFromRequest($this->context . '.filter.created_by', 'filter_created_by', '');
|
|
$this->setState('filter.created_by', $created_by);
|
|
|
|
$created = $this->getUserStateFromRequest($this->context . '.filter.created', 'filter_created');
|
|
$this->setState('filter.created', $created);
|
|
|
|
// List state information.
|
|
parent::populateState($ordering, $direction);
|
|
}
|
|
|
|
/**
|
|
* Method to get an array of data items.
|
|
*
|
|
* @return mixed An array of data items on success, false on failure.
|
|
*/
|
|
public function getItems()
|
|
{
|
|
// check in items
|
|
$this->checkInNow();
|
|
|
|
// load parent items
|
|
$items = parent::getItems();
|
|
|
|
// set values to display correctly.
|
|
if (ComponentbuilderHelper::checkArray($items))
|
|
{
|
|
// get user object.
|
|
$user = JFactory::getUser();
|
|
foreach ($items as $nr => &$item)
|
|
{
|
|
$access = ($user->authorise('snippet.access', 'com_componentbuilder.snippet.' . (int) $item->id) && $user->authorise('snippet.access', 'com_componentbuilder'));
|
|
if (!$access)
|
|
{
|
|
unset($items[$nr]);
|
|
continue;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
// set selection value to a translatable value
|
|
if (ComponentbuilderHelper::checkArray($items))
|
|
{
|
|
foreach ($items as $nr => &$item)
|
|
{
|
|
// convert type
|
|
$item->type = $this->selectionTranslation($item->type, 'type');
|
|
}
|
|
}
|
|
|
|
|
|
// return items
|
|
return $items;
|
|
}
|
|
|
|
/**
|
|
* Method to convert selection values to translatable string.
|
|
*
|
|
* @return translatable string
|
|
*/
|
|
public function selectionTranslation($value,$name)
|
|
{
|
|
// Array of type language strings
|
|
if ($name === 'type')
|
|
{
|
|
$typeArray = array(
|
|
1 => 'COM_COMPONENTBUILDER_SNIPPET_LAYOUT',
|
|
2 => 'COM_COMPONENTBUILDER_SNIPPET_NAVIGATIONS',
|
|
3 => 'COM_COMPONENTBUILDER_SNIPPET_ELEMENTS',
|
|
4 => 'COM_COMPONENTBUILDER_SNIPPET_COMMON',
|
|
5 => 'COM_COMPONENTBUILDER_SNIPPET_JAVASCRIPT',
|
|
6 => 'COM_COMPONENTBUILDER_SNIPPET_CHARTS'
|
|
);
|
|
// Now check if value is found in this array
|
|
if (isset($typeArray[$value]) && ComponentbuilderHelper::checkString($typeArray[$value]))
|
|
{
|
|
return $typeArray[$value];
|
|
}
|
|
}
|
|
return $value;
|
|
}
|
|
|
|
/**
|
|
* Method to build an SQL query to load the list data.
|
|
*
|
|
* @return string An SQL query
|
|
*/
|
|
protected function getListQuery()
|
|
{
|
|
// Get the user object.
|
|
$user = JFactory::getUser();
|
|
// Create a new query object.
|
|
$db = JFactory::getDBO();
|
|
$query = $db->getQuery(true);
|
|
|
|
// Select some fields
|
|
$query->select('a.*');
|
|
|
|
// From the componentbuilder_item table
|
|
$query->from($db->quoteName('#__componentbuilder_snippet', 'a'));
|
|
|
|
// Filter by published state
|
|
$published = $this->getState('filter.published');
|
|
if (is_numeric($published))
|
|
{
|
|
$query->where('a.published = ' . (int) $published);
|
|
}
|
|
elseif ($published === '')
|
|
{
|
|
$query->where('(a.published = 0 OR a.published = 1)');
|
|
}
|
|
|
|
// Join over the asset groups.
|
|
$query->select('ag.title AS access_level');
|
|
$query->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access');
|
|
// Filter by access level.
|
|
if ($access = $this->getState('filter.access'))
|
|
{
|
|
$query->where('a.access = ' . (int) $access);
|
|
}
|
|
// Implement View Level Access
|
|
if (!$user->authorise('core.options', 'com_componentbuilder'))
|
|
{
|
|
$groups = implode(',', $user->getAuthorisedViewLevels());
|
|
$query->where('a.access IN (' . $groups . ')');
|
|
}
|
|
// Filter by search.
|
|
$search = $this->getState('filter.search');
|
|
if (!empty($search))
|
|
{
|
|
if (stripos($search, 'id:') === 0)
|
|
{
|
|
$query->where('a.id = ' . (int) substr($search, 3));
|
|
}
|
|
else
|
|
{
|
|
$search = $db->quote('%' . $db->escape($search) . '%');
|
|
$query->where('(a.name LIKE '.$search.' OR a.url LIKE '.$search.' OR a.type LIKE '.$search.' OR a.heading LIKE '.$search.' OR a.description LIKE '.$search.')');
|
|
}
|
|
}
|
|
|
|
// Filter by Type.
|
|
if ($type = $this->getState('filter.type'))
|
|
{
|
|
$query->where('a.type = ' . $db->quote($db->escape($type)));
|
|
}
|
|
|
|
// Add the list ordering clause.
|
|
$orderCol = $this->state->get('list.ordering', 'a.id');
|
|
$orderDirn = $this->state->get('list.direction', 'asc');
|
|
if ($orderCol != '')
|
|
{
|
|
$query->order($db->escape($orderCol . ' ' . $orderDirn));
|
|
}
|
|
|
|
return $query;
|
|
}
|
|
|
|
/**
|
|
* Method to get list export data.
|
|
*
|
|
* @return mixed An array of data items on success, false on failure.
|
|
*/
|
|
public function getExportData($pks)
|
|
{
|
|
// setup the query
|
|
if (ComponentbuilderHelper::checkArray($pks))
|
|
{
|
|
// Set a value to know this is exporting method.
|
|
$_export = true;
|
|
// Get the user object.
|
|
$user = JFactory::getUser();
|
|
// Create a new query object.
|
|
$db = JFactory::getDBO();
|
|
$query = $db->getQuery(true);
|
|
|
|
// Select some fields
|
|
$query->select('a.*');
|
|
|
|
// From the componentbuilder_snippet table
|
|
$query->from($db->quoteName('#__componentbuilder_snippet', 'a'));
|
|
$query->where('a.id IN (' . implode(',',$pks) . ')');
|
|
// Implement View Level Access
|
|
if (!$user->authorise('core.options', 'com_componentbuilder'))
|
|
{
|
|
$groups = implode(',', $user->getAuthorisedViewLevels());
|
|
$query->where('a.access IN (' . $groups . ')');
|
|
}
|
|
|
|
// Order the results by ordering
|
|
$query->order('a.ordering ASC');
|
|
|
|
// Load the items
|
|
$db->setQuery($query);
|
|
$db->execute();
|
|
if ($db->getNumRows())
|
|
{
|
|
$items = $db->loadObjectList();
|
|
|
|
// set values to display correctly.
|
|
if (ComponentbuilderHelper::checkArray($items))
|
|
{
|
|
// get user object.
|
|
$user = JFactory::getUser();
|
|
foreach ($items as $nr => &$item)
|
|
{
|
|
$access = ($user->authorise('snippet.access', 'com_componentbuilder.snippet.' . (int) $item->id) && $user->authorise('snippet.access', 'com_componentbuilder'));
|
|
if (!$access)
|
|
{
|
|
unset($items[$nr]);
|
|
continue;
|
|
}
|
|
|
|
// decode snippet
|
|
$item->snippet = base64_decode($item->snippet);
|
|
// unset the values we don't want exported.
|
|
unset($item->asset_id);
|
|
unset($item->checked_out);
|
|
unset($item->checked_out_time);
|
|
}
|
|
}
|
|
// Add headers to items array.
|
|
$headers = $this->getExImPortHeaders();
|
|
if (ComponentbuilderHelper::checkObject($headers))
|
|
{
|
|
array_unshift($items,$headers);
|
|
}
|
|
return $items;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Method to get header.
|
|
*
|
|
* @return mixed An array of data items on success, false on failure.
|
|
*/
|
|
public function getExImPortHeaders()
|
|
{
|
|
// Get a db connection.
|
|
$db = JFactory::getDbo();
|
|
// get the columns
|
|
$columns = $db->getTableColumns("#__componentbuilder_snippet");
|
|
if (ComponentbuilderHelper::checkArray($columns))
|
|
{
|
|
// remove the headers you don't import/export.
|
|
unset($columns['asset_id']);
|
|
unset($columns['checked_out']);
|
|
unset($columns['checked_out_time']);
|
|
$headers = new stdClass();
|
|
foreach ($columns as $column => $type)
|
|
{
|
|
$headers->{$column} = $column;
|
|
}
|
|
return $headers;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Method to get a store id based on model configuration state.
|
|
*
|
|
* @return string A store id.
|
|
*
|
|
*/
|
|
protected function getStoreId($id = '')
|
|
{
|
|
// Compile the store id.
|
|
$id .= ':' . $this->getState('filter.id');
|
|
$id .= ':' . $this->getState('filter.search');
|
|
$id .= ':' . $this->getState('filter.published');
|
|
$id .= ':' . $this->getState('filter.ordering');
|
|
$id .= ':' . $this->getState('filter.created_by');
|
|
$id .= ':' . $this->getState('filter.modified_by');
|
|
$id .= ':' . $this->getState('filter.name');
|
|
$id .= ':' . $this->getState('filter.url');
|
|
$id .= ':' . $this->getState('filter.type');
|
|
$id .= ':' . $this->getState('filter.heading');
|
|
|
|
return parent::getStoreId($id);
|
|
}
|
|
|
|
/**
|
|
* Build an SQL query to checkin all items left checked out longer then a set time.
|
|
*
|
|
* @return a bool
|
|
*
|
|
*/
|
|
protected function checkInNow()
|
|
{
|
|
// Get set check in time
|
|
$time = JComponentHelper::getParams('com_componentbuilder')->get('check_in');
|
|
|
|
if ($time)
|
|
{
|
|
|
|
// Get a db connection.
|
|
$db = JFactory::getDbo();
|
|
// reset query
|
|
$query = $db->getQuery(true);
|
|
$query->select('*');
|
|
$query->from($db->quoteName('#__componentbuilder_snippet'));
|
|
$db->setQuery($query);
|
|
$db->execute();
|
|
if ($db->getNumRows())
|
|
{
|
|
// Get Yesterdays date
|
|
$date = JFactory::getDate()->modify($time)->toSql();
|
|
// reset query
|
|
$query = $db->getQuery(true);
|
|
|
|
// Fields to update.
|
|
$fields = array(
|
|
$db->quoteName('checked_out_time') . '=\'0000-00-00 00:00:00\'',
|
|
$db->quoteName('checked_out') . '=0'
|
|
);
|
|
|
|
// Conditions for which records should be updated.
|
|
$conditions = array(
|
|
$db->quoteName('checked_out') . '!=0',
|
|
$db->quoteName('checked_out_time') . '<\''.$date.'\''
|
|
);
|
|
|
|
// Check table
|
|
$query->update($db->quoteName('#__componentbuilder_snippet'))->set($fields)->where($conditions);
|
|
|
|
$db->setQuery($query);
|
|
|
|
$db->execute();
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|