Removing repetable fields from site view, custom admin view, and admin view. Also updated the compiler, removed permissions on fields to speedup page load in admin and joomla component views

This commit is contained in:
2017-10-12 02:50:14 +02:00
parent c484306d21
commit 39e1e5f078
331 changed files with 4920 additions and 8617 deletions

View File

@ -1184,11 +1184,12 @@ class Get
// Load the results as a list of stdClass objects (see later for more options on retrieving data).
$view = $this->db->loadObject();
// reset fields
$view->fields = array();
// setup view name to use in storing the data
$name_single = ComponentbuilderHelper::safeString($view->name_single);
$name_list = ComponentbuilderHelper::safeString($view->name_list);
// be sure to update the value in the db
$objectUpdate = new stdClass();
$objectUpdate->id = (int) $id;
// setup token check
if (!isset($this->customScriptBuilder['token']))
{
@ -1208,27 +1209,104 @@ class Get
$this->placeholders['[[[View]]]'] = $this->placeholders['###View###'];
$this->placeholders['[[[Views]]]'] = $this->placeholders['###Views###'];
$this->placeholders['[[[VIEW]]]'] = $this->placeholders['###VIEW###'];
$this->placeholders['[[[VIEWS]]]'] = $this->placeholders['###VIEWS###'];
// load the values form params
$permissions = json_decode($view->addpermissions,true);
unset($view->addpermissions);
$tabs = json_decode($view->addtabs,true);
unset($view->addtabs);
$fields = json_decode($view->addfields,true);
unset($view->addfields);
$conditions = json_decode($view->addconditions,true);
unset($view->addconditions);
$linked_views = json_decode($view->addlinked_views,true);
unset($view->addlinked_views);
$tables = json_decode($view->addtables,true);
$this->placeholders['[[[VIEWS]]]'] = $this->placeholders['###VIEWS###'];
// add the tables
$view->addtables = json_decode($view->addtables,true);
// check what type of table array we have here (should be subform... but just incase)
// This could happen due to huge data sets
if (isset($view->addtables['table']))
{
$bucket = array();
foreach($view->addtables as $option => $values)
{
foreach($values as $nr => $value)
{
$bucket['addtables'.$nr][$option] = $value;
}
}
$view->addtables = $bucket;
$objectUpdate->addtables = json_encode($bucket);
}
if (ComponentbuilderHelper::checkArray($view->addtables))
{
$view->tables = array_values($view->addtables);
}
unset($view->addtables);
// add the tabs
$view->addtabs = json_decode($view->addtabs,true);
// check what type of tabs array we have here (should be subform... but just incase)
// This could happen due to huge data sets
if (isset($view->addtabs['name']))
{
$bucket = array();
foreach($view->addtabs as $option => $values)
{
foreach($values as $nr => $value)
{
$bucket['addtabs'.$nr][$option] = $value;
}
}
$view->addtabs = $bucket;
$objectUpdate->addtabs = json_encode($bucket);
}
if (ComponentbuilderHelper::checkArray($view->addtabs))
{
$nr = 1;
foreach ($view->addtabs as $tab)
{
$view->tabs[$nr] = $tab['name'];
$nr++;
}
}
unset($view->addtabs);
// add permissions
$view->addpermissions = json_decode($view->addpermissions,true);
// check what type of permissions array we have here (should be subform... but just incase)
// This could happen due to huge data sets
if (isset($view->addpermissions['action']))
{
$bucket = array();
foreach($view->addpermissions as $option => $values)
{
foreach($values as $nr => $value)
{
$bucket['addpermissions'.$nr][$option] = $value;
}
}
$view->addpermissions = $bucket;
$objectUpdate->addpermissions = json_encode($bucket);
}
if (ComponentbuilderHelper::checkArray($view->addpermissions))
{
$view->permissions = array_values($view->addpermissions);
}
unset($view->addpermissions);
// reset fields
$view->fields = array();
// set fields
$view->addfields = json_decode($view->addfields,true);
// check what type of field array we have here (should be subform... but just incase)
// This could happen due to huge data sets
if (isset($view->addfields['field']))
{
$bucket = array();
foreach($view->addfields as $option => $values)
{
foreach($values as $nr => $value)
{
$bucket['addfields'.$nr][$option] = $value;
}
}
$view->addfields = $bucket;
$objectUpdate->addfields = json_encode($bucket);
}
// build update SQL
if ($old_view = $this->getHistoryWatch('admin_view', $id))
{
// add new fields were added
if (isset($old_view->addfields) && ComponentbuilderHelper::checkJson($old_view->addfields))
{
$this->setUpdateSQL(json_decode($old_view->addfields, true), $fields, 'field', $name_single);
$this->setUpdateSQL(json_decode($old_view->addfields, true), $view->addfields, 'field', $name_single);
}
// check if the view name changed
if (ComponentbuilderHelper::checkString($old_view->name_single))
@ -1238,161 +1316,152 @@ class Get
// clear this data
unset($old_view);
}
// sort the values
if (ComponentbuilderHelper::checkArray($tables))
if (ComponentbuilderHelper::checkArray($view->addfields))
{
foreach ($tables as $option => $values)
{
foreach ($values as $nr => $value)
{
$view->tables[$nr][$option] = $value;
}
}
}
if (ComponentbuilderHelper::checkArray($tabs))
{
foreach ($tabs as $option => $values)
{
foreach ($values as $nr => $value)
{
$fix = $nr+1;
$view->tabs[$fix] = $value;
}
}
}
if (ComponentbuilderHelper::checkArray($permissions))
{
foreach ($permissions as $option => $values)
{
foreach ($values as $nr => $value)
{
$view->permissions[$nr][$option] = $value;
}
}
}
if (ComponentbuilderHelper::checkArray($fields))
{
foreach ($fields as $option => $values)
{
foreach ($values as $nr => $value)
{
$view->fields[$nr][$option] = (int) $value;
}
}
$view->fields = array_values($view->addfields);
// sort the fields acording to order
usort($view->fields, function($a, $b)
{
if ($a['order_list'] != 0 && $b['order_list'] != 0)
{
return $a['order_list'] - $b['order_list'];
}
elseif ($b['order_list'] != 0 && $a['order_list'] == 0)
if (isset($a['order_list']) && isset($b['order_list']))
{
if ($a['order_list'] != 0 && $b['order_list'] != 0)
{
return $a['order_list'] - $b['order_list'];
}
elseif ($b['order_list'] != 0 && $a['order_list'] == 0)
{
return 1;
}
elseif ($a['order_list'] != 0 && $b['order_list'] == 0)
{
return 0;
}
return 1;
}
elseif ($a['order_list'] != 0 && $b['order_list'] == 0)
{
return 0;
}
return 1;
return 0;
});
// load the field data
foreach ($view->fields as $key => &$field)
{
$field['settings'] = $this->getFieldData($field['field'],$name_single,$name_list);
$field['settings'] = $this->getFieldData($field['field'], $name_single, $name_list);
}
}
if (ComponentbuilderHelper::checkArray($conditions))
unset($view->addfields);
// set the conditions
$view->addconditions = json_decode($view->addconditions,true);
// check what type of conditions array we have here (should be subform... but just incase)
// This could happen due to huge data sets
if (isset($view->addconditions['target_field']))
{
foreach ($conditions as $condition => $conditionValues)
$bucket = array();
foreach($view->addconditions as $option => $values)
{
foreach ($conditionValues as $nr => $conditionValue)
foreach($values as $nr => $value)
{
if ($condition === 'target_field')
$bucket['addconditions'.$nr][$option] = $value;
}
}
$view->addconditions = $bucket;
$objectUpdate->addconditions = json_encode($bucket);
}
if (ComponentbuilderHelper::checkArray($view->addconditions))
{
$view->conditions = array();
$ne = 0;
foreach ($view->addconditions as $nr => $conditionValue)
{
if (ComponentbuilderHelper::checkArray($conditionValue['target_field']) && ComponentbuilderHelper::checkArray($view->fields))
{
foreach ($conditionValue['target_field'] as $fieldKey => $fieldId)
{
if (ComponentbuilderHelper::checkArray($conditionValue) && ComponentbuilderHelper::checkArray($view->fields))
foreach ($view->fields as $fieldValues)
{
foreach ($conditionValue as $fieldKey => $fieldId)
{
foreach ($view->fields as $fieldValues)
{
if ((int) $fieldValues['field'] == (int) $fieldId)
{
// load the field details
$required = ComponentbuilderHelper::getBetween($fieldValues['settings']->xml,'required="','"');
$required = ($required == true) ? 'yes' : 'no';
$filter = ComponentbuilderHelper::getBetween($fieldValues['settings']->xml,'filter="','"');
$filter = ComponentbuilderHelper::checkString($filter) ? $filter : 'none';
// get name
$name = ComponentbuilderHelper::getBetween($fieldValues['settings']->xml,'name="','"');
$name = ComponentbuilderHelper::checkString($name) ? $name : $fieldValues['settings']->name;
// get type
$type = ComponentbuilderHelper::getBetween($fieldValues['settings']->xml,'type="','"');
$type = ComponentbuilderHelper::checkString($type) ? $type : $fieldValues['settings']->type_name;
// set the field name
$conditionValue[$fieldKey] = array(
'name' => ComponentbuilderHelper::safeString($name),
'type' => ComponentbuilderHelper::safeString($type),
'required' => $required,
'filter' => $filter
);
break;
}
}
}
}
}
if ($condition === 'match_field')
{
foreach ($view->fields as $fieldValue)
{
if ((int) $fieldValue['field'] == (int) $conditionValue)
if ((int) $fieldValues['field'] == (int) $fieldId)
{
// load the field details
$required = ComponentbuilderHelper::getBetween($fieldValues['settings']->xml,'required="','"');
$required = ($required == true) ? 'yes' : 'no';
$filter = ComponentbuilderHelper::getBetween($fieldValues['settings']->xml,'filter="','"');
$filter = ComponentbuilderHelper::checkString($filter) ? $filter : 'none';
// get name
$name = ComponentbuilderHelper::getBetween($fieldValue['settings']->xml,'name="','"');
$name = ComponentbuilderHelper::checkString($name) ? $name : $fieldValue['settings']->name;
$name = ComponentbuilderHelper::getBetween($fieldValues['settings']->xml,'name="','"');
$name = ComponentbuilderHelper::checkString($name) ? $name : $fieldValues['settings']->name;
// get type
$type = ComponentbuilderHelper::getBetween($fieldValue['settings']->xml,'type="','"');
$type = ComponentbuilderHelper::checkString($type) ? $type : $fieldValue['settings']->type_name;
// set the field details
$view->conditions[$nr]['match_name'] = ComponentbuilderHelper::safeString($name);
$view->conditions[$nr]['match_type'] = ComponentbuilderHelper::safeString($type);
$view->conditions[$nr]['match_xml'] = $fieldValue['settings']->xml;
// if custom field load field being extended
if (!ComponentbuilderHelper::typeField($type))
{
$view->conditions[$nr]['match_extends'] = ComponentbuilderHelper::getBetween($fieldValue['settings']->xml,'extends="','"');
}
else
{
$view->conditions[$nr]['match_extends'] = '';
}
$type = ComponentbuilderHelper::getBetween($fieldValues['settings']->xml,'type="','"');
$type = ComponentbuilderHelper::checkString($type) ? $type : $fieldValues['settings']->type_name;
// set the field name
$conditionValue['target_field'][$fieldKey] = array(
'name' => ComponentbuilderHelper::safeString($name),
'type' => ComponentbuilderHelper::safeString($type),
'required' => $required,
'filter' => $filter
);
break;
}
}
}
// set condition values
$view->conditions[$nr][$condition] = $conditionValue;
}
}
}
// set linked views
$linked_views_sorted = null;
if (ComponentbuilderHelper::checkArray($linked_views))
{
$linked_views_sorted = array();
foreach ($linked_views as $option => $values)
{
foreach ($values as $nr => $value)
// load match field
if (ComponentbuilderHelper::checkArray($view->fields) && isset($conditionValue['match_field']))
{
$linked_views_sorted[$nr][$option] = $value;
foreach ($view->fields as $fieldValue)
{
if ((int) $fieldValue['field'] == (int) $conditionValue['match_field'])
{
// get name
$name = ComponentbuilderHelper::getBetween($fieldValue['settings']->xml,'name="','"');
$name = ComponentbuilderHelper::checkString($name) ? $name : $fieldValue['settings']->name;
// get type
$type = ComponentbuilderHelper::getBetween($fieldValue['settings']->xml,'type="','"');
$type = ComponentbuilderHelper::checkString($type) ? $type : $fieldValue['settings']->type_name;
// set the field details
$conditionValue['match_name'] = ComponentbuilderHelper::safeString($name);
$conditionValue['match_type'] = ComponentbuilderHelper::safeString($type);
$conditionValue['match_xml'] = $fieldValue['settings']->xml;
// if custom field load field being extended
if (!ComponentbuilderHelper::typeField($type))
{
$conditionValue['match_extends'] = ComponentbuilderHelper::getBetween($fieldValue['settings']->xml,'extends="','"');
}
else
{
$conditionValue['match_extends'] = '';
}
break;
}
}
}
// set condition values
$view->conditions[$ne] = $conditionValue;
$ne++;
}
}
unset($linked_views);
// setup linked views to global data sets
$this->linkedAdminViews[$name_single] = $linked_views_sorted;
unset($linked_views_sorted);
unset($view->addconditions);
// set linked views
$this->linkedAdminViews[$name_single] = null;
$view->addlinked_views = json_decode($view->addlinked_views,true);
// check what type of linked_views array we have here (should be subform... but just incase)
// This could happen due to huge data sets
if (isset($view->addlinked_views['adminview']))
{
$bucket = array();
foreach($view->addlinked_views as $option => $values)
{
foreach($values as $nr => $value)
{
$bucket['addlinked_views'.$nr][$option] = $value;
}
}
$view->addlinked_views = $bucket;
$objectUpdate->addlinked_views = json_encode($bucket);
}
if (ComponentbuilderHelper::checkArray($view->addlinked_views))
{
// setup linked views to global data sets
$this->linkedAdminViews[$name_single] = array_values($view->addlinked_views);
}
unset($view->addlinked_views);
// set the lang target
$this->lang = 'admin';
// add_javascript
@ -1468,19 +1537,28 @@ class Get
$view->php_controller_list = $this->setDynamicValues(base64_decode($view->php_controller_list));
}
// set the button array
$buttons = json_decode($view->custom_button,true);
unset($view->custom_button);
$view->custom_button = json_decode($view->custom_button,true);
// check what type of custom_button array we have here (should be subform... but just incase)
// This could happen due to huge data sets
if (isset($view->custom_button['name']))
{
$bucket = array();
foreach($view->custom_button as $option => $values)
{
foreach($values as $nr => $value)
{
$bucket['custom_button'.$nr][$option] = $value;
}
}
$view->custom_button = $bucket;
$objectUpdate->custom_button = json_encode($bucket);
}
// sort the values
if (ComponentbuilderHelper::checkArray($buttons))
if (ComponentbuilderHelper::checkArray($view->custom_button))
{
foreach ($buttons as $option => $values)
{
foreach ($values as $nr => $value)
{
$view->custom_buttons[$nr][$option] = $value;
}
}
$view->custom_buttons = array_values($view->custom_button);
}
unset($view->custom_button);
}
// set custom import scripts
if (isset($view->add_custom_import) && $view->add_custom_import == 1)
@ -1517,20 +1595,29 @@ class Get
}
}
// check if controller input as been set
$ajax_input = json_decode($view->ajax_input,true);
if (ComponentbuilderHelper::checkArray($ajax_input))
$view->ajax_input = json_decode($view->ajax_input,true);
// check what type of ajax_input array we have here (should be subform... but just incase)
// This could happen due to huge data sets
if (isset($view->ajax_input['value_name']))
{
foreach ($ajax_input as $option => $values)
$bucket = array();
foreach($view->ajax_input as $option => $values)
{
foreach ($values as $nr => $value)
foreach($values as $nr => $value)
{
if ($addAjaxSite)
{
$this->customScriptBuilder['site']['ajax_controller'][$name_single][$nr][$option] = $value;
}
$this->customScriptBuilder['admin']['ajax_controller'][$name_single][$nr][$option] = $value;
$bucket['ajax_input'.$nr][$option] = $value;
}
}
$view->ajax_input = $bucket;
$objectUpdate->ajax_input = json_encode($bucket);
}
if (ComponentbuilderHelper::checkArray($view->ajax_input))
{
if ($addAjaxSite)
{
$this->customScriptBuilder['site']['ajax_controller'][$name_single] = array_values($view->ajax_input);
}
$this->customScriptBuilder['admin']['ajax_controller'][$name_single] = array_values($view->ajax_input);
$this->addAjax = true;
unset($view->ajax_input);
}
@ -1552,7 +1639,7 @@ class Get
if ($view->source == 1 && isset($view->tables))
{
// build and add the SQL dump
$this->customScriptBuilder['sql'][$name_single] = $this->buildSqlDump($view->tables,$name_single, $id);
$this->customScriptBuilder['sql'][$name_single] = $this->buildSqlDump($view->tables, $name_single, $id);
unset($view->tables);
}
elseif ($view->source == 2 && isset($view->sql))
@ -1577,6 +1664,11 @@ class Get
unset($this->placeholders['[[[VIEWS]]]']);
// store this view to class object
$this->_adminViewData[$id] = $view;
// be sure to update the table if we found repeatable fields that are still not converted
if (count((array) $objectUpdate) > 1)
{
$this->db->updateObject('#__componentbuilder_admin_view', $objectUpdate, 'id');
}
}
// return the found view data
return $this->_adminViewData[$id];
@ -1613,6 +1705,9 @@ class Get
{
$this->lang = 'admin';
}
// be sure to update the value in the db
$objectUpdate = new stdClass();
$objectUpdate->id = (int) $id;
// set the default data
$view->default = $this->setDynamicValues(base64_decode($view->default));
// fix alias to use in code
@ -1721,16 +1816,25 @@ class Get
if (isset($view->add_php_ajax) && $view->add_php_ajax == 1)
{
// check if controller input as been set
$ajax_input = json_decode($view->ajax_input,true);
if (ComponentbuilderHelper::checkArray($ajax_input))
$view->ajax_input = json_decode($view->ajax_input,true);
// check what type of ajax_input array we have here (should be subform... but just incase)
// This could happen due to huge data sets
if (isset($view->ajax_input['value_name']))
{
foreach ($ajax_input as $option => $values)
$bucket = array();
foreach($view->ajax_input as $option => $values)
{
foreach ($values as $nr => $value)
foreach($values as $nr => $value)
{
$this->customScriptBuilder[$this->target]['ajax_controller'][$view->code][$nr][$option] = $value;
$bucket['ajax_input'.$nr][$option] = $value;
}
}
$view->ajax_input = $bucket;
$objectUpdate->ajax_input = json_encode($bucket);
}
if (ComponentbuilderHelper::checkArray($view->ajax_input))
{
$this->customScriptBuilder[$this->target]['ajax_controller'][$view->code] = array_values($view->ajax_input);
$this->addSiteAjax = true;
unset($view->ajax_input);
}
@ -1754,19 +1858,33 @@ class Get
$view->php_controller = base64_decode($view->php_controller);
$view->php_controller = $this->setDynamicValues($view->php_controller);
// set the button array
$buttons = json_decode($view->custom_button,true);
unset($view->custom_button);
// sort the values
if (ComponentbuilderHelper::checkArray($buttons))
$view->custom_button = json_decode($view->custom_button,true);
// check what type of custom_button array we have here (should be subform... but just incase)
// This could happen due to huge data sets
if (isset($view->custom_button['name']))
{
foreach ($buttons as $option => $values)
$bucket = array();
foreach($view->custom_button as $option => $values)
{
foreach ($values as $nr => $value)
foreach($values as $nr => $value)
{
$view->custom_buttons[$nr][$option] = $value;
$bucket['custom_button'.$nr][$option] = $value;
}
}
$view->custom_button = array_values($bucket);
$objectUpdate->custom_button = json_encode($bucket);
}
// sort the values
if (ComponentbuilderHelper::checkArray($view->custom_button))
{
$view->custom_buttons = array_values($view->custom_button);
}
unset($view->custom_button);
}
// be sure to update the table if we found repeatable fields that are still not converted
if (count((array) $objectUpdate) > 1)
{
$this->db->updateObject('#__componentbuilder_'.$table, $objectUpdate, 'id');
}
// return the found view data
return $view;
@ -1782,7 +1900,7 @@ class Get
* @return oject The field data
*
*/
public function getFieldData($id,$name_single = null,$name_list = null)
public function getFieldData($id, $name_single = null, $name_list = null)
{
if (!isset($this->_fieldData[$id]) && $id > 0)
{
@ -1791,7 +1909,7 @@ class Get
// Order it by the ordering field.
$query->select('a.*');
$query->select($this->db->quoteName(array('c.name', 'c.properties'),array('type_name','properties')));
$query->select($this->db->quoteName(array('c.name', 'c.properties'), array('type_name', 'properties')));
$query->from('#__componentbuilder_field AS a');
$query->join('LEFT', $this->db->quoteName('#__componentbuilder_fieldtype', 'c') . ' ON (' . $this->db->quoteName('a.fieldtype') . ' = ' . $this->db->quoteName('c.id') . ')');
$query->where($this->db->quoteName('a.id') . ' = '. $this->db->quote($id));
@ -1811,8 +1929,27 @@ class Get
$field->xml = $this->setDynamicValues(json_decode($field->xml));
// load the type values form type params
$field->properties = json_decode($field->properties,true);
$properties = json_decode($field->properties,true);
// check what type of field array we have here (should be subform... but just incase)
// This could happen due to huge data sets
if (isset($properties['name']))
{
$bucket = array();
foreach($properties as $option => $values)
{
foreach($values as $nr => $value)
{
$bucket['addfields'.$nr][$option] = $value;
}
}
$properties = $bucket;
// be sure to update the value in the db
$objectUpdate = new stdClass();
$objectUpdate->id = $field->fieldtype;
$objectUpdate->properties = json_encode($bucket);
$this->db->updateObject('#__componentbuilder_fieldtype', $objectUpdate, 'id');
}
$field->properties = array_values($properties);
// check if we have advanced encryption
if (4 == $field->store && (!isset($this->advancedEncryption) || !$this->advancedEncryption))
{
@ -2245,12 +2382,54 @@ class Get
protected function setUpdateSQL($old, $new, $type, $key = null)
{
// check if there were new items added
if (isset($new[$type]) && ComponentbuilderHelper::checkArray($new[$type])
&& isset($old[$type]) && ComponentbuilderHelper::checkArray($old[$type]))
if (ComponentbuilderHelper::checkArray($new)
&& ComponentbuilderHelper::checkArray($old))
{
foreach ($new[$type] as $item)
foreach ($new as $item)
{
if (!in_array($item, $old[$type]))
// search to see if this is a new value
$newItem = true;
if (isset($item[$type]))
{
// check if this is old repeatable field
if (isset($old[$type]) && ComponentbuilderHelper::checkArray($old[$type]))
{
if (in_array($item[$type], $old[$type]))
{
$newItem = false;
}
}
elseif (!isset($old[$type]))
{
// we have new values
foreach($old as $oldItem)
{
if (isset($oldItem[$type]))
{
if ($oldItem[$type] == $item[$type])
{
$newItem = false;
break;
}
}
else
{
$newItem = false;
break;
}
}
}
else
{
$newItem = false;
}
}
else
{
break;
}
// ad if new
if ($newItem)
{
// we have a new item, lets add to SQL
if (!isset($this->addSQL[$type]) || !ComponentbuilderHelper::checkArray($this->addSQL[$type]))
@ -2264,18 +2443,18 @@ class Get
{
$this->addSQL[$type][$key] = array();
}
$this->addSQL[$type][$key][] = (int) $item;
$this->addSQL[$type][$key][] = (int) $item[$type];
}
else
{
// convert adminview id to name
if ('adminview' === $type)
{
$this->addSQL[$type][] = ComponentbuilderHelper::safeString($this->getAdminViewData($item)->name_single);
$this->addSQL[$type][] = ComponentbuilderHelper::safeString($this->getAdminViewData($item[$type])->name_single);
}
else
{
$this->addSQL[$type][] = (int) item;
$this->addSQL[$type][] = (int) $item[$type];
}
}
}
@ -2774,7 +2953,7 @@ class Get
* @return string on success with the Dump SQL
*
*/
public function buildSqlDump($tables,$view,$view_id)
public function buildSqlDump($tables, $view, $view_id)
{
// first build a query statment to get all the data (insure it must be added - check the tweaking)
if (ComponentbuilderHelper::checkArray($tables) && (!isset($this->sqlTweak[$view_id]['remove']) || !$this->sqlTweak[$view_id]['remove']))