@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');
jimport('joomla.application.component.helper');
/**
* Componentbuilder Ajax Model
*/
class ComponentbuilderModelAjax extends JModelList
{
protected $app_params;
public function __construct()
{
parent::__construct();
// get params
$this->app_params = JComponentHelper::getParams('com_componentbuilder');
}
// Used in joomla_component
/**
* Check and if a vdm notice is new (per/user)
**/
public function isNew($notice)
{
// first get the file path
$path_filename = ComponentbuilderHelper::getFilePath('path', 'usernotice', 'md', JFactory::getUser()->username, JPATH_COMPONENT_ADMINISTRATOR);
// check if the file is set
if (($content = @file_get_contents($path_filename)) !== FALSE)
{
if ($notice == $content)
{
return false;
}
}
return true;
}
/**
* set That a notice has been read (per/user)
**/
public function isRead($notice)
{
// first get the file path
$path_filename = ComponentbuilderHelper::getFilePath('path', 'usernotice', 'md', JFactory::getUser()->username, JPATH_COMPONENT_ADMINISTRATOR);
// set as read if not already set
if (($content = @file_get_contents($path_filename)) !== FALSE)
{
if ($notice == $content)
{
return true;
}
}
return $this->saveFile($notice,$path_filename);
}
protected function saveFile($data,$path_filename)
{
if (ComponentbuilderHelper::checkString($data))
{
$fp = fopen($path_filename, 'w');
fwrite($fp, $data);
fclose($fp);
return true;
}
return false;
}
/**
* get the component details (html)
**/
public function getComponentDetails($id)
{
// Need to find the asset id by the name of the component.
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select($db->quoteName(array(
'id','companyname','component_version','copyright','debug_linenr',
'description','email','image','license','name',
'short_description','website','author','add_placeholders',
'system_name','mvc_versiondate')))
->from($db->quoteName('#__componentbuilder_joomla_component'))
->where($db->quoteName('id') . ' = ' . (int) $id);
$db->setQuery($query);
$db->execute();
if ($db->loadRowList())
{
return array( 'html' => $this->componentDetailsDisplay($db->loadObject()));
}
return false;
}
/**
* set the component display
**/
protected function componentDetailsDisplay($object)
{
// set some vars
$image = (ComponentbuilderHelper::checkString($object->image)) ? '': '';
$desc = (ComponentbuilderHelper::checkString($object->description)) ? $object->description : $object->short_description;
$placeholder = ($object->add_placeholders == 1) ? ' ' . JText::_('COM_COMPONENTBUILDER_YES') . ' ' : ' ' .JText::_('COM_COMPONENTBUILDER_NO') . ' ' ;
$debug = ($object->debug_linenr == 1) ? ' ' .JText::_('COM_COMPONENTBUILDER_YES') . '' : ' ' .JText::_('COM_COMPONENTBUILDER_NO') . ' ' ;
$html = array();
$html[] = '
";
// return the table
return implode("\n", $table);
}
protected function setSubformValue($header, $value)
{
if (array_key_exists($header, $this->functionArray) && method_exists($this, $this->functionArray[$header]))
{
$value = $this->{$this->functionArray[$header]}($header, $value);
}
// if no value are set
if (!ComponentbuilderHelper::checkString($value))
{
$value = '-';
}
return $value;
}
protected function setSubformRows($nr, $value, &$rows)
{
// build rows
if (!isset($rows[$nr]))
{
$rows[$nr] = '
'.$value.'
';
}
else
{
$rows[$nr] .= '
'.$value.'
';
}
}
protected $ref;
protected $fieldsArray = array(
'admin_fields' => 'addfields',
'admin_fields_conditions' => 'addconditions',
'component_admin_views' => 'addadmin_views',
'component_site_views' => 'addsite_views',
'component_custom_admin_views' => 'addcustom_admin_views');
public function getAjaxDisplay($type)
{
if (isset($this->fieldsArray[$type]))
{
// set type name
$typeName = ComponentbuilderHelper::safeString($type, 'w');
// get the view name & id
$values = $this->getViewID();
// check if we are in the correct view.
if (!is_null($values['a_id']) && $values['a_id'] > 0 && strlen($values['a_view']) && ($values['a_view'] === 'admin_view' || $values['a_view'] === 'joomla_component'))
{
$this->ref = '&ref=' . $values['a_view'] . '&refid=' . $values['a_id'];
// get the field data
if ($fieldsData = ComponentbuilderHelper::getVar($type, (int) $values['a_id'], $values['a_view'], $this->fieldsArray[$type]))
{
// check repeatable conversion
$this->checkRepeatableConversion($fieldsData, $type, $values['a_id'], $values['a_view']);
// get the table
$table = $this->getSubformTable($type, $fieldsData);
// set notice of bad practice
$notice = '';
if ($values['a_view'] === 'admin_view' && isset($this->rowNumber) && $this->rowNumber > 50)
{
$notice = '
";
return implode("\n",$layoutString);
}
return false;
}
// Used in dynamic_get
public function getViewTableColumns($admin_view, $as, $type)
{
// Get a db connection.
$db = JFactory::getDbo();
// Create a new query object.
$query = $db->getQuery(true);
$query->select($db->quoteName(array('a.addfields', 'b.name_single')));
$query->from($db->quoteName('#__componentbuilder_admin_fields', 'a'));
$query->join('LEFT', $db->quoteName('#__componentbuilder_admin_view', 'b') . ' ON (' . $db->quoteName('a.admin_view') . ' = ' . $db->quoteName('b.id') . ')');
$query->where($db->quoteName('b.published') . ' = 1');
$query->where($db->quoteName('a.admin_view') . ' = '. (int) $admin_view);
// Reset the query using our newly populated query object.
$db->setQuery($query);
$db->execute();
if ($db->getNumRows())
{
$result = $db->loadObject();
$description = '';
$tableName = '';
if (1 == $type)
{
$tableName = ComponentbuilderHelper::safeString($result->name_single).'_';
}
$addfields = json_decode($result->addfields,true);
if (ComponentbuilderHelper::checkArray($addfields))
{
$fields = array();
// get data
foreach ($addfields as $nr => $value)
{
$tmp = $this->getFieldData((int) $value['field']);
if (ComponentbuilderHelper::checkArray($tmp))
{
$field[$nr] = $tmp;
}
// insure it is set to alias if needed
if ($value['alias'] == 1)
{
$field[$nr]['name'] = 'alias';
}
}
// add the basic defaults
$fields[] = $as.".id AS ".$tableName."id";
$fields[] = $as.".asset_id AS ".$tableName."asset_id";
// load data
foreach ($field as $n => $f)
{
if (ComponentbuilderHelper::checkArray($f))
{
$fields[] = $as.".".$f['name']." AS ".$tableName.$f['name'];
}
}
// add the basic defaults
$fields[] = $as.".published AS ".$tableName."published";
$fields[] = $as.".created_by AS ".$tableName."created_by";
$fields[] = $as.".modified_by AS ".$tableName."modified_by";
$fields[] = $as.".created AS ".$tableName."created";
$fields[] = $as.".modified AS ".$tableName."modified";
$fields[] = $as.".version AS ".$tableName."version";
$fields[] = $as.".hits AS ".$tableName."hits";
if (0)
{
$fields[] = $as.".access AS ".$tableName."access";
}
$fields[] = $as.".ordering AS ".$tableName."ordering";
$viewFields = $description.implode("\n",$fields);
}
return $viewFields;
}
return false;
}
protected function getFieldData($id)
{
// Get a db connection.
$db = JFactory::getDbo();
// Create a new query object.
$query = $db->getQuery(true);
// Order it by the ordering field.
$query->select($db->quoteName(array('a.name','a.xml')));
$query->select($db->quoteName(array('c.name'),array('type_name')));
$query->from('#__componentbuilder_field AS a');
$query->join('LEFT', $db->quoteName('#__componentbuilder_fieldtype', 'c') . ' ON (' . $db->quoteName('a.fieldtype') . ' = ' . $db->quoteName('c.id') . ')');
$query->where($db->quoteName('a.id') . ' = '. $db->quote($id));
// Reset the query using our newly populated query object.
$db->setQuery($query);
$db->execute();
if ($db->getNumRows())
{
// Load the results as a list of stdClass objects (see later for more options on retrieving data).
$field = $db->loadObject();
// load the values form params
$field->xml = json_decode($field->xml);
$field->type_name = ComponentbuilderHelper::safeString($field->type_name);
$load = true;
// if category then name must be catid (only one per view)
if ($field->type_name == 'category')
{
$name = 'catid';
}
// if tag is set then enable all tag options for this view (only one per view)
elseif ($field->type_name == 'tag')
{
$name = 'tags';
}
// don't add spacers or notes
elseif ($field->type_name == 'spacer' || $field->type_name == 'note')
{
// make sure the name is unique
return false;
}
else
{
$name = ComponentbuilderHelper::safeString(ComponentbuilderHelper::getBetween($field->xml,'name="','"'));
}
// use field core name only if not found in xml
if (!ComponentbuilderHelper::checkString($name))
{
$name = ComponentbuilderHelper::safeString($field->name);;
}
return array('name' => $name, 'type' => $field->type_name);
}
return false;
}
public function getDbTableColumns($tableName, $as, $type)
{
// Get a db connection.
$db = JFactory::getDbo();
// get the columns
$columns = $db->getTableColumns("#__".$tableName);
// set the type (multi or single)
$unique = '';
if (1 == $type)
{
$unique = ComponentbuilderHelper::safeString($tableName).'_';
}
if (ComponentbuilderHelper::checkArray($columns))
{
// build the return string
$tableColumns = array();
foreach ($columns as $column => $typeCast)
{
$tableColumns[] = $as.".".$column . ' AS ' . $unique . $column;
}
return implode("\n",$tableColumns);
}
return false;
}
public function getDynamicValues($id, $view)
{
// Get a db connection.
$db = JFactory::getDbo();
// Create a new query object.
$query = $db->getQuery(true);
$query->select($db->quoteName(array('getcustom', 'gettype', 'main_source', 'view_selection', 'db_selection', 'join_view_table', 'join_db_table', 'addcalculation', 'php_calculation')));
$query->from($db->quoteName('#__componentbuilder_dynamic_get'));
$query->where($db->quoteName('published') . ' = 1');
$query->where($db->quoteName('id') . ' = '. (int) $id);
// Reset the query using our newly populated query object.
$db->setQuery($query);
$db->execute();
if ($db->getNumRows())
{
$result = $db->loadObject();
// reset buket
$selections = array();
$selectionsList = array();
// get the main values (name)
if ($result->main_source == 1)
{
$selections[] = explode("\n",$result->view_selection);
}
elseif ($result->main_source == 2)
{
$selections[] = explode("\n",$result->db_selection);
}
elseif ($result->main_source == 3)
{
return '
Custom get source! You will need to transpose the variables manually.
';
}
// get the joined values (name)
$result->join_view_table = json_decode($result->join_view_table, true);
if (!ComponentbuilderHelper::checkArray($result->join_view_table))
{
unset($result->join_view_table);
}
$result->join_db_table = json_decode($result->join_db_table, true);
if (!ComponentbuilderHelper::checkArray($result->join_db_table))
{
unset($result->join_db_table);
}
// now load the joined values to the selection set
if (isset($result->join_view_table) && ComponentbuilderHelper::checkArray($result->join_view_table))
{
foreach ($result->join_view_table as $join_view_table)
{
if ($join_view_table['row_type'] == '1')
{
$selections[] = explode("\n",$join_view_table['selection']);
}
elseif ($join_view_table['row_type'] == '2')
{
$names = $this->setListMethodName(array($join_view_table['on_field'],$join_view_table['join_field']),$join_view_table['view_table'],$join_view_table['as'],1);
$selectionsList[implode('',$names)] = explode("\n",$join_view_table['selection']);
}
}
unset($result->join_view_table);
}
if (isset($result->join_db_table) && ComponentbuilderHelper::checkArray($result->join_db_table))
{
foreach ($result->join_db_table as $join_db_table)
{
if ($join_db_table['row_type'] == '1')
{
$selections[] = explode("\n",$join_db_table['selection']);
}
elseif ($join_db_table['row_type'] == '2')
{
$names = $this->setListMethodName(array($join_db_table['on_field'],$join_db_table['join_field']),$join_db_table['db_table'],$join_db_table['as'],2);
$selectionsList[implode('',$names)] = explode("\n",$join_db_table['selection']);
}
}
unset($result->join_db_table);
}
// get the calculation result values (name)
if ($result->addcalculation == 1)
{
$php_calculation = base64_decode($result->php_calculation);
$phpSelections = ComponentbuilderHelper::getAllBetween($php_calculation,'cal__',' ');
$selections[] = array_unique($phpSelections);
unset($php_calculation);
unset($phpSelections);
unset($result->php_calculation);
}
// name the main var based on view
if ('template' === $view || 'site_view' === $view)
{
switch ($result->gettype)
{
case 1:
// single
$buketName = 'this->item';
break;
case 2:
// list
$buketName = 'this->items';
break;
case 3:
case 4:
// custom
$result->getcustom = ComponentbuilderHelper::safeString($result->getcustom);
if (substr($result->getcustom, 0, strlen('get')) == 'get')
{
$varName = substr($result->getcustom, strlen('get'));
}
else
{
$varName = $result->getcustom;
}
$buketName = 'this->'.$varName;
break;
}
}
elseif ($view == 'layout')
{
$buketName = 'displayData';
}
// now build the return values
if (ComponentbuilderHelper::checkArray($selections))
{
$buket = array();
switch ($result->gettype)
{
case 1:
case 3:
// single
$ur = '<?php echo $'.$buketName;
$cf = '; ?>';
break;
case 2:
case 4:
// list
$ur = '<?php echo $item';
$cf = '; ?>';
$buket[] = '<?php foreach ($'.$buketName.' as $item): ?> ';
break;
}
foreach ($selections as $selection)
{
if (ComponentbuilderHelper::checkArray($selection))
{
foreach ($selection as $value)
{
if (strpos($value,'AS') !== false)
{
list($table,$key) = explode('AS',$value);
$buket[] = ''.$ur.'->'.trim($key).$cf.'';
}
else
{
$buket[] = ''.$ur.'->'.trim($value).$cf.'';
}
}
}
}
if (ComponentbuilderHelper::checkArray($selectionsList))
{
$buket[] = '';
foreach ($selectionsList as $name => $selectionList)
{
if (ComponentbuilderHelper::checkArray($selectionList))
{
$ur = '<?php echo $'.$name;
$cf = '; ?>';
$buket[] = '<?php foreach ($item->'.$name.' as $'.$name.'): ?> ';
foreach ($selectionList as $value)
{
if (strpos($value,'AS') !== false)
{
list($table,$key) = explode('AS',$value);
$buket[] = ''.$ur.'->'.trim($key).$cf.'';
}
else
{
$buket[] = ''.$ur.'->'.trim($value).$cf.'';
}
}
$buket[] = ' <?php endforeach; ?>';
}
}
}
switch ($result->gettype)
{
case 2:
case 4:
// list
$buket[] = ' <?php endforeach; ?>';
break;
}
return implode(' ',$buket);
}
}
return false;
}
protected function setListMethodName($names, $table, $as, $type)
{
$methodNames = array();
if (ComponentbuilderHelper::checkArray($names))
{
foreach ($names as $nr => $name)
{
if (ComponentbuilderHelper::checkString($name))
{
if (strpos($name,'.') !== false)
{
list($dump,$var) = explode('.',$name);
}
else
{
$var = $name;
}
if ($nr > 0)
{
$methodNames[] = ComponentbuilderHelper::safeString($var,'F');
}
else
{
$methodNames[] = ComponentbuilderHelper::safeString($var);
}
}
}
}
switch ($type)
{
// set view name
case 1:
$methodNames[] = ComponentbuilderHelper::safeString($this->getViewName($table),'F');
break;
// set db name
case 2:
$methodNames[] = ComponentbuilderHelper::safeString($table,'F');
break;
}
// make sure there is uniqe method names
$methodNames[] = ComponentbuilderHelper::safeString($as,'U');
return $methodNames;
}
protected function getViewName($id)
{
// Get the view name
if ($name = ComponentbuilderHelper::getVar('admin_view', (int) $id, 'id', 'name_single'))
{
return $name;
}
return '';
}
// Used in custom_code
public function checkFunctionName($name, $id)
{
$nameArray = (array) $this->splitAtUpperCase($name);
$name = ComponentbuilderHelper::safeString(implode(' ', $nameArray), 'cA');
if ($found = ComponentbuilderHelper::getVar('custom_code', $name, 'function_name', 'id'))
{
if ((int) $id !== (int) $found)
{
return array (
'message' => JText::_('COM_COMPONENTBUILDER_SORRY_THIS_FUNCTION_NAME_IS_ALREADY_IN_USE'),
'status' => 'danger');
}
}
return array (
'name' => $name,
'message' => JText::_('COM_COMPONENTBUILDER_GREAT_THIS_FUNCTION_NAME_WILL_WORK'),
'status' => 'success');
}
protected function splitAtUpperCase($string)
{
return preg_split('/(?=[A-Z])/', $string, -1, PREG_SPLIT_NO_EMPTY);
}
public function usedin($functioName, $id, $targeting)
{
// get the table being targeted
if ($target = $this->getTableQueryOptions($targeting))
{
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select($db->quoteName($target['select']))
->from($db->quoteName('#__componentbuilder_' . $target['table']));
$db->setQuery($query);
$db->execute();
if ($db->loadRowList())
{
$bucket = array();
$hugeDataSet = $db->loadAssocList();
foreach ($hugeDataSet as $data)
{
foreach ($data as $key => $value)
{
if ('id' !== $key && $target['name'] !== $key)
{
if (!isset($target['not_base64'][$key]))
{
$value = base64_decode($value);
}
// check if place holder set
if (strpos($value, '[CUSTOMC' . 'ODE=' . (string) $functioName . ']') !== false || strpos($value, '[CUSTOMC' . 'ODE=' . (int) $id . ']') !== false ||
strpos($value, '[CUSTOMC' . 'ODE=' . (string) $functioName . '+') !== false || strpos($value, '[CUSTOMC' . 'ODE=' . (int) $id . '+') !== false)
{
// found it so add to bucket
if (!isset($bucket[$data['id']]))
{
$bucket[$data['id']] = array();
$bucket[$data['id']]['name'] = $data[$target['name']];
$bucket[$data['id']]['fields'] = array();
}
$bucket[$data['id']]['fields'][] = $key;
}
}
}
}
// check if any values found
if (ComponentbuilderHelper::checkArray($bucket))
{
$usedin = array();
foreach ($bucket as $editId => $values)
{
$usedin[] = '' . $values['name'] . ' (' . implode(', ', $values['fields']) . ')';
}
$html = '
' . implode('
', $usedin) . '
';
return array('in' => $html, 'id' => $targeting);
}
}
}
return false;
}
/**
* Get the table query to search for function used in
*
* @param string $targe The table targeted
*
* @return array The query options
*
*/
protected function getTableQueryOptions($target)
{
$query = array();
// #__componentbuilder_joomla_component as a
$query['a'] = array();
$query['a']['table'] = 'joomla_component';
$query['a']['view'] = 'joomla_components';
$query['a']['select'] = array('id', 'system_name', 'php_preflight_install','php_postflight_install',
'php_preflight_update','php_postflight_update','php_method_uninstall',
'php_helper_admin','php_admin_event','php_helper_both','php_helper_site',
'php_site_event','php_dashboard_methods','dashboard_tab','javascript');
$query['a']['not_base64'] = array('dashboard_tab' => 'json');
$query['a']['name'] = 'system_name';
// #__componentbuilder_admin_view as b
$query['b'] = array();
$query['b']['table'] = 'admin_view';
$query['b']['view'] = 'admin_views';
$query['b']['select'] = array('id', 'system_name', 'javascript_view_file','javascript_view_footer','javascript_views_file',
'javascript_views_footer','php_getitem','php_save','php_postsavehook','php_getitems',
'php_getitems_after_all','php_getlistquery','php_allowedit','php_before_delete',
'php_after_delete','php_before_publish','php_after_publish','php_batchcopy',
'php_batchmove','php_document','php_model','php_controller','php_import_display',
'php_import','php_import_setdata','php_import_save','html_import_view','php_ajaxmethod');
$query['b']['not_base64'] = array();
$query['b']['name'] = 'system_name';
// #__componentbuilder_custom_admin_view as c
$query['c'] = array();
$query['c']['table'] = 'custom_admin_view';
$query['c']['view'] = 'custom_admin_views';
$query['c']['select'] = array('id', 'system_name', 'default','php_view','php_jview','php_jview_display','php_document',
'js_document','css_document','css','php_model','php_controller');
$query['c']['not_base64'] = array();
$query['c']['name'] = 'system_name';
// #__componentbuilder_site_view as d
$query['d'] = array();
$query['d']['table'] = 'site_view';
$query['d']['view'] = 'site_views';
$query['d']['select'] = array('id', 'system_name', 'default','php_view','php_jview','php_jview_display','php_document',
'js_document','css_document','css','php_ajaxmethod','php_model','php_controller');
$query['d']['not_base64'] = array();
$query['d']['name'] = 'system_name';
// #__componentbuilder_field as e
$query['e'] = array();
$query['e']['table'] = 'field';
$query['e']['view'] = 'fields';
$query['e']['select'] = array('id', 'name', 'xml','javascript_view_footer','javascript_views_footer');
$query['e']['not_base64'] = array('xml' => 'json');
$query['e']['name'] = 'name';
// #__componentbuilder_dynamic_get as f
$query['f'] = array();
$query['f']['table'] = 'dynamic_get';
$query['f']['view'] = 'dynamic_gets';
$query['f']['select'] = array('id', 'name', 'php_before_getitem','php_after_getitem','php_before_getitems','php_after_getitems',
'php_getlistquery');
$query['f']['not_base64'] = array();
$query['f']['name'] = 'name';
// #__componentbuilder_template as g
$query['g'] = array();
$query['g']['table'] = 'template';
$query['g']['view'] = 'templates';
$query['g']['select'] = array('id', 'name', 'php_view','template');
$query['g']['not_base64'] = array();
$query['g']['name'] = 'name';
// #__componentbuilder_layout as h
$query['h'] = array();
$query['h']['table'] = 'layout';
$query['h']['view'] = 'layouts';
$query['h']['select'] = array('id', 'name', 'php_view','layout');
$query['h']['not_base64'] = array();
$query['h']['name'] = 'name';
// return the query string to search
if (isset($query[$target]))
{
return $query[$target];
}
return false;
}
// Used in snippet
public function getSnippetDetails($id)
{
// Get a db connection.
$db = JFactory::getDbo();
// Create a new query object.
$query = $db->getQuery(true);
$query->select($db->quoteName(array('name', 'heading', 'usage', 'description', 'type', 'snippet', 'url')));
$query->from($db->quoteName('#__componentbuilder_snippet'));
$query->where($db->quoteName('published') . ' = 1');
$query->where($db->quoteName('id') . ' = '. (int) $id);
// Reset the query using our newly populated query object.
$db->setQuery($query);
$db->execute();
if ($db->getNumRows())
{
$model = ComponentbuilderHelper::getModel('snippets');
$snippet = $db->loadObject();
$snippet->type = JText::_($model->selectionTranslation($snippet->type,'type'));
$snippet->snippet = base64_decode($snippet->snippet);
// return found snippet settings
return $snippet;
}
return false;
}
// Used in field
public function getFieldOptions($id)
{
if ($field = ComponentbuilderHelper::getFieldOptions($id, 'id'))
{
// return found field options
return $field;
}
return false;
}
}