Adapted the safeName to a global safeFieldName method so to use it all over JCB to safely build field names. gh-427

This commit is contained in:
Llewellyn van der Merwe 2019-06-18 16:12:49 +02:00
parent 8f8546502a
commit e84105c3bd
No known key found for this signature in database
GPG Key ID: CAD7B16D27AF28C5
6 changed files with 110 additions and 63 deletions

View File

@ -150,7 +150,7 @@ TODO
+ *Version*: 2.9.20 + *Version*: 2.9.20
+ *Copyright*: Copyright (C) 2015 - 2019 Vast Development Method. All rights reserved. + *Copyright*: Copyright (C) 2015 - 2019 Vast Development Method. All rights reserved.
+ *License*: GNU General Public License version 2 or later; see LICENSE.txt + *License*: GNU General Public License version 2 or later; see LICENSE.txt
+ *Line count*: **206865** + *Line count*: **206959**
+ *Field count*: **1141** + *Field count*: **1141**
+ *File count*: **1346** + *File count*: **1346**
+ *Folder count*: **209** + *Folder count*: **209**

View File

@ -150,7 +150,7 @@ TODO
+ *Version*: 2.9.20 + *Version*: 2.9.20
+ *Copyright*: Copyright (C) 2015 - 2019 Vast Development Method. All rights reserved. + *Copyright*: Copyright (C) 2015 - 2019 Vast Development Method. All rights reserved.
+ *License*: GNU General Public License version 2 or later; see LICENSE.txt + *License*: GNU General Public License version 2 or later; see LICENSE.txt
+ *Line count*: **206865** + *Line count*: **206959**
+ *Field count*: **1141** + *Field count*: **1141**
+ *File count*: **1346** + *File count*: **1346**
+ *Folder count*: **209** + *Folder count*: **209**

View File

