* @gitea Joomla Component Builder * @github 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 */ // No direct access to this file defined('_JEXEC') or die('Restricted access'); use VDM\Joomla\Utilities\StringHelper; use VDM\Joomla\Utilities\ArrayHelper; use VDM\Joomla\Utilities\ObjectHelper; use VDM\Joomla\Utilities\GetHelper; use VDM\Joomla\Utilities\String\FieldHelper; use VDM\Joomla\Componentbuilder\Compiler\Factory as CFactory; use VDM\Joomla\Componentbuilder\Compiler\Utilities\Placefix; use VDM\Joomla\Componentbuilder\Compiler\Utilities\Indent; use VDM\Joomla\Componentbuilder\Compiler\Utilities\Line; /** * Compiler class */ class Fields extends Structure { /** * Metadate Switch * * @var array */ public $metadataBuilder = array(); /** * View access Switch * * @var array */ public $accessBuilder = array(); /** * edit view tabs counter * * @var array */ public $tabCounter = array(); /** * layout builder * * @var array */ public $layoutBuilder = array(); /** * permissions builder * * @var array */ public $hasPermissions = array(); /** * used to fix the zero order * * @var array */ private $zeroOrderFix = array(); /** * Site field data * * @var array */ public $siteFieldData = array(); /** * list of fields that are not being escaped * * @var array */ public $doNotEscape = array(); /** * list of classes used in the list view for the fields * * @var array */ public $listFieldClass = array(); /** * tags builder * * @var array */ public $tagsBuilder = array(); /** * query builder * * @var array */ public $queryBuilder = array(); /** * unique keys for database field * * @var array */ public $dbUniqueKeys = array(); /** * unique guid swtich * * @var array */ public $dbUniqueGuid = array(); /** * keys for database field * * @var array */ public $dbKeys = array(); /** * history builder * * @var array */ public $historyBuilder = array(); /** * alias builder * * @var array */ public $aliasBuilder = array(); /** * title builder * * @var array */ public $titleBuilder = array(); /** * list builder * * @var array * @deprecated 3.3 Use CFactory::_('Registry')->get('builder.list'); */ public $listBuilder = array(); /** * custom Builder List * * @var array */ public $customBuilderList = array(); /** * Hidden Fields Builder * * @var array */ public $hiddenFieldsBuilder = array(); /** * INT Field Builder * * @var array */ public $intFieldsBuilder = array(); /** * Dynamic Fields Builder * * @var array */ public $dynamicfieldsBuilder = array(); /** * Main text Builder * * @var array */ public $maintextBuilder = array(); /** * Custom Builder * * @var array */ public $customBuilder = array(); /** * Custom Field Links Builder * * @var array */ public $customFieldLinksBuilder = array(); /** * Set Script for User Switch * * @var array */ public $setScriptUserSwitch = array(); /** * Set Script for Media Switch * * @var array */ public $setScriptMediaSwitch = array(); /** * Category builder * * @var array */ public $categoryBuilder = array(); /** * Category Code builder * * @var array */ public $catCodeBuilder = array(); /** * Check Box builder * * @var array */ public $checkboxBuilder = array(); /** * Json String Builder * * @var array */ public $jsonStringBuilder = array(); /** * Json String Builder for return values to array * * @var array */ public $jsonItemBuilderArray = array(); /** * Json Item Builder * * @var array */ public $jsonItemBuilder = array(); /** * Base 64 Builder * * @var array */ public $base64Builder = array(); /** * Basic Encryption Field Modeling * * @var array */ public $basicFieldModeling = array(); /** * WHMCS Encryption Field Modeling * * @var array */ public $whmcsFieldModeling = array(); /** * Medium Encryption Field Modeling * * @var array */ public $mediumFieldModeling = array(); /** * Expert Field Modeling * * @var array */ public $expertFieldModeling = array(); /** * Expert Mode Initiator * * @var array */ public $expertFieldModelInitiator = array(); /** * Get Items Method List String Fix Builder * * @var array */ public $getItemsMethodListStringFixBuilder = array(); /** * Get Items Method Eximport String Fix Builder * * @var array */ public $getItemsMethodEximportStringFixBuilder = array(); /** * Selection Translation Fix Builder * * @var array */ public $selectionTranslationFixBuilder = array(); /** * Sort Builder * * @var array */ public $sortBuilder = array(); /** * Search Builder * * @var array */ public $searchBuilder = array(); /** * Filter Builder * * @var array */ public $filterBuilder = array(); /** * Set Group Control * * @var array */ public $setGroupControl = array(); /** * Set Field Names * * @var array */ public $fieldsNames = array(); /** * Default Fields set to publishing * * @var array */ public $newPublishingFields = array(); /** * Default Fields set to publishing * * @var array */ public $movedPublishingFields = array(); /** * set the Field set of a view * * @param array $view The view data * @param string $component The component name * @param string $nameSingleCode The single view name * @param string $nameListCode The list view name * * @return string The fields set in xml * */ public function setFieldSet($view, $component, $nameSingleCode, $nameListCode ) { // setup the fieldset of this view if (isset($view['settings']->fields) && ArrayHelper::check($view['settings']->fields)) { // add metadata to the view if (isset($view['metadata']) && $view['metadata']) { $this->metadataBuilder[$nameSingleCode] = $nameListCode; } // add access to the view if (isset($view['access']) && $view['access']) { $this->accessBuilder[$nameSingleCode] = $nameListCode; } // main lang prefix $langView = CFactory::_('Config')->lang_prefix . '_' . CFactory::_('Placeholder')->get('VIEW'); $langViews = CFactory::_('Config')->lang_prefix . '_' . CFactory::_('Placeholder')->get('VIEWS'); // set default lang CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langView, $view['settings']->name_single ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews, $view['settings']->name_list ); // set global item strings CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_N_ITEMS_ARCHIVED', "%s " . $view['settings']->name_list . " archived." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_N_ITEMS_ARCHIVED_1', "%s " . $view['settings']->name_single . " archived." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_N_ITEMS_CHECKED_IN_0', "No " . $view['settings']->name_single . " successfully checked in." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_N_ITEMS_CHECKED_IN_1', "%d " . $view['settings']->name_single . " successfully checked in." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_N_ITEMS_CHECKED_IN_MORE', "%d " . $view['settings']->name_list . " successfully checked in." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_N_ITEMS_DELETED', "%s " . $view['settings']->name_list . " deleted." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_N_ITEMS_DELETED_1', "%s " . $view['settings']->name_single . " deleted." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_N_ITEMS_FEATURED', "%s " . $view['settings']->name_list . " featured." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_N_ITEMS_FEATURED_1', "%s " . $view['settings']->name_single . " featured." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_N_ITEMS_PUBLISHED', "%s " . $view['settings']->name_list . " published." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_N_ITEMS_PUBLISHED_1', "%s " . $view['settings']->name_single . " published." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_N_ITEMS_TRASHED', "%s " . $view['settings']->name_list . " trashed." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_N_ITEMS_TRASHED_1', "%s " . $view['settings']->name_single . " trashed." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_N_ITEMS_UNFEATURED', "%s " . $view['settings']->name_list . " unfeatured." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_N_ITEMS_UNFEATURED_1', "%s " . $view['settings']->name_single . " unfeatured." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_N_ITEMS_UNPUBLISHED', "%s " . $view['settings']->name_list . " unpublished." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_N_ITEMS_UNPUBLISHED_1', "%s " . $view['settings']->name_single . " unpublished." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_N_ITEMS_FAILED_PUBLISHING', "%s " . $view['settings']->name_list . " failed publishing." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_N_ITEMS_FAILED_PUBLISHING_1', "%s " . $view['settings']->name_single . " failed publishing." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_BATCH_OPTIONS', "Batch process the selected " . $view['settings']->name_list ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langViews . '_BATCH_TIP', "All changes will be applied to all selected " . $view['settings']->name_list ); // set some basic defaults CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langView . '_ERROR_UNIQUE_ALIAS', "Another " . $view['settings']->name_single . " has the same alias." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langView . '_CREATED_DATE_LABEL', "Created Date" ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langView . '_CREATED_DATE_DESC', "The date this " . $view['settings']->name_single . " was created." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langView . '_MODIFIED_DATE_LABEL', "Modified Date" ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langView . '_MODIFIED_DATE_DESC', "The date this " . $view['settings']->name_single . " was modified." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langView . '_CREATED_BY_LABEL', "Created By" ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langView . '_CREATED_BY_DESC', "The user that created this " . $view['settings']->name_single . "." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langView . '_MODIFIED_BY_LABEL', "Modified By" ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langView . '_MODIFIED_BY_DESC', "The last user that modified this " . $view['settings']->name_single . "." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langView . '_ORDERING_LABEL', "Ordering" ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langView . '_VERSION_LABEL', "Version" ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langView . '_VERSION_DESC', "A count of the number of times this " . $view['settings']->name_single . " has been revised." ); CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langView . '_SAVE_WARNING', "Alias already existed so a number was added at the end. You can re-edit the " . $view['settings']->name_single . " to customise the alias." ); // check what type of field builder to use if (CFactory::_('Config')->get('field_builder_type', 2) == 1) { // build field set using string manipulation return $this->stringFieldSet( $view, $component, $nameSingleCode, $nameListCode, $langView, $langViews ); } else { // build field set with simpleXMLElement class return $this->simpleXMLFieldSet( $view, $component, $nameSingleCode, $nameListCode, $langView, $langViews ); } } return ''; } /** * build field set using string manipulation * * @param array $view The view data * @param string $component The component name * @param string $nameSingleCode The single view name * @param string $nameListCode The list view name * @param string $langView The language string of the view * @param string $langViews The language string of the views * * @return string The fields set in xml * */ protected function stringFieldSet($view, $component, $nameSingleCode, $nameListCode, $langView, $langViews ) { // set the read only $readOnly = false; if ($view['settings']->type == 2) { $readOnly = Indent::_(3) . 'readonly="true"' . PHP_EOL . Indent::_( 3 ) . 'disabled="true"'; } // start adding dynamc fields $dynamicFields = ''; // set the custom table key $dbkey = 'g'; // for plugin event TODO change event api signatures $placeholders = CFactory::_('Placeholder')->active; // Trigger Event: jcb_ce_onBeforeBuildFields CFactory::_('Event')->trigger( 'jcb_ce_onBeforeBuildFields', array(&$this->componentContext, &$dynamicFields, &$readOnly, &$dbkey, &$view, &$component, &$nameSingleCode, &$nameListCode, &$placeholders, &$langView, &$langViews) ); unset($placeholders); // TODO we should add the global and local view switch if field for front end foreach ($view['settings']->fields as $field) { $dynamicFields .= $this->setDynamicField( $field, $view, $view['settings']->type, $langView, $nameSingleCode, $nameListCode, CFactory::_('Placeholder')->active, $dbkey, true ); } // for plugin event TODO change event api signatures $placeholders = CFactory::_('Placeholder')->active; // Trigger Event: jcb_ce_onAfterBuildFields CFactory::_('Event')->trigger( 'jcb_ce_onAfterBuildFields', array(&$this->componentContext, &$dynamicFields, &$readOnly, &$dbkey, &$view, &$component, &$nameSingleCode, &$nameListCode, &$placeholders, &$langView, &$langViews) ); unset($placeholders); // set the default fields $fieldSet = array(); $fieldSet[] = '
'; $fieldSet[] = Indent::_(2) . ""; $fieldSet[] = Indent::_(2) . ""; // if id is not set if (!isset($this->fieldsNames[$nameSingleCode]['id'])) { $fieldSet[] = Indent::_(2) . ""; // count the static field created $this->fieldCount++; } // if created is not set if (!isset($this->fieldsNames[$nameSingleCode]['created'])) { $fieldSet[] = Indent::_(2) . ""; $fieldSet[] = Indent::_(2) . ""; // count the static field created $this->fieldCount++; } // if created_by is not set if (!isset($this->fieldsNames[$nameSingleCode]['created_by'])) { $fieldSet[] = Indent::_(2) . ""; $fieldSet[] = Indent::_(2) . ""; // count the static field created $this->fieldCount++; } // if published is not set if (!isset($this->fieldsNames[$nameSingleCode]['published'])) { $fieldSet[] = Indent::_(2) . ""; $fieldSet[] = Indent::_(2) . "'; $fieldSet[] = Indent::_(3) . ""; $fieldSet[] = Indent::_(3) . ""; $fieldSet[] = Indent::_(3) . ""; $fieldSet[] = Indent::_(3) . ""; $fieldSet[] = Indent::_(2) . ""; // count the static field created $this->fieldCount++; } // if modified is not set if (!isset($this->fieldsNames[$nameSingleCode]['modified'])) { $fieldSet[] = Indent::_(2) . ""; $fieldSet[] = Indent::_(2) . ''; // count the static field created $this->fieldCount++; } // if modified_by is not set if (!isset($this->fieldsNames[$nameSingleCode]['modified_by'])) { $fieldSet[] = Indent::_(2) . ""; $fieldSet[] = Indent::_(2) . '"; // count the static field created $this->fieldCount++; } // check if view has access if (isset($this->accessBuilder[$nameSingleCode]) && StringHelper::check( $this->accessBuilder[$nameSingleCode] ) && !isset($this->fieldsNames[$nameSingleCode]['access'])) { $fieldSet[] = Indent::_(2) . ""; $fieldSet[] = Indent::_(2) . '"; // count the static field created $this->fieldCount++; } // if ordering is not set if (!isset($this->fieldsNames[$nameSingleCode]['ordering'])) { $fieldSet[] = Indent::_(2) . ""; $fieldSet[] = Indent::_(2) . ""; // count the static field created $this->fieldCount++; } // if version is not set if (!isset($this->fieldsNames[$nameSingleCode]['version'])) { $fieldSet[] = Indent::_(2) . ""; $fieldSet[] = Indent::_(2) . ""; // count the static field created $this->fieldCount++; } // check if metadata is added to this view if (isset($this->metadataBuilder[$nameSingleCode]) && StringHelper::check( $this->metadataBuilder[$nameSingleCode] )) { // metakey if (!isset($this->fieldsNames[$nameSingleCode]['metakey'])) { $fieldSet[] = Indent::_(2) . ""; $fieldSet[] = Indent::_(2) . ""; // count the static field created $this->fieldCount++; } // metadesc if (!isset($this->fieldsNames[$nameSingleCode]['metadesc'])) { $fieldSet[] = Indent::_(2) . ""; $fieldSet[] = Indent::_(2) . ""; // count the static field created $this->fieldCount++; } } // fix the permissions field "title" issue gh-629 // check if the the title is not already set if (!isset($this->fieldsNames[$nameSingleCode]['title']) && $this->hasPermissionsSet($view, $nameSingleCode)) { // set the field/tab name $field_name = "title"; $tab_name = "publishing"; $fieldSet[] = Indent::_(2) . ""; $fieldSet[] = Indent::_(2) . ""; $fieldSet[] = Indent::_(2) . ""; // at this point we know that we must add a hidden title field // and make sure it does not get stored to the database $fieldSet[] = Indent::_(2) . ""; // count the static field created $this->fieldCount++; // setup needed field values for layout $field_array = array(); $field_array['order_edit'] = 0; $field_array['tab'] = 15; $field_array['alignment'] = 1; // make sure it gets added to view $this->setLayoutBuilder( $nameSingleCode, $tab_name, $field_name, $field_array ); } // load the dynamic fields now if (StringHelper::check($dynamicFields)) { $fieldSet[] = Indent::_(2) . "" . $dynamicFields; } // close fieldset $fieldSet[] = Indent::_(1) . "
"; // check if metadata is added to this view if (isset($this->metadataBuilder[$nameSingleCode]) && StringHelper::check( $this->metadataBuilder[$nameSingleCode] )) { if (!isset($this->fieldsNames[$nameSingleCode]['robots']) || !isset($this->fieldsNames[$nameSingleCode]['rights']) || !isset($this->fieldsNames[$nameSingleCode]['author'])) { $fieldSet[] = PHP_EOL . Indent::_(1) . ""; $fieldSet[] = Indent::_(1) . "'; $fieldSet[] = Indent::_(2) . '
'; // robots if (!isset($this->fieldsNames[$nameSingleCode]['robots'])) { $fieldSet[] = Indent::_(3) . ""; $fieldSet[] = Indent::_(3) . ''; $fieldSet[] = Indent::_(4) . ''; $fieldSet[] = Indent::_(4) . ''; $fieldSet[] = Indent::_(4) . ''; $fieldSet[] = Indent::_(4) . ''; $fieldSet[] = Indent::_(4) . ''; $fieldSet[] = Indent::_(3) . ''; // count the static field created $this->fieldCount++; } // author if (!isset($this->fieldsNames[$nameSingleCode]['author'])) { $fieldSet[] = Indent::_(3) . ""; $fieldSet[] = Indent::_(3) . '"; // count the static field created $this->fieldCount++; } // rights if (!isset($this->fieldsNames[$nameSingleCode]['rights'])) { $fieldSet[] = Indent::_(3) . ""; $fieldSet[] = Indent::_(3) . '"; // count the static field created $this->fieldCount++; } $fieldSet[] = Indent::_(2) . "
"; $fieldSet[] = Indent::_(1) . ""; } } // return the set return implode(PHP_EOL, $fieldSet); } /** * build field set with simpleXMLElement class * * @param array $view The view data * @param string $component The component name * @param string $nameSingleCode The single view name * @param string $nameListCode The list view name * @param string $langView The language string of the view * @param string $langViews The language string of the views * * @return string The fields set in xml * */ protected function simpleXMLFieldSet($view, $component, $nameSingleCode, $nameListCode, $langView, $langViews ) { // set the read only $readOnlyXML = array(); if ($view['settings']->type == 2) { $readOnlyXML['readonly'] = true; $readOnlyXML['disabled'] = true; } // start adding dynamc fields $dynamicFieldsXML = array(); // set the custom table key $dbkey = 'g'; // for plugin event TODO change event api signatures $placeholders = CFactory::_('Placeholder')->active; // Trigger Event: jcb_ce_onBeforeBuildFields CFactory::_('Event')->trigger( 'jcb_ce_onBeforeBuildFields', array(&$this->componentContext, &$dynamicFieldsXML, &$readOnlyXML, &$dbkey, &$view, &$component, &$nameSingleCode, &$nameListCode, &$placeholders, &$langView, &$langViews) ); unset($placeholders); // TODO we should add the global and local view switch if field for front end foreach ($view['settings']->fields as $field) { $dynamicFieldsXML[] = $this->setDynamicField( $field, $view, $view['settings']->type, $langView, $nameSingleCode, $nameListCode, CFactory::_('Placeholder')->active, $dbkey, true ); } // for plugin event TODO change event api signatures $placeholders = CFactory::_('Placeholder')->active; // Trigger Event: jcb_ce_onAfterBuildFields CFactory::_('Event')->trigger( 'jcb_ce_onAfterBuildFields', array(&$this->componentContext, &$dynamicFieldsXML, &$readOnlyXML, &$dbkey, &$view, &$component, &$nameSingleCode, &$nameListCode, &$placeholders, &$langView, &$langViews) ); unset($placeholders); // set the default fields $XML = new simpleXMLElement(''); $fieldSetXML = $XML->addChild('fieldset'); $fieldSetXML->addAttribute('name', 'details'); ComponentbuilderHelper::xmlComment( $fieldSetXML, Line::_(__Line__, __Class__) . " Default Fields." ); ComponentbuilderHelper::xmlComment( $fieldSetXML, Line::_(__Line__, __Class__) . " Id Field. Type: Text (joomla)" ); // if id is not set if (!isset($this->fieldsNames[$nameSingleCode]['id'])) { $attributes = array( 'name' => 'id', 'type' => 'text', 'class' => 'readonly', 'readonly' => "true", 'label' => 'JGLOBAL_FIELD_ID_LABEL', 'description' => 'JGLOBAL_FIELD_ID_DESC', 'size' => 10, 'default' => 0 ); $fieldXML = $fieldSetXML->addChild('field'); ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes); // count the static field created $this->fieldCount++; } // if created is not set if (!isset($this->fieldsNames[$nameSingleCode]['created'])) { $attributes = array( 'name' => 'created', 'type' => 'calendar', 'label' => $langView . '_CREATED_DATE_LABEL', 'description' => $langView . '_CREATED_DATE_DESC', 'size' => 22, 'format' => '%Y-%m-%d %H:%M:%S', 'filter' => 'user_utc' ); $attributes = array_merge($attributes, $readOnlyXML); ComponentbuilderHelper::xmlComment( $fieldSetXML, Line::_(__Line__, __Class__) . " Date Created Field. Type: Calendar (joomla)" ); $fieldXML = $fieldSetXML->addChild('field'); ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes); // count the static field created $this->fieldCount++; } // if created_by is not set if (!isset($this->fieldsNames[$nameSingleCode]['created_by'])) { $attributes = array( 'name' => 'created_by', 'type' => 'user', 'label' => $langView . '_CREATED_BY_LABEL', 'description' => $langView . '_CREATED_BY_DESC', ); $attributes = array_merge($attributes, $readOnlyXML); ComponentbuilderHelper::xmlComment( $fieldSetXML, Line::_(__Line__, __Class__) . " User Created Field. Type: User (joomla)" ); $fieldXML = $fieldSetXML->addChild('field'); ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes); // count the static field created $this->fieldCount++; } // if published is not set if (!isset($this->fieldsNames[$nameSingleCode]['published'])) { $attributes = array( 'name' => 'published', 'type' => 'list', 'label' => 'JSTATUS' ); $attributes = array_merge($attributes, $readOnlyXML); ComponentbuilderHelper::xmlComment( $fieldSetXML, Line::_(__Line__, __Class__) . " Published Field. Type: List (joomla)" ); $fieldXML = $fieldSetXML->addChild('field'); ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes); // count the static field created $this->fieldCount++; foreach ( array('JPUBLISHED' => 1, 'JUNPUBLISHED' => 0, 'JARCHIVED' => 2, 'JTRASHED' => -2) as $text => $value ) { $optionXML = $fieldXML->addChild('option'); $optionXML->addAttribute('value', $value); $optionXML[] = $text; } } // if modified is not set if (!isset($this->fieldsNames[$nameSingleCode]['modified'])) { $attributes = array( 'name' => 'modified', 'type' => 'calendar', 'class' => 'readonly', 'label' => $langView . '_MODIFIED_DATE_LABEL', 'description' => $langView . '_MODIFIED_DATE_DESC', 'size' => 22, 'readonly' => "true", 'format' => '%Y-%m-%d %H:%M:%S', 'filter' => 'user_utc' ); ComponentbuilderHelper::xmlComment( $fieldSetXML, Line::_(__Line__, __Class__) . " Date Modified Field. Type: Calendar (joomla)" ); $fieldXML = $fieldSetXML->addChild('field'); ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes); // count the static field created $this->fieldCount++; } // if modified_by is not set if (!isset($this->fieldsNames[$nameSingleCode]['modified_by'])) { $attributes = array( 'name' => 'modified_by', 'type' => 'user', 'label' => $langView . '_MODIFIED_BY_LABEL', 'description' => $langView . '_MODIFIED_BY_DESC', 'class' => 'readonly', 'readonly' => 'true', 'filter' => 'unset' ); ComponentbuilderHelper::xmlComment( $fieldSetXML, Line::_(__Line__, __Class__) . " User Modified Field. Type: User (joomla)" ); $fieldXML = $fieldSetXML->addChild('field'); ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes); // count the static field created $this->fieldCount++; } // check if view has access if (isset($this->accessBuilder[$nameSingleCode]) && StringHelper::check( $this->accessBuilder[$nameSingleCode] ) && !isset($this->fieldsNames[$nameSingleCode]['access'])) { $attributes = array( 'name' => 'access', 'type' => 'accesslevel', 'label' => 'JFIELD_ACCESS_LABEL', 'description' => 'JFIELD_ACCESS_DESC', 'default' => 1, 'required' => "false" ); $attributes = array_merge($attributes, $readOnlyXML); ComponentbuilderHelper::xmlComment( $fieldSetXML, Line::_(__Line__, __Class__) . " Access Field. Type: Accesslevel (joomla)" ); $fieldXML = $fieldSetXML->addChild('field'); ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes); // count the static field created $this->fieldCount++; } // if ordering is not set if (!isset($this->fieldsNames[$nameSingleCode]['ordering'])) { $attributes = array( 'name' => 'ordering', 'type' => 'number', 'class' => 'inputbox validate-ordering', 'label' => $langView . '_ORDERING_LABEL', 'description' => '', 'default' => 0, 'size' => 6, 'required' => "false" ); $attributes = array_merge($attributes, $readOnlyXML); ComponentbuilderHelper::xmlComment( $fieldSetXML, Line::_(__Line__, __Class__) . " Ordering Field. Type: Numbers (joomla)" ); $fieldXML = $fieldSetXML->addChild('field'); ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes); // count the static field created $this->fieldCount++; } // if version is not set if (!isset($this->fieldsNames[$nameSingleCode]['version'])) { $attributes = array( 'name' => 'version', 'type' => 'text', 'class' => 'readonly', 'label' => $langView . '_VERSION_LABEL', 'description' => $langView . '_VERSION_DESC', 'size' => 6, 'readonly' => "true", 'filter' => 'unset' ); ComponentbuilderHelper::xmlComment( $fieldSetXML, Line::_(__Line__, __Class__) . " Version Field. Type: Text (joomla)" ); $fieldXML = $fieldSetXML->addChild('field'); ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes); // count the static field created $this->fieldCount++; } // check if metadata is added to this view if (isset($this->metadataBuilder[$nameSingleCode]) && StringHelper::check( $this->metadataBuilder[$nameSingleCode] )) { // metakey if (!isset($this->fieldsNames[$nameSingleCode]['metakey'])) { $attributes = array( 'name' => 'metakey', 'type' => 'textarea', 'label' => 'JFIELD_META_KEYWORDS_LABEL', 'description' => 'JFIELD_META_KEYWORDS_DESC', 'rows' => 3, 'cols' => 30 ); ComponentbuilderHelper::xmlComment( $fieldSetXML, Line::_(__Line__, __Class__) . " Metakey Field. Type: Textarea (joomla)" ); $fieldXML = $fieldSetXML->addChild('field'); ComponentbuilderHelper::xmlAddAttributes( $fieldXML, $attributes ); // count the static field created $this->fieldCount++; } // metadesc if (!isset($this->fieldsNames[$nameSingleCode]['metadesc'])) { $attributes['name'] = 'metadesc'; $attributes['label'] = 'JFIELD_META_DESCRIPTION_LABEL'; $attributes['description'] = 'JFIELD_META_DESCRIPTION_DESC'; ComponentbuilderHelper::xmlComment( $fieldSetXML, Line::_(__Line__, __Class__) . " Metadesc Field. Type: Textarea (joomla)" ); $fieldXML = $fieldSetXML->addChild('field'); ComponentbuilderHelper::xmlAddAttributes( $fieldXML, $attributes ); // count the static field created $this->fieldCount++; } } // fix the permissions field "title" issue gh-629 // check if the the title is not already set if (!isset($this->fieldsNames[$nameSingleCode]['title']) && $this->hasPermissionsSet($view, $nameSingleCode)) { // set the field/tab name $field_name = "title"; $tab_name = "publishing"; $attributes = array( 'name' => $field_name, 'type' => 'hidden', 'default' => $component . ' ' . $nameSingleCode ); ComponentbuilderHelper::xmlComment( $fieldSetXML, Line::_(__Line__, __Class__) . " Was added due to Permissions JS needing a Title field" ); ComponentbuilderHelper::xmlComment( $fieldSetXML, Line::_(__Line__, __Class__) . " Let us know at gh-629 should this change" ); ComponentbuilderHelper::xmlComment( $fieldSetXML, Line::_(__Line__, __Class__) . " https://github.com/vdm-io/Joomla-Component-Builder/issues/629#issuecomment-750117235" ); $fieldXML = $fieldSetXML->addChild('field'); ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes); // count the static field created $this->fieldCount++; // setup needed field values for layout $field_array = array(); $field_array['order_edit'] = 0; $field_array['tab'] = 15; $field_array['alignment'] = 1; // make sure it gets added to view $this->setLayoutBuilder( $nameSingleCode, $tab_name, $field_name, $field_array ); } // load the dynamic fields now if (count((array) $dynamicFieldsXML)) { ComponentbuilderHelper::xmlComment( $fieldSetXML, Line::_(__Line__, __Class__) . " Dynamic Fields." ); foreach ($dynamicFieldsXML as $dynamicfield) { ComponentbuilderHelper::xmlAppend($fieldSetXML, $dynamicfield); } } // check if metadata is added to this view if (isset($this->metadataBuilder[$nameSingleCode]) && StringHelper::check( $this->metadataBuilder[$nameSingleCode] )) { if (!isset($this->fieldsNames[$nameSingleCode]['robots']) || !isset($this->fieldsNames[$nameSingleCode]['author']) || !isset($this->fieldsNames[$nameSingleCode]['rights'])) { ComponentbuilderHelper::xmlComment( $fieldSetXML, Line::_(__Line__, __Class__) . " Metadata Fields" ); $fieldsXML = $fieldSetXML->addChild('fields'); $fieldsXML->addAttribute('name', 'metadata'); $fieldsXML->addAttribute( 'label', 'JGLOBAL_FIELDSET_METADATA_OPTIONS' ); $fieldsFieldSetXML = $fieldsXML->addChild('fieldset'); $fieldsFieldSetXML->addAttribute('name', 'vdmmetadata'); $fieldsFieldSetXML->addAttribute( 'label', 'JGLOBAL_FIELDSET_METADATA_OPTIONS' ); // robots if (!isset($this->fieldsNames[$nameSingleCode]['robots'])) { ComponentbuilderHelper::xmlComment( $fieldsFieldSetXML, Line::_(__Line__, __Class__) . " Robots Field. Type: List (joomla)" ); $robots = $fieldsFieldSetXML->addChild('field'); $attributes = array( 'name' => 'robots', 'type' => 'list', 'label' => 'JFIELD_METADATA_ROBOTS_LABEL', 'description' => 'JFIELD_METADATA_ROBOTS_DESC' ); ComponentbuilderHelper::xmlAddAttributes( $robots, $attributes ); // count the static field created $this->fieldCount++; $options = array( 'JGLOBAL_USE_GLOBAL' => '', 'JGLOBAL_INDEX_FOLLOW' => 'index, follow', 'JGLOBAL_NOINDEX_FOLLOW' => 'noindex, follow', 'JGLOBAL_INDEX_NOFOLLOW' => 'index, nofollow', 'JGLOBAL_NOINDEX_NOFOLLOW' => 'noindex, nofollow', ); foreach ($options as $text => $value) { $option = $robots->addChild('option'); $option->addAttribute('value', $value); $option[] = $text; } } // author if (!isset($this->fieldsNames[$nameSingleCode]['author'])) { ComponentbuilderHelper::xmlComment( $fieldsFieldSetXML, Line::_(__Line__, __Class__) . " Author Field. Type: Text (joomla)" ); $author = $fieldsFieldSetXML->addChild('field'); $attributes = array( 'name' => 'author', 'type' => 'text', 'label' => 'JAUTHOR', 'description' => 'JFIELD_METADATA_AUTHOR_DESC', 'size' => 20 ); ComponentbuilderHelper::xmlAddAttributes( $author, $attributes ); // count the static field created $this->fieldCount++; } // rights if (!isset($this->fieldsNames[$nameSingleCode]['rights'])) { ComponentbuilderHelper::xmlComment( $fieldsFieldSetXML, Line::_(__Line__, __Class__) . " Rights Field. Type: Textarea (joomla)" ); $rights = $fieldsFieldSetXML->addChild('field'); $attributes = array( 'name' => 'rights', 'type' => 'textarea', 'label' => 'JFIELD_META_RIGHTS_LABEL', 'description' => 'JFIELD_META_RIGHTS_DESC', 'required' => 'false', 'filter' => 'string', 'cols' => 30, 'rows' => 2 ); ComponentbuilderHelper::xmlAddAttributes( $rights, $attributes ); // count the static field created $this->fieldCount++; } } } // return the set return $this->xmlPrettyPrint($XML, 'fieldset'); } /** * Check to see if a view has permissions * * @param array $view View details * @param string $nameSingleCode View Single Code Name * * @return boolean true if it has permisssions * */ protected function hasPermissionsSet(&$view, &$nameSingleCode) { // first check if we have checked this already if (!isset($this->hasPermissions[$nameSingleCode])) { // default is false $this->hasPermissions[$nameSingleCode] = false; // when a view has history, it has permissions // since it tracks the version access if (isset($view['history']) && $view['history'] == 1) { // set the permission for later $this->hasPermissions[$nameSingleCode] = true; // break out here return true; } // check if the view has permissions if (isset($view['settings']) && ArrayHelper::check( $view['settings']->permissions, true )) { foreach ($view['settings']->permissions as $per) { // check if the permission targets the view // 1 = view // 3 = both view & component if (isset($per['implementation']) && ( $per['implementation'] == 1 || $per['implementation'] == 3 )) { // set the permission for later $this->hasPermissions[$nameSingleCode] = true; // break out here return true; } } } // check if the fields has permissions if (isset($view['settings']) && ArrayHelper::check( $view['settings']->fields, true )) { foreach ($view['settings']->fields as $field) { // if a field has any permissions // the a view has permissions if (isset($field['permission']) && ArrayHelper::check( $field['permission'], true )) { // set the permission for later $this->hasPermissions[$nameSingleCode] = true; // break out here return true; } } } } return $this->hasPermissions[$nameSingleCode]; } /** * set Field Names * * @param string $view View the field belongs to * @param string $name The name of the field * * */ public function setFieldsNames(&$view, &$name) { $this->fieldsNames[$view][$name] = $name; } /** * set Dynamic field * * @param array $field The field data * @param array $view The view data * @param int $viewType The view type * @param string $langView The language string of the view * @param string $nameSingleCode The single view name * @param string $nameListCode The list view name * @param array $placeholders The place holder and replace values * @param string $dbkey The the custom table key * @param boolean $build The switch to set the build option * * @return SimpleXMLElement The complete field in xml * */ public function setDynamicField(&$field, &$view, &$viewType, &$langView, &$nameSingleCode, &$nameListCode, &$placeholders, &$dbkey, $build ) { // set default return if (CFactory::_('Config')->get('field_builder_type', 2) == 1) { // string manipulation $dynamicField = ''; } else { // simpleXMLElement class $dynamicField = false; } // make sure we have settings if (isset($field['settings']) && ObjectHelper::check( $field['settings'] )) { // reset some values $name = CFactory::_('Field.Name')->get($field, $nameListCode); $typeName = CFactory::_('Field.Type.Name')->get($field); $multiple = false; $langLabel = ''; $fieldSet = ''; $fieldAttributes = array(); // set field attributes $fieldAttributes = $this->setFieldAttributes( $field, $viewType, $name, $typeName, $multiple, $langLabel, $langView, $nameListCode, $nameSingleCode, $placeholders ); // check if values were set if (ArrayHelper::check($fieldAttributes)) { // set the array of field names $this->setFieldsNames( $nameSingleCode, $fieldAttributes['name'] ); if (ComponentbuilderHelper::fieldCheck($typeName, 'option')) { //reset options array $optionArray = array(); // now add to the field set $dynamicField = $this->setField( 'option', $fieldAttributes, $name, $typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $optionArray ); if ($build) { // set builders $this->setBuilders( $langLabel, $langView, $nameSingleCode, $nameListCode, $name, $view, $field, $typeName, $multiple, false, $optionArray ); } } elseif (ComponentbuilderHelper::fieldCheck($typeName, 'spacer')) { if ($build) { // make sure spacers gets loaded to layout $tabName = ''; if (isset($view['settings']->tabs) && isset($view['settings']->tabs[(int) $field['tab']])) { $tabName = $view['settings']->tabs[(int) $field['tab']]; } elseif ((int) $field['tab'] == 15) { // set to publishing tab $tabName = 'publishing'; } $this->setLayoutBuilder( $nameSingleCode, $tabName, $name, $field ); } // now add to the field set $dynamicField = $this->setField( 'spacer', $fieldAttributes, $name, $typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $optionArray ); } elseif (ComponentbuilderHelper::fieldCheck( $typeName, 'special' )) { // set the repeatable field or subform field if ($typeName === 'repeatable' || $typeName === 'subform') { if ($build) { // set builders $this->setBuilders( $langLabel, $langView, $nameSingleCode, $nameListCode, $name, $view, $field, $typeName, $multiple, false ); } // now add to the field set $dynamicField = $this->setField( 'special', $fieldAttributes, $name, $typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $optionArray ); } } elseif (isset($fieldAttributes['custom']) && ArrayHelper::check( $fieldAttributes['custom'] )) { // set the custom array $custom = $fieldAttributes['custom']; unset($fieldAttributes['custom']); // set db key $custom['db'] = $dbkey; // increment the db key $dbkey++; if ($build) { // set builders $this->setBuilders( $langLabel, $langView, $nameSingleCode, $nameListCode, $name, $view, $field, $typeName, $multiple, $custom ); } // now add to the field set $dynamicField = $this->setField( 'custom', $fieldAttributes, $name, $typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $optionArray, $custom ); } else { if ($build) { // set builders $this->setBuilders( $langLabel, $langView, $nameSingleCode, $nameListCode, $name, $view, $field, $typeName, $multiple ); } // now add to the field set $dynamicField = $this->setField( 'plain', $fieldAttributes, $name, $typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $optionArray ); } } } return $dynamicField; } /** * build field set * * @param array $fields The fields data * @param string $langView The language string of the view * @param string $nameSingleCode The single view name * @param string $nameListCode The list view name * @param array $placeholders The place holder and replace values * @param string $dbkey The the custom table key * @param boolean $build The switch to set the build option * @param int $return_type The return type 1 = string, 2 = array * * @return mix The complete field in xml * */ public function getFieldsetXML(&$fields, &$langView, &$nameSingleCode, &$nameListCode, &$placeholders, &$dbkey, $build = false, $return_type = 1 ) { // set some defaults $view = ''; $viewType = 0; // build the fieldset if ($return_type == 1) { $fieldset = ''; } else { $fieldset = array(); } // loop over the fields to build if (ArrayHelper::check($fields)) { foreach ($fields as $field) { // get the field $xmlField = $this->getFieldXMLString( $field, $view, $viewType, $langView, $nameSingleCode, $nameListCode, $placeholders, $dbkey, $build ); // make sure the xml is set and a string if (isset($xmlField) && StringHelper::check( $xmlField )) { if ($return_type == 1) { $fieldset .= $xmlField; } else { $fieldset[] = $xmlField; } } } } return $fieldset; } /** * build field string * * @param array $field The field data * @param array $view The view data * @param int $viewType The view type * @param string $langView The language string of the view * @param string $nameSingleCode The single view name * @param string $nameListCode The list view name * @param array $placeholders The place holder and replace values * @param string $dbkey The the custom table key * @param boolean $build The switch to set the build option * * @return string The complete field in xml-string * */ public function getFieldXMLString(&$field, &$view, &$viewType, &$langView, &$nameSingleCode, &$nameListCode, &$placeholders, &$dbkey, $build = false ) { // check the field builder type $xmlField = ''; if (CFactory::_('Config')->get('field_builder_type', 2) == 1) { // string manipulation $xmlField = $this->setDynamicField( $field, $view, $viewType, $langView, $nameSingleCode, $nameListCode, $placeholders, $dbkey, $build ); } else { // simpleXMLElement class $newxmlField = $this->setDynamicField( $field, $view, $viewType, $langView, $nameSingleCode, $nameListCode, $placeholders, $dbkey, $build ); if (isset($newxmlField->fieldXML)) { $xmlField = dom_import_simplexml( $newxmlField->fieldXML ); $xmlField = PHP_EOL . Indent::_(2) . "' . PHP_EOL . Indent::_(1) . $this->xmlPrettyPrint( $xmlField, 'field' ); } } // return the string return $xmlField; } /** * set a field * * @param string $setType The set of fields type * @param array $fieldAttributes The field values * @param string $name The field name * @param string $typeName The field type * @param string $langView The language string of the view * @param string $nameSingleCode The single view name * @param string $nameListCode The list view name * @param array $placeholders The place holder and replace values * @param string $optionArray The option bucket array used to set the field options if needed. * @param array $custom Used when field is from config * @param string $taber The tabs to add in layout (only in string manipulation) * * @return SimpleXMLElement The field in xml * */ private function setField($setType, &$fieldAttributes, &$name, &$typeName, &$langView, &$nameSingleCode, &$nameListCode, $placeholders, &$optionArray, $custom = null, $taber = '' ) { // count the dynamic fields created $this->fieldCount++; // check what type of field builder to use if (CFactory::_('Config')->get('field_builder_type', 2) == 1) { // build field set using string manipulation return $this->stringSetField( $setType, $fieldAttributes, $name, $typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $optionArray, $custom, $taber ); } else { // build field set with simpleXMLElement class return $this->simpleXMLSetField( $setType, $fieldAttributes, $name, $typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $optionArray, $custom ); } } /** * set a field using string manipulation * * @param string $setType The set of fields type * @param array $fieldAttributes The field values * @param string $name The field name * @param string $typeName The field type * @param string $langView The language string of the view * @param string $nameSingleCode The single view name * @param string $nameListCode The list view name * @param array $placeholders The place holder and replace values * @param string $optionArray The option bucket array used to set the field options if needed. * @param array $custom Used when field is from config * @param string $taber The tabs to add in layout * * @return SimpleXMLElement The field in xml * */ protected function stringSetField($setType, &$fieldAttributes, &$name, &$typeName, &$langView, &$nameSingleCode, &$nameListCode, $placeholders, &$optionArray, $custom = null, $taber = '' ) { $field = ''; if ($setType === 'option') { // now add to the field set $field .= PHP_EOL . Indent::_(1) . $taber . Indent::_(1) . ""; $field .= PHP_EOL . Indent::_(1) . $taber . Indent::_(1) . " $value) { if ($property != 'option') { $field .= PHP_EOL . Indent::_(2) . $taber . Indent::_(1) . $property . '="' . $value . '"'; } elseif ($property === 'option') { $optionSet = ''; if (strtolower($typeName) === 'groupedlist' && strpos( $value, ',' ) !== false && strpos($value, '@@') !== false) { // reset the group temp arrays $groups_ = array(); $grouped_ = array('group' => array(), 'option' => array()); $order_ = array(); // mulitpal options $options = explode(',', $value); foreach ($options as $option) { if (strpos($option, '@@') !== false) { // set the group label $valueKeyArray = explode('@@', $option); if (count((array) $valueKeyArray) == 2) { $langValue = $langView . '_' . FieldHelper::safe( $valueKeyArray[0], true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $valueKeyArray[0] ); // now add group label $groups_[$valueKeyArray[1]] = PHP_EOL . Indent::_(1) . $taber . Indent::_(2) . ''; // set order $order_['group' . $valueKeyArray[1]] = $valueKeyArray[1]; } } elseif (strpos($option, '|') !== false) { // has other value then text $valueKeyArray = explode('|', $option); if (count((array) $valueKeyArray) == 3) { $langValue = $langView . '_' . FieldHelper::safe( $valueKeyArray[1], true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $valueKeyArray[1] ); // now add to option set $grouped_['group'][$valueKeyArray[2]][] = PHP_EOL . Indent::_(1) . $taber . Indent::_(3) . ''; $optionArray[$valueKeyArray[0]] = $langValue; // set order $order_['group' . $valueKeyArray[2]] = $valueKeyArray[2]; } else { $langValue = $langView . '_' . FieldHelper::safe( $valueKeyArray[1], true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $valueKeyArray[1] ); // now add to option set $grouped_['option'][$valueKeyArray[0]] = PHP_EOL . Indent::_(1) . $taber . Indent::_(2) . ''; $optionArray[$valueKeyArray[0]] = $langValue; // set order $order_['option' . $valueKeyArray[0]] = $valueKeyArray[0]; } } else { // text is also the value $langValue = $langView . '_' . FieldHelper::safe( $option, true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $option ); // now add to option set $grouped_['option'][$option] = PHP_EOL . Indent::_(1) . $taber . Indent::_(2) . ''; $optionArray[$option] = $langValue; // set order $order_['option' . $option] = $option; } } // now build the groups foreach ($order_ as $pointer_ => $_id) { // load the default key $key_ = 'group'; if (strpos($pointer_, 'option') !== false) { // load the option field $key_ = 'option'; } // check if this is a group loader if ('group' === $key_ && isset($groups_[$_id]) && isset($grouped_[$key_][$_id]) && ArrayHelper::check( $grouped_[$key_][$_id] )) { // set group label $optionSet .= $groups_[$_id]; foreach ($grouped_[$key_][$_id] as $option_) { $optionSet .= $option_; } unset($groups_[$_id]); unset($grouped_[$key_][$_id]); // close the group $optionSet .= PHP_EOL . Indent::_(1) . $taber . Indent::_(2) . ''; } elseif (isset($grouped_[$key_][$_id]) && StringHelper::check( $grouped_[$key_][$_id] )) { $optionSet .= $grouped_[$key_][$_id]; } } } elseif (strpos($value, ',') !== false) { // mulitpal options $options = explode(',', $value); foreach ($options as $option) { if (strpos($option, '|') !== false) { // has other value then text list($v, $t) = explode('|', $option); $langValue = $langView . '_' . FieldHelper::safe( $t, true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $t ); // now add to option set $optionSet .= PHP_EOL . Indent::_(1) . $taber . Indent::_(2) . ''; $optionArray[$v] = $langValue; } else { // text is also the value $langValue = $langView . '_' . FieldHelper::safe( $option, true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $option ); // now add to option set $optionSet .= PHP_EOL . Indent::_(2) . $taber . Indent::_(1) . ''; $optionArray[$option] = $langValue; } } } else { // one option if (strpos($value, '|') !== false) { // has other value then text list($v, $t) = explode('|', $value); $langValue = $langView . '_' . FieldHelper::safe( $t, true ); // add to lang array CFactory::_('Language')->set(CFactory::_('Config')->lang_target, $langValue, $t); // now add to option set $optionSet .= PHP_EOL . Indent::_(2) . $taber . Indent::_(1) . ''; $optionArray[$v] = $langValue; } else { // text is also the value $langValue = $langView . '_' . FieldHelper::safe( $value, true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $value ); // now add to option set $optionSet .= PHP_EOL . Indent::_(2) . $taber . Indent::_(1) . ''; $optionArray[$value] = $langValue; } } } } // if options were found if (StringHelper::check($optionSet)) { $field .= '>'; $field .= PHP_EOL . Indent::_(3) . $taber . ""; $field .= $optionSet; $field .= PHP_EOL . Indent::_(2) . $taber . ""; } // if no options found and must have a list of options elseif (ComponentbuilderHelper::fieldCheck($typeName, 'list')) { $optionArray = false; $field .= PHP_EOL . Indent::_(2) . $taber . "/>"; $field .= PHP_EOL . Indent::_(2) . $taber . "" . PHP_EOL; } else { $optionArray = false; $field .= PHP_EOL . Indent::_(2) . $taber . "/>"; } } elseif ($setType === 'plain') { // now add to the field set $field .= PHP_EOL . Indent::_(2) . $taber . ""; $field .= PHP_EOL . Indent::_(2) . $taber . " $value) { if ($property != 'option') { $field .= PHP_EOL . Indent::_(2) . $taber . Indent::_(1) . $property . '="' . $value . '"'; } } $field .= PHP_EOL . Indent::_(2) . $taber . "/>"; } elseif ($setType === 'spacer') { // now add to the field set $field .= PHP_EOL . Indent::_(2) . ""; $field .= PHP_EOL . Indent::_(2) . " $value) { if ($property != 'option') { $field .= " " . $property . '="' . $value . '"'; } } $field .= " />"; } elseif ($setType === 'special') { // set the repeatable field if ($typeName === 'repeatable') { // now add to the field set $field .= PHP_EOL . Indent::_(2) . ""; $field .= PHP_EOL . Indent::_(2) . " $value) { if ($property != 'fields') { $field .= PHP_EOL . Indent::_(3) . $property . '="' . $value . '"'; } } $field .= ">"; $field .= PHP_EOL . Indent::_(3) . ''; $field .= PHP_EOL . Indent::_(4) . '"; $field .= PHP_EOL . Indent::_(3) . ""; $field .= PHP_EOL . Indent::_(2) . ""; } // set the subform fields (it is a repeatable without the modal) elseif ($typeName === 'subform') { // now add to the field set $field .= PHP_EOL . Indent::_(2) . $taber . ""; $field .= PHP_EOL . Indent::_(2) . $taber . " $value) { if ($property != 'fields') { $field .= PHP_EOL . Indent::_(3) . $taber . $property . '="' . $value . '"'; } } $field .= ">"; $field .= PHP_EOL . Indent::_(3) . $taber . '"; $field .= PHP_EOL . Indent::_(2) . $taber . ""; } } elseif ($setType === 'custom') { // now add to the field set $field .= PHP_EOL . Indent::_(2) . $taber . ""; $field .= PHP_EOL . Indent::_(2) . $taber . " $value) { if ($property != 'option') { $field .= PHP_EOL . Indent::_(2) . $taber . Indent::_(1) . $property . '="' . $value . '"'; } elseif ($property === 'option') { $optionSet = ''; if (strtolower($typeName) === 'groupedlist' && strpos( $value, ',' ) !== false && strpos($value, '@@') !== false) { // reset the group temp arrays $groups_ = array(); $grouped_ = array('group' => array(), 'option' => array()); $order_ = array(); // mulitpal options $options = explode(',', $value); foreach ($options as $option) { if (strpos($option, '@@') !== false) { // set the group label $valueKeyArray = explode('@@', $option); if (count((array) $valueKeyArray) == 2) { $langValue = $langView . '_' . FieldHelper::safe( $valueKeyArray[0], true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $valueKeyArray[0] ); // now add group label $groups_[$valueKeyArray[1]] = PHP_EOL . Indent::_(1) . $taber . Indent::_(2) . ''; // set order $order_['group' . $valueKeyArray[1]] = $valueKeyArray[1]; } } elseif (strpos($option, '|') !== false) { // has other value then text $valueKeyArray = explode('|', $option); if (count((array) $valueKeyArray) == 3) { $langValue = $langView . '_' . FieldHelper::safe( $valueKeyArray[1], true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $valueKeyArray[1] ); // now add to option set $grouped_['group'][$valueKeyArray[2]][] = PHP_EOL . Indent::_(1) . $taber . Indent::_(3) . ''; $optionArray[$valueKeyArray[0]] = $langValue; // set order $order_['group' . $valueKeyArray[2]] = $valueKeyArray[2]; } else { $langValue = $langView . '_' . FieldHelper::safe( $valueKeyArray[1], true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $valueKeyArray[1] ); // now add to option set $grouped_['option'][$valueKeyArray[0]] = PHP_EOL . Indent::_(1) . $taber . Indent::_(2) . ''; $optionArray[$valueKeyArray[0]] = $langValue; // set order $order_['option' . $valueKeyArray[0]] = $valueKeyArray[0]; } } else { // text is also the value $langValue = $langView . '_' . FieldHelper::safe( $option, true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $option ); // now add to option set $grouped_['option'][$option] = PHP_EOL . Indent::_(1) . $taber . Indent::_(2) . ''; $optionArray[$option] = $langValue; // set order $order_['option' . $option] = $option; } } // now build the groups foreach ($order_ as $pointer_ => $_id) { // load the default key $key_ = 'group'; if (strpos($pointer_, 'option') !== false) { // load the option field $key_ = 'option'; } // check if this is a group loader if ('group' === $key_ && isset($groups_[$_id]) && isset($grouped_[$key_][$_id]) && ArrayHelper::check( $grouped_[$key_][$_id] )) { // set group label $optionSet .= $groups_[$_id]; foreach ($grouped_[$key_][$_id] as $option_) { $optionSet .= $option_; } unset($groups_[$_id]); unset($grouped_[$key_][$_id]); // close the group $optionSet .= PHP_EOL . Indent::_(1) . $taber . Indent::_(2) . ''; } elseif (isset($grouped_[$key_][$_id]) && StringHelper::check( $grouped_[$key_][$_id] )) { $optionSet .= $grouped_[$key_][$_id]; } } } elseif (strpos($value, ',') !== false) { // mulitpal options $options = explode(',', $value); foreach ($options as $option) { if (strpos($option, '|') !== false) { // has other value then text list($v, $t) = explode('|', $option); $langValue = $langView . '_' . FieldHelper::safe( $t, true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $t ); // now add to option set $optionSet .= PHP_EOL . Indent::_(1) . $taber . Indent::_(2) . ''; $optionArray[$v] = $langValue; } else { // text is also the value $langValue = $langView . '_' . FieldHelper::safe( $option, true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $option ); // now add to option set $optionSet .= PHP_EOL . Indent::_(2) . $taber . Indent::_(1) . ''; $optionArray[$option] = $langValue; } } } else { // one option if (strpos($value, '|') !== false) { // has other value then text list($v, $t) = explode('|', $value); $langValue = $langView . '_' . FieldHelper::safe( $t, true ); // add to lang array CFactory::_('Language')->set(CFactory::_('Config')->lang_target, $langValue, $t); // now add to option set $optionSet .= PHP_EOL . Indent::_(2) . $taber . Indent::_(1) . ''; $optionArray[$v] = $langValue; } else { // text is also the value $langValue = $langView . '_' . FieldHelper::safe( $value, true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $value ); // now add to option set $optionSet .= PHP_EOL . Indent::_(2) . $taber . Indent::_(1) . ''; $optionArray[$value] = $langValue; } } } } // if options were found if (StringHelper::check($optionSet)) { $field .= '>'; $field .= PHP_EOL . Indent::_(3) . $taber . ""; $field .= $optionSet; $field .= PHP_EOL . Indent::_(2) . $taber . ""; } // if no options found and must have a list of options elseif (ComponentbuilderHelper::fieldCheck($typeName, 'list')) { $optionArray = false; $field .= PHP_EOL . Indent::_(2) . $taber . "/>"; $field .= PHP_EOL . Indent::_(2) . $taber . "" . PHP_EOL; } else { $optionArray = false; $field .= PHP_EOL . Indent::_(2) . $taber . "/>"; } // incase the field is in the config and has not been set if ('config' === $nameSingleCode && 'configs' === $nameListCode || (strpos($nameSingleCode, 'P|uG!n') !== false || strpos( $nameSingleCode, 'M0dU|3' ) !== false)) { // set lang (just incase) $listLangName = $langView . '_' . StringHelper::safe($name, 'U'); // set the custom array $data = array('type' => $typeName, 'code' => $name, 'lang' => $listLangName, 'custom' => $custom); // set the custom field file $this->setCustomFieldTypeFile( $data, $nameListCode, $nameSingleCode ); } } // return field return $field; } /** * set a field with simpleXMLElement class * * @param string $setType The set of fields type * @param array $fieldAttributes The field values * @param string $name The field name * @param string $typeName The field type * @param string $langView The language string of the view * @param string $nameSingleCode The single view name * @param string $nameListCode The list view name * @param array $placeholders The place holder and replace values * @param string $optionArray The option bucket array used to set the field options if needed. * @param array $custom Used when field is from config * * @return SimpleXMLElement The field in xml * */ protected function simpleXMLSetField($setType, &$fieldAttributes, &$name, &$typeName, &$langView, &$nameSingleCode, &$nameListCode, $placeholders, &$optionArray, $custom = null ) { $field = new stdClass(); if ($setType === 'option') { // now add to the field set $field->fieldXML = new SimpleXMLElement(''); $field->comment = Line::_(__Line__, __Class__) . " " . ucfirst($name) . " Field. Type: " . StringHelper::safe( $typeName, 'F' ) . ". (joomla)"; foreach ($fieldAttributes as $property => $value) { if ($property != 'option') { $field->fieldXML->addAttribute($property, $value); } elseif ($property === 'option') { ComponentbuilderHelper::xmlComment( $field->fieldXML, Line::_(__Line__, __Class__) . " Option Set." ); if (strtolower($typeName) === 'groupedlist' && strpos( $value, ',' ) !== false && strpos($value, '@@') !== false) { // reset the group temp arrays $groups_ = array(); $grouped_ = array('group' => array(), 'option' => array()); $order_ = array(); // mulitpal options $options = explode(',', $value); foreach ($options as $option) { if (strpos($option, '@@') !== false) { // set the group label $valueKeyArray = explode('@@', $option); if (count((array) $valueKeyArray) == 2) { $langValue = $langView . '_' . FieldHelper::safe( $valueKeyArray[0], true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $valueKeyArray[0] ); // now add group label $groups_[$valueKeyArray[1]] = $langValue; // set order $order_['group' . $valueKeyArray[1]] = $valueKeyArray[1]; } } elseif (strpos($option, '|') !== false) { // has other value then text $valueKeyArray = explode('|', $option); if (count((array) $valueKeyArray) == 3) { $langValue = $langView . '_' . FieldHelper::safe( $valueKeyArray[1], true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $valueKeyArray[1] ); // now add to option set $grouped_['group'][$valueKeyArray[2]][] = array('value' => $valueKeyArray[0], 'text' => $langValue); $optionArray[$valueKeyArray[0]] = $langValue; // set order $order_['group' . $valueKeyArray[2]] = $valueKeyArray[2]; } else { $langValue = $langView . '_' . FieldHelper::safe( $valueKeyArray[1], true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $valueKeyArray[1] ); // now add to option set $grouped_['option'][$valueKeyArray[0]] = array('value' => $valueKeyArray[0], 'text' => $langValue); $optionArray[$valueKeyArray[0]] = $langValue; // set order $order_['option' . $valueKeyArray[0]] = $valueKeyArray[0]; } } else { // text is also the value $langValue = $langView . '_' . FieldHelper::safe( $option, true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $option ); // now add to option set $grouped_['option'][$option] = array('value' => $option, 'text' => $langValue); $optionArray[$option] = $langValue; // set order $order_['option' . $option] = $option; } } // now build the groups foreach ($order_ as $pointer_ => $_id) { // load the default key $key_ = 'group'; if (strpos($pointer_, 'option') !== false) { // load the option field $key_ = 'option'; } // check if this is a group loader if ('group' === $key_ && isset($groups_[$_id]) && isset($grouped_[$key_][$_id]) && ArrayHelper::check( $grouped_[$key_][$_id] )) { // set group label $groupXML = $field->fieldXML->addChild('group'); $groupXML->addAttribute( 'label', $groups_[$_id] ); foreach ($grouped_[$key_][$_id] as $option_) { $groupOptionXML = $groupXML->addChild( 'option' ); $groupOptionXML->addAttribute( 'value', $option_['value'] ); $groupOptionXML[] = $option_['text']; } unset($groups_[$_id]); unset($grouped_[$key_][$_id]); } elseif (isset($grouped_[$key_][$_id]) && StringHelper::check( $grouped_[$key_][$_id] )) { $optionXML = $field->fieldXML->addChild( 'option' ); $optionXML->addAttribute( 'value', $grouped_[$key_][$_id]['value'] ); $optionXML[] = $grouped_[$key_][$_id]['text']; } } } elseif (strpos($value, ',') !== false) { // mulitpal options $options = explode(',', $value); foreach ($options as $option) { $optionXML = $field->fieldXML->addChild('option'); if (strpos($option, '|') !== false) { // has other value then text list($v, $t) = explode('|', $option); $langValue = $langView . '_' . FieldHelper::safe( $t, true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $t ); // now add to option set $optionXML->addAttribute('value', $v); $optionArray[$v] = $langValue; } else { // text is also the value $langValue = $langView . '_' . FieldHelper::safe( $option, true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $option ); // now add to option set $optionXML->addAttribute('value', $option); $optionArray[$option] = $langValue; } $optionXML[] = $langValue; } } else { // one option $optionXML = $field->fieldXML->addChild('option'); if (strpos($value, '|') !== false) { // has other value then text list($v, $t) = explode('|', $value); $langValue = $langView . '_' . FieldHelper::safe( $t, true ); // add to lang array CFactory::_('Language')->set(CFactory::_('Config')->lang_target, $langValue, $t); // now add to option set $optionXML->addAttribute('value', $v); $optionArray[$v] = $langValue; } else { // text is also the value $langValue = $langView . '_' . FieldHelper::safe( $value, true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $value ); // now add to option set $optionXML->addAttribute('value', $value); $optionArray[$value] = $langValue; } $optionXML[] = $langValue; } } } // if no options found and must have a list of options if (!$field->fieldXML->count() && ComponentbuilderHelper::fieldCheck($typeName, 'list')) { ComponentbuilderHelper::xmlComment( $field->fieldXML, Line::_(__Line__, __Class__) . " No Manual Options Were Added In Field Settings." ); } } elseif ($setType === 'plain') { // now add to the field set $field->fieldXML = new SimpleXMLElement(''); $field->comment = Line::_(__Line__, __Class__) . " " . ucfirst($name) . " Field. Type: " . StringHelper::safe( $typeName, 'F' ) . ". (joomla)"; foreach ($fieldAttributes as $property => $value) { if ($property != 'option') { $field->fieldXML->addAttribute($property, $value); } } } elseif ($setType === 'spacer') { // now add to the field set $field->fieldXML = new SimpleXMLElement(''); $field->comment = Line::_(__Line__, __Class__) . " " . ucfirst($name) . " Field. Type: " . StringHelper::safe( $typeName, 'F' ) . ". A None Database Field. (joomla)"; foreach ($fieldAttributes as $property => $value) { if ($property != 'option') { $field->fieldXML->addAttribute($property, $value); } } } elseif ($setType === 'special') { // set the repeatable field if ($typeName === 'repeatable') { // now add to the field set $field->fieldXML = new SimpleXMLElement(''); $field->comment = Line::_(__Line__, __Class__) . " " . ucfirst( $name ) . " Field. Type: " . StringHelper::safe( $typeName, 'F' ) . ". (depreciated)"; foreach ($fieldAttributes as $property => $value) { if ($property != 'fields') { $field->fieldXML->addAttribute($property, $value); } } $fieldsXML = $field->fieldXML->addChild('fields'); $fieldsXML->addAttribute( 'name', $fieldAttributes['name'] . '_fields' ); $fieldsXML->addAttribute('label', ''); $fieldSetXML = $fieldsXML->addChild('fieldset'); $fieldSetXML->addAttribute('hidden', 'true'); $fieldSetXML->addAttribute( 'name', $fieldAttributes['name'] . '_modal' ); $fieldSetXML->addAttribute('repeat', 'true'); if (strpos($fieldAttributes['fields'], ',') !== false) { // mulitpal fields $fieldsSets = (array) explode( ',', $fieldAttributes['fields'] ); } elseif (is_numeric($fieldAttributes['fields'])) { // single field $fieldsSets[] = (int) $fieldAttributes['fields']; } // only continue if we have a field set if (ArrayHelper::check($fieldsSets)) { // set the resolver $_resolverKey = $fieldAttributes['name']; // load the field data $fieldsSets = array_map( function ($id) use ( $nameSingleCode, $nameListCode, $_resolverKey ) { // start field $field = array(); $field['field'] = $id; // set the field details CFactory::_('Field')->set( $field, $nameSingleCode, $nameListCode, $_resolverKey ); // return field return $field; }, array_values($fieldsSets) ); // start the build foreach ($fieldsSets as $fieldData) { // if we have settings continue if (ObjectHelper::check( $fieldData['settings'] )) { $r_name = CFactory::_('Field.Name')->get( $fieldData, $nameListCode, $_resolverKey ); $r_typeName = CFactory::_('Field.Type.Name')->get($fieldData); $r_multiple = false; $r_langLabel = ''; // get field values $r_fieldValues = $this->setFieldAttributes( $fieldData, $view, $r_name, $r_typeName, $r_multiple, $r_langLabel, $langView, $nameListCode, $nameSingleCode, $placeholders, true ); // check if values were set if (ArrayHelper::check( $r_fieldValues )) { //reset options array $r_optionArray = array(); if (ComponentbuilderHelper::fieldCheck( $r_typeName, 'option' )) { // now add to the field set ComponentbuilderHelper::xmlAppend( $fieldSetXML, $this->setField( 'option', $r_fieldValues, $r_name, $r_typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $r_optionArray ) ); } elseif (isset($r_fieldValues['custom']) && ArrayHelper::check( $r_fieldValues['custom'] )) { // add to custom $custom = $r_fieldValues['custom']; unset($r_fieldValues['custom']); // now add to the field set ComponentbuilderHelper::xmlAppend( $fieldSetXML, $this->setField( 'custom', $r_fieldValues, $r_name, $r_typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $r_optionArray ) ); // set lang (just incase) $r_listLangName = $langView . '_' . FieldHelper::safe( $r_name, true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $r_listLangName, StringHelper::safe( $r_name, 'W' ) ); // if label was set use instead if (StringHelper::check( $r_langLabel )) { $r_listLangName = $r_langLabel; } // set the custom array $data = array('type' => $r_typeName, 'code' => $r_name, 'lang' => $r_listLangName, 'custom' => $custom); // set the custom field file $this->setCustomFieldTypeFile( $data, $nameListCode, $nameSingleCode ); } else { // now add to the field set ComponentbuilderHelper::xmlAppend( $fieldSetXML, $this->setField( 'plain', $r_fieldValues, $r_name, $r_typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $r_optionArray ) ); } } } } } } // set the subform fields (it is a repeatable without the modal) elseif ($typeName === 'subform') { // now add to the field set $field->fieldXML = new SimpleXMLElement(''); $field->comment = Line::_(__Line__, __Class__) . " " . ucfirst( $name ) . " Field. Type: " . StringHelper::safe( $typeName, 'F' ) . ". (joomla)"; // add all properties foreach ($fieldAttributes as $property => $value) { if ($property != 'fields' && $property != 'formsource') { $field->fieldXML->addAttribute($property, $value); } } // if we detect formsource we do not add the form if (isset($fieldAttributes['formsource']) && StringHelper::check( $fieldAttributes['formsource'] )) { $field->fieldXML->addAttribute( 'formsource', $fieldAttributes['formsource'] ); } // add the form else { $form = $field->fieldXML->addChild('form'); $attributes = array( 'hidden' => 'true', 'name' => 'list_' . $fieldAttributes['name'] . '_modal', 'repeat' => 'true' ); ComponentbuilderHelper::xmlAddAttributes( $form, $attributes ); if (strpos($fieldAttributes['fields'], ',') !== false) { // multiple fields $fieldsSets = (array) explode( ',', $fieldAttributes['fields'] ); } elseif (is_numeric($fieldAttributes['fields'])) { // single field $fieldsSets[] = (int) $fieldAttributes['fields']; } // only continue if we have a field set if (ArrayHelper::check($fieldsSets)) { // set the resolver $_resolverKey = $fieldAttributes['name']; // load the field data $fieldsSets = array_map( function ($id) use ( $nameSingleCode, $nameListCode, $_resolverKey ) { // start field $field = array(); $field['field'] = $id; // set the field details CFactory::_('Field')->set( $field, $nameSingleCode, $nameListCode, $_resolverKey ); // return field return $field; }, array_values($fieldsSets) ); // start the build foreach ($fieldsSets as $fieldData) { // if we have settings continue if (ObjectHelper::check( $fieldData['settings'] )) { $r_name = CFactory::_('Field.Name')->get( $fieldData, $nameListCode, $_resolverKey ); $r_typeName = CFactory::_('Field.Type.Name')->get($fieldData); $r_multiple = false; $r_langLabel = ''; // get field values $r_fieldValues = $this->setFieldAttributes( $fieldData, $view, $r_name, $r_typeName, $r_multiple, $r_langLabel, $langView, $nameListCode, $nameSingleCode, $placeholders, true ); // check if values were set if (ArrayHelper::check( $r_fieldValues )) { //reset options array $r_optionArray = array(); if (ComponentbuilderHelper::fieldCheck( $r_typeName, 'option' )) { // now add to the field set ComponentbuilderHelper::xmlAppend( $form, $this->setField( 'option', $r_fieldValues, $r_name, $r_typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $r_optionArray ) ); } elseif ($r_typeName === 'subform') { // set nested depth if (isset($fieldAttributes['nested_depth'])) { $r_fieldValues['nested_depth'] = ++$fieldAttributes['nested_depth']; } else { $r_fieldValues['nested_depth'] = 1; } // only continue if nest is bellow 20 (this should be a safe limit) if ($r_fieldValues['nested_depth'] <= 20) { // now add to the field set ComponentbuilderHelper::xmlAppend( $form, $this->setField( 'special', $r_fieldValues, $r_name, $r_typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $r_optionArray ) ); } } elseif (isset($r_fieldValues['custom']) && ArrayHelper::check( $r_fieldValues['custom'] )) { // add to custom $custom = $r_fieldValues['custom']; unset($r_fieldValues['custom']); // now add to the field set ComponentbuilderHelper::xmlAppend( $form, $this->setField( 'custom', $r_fieldValues, $r_name, $r_typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $r_optionArray ) ); // set lang (just incase) $r_listLangName = $langView . '_' . FieldHelper::safe( $r_name, true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $r_listLangName, StringHelper::safe( $r_name, 'W' ) ); // if label was set use instead if (StringHelper::check( $r_langLabel )) { $r_listLangName = $r_langLabel; } // set the custom array $data = array('type' => $r_typeName, 'code' => $r_name, 'lang' => $r_listLangName, 'custom' => $custom); // set the custom field file $this->setCustomFieldTypeFile( $data, $nameListCode, $nameSingleCode ); } else { // now add to the field set ComponentbuilderHelper::xmlAppend( $form, $this->setField( 'plain', $r_fieldValues, $r_name, $r_typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $r_optionArray ) ); } } } } } } } } elseif ($setType === 'custom') { // now add to the field set $field->fieldXML = new SimpleXMLElement(''); $field->comment = Line::_(__Line__, __Class__) . " " . ucfirst($name) . " Field. Type: " . StringHelper::safe( $typeName, 'F' ) . ". (custom)"; foreach ($fieldAttributes as $property => $value) { if ($property != 'option') { $field->fieldXML->addAttribute($property, $value); } elseif ($property === 'option') { ComponentbuilderHelper::xmlComment( $field->fieldXML, Line::_(__Line__, __Class__) . " Option Set." ); if (strtolower($typeName) === 'groupedlist' && strpos( $value, ',' ) !== false && strpos($value, '@@') !== false) { // reset the group temp arrays $groups_ = array(); $grouped_ = array('group' => array(), 'option' => array()); $order_ = array(); // mulitpal options $options = explode(',', $value); foreach ($options as $option) { if (strpos($option, '@@') !== false) { // set the group label $valueKeyArray = explode('@@', $option); if (count((array) $valueKeyArray) == 2) { $langValue = $langView . '_' . FieldHelper::safe( $valueKeyArray[0], true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $valueKeyArray[0] ); // now add group label $groups_[$valueKeyArray[1]] = $langValue; // set order $order_['group' . $valueKeyArray[1]] = $valueKeyArray[1]; } } elseif (strpos($option, '|') !== false) { // has other value then text $valueKeyArray = explode('|', $option); if (count((array) $valueKeyArray) == 3) { $langValue = $langView . '_' . FieldHelper::safe( $valueKeyArray[1], true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $valueKeyArray[1] ); // now add to option set $grouped_['group'][$valueKeyArray[2]][] = array('value' => $valueKeyArray[0], 'text' => $langValue); $optionArray[$valueKeyArray[0]] = $langValue; // set order $order_['group' . $valueKeyArray[2]] = $valueKeyArray[2]; } else { $langValue = $langView . '_' . FieldHelper::safe( $valueKeyArray[1], true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $valueKeyArray[1] ); // now add to option set $grouped_['option'][$valueKeyArray[0]] = array('value' => $valueKeyArray[0], 'text' => $langValue); $optionArray[$valueKeyArray[0]] = $langValue; // set order $order_['option' . $valueKeyArray[0]] = $valueKeyArray[0]; } } else { // text is also the value $langValue = $langView . '_' . FieldHelper::safe( $option, true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $option ); // now add to option set $grouped_['option'][$option] = array('value' => $option, 'text' => $langValue); $optionArray[$option] = $langValue; // set order $order_['option' . $option] = $option; } } // now build the groups foreach ($order_ as $pointer_ => $_id) { // load the default key $key_ = 'group'; if (strpos($pointer_, 'option') !== false) { // load the option field $key_ = 'option'; } // check if this is a group loader if ('group' === $key_ && isset($groups_[$_id]) && isset($grouped_[$key_][$_id]) && ArrayHelper::check( $grouped_[$key_][$_id] )) { // set group label $groupXML = $field->fieldXML->addChild('group'); $groupXML->addAttribute( 'label', $groups_[$_id] ); foreach ($grouped_[$key_][$_id] as $option_) { $groupOptionXML = $groupXML->addChild( 'option' ); $groupOptionXML->addAttribute( 'value', $option_['value'] ); $groupOptionXML[] = $option_['text']; } unset($groups_[$_id]); unset($grouped_[$key_][$_id]); } elseif (isset($grouped_[$key_][$_id]) && StringHelper::check( $grouped_[$key_][$_id] )) { $optionXML = $field->fieldXML->addChild( 'option' ); $optionXML->addAttribute( 'value', $grouped_[$key_][$_id]['value'] ); $optionXML[] = $grouped_[$key_][$_id]['text']; } } } elseif (strpos($value, ',') !== false) { // municipal options $options = explode(',', $value); foreach ($options as $option) { $optionXML = $field->fieldXML->addChild('option'); if (strpos($option, '|') !== false) { // has other value then text list($v, $t) = explode('|', $option); $langValue = $langView . '_' . FieldHelper::safe( $t, true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $t ); // now add to option set $optionXML->addAttribute('value', $v); $optionArray[$v] = $langValue; } else { // text is also the value $langValue = $langView . '_' . FieldHelper::safe( $option, true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $option ); // now add to option set $optionXML->addAttribute('value', $option); $optionArray[$option] = $langValue; } $optionXML[] = $langValue; } } else { // one option $optionXML = $field->fieldXML->addChild('option'); if (strpos($value, '|') !== false) { // has other value then text list($v, $t) = explode('|', $value); $langValue = $langView . '_' . FieldHelper::safe( $t, true ); // add to lang array CFactory::_('Language')->set(CFactory::_('Config')->lang_target, $langValue, $t); // now add to option set $optionXML->addAttribute('value', $v); $optionArray[$v] = $langValue; } else { // text is also the value $langValue = $langView . '_' . FieldHelper::safe( $value, true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $langValue, $value ); // now add to option set $optionXML->addAttribute('value', $value); $optionArray[$value] = $langValue; } $optionXML[] = $langValue; } } } // incase the field is in the config and has not been set (or is part of a plugin or module) if (('config' === $nameSingleCode && 'configs' === $nameListCode) || (strpos($nameSingleCode, 'P|uG!n') !== false || strpos( $nameSingleCode, 'M0dU|3' ) !== false)) { // set lang (just incase) $listLangName = $langView . '_' . StringHelper::safe($name, 'U'); // set the custom array $data = array('type' => $typeName, 'code' => $name, 'lang' => $listLangName, 'custom' => $custom); // set the custom field file $this->setCustomFieldTypeFile( $data, $nameListCode, $nameSingleCode ); } } return $field; } /** * set the layout builder * * @param string $nameSingleCode The single edit view code name * @param string $tabName The tab code name * @param string $name The field code name * @param array $field The field details * * @return void * */ public function setLayoutBuilder(&$nameSingleCode, &$tabName, &$name, &$field ) { // first fix the zero order // to insure it lands before all the other fields // as zero is expected to behave if ($field['order_edit'] == 0) { if (!isset($this->zeroOrderFix[$nameSingleCode])) { $this->zeroOrderFix[$nameSingleCode] = array(); } if (!isset($this->zeroOrderFix[$nameSingleCode][(int) $field['tab']])) { $this->zeroOrderFix[$nameSingleCode][(int) $field['tab']] = -999; } else { $this->zeroOrderFix[$nameSingleCode][(int) $field['tab']]++; } $field['order_edit'] = $this->zeroOrderFix[$nameSingleCode][(int) $field['tab']]; } // now build the layout if (StringHelper::check($tabName) && strtolower($tabName) != 'publishing') { $this->tabCounter[$nameSingleCode][(int) $field['tab']] = $tabName; if (isset($this->layoutBuilder[$nameSingleCode][$tabName][(int) $field['alignment']][(int) $field['order_edit']])) { $size = (int) count( (array) $this->layoutBuilder[$nameSingleCode][$tabName][(int) $field['alignment']] ) + 1; while (isset($this->layoutBuilder[$nameSingleCode][$tabName][(int) $field['alignment']][$size])) { $size++; } $this->layoutBuilder[$nameSingleCode][$tabName][(int) $field['alignment']][$size] = $name; } else { $this->layoutBuilder[$nameSingleCode][$tabName][(int) $field['alignment']][(int) $field['order_edit']] = $name; } // check if default fields were over written if (in_array($name, $this->defaultFields)) { // just to eliminate $this->movedPublishingFields[$nameSingleCode][$name] = $name; } } elseif ($tabName === 'publishing' || $tabName === 'Publishing') { if (!in_array($name, $this->defaultFields)) { if (isset($this->newPublishingFields[$nameSingleCode][(int) $field['alignment']][(int) $field['order_edit']])) { $size = (int) count( (array) $this->newPublishingFields[$nameSingleCode][(int) $field['alignment']] ) + 1; while (isset($this->newPublishingFields[$nameSingleCode][(int) $field['alignment']][$size])) { $size++; } $this->newPublishingFields[$nameSingleCode][(int) $field['alignment']][$size] = $name; } else { $this->newPublishingFields[$nameSingleCode][(int) $field['alignment']][(int) $field['order_edit']] = $name; } } } else { $this->tabCounter[$nameSingleCode][1] = 'Details'; if (isset($this->layoutBuilder[$nameSingleCode]['Details'][(int) $field['alignment']][(int) $field['order_edit']])) { $size = (int) count( (array) $this->layoutBuilder[$nameSingleCode]['Details'][(int) $field['alignment']] ) + 1; while (isset($this->layoutBuilder[$nameSingleCode]['Details'][(int) $field['alignment']][$size])) { $size++; } $this->layoutBuilder[$nameSingleCode]['Details'][(int) $field['alignment']][$size] = $name; } else { $this->layoutBuilder[$nameSingleCode]['Details'][(int) $field['alignment']][(int) $field['order_edit']] = $name; } // check if default fields were over written if (in_array($name, $this->defaultFields)) { // just to eliminate $this->movedPublishingFields[$nameSingleCode][$name] = $name; } } } /** * build the site field data needed * * @param string $view The single edit view code name * @param string $field The field name * @param string $set The decoding set this field belongs to * @param string $type The field type * * @return void * */ public function buildSiteFieldData($view, $field, $set, $type) { $decode = array('json', 'base64', 'basic_encryption', 'whmcs_encryption', 'medium_encryption', 'expert_mode'); $textareas = array('textarea', 'editor'); if (isset($this->siteFields[$view][$field]) && ArrayHelper::check( $this->siteFields[$view][$field] )) { foreach ($this->siteFields[$view][$field] as $codeString => $array) { // get the code array $codeArray = explode('___', $codeString); // set the code $code = trim($codeArray[0]); // set the decoding methods if (in_array($set, $decode)) { if (isset($this->siteFieldData['decode'][$array['site']][$code][$array['as']][$array['key']]) && isset($this->siteFieldData['decode'][$array['site']][$code][$array['as']][$array['key']]['decode'])) { if (!in_array( $set, $this->siteFieldData['decode'][$array['site']][$code][$array['as']][$array['key']]['decode'] )) { $this->siteFieldData['decode'][$array['site']][$code][$array['as']][$array['key']]['decode'][] = $set; } } else { $this->siteFieldData['decode'][$array['site']][$code][$array['as']][$array['key']] = array('decode' => array($set), 'type' => $type, 'admin_view' => $view); } } // set the uikit checker if ((2 == $this->uikit || 1 == $this->uikit) && in_array( $type, $textareas )) { $this->siteFieldData['uikit'][$array['site']][$code][$array['as']][$array['key']] = $array; } // set the textareas checker if (in_array($type, $textareas)) { $this->siteFieldData['textareas'][$array['site']][$code][$array['as']][$array['key']] = $array; } } } } /** * set field attributes * * @param array $field The field data * @param int $viewType The view type * @param string $name The field name * @param string $typeName The field type * @param boolean $multiple The switch to set multiple selection option * @param string $langLabel The language string for field label * @param string $langView The language string of the view * @param string $nameListCode The list view name * @param string $nameSingleCode The single view name * @param array $placeholders The place holder and replace values * @param boolean $repeatable The repeatable field switch * * @return array The field attributes * */ private function setFieldAttributes(&$field, &$viewType, &$name, &$typeName, &$multiple, &$langLabel, $langView, $nameListCode, $nameSingleCode, $placeholders, $repeatable = false ) { // reset array $fieldAttributes = array(); $setCustom = false; $setReadonly = false; // setup joomla default fields if (!ComponentbuilderHelper::fieldCheck($typeName)) { $fieldAttributes['custom'] = array(); // is this an own custom field if (isset($field['settings']->own_custom)) { $fieldAttributes['custom']['own_custom'] = $field['settings']->own_custom; } $setCustom = true; } // setup a default field if (ArrayHelper::check($field['settings']->properties)) { // we need a deeper php code search tracker $phpTracker = array(); foreach ($field['settings']->properties as $property) { // reset $xmlValue = ''; $langValue = ''; if ($property['name'] === 'type') { // get type name $xmlValue = $typeName; // add to custom if it is custom if ($setCustom) { // set the type just to make sure. $fieldAttributes['custom']['type'] = $typeName; } } elseif ($property['name'] === 'name') { // get the actual field name $xmlValue = CFactory::_('Placeholder')->update($name, $placeholders); } elseif ($property['name'] === 'validate') { // check if we have validate (validation rule set) $xmlValue = GetHelper::between( $field['settings']->xml, 'validate="', '"' ); if (StringHelper::check($xmlValue)) { $xmlValue = StringHelper::safe( $xmlValue ); } } elseif ($property['name'] === 'extension' || $property['name'] === 'directory' || $property['name'] === 'formsource') { // get value & replace the placeholders $xmlValue = CFactory::_('Placeholder')->update( GetHelper::between( $field['settings']->xml, $property['name'] . '="', '"' ), $placeholders ); } // catch all PHP here elseif (strpos($property['name'], 'type_php') !== false && $setCustom) { // set the line number $phpLine = (int) preg_replace( '/[^0-9]/', '', $property['name'] ); // set the type key $phpKey = (string) trim( str_replace( 'type_', '', preg_replace('/[0-9]+/', '', $property['name']) ), '_' ); // load the php for the custom field file $fieldAttributes['custom'][$phpKey][$phpLine] = CFactory::_('Customcode')->update( ComponentbuilderHelper::openValidBase64( GetHelper::between( $field['settings']->xml, $property['name'] . '="', '"' ) ) ); // load tracker $phpTracker['type_' . $phpKey] = $phpKey; } elseif ($property['name'] === 'prime_php' && $setCustom) { // load the php for the custom field file $fieldAttributes['custom']['prime_php'] = (int) GetHelper::between( $field['settings']->xml, $property['name'] . '="', '"' ); } elseif ($property['name'] === 'extends' && $setCustom) { // load the class that is being extended $fieldAttributes['custom']['extends'] = GetHelper::between( $field['settings']->xml, 'extends="', '"' ); } elseif ($property['name'] === 'view' && $setCustom) { // load the view name & replace the placeholders $fieldAttributes['custom']['view'] = StringHelper::safe( CFactory::_('Placeholder')->update( GetHelper::between( $field['settings']->xml, 'view="', '"' ), $placeholders ) ); } elseif ($property['name'] === 'views' && $setCustom) { // load the views name & replace the placeholders $fieldAttributes['custom']['views'] = StringHelper::safe( CFactory::_('Placeholder')->update( GetHelper::between( $field['settings']->xml, 'views="', '"' ), $placeholders ) ); } elseif ($property['name'] === 'component' && $setCustom) { // load the component name & replace the placeholders $fieldAttributes['custom']['component'] = CFactory::_('Placeholder')->update( GetHelper::between( $field['settings']->xml, 'component="', '"' ), $placeholders ); } elseif ($property['name'] === 'table' && $setCustom) { // load the main table that is queried & replace the placeholders $fieldAttributes['custom']['table'] = CFactory::_('Placeholder')->update( GetHelper::between( $field['settings']->xml, 'table="', '"' ), $placeholders ); } elseif ($property['name'] === 'value_field' && $setCustom) { // load the text key $fieldAttributes['custom']['text'] = StringHelper::safe( GetHelper::between( $field['settings']->xml, 'value_field="', '"' ) ); } elseif ($property['name'] === 'key_field' && $setCustom) { // load the id key $fieldAttributes['custom']['id'] = StringHelper::safe( GetHelper::between( $field['settings']->xml, 'key_field="', '"' ) ); } elseif ($property['name'] === 'button' && $repeatable && $setCustom) { // dont load the button to repeatable $xmlValue = 'false'; // do not add button $fieldAttributes['custom']['add_button'] = 'false'; } elseif ($property['name'] === 'button' && $setCustom) { // load the button string value if found $xmlValue = (string) StringHelper::safe( GetHelper::between( $field['settings']->xml, 'button="', '"' ) ); // add to custom values $fieldAttributes['custom']['add_button'] = (StringHelper::check($xmlValue) || 1 == $xmlValue) ? $xmlValue : 'false'; } elseif ($property['name'] === 'required' && 'repeatable' === $typeName) { // dont load the required to repeatable field type $xmlValue = 'false'; } elseif ($viewType == 2 && ($property['name'] === 'readonly' || $property['name'] === 'disabled')) { // set read only $xmlValue = 'true'; // trip the switch for readonly if ($property['name'] === 'readonly') { $setReadonly = true; } } elseif ($property['name'] === 'multiple') { $xmlValue = (string) GetHelper::between( $field['settings']->xml, $property['name'] . '="', '"' ); // add the multipal if ('true' === $xmlValue) { $multiple = true; } } // make sure the name is added as a cless name for use in javascript elseif ($property['name'] === 'class' && ($typeName === 'note' || $typeName === 'spacer')) { $xmlValue = GetHelper::between( $field['settings']->xml, 'class="', '"' ); // add the type class if (StringHelper::check($xmlValue)) { if (strpos($xmlValue, $name) === false) { $xmlValue = $xmlValue . ' ' . $name; } } else { $xmlValue = $name; } } else { // set the rest of the fields $xmlValue = (string) CFactory::_('Placeholder')->update( GetHelper::between( $field['settings']->xml, $property['name'] . '="', '"' ), $placeholders ); } // check if translatable if (StringHelper::check($xmlValue) && isset($property['translatable']) && $property['translatable'] == 1) { // update label if field use multiple times if ($property['name'] === 'label') { if (isset($fieldAttributes['name']) && CFactory::_('Registry')->get("unique.names.$nameListCode.names." . $fieldAttributes['name']) !== null) { $xmlValue .= ' (' . StringHelper::safe( CFactory::_('Registry')->get("unique.names.$nameListCode.names." . $fieldAttributes['name']) ) . ')'; } } // replace placeholders $xmlValue = CFactory::_('Placeholder')->update( $xmlValue, $placeholders ); // insure custom lables dont get messed up if ($setCustom) { $customLabel = $xmlValue; } // set lang key $langValue = $langView . '_' . FieldHelper::safe( $name . ' ' . $property['name'], true ); // add to lang array CFactory::_('Language')->set(CFactory::_('Config')->lang_target, $langValue, $xmlValue); // use lang value $xmlValue = $langValue; } elseif (isset($field['alias']) && $field['alias'] && isset($property['translatable']) && $property['translatable'] == 1) { if ($property['name'] === 'label') { $xmlValue = 'JFIELD_ALIAS_LABEL'; } elseif ($property['name'] === 'description') { $xmlValue = 'JFIELD_ALIAS_DESC'; } elseif ($property['name'] === 'hint') { $xmlValue = 'JFIELD_ALIAS_PLACEHOLDER'; } } elseif (isset($field['title']) && $field['title'] && isset($property['translatable']) && $property['translatable'] == 1) { if ($property['name'] === 'label') { $xmlValue = 'JGLOBAL_TITLE'; } } // only load value if found or is mandatory if (StringHelper::check($xmlValue) || (isset($property['mandatory']) && $property['mandatory'] == 1 && !$setCustom)) { // make sure mantory fields are added if (!StringHelper::check($xmlValue)) { if (isset($property['example']) && StringHelper::check( $property['example'] )) { $xmlValue = $property['example']; } } // load to langBuilder down the line if ($property['name'] === 'label') { if ($setCustom) { $fieldAttributes['custom']['label'] = $customLabel; } $langLabel = $xmlValue; } // now set the value $fieldAttributes[$property['name']] = $xmlValue; } // validate that the default field is set elseif ($property['name'] === 'default' && ($xmlValidateValue = GetHelper::between( $field['settings']->xml, 'default="', '"', 'none-set' )) !== 'none-set') { // we must allow empty defaults $fieldAttributes['default'] = $xmlValue; } } // check if all php is loaded using the tracker if (ArrayHelper::check($phpTracker)) { // litle search validation $confirmation = '8qvZHoyuFYQqpj0YQbc6F3o5DhBlmS-_-a8pmCZfOVSfANjkmV5LG8pCdAY2JNYu6cB'; foreach ($phpTracker as $searchKey => $phpKey) { // we must search for more code in the xml just encase foreach (range(2, 30) as $phpLine) { $get_ = $searchKey . '_' . $phpLine; if (!isset($fieldAttributes['custom'][$phpKey][$phpLine]) && ($value = ComponentbuilderHelper::getValueFromXMLstring( $field['settings']->xml, $get_, $confirmation )) !== $confirmation) { $fieldAttributes['custom'][$phpKey][$phpLine] = CFactory::_('Customcode')->update( ComponentbuilderHelper::openValidBase64($value) ); } } } } // do some nice twigs beyond the default if (isset($fieldAttributes['name'])) { // check if we have class value for the list view of this field $listclass = GetHelper::between( $field['settings']->xml, 'listclass="', '"' ); if (StringHelper::check($listclass)) { $this->listFieldClass[$nameListCode][$fieldAttributes['name']] = $listclass; } // check if we find reason to remove this field from being escaped $escaped = GetHelper::between( $field['settings']->xml, 'escape="', '"' ); if (StringHelper::check($escaped)) { $this->doNotEscape[$nameListCode][] = $fieldAttributes['name']; } // check if we have display switch for dynamic placement $display = GetHelper::between( $field['settings']->xml, 'display="', '"' ); if (StringHelper::check($display)) { $fieldAttributes['display'] = $display; } // make sure validation is set if found (even it not part of field properties) if (!isset($fieldAttributes['validate'])) { // check if we have validate (validation rule set) $validationRule = GetHelper::between( $field['settings']->xml, 'validate="', '"' ); if (StringHelper::check($validationRule)) { $fieldAttributes['validate'] = StringHelper::safe( $validationRule ); } } // make sure ID is always readonly if ($fieldAttributes['name'] === 'id' && !$setReadonly) { $fieldAttributes['readonly'] = 'true'; } } } return $fieldAttributes; } /** * set Builders * * @param string $langLabel The language string for field label * @param string $langView The language string of the view * @param string $nameSingleCode The single view name * @param string $nameListCode The list view name * @param string $name The field name * @param array $view The view data * @param array $field The field data * @param string $typeName The field type * @param boolean $multiple The switch to set multiple selection option * @param boolean $custom The custom field switch * @param boolean $options The options switch * * @return void * */ public function setBuilders($langLabel, $langView, $nameSingleCode, $nameListCode, $name, $view, $field, $typeName, $multiple, $custom = false, $options = false ) { // check if this is a tag field if ($typeName === 'tag') { // set tags for this view but don't load to DB $this->tagsBuilder[$nameSingleCode] = $nameSingleCode; } // dbSwitch $dbSwitch = true; if (isset($field['list']) && $field['list'] == 2) { // do not add this field to the database $dbSwitch = false; } elseif (isset($field['settings']->datatype)) { // insure default not none if number type $numberKeys = array('INT', 'TINYINT', 'BIGINT', 'FLOAT', 'DECIMAL', 'DOUBLE'); // don't use these as index or uniqe keys $textKeys = array('TEXT', 'TINYTEXT', 'MEDIUMTEXT', 'LONGTEXT', 'BLOB', 'TINYBLOB', 'MEDIUMBLOB', 'LONGBLOB'); // build the query values $this->queryBuilder[$nameSingleCode][$name]['type'] = $field['settings']->datatype; // check if this is a number if (in_array($field['settings']->datatype, $numberKeys)) { if ($field['settings']->datadefault === 'Other') { // setup the checking $number_check = $field['settings']->datadefault_other; // Decimals in SQL needs some help if ('DECIMAL' === $field['settings']->datatype && !is_numeric($number_check)) { $number_check = str_replace( ',', '.', $field['settings']->datadefault_other ); } // check if we have a valid number value if (!is_numeric($number_check)) { $field['settings']->datadefault_other = '0'; } } elseif (!is_numeric($field['settings']->datadefault)) { $field['settings']->datadefault = '0'; } } // check if this is not text if (!in_array($field['settings']->datatype, $textKeys)) { $this->queryBuilder[$nameSingleCode][$name]['lenght'] = $field['settings']->datalenght; $this->queryBuilder[$nameSingleCode][$name]['lenght_other'] = $field['settings']->datalenght_other; $this->queryBuilder[$nameSingleCode][$name]['default'] = $field['settings']->datadefault; $this->queryBuilder[$nameSingleCode][$name]['other'] = $field['settings']->datadefault_other; } // fall back unto EMPTY for text else { $this->queryBuilder[$nameSingleCode][$name]['default'] = 'EMPTY'; } // to identify the field $this->queryBuilder[$nameSingleCode][$name]['ID'] = $field['settings']->id; $this->queryBuilder[$nameSingleCode][$name]['null_switch'] = $field['settings']->null_switch; // set index types $_guid = true; if ($field['settings']->indexes == 1 && !in_array( $field['settings']->datatype, $textKeys )) { // build unique keys of this view for db $this->dbUniqueKeys[$nameSingleCode][] = $name; // prevent guid from being added twice if ('guid' === $name) { $_guid = false; } } elseif (($field['settings']->indexes == 2 || (isset($field['alias']) && $field['alias']) || (isset($field['title']) && $field['title']) || $typeName === 'category') && !in_array($field['settings']->datatype, $textKeys)) { // build keys of this view for db $this->dbKeys[$nameSingleCode][] = $name; } // special treatment for GUID if ('guid' === $name && $_guid) { $this->dbUniqueGuid[$nameSingleCode] = true; } } // set list switch $listSwitch = (isset($field['list']) && ($field['list'] == 1 || $field['list'] == 3 || $field['list'] == 4)); // set list join $listJoin = CFactory::_('Registry')->exists('builder.list_join.' . $nameListCode . '.' . (int) $field['field']); // add history to this view if (isset($view['history']) && $view['history']) { $this->historyBuilder[$nameSingleCode] = $nameSingleCode; } // set Alias (only one title per view) if ($dbSwitch && isset($field['alias']) && $field['alias'] && !isset($this->aliasBuilder[$nameSingleCode])) { $this->aliasBuilder[$nameSingleCode] = $name; } // set Titles (only one title per view) if ($dbSwitch && isset($field['title']) && $field['title'] && !isset($this->titleBuilder[$nameSingleCode])) { $this->titleBuilder[$nameSingleCode] = $name; } // category name fix if ($typeName === 'category') { if (CFactory::_('Registry')->get('category.other.name.' . $nameListCode . '.name')) { $tempName = CFactory::_('Registry')->get('category.other.name.' . $nameListCode . '.name'); } else { $tempName = $nameListCode . ' categories'; } // set lang $listLangName = $langView . '_' . FieldHelper::safe($tempName, true); // set field name $listFieldName = StringHelper::safe($tempName, 'W'); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $listLangName, $listFieldName ); } else { // if label was set use instead if (StringHelper::check($langLabel)) { $listLangName = $langLabel; // get field label from the lang label if (CFactory::_('Language')->exist(CFactory::_('Config')->lang_target, $langLabel)) { $listFieldName = CFactory::_('Language')->get(CFactory::_('Config')->lang_target, $langLabel); } else { // get it from the field xml string $listFieldName = (string) CFactory::_('Placeholder')->update_( GetHelper::between( $field['settings']->xml, 'label="', '"' ) ); } // make sure there is no html in the list field name $listFieldName = strip_tags($listFieldName); } else { // set lang (just in case) $listLangName = $langView . '_' . FieldHelper::safe($name, true); // set field name $listFieldName = StringHelper::safe($name, 'W'); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $listLangName, $listFieldName ); } } // build the list values if (($listSwitch || $listJoin) && $typeName != 'repeatable' && $typeName != 'subform') { // load to list builder if ($listSwitch) { // check if it does not exists if (!CFactory::_('Registry')->exists('builder.list.' . $nameListCode)) { CFactory::_('Registry')->set('builder.list.' . $nameListCode, []); } // append values CFactory::_('Registry')->append('builder.list.' . $nameListCode, [ 'id' => (int) $field['field'], 'type' => $typeName, 'code' => $name, 'lang' => $listLangName, 'title' => (isset($field['title']) && $field['title']) ? true : false, 'alias' => (isset($field['alias']) && $field['alias']) ? true : false, 'link' => (isset($field['link']) && $field['link']) ? true : false, 'sort' => (isset($field['sort']) && $field['sort']) ? true : false, 'custom' => $custom, 'multiple' => $multiple, 'options' => $options, 'target' => (int) $field['list'] ]); } // build custom builder list if ($listSwitch || $listJoin) { $this->customBuilderList[$nameListCode][] = $name; } } // load the list join builder if ($listJoin) { CFactory::_('Registry')->set('builder.list_join.' . $nameListCode . '.' . (int) $field['field'], [ 'type' => $typeName, 'code' => $name, 'lang' => $listLangName, 'title' => (isset($field['title']) && $field['title']) ? true : false, 'alias' => (isset($field['alias']) && $field['alias']) ? true : false, 'link' => (isset($field['link']) && $field['link']) ? true : false, 'sort' => (isset($field['sort']) && $field['sort']) ? true : false, 'custom' => $custom, 'multiple' => $multiple, 'options' => $options ]); } // update the field relations if (($field_relations = CFactory::_('Registry')->get('builder.field_relations.' . $nameListCode . '.' . (int) $field['field'])) !== null) { $field_relations = (array) $field_relations; foreach ($field_relations as $area => &$field_values) { $field_values['type'] = $typeName; $field_values['code'] = $name; $field_values['custom'] = $custom; } CFactory::_('Registry')->set('builder.field_relations.' . $nameListCode . '.' . (int) $field['field'], $field_relations); } // set the hidden field of this view if ($dbSwitch && $typeName === 'hidden') { if (!isset($this->hiddenFieldsBuilder[$nameSingleCode])) { $this->hiddenFieldsBuilder[$nameSingleCode] = ''; } $this->hiddenFieldsBuilder[$nameSingleCode] .= ',"' . $name . '"'; } // set all int fields of this view if ($dbSwitch && isset($field['settings']->datatype) && ($field['settings']->datatype === 'INT' || $field['settings']->datatype === 'TINYINT' || $field['settings']->datatype === 'BIGINT')) { if (!isset($this->intFieldsBuilder[$nameSingleCode])) { $this->intFieldsBuilder[$nameSingleCode] = ''; } $this->intFieldsBuilder[$nameSingleCode] .= ',"' . $name . '"'; } // set all dynamic field of this view if ($dbSwitch && $typeName != 'category' && $typeName != 'repeatable' && $typeName != 'subform' && !in_array($name, $this->defaultFields)) { if (!isset($this->dynamicfieldsBuilder[$nameSingleCode])) { $this->dynamicfieldsBuilder[$nameSingleCode] = ''; } if (isset($this->dynamicfieldsBuilder[$nameSingleCode]) && StringHelper::check( $this->dynamicfieldsBuilder[$nameSingleCode] )) { $this->dynamicfieldsBuilder[$nameSingleCode] .= ',"' . $name . '":"' . $name . '"'; } else { $this->dynamicfieldsBuilder[$nameSingleCode] .= '"' . $name . '":"' . $name . '"'; } } // TODO we may need to add a switch instead (since now it uses the first editor field) // set the main(biggest) text field of this view if ($dbSwitch && $typeName === 'editor') { if (!isset($this->maintextBuilder[$nameSingleCode]) || !StringHelper::check( $this->maintextBuilder[$nameSingleCode] )) { $this->maintextBuilder[$nameSingleCode] = $name; } } // set the custom builder if (ArrayHelper::check($custom) && $typeName != 'category' && $typeName != 'repeatable' && $typeName != 'subform') { $this->customBuilder[$nameListCode][] = array('type' => $typeName, 'code' => $name, 'lang' => $listLangName, 'custom' => $custom, 'method' => $field['settings']->store); // set the custom fields needed in content type data if (!isset($this->customFieldLinksBuilder[$nameSingleCode])) { $this->customFieldLinksBuilder[$nameSingleCode] = ''; } // only load this if table is set if (isset($custom['table']) && StringHelper::check( $custom['table'] )) { $this->customFieldLinksBuilder[$nameSingleCode] .= ',{"sourceColumn": "' . $name . '","targetTable": "' . $custom['table'] . '","targetColumn": "' . $custom['id'] . '","displayColumn": "' . $custom['text'] . '"}'; } // build script switch for user if ($custom['extends'] === 'user') { $this->setScriptUserSwitch[$typeName] = $typeName; } } if ($typeName === 'media') { $this->setScriptMediaSwitch[$typeName] = $typeName; } // setup category for this view if ($dbSwitch && $typeName === 'category') { if (CFactory::_('Registry')->get('category.other.name.' . $nameListCode . '.view') && CFactory::_('Registry')->get('category.other.name.' . $nameListCode . '.views')) { $otherViews = CFactory::_('Registry')->get('category.other.name.' . $nameListCode . '.views'); $otherView = CFactory::_('Registry')->get('category.other.name.' . $nameListCode . '.view'); } else { $otherViews = $nameListCode; $otherView = $nameSingleCode; } // get the xml extension name $_extension = CFactory::_('Placeholder')->update_( GetHelper::between( $field['settings']->xml, 'extension="', '"' ) ); // if they left out the extension for some reason if (!StringHelper::check($_extension)) { $_extension = 'com_' . CFactory::_('Config')->component_code_name . '.' . $otherView; } // check the context (does our target match) if (strpos($_extension, '.') !== false) { $target_view = trim(explode('.', $_extension)[1]); // from my understanding the target extension view and the otherView must align // so I will here check that it does, and if not raise an error message to fix this if ($target_view !== $otherView) { $target_extension = trim(explode('.', $_extension)[0]); $correction = $target_extension . '.' . $otherView; $this->app->enqueueMessage( JText::sprintf( '

