diff --git a/README.md b/README.md index 2da4fe2a1..c8d502bd2 100644 --- a/README.md +++ b/README.md @@ -111,11 +111,11 @@ Component Builder is mapped as a component in itself on my local development env + *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io) + *Name*: [Component Builder](http://vdm.bz/component-builder) + *First Build*: 30th April, 2015 -+ *Last Build*: 22nd December, 2017 ++ *Last Build*: 25th December, 2017 + *Version*: 2.6.7 + *Copyright*: Copyright (C) 2015. All Rights Reserved + *License*: GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html -+ *Line count*: **178381** ++ *Line count*: **178415** + *File count*: **1145** + *Folder count*: **184** diff --git a/admin/README.txt b/admin/README.txt index 2da4fe2a1..c8d502bd2 100644 --- a/admin/README.txt +++ b/admin/README.txt @@ -111,11 +111,11 @@ Component Builder is mapped as a component in itself on my local development env + *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io) + *Name*: [Component Builder](http://vdm.bz/component-builder) + *First Build*: 30th April, 2015 -+ *Last Build*: 22nd December, 2017 ++ *Last Build*: 25th December, 2017 + *Version*: 2.6.7 + *Copyright*: Copyright (C) 2015. All Rights Reserved + *License*: GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html -+ *Line count*: **178381** ++ *Line count*: **178415** + *File count*: **1145** + *Folder count*: **184** diff --git a/admin/custom/dropbox.php b/admin/custom/dropbox.php index 2c8c2a313..8f59d5da0 100644 --- a/admin/custom/dropbox.php +++ b/admin/custom/dropbox.php @@ -1,4 +1,5 @@ "https://", "suddomain" => "api.", "domain" => "dropboxapi.com", @@ -37,8 +39,8 @@ class Dropbox /** * the verious pathes we need - */ - protected $domainpath = array( + */ + protected $domainpath = array( "list_folder" => "files/list_folder", "list_folder_continue" => "files/list_folder/continue", "create_shared_link" => "sharing/create_shared_link", @@ -48,58 +50,58 @@ class Dropbox /** * the target pathe to get - */ + */ protected $targetPath = false; protected $targetPathOriginal = false; /** * oauth token - */ + */ protected $oauthToken; /** * the verious pathes we need - */ + */ protected $permissionType; /** * The loop controller in calling Dropbox API - */ + */ protected $continueCalling = array(); /** * the success switch - */ + */ protected $succes; /** * the type call - */ + */ protected $type; /** * the query for the call - */ + */ protected $query; /** * the query for the call - */ + */ protected $model; /** * the mediaData bucket - */ + */ public $mediaData = array(); /** * the error messages - */ + */ public $error_summary = array(); - + /** - * force the update to reset - **/ + * force the update to reset + * */ public $forceReset = false; /** @@ -108,7 +110,7 @@ class Dropbox public function __construct(JModelLegacy $model, $buildType) { // set the url at this point for now - $this->url = $this->postUrl["protocol"].$this->postUrl["suddomain"].$this->postUrl["domain"].$this->postUrl["path"]; + $this->url = $this->postUrl["protocol"] . $this->postUrl["suddomain"] . $this->postUrl["domain"] . $this->postUrl["path"]; // set the local model $this->model = $model; // set the build type @@ -133,10 +135,10 @@ class Dropbox ini_set('max_execution_time', 500); // set the oauth toke $this->oauthToken = $token; - + // set the permission type $this->permissionType = $permissiontype; - + // set the details if ($this->checkArray($details)) { @@ -145,13 +147,13 @@ class Dropbox $this->$detail = $value; } } - + // set the curent folder path if (!$this->setFolderPath()) { return false; } - + // start the main factory that calles for the folder data $this->query = array("path" => $this->targetPath, "recursive" => true, "include_media_info" => true); $this->type = 'list_folder'; @@ -160,7 +162,7 @@ class Dropbox return true; } } - + public function revokeToken($token = null) { if ($token) @@ -177,7 +179,7 @@ class Dropbox } return false; } - + protected function setFolderPath() { if ('full' == $this->permissionType && isset($this->dropboxOption) && isset($this->dropboxTarget) && $this->checkString($this->dropboxTarget)) @@ -185,8 +187,8 @@ class Dropbox if (2 == $this->dropboxOption) { // simply set the path - $this->targetPath = '/'.trim(strtolower($this->dropboxTarget), '/'); - + $this->targetPath = '/' . trim(strtolower($this->dropboxTarget), '/'); + return true; } elseif (1 == $this->dropboxOption) @@ -203,12 +205,12 @@ class Dropbox elseif ('app' == $this->permissionType) { $this->targetPath = ""; - + return true; } return false; } - + protected function makeCall() { if ($this->_isCurl()) @@ -220,48 +222,49 @@ class Dropbox return $this->makeGetCall(); } } - + protected function makeGetCall() { - $options = array( 'http' => array( - 'header' => "Content-Type: application/json\r\n". - "Authorization: Bearer ".$this->oauthToken, - 'method' => "POST" + 'header' => "Content-Type: application/json\r\n" . + "Authorization: Bearer " . $this->oauthToken, + 'method' => "POST" ), ); - + if ($this->checkArray($this->query)) { $this->query = json_encode($this->query); } $options['http']['content'] = $this->query; - + $context = stream_context_create($options); - $response = file_get_contents($this->url.$this->domainpath[$this->type], false, $context); + $response = file_get_contents($this->url . $this->domainpath[$this->type], false, $context); + // store the result + return $this->getCallResult($response); + } + protected function getCallResult($response) + { if ($response === FALSE) { - $this->error_summary[] = $this->type.'_error'; + $this->error_summary[] = $this->type . '_error'; return false; } - else - { - // store the result - return $this->setTheResult(json_decode($response)); - } + // store the result + return $this->setTheResult(json_decode($response)); } - + protected function makeCurlCall() { - $headers = array('Authorization: Bearer '. $this->oauthToken, - 'Content-Type: application/json' + $headers = array('Authorization: Bearer ' . $this->oauthToken, + 'Content-Type: application/json' ); - - $ch = curl_init($this->url.$this->domainpath[$this->type]); - + + $ch = curl_init($this->url . $this->domainpath[$this->type]); + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // check if query is set if ($this->checkArray($this->query)) @@ -272,11 +275,17 @@ class Dropbox curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // curl_setopt($ch, CURLOPT_VERBOSE, 1); // debug - + $response = curl_exec($ch); - + curl_close($ch); - + + // store the result + return $this->curlCallResult($response); + } + + public function curlCallResult($response) + { if ($this->checkJson($response)) { $response = json_decode($response); @@ -284,7 +293,7 @@ class Dropbox // store the result return $this->setTheResult($response); } - + protected function setTheResult($data) { // if there was an error stop!!! @@ -294,11 +303,11 @@ class Dropbox $this->forceReset = true; return false; } - + // deal with each type switch ($this->type) { - case "list_folder": + case "list_folder": case "list_folder_continue": if (isset($data->entries) && $this->checkArray($data->entries)) { @@ -318,15 +327,15 @@ class Dropbox return true; } } - $this->error_summary[] = $this->type.'_error'; + $this->error_summary[] = $this->type . '_error'; break; case "create_shared_link": - if (isset($data->url) && isset($data->path) && $this->storeSharedLink($this->fixPath($data->path), str_replace('?dl=0','?dl=1',$data->url))) + if (isset($data->url) && isset($data->path) && $this->storeSharedLink($this->fixPath($data->path), str_replace('?dl=0', '?dl=1', $data->url))) { // we stored the link return true; } - $this->error_summary[] = $this->type.'_error'; + $this->error_summary[] = $this->type . '_error'; break; case "get_shared_link_metadata": if (isset($data->path_lower)) @@ -334,33 +343,33 @@ class Dropbox $this->targetPath = $data->path_lower; return true; } - $this->error_summary[] = $this->type.'_error'; + $this->error_summary[] = $this->type . '_error'; break; case "revoke": if (is_null($data)) { return true; } - $this->error_summary[] = $this->type.'_error'; + $this->error_summary[] = $this->type . '_error'; break; } $this->forceReset = true; return false; } - + protected function storeSharedLink($path, $url) { // we need to store the url to DB if (isset($this->mediaData[$path])) { - $localListing = array(); - $localListing['id'] = 0; - $localListing['name'] = $this->mediaData[$path]['name']; - $localListing['size'] = $this->mediaData[$path]['size']; - $localListing['key'] = $path; - $localListing['url'] = $url; - $localListing['build'] = $this->build; - $localListing['external_source'] = (int) $this->sourceID; + $localListing = array(); + $localListing['id'] = 0; + $localListing['name'] = $this->mediaData[$path]['name']; + $localListing['size'] = $this->mediaData[$path]['size']; + $localListing['key'] = $path; + $localListing['url'] = $url; + $localListing['build'] = $this->build; + $localListing['external_source'] = (int) $this->sourceID; // free some memory unset($this->mediaData[$path]); // check if item already set @@ -375,9 +384,9 @@ class Dropbox } protected function storeFiles($entries) - { + { foreach ($entries as $item) - { + { if (isset($item->{'.tag'}) && 'file' == $item->{'.tag'} && isset($item->name)) { $addLink = false; @@ -386,7 +395,7 @@ class Dropbox { foreach ($this->addTypes as $add) { - if (strpos($item->name,$add) !== false) + if (strpos($item->name, $add) !== false) { $addLink = true; } @@ -408,7 +417,7 @@ class Dropbox } return true; } - + protected function fixPath($path) { if ($this->checkString($this->targetPath)) @@ -417,7 +426,7 @@ class Dropbox } else { - $path = 'VDM_pLeK_h0uEr'.$path; + $path = 'VDM_pLeK_h0uEr' . $path; } return $path; } @@ -439,7 +448,7 @@ class Dropbox } return false; } - + protected function checkJson($string) { if ($this->checkString($string)) @@ -458,7 +467,7 @@ class Dropbox } return false; } - + protected function _isCurl() { return function_exists('curl_version'); diff --git a/admin/helpers/componentbuilder.php b/admin/helpers/componentbuilder.php index ed934fec1..e31909ffb 100644 --- a/admin/helpers/componentbuilder.php +++ b/admin/helpers/componentbuilder.php @@ -41,12 +41,16 @@ abstract class ComponentbuilderHelper self::loadSession(); } + /** + * The global updater + **/ + protected static $globalUpdater = array(); + /* * Convert repeatable field to subform * * @param array $item The array to convert * @param string $name The main field name - * @param array $updater The updater (dynamic) option * * @return array */ @@ -72,11 +76,6 @@ abstract class ComponentbuilderHelper return $item; } - /** - * The global updater - **/ - protected static $globalUpdater = array(); - /* * Convert repeatable field to subform * @@ -91,66 +90,69 @@ abstract class ComponentbuilderHelper // update the repeatable fields foreach ($searcher as $key => $sleutel) { - $isJson = false; - if (isset($object->{$key}) && self::checkJson($object->{$key})) + if (isset($object->{$key})) { - $object->{$key} = json_decode($object->{$key}, true); - $isJson = true; - } - // check if this is old values for repeatable fields - if (self::checkArray($object->{$key}) && isset($object->{$key}[$sleutel])) - { - // load it back - $object->{$key} = self::convertRepeatable($object->{$key}, $key); - // add to global updater - if ( - self::checkArray($object->{$key}) && self::checkArray($updater) && - ( - ( isset($updater['table']) && isset($updater['val']) && isset($updater['key']) ) || - ( isset($updater['unique']) && isset($updater['unique'][$key]) && isset($updater['unique'][$key]['table']) && isset($updater['unique'][$key]['val']) && isset($updater['unique'][$key]['key']) ) - ) - ) + $isJson = false; + if (self::checkJson($object->{$key})) { - $_key = null; - $_value = null; - $_table = null; - // check if we have unique id table for this repeatable/subform field - if ( isset($updater['unique']) && isset($updater['unique'][$key]) && isset($updater['unique'][$key]['table']) && isset($updater['unique'][$key]['val']) && isset($updater['unique'][$key]['key']) ) + $object->{$key} = json_decode($object->{$key}, true); + $isJson = true; + } + // check if this is old values for repeatable fields + if (self::checkArray($object->{$key}) && isset($object->{$key}[$sleutel])) + { + // load it back + $object->{$key} = self::convertRepeatable($object->{$key}, $key); + // add to global updater + if ( + self::checkArray($object->{$key}) && self::checkArray($updater) && + ( + ( isset($updater['table']) && isset($updater['val']) && isset($updater['key']) ) || + ( isset($updater['unique']) && isset($updater['unique'][$key]) && isset($updater['unique'][$key]['table']) && isset($updater['unique'][$key]['val']) && isset($updater['unique'][$key]['key']) ) + ) + ) { - $_key = $updater['unique'][$key]['key']; - $_value = $updater['unique'][$key]['val']; - $_table = $updater['unique'][$key]['table']; - } - elseif ( isset($updater['table']) && isset($updater['val']) && isset($updater['key']) ) - { - $_key = $updater['key']; - $_value = $updater['val']; - $_table = $updater['table']; - } - // continue only if values are valid - if (self::checkString($_table) && self::checkString($_key) && $_value > 0) - { - // set target table & item - $target = trim($_table) . '.' . trim($_key) . '.' . trim($_value); - if (!isset(self::$globalUpdater[$target])) + $_key = null; + $_value = null; + $_table = null; + // check if we have unique id table for this repeatable/subform field + if ( isset($updater['unique']) && isset($updater['unique'][$key]) && isset($updater['unique'][$key]['table']) && isset($updater['unique'][$key]['val']) && isset($updater['unique'][$key]['key']) ) { - self::$globalUpdater[$target] = new stdClass; - self::$globalUpdater[$target]->{$_key} = (int) $_value; + $_key = $updater['unique'][$key]['key']; + $_value = $updater['unique'][$key]['val']; + $_table = $updater['unique'][$key]['table']; + } + elseif ( isset($updater['table']) && isset($updater['val']) && isset($updater['key']) ) + { + $_key = $updater['key']; + $_value = $updater['val']; + $_table = $updater['table']; + } + // continue only if values are valid + if (self::checkString($_table) && self::checkString($_key) && $_value > 0) + { + // set target table & item + $target = trim($_table) . '.' . trim($_key) . '.' . trim($_value); + if (!isset(self::$globalUpdater[$target])) + { + self::$globalUpdater[$target] = new stdClass; + self::$globalUpdater[$target]->{$_key} = (int) $_value; + } + // load the new subform values to global updater + self::$globalUpdater[$target]->{$key} = json_encode($object->{$key}); } - // load the new subform values to global updater - self::$globalUpdater[$target]->{$key} = json_encode($object->{$key}); } } - } - // no set back to json if came in as json - if (isset($object->{$key}) && $isJson && self::checkArray($object->{$key})) - { - $object->{$key} = json_encode($object->{$key}); - } - // remove if not json or array - elseif (isset($object->{$key}) && !self::checkArray($object->{$key}) && !self::checkJson($object->{$key})) - { - unset($object->{$key}); + // no set back to json if came in as json + if ($isJson && self::checkArray($object->{$key})) + { + $object->{$key} = json_encode($object->{$key}); + } + // remove if not json or array + elseif (!self::checkArray($object->{$key}) && !self::checkJson($object->{$key})) + { + unset($object->{$key}); + } } } return $object; diff --git a/admin/models/import_joomla_components.php b/admin/models/import_joomla_components.php index c94a75ede..a121134f6 100644 --- a/admin/models/import_joomla_components.php +++ b/admin/models/import_joomla_components.php @@ -958,7 +958,7 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy // update the fields $object = new stdClass; $object->id = $adminview; - $object->addlinked_views = json_encode($addlinked_views); + $object->addlinked_views = json_encode($addlinked_views, JSON_FORCE_OBJECT); // update the admin view $this->_db->updateObject('#__componentbuilder_admin_view', $object, 'id'); } @@ -1013,7 +1013,7 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy if (ComponentbuilderHelper::checkArray($updateArray)) { // load it back - $item->{$field} = json_encode($this->updateSubformIDs($updateArray, $table, $targetArray)); + $item->{$field} = json_encode($this->updateSubformIDs($updateArray, $table, $targetArray), JSON_FORCE_OBJECT); } } } @@ -1052,7 +1052,7 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy } if ($isJson) { - return json_encode($values); + return json_encode($values, JSON_FORCE_OBJECT); } return $values; } @@ -1076,7 +1076,7 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy $item = json_decode($item, true); $isJson = true; } - if (ComponentbuilderHelper::checkArray($item)) + if (ComponentbuilderHelper::checkArray($item) && isset($item[$target])) { // set item ID $itemId = (isset($item['id'])) ? $item['id'] : 'newItem'; @@ -1135,7 +1135,7 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy $item[$target] = json_encode($item[$target]); } } - elseif (ComponentbuilderHelper::checkObject($item)) + elseif (ComponentbuilderHelper::checkObject($item) && isset($item->{$target})) { // set item ID $itemId = (isset($item->id)) ? $item->id : 'newItem'; @@ -1550,7 +1550,7 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy // subform fields to target $updaterT = array( // subformfield => array( field => type_value ) - 'addcustom_admin_views' => array('customadminview' => 'custom_admin_view') + 'addcustom_admin_views' => array('customadminview' => 'custom_admin_view', 'adminviews' => 'admin_view', 'before' => 'admin_view') ); // update the subform ids $this->updateSubformsIDs($item, 'component_custom_admin_views', $updaterT); @@ -1743,7 +1743,7 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy // only update if we have translations if (ComponentbuilderHelper::checkArray($translations)) { - $item->translation = json_encode($translations); + $item->translation = json_encode($translations, JSON_FORCE_OBJECT); } } elseif (isset($item->localTranslation) && ComponentbuilderHelper::checkJson($item->localTranslation)) diff --git a/admin/models/joomla_component.php b/admin/models/joomla_component.php index eb3b8aaa8..3eed82cbb 100644 --- a/admin/models/joomla_component.php +++ b/admin/models/joomla_component.php @@ -258,7 +258,7 @@ class ComponentbuilderModelJoomla_component extends JModelAdmin } } $item->{$_value} = $bucket; - $objectUpdate->{$_value} = json_encode($bucket); + $objectUpdate->{$_value} = json_encode($bucket, JSON_FORCE_OBJECT); } } // be sure to update the table if we found repeatable fields that are still not converted diff --git a/admin/models/joomla_components.php b/admin/models/joomla_components.php index 5cc6e6193..011eb7c99 100644 --- a/admin/models/joomla_components.php +++ b/admin/models/joomla_components.php @@ -57,34 +57,34 @@ class ComponentbuilderModelJoomla_components extends JModelList } public $user; - public $packagePath = false; - public $packageName = false; - public $zipPath = false; - public $key = array(); - public $exportBuyLinks = array(); - public $exportPackageLinks = array(); - public $info = array( - 'name' => array(), - 'short_description' => array(), - 'component_version' => array(), - 'companyname' => array(), - 'author' => array(), - 'email' => array(), - 'website' => array(), - 'license' => array(), - 'copyright' => array(), - 'getKeyFrom' => null - ); - public $activeType = 'export'; + public $packagePath = false; + public $packageName = false; + public $zipPath = false; + public $key = array(); + public $exportBuyLinks = array(); + public $exportPackageLinks = array(); + public $info = array( + 'name' => array(), + 'short_description' => array(), + 'component_version' => array(), + 'companyname' => array(), + 'author' => array(), + 'email' => array(), + 'website' => array(), + 'license' => array(), + 'copyright' => array(), + 'getKeyFrom' => null + ); + public $activeType = 'export'; protected $params; protected $tempPath; protected $customPath; - protected $smartExport = array(); - protected $exportIDs = array(); - protected $customCodeM = array(); - protected $fieldTypes = array(); - protected $isMultiple = array(); + protected $smartExport = array(); + protected $exportIDs = array(); + protected $customCodeM = array(); + protected $fieldTypes = array(); + protected $isMultiple = array(); /** * Method to build the export package @@ -207,15 +207,15 @@ class ComponentbuilderModelJoomla_components extends JModelList continue; } // build information data set - $this->info['name'][$item->id] = $item->name; - $this->info['short_description'][$item->id] = $item->short_description; - $this->info['component_version'][$item->id] = $item->component_version; - $this->info['companyname'][$item->id] = $item->companyname; - $this->info['author'][$item->id] = $item->author; - $this->info['email'][$item->id] = $item->email; - $this->info['website'][$item->id] = $item->website; - $this->info['license'][$item->id] = $item->license; - $this->info['copyright'][$item->id] = $item->copyright; + $this->info['name'][$item->id] = $item->name; + $this->info['short_description'][$item->id] = $item->short_description; + $this->info['component_version'][$item->id] = $item->component_version; + $this->info['companyname'][$item->id] = $item->companyname; + $this->info['author'][$item->id] = $item->author; + $this->info['email'][$item->id] = $item->email; + $this->info['website'][$item->id] = $item->website; + $this->info['license'][$item->id] = $item->license; + $this->info['copyright'][$item->id] = $item->copyright; // set the keys if (isset($item->export_key) && ComponentbuilderHelper::checkString($item->export_key)) { @@ -500,6 +500,38 @@ class ComponentbuilderModelJoomla_components extends JModelList { continue; } + // actions to take before storing the item if table is template, layout, site_view, or custom_admin_view + if ('layout' === $table || 'template' === $table || 'site_view' === $table || 'custom_admin_view' === $table) + { + // unset snippets (we no longer export snippets) + if (isset($item->snippet)) + { + unset($item->snippet); + } + } + // actions to take before storing the item if table is joomla_component + if ('joomla_component' === $table) + { + // make sure old fields are not exported any more + unset($item->addconfig); + unset($item->addadmin_views); + unset($item->addcustom_admin_views); + unset($item->addsite_views); + unset($item->version_update); + unset($item->sql_tweak); + unset($item->addcustommenus); + unset($item->dashboard_tab); + unset($item->php_dashboard_methods); + unset($item->addfiles); + unset($item->addfolders); + } + // actions to take before storing the item if table is admin_view + if ('admin_view' === $table) + { + // make sure old fields are not exported any more + unset($item->addfields); + unset($item->addconditions); + } // load to global object $this->smartExport[$table][$item->id] = $item; // set the custom code ID's @@ -645,12 +677,12 @@ class ComponentbuilderModelJoomla_components extends JModelList $data = $locker->encryptString($data); // Set the key owner information $this->info['getKeyFrom'] = array(); - $this->info['getKeyFrom']['company'] = $this->params->get('export_company', null); - $this->info['getKeyFrom']['owner'] = $this->params->get('export_owner', null); - $this->info['getKeyFrom']['email'] = $this->params->get('export_email', null); - $this->info['getKeyFrom']['website'] = $this->params->get('export_website', null); - $this->info['getKeyFrom']['license'] = $this->params->get('export_license', null); - $this->info['getKeyFrom']['copyright'] = $this->params->get('export_copyright', null); + $this->info['getKeyFrom']['company'] = $this->params->get('export_company', null); + $this->info['getKeyFrom']['owner'] = $this->params->get('export_owner', null); + $this->info['getKeyFrom']['email'] = $this->params->get('export_email', null); + $this->info['getKeyFrom']['website'] = $this->params->get('export_website', null); + $this->info['getKeyFrom']['license'] = $this->params->get('export_license', null); + $this->info['getKeyFrom']['copyright'] = $this->params->get('export_copyright', null); // making provision for future changes if (count($this->exportBuyLinks) == 1) { diff --git a/componentbuilder.xml b/componentbuilder.xml index 770dc991e..42897fe49 100644 --- a/componentbuilder.xml +++ b/componentbuilder.xml @@ -1,7 +1,7 @@ COM_COMPONENTBUILDER - 22nd December, 2017 + 25th December, 2017 Llewellyn van der Merwe joomla@vdm.io http://vdm.bz/component-builder