@ -689,13 +689,6 @@ class Get
*/ */
public $minify = 0; public $minify = 0;
/**
* field name builder switch
*
* @var int
*/
public $fieldNameBuilder = 0;
/** /**
* Is Tidy Enabled * Is Tidy Enabled
* *
@ -757,8 +750,6 @@ class Get
$this->params = JComponentHelper::getParams('com_componentbuilder'); $this->params = JComponentHelper::getParams('com_componentbuilder');
// set the minfy switch of the JavaScript // set the minfy switch of the JavaScript
$this->minify = (isset($config['minify']) && $config['minify'] != 2) ? $config['minify'] : $this->params->get('minify', 0); $this->minify = (isset($config['minify']) && $config['minify'] != 2) ? $config['minify'] : $this->params->get('minify', 0);
// field name builder switch between conventions
$this->fieldNameBuilder = $this->params->get('field_name_builder', 0); // change this to 1 for testing the new convention
// set the global language // set the global language
$this->langTag = $this->params->get('language', $this->langTag); $this->langTag = $this->params->get('language', $this->langTag);
// setup the main language array // setup the main language array
@ -2863,7 +2854,7 @@ class Get
* *
* @param object $field The field object * @param object $field The field object
* @param string $listViewName The list view name * @param string $listViewName The list view name
* @param string $amicably The peaceful resolve * @param string $amicably The peaceful resolve (for fields in subforms in same view :)
* *
* @return string Success returns field name * @return string Success returns field name
* *
@ -2881,9 +2872,9 @@ class Get
return 'error'; return 'error';
} }
// set the type name // set the type name
$type_name = $this->safeName($field['settings']->type_name); $type_name = ComponentbuilderHelper::safeFieldName($field['settings']->type_name);
// set the name of the field // set the name of the field
$name = $this->safeName($field['settings']->name); $name = ComponentbuilderHelper::safeFieldName($field['settings']->name);
// check that we have the poperties // check that we have the poperties
if (ComponentbuilderHelper::checkArray($field['settings']->properties)) if (ComponentbuilderHelper::checkArray($field['settings']->properties))
{ {
@ -2917,7 +2908,7 @@ class Get
{ {
// set other category details // set other category details
$this->catOtherName[$listViewName] = array( $this->catOtherName[$listViewName] = array(
'name' => $this->safeName($otherName), 'name' => ComponentbuilderHelper::safeFieldName($otherName),
'views' => ComponentbuilderHelper::safeString($otherViews), 'views' => ComponentbuilderHelper::safeString($otherViews),
'view' => ComponentbuilderHelper::safeString($otherView) 'view' => ComponentbuilderHelper::safeString($otherView)
); );
@ -2937,7 +2928,7 @@ class Get
else else
{ {
// get value from xml // get value from xml
$xml = $this->safeName($this->setPlaceholders(ComponentbuilderHelper::getBetween($field['settings']->xml, 'name="', '"'), $this->placeholders)); $xml = ComponentbuilderHelper::safeFieldName($this->setPlaceholders(ComponentbuilderHelper::getBetween($field['settings']->xml, 'name="', '"'), $this->placeholders));
// check if a value was found // check if a value was found
if (ComponentbuilderHelper::checkString($xml)) if (ComponentbuilderHelper::checkString($xml))
{ {
@ -2960,44 +2951,6 @@ class Get
return $name; return $name;
} }
/**
* Making field names safe
*
* @input string The you would like to make safe
*
* @returns string on success
**/
protected function safeName($string, $spacer = '_')
{
// use the new convention
if (1 == $this->fieldNameBuilder)
{
// 0nly continue if we have a string
if (ComponentbuilderHelper::checkString($string))
{
// check that the first character is not a number
if (is_numeric(substr($string, 0, 1)))
{
$string = ComponentbuilderHelper::replaceNumbers($string);
}
// remove all other strange characters
$string = trim($string);
$string = preg_replace('/'.$spacer.'+/', ' ', $string);
$string = preg_replace('/\s+/', ' ', $string);
// remove all and keep only characters and numbers
$string = preg_replace("/[^A-Za-z0-9 ]/", '', $string);
// replace white space with underscore (SAFEST OPTION)
$string = preg_replace('/\s+/', $spacer, $string);
// default is to return lower
return strtolower($string);
}
// not a string
return '';
}
// use the default (original behaviour/convention)
return ComponentbuilderHelper::safeString($string);
}
/** /**
* Count how many times the same field is used per view * Count how many times the same field is used per view
* *
@ -3041,13 +2994,13 @@ class Get
{ {
$counter = 1; $counter = 1;
// set the unique name // set the unique name
$uniqueName = $this->safeName($name . '_' . $counter); $uniqueName = ComponentbuilderHelper::safeFieldName($name . '_' . $counter);
while (isset($this->uniqueNames[$view]['names'][$uniqueName])) while (isset($this->uniqueNames[$view]['names'][$uniqueName]))
{ {
// increment the number // increment the number
$counter++; $counter++;
// try again // try again
$uniqueName = $this->safeName($name . '_' . $counter); $uniqueName = ComponentbuilderHelper::safeFieldName($name . '_' . $counter);
} }
// set the new name number // set the new name number
$this->uniqueNames[$view]['names'][$uniqueName] = $counter; $this->uniqueNames[$view]['names'][$uniqueName] = $counter;

View File

@ -124,6 +124,54 @@ abstract class ComponentbuilderHelper
'JPATH_THEMES' => JPATH_THEMES 'JPATH_THEMES' => JPATH_THEMES
); );
/**
* The field builder switch
**/
protected static $fieldNameBuilder = false;
/**
* Making field names safe
*
* @input string The you would like to make safe
*
* @returns string on success
**/
public static function safeFieldName($string, $spacer = '_')
{
// get global value
if (self::$fieldNameBuilder === false)
{
self::$fieldNameBuilder = JComponentHelper::getParams('com_componentbuilder')->get('field_name_builder', 0); // change this to 1 for testing the new convention
}
// use the new convention
if (1 == self::$fieldNameBuilder)
{
// 0nly continue if we have a string
if (self::checkString($string))
{
// check that the first character is not a number
if (is_numeric(substr($string, 0, 1)))
{
$string = self::replaceNumbers($string);
}
// remove all other strange characters
$string = trim($string);
$string = preg_replace('/'.$spacer.'+/', ' ', $string);
$string = preg_replace('/\s+/', ' ', $string);
// remove all and keep only characters and numbers
$string = preg_replace("/[^A-Za-z0-9 ]/", '', $string);
// replace white space with underscore (SAFEST OPTION)
$string = preg_replace('/\s+/', $spacer, $string);
// default is to return lower
return strtolower($string);
}
// not a string
return '';
}
// use the default (original behaviour/convention)
return self::safeString($string);
}
/* /*
* Get the Array of Existing Validation Rule Names * Get the Array of Existing Validation Rule Names
* *
@ -1200,13 +1248,13 @@ abstract class ComponentbuilderHelper
} }
else else
{ {
$name = self::safeString(self::getBetween($field->xml,'name="','"')); $name = self::safeFieldName(self::getBetween($field->xml,'name="','"'));
} }
// use field core name only if not found in xml // use field core name only if not found in xml
if (!self::checkString($name)) if (!self::checkString($name))
{ {
$name = self::safeString($field->name);; $name = self::safeFieldName($field->name);
} }
return array('name' => $name, 'type' => $field->type_name); return array('name' => $name, 'type' => $field->type_name);
} }

View File

@ -923,8 +923,6 @@ class ComponentbuilderModelField extends JModelAdmin
// make sure we have the correct values // make sure we have the correct values
if (ComponentbuilderHelper::checkArray($property) && isset($property['name']) && ComponentbuilderHelper::checkString($property['name']) && (isset($property['value']) || 'default' === $property['name'])) if (ComponentbuilderHelper::checkArray($property) && isset($property['name']) && ComponentbuilderHelper::checkString($property['name']) && (isset($property['value']) || 'default' === $property['name']))
{ {
// fix the name (TODO)
// $property['name'] = ComponentbuilderHelper::safeString($property['name']);
// some fixes, just in case (more can be added) // some fixes, just in case (more can be added)
switch ($property['name']) switch ($property['name'])
{ {
@ -937,7 +935,7 @@ class ComponentbuilderModelField extends JModelAdmin
} }
else else
{ {
$property['value'] = ComponentbuilderHelper::safeString($property['value']); $property['value'] = ComponentbuilderHelper::safeFieldName($property['value']);
} }
break; break;
case 'type': case 'type':

View File

@ -124,6 +124,54 @@ abstract class ComponentbuilderHelper
'JPATH_THEMES' => JPATH_THEMES 'JPATH_THEMES' => JPATH_THEMES
); );
/**
* The field builder switch
**/
protected static $fieldNameBuilder = false;
/**
* Making field names safe
*
* @input string The you would like to make safe
*
* @returns string on success
**/
public static function safeFieldName($string, $spacer = '_')
{
// get global value
if (self::$fieldNameBuilder === false)
{
self::$fieldNameBuilder = JComponentHelper::getParams('com_componentbuilder')->get('field_name_builder', 0); // change this to 1 for testing the new convention
}
// use the new convention
if (1 == self::$fieldNameBuilder)
{
// 0nly continue if we have a string
if (self::checkString($string))
{
// check that the first character is not a number
if (is_numeric(substr($string, 0, 1)))
{
$string = self::replaceNumbers($string);
}
// remove all other strange characters
$string = trim($string);
$string = preg_replace('/'.$spacer.'+/', ' ', $string);
$string = preg_replace('/\s+/', ' ', $string);
// remove all and keep only characters and numbers
$string = preg_replace("/[^A-Za-z0-9 ]/", '', $string);
// replace white space with underscore (SAFEST OPTION)
$string = preg_replace('/\s+/', $spacer, $string);
// default is to return lower
return strtolower($string);
}
// not a string
return '';
}
// use the default (original behaviour/convention)
return self::safeString($string);
}
/* /*
* Get the Array of Existing Validation Rule Names * Get the Array of Existing Validation Rule Names
* *
@ -1200,13 +1248,13 @@ abstract class ComponentbuilderHelper
} }
else else
{ {
$name = self::safeString(self::getBetween($field->xml,'name="','"')); $name = self::safeFieldName(self::getBetween($field->xml,'name="','"'));
} }
// use field core name only if not found in xml // use field core name only if not found in xml
if (!self::checkString($name)) if (!self::checkString($name))
{ {
$name = self::safeString($field->name);; $name = self::safeFieldName($field->name);
} }
return array('name' => $name, 'type' => $field->type_name); return array('name' => $name, 'type' => $field->type_name);
} }