Category targeting view mismatch

The category field in (%s) admin view has a mismatching target view.
To correct the mismatch, the extension value %s in the field must be changed to %s for best category integration with Joomla.
Please watch this tutorial before proceeding!!!, code fix

', $field['field'], $nameSingleCode, $_extension, $field['field'], $correction ), 'Error' ); } } // load the category builder - TODO must move all to single view $this->categoryBuilder[$nameListCode] = array('code' => $name, 'name' => $listLangName, 'extension' => $_extension, 'filter' => $field['filter']); // also set code name for title alias fix $this->catCodeBuilder[$nameSingleCode] = array('code' => $name, 'views' => $otherViews, 'view' => $otherView); } // setup checkbox for this view if ($dbSwitch && ($typeName === 'checkbox' || (ArrayHelper::check($custom) && isset($custom['extends']) && $custom['extends'] === 'checkboxes'))) { $this->checkboxBuilder[$nameSingleCode][] = $name; } // setup checkboxes and other json items for this view // if we have advance field modeling and the field is not being set in the DB // this could mean that field is modeled manually (so we add it) if (($dbSwitch || $field['settings']->store == 6) && (($typeName === 'subform' || $typeName === 'checkboxes' || $multiple || $field['settings']->store != 0) && $typeName != 'tag')) { $subformJsonSwitch = true; switch ($field['settings']->store) { case 1: // JSON_STRING_ENCODE $this->jsonStringBuilder[$nameSingleCode][] = $name; // Site settings of each field if needed $this->buildSiteFieldData( $nameSingleCode, $name, 'json', $typeName ); // add open close method to field data $field['store'] = 'json'; break; case 2: // BASE_SIXTY_FOUR $this->base64Builder[$nameSingleCode][] = $name; // Site settings of each field if needed $this->buildSiteFieldData( $nameSingleCode, $name, 'base64', $typeName ); // add open close method to field data $field['store'] = 'base64'; break; case 3: // BASIC_ENCRYPTION_LOCALKEY $this->basicFieldModeling[$nameSingleCode][] = $name; // Site settings of each field if needed $this->buildSiteFieldData( $nameSingleCode, $name, 'basic_encryption', $typeName ); // add open close method to field data $field['store'] = 'basic_encryption'; break; case 4: // WHMCS_ENCRYPTION_VDMKEY (DUE REMOVAL) $this->whmcsFieldModeling[$nameSingleCode][] = $name; // Site settings of each field if needed $this->buildSiteFieldData( $nameSingleCode, $name, 'whmcs_encryption', $typeName ); // add open close method to field data $field['store'] = 'whmcs_encryption'; break; case 5: // MEDIUM_ENCRYPTION_LOCALFILE $this->mediumFieldModeling[$nameSingleCode][] = $name; // Site settings of each field if needed $this->buildSiteFieldData( $nameSingleCode, $name, 'medium_encryption', $typeName ); // add open close method to field data $field['store'] = 'medium_encryption'; break; case 6: // EXPERT_MODE if (isset($field['settings']->model_field)) { if (isset($field['settings']->initiator_save_key)) { $this->expertFieldModelInitiator[$nameSingleCode]['save'][$field['settings']->initiator_save_key] = $field['settings']->initiator_save; } if (isset($field['settings']->initiator_get_key)) { $this->expertFieldModelInitiator[$nameSingleCode]['get'][$field['settings']->initiator_get_key] = $field['settings']->initiator_get; } $this->expertFieldModeling[$nameSingleCode][$name] = $field['settings']->model_field; // Site settings of each field if needed $this->buildSiteFieldData( $nameSingleCode, $name, 'expert_mode', $typeName ); } break; default: // JSON_ARRAY_ENCODE $this->jsonItemBuilder[$nameSingleCode][] = $name; // Site settings of each field if needed $this->buildSiteFieldData( $nameSingleCode, $name, 'json', $typeName ); // no londer add the json again (already added) $subformJsonSwitch = false; // add open close method to field data $field['store'] = 'json'; break; } // just a heads-up for usergroups set to multiple if ($typeName === 'usergroup') { $this->buildSiteFieldData( $nameSingleCode, $name, 'json', $typeName ); } // load the model list display fix if (($listSwitch || $listJoin) && (($typeName != 'repeatable' && $typeName != 'subform') || $field['settings']->store == 6)) { if (ArrayHelper::check($options)) { $this->getItemsMethodListStringFixBuilder[$nameSingleCode][] = array('name' => $name, 'type' => $typeName, 'translation' => true, 'custom' => $custom, 'method' => $field['settings']->store); } else { $this->getItemsMethodListStringFixBuilder[$nameSingleCode][] = array('name' => $name, 'type' => $typeName, 'translation' => false, 'custom' => $custom, 'method' => $field['settings']->store); } } // subform house keeping (only if not advance modeling) if ('subform' === $typeName && $field['settings']->store != 6) { // the values must revert to array $this->jsonItemBuilderArray[$nameSingleCode][] = $name; // should the json builder still be added if ($subformJsonSwitch) { // and insure the if is converted to json $this->jsonItemBuilder[$nameSingleCode][] = $name; // Site settings of each field if needed $this->buildSiteFieldData( $nameSingleCode, $name, 'json', $typeName ); } } } // build the data for the export & import methods $typeName === 'repeatable' || if ($dbSwitch && (($typeName === 'checkboxes' || $multiple || $field['settings']->store != 0) && !ArrayHelper::check($options))) { $this->getItemsMethodEximportStringFixBuilder[$nameSingleCode][] = array('name' => $name, 'type' => $typeName, 'translation' => false, 'custom' => $custom, 'method' => $field['settings']->store); } // check if field should be added to uikit $this->buildSiteFieldData($nameSingleCode, $name, 'uikit', $typeName); // load the selection translation fix if (ArrayHelper::check($options) && ($listSwitch || $listJoin) && $typeName != 'repeatable' && $typeName != 'subform') { $this->selectionTranslationFixBuilder[$nameListCode][$name] = $options; } // main lang filter prefix $lang_filter_ = CFactory::_('Config')->lang_prefix . '_FILTER_'; // build the sort values if ($dbSwitch && (isset($field['sort']) && $field['sort'] == 1) && ($listSwitch || $listJoin) && (!$multiple && $typeName != 'checkbox' && $typeName != 'checkboxes' && $typeName != 'repeatable' && $typeName != 'subform')) { // add the language only for new filter option $filter_name_asc_lang = ''; $filter_name_desc_lang = ''; if (isset($this->adminFilterType[$nameListCode]) && $this->adminFilterType[$nameListCode] == 2) { // set the language strings for ascending $filter_name_asc = $listFieldName . ' ascending'; $filter_name_asc_lang = $lang_filter_ . StringHelper::safe( $filter_name_asc, 'U' ); // and to translation CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $filter_name_asc_lang, $filter_name_asc ); // set the language strings for descending $filter_name_desc = $listFieldName . ' descending'; $filter_name_desc_lang = $lang_filter_ . StringHelper::safe( $filter_name_desc, 'U' ); // and to translation CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $filter_name_desc_lang, $filter_name_desc ); } $this->sortBuilder[$nameListCode][] = array('type' => $typeName, 'code' => $name, 'lang' => $listLangName, 'lang_asc' => $filter_name_asc_lang, 'lang_desc' => $filter_name_desc_lang, 'custom' => $custom, 'options' => $options); } // build the search values if ($dbSwitch && isset($field['search']) && $field['search'] == 1) { $_list = (isset($field['list'])) ? $field['list'] : 0; $this->searchBuilder[$nameListCode][] = array('type' => $typeName, 'code' => $name, 'custom' => $custom, 'list' => $_list); } // build the filter values if ($dbSwitch && (isset($field['filter']) && $field['filter'] >= 1) && ($listSwitch || $listJoin) && (!$multiple && $typeName != 'checkbox' && $typeName != 'checkboxes' && $typeName != 'repeatable' && $typeName != 'subform')) { // this pains me... but to avoid collusion $filter_type_code = StringHelper::safe( $nameListCode . 'filter' . $name ); $filter_type_code = preg_replace('/_+/', '', $filter_type_code); $filter_function_name = StringHelper::safe( $name, 'F' ); // add the language only for new filter option $filter_name_select_lang = ''; if (isset($this->adminFilterType[$nameListCode]) && $this->adminFilterType[$nameListCode] == 2) { // set the language strings for selection $filter_name_select = 'Select ' . $listFieldName; $filter_name_select_lang = $lang_filter_ . StringHelper::safe( $filter_name_select, 'U' ); // and to translation CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $filter_name_select_lang, $filter_name_select ); } // add the filter details $this->filterBuilder[$nameListCode][] = array( 'id' => (int) $field['field'], 'type' => $typeName, 'multi' => $field['filter'], 'code' => $name, 'label' => $langLabel, 'lang' => $listLangName, 'lang_select' => $filter_name_select_lang, 'database' => $nameSingleCode, 'function' => $filter_function_name, 'custom' => $custom, 'options' => $options, 'filter_type' => $filter_type_code ); } // build the layout $tabName = ''; if (isset($view['settings']->tabs) && isset($view['settings']->tabs[(int) $field['tab']])) { $tabName = $view['settings']->tabs[(int) $field['tab']]; } elseif ((int) $field['tab'] == 15) { // set to publishing tab $tabName = 'publishing'; } $this->setLayoutBuilder($nameSingleCode, $tabName, $name, $field); // only load fields we want to search if ($dbSwitch && ComponentbuilderHelper::fieldCheck($typeName, 'search')) { // load a search array of view, field, and [encryption, type, tab] CFactory::_('Registry')->set('all_search_fields.' . $nameSingleCode . '.' . $name, [ 'name' => $name, 'type' => $typeName, 'title' => (isset($this->titleBuilder[$nameSingleCode]) && $name === $this->titleBuilder[$nameSingleCode]) ? true : false, 'list' => $nameListCode, 'store' => (isset($field['store'])) ? $field['store'] : null, 'tab_name' => $tabName ] ); } } /** * set Custom Field Type File * * @param array $data The field complete data set * @param string $nameListCode The list view code name * @param string $nameSingleCode The single view code name * * @return void * */ public function setCustomFieldTypeFile($data, $nameListCode, $nameSingleCode ) { // make sure it is not already been build or if it is prime if (isset($data['custom']) && isset($data['custom']['extends']) && ((isset($data['custom']['prime_php']) && $data['custom']['prime_php'] == 1) || !CFactory::_('Content')->exist_('customfield_' . $data['type']) || !ArrayHelper::check( CFactory::_('Content')->get_('customfield_' . $data['type']) ) )) { // set J prefix $jprefix = 'J'; // check if this field has a dot in field type name if (strpos($data['type'], '.') !== false) { // so we have name spacing in custom field type name $dotTypeArray = explode('.', $data['type']); // set the J prefix if (count((array) $dotTypeArray) > 1) { $jprefix = strtoupper(array_shift($dotTypeArray)); } // update the type name now $data['type'] = implode('', $dotTypeArray); $data['custom']['type'] = $data['type']; } // set tab and break replacements $tabBreak = array( '\t' => Indent::_(1), '\n' => PHP_EOL ); // set the [[[PLACEHOLDER]]] options $replace = array( Placefix::_('JPREFIX') => $jprefix, Placefix::_('TABLE') => (isset($data['custom']['table'])) ? $data['custom']['table'] : '', Placefix::_('ID') => (isset($data['custom']['id'])) ? $data['custom']['id'] : '', Placefix::_('TEXT') => (isset($data['custom']['text'])) ? $data['custom']['text'] : '', Placefix::_('CODE_TEXT') => (isset($data['code'], $data['custom']['text'])) ? $data['code'] . '_' . $data['custom']['text'] : '', Placefix::_('CODE') => (isset($data['code'])) ? $data['code'] : '', Placefix::_('view_type') => $nameSingleCode . '_' . $data['type'], Placefix::_('type') => (isset($data['type'])) ? $data['type'] : '', Placefix::_('com_component') => (isset($data['custom']['component']) && StringHelper::check( $data['custom']['component'] )) ? StringHelper::safe( $data['custom']['component'] ) : 'com_' . CFactory::_('Config')->component_code_name, // set the generic values Placefix::_('component') => CFactory::_('Config')->component_code_name, Placefix::_('Component') => CFactory::_('Content')->get('Component'), Placefix::_('view') => (isset($data['custom']['view']) && StringHelper::check( $data['custom']['view'] )) ? StringHelper::safe( $data['custom']['view'] ) : $nameSingleCode, Placefix::_('views') => (isset($data['custom']['views']) && StringHelper::check( $data['custom']['views'] )) ? StringHelper::safe( $data['custom']['views'] ) : $nameListCode ); // now set the ###PLACEHOLDER### options foreach ($replace as $replacekey => $replacevalue) { // update the key value $replacekey = str_replace( array(Placefix::b(), Placefix::d()), array(Placefix::h(), Placefix::h()), $replacekey ); // now set the value $replace[$replacekey] = $replacevalue; } // load the global placeholders foreach (CFactory::_('Component.Placeholder')->get() as $globalPlaceholder => $gloabalValue) { $replace[$globalPlaceholder] = $gloabalValue; } // start loading the field type // $this->fileContentDynamic['customfield_' . $data['type']] = array(); // JPREFIX <<>> CFactory::_('Content')->set_('customfield_' . $data['type'], 'JPREFIX', $jprefix); // Type <<>> CFactory::_('Content')->set_('customfield_' . $data['type'], 'Type', StringHelper::safe( $data['custom']['type'], 'F' ) ); // type <<>> CFactory::_('Content')->set_('customfield_' . $data['type'], 'type', StringHelper::safe($data['custom']['type'])); // is this a own custom field if (isset($data['custom']['own_custom'])) { // make sure the button option notice is set to notify the developer that the button option is not available in own custom field types if (isset($data['custom']['add_button']) && ($data['custom']['add_button'] === 'true' || 1 == $data['custom']['add_button'])) { // set error $this->app->enqueueMessage( JText::_('

