Move the Power, Plugin and Module builders into the container. Many more PHP 8 improvments.

This commit is contained in:
Llewellyn van der Merwe 2023-01-29 22:12:42 +02:00
parent e6c02a29f6
commit 7edbe20c33
Signed by untrusted user: Llewellyn
GPG Key ID: A9201372263741E7
68 changed files with 3443 additions and 1681 deletions

View File

@ -140,13 +140,13 @@ TODO
+ *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io)
+ *Name*: [Component Builder](https://git.vdm.dev/joomla/Component-Builder)
+ *First Build*: 30th April, 2015
+ *Last Build*: 22nd January, 2023
+ *Last Build*: 29th January, 2023
+ *Version*: 3.1.13
+ *Copyright*: Copyright (C) 2015 Vast Development Method. All rights reserved.
+ *License*: GNU General Public License version 2 or later; see LICENSE.txt
+ *Line count*: **357633**
+ *Line count*: **360674**
+ *Field count*: **2009**
+ *File count*: **2304**
+ *File count*: **2314**
+ *Folder count*: **408**
> This **component** was build with a [Joomla](https://extensions.joomla.org/extension/component-builder/) [Automated Component Builder](https://www.joomlacomponentbuilder.com).

View File

@ -140,13 +140,13 @@ TODO
+ *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io)
+ *Name*: [Component Builder](https://git.vdm.dev/joomla/Component-Builder)
+ *First Build*: 30th April, 2015
+ *Last Build*: 22nd January, 2023
+ *Last Build*: 29th January, 2023
+ *Version*: 3.1.13
+ *Copyright*: Copyright (C) 2015 Vast Development Method. All rights reserved.
+ *License*: GNU General Public License version 2 or later; see LICENSE.txt
+ *Line count*: **357633**
+ *Line count*: **360674**
+ *Field count*: **2009**
+ *File count*: **2304**
+ *File count*: **2314**
+ *Folder count*: **408**
> This **component** was build with a [Joomla](https://extensions.joomla.org/extension/component-builder/) [Automated Component Builder](https://www.joomlacomponentbuilder.com).

View File

@ -191,14 +191,14 @@ const getSelectedItem = async (table, row, field, line) => {
formData.append('regex_search', regexObject.checked ? 1 : 0);
// get search value
if (mode == 1) {
// calling URL
postURL = UrlAjax + 'getSearchValue';
} else {
if (mode == 2) {
// add the line value
formData.append('line_nr', line);
// calling URL
postURL = UrlAjax + 'getReplaceValue';
} else {
// calling URL
postURL = UrlAjax + 'getSearchValue';
}
let options = {
@ -613,6 +613,12 @@ const buttonUpdateAllStyleDisplay = async (value) => {
* JS Function to execute (A) on search/replace text change , (B) on search options changes
*/
const startSearch = (field, forced = false) => {
// check mode
let mode = modeObject.querySelector('input[type=\'radio\']:checked').value;
if (mode == 0) {
// reset the search area
window.location.href = UrlSearch;
}
// check if we have an Enter click
if (field && typeof field.code !== 'undefined' && field.code === "Enter") {
forced = true;

View File

@ -80,7 +80,7 @@ class Compiler extends Infusion
{
// to check the compiler speed
$this->time_start = microtime(true);
CFactory::_('Counter')->start();
CFactory::_('Utilities.Counter')->start();
// first we run the parent constructors
if (parent::__construct())
{
@ -104,9 +104,9 @@ class Compiler extends Infusion
if (CFactory::_('Config')->remove_site_folder && CFactory::_('Config')->remove_site_edit_folder)
{
// first remove the files and folders
$this->removeFolder($this->componentPath . '/site');
CFactory::_('Utilities.Folder')->remove(CFactory::_('Utilities.Paths')->component_path . '/site');
// clear form component xml
$xmlPath = $this->componentPath . '/'
$xmlPath = CFactory::_('Utilities.Paths')->component_path . '/'
. CFactory::_('Content')->get('component') . '.xml';
$componentXML = FileHelper::getContent($xmlPath);
$textToSite = GetHelper::between(
@ -120,7 +120,7 @@ class Compiler extends Infusion
'<languages folder="site">' . $textToSiteLang
. "</languages>"), array('', ''), (string) $componentXML
);
$this->writeFile($xmlPath, $componentXML);
CFactory::_('Utilities.File')->write($xmlPath, $componentXML);
}
// for plugin event TODO change event api signatures
$component_context = CFactory::_('Config')->component_context;
@ -363,7 +363,7 @@ class Compiler extends Infusion
// end the timer here
$this->time_end = microtime(true);
$this->secondsCompiled = $this->time_end - $this->time_start;
CFactory::_('Counter')->end();
CFactory::_('Utilities.Counter')->end();
// completed the compilation
return true;
@ -380,15 +380,13 @@ class Compiler extends Infusion
*/
protected function updateFiles()
{
if (isset($this->newFiles['static'])
&& ArrayHelper::check($this->newFiles['static'])
&& isset($this->newFiles['dynamic'])
&& ArrayHelper::check($this->newFiles['dynamic']))
if (CFactory::_('Utilities.Files')->exists('static')
&& CFactory::_('Utilities.Files')->exists('dynamic'))
{
// get the bom file
$bom = FileHelper::getContent(CFactory::_('Config')->bom_path);
// first we do the static files
foreach ($this->newFiles['static'] as $static)
foreach (CFactory::_('Utilities.Files')->get('static') as $static)
{
if (File::exists($static['path']))
{
@ -398,7 +396,7 @@ class Compiler extends Infusion
}
}
// now we do the dynamic files
foreach ($this->newFiles['dynamic'] as $view => $files)
foreach (CFactory::_('Utilities.Files')->get('dynamic') as $view => $files)
{
if (CFactory::_('Content')->exist_($view)
&& ArrayHelper::check(
@ -423,17 +421,14 @@ class Compiler extends Infusion
CFactory::_('Content')->remove_($view);
}
// free up some memory
unset($this->newFiles['dynamic']);
CFactory::_('Utilities.Files')->remove('dynamic');
// do modules if found
if (CFactory::_('Joomlamodule.Data')->exists())
{
foreach (CFactory::_('Joomlamodule.Data')->get() as $module)
{
if (ObjectHelper::check($module)
&& isset($this->newFiles[$module->key])
&& ArrayHelper::check(
$this->newFiles[$module->key]
))
&& CFactory::_('Utilities.Files')->exists($module->key))
{
// move field or rule if needed
if (isset($module->fields_rules_paths)
@ -489,7 +484,7 @@ class Compiler extends Infusion
}
}
// update the module files
foreach ($this->newFiles[$module->key] as $module_file)
foreach (CFactory::_('Utilities.Files')->get($module->key) as $module_file)
{
if (File::exists($module_file['path']))
{
@ -500,7 +495,7 @@ class Compiler extends Infusion
}
}
// free up some memory
unset($this->newFiles[$module->key]);
CFactory::_('Utilities.Files')->remove($module->key);
CFactory::_('Content')->remove_($module->key);
}
}
@ -511,10 +506,7 @@ class Compiler extends Infusion
foreach (CFactory::_('Joomlaplugin.Data')->get() as $plugin)
{
if (ObjectHelper::check($plugin)
&& isset($this->newFiles[$plugin->key])
&& ArrayHelper::check(
$this->newFiles[$plugin->key]
))
&& CFactory::_('Utilities.Files')->exists($plugin->key))
{
// move field or rule if needed
if (isset($plugin->fields_rules_paths)
@ -570,7 +562,7 @@ class Compiler extends Infusion
}
}
// update the plugin files
foreach ($this->newFiles[$plugin->key] as $plugin_file)
foreach (CFactory::_('Utilities.Files')->get($plugin->key) as $plugin_file)
{
if (File::exists($plugin_file['path']))
{
@ -581,7 +573,7 @@ class Compiler extends Infusion
}
}
// free up some memory
unset($this->newFiles[$plugin->key]);
CFactory::_('Utilities.Files')->remove($plugin->key);
CFactory::_('Content')->remove_($plugin->key);
}
}
@ -592,13 +584,10 @@ class Compiler extends Infusion
foreach (CFactory::_('Power')->active as $power)
{
if (ObjectHelper::check($power)
&& isset($this->newFiles[$power->key])
&& ArrayHelper::check(
$this->newFiles[$power->key]
))
&& CFactory::_('Utilities.Files')->exists($power->key))
{
// update the power files
foreach ($this->newFiles[$power->key] as $power_file)
foreach (CFactory::_('Utilities.Files')->get($power->key) as $power_file)
{
if (File::exists($power_file['path']))
{
@ -609,7 +598,7 @@ class Compiler extends Infusion
}
}
// free up some memory
unset($this->newFiles[$power->key]);
CFactory::_('Utilities.Files')->remove($power->key);
CFactory::_('Content')->remove_($power->key);
}
}
@ -681,9 +670,9 @@ class Compiler extends Infusion
&$view)
);
// add answer back to file
$this->writeFile($path, $answer);
CFactory::_('Utilities.File')->write($path, $answer);
// count the file lines
CFactory::_('Counter')->line += substr_count((string) $answer, PHP_EOL);
CFactory::_('Utilities.Counter')->line += substr_count((string) $answer, PHP_EOL);
}
/**
@ -699,7 +688,7 @@ class Compiler extends Infusion
&& isset($this->updateServerFileName)
&& $this->dynamicIntegration)
{
$update_server_xml_path = $this->componentPath . '/'
$update_server_xml_path = CFactory::_('Utilities.Paths')->component_path . '/'
. $this->updateServerFileName . '.xml';
// make sure we have the correct file
if (File::exists($update_server_xml_path)
@ -843,7 +832,7 @@ class Compiler extends Infusion
{
// do a final run to update the readme file
$two = 0;
foreach ($this->newFiles['static'] as $static)
foreach (CFactory::_('Utilities.Files')->get('static') as $static)
{
if (('README.md' === $static['name']
|| 'README.txt' === $static['name'])
@ -858,23 +847,23 @@ class Compiler extends Infusion
break;
}
}
unset($this->newFiles['static']);
CFactory::_('Utilities.Files')->remove('static');
}
private function setReadMe($path)
{
// set readme data if not set already
if (!CFactory::_('Content')->exist('LINE_COUNT')
|| CFactory::_('Content')->get('LINE_COUNT') != CFactory::_('Counter')->line)
|| CFactory::_('Content')->get('LINE_COUNT') != CFactory::_('Utilities.Counter')->line)
{
CFactory::_('Counter')->set();
CFactory::_('Utilities.Counter')->set();
}
// get the file
$string = FileHelper::getContent($path);
// update the file
$answer = CFactory::_('Placeholder')->update($string, CFactory::_('Content')->active);
// add to zip array
$this->writeFile($path, $answer);
CFactory::_('Utilities.File')->write($path, $answer);
}
/**
@ -910,20 +899,21 @@ class Compiler extends Infusion
. CFactory::_('Config')->get('version', 3);
// for plugin event TODO change event api signatures
$component_context = CFactory::_('Config')->component_context;
$component_path = CFactory::_('Utilities.Paths')->component_path;
// Trigger Event: jcb_ce_onBeforeUpdateRepo
CFactory::_('Event')->trigger(
'jcb_ce_onBeforeUpdateRepo',
array(&$component_context, &$this->componentPath,
array(&$component_context, &$component_path,
&$repoFullPath, &$this->componentData)
);
// remove old data
$this->removeFolder($repoFullPath, CFactory::_('Component')->get('toignore'));
CFactory::_('Utilities.Folder')->remove($repoFullPath, CFactory::_('Component')->get('toignore'));
// set the new data
Folder::copy($this->componentPath, $repoFullPath, '', true);
Folder::copy(CFactory::_('Utilities.Paths')->component_path, $repoFullPath, '', true);
// Trigger Event: jcb_ce_onAfterUpdateRepo
CFactory::_('Event')->trigger(
'jcb_ce_onAfterUpdateRepo',
array(&$component_context, &$this->componentPath,
array(&$component_context, &$component_path,
&$repoFullPath, &$this->componentData)
);
@ -948,7 +938,7 @@ class Compiler extends Infusion
&$repoFullPath, &$module)
);
// remove old data
$this->removeFolder(
CFactory::_('Utilities.Folder')->remove(
$repoFullPath, CFactory::_('Component')->get('toignore')
);
// set the new data
@ -985,7 +975,7 @@ class Compiler extends Infusion
&$repoFullPath, &$plugin)
);
// remove old data
$this->removeFolder(
CFactory::_('Utilities.Folder')->remove(
$repoFullPath, CFactory::_('Component')->get('toignore')
);
// set the new data
@ -1007,22 +997,25 @@ class Compiler extends Infusion
private function zipComponent()
{
// Component Folder Name
$this->filepath['component-folder'] = $this->componentFolderName;
$this->filepath['component-folder'] = CFactory::_('Utilities.Paths')->component_folder_name;
// the name of the zip file to create
$this->filepath['component'] = $this->tempPath . '/'
. $this->filepath['component-folder'] . '.zip';
// for plugin event TODO change event api signatures
$component_context = CFactory::_('Config')->component_context;
$component_path = CFactory::_('Utilities.Paths')->component_path;
$component_sales_name = CFactory::_('Utilities.Paths')->component_sales_name;
$component_folder_name = CFactory::_('Utilities.Paths')->component_folder_name;
// Trigger Event: jcb_ce_onBeforeZipComponent
CFactory::_('Event')->trigger(
'jcb_ce_onBeforeZipComponent',
array(&$component_context, &$this->componentPath,
array(&$component_context, &$component_path,
&$this->filepath['component'], &$this->tempPath,
&$this->componentFolderName, &$this->componentData)
&$component_folder_name, &$this->componentData)
);
//create the zip file
if (FileHelper::zip(
$this->componentPath, $this->filepath['component']
CFactory::_('Utilities.Paths')->component_path, $this->filepath['component']
))
{
// now move to backup if zip was made and backup is required
@ -1039,7 +1032,7 @@ class Compiler extends Infusion
// copy the zip to backup path
File::copy(
$this->filepath['component'],
$this->backupPath . '/' . $this->componentBackupName
$this->backupPath . '/' . CFactory::_('Utilities.Paths')->component_backup_name
. '.zip'
);
}
@ -1055,12 +1048,12 @@ class Compiler extends Infusion
'jcb_ce_onBeforeMoveToServer',
array(&$component_context,
&$this->filepath['component'], &$this->tempPath,
&$this->componentSalesName, &$this->componentData)
&$component_sales_name, &$this->componentData)
);
// move to server
ComponentbuilderHelper::moveToServer(
$this->filepath['component'],
$this->componentSalesName . '.zip',
$component_sales_name . '.zip',
(int) CFactory::_('Component')->get('sales_server'),
CFactory::_('Component')->get('sales_server_protocol')
);
@ -1070,11 +1063,11 @@ class Compiler extends Infusion
CFactory::_('Event')->trigger(
'jcb_ce_onAfterZipComponent',
array(&$component_context, &$this->filepath['component'],
&$this->tempPath, &$this->componentFolderName,
&$this->tempPath, &$component_folder_name,
&$this->componentData)
);
// remove the component folder since we are done
if ($this->removeFolder($this->componentPath))
if (CFactory::_('Utilities.Folder')->remove(CFactory::_('Utilities.Paths')->component_path))
{
return true;
}
@ -1170,7 +1163,7 @@ class Compiler extends Infusion
&$module)
);
// remove the module folder since we are done
$this->removeFolder($module->folder_path);
CFactory::_('Utilities.Folder')->remove($module->folder_path);
}
}
}
@ -1264,7 +1257,7 @@ class Compiler extends Infusion
&$plugin)
);
// remove the plugin folder since we are done
$this->removeFolder($plugin->folder_path);
CFactory::_('Utilities.Folder')->remove($plugin->folder_path);
}
}
}
@ -1288,7 +1281,7 @@ class Compiler extends Infusion
$target['hashtarget'][1]
))
{
$file = $this->componentPath . '/' . $target['path'];
$file = CFactory::_('Utilities.Paths')->component_path . '/' . $target['path'];
$size = (int) $target['hashtarget'][0];
$hash = $target['hashtarget'][1];
$cut = $size - 1;

View File

@ -2681,70 +2681,38 @@ class Get
* get the module xml template
*
* @return string
*
* @deprecated 3.3
*/
public function getModuleXMLTemplate(&$module)
{
$xml = '<?xml version="1.0" encoding="utf-8"?>';
$xml .= PHP_EOL . '<extension type="module" version="'
. $this->joomlaVersions[CFactory::_('Config')->joomla_version]['xml_version'] . '" client="'
. $module->target_client . '" method="upgrade">';
$xml .= PHP_EOL . Indent::_(1) . '<name>' . $module->lang_prefix
. '</name>';
$xml .= PHP_EOL . Indent::_(1) . '<creationDate>' . Placefix::_h('BUILDDATE') . '</creationDate>';
$xml .= PHP_EOL . Indent::_(1) . '<author>' . Placefix::_h('AUTHOR') . '</author>';
$xml .= PHP_EOL . Indent::_(1) . '<authorEmail>' . Placefix::_h('AUTHOREMAIL') . '</authorEmail>';
$xml .= PHP_EOL . Indent::_(1) . '<authorUrl>' . Placefix::_h('AUTHORWEBSITE') . '</authorUrl>';
$xml .= PHP_EOL . Indent::_(1) . '<copyright>' . Placefix::_h('COPYRIGHT') . '</copyright>';
$xml .= PHP_EOL . Indent::_(1) . '<license>' . Placefix::_h('LICENSE') . '</license>';
$xml .= PHP_EOL . Indent::_(1) . '<version>' . $module->module_version
. '</version>';
$xml .= PHP_EOL . Indent::_(1) . '<description>' . $module->lang_prefix
. '_XML_DESCRIPTION</description>';
$xml .= Placefix::_h('MAINXML');
$xml .= PHP_EOL . '</extension>';
return $xml;
// set notice that we could not get a valid string from the target
$this->app->enqueueMessage(
JText::sprintf('<hr /><h3>%s Warning</h3>', __CLASS__), 'Error'
);
$this->app->enqueueMessage(
JText::sprintf(
'Use of a deprecated method (%s)!', __METHOD__
), 'Error'
);
}
/**
* get the module admin custom script field
*
* @return string
*
* @deprecated 3.3
*/
public function getModAdminVvvvvvvdm($fieldScriptBucket)
{
$form_field_class = array();
$form_field_class[] = Placefix::_h('BOM') . PHP_EOL;
$form_field_class[] = "//" . Line::_(__Line__, __Class__)
. " No direct access to this file";
$form_field_class[] = "defined('_JEXEC') or die('Restricted access');";
$form_field_class[] = PHP_EOL . "use Joomla\CMS\Form\FormField;";
$form_field_class[] = "use Joomla\CMS\Factory;";
$form_field_class[] = PHP_EOL
. "class JFormFieldModadminvvvvvvvdm extends FormField";
$form_field_class[] = "{";
$form_field_class[] = Indent::_(1)
. "protected \$type = 'modadminvvvvvvvdm';";
$form_field_class[] = PHP_EOL . Indent::_(1)
. "protected function getLabel()";
$form_field_class[] = Indent::_(1) . "{";
$form_field_class[] = Indent::_(2) . "return;";
$form_field_class[] = Indent::_(1) . "}";
$form_field_class[] = PHP_EOL . Indent::_(1)
. "protected function getInput()";
$form_field_class[] = Indent::_(1) . "{";
$form_field_class[] = Indent::_(2) . "//" . Line::_(__Line__, __Class__)
. " Get the document";
$form_field_class[] = Indent::_(2)
. "\$document = Factory::getDocument();";
$form_field_class[] = implode(PHP_EOL, $fieldScriptBucket);
$form_field_class[] = Indent::_(2) . "return; // noting for now :)";
$form_field_class[] = Indent::_(1) . "}";
$form_field_class[] = "}";
return implode(PHP_EOL, $form_field_class);
// set notice that we could not get a valid string from the target
$this->app->enqueueMessage(
JText::sprintf('<hr /><h3>%s Warning</h3>', __CLASS__), 'Error'
);
$this->app->enqueueMessage(
JText::sprintf(
'Use of a deprecated method (%s)!', __METHOD__
), 'Error'
);
}
/**
@ -2810,7 +2778,7 @@ class Get
{
$xml = '<?xml version="1.0" encoding="utf-8"?>';
$xml .= PHP_EOL . '<extension type="plugin" version="'
. $this->joomlaVersions[CFactory::_('Config')->joomla_version]['xml_version'] . '" group="'
. CFactory::_('Config')->joomla_versions[CFactory::_('Config')->joomla_version]['xml_version'] . '" group="'
. strtolower((string) $plugin->group) . '" method="upgrade">';
$xml .= PHP_EOL . Indent::_(1) . '<name>' . $plugin->lang_prefix
. '</name>';

File diff suppressed because it is too large Load Diff

View File

@ -658,7 +658,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(3) . 'readonly="true"';
$fieldSet[] = Indent::_(2) . "/>";
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// if created is not set
if (!isset($this->fieldsNames[$nameSingleCode]['created']))
@ -681,7 +681,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(3) . "filter=" . '"user_utc"';
$fieldSet[] = Indent::_(2) . "/>";
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// if created_by is not set
if (!isset($this->fieldsNames[$nameSingleCode]['created_by']))
@ -701,7 +701,7 @@ class Fields extends Structure
. '_CREATED_BY_DESC"';
$fieldSet[] = Indent::_(2) . "/>";
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// if published is not set
if (!isset($this->fieldsNames[$nameSingleCode]['published']))
@ -728,7 +728,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(4) . "JTRASHED</option>";
$fieldSet[] = Indent::_(2) . "</field>";
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// if modified is not set
if (!isset($this->fieldsNames[$nameSingleCode]['modified']))
@ -743,7 +743,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(3)
. 'size="22" readonly="true" format="%Y-%m-%d %H:%M:%S" filter="user_utc" />';
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// if modified_by is not set
if (!isset($this->fieldsNames[$nameSingleCode]['modified_by']))
@ -761,7 +761,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(3) . 'filter="unset"';
$fieldSet[] = Indent::_(2) . "/>";
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// check if view has access
if (isset($this->accessBuilder[$nameSingleCode])
@ -784,7 +784,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(3) . 'required="false"';
$fieldSet[] = Indent::_(2) . "/>";
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// if ordering is not set
if (!isset($this->fieldsNames[$nameSingleCode]['ordering']))
@ -807,7 +807,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(3) . 'required="false"';
$fieldSet[] = Indent::_(2) . "/>";
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// if version is not set
if (!isset($this->fieldsNames[$nameSingleCode]['version']))
@ -827,7 +827,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(3) . 'filter="unset"';
$fieldSet[] = Indent::_(2) . "/>";
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// check if metadata is added to this view
if (isset($this->metadataBuilder[$nameSingleCode])
@ -851,7 +851,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(3) . 'cols="30"';
$fieldSet[] = Indent::_(2) . "/>";
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// metadesc
if (!isset($this->fieldsNames[$nameSingleCode]['metadesc']))
@ -869,7 +869,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(3) . 'cols="30"';
$fieldSet[] = Indent::_(2) . "/>";
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
}
// fix the permissions field "title" issue gh-629
@ -896,7 +896,7 @@ class Fields extends Structure
. $nameSingleCode . '"';
$fieldSet[] = Indent::_(2) . "/>";
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
// setup needed field values for layout
$field_array = array();
$field_array['order_edit'] = 0;
@ -957,7 +957,7 @@ class Fields extends Structure
. '<option value="noindex, nofollow">JGLOBAL_NOINDEX_NOFOLLOW</option>';
$fieldSet[] = Indent::_(3) . '</field>';
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// author
if (!isset($this->fieldsNames[$nameSingleCode]['author']))
@ -972,7 +972,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(4) . 'size="20"';
$fieldSet[] = Indent::_(3) . "/>";
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// rights
if (!isset($this->fieldsNames[$nameSingleCode]['rights']))
@ -987,7 +987,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(4) . 'cols="30" rows="2"';
$fieldSet[] = Indent::_(3) . "/>";
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
$fieldSet[] = Indent::_(2) . "</fieldset>";
$fieldSet[] = Indent::_(1) . "</fields>";
@ -1084,7 +1084,7 @@ class Fields extends Structure
$fieldXML = $fieldSetXML->addChild('field');
ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes);
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// if created is not set
if (!isset($this->fieldsNames[$nameSingleCode]['created']))
@ -1106,7 +1106,7 @@ class Fields extends Structure
$fieldXML = $fieldSetXML->addChild('field');
ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes);
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// if created_by is not set
if (!isset($this->fieldsNames[$nameSingleCode]['created_by']))
@ -1125,7 +1125,7 @@ class Fields extends Structure
$fieldXML = $fieldSetXML->addChild('field');
ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes);
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// if published is not set
if (!isset($this->fieldsNames[$nameSingleCode]['published']))
@ -1143,7 +1143,7 @@ class Fields extends Structure
$fieldXML = $fieldSetXML->addChild('field');
ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes);
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
foreach (
array('JPUBLISHED' => 1, 'JUNPUBLISHED' => 0, 'JARCHIVED' => 2,
'JTRASHED' => -2) as $text => $value
@ -1175,7 +1175,7 @@ class Fields extends Structure
$fieldXML = $fieldSetXML->addChild('field');
ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes);
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// if modified_by is not set
if (!isset($this->fieldsNames[$nameSingleCode]['modified_by']))
@ -1196,7 +1196,7 @@ class Fields extends Structure
$fieldXML = $fieldSetXML->addChild('field');
ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes);
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// check if view has access
if (isset($this->accessBuilder[$nameSingleCode])
@ -1221,7 +1221,7 @@ class Fields extends Structure
$fieldXML = $fieldSetXML->addChild('field');
ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes);
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// if ordering is not set
if (!isset($this->fieldsNames[$nameSingleCode]['ordering']))
@ -1244,7 +1244,7 @@ class Fields extends Structure
$fieldXML = $fieldSetXML->addChild('field');
ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes);
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// if version is not set
if (!isset($this->fieldsNames[$nameSingleCode]['version']))
@ -1266,7 +1266,7 @@ class Fields extends Structure
$fieldXML = $fieldSetXML->addChild('field');
ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes);
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// check if metadata is added to this view
if (isset($this->metadataBuilder[$nameSingleCode])
@ -1294,7 +1294,7 @@ class Fields extends Structure
$fieldXML, $attributes
);
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// metadesc
if (!isset($this->fieldsNames[$nameSingleCode]['metadesc']))
@ -1311,7 +1311,7 @@ class Fields extends Structure
$fieldXML, $attributes
);
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
}
// fix the permissions field "title" issue gh-629
@ -1346,7 +1346,7 @@ class Fields extends Structure
$fieldXML = $fieldSetXML->addChild('field');
ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes);
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
// setup needed field values for layout
$field_array = array();
$field_array['order_edit'] = 0;
@ -1409,7 +1409,7 @@ class Fields extends Structure
$robots, $attributes
);
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
$options = array(
'JGLOBAL_USE_GLOBAL' => '',
'JGLOBAL_INDEX_FOLLOW' => 'index, follow',
@ -1443,7 +1443,7 @@ class Fields extends Structure
$author, $attributes
);
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
// rights
if (!isset($this->fieldsNames[$nameSingleCode]['rights']))
@ -1467,7 +1467,7 @@ class Fields extends Structure
$rights, $attributes
);
// count the static field created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
}
}
}
@ -1891,7 +1891,7 @@ class Fields extends Structure
&$optionArray, $custom = null, $taber = ''
) {
// count the dynamic fields created
CFactory::_('Counter')->field++;
CFactory::_('Utilities.Counter')->field++;
// check what type of field builder to use
if (CFactory::_('Config')->get('field_builder_type', 2) == 1)
{

View File

@ -1234,9 +1234,10 @@ class Interpretation extends Fields
}
// stop it from being added double
$addDynamicSQL = false;
CFactory::_('Component')->appendArray('version_update', $update_);
// add dynamic SQL
$this->setUpdateXMLSQL($update_, $updateXML, $addDynamicSQL);
CFactory::_('Component')->appendArray('version_update', $update_);
}
/**
@ -1249,7 +1250,7 @@ class Interpretation extends Fields
public function setUpdateXMLSQL(&$update, &$updateXML, &$addDynamicSQL)
{
// ensure version naming is correct
$update['version'] = preg_replace('/[^0-9.]+/', '', (string) $update['version']);
$update['version'] = preg_replace('/[^0-9\.]+/', '', (string) $update['version']);
// setup SQL
if (StringHelper::check($update['mysql']))
{
@ -1284,7 +1285,8 @@ class Interpretation extends Fields
$name = StringHelper::safe($update['version']);
$target = array('admin' => $name);
$this->buildDynamique($target, 'sql_update', $update['version']);
CFactory::_('Content')->set_($name . '_' . $update['version'], 'UPDATE_VERSION_MYSQL',
$_name = preg_replace('/[\.]+/', '_', (string) $update['version']);
CFactory::_('Content')->set_($name . '_' . $_name, 'UPDATE_VERSION_MYSQL',
$update['mysql']
);
}
@ -6294,7 +6296,7 @@ class Interpretation extends Fields
if (isset($folder['rename']) && 1 == $folder['rename'])
{
if ($_paths = FileHelper::getPaths(
$this->componentPath . $path
CFactory::_('Utilities.Paths')->component_path . $path
))
{
$files[$path] = $_paths;
@ -6304,7 +6306,7 @@ class Interpretation extends Fields
{
$path = $path . '/' . trim((string)$folder['folder'], '/');
if ($_paths = FileHelper::getPaths(
$this->componentPath . $path
CFactory::_('Utilities.Paths')->component_path . $path
))
{
$files[$path] = $_paths;
@ -7087,7 +7089,7 @@ class Interpretation extends Fields
public function getReplacementNames()
{
foreach ($this->newFiles as $type => $files)
foreach (CFactory::_('Utilities.Files')->toArray() as $type => $files)
{
foreach ($files as $view => $file)
{
@ -8512,7 +8514,7 @@ class Interpretation extends Fields
public function setMoveFolderScript()
{
if ($this->setMoveFolders)
if (CFactory::_('Registry')->get('set_move_folders_install_script'))
{
// reset script
$script = array();
@ -8530,7 +8532,7 @@ class Interpretation extends Fields
public function setMoveFolderMethod()
{
if ($this->setMoveFolders)
if (CFactory::_('Registry')->get('set_move_folders_install_script'))
{
// reset script
$script = array();
@ -22535,7 +22537,7 @@ class Interpretation extends Fields
$type = ComponentbuilderHelper::imageInfo($path);
if ($type)
{
$imagePath = $this->componentPath . '/admin/assets/images';
$imagePath = CFactory::_('Utilities.Paths')->component_path . '/admin/assets/images';
// move the image to its place
File::copy(
JPATH_SITE . '/' . $path,
@ -22757,7 +22759,7 @@ class Interpretation extends Fields
$this->iconBuilder
))
{
$imagePath = $this->componentPath
$imagePath = CFactory::_('Utilities.Paths')->component_path
. '/admin/assets/images/icons';
foreach ($this->iconBuilder as $icon => $path)
{
@ -27924,20 +27926,20 @@ function vdm_dkim() {
{
Folder::create($path);
// count the folder created
CFactory::_('Counter')->folder++;
CFactory::_('Utilities.Counter')->folder++;
}
// add to language files (for now we add all to both TODO)
$this->writeFile(
CFactory::_('Utilities.File')->write(
$path . $file_name,
implode(PHP_EOL, $lang)
);
$this->writeFile(
CFactory::_('Utilities.File')->write(
$path . $tag . '.' . $module->file_name
. '.sys.ini',
implode(PHP_EOL, $lang)
);
// set the line counter
CFactory::_('Counter')->line += count(
CFactory::_('Utilities.Counter')->line += count(
(array) $lang
);
unset($lang);
@ -28316,14 +28318,14 @@ function vdm_dkim() {
{
Folder::create($path);
// count the folder created
CFactory::_('Counter')->folder++;
CFactory::_('Utilities.Counter')->folder++;
}
// add to language file
$this->writeFile(
CFactory::_('Utilities.File')->write(
$path . $file_name,
implode(PHP_EOL, $lang)
);
$this->writeFile(
CFactory::_('Utilities.File')->write(
$path . $tag . '.plg_' . strtolower(
(string) $plugin->group
)
@ -28332,7 +28334,7 @@ function vdm_dkim() {
implode(PHP_EOL, $lang)
);
// set the line counter
CFactory::_('Counter')->line += count(
CFactory::_('Utilities.Counter')->line += count(
(array) $lang
);
unset($lang);

View File

@ -172,7 +172,7 @@ class Infusion extends Interpretation
CFactory::_('Content')->set('GLOBALVERSION', CFactory::_('Content')->get('VERSION'));
// set the joomla target xml version
CFactory::_('Content')->set('XMLVERSION', $this->joomlaVersions[CFactory::_('Config')->joomla_version]['xml_version']);
CFactory::_('Content')->set('XMLVERSION', CFactory::_('Config')->joomla_versions[CFactory::_('Config')->joomla_version]['xml_version']);
// Component_name
$name = CFactory::_('Component')->get('name');
@ -2095,7 +2095,7 @@ class Infusion extends Interpretation
// remove old unused language strings
$this->purgeLanuageStrings($values, CFactory::_('Config')->component_id);
// path to INI file
$getPAth = $this->templatePath . '/en-GB.com_admin.ini';
$getPAth = CFactory::_('Utilities.Paths')->template_path . '/en-GB.com_admin.ini';
// for plugin event TODO change event api signatures
$component_context = CFactory::_('Config')->component_context;
// Trigger Event: jcb_ce_onBeforeBuildAllLangFiles
@ -2143,18 +2143,18 @@ class Infusion extends Interpretation
))
{
// build the path to place the lang file
$path = $this->componentPath . '/' . $p . '/language/'
$path = CFactory::_('Utilities.Paths')->component_path . '/' . $p . '/language/'
. $tag . '/';
if (!Folder::exists($path))
{
Folder::create($path);
// count the folder created
CFactory::_('Counter')->folder++;
CFactory::_('Utilities.Counter')->folder++;
}
// move the file to its place
File::copy($getPAth, $path . $file_name);
// count the file created
CFactory::_('Counter')->file++;
CFactory::_('Utilities.Counter')->file++;
// add content to it
$lang = array_map(
fn($langstring, $placeholder) => $placeholder . '="' . $langstring . '"',
@ -2162,11 +2162,11 @@ class Infusion extends Interpretation
array_keys($languageStrings)
);
// add to language file
$this->writeFile(
CFactory::_('Utilities.File')->write(
$path . $file_name, implode(PHP_EOL, $lang)
);
// set the line counter
CFactory::_('Counter')->line += count(
CFactory::_('Utilities.Counter')->line += count(
(array) $lang
);
unset($lang);
@ -2199,7 +2199,7 @@ class Infusion extends Interpretation
= implode(PHP_EOL . Indent::_(2), $langXML['site']);
}
// build xml path
$xmlPath = $this->componentPath . '/' . CFactory::_('Config')->component_code_name
$xmlPath = CFactory::_('Utilities.Paths')->component_path . '/' . CFactory::_('Config')->component_code_name
. '.xml';
// get the content in xml
$componentXML = FileHelper::getContent(
@ -2208,7 +2208,7 @@ class Infusion extends Interpretation
// update the xml content
$componentXML = CFactory::_('Placeholder')->update($componentXML, $replace);
// store the values back to xml
$this->writeFile($xmlPath, $componentXML);
CFactory::_('Utilities.File')->write($xmlPath, $componentXML);
}
}
}

View File

@ -1318,6 +1318,7 @@ COM_COMPONENTBUILDER_AUTHOR_NAME="Author Name"
COM_COMPONENTBUILDER_AUTHOR_WEBSITE="Author Website"
COM_COMPONENTBUILDER_AUTO_CHECKIN="Auto Check-in"
COM_COMPONENTBUILDER_AVAILABLE_LIBRARIES="Available Libraries"
COM_COMPONENTBUILDER_A_METHOD_SETDYNAMICFZEROLDTHREERS_WAS_ADDED_TO_THE_INSTALL_BSCRIPTPHPB_OF_THIS_PACKAGE_TO_INSURE_THAT_THE_FOLDERS_ARE_COPIED_INTO_THE_CORRECT_PLACE_WHEN_THIS_COMPONENT_IS_INSTALLED="A method (setDynamicF0ld3rs) was added to the install <b>script.php</b> of this package to insure that the folder(s) are copied into the correct place when this component is installed!"
COM_COMPONENTBUILDER_A_S_SPAN_CLASSICONFLAG_SPANREPORT_BROKEN_PACKAGEA="<a %s ><span class="icon-flag"> </span>Report Broken Package</a>"
COM_COMPONENTBUILDER_BACK="Back"
COM_COMPONENTBUILDER_BACKUP="Backup"
@ -1651,6 +1652,7 @@ COM_COMPONENTBUILDER_CLASS_PROPERTY_VERSION_DESC="A count of the number of times
COM_COMPONENTBUILDER_CLASS_PROPERTY_VERSION_LABEL="Version"
COM_COMPONENTBUILDER_CLASS_PROPERTY_VISIBILITY_DESCRIPTION="The visibility of a function/method or property can be defined by prefixing the declaration with the keywords public, protected or private. You also have the option to make function/method or property static."
COM_COMPONENTBUILDER_CLASS_PROPERTY_VISIBILITY_LABEL="Visibility"
COM_COMPONENTBUILDER_CLEAR="Clear"
COM_COMPONENTBUILDER_CLEAR_TMP="Clear tmp"
COM_COMPONENTBUILDER_CLONE="Clone"
COM_COMPONENTBUILDER_CLONE_FAILED="Clone failed!"
@ -5602,6 +5604,7 @@ COM_COMPONENTBUILDER_HIDE_ONLY="Hide Only"
COM_COMPONENTBUILDER_HIDE_TOGGLE="Hide Toggle"
COM_COMPONENTBUILDER_HOW_TO_GET_A_S_FREE_KEYSA_FROM_VDM="How to get <a %s >free keys</a> from VDM."
COM_COMPONENTBUILDER_HR_HTHREECUSTOM_CODES_WARNINGHTHREE="<hr /><h3>Custom Codes Warning</h3>"
COM_COMPONENTBUILDER_HR_HTHREEDYNAMIC_FOLDERS_WERE_DETECTEDHTHREE="<hr /><h3>Dynamic folder(s) were detected.</h3>"
COM_COMPONENTBUILDER_HR_HTHREEEXTERNAL_CODE_ERRORHTHREE="<hr /><h3>External Code Error</h3>"
COM_COMPONENTBUILDER_HR_HTHREEEXTERNAL_CODE_NOTICEHTHREE="<hr /><h3>External Code Notice</h3>"
COM_COMPONENTBUILDER_HR_HTHREEEXTERNAL_CODE_WARNINGHTHREE="<hr /><h3>External Code Warning</h3>"

File diff suppressed because one or more lines are too long

View File

@ -137,7 +137,8 @@ class ComponentbuilderViewSearch extends HtmlView
// set the mode options
$options = [
1 => 'COM_COMPONENTBUILDER_SEARCH',
2 => 'COM_COMPONENTBUILDER_REPLACE'];
2 => 'COM_COMPONENTBUILDER_REPLACE',
0 => 'COM_COMPONENTBUILDER_CLEAR'];
// add to form
$xml = ComponentbuilderHelper::getFieldXML($attributes, $options);
if ($xml instanceof SimpleXMLElement)

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="4" method="upgrade">
<name>COM_COMPONENTBUILDER</name>
<creationDate>22nd January, 2023</creationDate>
<creationDate>29th January, 2023</creationDate>
<author>Llewellyn van der Merwe</author>
<authorEmail>joomla@vdm.io</authorEmail>
<authorUrl>https://dev.vdm.io</authorUrl>

View File

@ -83,7 +83,7 @@ abstract class AbstractGiteaObject
if ($this->options->get('access.token', false))
{
// Use oAuth authentication
$headers = $this->client->getOption('headers', array());
$headers = $this->client->getOption('headers', []);
if (!isset($headers['Authorization']))
{

View File

@ -70,7 +70,7 @@ class Wiki extends AbstractPackage
$path = '/markdown';
// Get headers
$headers = $this->client->getOption('headers', array());
$headers = $this->client->getOption('headers', []);
$headers['accept'] = 'text/html';
$headers['Content-Type'] = 'application/json';

View File

@ -0,0 +1,122 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Componentbuilder\Abstraction;
use VDM\Joomla\Componentbuilder\Interfaces\Mappersingleinterface;
/**
* Compiler Mapper Single
*
* @since 3.2.0
*/
abstract class MapperSingle implements Mappersingleinterface
{
/**
* The Content
*
* @var array
* @since 3.2.0
**/
public array $active = [];
/**
* Set content
*
* @param string $key The main string key
* @param mixed $value The values to set
*
* @return void
* @since 3.2.0
*/
public function set(string $key, $value)
{
$this->active[$this->key($key)] = $value;
}
/**
* Get content
*
* @param string $key The main string key
*
* @return mixed
* @since 3.2.0
*/
public function get(string $key)
{
return $this->active[$this->key($key)] ?? null;
}
/**
* Does key exist
*
* @param string $key The main string key
*
* @return bool
* @since 3.2.0
*/
public function exist(string $key): bool
{
if (isset($this->active[$this->key($key)]))
{
return true;
}
return false;
}
/**
* Add content
*
* @param string $key The main string key
* @param mixed $value The values to set
*
* @return void
* @since 3.2.0
*/
public function add(string $key, $value)
{
if (isset($this->active[$this->key($key)]))
{
$this->active[$this->key($key)] .= $value;
}
else
{
$this->active[$this->key($key)] = $value;
}
}
/**
* Remove content
*
* @param string $key The main string key
*
* @return void
* @since 3.2.0
*/
public function remove(string $key)
{
unset($this->active[$this->key($key)]);
}
/**
* Model the key
*
* @param string $key The key to model
*
* @return string
* @since 3.2.0
*/
abstract protected function key(string $key): string;
}

View File

@ -86,6 +86,22 @@ class Data
*/
protected Dispenser $dispenser;
/**
* Compiler Customcode
*
* @var Customcode
* @since 3.2.0
*/
protected Customcode $customcode;
/**
* Compiler Customcode in Gui
*
* @var Gui
* @since 3.2.0
**/
protected Gui $gui;
/**
* Compiler Field
*
@ -223,8 +239,7 @@ class Data
?Filesfolders $filesFolders = null, ?Historycomponent $history = null, ?Whmcs $whmcs = null,
?Sqltweaking $sqltweaking = null, ?Adminviews $adminviews = null, ?Siteviews $siteviews = null,
?Customadminviews $customadminviews = null, ?Joomlamodules $modules = null,
?Joomlaplugins $plugins = null,
?\JDatabaseDriver $db = null)
?Joomlaplugins $plugins = null, ?\JDatabaseDriver $db = null)
{
$this->config = $config ?: Compiler::_('Config');
$this->event = $event ?: Compiler::_('Event');
@ -709,16 +724,11 @@ class Data
unset($component->bom);
// README
if ($component->addreadme)
{
$component->readme = $this->customcode->update(
base64_decode((string) $component->readme)
);
}
else
{
$component->readme = '';
}
$component->readme =
$component->addreadme ?
$this->customcode->update(
base64_decode((string) $component->readme)
) : '';
// set lang now
$nowLang = $this->config->lang_target;

View File

@ -88,7 +88,7 @@ class Placeholder implements PlaceholderInterface
// load the db
$db = $this->db;
// reset bucket
$bucket = array();
$bucket = [];
// Create a new query object.
$query = $db->getQuery(true);
$query->select($db->quoteName(array('a.target', 'a.value')));

View File

@ -475,6 +475,21 @@ class Config extends BaseConfig
return $this->compiler_path . '/default.txt';
}
/**
* get custom folder path
*
* @return string The custom folder path
* @since 3.2.0
*/
protected function getCustomfolderpath(): string
{
// get the custom folder path
return $this->params->get(
'custom_folder_path',
JPATH_COMPONENT_ADMINISTRATOR . '/custom'
);
}
/**
* get switch to add assets table fix
*

View File

@ -193,7 +193,7 @@ class Customcode implements CustomcodeInterface
var_dump($string);
}
// the ids found in this content
$bucket = array();
$bucket = [];
$found = GetHelper::allBetween(
$string, '[CUSTO' . 'MCODE=', ']'
);
@ -268,7 +268,7 @@ class Customcode implements CustomcodeInterface
{
if (!isset($this->data[$id]['args']))
{
$this->data[$id]['args'] = array();
$this->data[$id]['args'] = [];
}
// only load if not already loaded
if (!isset($this->data[$id]['args'][$key]))
@ -289,7 +289,7 @@ class Customcode implements CustomcodeInterface
))
{
$this->data[$id]['args'][$key]
= array();
= [];
// update the function values with the custom code key placeholders (this allow the use of [] + and , in the values)
$this->data[$id]['args'][$key][]
= $this->placeholder->update(
@ -415,7 +415,7 @@ class Customcode implements CustomcodeInterface
$this->db->quoteName('a.from_line') . ' ASC'
); // <--- insure we always add code from top of file
// reset custom code
$this->active = array();
$this->active = [];
}
$query->where($this->db->quoteName('a.published') . ' >= 1');
$this->db->setQuery($query);
@ -502,7 +502,7 @@ class Customcode implements CustomcodeInterface
*/
protected function insert(array $ids, string $string, int $debug = 0): string
{
$code = array();
$code = [];
// load the code
foreach ($ids as $id)
{

View File

@ -117,7 +117,7 @@ class Dispenser implements DispenserInterface
* @since 3.2.0
*/
public function set(&$script, string $first, ?string $second = null, ?string $third = null,
array $config = array(), bool $base64 = true, bool $dynamic = true, bool $add = false): bool
array $config = [], bool $base64 = true, bool $dynamic = true, bool $add = false): bool
{
// only load if we have a string
if (!StringHelper::check($script))
@ -132,7 +132,7 @@ class Dispenser implements DispenserInterface
// check if the script first key is set
if ($second && !isset($this->hub[$first]))
{
$this->hub[$first] = array();
$this->hub[$first] = [];
}
elseif ($add && !$second
&& !isset($this->hub[$first]))
@ -143,7 +143,7 @@ class Dispenser implements DispenserInterface
if ($second && $third
&& !isset($this->hub[$first][$second]))
{
$this->hub[$first][$second] = array();
$this->hub[$first][$second] = [];
}
elseif ($add && $second && !$third
&& !isset($this->hub[$first][$second]))

View File

@ -122,7 +122,7 @@ class External implements ExternalInterface
var_dump($string);
}
// target content
$bucket = array();
$bucket = [];
$found = GetHelper::allBetween(
$string, '[EXTERNA' . 'LCODE=', ']'
);
@ -342,17 +342,9 @@ class External implements ExternalInterface
);
}
}
// add to local bucket
if (isset($this->code[$target_key]))
{
// update the placeholder with the external code string
$bucket[$key] = $this->code[$target_key];
}
else
{
// remove the placeholder
$bucket[$key] = '';
}
$bucket[$key] = $this->code[$target_key] ?? '';
}
/**

View File

@ -328,15 +328,7 @@ class Extractor implements ExtractorInterface
// make sure we have the path correct (the script file is not in admin path for example)
// there may be more... will nead to keep our eye on this... since files could be moved during install
$file = str_replace('./', '', (string) $file); # TODO (windows path issues)
if ($file !== 'script.php')
{
$path = $target . '/' . $file;
}
else
{
$path = $file;
}
$path = $file !== 'script.php' ? $target . '/' . $file : $file;
// now we go line by line
foreach (new \SplFileObject($file) as $lineNumber => $lineContent)

View File

@ -130,7 +130,7 @@ class Paths
protected function load()
{
// set the local paths to search
$local_paths = array();
$local_paths = [];
// admin path
$local_paths['admin'] = JPATH_ADMINISTRATOR . '/components/com_'
@ -213,15 +213,8 @@ class Paths
{
$joomla_modules = array_filter(
array_values($addjoomla_modules),
function ($array) {
// only load the modules whose target association call for it
if (!isset($array['target']) || $array['target'] != 2)
{
return true;
}
return false;
}
// only load the modules whose target association call for it
fn($array): bool => !isset($array['target']) || $array['target'] != 2
);
// if we have values we return IDs
if (ArrayHelper::check($joomla_modules))

View File

@ -183,7 +183,7 @@ class Gui implements GuiInterface
// get file content
$file_conent = FileHelper::getContent($file);
$guiCode = array();
$guiCode = [];
// we add a new search for the GUI CODE Blocks
$guiCode[] = GetHelper::allBetween(
$file_conent, '/***[JCB' . 'GUI<>', '/***[/JCBGUI' . '$$$$]***/'

View File

@ -62,7 +62,7 @@ class Hash
$values = GetHelper::allBetween(
$script, 'HASH' . 'STRING((((', '))))'
);
$locker = array();
$locker = [];
// convert them
foreach ($values as $value)
{
@ -80,7 +80,7 @@ class Hash
$values = GetHelper::allBetween(
$script, 'HASH' . 'FILE((((', '))))'
);
$locker = array();
$locker = [];
// convert them
foreach ($values as $path)
{

View File

@ -62,7 +62,7 @@ class LockBase implements LockBaseInterface
$values = GetHelper::allBetween(
$script, 'LOCK'.'BASE64((((', '))))'
);
$locker = array();
$locker = [];
// convert them
foreach ($values as $value)
{

View File

@ -294,15 +294,7 @@ class Data
$main_get = $this->dynamic->get(
array($item->main_get), $item->code, $item->context
);
if (ArrayHelper::check($main_get))
{
$item->main_get = $main_get[0];
}
else
{
$item->main_get = null;
}
$item->main_get = ArrayHelper::check($main_get) ? $main_get[0] : null;
// set the custom_get data
$item->custom_get = (isset($item->custom_get)

View File

@ -34,6 +34,7 @@ use VDM\Joomla\Componentbuilder\Compiler\Service\Extension;
use VDM\Joomla\Componentbuilder\Compiler\Service\Field;
use VDM\Joomla\Componentbuilder\Compiler\Service\Joomlamodule;
use VDM\Joomla\Componentbuilder\Compiler\Service\Joomlaplugin;
use VDM\Joomla\Componentbuilder\Compiler\Service\Utilities;
use VDM\Joomla\Componentbuilder\Interfaces\FactoryInterface;
@ -136,7 +137,8 @@ abstract class Factory implements FactoryInterface
->registerServiceProvider(new Extension())
->registerServiceProvider(new Field())
->registerServiceProvider(new Joomlamodule())
->registerServiceProvider(new Joomlaplugin());
->registerServiceProvider(new Joomlaplugin())
->registerServiceProvider(new Utilities());
}
}

View File

@ -38,7 +38,7 @@ interface DispenserInterface
* @since 3.2.0
*/
public function set(&$script, string $first, ?string $second = null, ?string $third = null,
array $config = array(), bool $base64 = true, bool $dynamic = true, bool $add = false): bool;
array $config = [], bool $base64 = true, bool $dynamic = true, bool $add = false): bool;
/**
* Get the script from the customcode dispenser

View File

@ -170,7 +170,7 @@ class History implements HistoryInterface
}
else
{
$version_note = array('component' => array());
$version_note = array('component' => []);
}
// set watch
switch ($action)

View File

@ -0,0 +1,883 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Componentbuilder\Compiler\Joomlamodule;
use VDM\Joomla\Componentbuilder\Compiler\Factory as Compiler;
use VDM\Joomla\Componentbuilder\Compiler\Joomlamodule\Data as Module;
use VDM\Joomla\Componentbuilder\Compiler\Component;
use VDM\Joomla\Componentbuilder\Compiler\Config;
use VDM\Joomla\Componentbuilder\Compiler\Registry;
use VDM\Joomla\Componentbuilder\Compiler\Customcode\Dispenser;
use VDM\Joomla\Componentbuilder\Compiler\Interfaces\EventInterface;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Counter;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Folder;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\File;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Files;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Indent;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Placefix;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Line;
use VDM\Joomla\Utilities\ArrayHelper;
use VDM\Joomla\Utilities\ObjectHelper;
use VDM\Joomla\Utilities\StringHelper;
use VDM\Joomla\Utilities\FileHelper;
/**
* Joomla Module Builder Class
*
* @since 3.2.0
*/
class Builder
{
/**
* Compiler Joomla Module Data Class
*
* @var Module
* @since 3.2.0
*/
protected Module $module;
/**
* Compiler Component
*
* @var Component
* @since 3.2.0
**/
protected Component $component;
/**
* Compiler Config
*
* @var Config
* @since 3.2.0
*/
protected Config $config;
/**
* The compiler registry
*
* @var Registry
* @since 3.2.0
*/
protected Registry $registry;
/**
* Compiler Customcode Dispenser
*
* @var Dispenser
* @since 3.2.0
*/
protected Dispenser $dispenser;
/**
* Compiler Event
*
* @var EventInterface
* @since 3.2.0
*/
protected EventInterface $event;
/**
* Compiler Counter
*
* @var Counter
* @since 3.2.0
*/
protected Counter $counter;
/**
* Compiler Utilities Folder
*
* @var Folder
* @since 3.2.0
*/
protected Folder $folder;
/**
* Compiler Utilities File
*
* @var File
* @since 3.2.0
*/
protected File $file;
/**
* Compiler Utilities Files
*
* @var Files
* @since 3.2.0
*/
protected Files $files;
/**
* Constructor
*
* @param Module|null $module The compiler Joomla module data object.
* @param Component|null $component The component class.
* @param Config|null $config The compiler config object.
* @param Registry|null $registry The compiler registry object.
* @param Dispenser|null $dispenser The compiler customcode dispenser object.
* @param EventInterface|null $event The compiler event api object.
* @param Counter|null $counter The compiler counter object.
* @param Folder|null $folder The compiler folder object.
* @param File|null $file The compiler file object.
* @param Files|null $files The compiler files object.
*
* @since 3.2.0
*/
public function __construct(?Module $module = null, ?Component $component = null,
?Config $config = null, ?Registry $registry = null,
?Dispenser $dispenser = null, ?EventInterface $event = null,
?Counter $counter = null, ?Folder $folder = null,
?File $file = null, ?Files $files = null)
{
$this->module = $module ?: Compiler::_('Joomlamodule.Data');
$this->component = $component ?: Compiler::_('Component');
$this->config = $config ?: Compiler::_('Config');
$this->registry = $registry ?: Compiler::_('Registry');
$this->dispenser = $dispenser ?: Compiler::_('Customcode.Dispenser');
$this->event = $event ?: Compiler::_('Event');
$this->counter = $counter ?? Compiler::_('Utilities.Counter');
$this->folder = $folder ?? Compiler::_('Utilities.Folder');
$this->file = $file ?? Compiler::_('Utilities.File');
$this->files = $files ?? Compiler::_('Utilities.Files');
}
/**
* Build the Modules files, folders, url's and config
*
* @return void
* @since 3.2.0
*/
public function run()
{
if ($this->module->exists())
{
// for plugin event TODO change event api signatures
$component_context = $this->config->component_context;
$modules = $this->module->get();
// Trigger Event: jcb_ce_onBeforeSetModules
$this->event->trigger(
'jcb_ce_onBeforeBuildModules',
array(&$component_context, &$modules)
);
foreach ($modules as $module)
{
if (ObjectHelper::check($module)
&& isset($module->folder_name)
&& StringHelper::check(
$module->folder_name
))
{
// module path
$module->folder_path = $this->config->get('compiler_path', JPATH_COMPONENT_ADMINISTRATOR . '/compiler') . '/'
. $module->folder_name;
// set the module paths
$this->registry->set('dynamic_paths.' . $module->key, $module->folder_path);
// make sure there is no old build
$this->folder->remove($module->folder_path);
// creat the main module folder
$this->folder->create($module->folder_path);
// set main mod file
$fileDetails = array('path' => $module->folder_path . '/'
. $module->file_name . '.php',
'name' => $module->file_name . '.php',
'zip' => $module->file_name . '.php');
$this->file->write(
$fileDetails['path'],
'<?php' . PHP_EOL . '// main modfile' .
PHP_EOL . Placefix::_h('BOM') . PHP_EOL .
PHP_EOL . '// No direct access to this file' . PHP_EOL .
"defined('_JEXEC') or die('Restricted access');"
. PHP_EOL .
Placefix::_h('MODCODE')
);
$this->files->appendArray($module->key, $fileDetails);
// count the file created
$this->counter->file++;
// set custom_get
if ($module->custom_get)
{
$fileDetails = array(
'path' => $module->folder_path . '/data.php',
'name' => 'data.php',
'zip' => 'data.php'
);
$this->file->write(
$fileDetails['path'],
'<?php' . PHP_EOL . '// get data file' .
PHP_EOL . Placefix::_h('BOM') . PHP_EOL
.
PHP_EOL . '// No direct access to this file'
. PHP_EOL .
"defined('_JEXEC') or die('Restricted access');"
. PHP_EOL . PHP_EOL .
'/**' . PHP_EOL .
' * Module ' . $module->official_name . ' Data'
. PHP_EOL .
' */' . PHP_EOL .
"class " . $module->class_data_name
. ' extends \JObject' . PHP_EOL .
"{" . Placefix::_h('DYNAMICGETS') . "}"
. PHP_EOL
);
$this->files->appendArray($module->key, $fileDetails);
// count the file created
$this->counter->file++;
}
// set helper file
if ($module->add_class_helper >= 1)
{
$fileDetails = array('path' => $module->folder_path
. '/helper.php',
'name' => 'helper.php',
'zip' => 'helper.php');
$this->file->write(
$fileDetails['path'],
'<?php' . PHP_EOL . '// helper file' .
PHP_EOL . Placefix::_h('BOM') . PHP_EOL
.
PHP_EOL . '// No direct access to this file'
. PHP_EOL .
"defined('_JEXEC') or die('Restricted access');"
. PHP_EOL .
Placefix::_h('HELPERCODE')
);
$this->files->appendArray($module->key, $fileDetails);
// count the file created
$this->counter->file++;
}
// set main xml file
$fileDetails = array('path' => $module->folder_path . '/'
. $module->file_name . '.xml',
'name' => $module->file_name . '.xml',
'zip' => $module->file_name . '.xml');
$this->file->write(
$fileDetails['path'],
$this->getXML($module)
);
$this->files->appendArray($module->key, $fileDetails);
// count the file created
$this->counter->file++;
// set tmpl folder
$this->folder->create($module->folder_path . '/tmpl');
// set default file
$fileDetails = array('path' => $module->folder_path
. '/tmpl/default.php',
'name' => 'default.php',
'zip' => 'tmpl/default.php');
$this->file->write(
$fileDetails['path'],
'<?php' . PHP_EOL . '// default tmpl' .
PHP_EOL . Placefix::_h('BOM') . PHP_EOL .
PHP_EOL . '// No direct access to this file' . PHP_EOL .
"defined('_JEXEC') or die('Restricted access');"
. PHP_EOL .
Placefix::_h('MODDEFAULT')
);
$this->files->appendArray($module->key, $fileDetails);
// count the file created
$this->counter->file++;
// set install script if needed
if ($module->add_install_script)
{
$fileDetails = array('path' => $module->folder_path
. '/script.php',
'name' => 'script.php',
'zip' => 'script.php');
$this->file->write(
$fileDetails['path'],
'<?php' . PHP_EOL . '// Script template' .
PHP_EOL . Placefix::_h('BOM') . PHP_EOL
.
PHP_EOL . '// No direct access to this file'
. PHP_EOL .
"defined('_JEXEC') or die('Restricted access');"
. PHP_EOL .
Placefix::_h('INSTALLCLASS')
);
$this->files->appendArray($module->key, $fileDetails);
// count the file created
$this->counter->file++;
}
// set readme if found
if ($module->addreadme)
{
$fileDetails = array('path' => $module->folder_path
. '/README.md',
'name' => 'README.md',
'zip' => 'README.md');
$this->file->write($fileDetails['path'], $module->readme);
$this->files->appendArray($module->key, $fileDetails);
// count the file created
$this->counter->file++;
}
// set the folders target path
$target_path = '';
if ($module->target_client === 'administrator')
{
$target_path = '/administrator';
}
// check if we have custom fields needed for scripts
$module->add_scripts_field = false;
$field_script_bucket = [];
// add any css from the fields
if (($css = $this->dispenser->get(
'css_view', $module->key
)) !== null
&& StringHelper::check($css))
{
// make sure this script does not have PHP
if (strpos((string) $css, '<?php') === false)
{
// make sure the field is added
$module->add_scripts_field = true;
// create the css folder
$this->folder->create($module->folder_path . '/css');
// add the CSS file
$fileDetails = array('path' => $module->folder_path
. '/css/mod_admin.css',
'name' => 'mod_admin.css',
'zip' => 'mod_admin.css');
$this->file->write(
$fileDetails['path'],
Placefix::_h('BOM') . PHP_EOL
. PHP_EOL . $css
);
$this->files->appendArray($module->key, $fileDetails);
// count the file created
$this->counter->file++;
// add the field script
$field_script_bucket[] = Indent::_(2) . "//"
. Line::_(__Line__, __Class__) . " Custom CSS";
$field_script_bucket[] = Indent::_(2)
. "\$document->addStyleSheet('" . $target_path
. "/modules/" . $module->folder_name
. "/css/mod_admin.css', ['version' => 'auto', 'relative' => true]);";
}
}
// add any JavaScript from the fields
if (($javascript = $this->dispenser->get(
'view_footer', $module->key
)) !== null
&& StringHelper::check($javascript))
{
// make sure this script does not have PHP
if (strpos((string) $javascript, '<?php') === false)
{
// make sure the field is added
$module->add_scripts_field = true;
// add the JavaScript file
$this->folder->create($module->folder_path . '/js');
// add the CSS file
$fileDetails = array('path' => $module->folder_path
. '/js/mod_admin.js',
'name' => 'mod_admin.js',
'zip' => 'mod_admin.js');
$this->file->write(
$fileDetails['path'],
Placefix::_h('BOM') . PHP_EOL
. PHP_EOL . $javascript
);
$this->files->appendArray($module->key, $fileDetails);
// count the file created
$this->counter->file++;
// add the field script
$field_script_bucket[] = Indent::_(2) . "//"
. Line::_(__Line__, __Class__) . " Custom JS";
$field_script_bucket[] = Indent::_(2)
. "\$document->addScript('" . $target_path
. "/modules/" . $module->folder_name
. "/js/mod_admin.js', ['version' => 'auto', 'relative' => true]);";
}
}
// set fields folders if needed
if ($module->add_scripts_field
|| (isset($module->fields_rules_paths)
&& $module->fields_rules_paths == 2))
{
// create fields folder
$this->folder->create($module->folder_path . '/fields');
// add the custom script field
if ($module->add_scripts_field)
{
$fileDetails = [
'path' => $module->folder_path
. '/fields/modadminvvvvvvvdm.php',
'name' => 'modadminvvvvvvvdm.php',
'zip' => 'modadminvvvvvvvdm.php'
];
$this->file->write(
$fileDetails['path'],
$this->getCustomScriptField(
$field_script_bucket
)
);
$this->files->appendArray($module->key, $fileDetails);
// count the file created
$this->counter->file++;
}
}
// set rules folders if needed
if (isset($module->fields_rules_paths)
&& $module->fields_rules_paths == 2)
{
// create rules folder
$this->folder->create($module->folder_path . '/rules');
}
// set forms folder if needed
if (isset($module->form_files)
&& ArrayHelper::check(
$module->form_files
))
{
// create forms folder
$this->folder->create($module->folder_path . '/forms');
// set the template files
foreach ($module->form_files as $file => $fields)
{
// set file details
$fileDetails = array('path' => $module->folder_path
. '/forms/' . $file . '.xml',
'name' => $file . '.xml',
'zip' => 'forms/' . $file
. '.xml');
// build basic XML
$xml = '<?xml version="1.0" encoding="utf-8"?>';
$xml .= PHP_EOL . '<!--' . Line::_(__Line__, __Class__)
. ' default paths of ' . $file
. ' form points to ' . $this->config->component_code_name
. ' -->';
// search if we must add the component path
$add_component_path = false;
foreach ($fields as $field_name => $fieldsets)
{
if (!$add_component_path)
{
foreach ($fieldsets as $fieldset => $field)
{
if (!$add_component_path
&& isset(
$module->fieldsets_paths[$file
. $field_name . $fieldset]
)
&& $module->fieldsets_paths[$file
. $field_name . $fieldset] == 1)
{
$add_component_path = true;
}
}
}
}
// only add if part of the component field types path is required
if ($add_component_path)
{
$xml .= PHP_EOL . '<form';
$xml .= PHP_EOL . Indent::_(1)
. 'addrulepath="/administrator/components/com_'
. $this->config->component_code_name
. '/models/rules"';
$xml .= PHP_EOL . Indent::_(1)
. 'addfieldpath="/administrator/components/com_'
. $this->config->component_code_name
. '/models/fields"';
$xml .= PHP_EOL . '>';
}
else
{
$xml .= PHP_EOL . '<form>';
}
// add the fields
foreach ($fields as $field_name => $fieldsets)
{
// check if we have an double fields naming set
$field_name_inner = '';
$field_name_outer = $field_name;
if (strpos((string) $field_name, '.') !== false)
{
$field_names = explode('.', (string) $field_name);
if (count((array) $field_names) == 2)
{
$field_name_outer = $field_names[0];
$field_name_inner = $field_names[1];
}
}
$xml .= PHP_EOL . Indent::_(1)
. '<fields name="' . $field_name_outer
. '">';
foreach ($fieldsets as $fieldset => $field)
{
// default to the field set name
$label = $fieldset;
if (isset($module->fieldsets_label[$file . $field_name . $fieldset]))
{
$label = $module->fieldsets_label[$file . $field_name . $fieldset];
}
// add path to module rules and custom fields
if (isset($module->fieldsets_paths[$file . $field_name . $fieldset])
&& ($module->fieldsets_paths[$file . $field_name . $fieldset] == 2
|| $module->fieldsets_paths[$file . $field_name . $fieldset] == 3))
{
if ($module->target == 2)
{
if (!isset($module->add_rule_path[$file . $field_name . $fieldset]))
{
$module->add_rule_path[$file . $field_name . $fieldset] =
'/administrator/modules/'
. $module->file_name . '/rules';
}
if (!isset($module->add_field_path[$file . $field_name . $fieldset]))
{
$module->add_field_path[$file . $field_name . $fieldset] =
'/administrator/modules/'
. $module->file_name . '/fields';
}
}
else
{
if (!isset($module->add_rule_path[$file . $field_name . $fieldset]))
{
$module->add_rule_path[$file . $field_name . $fieldset] =
'/modules/' . $module->file_name
. '/rules';
}
if (!isset($module->add_field_path[$file . $field_name . $fieldset]))
{
$module->add_field_path[$file . $field_name . $fieldset] =
'/modules/' . $module->file_name
. '/fields';
}
}
}
// add path to module rules and custom fields
if (isset($module->add_rule_path[$file . $field_name . $fieldset])
|| isset($module->add_field_path[$file . $field_name . $fieldset]))
{
$xml .= PHP_EOL . Indent::_(1) . '<!--'
. Line::_(__Line__, __Class__) . ' default paths of '
. $fieldset . ' fieldset points to the module -->';
$xml .= PHP_EOL . Indent::_(1) . '<fieldset name="'
. $fieldset . '" label="' . $label . '"';
if (isset($module->add_rule_path[$file . $field_name . $fieldset]))
{
$xml .= PHP_EOL . Indent::_(2)
. 'addrulepath="' . $module->add_rule_path[$file . $field_name . $fieldset] . '"';
}
if (isset($module->add_field_path[$file . $field_name . $fieldset]))
{
$xml .= PHP_EOL . Indent::_(2)
. 'addfieldpath="' . $module->add_field_path[$file . $field_name . $fieldset] . '"';
}
$xml .= PHP_EOL . Indent::_(1) . '>';
}
else
{
$xml .= PHP_EOL . Indent::_(1) . '<fieldset name="'
. $fieldset . '" label="' . $label . '">';
}
// check if we have an inner field set
if (StringHelper::check(
$field_name_inner
))
{
$xml .= PHP_EOL . Indent::_(1)
. '<fields name="'
. $field_name_inner . '">';
}
// add the placeholder of the fields
$xml .= Placefix::_h('FIELDSET_' . $file
. $field_name . $fieldset );
// check if we have an inner field set
if (StringHelper::check(
$field_name_inner
))
{
$xml .= PHP_EOL . Indent::_(1)
. '</fields>';
}
$xml .= PHP_EOL . Indent::_(1)
. '</fieldset>';
}
$xml .= PHP_EOL . Indent::_(1) . '</fields>';
}
$xml .= PHP_EOL . '</form>';
// add xml to file
$this->file->write($fileDetails['path'], $xml);
$this->files->appendArray($module->key, $fileDetails);
// count the file created
$this->counter->file++;
}
}
// set SQL stuff if needed
if ($module->add_sql || $module->add_sql_uninstall)
{
// create SQL folder
$this->folder->create($module->folder_path . '/sql');
// create mysql folder
$this->folder->create(
$module->folder_path . '/sql/mysql'
);
// now set the install file
if ($module->add_sql)
{
$this->file->write(
$module->folder_path . '/sql/mysql/install.sql',
$module->sql
);
// count the file created
$this->counter->file++;
}
// now set the uninstall file
if ($module->add_sql_uninstall)
{
$this->file->write(
$module->folder_path
. '/sql/mysql/uninstall.sql',
$module->sql_uninstall
);
// count the file created
$this->counter->file++;
}
}
// creat the language folder
$this->folder->create($module->folder_path . '/language');
// also create the lang tag folder
$this->folder->create(
$module->folder_path . '/language/' . $this->config->get('lang_tag', 'en-GB')
);
// check if this lib has files
if (isset($module->files)
&& ArrayHelper::check($module->files))
{
// add to component files
foreach ($module->files as $file)
{
// set the pathfinder
$file['target_type'] = $module->target_type;
$file['target_id'] = $module->id;
$this->component->appendArray('files', $file);
}
}
// check if this lib has folders
if (isset($module->folders)
&& ArrayHelper::check($module->folders))
{
// add to component folders
foreach ($module->folders as $folder)
{
// set the pathfinder
$folder['target_type'] = $module->target_type;
$folder['target_id'] = $module->id;
$this->component->appendArray('folders', $folder);
}
}
// check if this module has urls
if (isset($module->urls)
&& ArrayHelper::check($module->urls))
{
// add to component urls
foreach ($module->urls as $n => &$url)
{
// should we add the local folder
if (isset($url['type']) && $url['type'] > 1
&& isset($url['url'])
&& StringHelper::check(
$url['url']
))
{
// set file name
$fileName = basename((string) $url['url']);
// get the file contents
$data = FileHelper::getContent(
$url['url']
);
// build sub path
if (strpos($fileName, '.js') !== false)
{
$path = '/js';
}
elseif (strpos($fileName, '.css') !== false)
{
$path = '/css';
}
else
{
$path = '';
}
// create sub media path if not set
$this->folder->create(
$module->folder_path . $path
);
// set the path to module file
$url['path'] = $module->folder_path . $path
. '/' . $fileName; // we need this for later
// write data to path
$this->file->write($url['path'], $data);
// count the file created
$this->counter->file++;
}
}
}
}
}
}
}
/**
* get the module xml template
*
* @param object $module The module object
*
* @return string
* @since 3.2.0
*/
protected function getXML(object &$module): string
{
$xml = '<?xml version="1.0" encoding="utf-8"?>';
$xml .= PHP_EOL . '<extension type="module" version="'
. $this->config->joomla_versions[$this->config->joomla_version]['xml_version'] . '" client="'
. $module->target_client . '" method="upgrade">';
$xml .= PHP_EOL . Indent::_(1) . '<name>' . $module->lang_prefix
. '</name>';
$xml .= PHP_EOL . Indent::_(1) . '<creationDate>' . Placefix::_h('BUILDDATE') . '</creationDate>';
$xml .= PHP_EOL . Indent::_(1) . '<author>' . Placefix::_h('AUTHOR') . '</author>';
$xml .= PHP_EOL . Indent::_(1) . '<authorEmail>' . Placefix::_h('AUTHOREMAIL') . '</authorEmail>';
$xml .= PHP_EOL . Indent::_(1) . '<authorUrl>' . Placefix::_h('AUTHORWEBSITE') . '</authorUrl>';
$xml .= PHP_EOL . Indent::_(1) . '<copyright>' . Placefix::_h('COPYRIGHT') . '</copyright>';
$xml .= PHP_EOL . Indent::_(1) . '<license>' . Placefix::_h('LICENSE') . '</license>';
$xml .= PHP_EOL . Indent::_(1) . '<version>' . $module->module_version
. '</version>';
$xml .= PHP_EOL . Indent::_(1) . '<description>' . $module->lang_prefix
. '_XML_DESCRIPTION</description>';
$xml .= Placefix::_h('MAINXML');
$xml .= PHP_EOL . '</extension>';
return $xml;
}
/**
* get the module admin custom script field
*
* @param array $fieldScriptBucket The field
*
* @return string
* @since 3.2.0
*
*/
protected function getCustomScriptField(array $fieldScriptBucket): string
{
$form_field_class = [];
$form_field_class[] = Placefix::_h('BOM') . PHP_EOL;
$form_field_class[] = "//" . Line::_(__Line__, __Class__)
. " No direct access to this file";
$form_field_class[] = "defined('_JEXEC') or die('Restricted access');";
$form_field_class[] = PHP_EOL . "use Joomla\CMS\Form\FormField;";
$form_field_class[] = "use Joomla\CMS\Factory;";
$form_field_class[] = PHP_EOL
. "class JFormFieldModadminvvvvvvvdm extends FormField";
$form_field_class[] = "{";
$form_field_class[] = Indent::_(1)
. "protected \$type = 'modadminvvvvvvvdm';";
$form_field_class[] = PHP_EOL . Indent::_(1)
. "protected function getLabel()";
$form_field_class[] = Indent::_(1) . "{";
$form_field_class[] = Indent::_(2) . "return;";
$form_field_class[] = Indent::_(1) . "}";
$form_field_class[] = PHP_EOL . Indent::_(1)
. "protected function getInput()";
$form_field_class[] = Indent::_(1) . "{";
$form_field_class[] = Indent::_(2) . "//" . Line::_(__Line__, __Class__)
. " Get the document";
$form_field_class[] = Indent::_(2)
. "\$document = Factory::getDocument();";
$form_field_class[] = implode(PHP_EOL, $fieldScriptBucket);
$form_field_class[] = Indent::_(2) . "return; // noting for now :)";
$form_field_class[] = Indent::_(1) . "}";
$form_field_class[] = "}";
return implode(PHP_EOL, $form_field_class);
}
}

View File

@ -744,17 +744,17 @@ class Data
if (!isset($module->form_files[$form['file']]))
{
$module->form_files[$form['file']]
= array();
= [];
}
if (!isset($module->form_files[$form['file']][$form['fields_name']]))
{
$module->form_files[$form['file']][$form['fields_name']]
= array();
= [];
}
if (!isset($module->form_files[$form['file']][$form['fields_name']][$form['fieldset']]))
{
$module->form_files[$form['file']][$form['fields_name']][$form['fieldset']]
= array();
= [];
}
// do some house cleaning (for fields)
foreach ($form['fields'] as $field)
@ -776,12 +776,12 @@ class Data
if (!isset($module->config_fields[$form['fields_name']]))
{
$module->config_fields[$form['fields_name']]
= array();
= [];
}
if (!isset($module->config_fields[$form['fields_name']][$form['fieldset']]))
{
$module->config_fields[$form['fields_name']][$form['fieldset']]
= array();
= [];
}
// do some house cleaning (for fields)
foreach ($form['fields'] as $field)

View File

@ -0,0 +1,626 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Componentbuilder\Compiler\Joomlaplugin;
use VDM\Joomla\Componentbuilder\Compiler\Factory as Compiler;
use VDM\Joomla\Componentbuilder\Compiler\Joomlaplugin\Data as Plugin;
use VDM\Joomla\Componentbuilder\Compiler\Component;
use VDM\Joomla\Componentbuilder\Compiler\Config;
use VDM\Joomla\Componentbuilder\Compiler\Registry;
use VDM\Joomla\Componentbuilder\Compiler\Customcode\Dispenser;
use VDM\Joomla\Componentbuilder\Compiler\Interfaces\EventInterface;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Counter;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Folder;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\File;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Files;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Indent;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Placefix;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Line;
use VDM\Joomla\Utilities\ArrayHelper;
use VDM\Joomla\Utilities\ObjectHelper;
use VDM\Joomla\Utilities\StringHelper;
use VDM\Joomla\Utilities\FileHelper;
/**
* Joomla Plugin Builder Class
*
* @since 3.2.0
*/
class Builder
{
/**
* Compiler Joomla Plugin Data Class
*
* @var Plugin
* @since 3.2.0
*/
protected Plugin $plugin;
/**
* Compiler Component
*
* @var Component
* @since 3.2.0
**/
protected Component $component;
/**
* Compiler Config
*
* @var Config
* @since 3.2.0
*/
protected Config $config;
/**
* The compiler registry
*
* @var Registry
* @since 3.2.0
*/
protected Registry $registry;
/**
* Compiler Customcode Dispenser
*
* @var Dispenser
* @since 3.2.0
*/
protected Dispenser $dispenser;
/**
* Compiler Event
*
* @var EventInterface
* @since 3.2.0
*/
protected EventInterface $event;
/**
* Compiler Counter
*
* @var Counter
* @since 3.2.0
*/
protected Counter $counter;
/**
* Compiler Utilities Folder
*
* @var Folder
* @since 3.2.0
*/
protected Folder $folder;
/**
* Compiler Utilities File
*
* @var File
* @since 3.2.0
*/
protected File $file;
/**
* Compiler Utilities Files
*
* @var Files
* @since 3.2.0
*/
protected Files $files;
/**
* Constructor
*
* @param Plugin|null $plugin The compiler Joomla plugin data object.
* @param Component|null $component The component class.
* @param Config|null $config The compiler config object.
* @param Registry|null $registry The compiler registry object.
* @param Dispenser|null $dispenser The compiler customcode dispenser object.
* @param EventInterface|null $event The compiler event api object.
* @param Counter|null $counter The compiler counter object.
* @param Folder|null $folder The compiler folder object.
* @param File|null $file The compiler file object.
* @param Files|null $files The compiler files object.
*
* @since 3.2.0
*/
public function __construct(?Plugin $plugin = null, ?Component $component = null,
?Config $config = null, ?Registry $registry = null,
?Dispenser $dispenser = null, ?EventInterface $event = null,
?Counter $counter = null, ?Folder $folder = null,
?File $file = null, ?Files $files = null)
{
$this->plugin = $plugin ?: Compiler::_('Joomlaplugin.Data');
$this->component = $component ?: Compiler::_('Component');
$this->config = $config ?: Compiler::_('Config');
$this->registry = $registry ?: Compiler::_('Registry');
$this->dispenser = $dispenser ?: Compiler::_('Customcode.Dispenser');
$this->event = $event ?: Compiler::_('Event');
$this->counter = $counter ?? Compiler::_('Utilities.Counter');
$this->folder = $folder ?? Compiler::_('Utilities.Folder');
$this->file = $file ?? Compiler::_('Utilities.File');
$this->files = $files ?? Compiler::_('Utilities.Files');
}
/**
* Build the Plugins files, folders, url's and config
*
* @return void
* @since 3.2.0
*/
public function run()
{
if ($this->plugin->exists())
{
// for plugin event TODO change event api signatures
$component_context = $this->config->component_context;
$plugins = $this->plugin->get();
// Trigger Event: jcb_ce_onBeforeSetPlugins
$this->event->trigger(
'jcb_ce_onBeforeBuildPlugins',
array(&$component_context, &$plugins)
);
foreach ($plugins as $plugin)
{
if (ObjectHelper::check($plugin)
&& isset($plugin->folder_name)
&& StringHelper::check(
$plugin->folder_name
))
{
// plugin path
$plugin->folder_path = $this->config->get('compiler_path', JPATH_COMPONENT_ADMINISTRATOR . '/compiler') . '/'
. $plugin->folder_name;
// set the plugin paths
$this->registry->set('dynamic_paths.' . $plugin->key, $plugin->folder_path);
// make sure there is no old build
$this->folder->remove($plugin->folder_path);
// creat the main component folder
$this->folder->create($plugin->folder_path);
// set main class file
$fileDetails = array('path' => $plugin->folder_path . '/'
. $plugin->file_name . '.php',
'name' => $plugin->file_name . '.php',
'zip' => $plugin->file_name . '.php');
$this->file->write(
$fileDetails['path'],
'<?php' . PHP_EOL . '// Plugin main class template' .
PHP_EOL . Placefix::_h('BOM') . PHP_EOL .
PHP_EOL . '// No direct access to this file' . PHP_EOL .
"defined('_JEXEC') or die('Restricted access');"
. PHP_EOL .
Placefix::_h('MAINCLASS')
);
$this->files->appendArray($plugin->key, $fileDetails);
// count the file created
$this->counter->file++;
// set main xml file
$fileDetails = array('path' => $plugin->folder_path . '/'
. $plugin->file_name . '.xml',
'name' => $plugin->file_name . '.xml',
'zip' => $plugin->file_name . '.xml');
$this->file->write(
$fileDetails['path'],
$this->getXML($plugin)
);
$this->files->appendArray($plugin->key, $fileDetails);
// count the file created
$this->counter->file++;
// set install script if needed
if ($plugin->add_install_script)
{
$fileDetails = array('path' => $plugin->folder_path
. '/script.php',
'name' => 'script.php',
'zip' => 'script.php');
$this->file->write(
$fileDetails['path'],
'<?php' . PHP_EOL . '// Script template' .
PHP_EOL . Placefix::_h('BOM') . PHP_EOL
.
PHP_EOL . '// No direct access to this file'
. PHP_EOL .
"defined('_JEXEC') or die('Restricted access');"
. PHP_EOL .
Placefix::_h('INSTALLCLASS')
);
$this->files->appendArray($plugin->key, $fileDetails);
// count the file created
$this->counter->file++;
}
// set readme if found
if ($plugin->addreadme)
{
$fileDetails = array('path' => $plugin->folder_path
. '/README.md',
'name' => 'README.md',
'zip' => 'README.md');
$this->file->write($fileDetails['path'], $plugin->readme);
$this->files->appendArray($plugin->key, $fileDetails);
// count the file created
$this->counter->file++;
}
// set fields & rules folders if needed
if (isset($plugin->fields_rules_paths)
&& $plugin->fields_rules_paths == 2)
{
// create fields folder
$this->folder->create($plugin->folder_path . '/fields');
// create rules folder
$this->folder->create($plugin->folder_path . '/rules');
}
// set forms folder if needed
if (isset($plugin->form_files)
&& ArrayHelper::check(
$plugin->form_files
))
{
// create forms folder
$this->folder->create($plugin->folder_path . '/forms');
// set the template files
foreach ($plugin->form_files as $file => $fields)
{
// set file details
$fileDetails = array('path' => $plugin->folder_path
. '/forms/' . $file . '.xml',
'name' => $file . '.xml',
'zip' => 'forms/' . $file
. '.xml');
// build basic XML
$xml = '<?xml version="1.0" encoding="utf-8"?>';
$xml .= PHP_EOL . '<!--' . Line::_(__Line__, __Class__)
. ' default paths of ' . $file
. ' form points to ' . $this->config->component_code_name
. ' -->';
// search if we must add the component path
$add_component_path = false;
foreach ($fields as $field_name => $fieldsets)
{
if (!$add_component_path)
{
foreach ($fieldsets as $fieldset => $field)
{
if (!$add_component_path
&& isset(
$plugin->fieldsets_paths[$file
. $field_name . $fieldset]
)
&& $plugin->fieldsets_paths[$file
. $field_name . $fieldset] == 1)
{
$add_component_path = true;
}
}
}
}
// only add if part of the component field types path is required
if ($add_component_path)
{
$xml .= PHP_EOL . '<form';
$xml .= PHP_EOL . Indent::_(1)
. 'addrulepath="/administrator/components/com_'
. $this->config->component_code_name
. '/models/rules"';
$xml .= PHP_EOL . Indent::_(1)
. 'addfieldpath="/administrator/components/com_'
. $this->config->component_code_name
. '/models/fields"';
$xml .= PHP_EOL . '>';
}
else
{
$xml .= PHP_EOL . '<form>';
}
// add the fields
foreach ($fields as $field_name => $fieldsets)
{
// check if we have an double fields naming set
$field_name_inner = '';
$field_name_outer = $field_name;
if (strpos((string) $field_name, '.') !== false)
{
$field_names = explode('.', (string) $field_name);
if (count((array) $field_names) == 2)
{
$field_name_outer = $field_names[0];
$field_name_inner = $field_names[1];
}
}
$xml .= PHP_EOL . Indent::_(1)
. '<fields name="' . $field_name_outer
. '">';
foreach ($fieldsets as $fieldset => $field)
{
// default to the field set name
$label = $fieldset;
if (isset($plugin->fieldsets_label[$file . $field_name . $fieldset]))
{
$label = $plugin->fieldsets_label[$file . $field_name . $fieldset];
}
// add path to plugin rules and custom fields
if (isset($plugin->fieldsets_paths[$file . $field_name . $fieldset])
&& ($plugin->fieldsets_paths[$file . $field_name . $fieldset] == 2
|| $plugin->fieldsets_paths[$file . $field_name . $fieldset] == 3))
{
if (!isset($plugin->add_rule_path[$file . $field_name . $fieldset]))
{
$plugin->add_rule_path[$file . $field_name . $fieldset] =
'/plugins/' . strtolower((string) $plugin->group
) . '/' . strtolower((string) $plugin->code_name)
. '/rules';
}
if (!isset($plugin->add_field_path[$file . $field_name . $fieldset]))
{
$plugin->add_field_path[$file . $field_name . $fieldset] =
'/plugins/' . strtolower((string) $plugin->group
) . '/' . strtolower((string) $plugin->code_name)
. '/fields';
}
}
// add path to plugin rules and custom fields
if (isset($plugin->add_rule_path[$file . $field_name . $fieldset])
|| isset($plugin->add_field_path[$file . $field_name . $fieldset]))
{
$xml .= PHP_EOL . Indent::_(1) . '<!--'
. Line::_(__Line__, __Class__) . ' default paths of '
. $fieldset . ' fieldset points to the plugin -->';
$xml .= PHP_EOL . Indent::_(1) . '<fieldset name="'
. $fieldset . '" label="' . $label . '"';
if (isset($plugin->add_rule_path[$file . $field_name . $fieldset]))
{
$xml .= PHP_EOL . Indent::_(2)
. 'addrulepath="' . $plugin->add_rule_path[$file . $field_name . $fieldset] . '"';
}
if (isset($plugin->add_field_path[$file . $field_name . $fieldset]))
{
$xml .= PHP_EOL . Indent::_(2)
. 'addfieldpath="' . $plugin->add_field_path[$file . $field_name . $fieldset] . '"';
}
$xml .= PHP_EOL . Indent::_(1) . '>';
}
else
{
$xml .= PHP_EOL . Indent::_(1) . '<fieldset name="'
. $fieldset . '" label="' . $label . '">';
}
// check if we have an inner field set
if (StringHelper::check(
$field_name_inner
))
{
$xml .= PHP_EOL . Indent::_(1)
. '<fields name="'
. $field_name_inner . '">';
}
// add the placeholder of the fields
$xml .= Placefix::_h('FIELDSET_' . $file
. $field_name . $fieldset );
// check if we have an inner field set
if (StringHelper::check(
$field_name_inner
))
{
$xml .= PHP_EOL . Indent::_(1)
. '</fields>';
}
$xml .= PHP_EOL . Indent::_(1)
. '</fieldset>';
}
$xml .= PHP_EOL . Indent::_(1) . '</fields>';
}
$xml .= PHP_EOL . '</form>';
// add xml to file
$this->file->write($fileDetails['path'], $xml);
$this->files->appendArray($plugin->key, $fileDetails);
// count the file created
$this->counter->file++;
}
}
// set SQL stuff if needed
if ($plugin->add_sql || $plugin->add_sql_uninstall)
{
// create SQL folder
$this->folder->create($plugin->folder_path . '/sql');
// create mysql folder
$this->folder->create(
$plugin->folder_path . '/sql/mysql'
);
// now set the install file
if ($plugin->add_sql)
{
$this->file->write(
$plugin->folder_path . '/sql/mysql/install.sql',
$plugin->sql
);
// count the file created
$this->counter->file++;
}
// now set the uninstall file
if ($plugin->add_sql_uninstall)
{
$this->file->write(
$plugin->folder_path
. '/sql/mysql/uninstall.sql',
$plugin->sql_uninstall
);
// count the file created
$this->counter->file++;
}
}
// creat the language folder path
$this->folder->create($plugin->folder_path . '/language');
// also creat the lang tag folder path
$this->folder->create(
$plugin->folder_path . '/language/' . $this->config->get('lang_tag', 'en-GB')
);
// check if this lib has files
if (isset($plugin->files)
&& ArrayHelper::check($plugin->files))
{
// add to component files
foreach ($plugin->files as $file)
{
// set the path finder
$file['target_type'] = $plugin->target_type;
$file['target_id'] = $plugin->id;
$this->component->appendArray('files', $file);
}
}
// check if this lib has folders
if (isset($plugin->folders)
&& ArrayHelper::check($plugin->folders))
{
// add to component folders
foreach ($plugin->folders as $folder)
{
// set the path finder
$folder['target_type'] = $plugin->target_type;
$folder['target_id'] = $plugin->id;
$this->component->appendArray('folders', $folder);
}
}
// check if this plugin has urls
if (isset($plugin->urls)
&& ArrayHelper::check($plugin->urls))
{
// add to component urls
foreach ($plugin->urls as $n => &$url)
{
// should we add the local folder
if (isset($url['type']) && $url['type'] > 1
&& isset($url['url'])
&& StringHelper::check(
$url['url']
))
{
// set file name
$fileName = basename((string) $url['url']);
// get the file contents
$data = FileHelper::getContent(
$url['url']
);
// build sub path
if (strpos($fileName, '.js') !== false)
{
$path = '/js';
}
elseif (strpos($fileName, '.css') !== false)
{
$path = '/css';
}
else
{
$path = '';
}
// create sub media media folder path if not set
$this->folder->create(
$plugin->folder_path . $path
);
// set the path to plugin file
$url['path'] = $plugin->folder_path . $path
. '/' . $fileName; // we need this for later
// write data to path
$this->file->write($url['path'], $data);
// count the file created
$this->counter->file++;
}
}
}
}
}
}
}
/**
* get the plugin xml template
*
* @param object $module The plugin object
*
* @return string
* @since 3.2.0
*/
protected function getXML(object &$plugin): string
{
$xml = '<?xml version="1.0" encoding="utf-8"?>';
$xml .= PHP_EOL . '<extension type="plugin" version="'
. $this->config->joomla_versions[$this->config->joomla_version]['xml_version'] . '" group="'
. strtolower((string) $plugin->group) . '" method="upgrade">';
$xml .= PHP_EOL . Indent::_(1) . '<name>' . $plugin->lang_prefix
. '</name>';
$xml .= PHP_EOL . Indent::_(1) . '<creationDate>' . Placefix::_h('BUILDDATE') . '</creationDate>';
$xml .= PHP_EOL . Indent::_(1) . '<author>' . Placefix::_h('AUTHOR') . '</author>';
$xml .= PHP_EOL . Indent::_(1) . '<authorEmail>' . Placefix::_h('AUTHOREMAIL') . '</authorEmail>';
$xml .= PHP_EOL . Indent::_(1) . '<authorUrl>' . Placefix::_h('AUTHORWEBSITE') . '</authorUrl>';
$xml .= PHP_EOL . Indent::_(1) . '<copyright>' . Placefix::_h('COPYRIGHT') . '</copyright>';
$xml .= PHP_EOL . Indent::_(1) . '<license>' . Placefix::_h('LICENSE') . '</license>';
$xml .= PHP_EOL . Indent::_(1) . '<version>' . $plugin->plugin_version
. '</version>';
$xml .= PHP_EOL . Indent::_(1) . '<description>' . $plugin->lang_prefix
. '_XML_DESCRIPTION</description>';
$xml .= Placefix::_h('MAINXML');
$xml .= PHP_EOL . '</extension>';
return $xml;
}
}

View File

@ -669,17 +669,17 @@ class Data
if (!isset($plugin->form_files[$form['file']]))
{
$plugin->form_files[$form['file']]
= array();
= [];
}
if (!isset($plugin->form_files[$form['file']][$form['fields_name']]))
{
$plugin->form_files[$form['file']][$form['fields_name']]
= array();
= [];
}
if (!isset($plugin->form_files[$form['file']][$form['fields_name']][$form['fieldset']]))
{
$plugin->form_files[$form['file']][$form['fields_name']][$form['fieldset']]
= array();
= [];
}
// do some house cleaning (for fields)
foreach ($form['fields'] as $field)
@ -701,12 +701,12 @@ class Data
if (!isset($plugin->config_fields[$form['fields_name']]))
{
$plugin->config_fields[$form['fields_name']]
= array();
= [];
}
if (!isset($plugin->config_fields[$form['fields_name']][$form['fieldset']]))
{
$plugin->config_fields[$form['fields_name']][$form['fieldset']]
= array();
= [];
}
// do some house cleaning (for fields)
foreach ($form['fields'] as $field)

View File

@ -112,11 +112,11 @@ class Extractor
// insure string is not broken
$content = $this->placeholder->update_($content);
// reset some buckets
$lang_holders = array();
$lang_check = array();
$lang_only = array();
$js_text = array();
$sc_text = array();
$lang_holders = [];
$lang_check = [];
$lang_only = [];
$js_text = [];
$sc_text = [];
// first get the Joomla .JText._()
if (in_array('Joomla' . '.JText._(', $lang_string_targets))
{

View File

@ -0,0 +1,318 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Componentbuilder\Compiler\Library;
use Joomla\CMS\Filesystem\Folder as JoomlaFolder;
use VDM\Joomla\Componentbuilder\Compiler\Factory as Compiler;
use VDM\Joomla\Componentbuilder\Compiler\Config;
use VDM\Joomla\Componentbuilder\Compiler\Registry;
use VDM\Joomla\Componentbuilder\Compiler\Interfaces\EventInterface;
use VDM\Joomla\Componentbuilder\Compiler\Component;
use VDM\Joomla\Componentbuilder\Compiler\Content;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Counter;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Paths;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Folder;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\File;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Indent;
use VDM\Joomla\Utilities\ObjectHelper;
use VDM\Joomla\Utilities\ArrayHelper;
use VDM\Joomla\Utilities\StringHelper;
use VDM\Joomla\Utilities\FileHelper;
/**
* Library Builder Class
*
* @since 3.2.0
*/
class Builder
{
/**
* Compiler Config
*
* @var Config
* @since 3.2.0
*/
protected Config $config;
/**
* The compiler registry
*
* @var Registry
* @since 3.2.0
*/
protected Registry $registry;
/**
* Compiler Event
*
* @var EventInterface
* @since 3.2.0
*/
protected EventInterface $event;
/**
* Compiler Component
*
* @var Component
* @since 3.2.0
**/
protected Component $component;
/**
* Compiler Content
*
* @var Content
* @since 3.2.0
**/
protected Content $content;
/**
* Compiler Counter
*
* @var Counter
* @since 3.2.0
*/
protected Counter $counter;
/**
* Compiler Utilities Paths
*
* @var Paths
* @since 3.2.0
*/
protected Paths $paths;
/**
* Compiler Utilities Folder
*
* @var Folder
* @since 3.2.0
*/
protected Folder $folder;
/**
* Compiler Utilities File
*
* @var File
* @since 3.2.0
*/
protected File $file;
/**
* Constructor
*
* @param Config|null $config The compiler config object.
* @param Registry|null $registry The compiler registry object.
* @param EventInterface|null $event The compiler event api object.
* @param Component|null $component The component class.
* @param Content|null $content The compiler content object.
* @param Counter|null $counter The compiler counter object.
* @param Paths|null $paths The compiler paths object.
* @param Folder|null $folder The compiler folder object.
* @param File|null $file The compiler file object.
*
* @since 3.2.0
*/
public function __construct(?Config $config = null, ?Registry $registry = null,
?EventInterface $event = null, ?Component $component = null,
?Content $content = null,?Counter $counter = null,
?Paths $paths = null, ?Folder $folder = null,
?File $file = null)
{
$this->config = $config ?: Compiler::_('Config');
$this->registry = $registry ?: Compiler::_('Registry');
$this->event = $event ?: Compiler::_('Event');
$this->component = $component ?: Compiler::_('Component');
$this->content = $content ?: Compiler::_('Content');
$this->counter = $counter ?: Compiler::_('Utilities.Counter');
$this->paths = $paths ?: Compiler::_('Utilities.Paths');
$this->folder = $folder ?: Compiler::_('Utilities.Folder');
$this->file = $file ?: Compiler::_('Utilities.File');
}
/**
* Build the Libraries files, folders, url's and config
*
* @return void
* @since 3.2.0
*/
public function run()
{
if (($libraries_ = $this->registry->get('builder.libraries')) !== null)
{
// for plugin event TODO change event api signatures
$component_context = $this->config->component_context;
// Trigger Event: jcb_ce_onBeforeSetLibraries
$this->event->trigger(
'jcb_ce_onBeforeSetLibraries',
array(&$component_context, &$libraries_)
);
// creat the main component folder
if (!JoomlaFolder::exists($this->paths->component_path))
{
JoomlaFolder::create($this->paths->component_path);
// count the folder created
$this->counter->folder++;
$this->file->html('');
}
// create media path if not set
$this->folder->create($this->paths->component_path . '/media');
foreach ($libraries_ as $id => &$library)
{
if (ObjectHelper::check($library))
{
// check if this lib has files
if (isset($library->files)
&& ArrayHelper::check($library->files))
{
// add to component files
foreach ($library->files as $file)
{
$this->component->appendArray('files', $file);
}
}
// check if this lib has folders
if (isset($library->folders)
&& ArrayHelper::check(
$library->folders
))
{
// add to component folders
foreach ($library->folders as $folder)
{
$this->component->appendArray('folders', $folder);
}
}
// check if this lib has urls
if (isset($library->urls)
&& ArrayHelper::check($library->urls))
{
// build media folder path
$libFolder = strtolower(
preg_replace(
'/\s+/', '-',
(string) StringHelper::safe(
$library->name, 'filename', ' ', false
)
)
);
$mediaPath = '/media/' . $libFolder;
// should we add the local folder
$addLocalFolder = false;
// add to component urls
foreach ($library->urls as $n => &$url)
{
if (isset($url['type']) && $url['type'] > 1
&& isset($url['url'])
&& StringHelper::check(
$url['url']
))
{
// create media/lib path if not set
$this->folder->create(
$this->paths->component_path . $mediaPath
);
// add local folder
$addLocalFolder = true;
// set file name
$fileName = basename((string) $url['url']);
// get the file contents
$data = FileHelper::getContent(
$url['url']
);
// build sub path
if (strpos($fileName, '.js') !== false)
{
$path = '/js';
}
elseif (strpos($fileName, '.css') !== false)
{
$path = '/css';
}
else
{
$path = '';
}
// create sub media path if not set
$this->folder->create(
$this->paths->component_path . $mediaPath . $path
);
// set the path to library file
$url['path'] = $mediaPath . $path . '/'
. $fileName; // we need this for later
// set full path
$path = $this->paths->component_path . $url['path'];
// write data to path
$this->file->write($path, $data);
// count the file created
$this->counter->file++;
}
}
// only add if local
if ($addLocalFolder)
{
// add folder to xml of media folders
$this->content->add('EXSTRA_MEDIA_FOLDERS',
PHP_EOL . Indent::_(2) . "<folder>"
. $libFolder . "</folder>");
}
}
// if config fields are found load into component config (avoiding duplicates)
if (isset($library->how) && $library->how > 1
&& isset($library->config)
&& ArrayHelper::check($library->config))
{
foreach ($library->config as $cofig)
{
$found = array_filter(
$this->component->get('config'),
fn($item) => $item['field'] == $cofig['field']
);
// set the config data if not found
if (!ArrayHelper::check($found))
{
$this->component->appendArray('config', $cofig);
}
}
}
// update the global value just in case for now
$this->registry->set("builder.libraries.$id", $library);
}
}
}
}
}

View File

@ -283,7 +283,7 @@ class Dynamicget
// build relationship
$_relationship = array_map(
function ($op) use (&$_part_of_a) {
$bucket = array();
$bucket = [];
// array(on_field_as, on_field)
$bucket['on_field'] = array_map(
'trim',
@ -386,11 +386,11 @@ class Dynamicget
))
{
// start the part of a table bucket
$_part_of_a = array();
$_part_of_a = [];
// build relationship
$_relationship = array_map(
function ($op) use (&$_part_of_a) {
$bucket = array();
$bucket = [];
// array(on_field_as, on_field)
$bucket['on_field'] = array_map(
'trim',

View File

@ -272,7 +272,7 @@ class Fields
&& 'tag' !== $field['settings']->type_name)
{
// build temp field bucket
$tmpfield = array();
$tmpfield = [];
$tmpfield['settings'] = new \stdClass();
// convert the xml json string to normal string

View File

@ -94,8 +94,8 @@ class Sqldump
if (ArrayHelper::check($fields))
{
// reset array buckets
$sourceArray = array();
$targetArray = array();
$sourceArray = [];
$targetArray = [];
foreach ($fields as $field)
{
if (strpos($field, "=>") !== false)
@ -148,8 +148,8 @@ class Sqldump
if (ArrayHelper::check($fields))
{
// reset array buckets
$sourceArray = array();
$targetArray = array();
$sourceArray = [];
$targetArray = [];
foreach ($fields as $field)
{
if (strpos($field, "=>") !== false)

View File

@ -110,7 +110,7 @@ class Sqltweaking
if (2 == $setting['add_sql_options'])
{
// rest always
$id_array = array();
$id_array = [];
// by id (first remove backups)
$ids = $setting['ids'];
@ -126,7 +126,7 @@ class Sqltweaking
{
$id_array[] = trim((string) $ids);
}
$id_array_new = array();
$id_array_new = [];
// check for ranges
foreach ($id_array as $key => $id)

View File

@ -131,7 +131,7 @@ class Reverse
if (ArrayHelper::check($lang_string_targets))
{
// start lang holder
$lang_holders = array();
$lang_holders = [];
// set the lang for both since we don't know what area is being targeted
$_tmp = $this->config->lang_target;
// set the lang based on target

View File

@ -542,7 +542,7 @@ class Power implements PowerInterface
$this->active[$guid]->use_selection
)) ? json_decode((string) $this->active[$guid]->use_selection, true) : null;
if ($this->active[$guid]->use_selection)
if (ArrayHelper::check($this->active[$guid]->use_selection))
{
$use = array_values(array_map(function ($u) use(&$as) {
// track the AS options
@ -551,6 +551,10 @@ class Power implements PowerInterface
return $u['use'];
}, $this->active[$guid]->use_selection));
}
else
{
$this->active[$guid]->use_selection = null;
}
}
/**
@ -569,7 +573,7 @@ class Power implements PowerInterface
$this->active[$guid]->load_selection
)) ? json_decode((string) $this->active[$guid]->load_selection, true) : null;
if ($this->active[$guid]->load_selection)
if (ArrayHelper::check($this->active[$guid]->load_selection))
{
// load use ids
array_map(
@ -578,6 +582,10 @@ class Power implements PowerInterface
$this->active[$guid]->load_selection
);
}
else
{
$this->active[$guid]->load_selection = null;
}
}
/**

View File

@ -0,0 +1,339 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Componentbuilder\Compiler\Power;
use Joomla\CMS\Factory;
use Joomla\CMS\Application\CMSApplication;
use Joomla\CMS\Language\Text;
use VDM\Joomla\Componentbuilder\Compiler\Factory as Compiler;
use VDM\Joomla\Componentbuilder\Compiler\Power;
use VDM\Joomla\Componentbuilder\Compiler\Config;
use VDM\Joomla\Componentbuilder\Compiler\Registry;
use VDM\Joomla\Componentbuilder\Compiler\Interfaces\EventInterface;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Counter;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Paths;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Folder;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\File;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Files;
use VDM\Joomla\Utilities\ObjectHelper;
use VDM\Joomla\Utilities\ArrayHelper;
use VDM\Joomla\Utilities\StringHelper;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Placefix;
/**
* Power Builder Class
*
* @since 3.2.0
*/
class Builder
{
/**
* we track the creation of htaccess files
*
* @var array
* @since 3.2.0
**/
protected array $htaccess = [];
/**
* Power Objects
*
* @var Power
* @since 3.2.0
**/
protected Power $power;
/**
* Compiler Config
*
* @var Config
* @since 3.2.0
*/
protected Config $config;
/**
* The compiler registry
*
* @var Registry
* @since 3.2.0
*/
protected Registry $registry;
/**
* Compiler Event
*
* @var EventInterface
* @since 3.2.0
*/
protected EventInterface $event;
/**
* Compiler Counter
*
* @var Counter
* @since 3.2.0
*/
protected Counter $counter;
/**
* Compiler Utilities Paths
*
* @var Paths
* @since 3.2.0
*/
protected Paths $paths;
/**
* Compiler Utilities Folder
*
* @var Folder
* @since 3.2.0
*/
protected Folder $folder;
/**
* Compiler Utilities File
*
* @var File
* @since 3.2.0
*/
protected File $file;
/**
* Compiler Utilities Files
*
* @var Files
* @since 3.2.0
*/
protected Files $files;
/**
* Database object to query local DB
*
* @var CMSApplication
* @since 3.2.0
**/
protected CMSApplication $app;
/**
* Constructor
*
* @param Power|null $power The power object.
* @param Config|null $config The compiler config object.
* @param Registry|null $registry The compiler registry object.
* @param EventInterface|null $event The compiler event api object.
* @param Counter|null $counter The compiler counter object.
* @param Paths|null $paths The compiler paths object.
* @param Folder|null $folder The compiler folder object.
* @param File|null $file The compiler file object.
* @param Files|null $files The compiler files object.
* @param CMSApplication|null $app The CMS Application object.
*
* @throws \Exception
* @since 3.2.0
*/
public function __construct(?Power $power = null, ?Config $config = null,
?Registry $registry = null, ?EventInterface $event = null,
?Counter $counter = null, ?Paths $paths = null, ?Folder $folder = null,
?File $file = null, ?Files $files = null, ?CMSApplication $app = null)
{
$this->power = $power ?: Compiler::_('Power');
$this->config = $config ?: Compiler::_('Config');
$this->registry = $registry ?: Compiler::_('Registry');
$this->event = $event ?: Compiler::_('Event');
$this->counter = $counter ?: Compiler::_('Utilities.Counter');
$this->paths = $paths ?: Compiler::_('Utilities.Paths');
$this->folder = $folder ?: Compiler::_('Utilities.Folder');
$this->file = $file ?: Compiler::_('Utilities.File');
$this->files = $files ?: Compiler::_('Utilities.Files');
$this->app = $app ?: Factory::getApplication();
}
/**
* Build the Powers files, folders
*
* @return void
* @since 3.2.0
*/
public function run()
{
if (ArrayHelper::check($this->power->active))
{
// for plugin event TODO change event api signatures
$powers = $this->power->active;
$component_context = $this->config->component_context;
// Trigger Event: jcb_ce_onBeforeSetModules
$this->event->trigger(
'jcb_ce_onBeforeBuildPowers',
array(&$component_context, &$powers)
);
// for plugin event TODO change event api signatures
$this->power->active = $powers;
foreach ($this->power->active as $power)
{
if (ObjectHelper::check($power)
&& isset($power->path)
&& StringHelper::check(
$power->path
))
{
// activate dynamic folders
$this->setDynamicFolders();
// power path
$power->full_path = $this->paths->component_path . '/'
. $power->path;
$power->full_path_jcb = $this->paths->component_path . '/'
. $power->path_jcb;
$power->full_path_parent = $this->paths->component_path . '/'
. $power->path_parent;
// set the power paths
$this->registry->set('dynamic_paths.' . $power->key, $power->full_path_parent);
// create the power folder if it does not exist
// we do it like this to add html files to each part
$this->folder->create($power->full_path_jcb);
$this->folder->create($power->full_path_parent);
$this->folder->create($power->full_path);
// set power file
$fileDetails = array('path' => $power->full_path . '/'
. $power->file_name . '.php',
'name' => $power->file_name . '.php',
'zip' => $power->file_name . '.php');
$bom = '<?php' . PHP_EOL . '// A POWER FILE' .
PHP_EOL . Placefix::_h('BOM') . PHP_EOL;
// add custom override if found
if ($power->add_licensing_template == 2)
{
$bom = '<?php' . PHP_EOL . $power->licensing_template;
}
$this->file->write(
$fileDetails['path'],
$bom . PHP_EOL . Placefix::_h('POWERCODE')
. PHP_EOL . Placefix::_h('POWERLINKER')
);
$this->files->appendArray($power->key, $fileDetails);
// count the file created
$this->counter->file++;
// set htaccess once per path
$this->setHtaccess($power);
}
}
}
}
/**
* Set the .htaccess for this power path
*
* @param object $power The power object
*
* @return void
* @since 3.2.0
*/
protected function setHtaccess(object &$power)
{
if (!isset($this->htaccess[$power->path_jcb]))
{
// set the htaccess data
$data = '# Apache 2.4+' . PHP_EOL .
'<IfModule mod_authz_core.c>' . PHP_EOL .
' Require all denied' . PHP_EOL .
'</IfModule>' . PHP_EOL . PHP_EOL .
'# Apache 2.0-2.2' . PHP_EOL .
'<IfModule !mod_authz_core.c>' . PHP_EOL .
' Deny from all' . PHP_EOL .
'</IfModule>' . PHP_EOL;
// now we must add the .htaccess file
$fileDetails = array('path' => $power->full_path_jcb . '/.htaccess',
'name' => '.htaccess',
'zip' => '.htaccess');
$this->file->write(
$fileDetails['path'], $data
);
$this->files->appendArray($power->key, $fileDetails);
// count the file created
$this->counter->file++;
// now we must add the htaccess.txt file where the zip package my not get the [.] files
$fileDetails = array('path' => $power->full_path_jcb . '/htaccess.txt',
'name' => 'htaccess.txt',
'zip' => 'htaccess.txt');
$this->file->write(
$fileDetails['path'], $data
);
$this->files->appendArray($power->key, $fileDetails);
// count the file created
$this->counter->file++;
// now we must add the web.config file
$fileDetails = array('path' => $power->full_path_jcb . '/web.config',
'name' => 'web.config',
'zip' => 'web.config');
$this->file->write(
$fileDetails['path'],
'<?xml version="1.0"?>' . PHP_EOL .
' <system.web>' . PHP_EOL .
' <authorization>' . PHP_EOL .
' <deny users="*" />' . PHP_EOL .
' </authorization>' . PHP_EOL .
' </system.web>' . PHP_EOL .
'</configuration>' . PHP_EOL
);
$this->files->appendArray($power->key, $fileDetails);
// count the file created
$this->counter->file++;
// we set these files only once
$this->htaccess[$power->path_jcb] = true;
}
}
/**
* Add the dynamic folders
*
* @return void
* @since 3.2.0
*/
protected function setDynamicFolders()
{
// check if we should add the dynamic folder moving script to the installer script
if (!$this->registry->get('set_move_folders_install_script'))
{
// add the setDynamicF0ld3rs() method to the install scipt.php file
$this->registry->set('set_move_folders_install_script', true);
// set message that this was done (will still add a tutorial link later)
$this->app->enqueueMessage(
Text::_('COM_COMPONENTBUILDER_HR_HTHREEDYNAMIC_FOLDERS_WERE_DETECTEDHTHREE'),
'Notice'
);
$this->app->enqueueMessage(
Text::sprintf('COM_COMPONENTBUILDER_A_METHOD_SETDYNAMICFZEROLDTHREERS_WAS_ADDED_TO_THE_INSTALL_BSCRIPTPHPB_OF_THIS_PACKAGE_TO_INSURE_THAT_THE_FOLDERS_ARE_COPIED_INTO_THE_CORRECT_PLACE_WHEN_THIS_COMPONENT_IS_INSTALLED'),
'Notice'
);
}
}
}

View File

@ -128,6 +128,11 @@ class Infusion
// POWERCODE
$this->content->set_($power->key, 'POWERCODE', $this->get($power));
// POWERLINKER
// SOON WE STILL NEED TO THINK THIS OVER
// $this->content->set_($power->key, 'POWERLINKER', $this->linker($power));
$this->content->set_($power->key, 'POWERLINKER', '');
// Trigger Event: jcb_ce_onAfterInfusePowerData
$this->event->trigger(
'jcb_ce_onAfterInfusePowerData',
@ -198,10 +203,84 @@ class Infusion
$code[] = $power->main_class_code;
}
$code[] = '}' . PHP_EOL . PHP_EOL;
$code[] = '}' . PHP_EOL;
return $this->placeholder->update(implode(PHP_EOL, $code), $this->content->active);
}
/**
* Get the Power Linker
*
* @param object $power A power object.
*
* @return string
* @since 3.2.0
*/
protected function linker(object &$power): string
{
$map = [];
$body = [];
// set the LINKER
$map[] = '/******************| POWER LINKER |*******************|';
$map[] = '';
$map[] = '{';
// we build the JSON body
$body[] = ' "guid": "' . $power->guid . '"';
// load extends
if (GuidHelper::valid($power->extends))
{
$body[] = ' "extends": "' . $power->extends . '"';
}
// load implements
if (ArrayHelper::check($power->implements))
{
$sud = [];
foreach ($power->implements as $implement)
{
$sud[] = ' "' . $implement . '"';
}
$sud = implode(','. PHP_EOL, $sud);
$body[] = ' "implements": [' . PHP_EOL . $sud . PHP_EOL . ' ]';
}
// load (Use Selection)
if (ArrayHelper::check($power->use_selection))
{
$sud = [];
foreach ($power->use_selection as $use)
{
$sud[] = ' "' . $use['use'] . '"';
}
$sud = implode(','. PHP_EOL, $sud);
$body[] = ' "use": [' . PHP_EOL . $sud . PHP_EOL . ' ]';
}
// load (Load Selection)
if (ArrayHelper::check($power->load_selection))
{
$sud = [];
foreach ($power->load_selection as $load)
{
$sud[] = ' "' . $load['load'] . '"';
}
$sud = implode(','. PHP_EOL, $sud);
$body[] = ' "load": [' . PHP_EOL . $sud . PHP_EOL . ' ]';
}
$map[] = implode(','. PHP_EOL, $body);
$map[] = '}';
$map[] = '';
$map[] = '|******************| POWER LINKER |*******************/' . PHP_EOL . PHP_EOL;
return implode(PHP_EOL, $map);
}
}

View File

@ -16,7 +16,6 @@ use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use VDM\Joomla\Componentbuilder\Compiler\Config;
use VDM\Joomla\Componentbuilder\Compiler\Registry;
use VDM\Joomla\Componentbuilder\Compiler\Counter;
/**
@ -41,9 +40,6 @@ class Compiler implements ServiceProviderInterface
$container->alias(Registry::class, 'Registry')
->share('Registry', [$this, 'getRegistry'], true);
$container->alias(Counter::class, 'Counter')
->share('Counter', [$this, 'getCounter'], true);
}
/**
@ -71,19 +67,6 @@ class Compiler implements ServiceProviderInterface
{
return new Registry();
}
/**
* Get the Compiler Counter
*
* @param Container $container The DI container.
*
* @return Counter
* @since 3.2.0
*/
public function getCounter(Container $container): Counter
{
return new Counter();
}
}

View File

@ -15,6 +15,7 @@ namespace VDM\Joomla\Componentbuilder\Compiler\Service;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use VDM\Joomla\Componentbuilder\Compiler\Joomlamodule\Data as JoomlaModuleData;
use VDM\Joomla\Componentbuilder\Compiler\Joomlamodule\Builder as JoomlaModuleBuilder;
/**
@ -36,6 +37,9 @@ class Joomlamodule implements ServiceProviderInterface
{
$container->alias(JoomlaModuleData::class, 'Joomlamodule.Data')
->share('Joomlamodule.Data', [$this, 'getJoomlaModuleData'], true);
$container->alias(JoomlaModuleBuilder::class, 'Joomlamodule.Builder')
->share('Joomlamodule.Builder', [$this, 'getJoomlaModuleBuilder'], true);
}
/**
@ -61,6 +65,30 @@ class Joomlamodule implements ServiceProviderInterface
$container->get('Dynamicget.Data')
);
}
/**
* Get the Joomla Module Builder
*
* @param Container $container The DI container.
*
* @return JoomlaModuleBuilder
* @since 3.2.0
*/
public function getJoomlaModuleBuilder(Container $container): JoomlaModuleBuilder
{
return new JoomlaModuleBuilder(
$container->get('Joomlamodule.Data'),
$container->get('Component'),
$container->get('Config'),
$container->get('Registry'),
$container->get('Customcode.Dispenser'),
$container->get('Event'),
$container->get('Utilities.Counter'),
$container->get('Utilities.Folder'),
$container->get('Utilities.File'),
$container->get('Utilities.Files')
);
}
}

View File

@ -15,6 +15,7 @@ namespace VDM\Joomla\Componentbuilder\Compiler\Service;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use VDM\Joomla\Componentbuilder\Compiler\Joomlaplugin\Data as JoomlaPluginData;
use VDM\Joomla\Componentbuilder\Compiler\Joomlaplugin\Builder as JoomlaPluginBuilder;
/**
@ -36,6 +37,9 @@ class Joomlaplugin implements ServiceProviderInterface
{
$container->alias(JoomlaPluginData::class, 'Joomlaplugin.Data')
->share('Joomlaplugin.Data', [$this, 'getJoomlaPluginData'], true);
$container->alias(JoomlaPluginBuilder::class, 'Joomlaplugin.Builder')
->share('Joomlaplugin.Builder', [$this, 'getJoomlaPluginBuilder'], true);
}
/**
@ -59,6 +63,30 @@ class Joomlaplugin implements ServiceProviderInterface
$container->get('Model.Filesfolders')
);
}
/**
* Get the Joomla Plugin Builder
*
* @param Container $container The DI container.
*
* @return JoomlaPluginBuilder
* @since 3.2.0
*/
public function getJoomlaPluginBuilder(Container $container): JoomlaPluginBuilder
{
return new JoomlaPluginBuilder(
$container->get('Joomlaplugin.Data'),
$container->get('Component'),
$container->get('Config'),
$container->get('Registry'),
$container->get('Customcode.Dispenser'),
$container->get('Event'),
$container->get('Utilities.Counter'),
$container->get('Utilities.Folder'),
$container->get('Utilities.File'),
$container->get('Utilities.Files')
);
}
}

View File

@ -14,7 +14,8 @@ namespace VDM\Joomla\Componentbuilder\Compiler\Service;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use VDM\Joomla\Componentbuilder\Compiler\Library\Data as LibraryData;
use VDM\Joomla\Componentbuilder\Compiler\Library\Data;
use VDM\Joomla\Componentbuilder\Compiler\Library\Builder;
/**
@ -34,8 +35,11 @@ class Library implements ServiceProviderInterface
*/
public function register(Container $container)
{
$container->alias(LibraryData::class, 'Library.Data')
->share('Library.Data', [$this, 'getLibraryData'], true);
$container->alias(Data::class, 'Library.Data')
->share('Library.Data', [$this, 'getData'], true);
$container->alias(Builder::class, 'Library.Builder')
->share('Library.Builder', [$this, 'getBuilder'], true);
}
/**
@ -43,12 +47,12 @@ class Library implements ServiceProviderInterface
*
* @param Container $container The DI container.
*
* @return LibraryData
* @return Data
* @since 3.2.0
*/
public function getLibraryData(Container $container): LibraryData
public function getData(Container $container): Data
{
return new LibraryData(
return new Data(
$container->get('Config'),
$container->get('Registry'),
$container->get('Customcode'),
@ -57,6 +61,29 @@ class Library implements ServiceProviderInterface
$container->get('Model.Filesfolders')
);
}
/**
* Get the Compiler Library Builder
*
* @param Container $container The DI container.
*
* @return Builder
* @since 3.2.0
*/
public function getBuilder(Container $container): Builder
{
return new Builder(
$container->get('Config'),
$container->get('Registry'),
$container->get('Event'),
$container->get('Component'),
$container->get('Content'),
$container->get('Utilities.Counter'),
$container->get('Utilities.Paths'),
$container->get('Utilities.Folder'),
$container->get('Utilities.File')
);
}
}

View File

@ -17,6 +17,7 @@ use Joomla\DI\ServiceProviderInterface;
use VDM\Joomla\Componentbuilder\Compiler\Power as Powers;
use VDM\Joomla\Componentbuilder\Compiler\Power\Infusion;
use VDM\Joomla\Componentbuilder\Compiler\Power\Autoloader;
use VDM\Joomla\Componentbuilder\Compiler\Power\Builder;
/**
@ -44,6 +45,9 @@ class Power implements ServiceProviderInterface
$container->alias(Infusion::class, 'Power.Infusion')
->share('Power.Infusion', [$this, 'getInfusion'], true);
$container->alias(Builder::class, 'Power.Builder')
->share('Power.Builder', [$this, 'getBuilder'], true);
}
/**
@ -100,6 +104,29 @@ class Power implements ServiceProviderInterface
$container->get('Event')
);
}
/**
* Get the Compiler Power Builder
*
* @param Container $container The DI container.
*
* @return Builder
* @since 3.2.0
*/
public function getBuilder(Container $container): Builder
{
return new Builder(
$container->get('Power'),
$container->get('Config'),
$container->get('Registry'),
$container->get('Event'),
$container->get('Utilities.Counter'),
$container->get('Utilities.Paths'),
$container->get('Utilities.Folder'),
$container->get('Utilities.File'),
$container->get('Utilities.Files')
);
}
}

View File

@ -0,0 +1,134 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Componentbuilder\Compiler\Service;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use VDM\Joomla\Componentbuilder\Compiler\Config;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Folder;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\File;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Paths;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Counter;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Files;
/**
* Utilities Service Provider
*
* @since 3.2.0
*/
class Utilities implements ServiceProviderInterface
{
/**
* Registers the service provider with a DI container.
*
* @param Container $container The DI container.
*
* @return void
* @since 3.2.0
*/
public function register(Container $container)
{
$container->alias(Folder::class, 'Utilities.Folder')
->share('Utilities.Folder', [$this, 'getFolder'], true);
$container->alias(File::class, 'Utilities.File')
->share('Utilities.File', [$this, 'getFile'], true);
$container->alias(Counter::class, 'Utilities.Counter')
->share('Utilities.Counter', [$this, 'getCounter'], true);
$container->alias(Paths::class, 'Utilities.Paths')
->share('Utilities.Paths', [$this, 'getPaths'], true);
$container->alias(Files::class, 'Utilities.Files')
->share('Utilities.Files', [$this, 'getFiles'], true);
}
/**
* Get the Compiler Folder
*
* @param Container $container The DI container.
*
* @return Folder
* @since 3.2.0
*/
public function getFolder(Container $container): Folder
{
return new Folder(
$container->get('Utilities.Counter'),
$container->get('Utilities.File')
);
}
/**
* Get the Compiler File
*
* @param Container $container The DI container.
*
* @return File
* @since 3.2.0
*/
public function getFile(Container $container): File
{
return new File(
$container->get('Utilities.Counter')
);
}
/**
* Get the Compiler Counter
*
* @param Container $container The DI container.
*
* @return Counter
* @since 3.2.0
*/
public function getCounter(Container $container): Counter
{
return new Counter(
$container->get('Content')
);
}
/**
* Get the Compiler Paths
*
* @param Container $container The DI container.
*
* @return Paths
* @since 3.2.0
*/
public function getPaths(Container $container): Paths
{
return new Paths(
$container->get('Config'),
$container->get('Component')
);
}
/**
* Get the Compiler Files Bucket
*
* @param Container $container The DI container.
*
* @return Files
* @since 3.2.0
*/
public function getFiles(Container $container): Files
{
return new Files();
}
}

View File

@ -9,7 +9,7 @@
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Componentbuilder\Compiler;
namespace VDM\Joomla\Componentbuilder\Compiler\Utilities;
use VDM\Joomla\Componentbuilder\Compiler\Factory as Compiler;
@ -17,7 +17,7 @@ use VDM\Joomla\Componentbuilder\Compiler\Content;
/**
* Compiler Counter
* Compiler Utilities Counter
*
* @since 3.2.0
*/
@ -300,7 +300,6 @@ class Counter
$this->timer = $this->end - $this->start;
// compiler time
$this->content->set('COMPILER_TIMER_START', $this->start);
$this->content->set('COMPILER_TIMER_END', $this->end);
$this->content->set('COMPILER_TIMER', $this->timer);
}
@ -353,8 +352,6 @@ class Counter
// compiler time
$this->content->set('COMPILER_TIMER_START', $this->start);
$this->content->set('COMPILER_TIMER_END', $this->end);
$this->content->set('COMPILER_TIMER', $this->timer);
}
/**

View File

@ -0,0 +1,109 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 3rd September, 2020
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Componentbuilder\Compiler\Utilities;
use Joomla\CMS\Filesystem\File as JoomlaFile;
use VDM\Joomla\Componentbuilder\Compiler\Factory as Compiler;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Counter;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Paths;
use VDM\Joomla\Utilities\FileHelper;
/**
* File helper
*
* @since 3.2.0
*/
class File
{
/**
* Compiler Utilities Counter
*
* @var Counter
* @since 3.2.0
*/
protected Counter $counter;
/**
* Compiler Utilities Paths
*
* @var Paths
* @since 3.2.0
*/
protected Paths $paths;
/**
* Constructor
*
* @param Counter|null $counter The compiler counter object.
* @param Paths|null $paths The compiler paths object.
*
* @since 3.2.0
*/
public function __construct(?Counter $counter = null, ?Paths $paths = null)
{
$this->counter = $counter ?: Compiler::_('Utilities.Counter');
$this->paths = $paths ?: Compiler::_('Utilities.Paths');
}
/**
* set HTML blank file to a path
*
* @param string $path The path to where to set the blank html file
* @param string $root The root path
*
* @return void
*/
public function html(string $path = '', string $root = 'component')
{
if ('component' === $root)
{
$root = $this->paths->component_path . '/';
}
// use path if exist
if (strlen($path) > 0)
{
JoomlaFile::copy(
$this->paths->template_path . '/index.html',
$root . $path . '/index.html'
);
}
else
{
JoomlaFile::copy(
$this->paths->template_path . '/index.html',
$root . '/index.html'
);
}
// count the file created
$this->counter->file++;
}
/**
* Create a file on the server if it does not exist, or Overwrite existing files
*
* @param string $path The path and file name where to safe the data
* @param string $data The data to safe
*
* @return bool true On success
* @since 3.2.0
*/
public function write(string $path, string $data): bool
{
return FileHelper::write($path, $data);
}
}

View File

@ -0,0 +1,26 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Componentbuilder\Compiler\Utilities;
use VDM\Joomla\Componentbuilder\Abstraction\BaseRegistry;
/**
* Compiler Utilities Files Bucket
*
* @since 3.2.0
*/
class Files extends BaseRegistry
{
}

View File

@ -0,0 +1,172 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 3rd September, 2020
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Componentbuilder\Compiler\Utilities;
use Joomla\CMS\Filesystem\Folder as JoomlaFolder;
use Joomla\CMS\Filesystem\File as JoomlaFile;
use VDM\Joomla\Componentbuilder\Compiler\Factory as Compiler;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Counter;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\File;
use VDM\Joomla\Utilities\ArrayHelper;
/**
* Folder helper
*
* @since 3.2.0
*/
class Folder
{
/**
* Compiler Counter
*
* @var Counter
* @since 3.2.0
*/
protected Counter $counter;
/**
* Compiler Utilities File
*
* @var File
* @since 3.2.0
*/
protected File $file;
/**
* Constructor
*
* @param Counter|null $counter The compiler counter object.
* @param File|null $file The compiler file object.
*
* @since 3.2.0
*/
public function __construct(?Counter $counter = null, ?File $file = null)
{
$this->counter = $counter ?: Compiler::_('Utilities.Counter');
$this->file = $file ?: Compiler::_('Utilities.File');
}
/**
* Create Path if not exist
*
* @param string $path The path to folder to create
*
* @return void
* @since 3.2.0
*/
public function create(string $path)
{
// check if the path exist
if (!JoomlaFolder::exists($path))
{
// create the path
JoomlaFolder::create(
$path
);
// count the folder created
$this->counter->folder++;
// add index.html (boring I know)
$this->file->html(
$path, ''
);
}
}
/**
* Remove folders with files
*
* @param string $path The path to folder to remove
* @param array|null $ignore The folders and files to ignore and not remove
*
* @return boolean True if all are removed
* @since 3.2.0
*/
public function remove(string $path, ?array $ignore = null): bool
{
if (JoomlaFolder::exists($path))
{
$it = new \RecursiveDirectoryIterator($path);
$it = new \RecursiveIteratorIterator($it, \RecursiveIteratorIterator::CHILD_FIRST);
// remove ending /
$path = rtrim($path, '/');
// now loop the files & folders
foreach ($it as $file)
{
if ('.' === $file->getBasename() || '..' === $file->getBasename()) continue;
// set file dir
$file_dir = $file->getPathname();
// check if this is a dir or a file
if ($file->isDir())
{
$keeper = false;
if (ArrayHelper::check($ignore))
{
foreach ($ignore as $keep)
{
if (strpos((string) $file_dir, $path . '/' . $keep) !== false)
{
$keeper = true;
}
}
}
if ($keeper)
{
continue;
}
JoomlaFolder::delete($file_dir);
}
else
{
$keeper = false;
if (ArrayHelper::check($ignore))
{
foreach ($ignore as $keep)
{
if (strpos((string) $file_dir, $path . '/'. $keep) !== false)
{
$keeper = true;
}
}
}
if ($keeper)
{
continue;
}
JoomlaFile::delete($file_dir);
}
}
// delete the root folder if ignore not set
if (!ArrayHelper::check($ignore))
{
return JoomlaFolder::delete($path);
}
return true;
}
return false;
}
}

View File

@ -37,7 +37,7 @@ abstract class Path
* @return void
* @since 3.2.0
*/
public static function fix(&$values, $targets = array())
public static function fix(&$values, $targets = [])
{
// if multiple to gets searched and fixed
if (ArrayHelper::check($values) && ArrayHelper::check($targets))

View File

@ -0,0 +1,132 @@
<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Componentbuilder\Compiler\Utilities;
use VDM\Joomla\Componentbuilder\Compiler\Factory as Compiler;
use VDM\Joomla\Componentbuilder\Compiler\Config;
use VDM\Joomla\Componentbuilder\Compiler\Component;
use VDM\Joomla\Componentbuilder\Interfaces\Mappersingleinterface;
use VDM\Joomla\Componentbuilder\Abstraction\MapperSingle;
/**
* Compiler Utilities Paths
*
* @since 3.2.0
*/
class Paths extends MapperSingle implements Mappersingleinterface
{
/**
* Compiler Config
*
* @var Config
* @since 3.2.0
**/
protected Config $config;
/**
* Compiler Component
*
* @var Component
* @since 3.2.0
**/
protected Component $component;
/**
* Constructor
*
* @param Config|null $config The compiler config object.
* @param Component|null $component The component class.
*
* @since 3.2.0
*/
public function __construct(?Config $config = null, ?Component $component = null)
{
$this->config = $config ?: Compiler::_('Config');
$this->component = $component ?: Compiler::_('Component');
// set the template path
$this->set('template_path',
$this->config->get('compiler_path', JPATH_COMPONENT_ADMINISTRATOR . '/compiler') . '/joomla_'
. $this->config->joomla_versions[$this->config->joomla_version]['folder_key']
);
// set component sales name
$this->set('component_sales_name',
'com_' . $this->component->get('sales_name') . '__J'
. $this->config->joomla_version
);
// set component backup name
$this->set('component_backup_name',
'com_' . $this->component->get('sales_name') . '_v' . str_replace(
'.', '_', (string) $this->component->get('component_version')
) . '__J' . $this->config->joomla_version
);
// set component folder name
$this->set('component_folder_name',
'com_' . $this->component->get('name_code') . '_v' . str_replace(
'.', '_', (string) $this->component->get('component_version')
) . '__J' . $this->config->joomla_version
);
// set component path
$this->set('component_path',
$this->config->get('compiler_path', JPATH_COMPONENT_ADMINISTRATOR . '/compiler') . '/'
. $this->get('component_folder_name')
);
// set the template path for custom TODO: just use custom_folder_path in config
$this->set('template_path_custom',
$this->config->get(
'custom_folder_path', JPATH_COMPONENT_ADMINISTRATOR . '/custom'
)
);
}
/**
* getting any valid paths
*
* @param string $key The value's key/path name
*
* @return string The path found as a string
* @since 3.2.0
* @throws \InvalidArgumentException If $key is not a valid function name.
*/
public function __get(string $key): string
{
// check if it has been set
if ($this->exist($key))
{
return $this->get($key);
}
throw new \InvalidArgumentException(sprintf('Path %s could not be found in the Paths Class.', $key));
}
/**
* Model the key
*
* @param string $key The key to model
*
* @return string
* @since 3.2.0
*/
protected function key(string $key): string
{
return $key;
}
}

View File

@ -45,11 +45,13 @@ abstract class Unique
*/
public static function get($size): string
{
$unique = end(self::$unique[$size]);
$unique = (isset(self::$unique[$size])) ? end(self::$unique[$size]) : null;
if(!$unique)
{
$unique = substr("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv", 0, $size);
self::$unique[$size] = [];
}
while(in_array($unique, self::$unique[$size]))

View File

@ -119,7 +119,7 @@ class Ftp implements Serverinterface
}
else
{
$options = array();
$options = [];
}
// get ftp object
if (isset($host) && $host != 'HOSTNAME' &&

View File

@ -30,14 +30,14 @@ abstract class ArrayHelper
*/
public static function check($array, $removeEmptyString = false)
{
if (is_array($array) && ($nr = count((array)$array)) > 0)
if (is_array($array) && ($nr = count((array) $array)) > 0)
{
// also make sure the empty strings are removed
if ($removeEmptyString)
{
$array = array_filter($array);
if (empty($array))
if ($array === [])
{
return false;
}

View File

@ -48,7 +48,7 @@ abstract class FileHelper
*
* @since 3.0.9
*/
public static function zip($workingDirectory, &$filepath)
public static function zip($workingDirectory, &$filepath): bool
{
// store the current joomla working directory
$joomla = getcwd();
@ -65,11 +65,11 @@ abstract class FileHelper
// get a list of files in the current directory tree (also the hidden files)
$files = Folder::files('.', '', true, true, array('.svn', 'CVS', '.DS_Store', '__MACOSX'), array('.*~'));
$zipArray = array();
$zipArray = [];
// setup the zip array
foreach ($files as $file)
{
$tmp = array();
$tmp = [];
$tmp['name'] = str_replace('./', '', (string) $file);
$tmp['data'] = self::getContent($file);
$tmp['time'] = filemtime($file);
@ -80,15 +80,10 @@ abstract class FileHelper
chdir($joomla);
// get the zip adapter
$adapter = new Archive();
$zip = $adapter->getAdapter('zip');
$zip = (new Archive())->getAdapter('zip');
//create the zip file
if ($zip->create($filepath, $zipArray))
{
return true;
}
return false;
return (bool) $zip->create($filepath, $zipArray);
}
/**
@ -116,7 +111,7 @@ abstract class FileHelper
// start curl
$ch = curl_init();
// set the options
$options = array();
$options = [];
$options[CURLOPT_URL] = $path;
$options[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12';
$options[CURLOPT_RETURNTRANSFER] = TRUE;

View File

@ -67,7 +67,7 @@ abstract class JsonHelper
{
if (StringHelper::check($table))
{
$names = array();
$names = [];
foreach ($result as $val)
{
if ($external)

View File

@ -31,7 +31,7 @@ abstract class ClassfunctionHelper
*
* @since 3.0.9
*/
public static function safe($name)
public static function safe($name): string
{
// remove numbers if the first character is a number
if (is_numeric(substr((string) $name, 0, 1)))

View File

@ -399,7 +399,7 @@ abstract class StringHelper
public static function random($size): string
{
$bag = "abcefghijknopqrstuwxyzABCDDEFGHIJKLLMMNOPQRSTUVVWXYZabcddefghijkllmmnopqrstuvvwxyzABCEFGHIJKNOPQRSTUWXYZ";
$key = array();
$key = [];
$bagsize = strlen($bag) - 1;
for ($i = 0; $i < $size; $i++)

View File

@ -32,14 +32,14 @@ abstract class Minify
*
* @var string[]
*/
protected $data = array();
protected $data = [];
/**
* Array of patterns to match.
*
* @var string[]
*/
protected $patterns = array();
protected $patterns = [];
/**
* This array will hold content of strings and regular expressions that have
@ -50,7 +50,7 @@ abstract class Minify
*
* @var string[]
*/
public $extracted = array();
public $extracted = [];
/**
* Init the minify class - optionally, code may be passed along already.
@ -279,7 +279,7 @@ abstract class Minify
$output = '';
$processedOffset = 0;
$positions = array_fill(0, count($this->patterns), -1);
$matches = array();
$matches = [];
while ($processedOffset < $contentLength) {
// find first match for all patterns
@ -435,7 +435,7 @@ abstract class Minify
$content = strtr($content, $this->extracted);
$this->extracted = array();
$this->extracted = [];
return $content;
}

View File

@ -171,15 +171,15 @@ class Css extends Minify
);
// find all relative imports in css
$matches = array();
$matches = [];
foreach ($importRegexes as $importRegex) {
if (preg_match_all($importRegex, $content, $regexMatches, PREG_SET_ORDER)) {
$matches = [...$matches, ...$regexMatches];
}
}
$search = array();
$replace = array();
$search = [];
$replace = [];
// loop the matches
foreach ($matches as $match) {
@ -234,8 +234,8 @@ class Css extends Minify
{
$regex = '/url\((["\']?)(.+?)\\1\)/i';
if ($this->importExtensions && preg_match_all($regex, $content, $matches, PREG_SET_ORDER)) {
$search = array();
$replace = array();
$search = [];
$replace = [];
// loop the matches
foreach ($matches as $match) {
@ -277,7 +277,7 @@ class Css extends Minify
*
* @return string The minified data
*/
public function execute($path = null, $parents = array())
public function execute($path = null, $parents = [])
{
$content = '';
@ -387,15 +387,15 @@ class Css extends Minify
);
// find all relative urls in css
$matches = array();
$matches = [];
foreach ($relativeRegexes as $relativeRegex) {
if (preg_match_all($relativeRegex, $content, $regexMatches, PREG_SET_ORDER)) {
$matches = [...$matches, ...$regexMatches];
}
}
$search = array();
$replace = array();
$search = [];
$replace = [];
// loop all urls
foreach ($matches as $match) {

View File

@ -114,10 +114,10 @@ class Converter implements ConverterInterface
// $path could theoretically be empty (e.g. no path is given), in which
// case it shouldn't expand to array(''), which would compare to one's
// root /
$path1 = $path1 ? explode('/', $path1) : array();
$path2 = $path2 ? explode('/', $path2) : array();
$path1 = $path1 ? explode('/', $path1) : [];
$path2 = $path2 ? explode('/', $path2) : [];
$shared = array();
$shared = [];
// compare paths & strip identical ancestors
foreach ($path1 as $i => $chunk) {

View File

@ -3,6 +3,7 @@ COM_COMPONENTBUILDER_ACCESS_DENIED="Access denied!"
COM_COMPONENTBUILDER_ALL_UNSAVED_WORK_ON_THIS_PAGE_WILL_BE_LOST_ARE_YOU_SURE_YOU_WANT_TO_CONTINUE="All unsaved work on this page will be lost, are you sure you want to continue?"
COM_COMPONENTBUILDER_API="Api"
COM_COMPONENTBUILDER_API_DESC="Sync Portal API"
COM_COMPONENTBUILDER_A_METHOD_SETDYNAMICFZEROLDTHREERS_WAS_ADDED_TO_THE_INSTALL_BSCRIPTPHPB_OF_THIS_PACKAGE_TO_INSURE_THAT_THE_FOLDERS_ARE_COPIED_INTO_THE_CORRECT_PLACE_WHEN_THIS_COMPONENT_IS_INSTALLED="A method (setDynamicF0ld3rs) was added to the install <b>script.php</b> of this package to insure that the folder(s) are copied into the correct place when this component is installed!"
COM_COMPONENTBUILDER_BACKUP_FAILED_PLEASE_TRY_AGAIN_IF_THE_ERROR_CONTINUE_PLEASE_CONTACT_YOUR_SYSTEM_ADMINISTRATOR="Backup failed, please try again. If the error continue, please contact your system administrator."
COM_COMPONENTBUILDER_BACKUP_WAS_DONE_SUCCESSFULLY="Backup was done successfully"
COM_COMPONENTBUILDER_BE_CAUTIOUS_DO_NOT_CONTINUE_UNLESS_YOU_TRUST_THE_ORIGIN_OF_THIS_PACKAGE="Be cautious! Do not continue unless you trust the origin of this package!"
@ -43,6 +44,7 @@ COM_COMPONENTBUILDER_GREAT_THIS_PLACEHOLDER_WILL_WORK="Great, this placeholder w
COM_COMPONENTBUILDER_HFOUR_CLASSNAVHEADERCOPYRIGHTHFOURPSP="<h4 class="nav-header">Copyright</h4><p>%s</p>"
COM_COMPONENTBUILDER_HFOUR_CLASSNAVHEADERLICENSEHFOURPSP="<h4 class="nav-header">License</h4><p>%s</p>"
COM_COMPONENTBUILDER_HR_HTHREECUSTOM_CODES_WARNINGHTHREE="<hr /><h3>Custom Codes Warning</h3>"
COM_COMPONENTBUILDER_HR_HTHREEDYNAMIC_FOLDERS_WERE_DETECTEDHTHREE="<hr /><h3>Dynamic folder(s) were detected.</h3>"
COM_COMPONENTBUILDER_HR_HTHREEEXTERNAL_CODE_ERRORHTHREE="<hr /><h3>External Code Error</h3>"
COM_COMPONENTBUILDER_HR_HTHREEEXTERNAL_CODE_NOTICEHTHREE="<hr /><h3>External Code Notice</h3>"
COM_COMPONENTBUILDER_HR_HTHREEEXTERNAL_CODE_WARNINGHTHREE="<hr /><h3>External Code Warning</h3>"