| Current Path : /home/chauffn/www/administrator/components/com_jmap/models/ |
| Current File : /home/chauffn/www/administrator/components/com_jmap/models/sources.php |
<?php
// namespace administrator\components\com_jmap\models;
/**
* @package JMAP::SOURCES::administrator::components::com_jmap
* @subpackage models
* @author Joomla! Extensions Store
* @copyright (C) 2015 - Joomla! Extensions Store
* @license GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html
*/
defined ( '_JEXEC' ) or die ( 'Restricted access' );
jimport('joomla.filesystem.folder');
/**
* Sources model responsibilities
*
* @package JMAP::SOURCES::administrator::components::com_jmap
* @subpackage models
* @since 1.0
*/
interface IJMapModelSources {
/**
* Storing entity by ORM table
*
* @access public
* @return mixed
*/
public function storeEntity($forceRegenerate = false, $wizard = false, $wizardModel = null);
/**
* Try to load frontend multilevel cats manifest for this component data source
* To have option for multi categorization a data source needs 3 requirements:
* 1)Have a valid manifest.json for frontend rendering
* 2)Have a sqlquery managed field for cat title use
* 3)Have a maintable not related to categories itself
*
* @access public
* @param Object $record
* @return boolean
*/
public function getHasManifest($record);
/**
* Try to load route helper manifest for this component data source
* If a manifest is available to execute the routing helper by JSitemap
* show the option accordingly in the data source edit
*
* @access public
* @param Object $record
* @return boolean
*/
public function getHasRouteManifest($record);
/**
* Try to check if the component table has entity ruled by create date,
* and if yes filtering by latest months can be shown and afterwards applied at runtime
*
* @param Object $record
* @return boolean
*/
public function gethasCreatedDate($record);
}
/**
* Sources model concrete implementation <<testable_behavior>>
*
* @package JMAP::SOURCES::administrator::components::com_jmap
* @subpackage models
* @since 1.0
*/
class JMapModelSources extends JMapModel implements IJMapModelSources {
/**
* Records query result set
*
* @access private
* @var Object[]
*/
private $records;
/**
* Load table fields on demand
*
* @access private
* @return array
*/
private function loadTables() {
// Tables select list
$tableOptions = array();
$queryTables = "SHOW TABLES";
$this->_db->setQuery($queryTables);
try {
$elements = $this->_db->loadColumn();
if($this->_db->getErrorNum()) {
throw new JMapException($this->_db->getErrorMsg(), 'notice');
}
}
catch (JMapException $e) {
$this->app->enqueueMessage($e->getMessage(), $e->getErrorLevel());
$elements = array();
} catch (Exception $e) {
$jmapException = new JMapException($e->getMessage(), 'notice');
$this->app->enqueueMessage($jmapException->getMessage(), $jmapException->getErrorLevel());
$elements = array();
}
if(is_array($elements)) {
$options = array();
$tablePrefix = $this->_db->getPrefix();
$tableOptions[] = JHtml::_('select.option', null, JText::_('COM_JMAP_SELECTTABLE'));
foreach ($elements as $element) {
// Reset table name by prefix
$userElement = str_ireplace($tablePrefix, '', $element);
$element = str_ireplace($tablePrefix, '#__', $element);
$tableOptions[] = JHtml::_('select.option', $element, $userElement);
}
}
return $tableOptions;
}
/**
* Load table fields on demand
*
* @access private
* @param Object $record
* @param string $tableName
* @return array
*/
private function loadTableFields($record, $tableName) {
// Option init
$fieldsOptions = array();
$fieldsOptions[] = JHtml::_('select.option', null, JText::_('COM_JMAP_SELECTFIELD'));
if(isset($record->sqlquery_managed->$tableName) && $record->sqlquery_managed->$tableName) {
$queryFields = "SHOW COLUMNS " .
"\n FROM " . $this->_db->quoteName($record->sqlquery_managed->$tableName);
$this->_db->setQuery($queryFields);
try {
$elements = $this->_db->loadColumn();
if($this->_db->getErrorNum()) {
throw new JMapException($this->_db->getErrorMsg(), 'notice');
}
}
catch (JMapException $e) {
$this->app->enqueueMessage($e->getMessage(), $e->getErrorLevel());
$elements = array();
} catch (Exception $e) {
$jmapException = new JMapException($e->getMessage(), 'notice');
$this->app->enqueueMessage($jmapException->getMessage(), $jmapException->getErrorLevel());
$elements = array();
}
if(is_array($elements) && count($elements)) {
foreach ($elements as $element) {
$fieldsOptions[] = JHtml::_('select.option', $element, $element);
}
}
}
return $fieldsOptions;
}
/**
* Convert additional fields to SQL string format
*
* @access private
* @param array& $selectConditions
* @param Object $chunksObject
* @param string $tableName
* @param string $fieldName
* @return array
*/
private function convertAdditionalFields(&$selectConditions, $chunksObject, $tableName, $fieldName) {
// Additional fields conversion
if(!empty($chunksObject->$fieldName)) {
$additionalParams = explode(PHP_EOL, $chunksObject->$fieldName);
foreach ($additionalParams as $param) {
$subCkunks = explode(" ", preg_replace('!\s+!', ' ', $param));
// Case with AS
if (count($subCkunks) > 1) {
$firstSubChunk = $this->_db->quoteName($chunksObject->$tableName) . "." . $this->_db->quoteName($subCkunks[0]);
$secondSubChunk = $this->_db->quoteName($subCkunks[2]);
$asAdditionalParam = $subCkunks[2] && $subCkunks[1] === 'AS' ? ' ' . $subCkunks[1] . ' ' . $this->_db->quoteName($subCkunks[2]) : null;
$selectConditions[] = $firstSubChunk . $asAdditionalParam;
} else { // Case without AS so consider only first subchunk
$firstSubChunk = $this->_db->quoteName($chunksObject->$tableName) . "." . $this->_db->quoteName($subCkunks[0]);
$selectConditions[] = $firstSubChunk;
}
}
}
return $selectConditions;
}
/**
* Build list entities query
*
* @access protected
* @return string
*/
protected function buildListQuery() {
// WHERE
$where = array ();
$whereString = null;
$orderString = null;
// STATE FILTER
if ($filter_state = $this->state->get ( 'state' )) {
if ($filter_state == 'P') {
$where [] = 's.published = 1';
} else if ($filter_state == 'U') {
$where [] = 's.published = 0';
}
}
// TYPE FILTER
if ($this->state->get ( 'type' )) {
$where [] = "s.type = " . $this->_db->quote($this->state->get ( 'type' ));
}
// TEXT FILTER
if ($this->state->get ( 'searchword' )) {
$where [] = "s.name LIKE " . $this->_db->quote("%" . $this->state->get ( 'searchword' ) . "%");
}
if (count ( $where )) {
$whereString = "\n WHERE " . implode ( "\n AND ", $where );
}
// ORDERBY
if ($this->state->get ( 'order' )) {
$orderString = "\n ORDER BY " . $this->state->get ( 'order' ) . " ";
}
// ORDERDIR
if ($this->state->get ( 'order_dir' )) {
$orderString .= $this->state->get ( 'order_dir' );
}
$query = "SELECT s.*, u.name AS editor" .
"\n FROM #__jmap AS s" .
"\n LEFT JOIN #__users AS u" .
"\n ON s.checked_out = u.id" .
$whereString . $orderString;
return $query;
}
/**
* Building raw query with REQUEST chunks query managed
*
* @access protected
* @param string $chunksString
* @param Object& $tableObject
* @param boolean $wizardClient
* @param Object& $wizardModel
* @return boolean
*/
protected function buildRawQuery($chunksString, &$tableObject, $wizardClient = false, &$wizardModel = null) {
// Decode chunkString in a plain stdClass object and a JRegistry object
if($chunksString) {
$chunksObject = json_decode($chunksString);
$chunksRegistry = JRegistry::getInstance('sqlquery_managed');
$chunksRegistry->loadObject($chunksObject);
}
// Decode params string in a JRegistry object for params evaluation
if(isset($tableObject->params)) {
$paramsRegistry = JRegistry::getInstance('params');
$paramsRegistry->loadString($tableObject->params);
}
if(is_object($chunksObject)) {
// Init array containers
$mainTable = $chunksObject->table_maintable;
$selectConditions = array();
$joinConditions = array();
$whereConditions = array();
$orderbyConditions = array();
$groupbyConditions = array();
// Get required maintable table fields, if not valid throw exception
$columnsQuery = "SHOW COLUMNS FROM " . $this->_db->quoteName($chunksObject->table_maintable);
$this->_db->setQuery($columnsQuery);
if(!$tableFields = $this->_db->loadColumn()) {
throw new JMapException(sprintf(JText::_('COM_JMAP_ERROR_BUILDING_QUERY_NOEXTENSION_MAINTABLE_INSTALLED_DETECTED'), $chunksObject->table_maintable), 'error');
return false;
}
// ****SELECT FIELDS PROCESSING****
// Explicit required
$asTitleField = !empty($chunksObject->titlefield_as) ? " AS " . $this->_db->quoteName($chunksObject->titlefield_as) : null;
$selectConditions[] = $this->_db->quoteName($mainTable) . "." . $this->_db->quoteName($chunksObject->titlefield) . $asTitleField;
// Access field supported
if(in_array('modified', $tableFields)) {
$selectConditions[] = $this->_db->quoteName($mainTable) . "." . $this->_db->quoteName('modified');
}
// Explicit required
if(!empty($tableFields) && isset($chunksObject->use_alias) && !!$chunksObject->use_alias && in_array('alias', $tableFields)) {
$asIdField = !empty($chunksObject->idfield_as) ? " AS " . $this->_db->quoteName($chunksObject->idfield_as) : " AS " . $this->_db->quoteName($chunksObject->id);
$selectConditions[] = "CONCAT_WS(':', " .
$this->_db->quoteName($mainTable) . "." . $this->_db->quoteName($chunksObject->id) . ", " .
$this->_db->quoteName($mainTable) . "." . $this->_db->quoteName('alias'). ")" . $asIdField;
} else {
$asIdField = !empty($chunksObject->idfield_as) ? " AS " . $this->_db->quoteName($chunksObject->idfield_as) : null;
$selectConditions[] = $this->_db->quoteName($mainTable) . "." . $this->_db->quoteName($chunksObject->id) . $asIdField;
}
// Explicit optional
if(!empty($chunksObject->catid)) {
// If flagged as use cat alias from 1� JOIN TABLE, should be valid conditions: First JOIN table MUST be the same as maintable and ON same field used as catid
if(isset($chunksObject->use_catalias) &&
!!$chunksObject->use_catalias &&
!empty($chunksObject->table_joinfrom_jointable1) &&
!empty($chunksObject->field_joinfrom_jointable1) &&
$chunksObject->table_maintable == $chunksObject->table_joinfrom_jointable1 &&
$chunksObject->catid == $chunksObject->field_joinfrom_jointable1) {
// Get fields in jointable1
$columnsQuery = "SHOW COLUMNS FROM " . $this->_db->quoteName($chunksObject->table_joinwith_jointable1);
$this->_db->setQuery($columnsQuery);
if(!$joinTableFields = $this->_db->loadColumn()) {
throw new JMapException(JText::_('COM_JMAP_ERROR_BUILDING_QUERY_RETRIEVING_JOINTABLE1_FIELDS'), 'error');
return false;
}
// If jointable1 contains alias field
if(in_array('alias', $joinTableFields)) {
$asCatidField = !empty($chunksObject->catidfield_as) ? " AS " . $this->_db->quoteName($chunksObject->catidfield_as) : " AS " . $this->_db->quoteName($chunksObject->catid);;
$selectConditions[] = "CONCAT_WS(':', " .
$this->_db->quoteName($mainTable) . "." . $this->_db->quoteName($chunksObject->catid) . ", " .
$this->_db->quoteName($chunksObject->table_joinwith_jointable1) . "." . $this->_db->quoteName('alias'). ")" . $asCatidField;
}
} else {
$asCatidField = !empty($chunksObject->catidfield_as) ? " AS " . $this->_db->quoteName($chunksObject->catidfield_as) : null;
$selectConditions[] = $this->_db->quoteName($mainTable) . "." . $this->_db->quoteName($chunksObject->catid) . $asCatidField;
}
}
// Implicit optional
$this->convertAdditionalFields ( $selectConditions, $chunksObject, 'table_maintable' ,'additionalparams_maintable' );
// ****JOIN TABLES PROCESSING****
for($jt=1,$maxJoin=3;$jt<=$maxJoin;$jt++) {
// If not set continue cycle and avoid exceptions
if(!isset($chunksObject->{'table_joinwith_jointable'.$jt})) {
continue;
}
// Main base condition: 4 fields all compiled otherwise continue
if( empty($chunksObject->{'table_joinfrom_jointable'.$jt}) ||
empty($chunksObject->{'table_joinwith_jointable'.$jt}) ||
empty($chunksObject->{'field_joinfrom_jointable'.$jt}) ||
empty($chunksObject->{'field_joinwith_jointable'.$jt})) {
continue;
}
// Main JOIN WITH table name
$joinTable = $chunksObject->{'table_joinwith_jointable'.$jt};
// ****SELECT FIELDS PROCESSING****
if(!empty($chunksObject->{'field_select_jointable'.$jt})) {
$fieldAsJointable = !empty($chunksObject->{'field_as_jointable'.$jt}) ? " AS " . $this->_db->quoteName($chunksObject->{'field_as_jointable'.$jt}) : null;
$selectConditions[] = $this->_db->quoteName($joinTable) . "." . $this->_db->quoteName($chunksObject->{'field_select_jointable'.$jt}) . $fieldAsJointable;
}
// Implicit optional
$this->convertAdditionalFields ( $selectConditions, $chunksObject, 'table_joinwith_jointable'.$jt ,'additionalparams_jointable'.$jt );
// ****WHERE FIELDS PROCESSING****
for($wjt=1,$maxWhere=3;$wjt<=$maxWhere;$wjt++) {
if(!empty($chunksObject->{'where'.$wjt.'_jointable'.$jt})) {
// Manage IN clause by searching for multiple IDs
if(strpos($chunksObject->{'where'.$wjt.'_value_jointable'.$jt}, ',')) {
$jtoperatorPrefix = null;
if($chunksObject->{'where'.$wjt.'_operator_jointable'.$jt} == '!=') {
$jtoperatorPrefix = ' NOT';
}
$jtoperator = "$jtoperatorPrefix IN ";
$whereConditions[] = $this->_db->quoteName($joinTable) . "." . $this->_db->quoteName($chunksObject->{'where'.$wjt.'_jointable'.$jt}) . $jtoperator . "(" . $chunksObject->{'where'.$wjt.'_value_jointable'.$jt} . ")";
} else {
$jtoperator = !empty($chunksObject->{'where'.$wjt.'_operator_jointable'.$jt}) ? " " . $chunksObject->{'where'.$wjt.'_operator_jointable'.$jt} . " " : " = ";
if(preg_match('/\{\d+months\}/', $chunksObject->{'where'.$wjt.'_value_jointable'.$jt})) {
$whereConditions[] = $this->_db->quoteName($joinTable) . "." . $this->_db->quoteName($chunksObject->{'where'.$wjt.'_jointable'.$jt}) . $jtoperator . $chunksObject->{'where'.$wjt.'_value_jointable'.$jt};
} else {
if($jtoperator === ' LIKE ') {
$whereConditions[] = $this->_db->quoteName($joinTable) . "." . $this->_db->quoteName($chunksObject->{'where'.$wjt.'_jointable'.$jt}) . $jtoperator . $this->_db->quote('%' . $chunksObject->{'where'.$wjt.'_value_jointable'.$jt} . '%');
} else {
$whereConditions[] = $this->_db->quoteName($joinTable) . "." . $this->_db->quoteName($chunksObject->{'where'.$wjt.'_jointable'.$jt}) . $jtoperator . $this->_db->quote($chunksObject->{'where'.$wjt.'_value_jointable'.$jt});
}
}
}
}
}
// ****JOIN TABLES INNERPROCESSING****
$joinType = !empty($chunksObject->{'jointype_jointable'.$jt}) ? $chunksObject->{'jointype_jointable'.$jt} . " JOIN" : "JOIN";
$joinConditions[] = $joinType . " " . $this->_db->quoteName($joinTable) . " ON " .
$this->_db->quoteName($chunksObject->{'table_joinfrom_jointable'.$jt}) . "." . $this->_db->quoteName($chunksObject->{'field_joinfrom_jointable'.$jt}) . " = " .
$this->_db->quoteName($chunksObject->{'table_joinwith_jointable'.$jt}) . "." . $this->_db->quoteName($chunksObject->{'field_joinwith_jointable'.$jt});
// ****ORDER BY FIELDS PROCESSING****
if(!empty($chunksObject->{'orderby_jointable'.$jt})) {
$orderbyDirectionJointable = !empty($chunksObject->{'orderby_direction_jointable'.$jt}) ? " " . $chunksObject->{'orderby_direction_jointable'.$jt} : null;
array_unshift($orderbyConditions, $this->_db->quoteName($chunksObject->{'table_joinwith_jointable'.$jt}) . "." . $this->_db->quoteName($chunksObject->{'orderby_jointable'.$jt}) . $orderbyDirectionJointable);
}
// ****GROUP BY FIELDS PROCESSING****
if(!empty($chunksObject->{'groupby_jointable'.$jt})) {
$groupbyConditions[] = $this->_db->quoteName($joinTable) . "." . $this->_db->quoteName($chunksObject->{'groupby_jointable'.$jt});
}
}
// ****WHERE FIELDS PROCESSING****
// *AUTO WHERE PART* injected fields
if(is_array($tableFields) && count($tableFields)) {
// Published field supported
if(in_array('published', $tableFields)) {
$whereConditions[] = $this->_db->quoteName($mainTable) . "." . $this->_db->quoteName('published') . " = " . $this->_db->quote(1);
} elseif(in_array('state', $tableFields)) { // State field supported fallback
$whereConditions[] = $this->_db->quoteName($mainTable) . "." . $this->_db->quoteName('state') . " = " . $this->_db->quote(1);
}
// Access field supported
if(in_array('access', $tableFields)) {
$whereConditions[] = $this->_db->quoteName($mainTable) . "." . $this->_db->quoteName('access') . " IN {aid}" ;
}
// Created field supported, set placeholder to limit items to recent months
if($paramsRegistry->get('created_date', null) && in_array('created', $tableFields)) {
$latestMonths = $paramsRegistry->get('created_date');
// Fix for JEvents, mapping #__jevents_vevdetail -> #__jevents_vevent
if($mainTable == '#__jevents_vevdetail') {
$whereConditions[] = $this->_db->quoteName('#__jevents_vevent') . "." . $this->_db->quoteName('created') . " > {" . $latestMonths . "months}" ;
} else {
$whereConditions[] = $this->_db->quoteName($mainTable) . "." . $this->_db->quoteName('created') . " > {" . $latestMonths . "months}" ;
}
}
// Language field supported
if(in_array('language', $tableFields)) {
$whereConditions[] = " (" . $this->_db->quoteName($mainTable) . "." . $this->_db->quoteName('language') . " = " . $this->_db->quote('*') .
" OR " . $this->_db->quoteName($mainTable) . "." . $this->_db->quoteName('language') . " = {langtag})";
}
}
// *EXPLICIT WHERE PART*
for($wmt=1,$maxWhere=3;$wmt<=$maxWhere;$wmt++) {
if(!empty($chunksObject->{'where'.$wmt.'_maintable'})) {
// Manage IN clause by searching for multiple IDs
if(strpos($chunksObject->{'where'.$wmt.'_value_maintable'}, ',')) {
$operatorPrefix = null;
if($chunksObject->{'where'.$wmt.'_operator_maintable'} == '!=') {
$operatorPrefix = ' NOT';
}
$operator = "$operatorPrefix IN ";
$whereConditions[] = $this->_db->quoteName($mainTable) . "." . $this->_db->quoteName($chunksObject->{'where'.$wmt.'_maintable'}) . $operator . "(" . $chunksObject->{'where'.$wmt.'_value_maintable'} . ")";
} else {
$operator = !empty($chunksObject->{'where'.$wmt.'_operator_maintable'}) ? " " . $chunksObject->{'where'.$wmt.'_operator_maintable'} . " " : " = ";
if(preg_match('/\{\d+months\}/', $chunksObject->{'where'.$wmt.'_value_maintable'})) {
$whereConditions[] = $this->_db->quoteName($mainTable) . "." . $this->_db->quoteName($chunksObject->{'where'.$wmt.'_maintable'}) . $operator . $chunksObject->{'where'.$wmt.'_value_maintable'};
} else {
if($operator === ' LIKE ') {
$whereConditions[] = $this->_db->quoteName($mainTable) . "." . $this->_db->quoteName($chunksObject->{'where'.$wmt.'_maintable'}) . $operator . $this->_db->quote('%' . $chunksObject->{'where'.$wmt.'_value_maintable'} . '%');
} else {
$whereConditions[] = $this->_db->quoteName($mainTable) . "." . $this->_db->quoteName($chunksObject->{'where'.$wmt.'_maintable'}) . $operator . $this->_db->quote($chunksObject->{'where'.$wmt.'_value_maintable'});
}
}
}
}
}
// ****ORDER BY FIELDS PROCESSING****
if(!empty($chunksObject->{'orderby_maintable'})) {
$orderbyDirectionMaintable = !empty($chunksObject->{'orderby_direction_maintable'}) ? " " . $chunksObject->{'orderby_direction_maintable'} : null;
array_push($orderbyConditions, $this->_db->quoteName($chunksObject->{'table_maintable'}) . "." . $this->_db->quoteName($chunksObject->{'orderby_maintable'}) . $orderbyDirectionMaintable);
}
// ****GROUP BY FIELDS PROCESSING****
if(!empty($chunksObject->{'groupby_maintable'})) {
$groupbyConditions[] = $this->_db->quoteName($chunksObject->{'table_maintable'}) . "." . $this->_db->quoteName($chunksObject->{'groupby_maintable'});
}
// ****START BUILD CONCATENATE FINAL QUERY STRING****
// *SELECT* STATEMENT BUILD
$finalQueryString = "SELECT \n " . implode(", \n ", $selectConditions);
// *FROM* STATEMENT BUILD
$finalQueryString .= "\n FROM " . $this->_db->quoteName($chunksObject->table_maintable);
// *JOIN* STATEMENT BUILD
if(count($joinConditions)) {
$finalQueryString .= "\n " . implode("\n ", $joinConditions);
}
// *WHERE* STATEMENT BUILD
if(count($whereConditions)) {
$finalQueryString .= "\n WHERE \n " . implode("\n AND ", $whereConditions);
}
// *GROUP BY BY* STATEMENT BUILD
if(count($groupbyConditions)) {
$finalQueryString .= "\n GROUP BY \n " . implode(", \n ", $groupbyConditions);
}
// *ORDER BY* STATEMENT BUILD
if(count($orderbyConditions)) {
$finalQueryString .= "\n ORDER BY \n " . implode(", \n ", $orderbyConditions);
}
} else {
throw new JMapException(JText::_('COM_JMAP_ERROR_MANIFEST_FORMAT'), 'error');
return false;
}
// Call wizard model substitutions here if is valid object $wizardModel and not wizard client
if(!$wizardClient && is_object($wizardModel)) {
$finalQueryString = $wizardModel->getSubstitutionsOnDemand($finalQueryString);
}
// All well done so final assignment to table object referenced for later store
$tableObject->sqlquery = $finalQueryString;
return true;
}
/**
* Main get data method
*
* @access public
* @return Object[]
*/
public function getData() {
// Build query
$query = $this->buildListQuery ();
$this->_db->setQuery ( $query, $this->getState ( 'limitstart' ), $this->getState ( 'limit' ) );
try {
$result = $this->_db->loadObjectList ();
if($this->_db->getErrorNum()) {
throw new JMapException(JText::_('COM_JMAP_ERROR_RETRIEVING_DATASOURCES') . $this->_db->getErrorMsg(), 'error');
}
} catch (JMapException $e) {
$this->app->enqueueMessage($e->getMessage(), $e->getErrorLevel());
$result = array();
} catch (Exception $e) {
$jmapException = new JMapException($e->getMessage(), 'error');
$this->app->enqueueMessage($jmapException->getMessage(), $jmapException->getErrorLevel());
$result = array();
}
return $result;
}
/**
* Method to get a form object.
*
* @param array $data
* the form.
* @param boolean $loadData
* the form is to load its own data (default case), false if not.
*
* @return mixed JForm object on success, false on failure
* @since 1.6
*/
public function getFormFields($record) {
// Avoid forms error on new records
if(!$record->id) {
return false;
}
jimport ( 'joomla.form.form' );
$pluginName = strtolower($record->name);
// Try to generate the form and bind parameters data between JRegistry and SimpleXMLElement nodes
try {
// Add plugin form path
JForm::addFormPath ( JPATH_COMPONENT_ADMINISTRATOR . '/plugins/' . $pluginName );
// Get the form object instance
$form = JForm::getInstance( 'com_jmap.plugin.' . $pluginName, $pluginName, array (
'control' => 'params',
'load_data' => false
), false, '/datasource' );
if (empty ( $form )) {
return false;
}
// Get and bind plugin config parameters
$registryParams = JRegistry::getInstance('com_jmap.plugin.' . $pluginName);
$registryParams->loadString($record->params);
$form->bind($registryParams);
// Load the language file for the plugin
// Manage partial language translations
$jLang = JFactory::getLanguage();
$jLang->load($pluginName, JPATH_COMPONENT_ADMINISTRATOR . '/plugins/' . $pluginName, 'en-GB', true, true);
if($jLang->getTag() != 'en-GB') {
$jLang->load($pluginName, JPATH_COMPONENT_ADMINISTRATOR . '/plugins/' . $pluginName, null, true, false);
}
} catch (JMapException $e) {
$this->app->enqueueMessage($e->getMessage(), $e->getErrorLevel());
$elements = array();
} catch (Exception $e) {
$jmapException = new JMapException($e->getMessage(), 'notice');
$this->app->enqueueMessage($jmapException->getMessage(), $jmapException->getErrorLevel());
$elements = array();
}
return $form;
}
/**
* Return select lists used as filter for listEntities
*
* @access public
* @return array
*/
public function getFilters() {
$filters ['state'] = JHtml::_ ( 'grid.state', $this->getState ( 'state' ) );
$datasourceTypes = array();
$datasourceTypes[] = JHtml::_('select.option', null, JText::_('COM_JMAP_ALL_DATASOURCE'));
$datasourceTypes[] = JHtml::_('select.option', 'user', JText::_('COM_JMAP_USER_DATASOURCE'));
$datasourceTypes[] = JHtml::_('select.option', 'menu', JText::_('COM_JMAP_MENU_DATASOURCE'));
$datasourceTypes[] = JHtml::_('select.option', 'content', JText::_('COM_JMAP_CONTENT_DATASOURCE'));
$datasourceTypes[] = JHtml::_('select.option', 'plugin', JText::_('COM_JMAP_PLUGIN_DATASOURCE'));
$datasourceTypes[] = JHtml::_('select.option', 'links', JText::_('COM_JMAP_LINKS_DATASOURCE'));
$filters ['type'] = JHtml::_ ( 'select.genericlist', $datasourceTypes, 'filter_type', 'onchange="Joomla.submitform();"', 'value', 'text', $this->getState ( 'type' ));
return $filters;
}
/**
* Return select lists used as filter for editEntity
*
* @access public
* @param Object $record
* @return array
*/
public function getLists($record = null) {
$lists = array ();
// Grid states
$lists ['published'] = JHtml::_ ( 'select.booleanlist', 'published', null, $record->published );
// Components select list
$queryComponent = "SELECT DISTINCT " . $this->_db->quoteName('element') . " AS value, SUBSTRING(" . $this->_db->quoteName('element') . ", 5) AS text" .
"\n FROM #__extensions" .
"\n WHERE (" . $this->_db->quoteName('protected') . " = 0" .
"\n OR " . $this->_db->quoteName('element') . " = " . $this->_db->quote('com_content') . // Exception for custom content sources
"\n OR " . $this->_db->quoteName('element') . " = " . $this->_db->quote('com_tags') . // Exception for custom tags sources
"\n OR " . $this->_db->quoteName('element') . " = " . $this->_db->quote('com_docman') . ")" . // Exception for docman 2 protected
"\n AND ". $this->_db->quoteName('type') . " = " . $this->_db->quote('component');
$this->_db->setQuery($queryComponent);
try {
$elements = $this->_db->loadObjectList();
if($this->_db->getErrorNum()) {
throw new JMapException($this->_db->getErrorMsg(), 'notice');
}
} catch (JMapException $e) {
$this->app->enqueueMessage($e->getMessage(), $e->getErrorLevel());
$elements = array();
} catch (Exception $e) {
$jmapException = new JMapException($e->getMessage(), 'notice');
$this->app->enqueueMessage($jmapException->getMessage(), $jmapException->getErrorLevel());
$elements = array();
}
array_unshift($elements, JHtml::_('select.option', null, JText::_('COM_JMAP_SELECTCOMPONENT')));
$lists ['components'] = JHtml::_ ( 'select.genericlist', $elements, 'sqlquery_managed[option]', 'data-validation="required"', 'value', 'text', @$record->sqlquery_managed->option);
// Tables select list
$tableOptions = $this->loadTables();
// Maintable select list
$lists ['tablesMaintable'] = JHtml::_ ( 'select.genericlist', $tableOptions, 'sqlquery_managed[table_maintable]', 'class="table_maintable" data-validation="required" data-bind="table_maintable"', 'value', 'text', @$record->sqlquery_managed->table_maintable);
$fieldsOptions = $this->loadTableFields($record, 'table_maintable');
$lists ['fieldsTitle'] = JHtml::_ ( 'select.genericlist', $fieldsOptions, 'sqlquery_managed[titlefield]', 'class="table_maintable" data-bind="field_maintable" data-validation="required"', 'value', 'text', @$record->sqlquery_managed->titlefield);
$lists ['fieldsID'] = JHtml::_ ( 'select.genericlist', $fieldsOptions, 'sqlquery_managed[id]', 'class="table_maintable" data-bind="field_maintable" data-validation="required"', 'value', 'text', @$record->sqlquery_managed->id);
$lists ['fieldsCatid'] = JHtml::_ ( 'select.genericlist', $fieldsOptions, 'sqlquery_managed[catid]', 'class="table_maintable" data-bind="field_maintable"', 'value', 'text', @$record->sqlquery_managed->catid);
$lists ['where1Maintable'] = JHtml::_ ( 'select.genericlist', $fieldsOptions, 'sqlquery_managed[where1_maintable]', 'class="table_maintable" data-bind="field_maintable"', 'value', 'text', @$record->sqlquery_managed->where1_maintable);
$lists ['where2Maintable'] = JHtml::_ ( 'select.genericlist', $fieldsOptions, 'sqlquery_managed[where2_maintable]', 'class="table_maintable" data-bind="field_maintable""', 'value', 'text', @$record->sqlquery_managed->where2_maintable);
$lists ['where3Maintable'] = JHtml::_ ( 'select.genericlist', $fieldsOptions, 'sqlquery_managed[where3_maintable]', 'class="table_maintable" data-bind="field_maintable"', 'value', 'text', @$record->sqlquery_managed->where3_maintable);
$lists ['orderByMaintable'] = JHtml::_ ( 'select.genericlist', $fieldsOptions, 'sqlquery_managed[orderby_maintable]', 'class="table_maintable" data-bind="field_maintable"', 'value', 'text', @$record->sqlquery_managed->orderby_maintable);
// Operators select list
$operatorOptions = array();
$operatorOptions[] = JHtml::_('select.option', null, '=');
$arrayOperators = array ('!=', '>', '<', '>=', '<=', 'LIKE');
foreach ($arrayOperators as $operator) {
$operatorOptions[] = JHtml::_('select.option', $operator, $operator);
}
for($wmo=1,$maxOperators=3;$wmo<=$maxOperators;$wmo++) {
$lists ['where'.$wmo.'MaintableOperators'] = JHtml::_ ( 'select.genericlist', $operatorOptions, 'sqlquery_managed[where'.$wmo.'_operator_maintable]', 'class="where_condition_operator"', 'value', 'text', @$record->sqlquery_managed->{'where'.$wmo.'_operator_maintable'});
}
// Order BY direction selectlist
$directionOptions = array();
$directionOptions[] = JHtml::_('select.option', null, JText::_('COM_JMAP_SELECTFIELD'));
$directionOptions[] = JHtml::_('select.option', 'ASC', 'Ascending');
$directionOptions[] = JHtml::_('select.option', 'DESC', 'Descending');
$lists ['orderByDirectionMaintable'] = JHtml::_ ( 'select.genericlist', $directionOptions, 'sqlquery_managed[orderby_direction_maintable]', 'class="right_select intermediate"', 'value', 'text', @$record->sqlquery_managed->orderby_direction_maintable);
$lists ['groupByMaintable'] = JHtml::_ ( 'select.genericlist', $fieldsOptions, 'sqlquery_managed[groupby_maintable]', 'class="table_maintable" data-bind="field_maintable"', 'value', 'text', @$record->sqlquery_managed->groupby_maintable);
// Cycle for JoinTable #n elements
$joinOptions = array();
$joinOptions[] = JHtml::_('select.option', null, JText::_('COM_JMAP_DEFAULT_JOIN'));
$joinOptions[] = JHtml::_('select.option', 'LEFT', JText::_('COM_JMAP_LEFT_JOIN'));
$joinOptions[] = JHtml::_('select.option', 'RIGHT', JText::_('COM_JMAP_RIGHT_JOIN'));
for($jt=1,$maxJoin=3;$jt<=$maxJoin;$jt++) {
// Tables select list
$fieldsJoinFromTableOptions = $this->loadTableFields($record, 'table_joinfrom_jointable'.$jt);
$fieldsJoinWithTableOptions = $this->loadTableFields($record, 'table_joinwith_jointable'.$jt);
// JoinFromJointables select list
$lists ['tablesJoinFromJointable'.$jt] = JHtml::_ ( 'select.genericlist', $tableOptions, 'sqlquery_managed[table_joinfrom_jointable'.$jt.']', 'class="table_joinfrom" data-bind="table_joinfrom_jointable'.$jt.'"', 'value', 'text', @$record->sqlquery_managed->{'table_joinfrom_jointable'.$jt});
// JoinWithJointables select list
$lists ['tablesJoinWithJointable'.$jt] = JHtml::_ ( 'select.genericlist', $tableOptions, 'sqlquery_managed[table_joinwith_jointable'.$jt.']', 'class="table_joinwith" data-bind="table_joinwith_jointable'.$jt.'"', 'value', 'text', @$record->sqlquery_managed->{'table_joinwith_jointable'.$jt});
// Join type Jointables
$lists ['jointypeJointable'.$jt] = JHtml::_ ( 'select.genericlist', $joinOptions, 'sqlquery_managed[jointype_jointable'.$jt.']', 'class="intermediate_small"', 'value', 'text', @$record->sqlquery_managed->{'jointype_jointable'.$jt});
$lists ['fieldsJoinFromJointable'.$jt] = JHtml::_ ( 'select.genericlist', $fieldsJoinFromTableOptions, 'sqlquery_managed[field_joinfrom_jointable'.$jt.']', 'class="field_joinfrom" data-bind="field_joinfrom_jointable'.$jt.'"', 'value', 'text', @$record->sqlquery_managed->{'field_joinfrom_jointable'.$jt});
$lists ['fieldsJoinWithJointable'.$jt] = JHtml::_ ( 'select.genericlist', $fieldsJoinWithTableOptions, 'sqlquery_managed[field_joinwith_jointable'.$jt.']', 'data-bind="field_joinwith_jointable'.$jt.'" class="field_joinwith right_select"', 'value', 'text', @$record->sqlquery_managed->{'field_joinwith_jointable'.$jt});
$lists ['fieldsSelectJointable'.$jt] = JHtml::_ ( 'select.genericlist', $fieldsJoinWithTableOptions, 'sqlquery_managed[field_select_jointable'.$jt.']', 'data-bind="field_joinwith_jointable'.$jt.'" class="field_joinwith right_select"', 'value', 'text', @$record->sqlquery_managed->{'field_select_jointable'.$jt});
$lists ['where1Jointable'.$jt] = JHtml::_ ( 'select.genericlist', $fieldsJoinWithTableOptions, 'sqlquery_managed[where1_jointable'.$jt.']', 'class="field_joinwith" data-bind="field_joinwith_jointable'.$jt.'"', 'value', 'text', @$record->sqlquery_managed->{'where1_jointable'.$jt});
$lists ['where2Jointable'.$jt] = JHtml::_ ( 'select.genericlist', $fieldsJoinWithTableOptions, 'sqlquery_managed[where2_jointable'.$jt.']', 'class="field_joinwith" data-bind="field_joinwith_jointable'.$jt.'"', 'value', 'text', @$record->sqlquery_managed->{'where2_jointable'.$jt});
$lists ['where3Jointable'.$jt] = JHtml::_ ( 'select.genericlist', $fieldsJoinWithTableOptions, 'sqlquery_managed[where3_jointable'.$jt.']', 'class="field_joinwith" data-bind="field_joinwith_jointable'.$jt.'"', 'value', 'text', @$record->sqlquery_managed->{'where3_jointable'.$jt});
$lists ['where1Jointable'.$jt.'Operators'] = JHtml::_ ( 'select.genericlist', $operatorOptions, 'sqlquery_managed[where1_operator_jointable'.$jt.']', 'class="where_condition_operator"', 'value', 'text', @$record->sqlquery_managed->{'where1_operator_jointable'.$jt});
$lists ['where2Jointable'.$jt.'Operators'] = JHtml::_ ( 'select.genericlist', $operatorOptions, 'sqlquery_managed[where2_operator_jointable'.$jt.']', 'class="where_condition_operator"', 'value', 'text', @$record->sqlquery_managed->{'where2_operator_jointable'.$jt});
$lists ['where3Jointable'.$jt.'Operators'] = JHtml::_ ( 'select.genericlist', $operatorOptions, 'sqlquery_managed[where3_operator_jointable'.$jt.']', 'class="where_condition_operator"', 'value', 'text', @$record->sqlquery_managed->{'where3_operator_jointable'.$jt});
$lists ['orderByJointable'.$jt] = JHtml::_ ( 'select.genericlist', $fieldsJoinWithTableOptions, 'sqlquery_managed[orderby_jointable'.$jt.']', 'class="field_joinwith" data-bind="field_joinwith_jointable'.$jt.'"', 'value', 'text', @$record->sqlquery_managed->{'orderby_jointable'.$jt});
$lists ['orderByDirectionJointable'.$jt] = JHtml::_ ( 'select.genericlist', $directionOptions, 'sqlquery_managed[orderby_direction_jointable'.$jt.']', 'class="right_select intermediate"', 'value', 'text', @$record->sqlquery_managed->{'orderby_direction_jointable'.$jt});
$lists ['groupByJointable'.$jt] = JHtml::_ ( 'select.genericlist', $fieldsJoinWithTableOptions, 'sqlquery_managed[groupby_jointable'.$jt.']', 'class="field_joinwith" data-bind="field_joinwith_jointable'.$jt.'"', 'value', 'text', @$record->sqlquery_managed->{'groupby_jointable'.$jt});
}
// Priority select list
$options = array();
$options[] = JHtml::_('select.option', null, JText::_('COM_JMAP_SELECTPRIORITY'));
$arrayPriorities = array ('0.1'=>'10%', '0.2'=>'20%', '0.3'=>'30%', '0.4'=>'40%', '0.5'=>'50%', '0.6'=>'60%', '0.7'=>'70%', '0.8'=>'80%', '0.9'=>'90%', '1.0'=>'100%');
foreach ($arrayPriorities as $value=>$text) {
$options[] = JHtml::_('select.option', $value, $text);
}
$lists ['priority'] = JHtml::_ ( 'select.genericlist', $options, 'params[priority]', 'style="width:200px"', 'value', 'text', $record->params->get('priority', '0.5'));
$lists ['priorities'] = JHtml::_ ( 'select.genericlist', $options, 'params[priorities]', 'style="width:200px" size=15', 'value', 'text', null, 'priorities');
// Change frequency select list
$options = array();
$options[] = JHtml::_('select.option', null, JText::_('COM_JMAP_SELECTCHANGEFREQ'));
$arrayPriority = array ('always', 'hourly', 'daily', 'weekly', 'monthly', 'yearly', 'never');
foreach ($arrayPriority as $priority) {
$options[] = JHtml::_('select.option', $priority, $priority);
}
$lists ['changefreq'] = JHtml::_ ( 'select.genericlist', $options, 'params[changefreq]', 'style="width:200px";', 'value', 'text', $record->params->get('changefreq', 'daily'));
// Lazy Loading dependency - Use J Element simbolic override for menu multiselect generation specific to single data source menu
if($record->type == 'menu') {
$selections = JMapHtmlMenu::getMenuItems($record->name);
$lists['exclusion'] = JHtml::_('select.genericlist', $selections, 'params[exclusion][]', 'class="inputbox" size="15" multiple="multiple"', 'value', 'text', $record->params->get('exclusion', array()), 'exclusion' );
$selectionsWithPriority = JMapHtmlMenu::getMenuItems($record->name, true);
$lists['menu_priorities'] = JHtml::_('select.genericlist', $selectionsWithPriority, 'params[menu_priorities]', array('option.attr'=>'style', 'list.attr'=>'data-type="MenuPriorities" class="inputbox" size="15"'));
}
// Lazy Loading dependency - Use J Element simbolic override for menu multiselect generation specific to single data source menu
if($record->type == 'content') {
// Get categories exclusion multiselect
$categoryOptions = JMapHtmlCategories::getCategories();
$lists['catexclusion'] = JHtml::_('select.genericlist', $categoryOptions, 'params[catexclusion][]', 'class="inputbox" size="15" multiple="multiple"', 'value', 'text', $record->params->get('catexclusion', array()), 'catexclusion' );
// Get articles exclusion multiselect
if($this->getComponentParams()->get('enable_articles_exclusions', 1)) {
$articleOptions = JMapHtmlArticles::getArticles();
$lists['articleexclusion'] = JHtml::_('select.genericlist', $articleOptions, 'params[articleexclusion][]', 'class="inputbox" size="15" multiple="multiple"', 'value', 'text', $record->params->get('articleexclusion', array()), 'articleexclusion' );
}
// Get articles categories priorities
$selectionsCatsWithPriority = JMapHtmlCatspriorities::getCategories();
$lists['cats_priorities'] = JHtml::_('select.genericlist', $selectionsCatsWithPriority, 'params[cats_priorities]', array('option.attr'=>'style', 'list.attr'=>'data-type="CatsPriorities" class="inputbox" size="15"'));
}
// Check if data source extension has valid GNews inclusion support
if($this->getHasGnewsSupport($record)) {
// Get Google News sitemap genres multiselect
$genresArray = array (''=>'COM_JMAP_NONE',
'Blog'=>'COM_JMAP_BLOG',
'PressRelease'=>'COM_JMAP_PRESSRELEASE',
'Satire'=>'COM_JMAP_SATIRE',
'OpEd'=>'COM_JMAP_OPED',
'Opinion'=>'COM_JMAP_OPINION',
'UserGenerated'=>'COM_JMAP_USERGENERATED');
foreach ($genresArray as $genre=>$translation) {
$genresOptions[] = JHtml::_('select.option', $genre, JText::_($translation));
}
$lists['gnews_genres'] = JHtml::_('select.genericlist', $genresOptions, 'params[gnews_genres][]', 'multiple="multiple" size="8"', 'value', 'text', $record->params->get('gnews_genres', $this->getComponentParams()->get('gnews_genres', array('Blog'))), 'params_gnews_genres');
}
// Lazy Loading dependency - Use J Element simbolic override for menu multiselect generation specific to single data source menu
if($record->type == 'user') {
$sefItemid = JMapHtmlMenu::getMenuItems();
$lists['sef_itemid'] = JHtml::_('select.genericlist', $sefItemid, 'params[sef_itemid]', 'class="inputbox" size="15"', 'value', 'text', $record->params->get('sef_itemid', null), 'sef_itemid' );
}
// Configure a language dropdown if the links source is requested
if($record->type == 'links' || $record->type == 'user' || $record->type == 'plugin') {
// Check if multilanguage dropdown is always active
if($this->getComponentParams()->get('showalways_language_dropdown', false)) {
$languageFilterPluginEnabled = true;
} else {
// Detect Joomla Language Filter plugin enabled
$query = "SELECT " . $this->_db->quoteName('enabled') .
"\n FROM #__extensions" .
"\n WHERE " . $this->_db->quoteName('element') . " = " . $this->_db->quote('languagefilter') .
"\n OR " . $this->_db->quoteName('element') . " = " . $this->_db->quote('jfdatabase');
$this->_db->setQuery($query);
$languageFilterPluginEnabled = $this->_db->loadResult();
}
$languageOptions = JMapHtmlLanguages::getAvailableLanguageOptions(true);
if(count($languageOptions) >= 2 && $languageFilterPluginEnabled) {
$currentSelectedLanguage = $record->params->get('datasource_language', null);
$lists['languages'] = JHtml::_('select.genericlist', $languageOptions, 'params[datasource_language]', 'class="inputbox" style="width: 200px"', 'value', 'text', $currentSelectedLanguage, 'datasource_language' );
// Append a flag button image if the language is a specific one
if($currentSelectedLanguage && $currentSelectedLanguage != '*') {
$lists['languages'] .= '<img id="language_flag_image" src="' . JUri::root(false) . 'media/mod_languages/images/' . $currentSelectedLanguage . '.gif" alt="language_flag" />';
}
}
}
return $lists;
}
/**
* Try to load frontend multilevel cats manifest for this component data source
* To have option for multi categorization a data source needs 3 requirements:
* 1)Have a valid manifest.json for frontend rendering
* 2)Have a sqlquery managed field for cat title use
* 3)Have a maintable not related to categories itself
*
* @access public
* @param Object $record
* @return boolean
*/
public function getHasManifest($record) {
if(!$record->id || $record->type != 'user') {
return false;
}
// Check if a valid field has been chosen and activated for category titles
$hasCategoryUseByTitle = false;
for($i=1,$k=4;$i<$k;$i++) {
if(isset($record->sqlquery_managed->{'use_category_title_jointable'.$i}) && $record->sqlquery_managed->{'use_category_title_jointable'.$i}) {
$hasCategoryUseByTitle = true;
break;
}
}
// Check if data source is elated to categories entities itself
$hasCategoryUseByCatsItself = false;
if(preg_match('/categor|cats|catg/i', $record->sqlquery_managed->table_maintable)) {
$hasCategoryUseByCatsItself = true;
}
if(!$hasCategoryUseByTitle && !$hasCategoryUseByCatsItself) {
return false;
}
// Load configuration manifest file
$fileName = JPATH_COMPONENT_SITE . '/manifests/' . $record->sqlquery_managed->option . '.json';
// Check if file exists and is valid manifest
if(file_exists($fileName)) {
return true;
}
return false;
}
/**
* Check if the data source has a items categorization
* determined by use as title setting
*
* @access public
* @param Object $record
* @return boolean
*/
public function getHasCategoryByTitle($record) {
if(!$record->id || $record->type != 'user') {
return false;
}
if(preg_match('/categor|cats|catg/i', $record->sqlquery_managed->table_maintable)) {
return false;
}
// Check if a valid field has been chosen and activated for category titles
for($i=1,$k=4;$i<$k;$i++) {
if(isset($record->sqlquery_managed->{'use_category_title_jointable'.$i}) && $record->sqlquery_managed->{'use_category_title_jointable'.$i}) {
return true;
}
}
return false;
}
/**
* Check if the data source is for type category itself
*
* @access public
* @param Object $record
* @return boolean
*/
public function getIsCategorySource($record) {
if(!$record->id || $record->type != 'user') {
return false;
}
if(preg_match('/categor|cats|catg/i', $record->sqlquery_managed->table_maintable)) {
return true;
}
return false;
}
/**
* Check if the extension data source has support for valid GNews sitemap XML
*
* @access public
* @param Object $record
* @return boolean
*/
public function getHasGnewsSupport($record) {
static $hasGNewsSupport;
// Return already evaluated support
if(!is_null($hasGNewsSupport)) {
return $hasGNewsSupport;
}
// Content source always supported by default
if($record->type == 'content' || $record->type == 'plugin' || $record->type == 'links') {
$hasGNewsSupport = true;
return $hasGNewsSupport;
}
// Required a valid 'user' data source, no menu or content already evaluated
if(!isset($record->sqlquery_managed->table_maintable)) {
$hasGNewsSupport = false;
return $hasGNewsSupport;
}
// Check if valid GNews for type 'user'
$supportedExtensionTables = array('#__k2_items', '#__zoo_item', '#__easyblog_post', '#__mt_links', '#__jevents_vevdetail');
$hasGNewsSupport = in_array($record->sqlquery_managed->table_maintable, $supportedExtensionTables);
return $hasGNewsSupport;
}
/**
* Check if the extension data source has support for valid RSS feed
*
* @access public
* @param Object $record
* @return boolean
*/
public function getHasRSSSupport($record) {
static $hasRSSSupport;
// Return already evaluated support
if(!is_null($hasRSSSupport)) {
return $hasRSSSupport;
}
// Content source always supported by default
if($record->type == 'content') {
$hasRSSSupport = true;
return $hasRSSSupport;
}
// Required a valid 'user' data source, no menu or content already evaluated
if(!isset($record->sqlquery_managed->table_maintable)) {
$hasRSSSupport = false;
return $hasRSSSupport;
}
// Supporting by default virtuemart products
if(stripos($record->sqlquery_managed->table_maintable, 'virtuemart_products')) {
$hasRSSSupport = true;
return $hasRSSSupport;
}
// Load configuration manifest file
$fileName = JPATH_COMPONENT_SITE . '/manifests/rss.json';
// Check if file exists and is valid manifest
if(file_exists($fileName)) {
// Load the manifest serialized file and assign to local variable
$manifest = file_get_contents($fileName);
$supportedExtensionTables = json_decode($manifest);
}
// Check if valid GNews for type 'user'
$hasRSSSupport = property_exists($supportedExtensionTables, $record->sqlquery_managed->table_maintable);
return $hasRSSSupport;
}
/**
* Check if the extension data source has support for valid HReflang sitemap
*
* @access public
* @param Object $record
* @return boolean
*/
public function getHasHreflangSupport($record) {
static $hasHreflangSupport;
// Return already evaluated support
if(!is_null($hasHreflangSupport)) {
return $hasHreflangSupport;
}
// Content and menu source always supported by default
if($record->type == 'content' || $record->type == 'menu') {
$hasHreflangSupport = true;
return $hasHreflangSupport;
}
// Required a valid 'option' component data source, no plugin/links data source
if(!isset($record->sqlquery_managed->option)) {
$hasHreflangSupport = false;
return $hasHreflangSupport;
}
// Load configuration manifest file
$fileName = JPATH_COMPONENT_SITE . '/manifests/hreflang.json';
// Check if file exists and is valid manifest
if(file_exists($fileName)) {
// Load the manifest serialized file and assign to local variable
$manifest = file_get_contents($fileName);
$supportedExtensions = json_decode($manifest);
}
// Check if valid GNews for type 'user'
$hasHreflangSupport = property_exists($supportedExtensions, $record->sqlquery_managed->option);
return $hasHreflangSupport;
}
/**
* Try to load route helper manifest for this component data source
* If a manifest is available to execute the routing helper by JSitemap
* show the option accordingly in the data source edit
*
* @access public
* @param Object $record
* @return boolean
*/
public function getHasRouteManifest($record) {
if(!$record->id || $record->type != 'user') {
return false;
}
// Load configuration manifest file
$fileName = JPATH_COMPONENT_ADMINISTRATOR . '/framework/route/manifests/' . $record->sqlquery_managed->option . '.json';
// Check if file exists and is valid manifest
if(file_exists($fileName)) {
return true;
}
return false;
}
/**
* Try to check if the component table has entity ruled by create date,
* and if yes filtering by latest months can be shown and afterwards applied at runtime
*
* @param Object $record
* @return boolean
*/
public function getHasCreatedDate($record) {
// Always true for content type data source
if($record->type == 'content') {
return true;
}
// Available only for content and user data source that supports created field not newly created
if(!$record->id || $record->type == 'menu' || $record->type == 'plugin' || $record->type == 'links') {
return false;
}
if(strpos($record->sqlquery_managed->table_maintable, 'categor')) {
return false;
}
if(!isset($record->sqlquery_managed->table_maintable)) {
return false;
}
// Build query
$query = "SHOW COLUMNS FROM " . $this->_db->quoteName($record->sqlquery_managed->table_maintable);
$this->_db->setQuery ( $query );
try {
$tableFields = $this->_db->loadColumn ();
if ($this->_db->getErrorNum ()) {
throw new JMapException ( JText::sprintf ( 'COM_JMAP_ERROR_RETRIEVING_CREATEDATE_INFO', $this->_db->getErrorMsg () ), 'notice' );
}
// Search in fields array we have found the create date reserved field
if(in_array('created', $tableFields)) {
return true;
}
} catch ( JMapException $e ) {
$this->app->enqueueMessage ( $e->getMessage (), $e->getErrorLevel () );
return false;
} catch ( Exception $e ) {
$jmapException = new JMapException ( $e->getMessage (), 'error' );
$this->app->enqueueMessage ( $jmapException->getMessage (), $jmapException->getErrorLevel () );
return false;
}
return false;
}
/**
* Storing entity by ORM table
*
* @access public
* @param boolean $forceRegenerate
* @param boolean $wizard
* @param Object $wizardModel
* @return mixed
*/
public function storeEntity($forceRegenerate = false, $wizard = false, $wizardModel = null) {
$table = $this->getTable();
try {
if (!$table->bind ($this->requestArray[$this->requestName], true)) {
throw new JMapException($table->getError (), 'error');
}
if (!$table->check ( )) {
throw new JMapException($table->getError (), 'error');
}
// Delegate creazione raw query se type=user e new
if($table->type == 'user' && (!$table->id || $forceRegenerate)) {
if(!$this->buildRawQuery($table->sqlquery_managed, $table, $wizard, $wizardModel)) {
throw new JMapException(JText::_('COM_JMAP_ERROR_BUILDING_QUERY'), 'error');
}
}
if (! $table->store (false)) {
throw new JMapException($table->getError (), 'error');
}
$table->reorder();
} catch(JMapException $e) {
$this->setError($e);
// Rethrow exception if wizard mode to bubble it to wizard controller
if($wizard) {
throw $e;
}
return false;
} catch (Exception $e) {
$jmapException = new JMapException($e->getMessage(), 'error');
$this->setError($jmapException);
// Rethrow exception if wizard mode to bubble it to wizard controller
if($wizard) {
throw $jmapException;
}
return false;
}
return $table;
}
/**
* Copy existing entity
*
* @param int $id
* @access public
* @return boolean
*/
public function copyEntity($ids) {
if(is_array($ids) && count($ids)) {
$table = $this->getTable();
try {
foreach ( $ids as $id ) {
if ($table->load ( ( int ) $id )) {
$table->id = 0;
// Don't rename plugin type data source! The name is the unique identifier
if($table->type != 'plugin') {
$table->name = JText::_ ( 'COM_JMAP_COPYOF' ) . $table->name;
}
$table->published = 0;
$table->sqlquery_managed = json_encode($table->sqlquery_managed);
$table->params = $table->params->toString();
if (! $table->store ()) {
throw new JMapException($table->getError (), 'error');
}
} else {
throw new JMapException($table->getError (), 'error');
}
}
$table->reorder();
} catch (JMapException $e) {
$this->setError($e);
return false;
} catch (Exception $e) {
$jmapException = new JMapException($e->getMessage(), 'error');
$this->setError($jmapException);
return false;
}
}
return true;
}
/**
* Delete entity
*
* @param array $ids
* @access public
* @return boolean
*/
public function deleteEntity($ids) {
$table = $this->getTable ();
// Ciclo su ogni entity da cancellare
if (is_array ( $ids ) && count ( $ids )) {
foreach ( $ids as $id ) {
try {
// Load always to identify if the type is plugin with filesystem resources
$table->load($id);
// Evaluate if the data source is of type plugin and delete filesystem resources if no more data sources are used
if($table->type === 'plugin') {
$otherResourcesQuery = "SELECT COUNT(*)" .
"\n FROM " . $this->_db->quoteName('#__jmap') .
"\n WHERE" .
"\n " . $this->_db->quoteName('type') . " = " . $this->_db->quote('plugin') .
"\n AND " . $this->_db->quoteName('name') . " = " . $this->_db->quote($table->name) .
"\n AND " . $this->_db->quoteName('id') . " != " . (int)$table->id;
$otherResourcesCount = $this->_db->setQuery($otherResourcesQuery)->loadResult();
if(!$otherResourcesCount) {
$folderPluginName = strtolower($table->name);
$folderPluginPath = JPATH_COMPONENT_ADMINISTRATOR . '/plugins/' . $folderPluginName;
if(JFolder::exists($folderPluginPath)) {
$deleted = JFolder::delete($folderPluginPath);
}
}
}
if (! $table->delete ( $id )) {
throw new JMapException ( $table->getError (), 'error' );
}
$table->reorder ();
} catch ( JMapException $e ) {
$this->setError ( $e );
return false;
} catch ( Exception $e ) {
$jmapException = new JMapException ( $e->getMessage (), 'error' );
$this->setError ( $jmapException );
return false;
}
}
}
return true;
}
/**
* Change entities ordering
*
* @access public
* @param int $idEntity
* @param int $direction
* @return boolean
*/
public function changeOrder($idEntity, $direction) {
if (isset ( $idEntity )) {
try {
$table = $this->getTable ();
$table->load ( ( int ) $idEntity );
if (! $table->move ( $direction )) {
throw new JMapException($table->getError (), 'notice');
}
} catch(JMapException $e) {
$this->setError($e);
return false;
} catch (Exception $e) {
$jmapException = new JMapException($e->getMessage(), 'notice');
$this->setError($jmapException);
return false;
}
}
return true;
}
/**
* Method to move and reorder
*
* @access public
* @param array $cid
* @param array $order
* @return boolean on success
* @since 1.5
*/
public function saveOrder($cid = array(), $order) {
if (is_array ( $cid ) && count ( $cid )) {
try {
$table = $this->getTable ();
// update ordering values
for($i = 0; $i < count ( $cid ); $i ++) {
$table->load ( ( int ) $cid [$i] );
if ($table->ordering != $order [$i]) {
$table->ordering = $order [$i];
if (! $table->store ()) {
throw new JMapException($table->getError (), 'notice');
}
}
}
} catch(JMapException $e) {
$this->setError($e);
return false;
} catch (Exception $e) {
$jmapException = new JMapException($e->getMessage(), 'notice');
$this->setError($jmapException);
return false;
}
// All went well
$table->reorder ();
}
return true;
}
/**
* Publishing state changer for entities
*
* @access public
* @param int $idEntity
* @param string $state
* @return boolean
*/
public function publishEntities($idEntity, $state) {
// Table load
$table = $this->getTable ();
if (isset ( $idEntity )) {
try {
if (! $table->load($idEntity)) {
throw new JMapException($table->getError (), 'notice');
}
switch ($state) {
case 'unpublish' :
$table->published = 0;
break;
case 'publish' :
$table->published = 1;
break;
}
if (! $table->store ( true )) {
throw new JMapException($table->getError (), 'notice');
}
} catch(JMapException $e) {
$this->setError($e);
return false;
} catch (Exception $e) {
$jmapException = new JMapException($e->getMessage(), 'notice');
$this->setError($jmapException);
return false;
}
}
return true;
}
}