Dynamic Button Error

'), 'Error' ); $this->app->enqueueMessage( JText::_( 'The option to add a dynamic button is not available in own custom field types, you will have to custom code it.' ), 'Error' ); } // load another file $target = array('admin' => 'customfield'); $this->buildDynamique( $target, 'fieldcustom', $data['custom']['type'] ); // get the extends name $JFORM_extends = StringHelper::safe( $data['custom']['extends'] ); // JFORM_TYPE_HEADER <<>> $add_default_header = true; CFactory::_('Content')->set_('customfield_' . $data['type'], 'JFORM_TYPE_HEADER', "//" . Line::_( __LINE__,__CLASS__ ) . " Import the " . $JFORM_extends . " field type classes needed" ); // JFORM_extens <<>> CFactory::_('Content')->set_('customfield_' . $data['type'], 'JFORM_extends', $JFORM_extends ); // JFORM_EXTENDS <<>> CFactory::_('Content')->set_('customfield_' . $data['type'], 'JFORM_EXTENDS', StringHelper::safe( $data['custom']['extends'], 'F' ) ); // JFORM_TYPE_PHP <<>> CFactory::_('Content')->set_('customfield_' . $data['type'], 'JFORM_TYPE_PHP', PHP_EOL . PHP_EOL . Indent::_(1) . "//" . Line::_( __LINE__,__CLASS__ ) . " A " . $data['custom']['own_custom'] . " Field" ); // load the other PHP options foreach (ComponentbuilderHelper::$phpFieldArray as $x) { // reset the php bucket $phpBucket = ''; // only set if available if (isset($data['custom']['php' . $x]) && ArrayHelper::check( $data['custom']['php' . $x] )) { foreach ($data['custom']['php' . $x] as $line => $code) { if (StringHelper::check($code)) { $phpBucket .= PHP_EOL . CFactory::_('Placeholder')->update( $code, $tabBreak ); } } // check if this is header text if ('HEADER' === $x) { CFactory::_('Content')->add_('customfield_' . $data['type'], 'JFORM_TYPE_HEADER', PHP_EOL . CFactory::_('Placeholder')->update( $phpBucket, $replace ) ); // stop default headers from loading $add_default_header = false; } else { // JFORM_TYPE_PHP <<>> CFactory::_('Content')->add_('customfield_' . $data['type'], 'JFORM_TYPE_PHP', PHP_EOL . CFactory::_('Placeholder')->update( $phpBucket, $replace ) ); } } } // check if we should add default header if ($add_default_header) { CFactory::_('Content')->add_('customfield_' . $data['type'], 'JFORM_TYPE_HEADER', PHP_EOL . "jimport('joomla.form.helper');" ); CFactory::_('Content')->add_('customfield_' . $data['type'], 'JFORM_TYPE_HEADER', PHP_EOL . "JFormHelper::loadFieldClass('" . $JFORM_extends . "');" ); } // check the the JFormHelper::loadFieldClass(..) was set elseif (strpos(CFactory::_('Content')->get_('customfield_' . $data['type'], 'JFORM_TYPE_HEADER'), 'JFormHelper::loadFieldClass(') === false) { CFactory::_('Content')->add_('customfield_' . $data['type'], 'JFORM_TYPE_HEADER', PHP_EOL . "JFormHelper::loadFieldClass('" . $JFORM_extends . "');" ); } } else { // first build the custom field type file $target = array('admin' => 'customfield'); $this->buildDynamique( $target, 'field' . $data['custom']['extends'], $data['custom']['type'] ); // make sure the value is reset $phpCode = ''; // now load the php script if (isset($data['custom']['php']) && ArrayHelper::check( $data['custom']['php'] )) { foreach ($data['custom']['php'] as $line => $code) { if (StringHelper::check($code)) { if ($line == 1) { $phpCode .= CFactory::_('Placeholder')->update( $code, $tabBreak ); } else { $phpCode .= PHP_EOL . Indent::_(2) . CFactory::_('Placeholder')->update($code, $tabBreak); } } } // replace the placholders $phpCode = CFactory::_('Placeholder')->update($phpCode, $replace); } // catch empty stuff if (!StringHelper::check($phpCode)) { $phpCode = 'return null;'; } // some house cleaning for users if ($data['custom']['extends'] === 'user') { // make sure the value is reset $phpxCode = ''; // now load the php xclude script if (ArrayHelper::check( $data['custom']['phpx'] )) { foreach ($data['custom']['phpx'] as $line => $code) { if (StringHelper::check($code)) { if ($line == 1) { $phpxCode .= CFactory::_('Placeholder')->update( $code, $tabBreak ); } else { $phpxCode .= PHP_EOL . Indent::_(2) . CFactory::_('Placeholder')->update( $code, $tabBreak ); } } } // replace the placholders $phpxCode = CFactory::_('Placeholder')->update($phpxCode, $replace); } // catch empty stuff if (!StringHelper::check($phpxCode)) { $phpxCode = 'return null;'; } // temp holder for name $tempName = $data['custom']['label'] . ' Group'; // set lang $groupLangName = CFactory::_('Config')->lang_prefix . '_' . FieldHelper::safe( $tempName, true ); // add to lang array CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $groupLangName, StringHelper::safe($tempName, 'W') ); // build the Group Control $this->setGroupControl[$data['type']] = $groupLangName; // JFORM_GETGROUPS_PHP <<>> CFactory::_('Content')->set_('customfield_' . $data['type'], 'JFORM_GETGROUPS_PHP', $phpCode ); // JFORM_GETEXCLUDED_PHP <<>> CFactory::_('Content')->set_('customfield_' . $data['type'], 'JFORM_GETEXCLUDED_PHP', $phpxCode ); } else { // JFORM_GETOPTIONS_PHP <<>> CFactory::_('Content')->set_('customfield_' . $data['type'], 'JFORM_GETOPTIONS_PHP', $phpCode ); } // type <<>> CFactory::_('Content')->set_('customfield_' . $data['type'], 'ADD_BUTTON', $this->setAddButtonToListField($data['custom']) ); } } // if this field gets used in plugin or module we should track it so if needed we can copy it over if ((strpos($nameSingleCode, 'P|uG!n') !== false || strpos( $nameSingleCode, 'M0dU|3' ) !== false) && isset($data['custom']) && isset($data['custom']['type'])) { $this->extentionCustomfields[$data['type']] = $data['custom']['type']; } } /** * This is just to get the code. * Don't use this to build the field * * @param array $custom The field complete data set * * @return array with the code * */ public function getCustomFieldCode($custom) { // the code bucket $code_bucket = array( 'JFORM_TYPE_HEADER' => '', 'JFORM_TYPE_PHP' => '' ); // set tab and break replacements $tabBreak = array( '\t' => Indent::_(1), '\n' => PHP_EOL ); // load the other PHP options foreach (ComponentbuilderHelper::$phpFieldArray as $x) { // reset the php bucket $phpBucket = ''; // only set if available if (isset($custom['php' . $x]) && ArrayHelper::check( $custom['php' . $x] )) { foreach ($custom['php' . $x] as $line => $code) { if (StringHelper::check($code)) { $phpBucket .= PHP_EOL . CFactory::_('Placeholder')->update( $code, $tabBreak ); } } // check if this is header text if ('HEADER' === $x) { $code_bucket['JFORM_TYPE_HEADER'] .= PHP_EOL . $phpBucket; } else { // JFORM_TYPE_PHP <<>> $code_bucket['JFORM_TYPE_PHP'] .= PHP_EOL . $phpBucket; } } } return $code_bucket; } /** * set the Filter Field set of a view * * @param string $nameSingleCode The single view name * @param string $nameListCode The list view name * * @return string The fields set in xml * */ public function setFieldFilterSet(&$nameSingleCode, &$nameListCode) { // check if this is the above/new filter option if (isset($this->adminFilterType[$nameListCode]) && $this->adminFilterType[$nameListCode] == 2) { // we first create the file $target = array('admin' => 'filter_' . $nameListCode); $this->buildDynamique( $target, 'filter' ); // the search language string $lang_search = CFactory::_('Config')->lang_prefix . '_FILTER_SEARCH'; // and to translation CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $lang_search, 'Search' . StringHelper::safe($nameListCode, 'w') ); // the search description language string $lang_search_desc = CFactory::_('Config')->lang_prefix . '_FILTER_SEARCH_' . strtoupper($nameListCode); // and to translation CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $lang_search_desc, 'Search the ' . StringHelper::safe($nameSingleCode, 'w') . ' items. Prefix with ID: to search for an item by ID.' ); // now build the XML $field_filter_sets = array(); $field_filter_sets[] = Indent::_(1) . ''; // we first add the search $field_filter_sets[] = Indent::_(2) . ''; // add the published filter if published is not set if (!isset($this->fieldsNames[$nameSingleCode]['published'])) { // the published language string $lang_published = CFactory::_('Config')->lang_prefix . '_FILTER_PUBLISHED'; // and to translation CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $lang_published, 'Status' ); // the published description language string $lang_published_desc = CFactory::_('Config')->lang_prefix . '_FILTER_PUBLISHED_' . strtoupper($nameListCode); // and to translation CFactory::_('Language')->set( CFactory::_('Config')->lang_target, $lang_published_desc, 'Status options for ' . StringHelper::safe($nameListCode, 'w') ); $field_filter_sets[] = Indent::_(2) . ''; $field_filter_sets[] = Indent::_(3) . ''; $field_filter_sets[] = Indent::_(2) . ''; } // add the category if found if (isset($this->categoryBuilder[$nameListCode]) && ArrayHelper::check( $this->categoryBuilder[$nameListCode] ) && isset($this->categoryBuilder[$nameListCode]['extension']) && isset($this->categoryBuilder[$nameListCode]['filter']) && $this->categoryBuilder[$nameListCode]['filter'] >= 1) { $field_filter_sets[] = Indent::_(2) . ''; } // add the access filter if this view has access // and if access manually is not set if (isset($this->accessBuilder[$nameSingleCode]) && StringHelper::check( $this->accessBuilder[$nameSingleCode] ) && !isset($this->fieldsNames[$nameSingleCode]['access'])) { $field_filter_sets[] = Indent::_(2) . ''; } // now add the dynamic fields if (isset($this->filterBuilder[$nameListCode]) && ArrayHelper::check( $this->filterBuilder[$nameListCode] )) { foreach ($this->filterBuilder[$nameListCode] as $r => &$filter) { if ($filter['type'] != 'category') { $field_filter_sets[] = Indent::_(2) . ''; } } } $field_filter_sets[] = Indent::_(2) . ''; $field_filter_sets[] = Indent::_(1) . ''; // now update the file return implode(PHP_EOL, $field_filter_sets); } return ''; } /** * set the Filter List set of a view * * @param string $nameSingleCode The single view name * @param string $nameListCode The list view name * * @return string The fields set in xml * */ public function setFieldFilterListSet(&$nameSingleCode, &$nameListCode) { // check if this is the above/new filter option if (isset($this->adminFilterType[$nameListCode]) && $this->adminFilterType[$nameListCode] == 2) { // keep track of all fields already added $donelist = array('ordering' => true, 'id' => true); // now build the XML $list_sets = array(); $list_sets[] = Indent::_(1) . ''; $list_sets[] = Indent::_(2) . 'getListViewDefaultOrdering( $nameListCode ); // set the default ordering $list_sets[] = Indent::_(3) . 'default="' . $default_ordering['name'] . ' ' . $default_ordering['direction'] . '"'; $list_sets[] = Indent::_(3) . 'validate="options"'; $list_sets[] = Indent::_(2) . '>'; $list_sets[] = Indent::_(3) . ''; $list_sets[] = Indent::_(3) . ''; $list_sets[] = Indent::_(3) . ''; // add the published filter if published is not set if (!isset($this->fieldsNames[$nameSingleCode]['published'])) { // add to done list $donelist['published'] = true; // add to xml :) $list_sets[] = Indent::_(3) . ''; $list_sets[] = Indent::_(3) . ''; } // add the rest of the set filters if (isset($this->sortBuilder[$nameListCode]) && ArrayHelper::check( $this->sortBuilder[$nameListCode] )) { foreach ($this->sortBuilder[$nameListCode] as $filter) { if (!isset($donelist[$filter['code']])) { if ($filter['type'] === 'category') { $list_sets[] = Indent::_(3) . ''; $list_sets[] = Indent::_(3) . ''; } elseif (ArrayHelper::check( $filter['custom'] )) { $list_sets[] = Indent::_(3) . ''; $list_sets[] = Indent::_(3) . ''; } else { $list_sets[] = Indent::_(3) . ''; $list_sets[] = Indent::_(3) . ''; } // do not add again $donelist[$filter['code']] = true; } } } $list_sets[] = Indent::_(3) . ''; $list_sets[] = Indent::_(3) . ''; $list_sets[] = Indent::_(2) . '' . PHP_EOL; $list_sets[] = Indent::_(2) . ''; $list_sets[] = Indent::_(1) . ''; return implode(PHP_EOL, $list_sets); } return ''; } /** * set Custom Field for Filter * * @param string $getOptions The get options php string/code * @param array $filter The filter details * * @return void * */ public function setFilterFieldFile($getOptions, $filter) { // make sure it is not already been build if (!CFactory::_('Content')->exist_('customfilterfield_' . $filter['filter_type']) || !ArrayHelper::check( CFactory::_('Content')->get_('customfilterfield_' . $filter['filter_type']) ) ) { // start loading the field type // $this->fileContentDynamic['customfilterfield_' // . $filter['filter_type']] // = array(); // JPREFIX <>> CFactory::_('Content')->set_('customfilterfield_' . $filter['filter_type'], 'JPREFIX', 'J'); // Type <<>> CFactory::_('Content')->set_('customfilterfield_' . $filter['filter_type'], 'Type', StringHelper::safe( $filter['filter_type'], 'F' ) ); // type <<>> CFactory::_('Content')->set_('customfilterfield_' . $filter['filter_type'], 'type', StringHelper::safe($filter['filter_type']) ); // JFORM_GETOPTIONS_PHP <<>> CFactory::_('Content')->set_('customfilterfield_' . $filter['filter_type'], 'JFORM_GETOPTIONS_PHP', $getOptions ); // ADD_BUTTON <<>> CFactory::_('Content')->set_('customfilterfield_' . $filter['filter_type'], 'ADD_BUTTON', ''); // now build the custom filter field type file $target = array('admin' => 'customfilterfield'); $this->buildDynamique( $target, 'fieldlist', $filter['filter_type'] ); } } /** * set Add Button To List Field (getInput tweak) * * @param array $fieldData The field custom data * * @return string of getInput class on success empty string otherwise * */ protected function setAddButtonToListField($fieldData) { // make sure hte view values are set if (isset($fieldData['add_button']) && ($fieldData['add_button'] === 'true' || 1 == $fieldData['add_button']) && isset($fieldData['view']) && isset($fieldData['views']) && StringHelper::check($fieldData['view']) && StringHelper::check($fieldData['views'])) { // set local component $local_component = "com_" . CFactory::_('Config')->component_code_name; // check that the component value is set if (!isset($fieldData['component']) || !StringHelper::check( $fieldData['component'] )) { $fieldData['component'] = $local_component; } // check that the component has the com_ value in it if (strpos($fieldData['component'], 'com_') === false || strpos( $fieldData['component'], '=' ) !== false) { $fieldData['component'] = "com_" . $fieldData['component']; } // make sure the component is update if # # # or [ [ [ component placeholder is used if (strpos($fieldData['component'], Placefix::h()) !== false || strpos( $fieldData['component'], Placefix::b() ) !== false) // should not be needed... but { $fieldData['component'] = CFactory::_('Placeholder')->update_( $fieldData['component'] ); } // get core permissions $coreLoad = false; // add ref tags $refLoad = true; // fall back on the field component $component = $fieldData['component']; // check if we should add ref tags (since it only works well on local views) if ($local_component !== $component) { // do not add ref tags $refLoad = false; } // get core permisssions if (isset($this->permissionCore[$fieldData['view']])) { // get the core permission naming array $core = $this->permissionCore[$fieldData['view']]; // set switch to activate easy update $coreLoad = true; } // start building the add buttons/s $addButton = array(); $addButton[] = PHP_EOL . PHP_EOL . Indent::_(1) . "/**"; $addButton[] = Indent::_(1) . " * Override to add new button"; $addButton[] = Indent::_(1) . " *"; $addButton[] = Indent::_(1) . " * @return string The field input markup."; $addButton[] = Indent::_(1) . " *"; $addButton[] = Indent::_(1) . " * @since 3.2"; $addButton[] = Indent::_(1) . " */"; $addButton[] = Indent::_(1) . "protected function getInput()"; $addButton[] = Indent::_(1) . "{"; $addButton[] = Indent::_(2) . "//" . Line::_(__Line__, __Class__) . " see if we should add buttons"; $addButton[] = Indent::_(2) . "\$set_button = \$this->getAttribute('button');"; $addButton[] = Indent::_(2) . "//" . Line::_(__Line__, __Class__) . " get html"; $addButton[] = Indent::_(2) . "\$html = parent::getInput();"; $addButton[] = Indent::_(2) . "//" . Line::_(__Line__, __Class__) . " if true set button"; $addButton[] = Indent::_(2) . "if (\$set_button === 'true')"; $addButton[] = Indent::_(2) . "{"; $addButton[] = Indent::_(3) . "\$button = array();"; $addButton[] = Indent::_(3) . "\$script = array();"; $addButton[] = Indent::_(3) . "\$button_code_name = \$this->getAttribute('name');"; $addButton[] = Indent::_(3) . "//" . Line::_(__Line__, __Class__) . " get the input from url"; $addButton[] = Indent::_(3) . "\$app = JFactory::getApplication();"; $addButton[] = Indent::_(3) . "\$jinput = \$app->input;"; $addButton[] = Indent::_(3) . "//" . Line::_(__Line__, __Class__) . " get the view name & id"; $addButton[] = Indent::_(3) . "\$values = \$jinput->getArray(array("; $addButton[] = Indent::_(4) . "'id' => 'int',"; $addButton[] = Indent::_(4) . "'view' => 'word'"; $addButton[] = Indent::_(3) . "));"; $addButton[] = Indent::_(3) . "//" . Line::_(__Line__, __Class__) . " check if new item"; $addButton[] = Indent::_(3) . "\$ref = '';"; $addButton[] = Indent::_(3) . "\$refJ = '';"; if ($refLoad) { $addButton[] = Indent::_(3) . "if (!is_null(\$values['id']) && strlen(\$values['view']))"; $addButton[] = Indent::_(3) . "{"; $addButton[] = Indent::_(4) . "//" . Line::_(__Line__, __Class__) . " only load referral if not new item."; $addButton[] = Indent::_(4) . "\$ref = '&ref=' . \$values['view'] . '&refid=' . \$values['id'];"; $addButton[] = Indent::_(4) . "\$refJ = '&ref=' . \$values['view'] . '&refid=' . \$values['id'];"; $addButton[] = Indent::_(4) . "//" . Line::_(__Line__, __Class__) . " get the return value."; $addButton[] = Indent::_(4) . "\$_uri = (string) JUri::getInstance();"; $addButton[] = Indent::_(4) . "\$_return = urlencode(base64_encode(\$_uri));"; $addButton[] = Indent::_(4) . "//" . Line::_(__Line__, __Class__) . " load return value."; $addButton[] = Indent::_(4) . "\$ref .= '&return=' . \$_return;"; $addButton[] = Indent::_(4) . "\$refJ .= '&return=' . \$_return;"; $addButton[] = Indent::_(3) . "}"; } else { $addButton[] = Indent::_(3) . "if (!is_null(\$values['id']) && strlen(\$values['view']))"; $addButton[] = Indent::_(3) . "{"; $addButton[] = Indent::_(4) . "//" . Line::_(__Line__, __Class__) . " only load field details if not new item."; $addButton[] = Indent::_(4) . "\$ref = '&field=' . \$values['view'] . '&field_id=' . \$values['id'];"; $addButton[] = Indent::_(4) . "\$refJ = '&field=' . \$values['view'] . '&field_id=' . \$values['id'];"; $addButton[] = Indent::_(4) . "//" . Line::_(__Line__, __Class__) . " get the return value."; $addButton[] = Indent::_(4) . "\$_uri = (string) JUri::getInstance();"; $addButton[] = Indent::_(4) . "\$_return = urlencode(base64_encode(\$_uri));"; $addButton[] = Indent::_(4) . "//" . Line::_(__Line__, __Class__) . " load return value."; $addButton[] = Indent::_(4) . "\$ref = '&return=' . \$_return;"; $addButton[] = Indent::_(4) . "\$refJ = '&return=' . \$_return;"; $addButton[] = Indent::_(3) . "}"; } $addButton[] = Indent::_(3) . "//" . Line::_(__Line__, __Class__) . " get button label"; $addButton[] = Indent::_(3) . "\$button_label = trim(\$button_code_name);"; $addButton[] = Indent::_(3) . "\$button_label = preg_replace('/_+/', ' ', \$button_label);"; $addButton[] = Indent::_(3) . "\$button_label = preg_replace('/\s+/', ' ', \$button_label);"; $addButton[] = Indent::_(3) . "\$button_label = preg_replace(\"/[^A-Za-z ]/\", '', \$button_label);"; $addButton[] = Indent::_(3) . "\$button_label = ucfirst(strtolower(\$button_label));"; $addButton[] = Indent::_(3) . "//" . Line::_(__Line__, __Class__) . " get user object"; $addButton[] = Indent::_(3) . "\$user = JFactory::getUser();"; $addButton[] = Indent::_(3) . "//" . Line::_(__Line__, __Class__) . " only add if user allowed to create " . $fieldData['view']; // check if the item has permissions. if ($coreLoad && isset($core['core.create']) && isset($this->permissionBuilder['global'][$core['core.create']]) && ArrayHelper::check( $this->permissionBuilder['global'][$core['core.create']] ) && in_array( $fieldData['view'], $this->permissionBuilder['global'][$core['core.create']] )) { $addButton[] = Indent::_(3) . "if (\$user->authorise('" . $core['core.create'] . "', '" . $component . "') && \$app->isAdmin()) // TODO for now only in admin area."; } else { $addButton[] = Indent::_(3) . "if (\$user->authorise('core.create', '" . $component . "') && \$app->isAdmin()) // TODO for now only in admin area."; } $addButton[] = Indent::_(3) . "{"; $addButton[] = Indent::_(4) . "//" . Line::_(__Line__, __Class__) . " build Create button"; $addButton[] = Indent::_(4) . "\$button[] = 'lang_prefix . "_CREATE_NEW_S', \$button_label).'\" style=\"border-radius: 0px 4px 4px 0px; padding: 4px 4px 4px 7px;\""; $addButton[] = Indent::_(5) . "href=\"index.php?option=" . $fieldData['component'] . "&view=" . $fieldData['view'] . "&layout=edit'.\$ref.'\" >"; $addButton[] = Indent::_(5) . "';"; $addButton[] = Indent::_(3) . "}"; $addButton[] = Indent::_(3) . "//" . Line::_(__Line__, __Class__) . " only add if user allowed to edit " . $fieldData['view']; // check if the item has permissions. if ($coreLoad && isset($core['core.edit']) && isset($this->permissionBuilder['global'][$core['core.edit']]) && ArrayHelper::check( $this->permissionBuilder['global'][$core['core.edit']] ) && in_array( $fieldData['view'], $this->permissionBuilder['global'][$core['core.edit']] )) { $addButton[] = Indent::_(3) . "if (\$user->authorise('" . $core['core.edit'] . "', '" . $component . "') && \$app->isAdmin()) // TODO for now only in admin area."; } else { $addButton[] = Indent::_(3) . "if (\$user->authorise('core.edit', '" . $component . "') && \$app->isAdmin()) // TODO for now only in admin area."; } $addButton[] = Indent::_(3) . "{"; $addButton[] = Indent::_(4) . "//" . Line::_(__Line__, __Class__) . " build edit button"; $addButton[] = Indent::_(4) . "\$button[] = 'lang_prefix . "_EDIT_S', \$button_label).'\" style=\"display: none; padding: 4px 4px 4px 7px;\" href=\"#\" >"; $addButton[] = Indent::_(5) . "';"; $addButton[] = Indent::_(4) . "//" . Line::_(__Line__, __Class__) . " build script"; $addButton[] = Indent::_(4) . "\$script[] = \""; $addButton[] = Indent::_(5) . "jQuery(document).ready(function() {"; $addButton[] = Indent::_(6) . "jQuery('#adminForm').on('change', '#jform_\".\$button_code_name.\"',function (e) {"; $addButton[] = Indent::_(7) . "e.preventDefault();"; $addButton[] = Indent::_(7) . "var \".\$button_code_name.\"Value = jQuery('#jform_\".\$button_code_name.\"').val();"; $addButton[] = Indent::_(7) . "\".\$button_code_name.\"Button(\".\$button_code_name.\"Value);"; $addButton[] = Indent::_(6) . "});"; $addButton[] = Indent::_(6) . "var \".\$button_code_name.\"Value = jQuery('#jform_\".\$button_code_name.\"').val();"; $addButton[] = Indent::_(6) . "\".\$button_code_name.\"Button(\".\$button_code_name.\"Value);"; $addButton[] = Indent::_(5) . "});"; $addButton[] = Indent::_(5) . "function \".\$button_code_name.\"Button(value) {"; $addButton[] = Indent::_(6) . "if (value > 0) {"; // TODO not ideal since value may not be an (int) $addButton[] = Indent::_(7) . "// hide the create button"; $addButton[] = Indent::_(7) . "jQuery('#\".\$button_code_name.\"Create').hide();"; $addButton[] = Indent::_(7) . "// show edit button"; $addButton[] = Indent::_(7) . "jQuery('#\".\$button_code_name.\"Edit').show();"; $addButton[] = Indent::_(7) . "var url = 'index.php?option=" . $fieldData['component'] . "&view=" . $fieldData['views'] . "&task=" . $fieldData['view'] . ".edit&id='+value+'\".\$refJ.\"';"; // TODO this value may not be the ID $addButton[] = Indent::_(7) . "jQuery('#\".\$button_code_name.\"Edit').attr('href', url);"; $addButton[] = Indent::_(6) . "} else {"; $addButton[] = Indent::_(7) . "// show the create button"; $addButton[] = Indent::_(7) . "jQuery('#\".\$button_code_name.\"Create').show();"; $addButton[] = Indent::_(7) . "// hide edit button"; $addButton[] = Indent::_(7) . "jQuery('#\".\$button_code_name.\"Edit').hide();"; $addButton[] = Indent::_(6) . "}"; $addButton[] = Indent::_(5) . "}\";"; $addButton[] = Indent::_(3) . "}"; $addButton[] = Indent::_(3) . "//" . Line::_(__Line__, __Class__) . " check if button was created for " . $fieldData['view'] . " field."; $addButton[] = Indent::_(3) . "if (is_array(\$button) && count(\$button) > 0)"; $addButton[] = Indent::_(3) . "{"; $addButton[] = Indent::_(4) . "//" . Line::_(__Line__, __Class__) . " Load the needed script."; $addButton[] = Indent::_(4) . "\$document = JFactory::getDocument();"; $addButton[] = Indent::_(4) . "\$document->addScriptDeclaration(implode(' ',\$script));"; $addButton[] = Indent::_(4) . "//" . Line::_(__Line__, __Class__) . " return the button attached to input field."; $addButton[] = Indent::_(4) . "return '
' .\$html . implode('',\$button).'
';"; $addButton[] = Indent::_(3) . "}"; $addButton[] = Indent::_(2) . "}"; $addButton[] = Indent::_(2) . "return \$html;"; $addButton[] = Indent::_(1) . "}"; return implode(PHP_EOL, $addButton); } return ''; } /** * xmlPrettyPrint * * @param SimpleXMLElement $xml The XML element containing a node to be output * @param string $nodename node name of the input xml element to print out. this is done to omit the ownerDocument; $dom->formatOutput = true; $xmlString = $dom->saveXML( $dom->getElementsByTagName($nodename)->item(0) ); // make sure Tidy is enabled if (CFactory::_('Config')->get('tidy', false)) { $tidy = new Tidy(); $tidy->parseString( $xmlString, array('indent' => true, 'indent-spaces' => 8, 'input-xml' => true, 'output-xml' => true, 'indent-attributes' => true, 'wrap-attributes' => true, 'wrap' => false) ); $tidy->cleanRepair(); return $this->xmlIndent((string) $tidy, ' ', 8, true, false); } // set tidy waring atleast once elseif (!$this->setTidyWarning) { // set the warning only once $this->setTidyWarning = true; // now set the warning $this->app->enqueueMessage( JText::_('

Tidy Error

'), 'Error' ); $this->app->enqueueMessage( JText::_( 'You must enable the Tidy extension in your php.ini file so we can tidy up your xml! If you need help please start here!' ), 'Error' ); } return $xmlString; } /** * xmlIndent * * @param string $string The XML input * @param string $char Character or characters to use as the repeated indent * @param integer $depth number of times to repeat the indent character * @param boolean $skipfirst Skip the first line of the input. * @param boolean $skiplast Skip the last line of the input; * * @return string XML output * */ public function xmlIndent($string, $char = ' ', $depth = 0, $skipfirst = false, $skiplast = false ) { $output = array(); $lines = explode("\n", $string); $first = true; $last = count($lines) - 1; foreach ($lines as $i => $line) { $output[] = (($first && $skipfirst) || $i === $last && $skiplast) ? $line : str_repeat($char, $depth) . $line; $first = false; } return implode("\n", $output); } }