<?php /** * @package Joomla.Component.Builder * * @created 30th April, 2015 * @author Llewellyn van der Merwe <http://www.joomlacomponentbuilder.com> * @github Joomla Component Builder <https://github.com/vdm-io/Joomla-Component-Builder> * @copyright Copyright (C) 2015 - 2020 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'); /** * 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(); /** * 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 */ 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 line number in comments * * @param int $nr The line number * * @return void * */ private function setLine($nr) { if ($this->debugLinenr) { return ' [Fields ' . $nr . ']'; } return ''; } /** * 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) && ComponentbuilderHelper::checkArray($view['settings']->fields)) { // add metadata to the view if (isset($view['metadata']) && $view['metadata']) { $this->metadataBuilder[$nameSingleCode] = $nameSingleCode; } // add access to the view if (isset($view['access']) && $view['access']) { $this->accessBuilder[$nameSingleCode] = $nameSingleCode; } // main lang prefix $langView = $this->langPrefix . '_' . $this->placeholders[$this->hhh . 'VIEW' . $this->hhh]; $langViews = $this->langPrefix . '_' . $this->placeholders[$this->hhh . 'VIEWS' . $this->hhh]; // set default lang $this->setLangContent( $this->lang, $langView, $view['settings']->name_single ); $this->setLangContent( $this->lang, $langViews, $view['settings']->name_list ); // set global item strings $this->setLangContent( $this->lang, $langViews . '_N_ITEMS_ARCHIVED', "%s " . $view['settings']->name_list . " archived." ); $this->setLangContent( $this->lang, $langViews . '_N_ITEMS_ARCHIVED_1', "%s " . $view['settings']->name_single . " archived." ); $this->setLangContent( $this->lang, $langViews . '_N_ITEMS_CHECKED_IN_0', "No " . $view['settings']->name_single . " successfully checked in." ); $this->setLangContent( $this->lang, $langViews . '_N_ITEMS_CHECKED_IN_1', "%d " . $view['settings']->name_single . " successfully checked in." ); $this->setLangContent( $this->lang, $langViews . '_N_ITEMS_CHECKED_IN_MORE', "%d " . $view['settings']->name_list . " successfully checked in." ); $this->setLangContent( $this->lang, $langViews . '_N_ITEMS_DELETED', "%s " . $view['settings']->name_list . " deleted." ); $this->setLangContent( $this->lang, $langViews . '_N_ITEMS_DELETED_1', "%s " . $view['settings']->name_single . " deleted." ); $this->setLangContent( $this->lang, $langViews . '_N_ITEMS_FEATURED', "%s " . $view['settings']->name_list . " featured." ); $this->setLangContent( $this->lang, $langViews . '_N_ITEMS_FEATURED_1', "%s " . $view['settings']->name_single . " featured." ); $this->setLangContent( $this->lang, $langViews . '_N_ITEMS_PUBLISHED', "%s " . $view['settings']->name_list . " published." ); $this->setLangContent( $this->lang, $langViews . '_N_ITEMS_PUBLISHED_1', "%s " . $view['settings']->name_single . " published." ); $this->setLangContent( $this->lang, $langViews . '_N_ITEMS_TRASHED', "%s " . $view['settings']->name_list . " trashed." ); $this->setLangContent( $this->lang, $langViews . '_N_ITEMS_TRASHED_1', "%s " . $view['settings']->name_single . " trashed." ); $this->setLangContent( $this->lang, $langViews . '_N_ITEMS_UNFEATURED', "%s " . $view['settings']->name_list . " unfeatured." ); $this->setLangContent( $this->lang, $langViews . '_N_ITEMS_UNFEATURED_1', "%s " . $view['settings']->name_single . " unfeatured." ); $this->setLangContent( $this->lang, $langViews . '_N_ITEMS_UNPUBLISHED', "%s " . $view['settings']->name_list . " unpublished." ); $this->setLangContent( $this->lang, $langViews . '_N_ITEMS_UNPUBLISHED_1', "%s " . $view['settings']->name_single . " unpublished." ); $this->setLangContent( $this->lang, $langViews . '_N_ITEMS_FAILED_PUBLISHING', "%s " . $view['settings']->name_list . " failed publishing." ); $this->setLangContent( $this->lang, $langViews . '_N_ITEMS_FAILED_PUBLISHING_1', "%s " . $view['settings']->name_single . " failed publishing." ); $this->setLangContent( $this->lang, $langViews . '_BATCH_OPTIONS', "Batch process the selected " . $view['settings']->name_list ); $this->setLangContent( $this->lang, $langViews . '_BATCH_TIP', "All changes will be applied to all selected " . $view['settings']->name_list ); // set some basic defaults $this->setLangContent( $this->lang, $langView . '_ERROR_UNIQUE_ALIAS', "Another " . $view['settings']->name_single . " has the same alias." ); $this->setLangContent( $this->lang, $langView . '_CREATED_DATE_LABEL', "Created Date" ); $this->setLangContent( $this->lang, $langView . '_CREATED_DATE_DESC', "The date this " . $view['settings']->name_single . " was created." ); $this->setLangContent( $this->lang, $langView . '_MODIFIED_DATE_LABEL', "Modified Date" ); $this->setLangContent( $this->lang, $langView . '_MODIFIED_DATE_DESC', "The date this " . $view['settings']->name_single . " was modified." ); $this->setLangContent( $this->lang, $langView . '_CREATED_BY_LABEL', "Created By" ); $this->setLangContent( $this->lang, $langView . '_CREATED_BY_DESC', "The user that created this " . $view['settings']->name_single . "." ); $this->setLangContent( $this->lang, $langView . '_MODIFIED_BY_LABEL', "Modified By" ); $this->setLangContent( $this->lang, $langView . '_MODIFIED_BY_DESC', "The last user that modified this " . $view['settings']->name_single . "." ); $this->setLangContent( $this->lang, $langView . '_ORDERING_LABEL', "Ordering" ); $this->setLangContent( $this->lang, $langView . '_VERSION_LABEL', "Version" ); $this->setLangContent( $this->lang, $langView . '_VERSION_DESC', "A count of the number of times this " . $view['settings']->name_single . " has been revised." ); $this->setLangContent( $this->lang, $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 ($this->fieldBuilderType == 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 = $this->_t(3) . 'readonly="true"' . PHP_EOL . $this->_t( 3 ) . 'disabled="true"'; } // start adding dynamc fields $dynamicFields = ''; // set the custom table key $dbkey = 'g'; // Trigger Event: jcb_ce_onBeforeBuildFields $this->triggerEvent( 'jcb_ce_onBeforeBuildFields', array(&$this->componentContext, &$dynamicFields, &$readOnly, &$dbkey, &$view, &$component, &$nameSingleCode, &$nameListCode, &$this->placeholders, &$langView, &$langViews) ); // 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, $this->placeholders, $dbkey, true ); } // Trigger Event: jcb_ce_onAfterBuildFields $this->triggerEvent( 'jcb_ce_onAfterBuildFields', array(&$this->componentContext, &$dynamicFields, &$readOnly, &$dbkey, &$view, &$component, &$nameSingleCode, &$nameListCode, &$this->placeholders, &$langView, &$langViews) ); // set the default fields $fieldSet = array(); $fieldSet[] = '<fieldset name="details">'; $fieldSet[] = $this->_t(2) . "<!--" . $this->setLine(__LINE__) . " Default Fields. -->"; $fieldSet[] = $this->_t(2) . "<!--" . $this->setLine(__LINE__) . " Id Field. Type: Text (joomla) -->"; // if id is not set if (!isset($this->fieldsNames[$nameSingleCode]['id'])) { $fieldSet[] = $this->_t(2) . "<field"; $fieldSet[] = $this->_t(3) . "name=" . '"id"'; $fieldSet[] = $this->_t(3) . 'type="text" class="readonly" label="JGLOBAL_FIELD_ID_LABEL"'; $fieldSet[] = $this->_t(3) . 'description ="JGLOBAL_FIELD_ID_DESC" size="10" default="0"'; $fieldSet[] = $this->_t(3) . 'readonly="true"'; $fieldSet[] = $this->_t(2) . "/>"; // count the static field created $this->fieldCount++; } // if created is not set if (!isset($this->fieldsNames[$nameSingleCode]['created'])) { $fieldSet[] = $this->_t(2) . "<!--" . $this->setLine(__LINE__) . " Date Created Field. Type: Calendar (joomla) -->"; $fieldSet[] = $this->_t(2) . "<field"; $fieldSet[] = $this->_t(3) . "name=" . '"created"'; $fieldSet[] = $this->_t(3) . "type=" . '"calendar"'; $fieldSet[] = $this->_t(3) . "label=" . '"' . $langView . '_CREATED_DATE_LABEL"'; $fieldSet[] = $this->_t(3) . "description=" . '"' . $langView . '_CREATED_DATE_DESC"'; $fieldSet[] = $this->_t(3) . "size=" . '"22"'; if ($readOnly) { $fieldSet[] = $readOnly; } $fieldSet[] = $this->_t(3) . "format=" . '"%Y-%m-%d %H:%M:%S"'; $fieldSet[] = $this->_t(3) . "filter=" . '"user_utc"'; $fieldSet[] = $this->_t(2) . "/>"; // count the static field created $this->fieldCount++; } // if created_by is not set if (!isset($this->fieldsNames[$nameSingleCode]['created_by'])) { $fieldSet[] = $this->_t(2) . "<!--" . $this->setLine(__LINE__) . " User Created Field. Type: User (joomla) -->"; $fieldSet[] = $this->_t(2) . "<field"; $fieldSet[] = $this->_t(3) . "name=" . '"created_by"'; $fieldSet[] = $this->_t(3) . "type=" . '"user"'; $fieldSet[] = $this->_t(3) . "label=" . '"' . $langView . '_CREATED_BY_LABEL"'; if ($readOnly) { $fieldSet[] = $readOnly; } $fieldSet[] = $this->_t(3) . "description=" . '"' . $langView . '_CREATED_BY_DESC"'; $fieldSet[] = $this->_t(2) . "/>"; // count the static field created $this->fieldCount++; } // if published is not set if (!isset($this->fieldsNames[$nameSingleCode]['published'])) { $fieldSet[] = $this->_t(2) . "<!--" . $this->setLine(__LINE__) . " Published Field. Type: List (joomla) -->"; $fieldSet[] = $this->_t(2) . "<field name=" . '"published" type="list" label="JSTATUS"'; $fieldSet[] = $this->_t(3) . "description=" . '"JFIELD_PUBLISHED_DESC" class="chzn-color-state"'; if ($readOnly) { $fieldSet[] = $readOnly; } $fieldSet[] = $this->_t(3) . "filter=" . '"intval" size="1" default="1" >'; $fieldSet[] = $this->_t(3) . "<option value=" . '"1">'; $fieldSet[] = $this->_t(4) . "JPUBLISHED</option>"; $fieldSet[] = $this->_t(3) . "<option value=" . '"0">'; $fieldSet[] = $this->_t(4) . "JUNPUBLISHED</option>"; $fieldSet[] = $this->_t(3) . "<option value=" . '"2">'; $fieldSet[] = $this->_t(4) . "JARCHIVED</option>"; $fieldSet[] = $this->_t(3) . "<option value=" . '"-2">'; $fieldSet[] = $this->_t(4) . "JTRASHED</option>"; $fieldSet[] = $this->_t(2) . "</field>"; // count the static field created $this->fieldCount++; } // if modified is not set if (!isset($this->fieldsNames[$nameSingleCode]['modified'])) { $fieldSet[] = $this->_t(2) . "<!--" . $this->setLine(__LINE__) . " Date Modified Field. Type: Calendar (joomla) -->"; $fieldSet[] = $this->_t(2) . '<field name="modified" type="calendar" class="readonly"'; $fieldSet[] = $this->_t(3) . 'label="' . $langView . '_MODIFIED_DATE_LABEL" description="' . $langView . '_MODIFIED_DATE_DESC"'; $fieldSet[] = $this->_t(3) . 'size="22" readonly="true" format="%Y-%m-%d %H:%M:%S" filter="user_utc" />'; // count the static field created $this->fieldCount++; } // if modified_by is not set if (!isset($this->fieldsNames[$nameSingleCode]['modified_by'])) { $fieldSet[] = $this->_t(2) . "<!--" . $this->setLine(__LINE__) . " User Modified Field. Type: User (joomla) -->"; $fieldSet[] = $this->_t(2) . '<field name="modified_by" type="user"'; $fieldSet[] = $this->_t(3) . 'label="' . $langView . '_MODIFIED_BY_LABEL"'; $fieldSet[] = $this->_t(3) . "description=" . '"' . $langView . '_MODIFIED_BY_DESC"'; $fieldSet[] = $this->_t(3) . 'class="readonly"'; $fieldSet[] = $this->_t(3) . 'readonly="true"'; $fieldSet[] = $this->_t(3) . 'filter="unset"'; $fieldSet[] = $this->_t(2) . "/>"; // count the static field created $this->fieldCount++; } // check if view has access if (isset($this->accessBuilder[$nameSingleCode]) && ComponentbuilderHelper::checkString( $this->accessBuilder[$nameSingleCode] ) && !isset($this->fieldsNames[$nameSingleCode]['access'])) { $fieldSet[] = $this->_t(2) . "<!--" . $this->setLine(__LINE__) . " Access Field. Type: Accesslevel (joomla) -->"; $fieldSet[] = $this->_t(2) . '<field name="access"'; $fieldSet[] = $this->_t(3) . 'type="accesslevel"'; $fieldSet[] = $this->_t(3) . 'label="JFIELD_ACCESS_LABEL"'; $fieldSet[] = $this->_t(3) . 'description="JFIELD_ACCESS_DESC"'; $fieldSet[] = $this->_t(3) . 'default="1"'; if ($readOnly) { $fieldSet[] = $readOnly; } $fieldSet[] = $this->_t(3) . 'required="false"'; $fieldSet[] = $this->_t(2) . "/>"; // count the static field created $this->fieldCount++; } // if ordering is not set if (!isset($this->fieldsNames[$nameSingleCode]['ordering'])) { $fieldSet[] = $this->_t(2) . "<!--" . $this->setLine(__LINE__) . " Ordering Field. Type: Numbers (joomla) -->"; $fieldSet[] = $this->_t(2) . "<field"; $fieldSet[] = $this->_t(3) . 'name="ordering"'; $fieldSet[] = $this->_t(3) . 'type="number"'; $fieldSet[] = $this->_t(3) . 'class="inputbox validate-ordering"'; $fieldSet[] = $this->_t(3) . 'label="' . $langView . '_ORDERING_LABEL' . '"'; $fieldSet[] = $this->_t(3) . 'description=""'; $fieldSet[] = $this->_t(3) . 'default="0"'; $fieldSet[] = $this->_t(3) . 'size="6"'; if ($readOnly) { $fieldSet[] = $readOnly; } $fieldSet[] = $this->_t(3) . 'required="false"'; $fieldSet[] = $this->_t(2) . "/>"; // count the static field created $this->fieldCount++; } // if version is not set if (!isset($this->fieldsNames[$nameSingleCode]['version'])) { $fieldSet[] = $this->_t(2) . "<!--" . $this->setLine(__LINE__) . " Version Field. Type: Text (joomla) -->"; $fieldSet[] = $this->_t(2) . "<field"; $fieldSet[] = $this->_t(3) . 'name="version"'; $fieldSet[] = $this->_t(3) . 'type="text"'; $fieldSet[] = $this->_t(3) . 'class="readonly"'; $fieldSet[] = $this->_t(3) . 'label="' . $langView . '_VERSION_LABEL"'; $fieldSet[] = $this->_t(3) . 'description="' . $langView . '_VERSION_DESC"'; $fieldSet[] = $this->_t(3) . 'size="6"'; $fieldSet[] = $this->_t(3) . 'readonly="true"'; $fieldSet[] = $this->_t(3) . 'filter="unset"'; $fieldSet[] = $this->_t(2) . "/>"; // count the static field created $this->fieldCount++; } // check if metadata is added to this view if (isset($this->metadataBuilder[$nameSingleCode]) && ComponentbuilderHelper::checkString( $this->metadataBuilder[$nameSingleCode] )) { // metakey if (!isset($this->fieldsNames[$nameSingleCode]['metakey'])) { $fieldSet[] = $this->_t(2) . "<!--" . $this->setLine(__LINE__) . " Metakey Field. Type: Textarea (joomla) -->"; $fieldSet[] = $this->_t(2) . "<field"; $fieldSet[] = $this->_t(3) . 'name="metakey"'; $fieldSet[] = $this->_t(3) . 'type="textarea"'; $fieldSet[] = $this->_t(3) . 'label="JFIELD_META_KEYWORDS_LABEL"'; $fieldSet[] = $this->_t(3) . 'description="JFIELD_META_KEYWORDS_DESC"'; $fieldSet[] = $this->_t(3) . 'rows="3"'; $fieldSet[] = $this->_t(3) . 'cols="30"'; $fieldSet[] = $this->_t(2) . "/>"; // count the static field created $this->fieldCount++; } // metadesc if (!isset($this->fieldsNames[$nameSingleCode]['metadesc'])) { $fieldSet[] = $this->_t(2) . "<!--" . $this->setLine(__LINE__) . " Metadesc Field. Type: Textarea (joomla) -->"; $fieldSet[] = $this->_t(2) . "<field"; $fieldSet[] = $this->_t(3) . 'name="metadesc"'; $fieldSet[] = $this->_t(3) . 'type="textarea"'; $fieldSet[] = $this->_t(3) . 'label="JFIELD_META_DESCRIPTION_LABEL"'; $fieldSet[] = $this->_t(3) . 'description="JFIELD_META_DESCRIPTION_DESC"'; $fieldSet[] = $this->_t(3) . 'rows="3"'; $fieldSet[] = $this->_t(3) . 'cols="30"'; $fieldSet[] = $this->_t(2) . "/>"; // count the static field created $this->fieldCount++; } } // load the dynamic fields now if (ComponentbuilderHelper::checkString($dynamicFields)) { $fieldSet[] = $this->_t(2) . "<!--" . $this->setLine(__LINE__) . " Dynamic Fields. -->" . $dynamicFields; } // close fieldset $fieldSet[] = $this->_t(1) . "</fieldset>"; // check if metadata is added to this view if (isset($this->metadataBuilder[$nameSingleCode]) && ComponentbuilderHelper::checkString( $this->metadataBuilder[$nameSingleCode] )) { if (!isset($this->fieldsNames[$nameSingleCode]['robots']) || !isset($this->fieldsNames[$nameSingleCode]['rights']) || !isset($this->fieldsNames[$nameSingleCode]['author'])) { $fieldSet[] = PHP_EOL . $this->_t(1) . "<!--" . $this->setLine( __LINE__ ) . " Metadata Fields. -->"; $fieldSet[] = $this->_t(1) . "<fields" . ' name="metadata" label="JGLOBAL_FIELDSET_METADATA_OPTIONS">'; $fieldSet[] = $this->_t(2) . '<fieldset name="vdmmetadata"'; $fieldSet[] = $this->_t(3) . 'label="JGLOBAL_FIELDSET_METADATA_OPTIONS">'; // robots if (!isset($this->fieldsNames[$nameSingleCode]['robots'])) { $fieldSet[] = $this->_t(3) . "<!--" . $this->setLine( __LINE__ ) . " Robots Field. Type: List (joomla) -->"; $fieldSet[] = $this->_t(3) . '<field name="robots"'; $fieldSet[] = $this->_t(4) . 'type="list"'; $fieldSet[] = $this->_t(4) . 'label="JFIELD_METADATA_ROBOTS_LABEL"'; $fieldSet[] = $this->_t(4) . 'description="JFIELD_METADATA_ROBOTS_DESC" >'; $fieldSet[] = $this->_t(4) . '<option value="">JGLOBAL_USE_GLOBAL</option>'; $fieldSet[] = $this->_t(4) . '<option value="index, follow">JGLOBAL_INDEX_FOLLOW</option>'; $fieldSet[] = $this->_t(4) . '<option value="noindex, follow">JGLOBAL_NOINDEX_FOLLOW</option>'; $fieldSet[] = $this->_t(4) . '<option value="index, nofollow">JGLOBAL_INDEX_NOFOLLOW</option>'; $fieldSet[] = $this->_t(4) . '<option value="noindex, nofollow">JGLOBAL_NOINDEX_NOFOLLOW</option>'; $fieldSet[] = $this->_t(3) . '</field>'; // count the static field created $this->fieldCount++; } // author if (!isset($this->fieldsNames[$nameSingleCode]['author'])) { $fieldSet[] = $this->_t(3) . "<!--" . $this->setLine( __LINE__ ) . " Author Field. Type: Text (joomla) -->"; $fieldSet[] = $this->_t(3) . '<field name="author"'; $fieldSet[] = $this->_t(4) . 'type="text"'; $fieldSet[] = $this->_t(4) . 'label="JAUTHOR" description="JFIELD_METADATA_AUTHOR_DESC"'; $fieldSet[] = $this->_t(4) . 'size="20"'; $fieldSet[] = $this->_t(3) . "/>"; // count the static field created $this->fieldCount++; } // rights if (!isset($this->fieldsNames[$nameSingleCode]['rights'])) { $fieldSet[] = $this->_t(3) . "<!--" . $this->setLine( __LINE__ ) . " Rights Field. Type: Textarea (joomla) -->"; $fieldSet[] = $this->_t(3) . '<field name="rights" type="textarea" label="JFIELD_META_RIGHTS_LABEL"'; $fieldSet[] = $this->_t(4) . 'description="JFIELD_META_RIGHTS_DESC" required="false" filter="string"'; $fieldSet[] = $this->_t(4) . 'cols="30" rows="2"'; $fieldSet[] = $this->_t(3) . "/>"; // count the static field created $this->fieldCount++; } $fieldSet[] = $this->_t(2) . "</fieldset>"; $fieldSet[] = $this->_t(1) . "</fields>"; } } // 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'; // Trigger Event: jcb_ce_onBeforeBuildFields $this->triggerEvent( 'jcb_ce_onBeforeBuildFields', array(&$this->componentContext, &$dynamicFieldsXML, &$readOnlyXML, &$dbkey, &$view, &$component, &$nameSingleCode, &$nameListCode, &$this->placeholders, &$langView, &$langViews) ); // 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, $this->placeholders, $dbkey, true ); } // Trigger Event: jcb_ce_onAfterBuildFields $this->triggerEvent( 'jcb_ce_onAfterBuildFields', array(&$this->componentContext, &$dynamicFieldsXML, &$readOnlyXML, &$dbkey, &$view, &$component, &$nameSingleCode, &$nameListCode, &$this->placeholders, &$langView, &$langViews) ); // set the default fields $XML = new simpleXMLElement('<a/>'); $fieldSetXML = $XML->addChild('fieldset'); $fieldSetXML->addAttribute('name', 'details'); ComponentbuilderHelper::xmlComment( $fieldSetXML, $this->setLine(__LINE__) . " Default Fields." ); ComponentbuilderHelper::xmlComment( $fieldSetXML, $this->setLine(__LINE__) . " 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, $this->setLine(__LINE__) . " 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, $this->setLine(__LINE__) . " 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, $this->setLine(__LINE__) . " 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, $this->setLine(__LINE__) . " 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, $this->setLine(__LINE__) . " 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]) && ComponentbuilderHelper::checkString( $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, $this->setLine(__LINE__) . " 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, $this->setLine(__LINE__) . " 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, $this->setLine(__LINE__) . " 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]) && ComponentbuilderHelper::checkString( $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, $this->setLine(__LINE__) . " 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, $this->setLine(__LINE__) . " Metadesc Field. Type: Textarea (joomla)" ); $fieldXML = $fieldSetXML->addChild('field'); ComponentbuilderHelper::xmlAddAttributes( $fieldXML, $attributes ); // count the static field created $this->fieldCount++; } } // load the dynamic fields now if (count((array) $dynamicFieldsXML)) { ComponentbuilderHelper::xmlComment( $fieldSetXML, $this->setLine(__LINE__) . " Dynamic Fields." ); foreach ($dynamicFieldsXML as $dynamicfield) { ComponentbuilderHelper::xmlAppend($fieldSetXML, $dynamicfield); } } // check if metadata is added to this view if (isset($this->metadataBuilder[$nameSingleCode]) && ComponentbuilderHelper::checkString( $this->metadataBuilder[$nameSingleCode] )) { if (!isset($this->fieldsNames[$nameSingleCode]['robots']) || !isset($this->fieldsNames[$nameSingleCode]['author']) || !isset($this->fieldsNames[$nameSingleCode]['rights'])) { ComponentbuilderHelper::xmlComment( $fieldSetXML, $this->setLine(__LINE__) . " 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, $this->setLine(__LINE__) . " 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, $this->setLine(__LINE__) . " 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, $this->setLine(__LINE__) . " 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'); } /** * 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 ($this->fieldBuilderType == 1) { // string manipulation $dynamicField = ''; } else { // simpleXMLElement class $dynamicField = false; } // make sure we have settings if (isset($field['settings']) && ComponentbuilderHelper::checkObject( $field['settings'] )) { // reset some values $name = $this->getFieldName($field, $nameListCode); $typeName = $this->getFieldType($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 (ComponentbuilderHelper::checkArray($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']) && ComponentbuilderHelper::checkArray( $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 (ComponentbuilderHelper::checkArray($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) && ComponentbuilderHelper::checkString( $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 ($this->fieldBuilderType == 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 . $this->_t(2) . "<!--" . $this->setLine(__LINE__) . " " . $newxmlField->comment . ' -->' . PHP_EOL . $this->_t(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 ($this->fieldBuilderType == 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 . $this->_t(1) . $taber . $this->_t(1) . "<!--" . $this->setLine(__LINE__) . " " . ucfirst($name) . " Field. Type: " . ComponentbuilderHelper::safeString( $typeName, 'F' ) . ". (joomla) -->"; $field .= PHP_EOL . $this->_t(1) . $taber . $this->_t(1) . "<field"; $optionSet = ''; foreach ($fieldAttributes as $property => $value) { if ($property != 'option') { $field .= PHP_EOL . $this->_t(2) . $taber . $this->_t(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 . '_' . ComponentbuilderHelper::safeFieldName( $valueKeyArray[0], true ); // add to lang array $this->setLangContent( $this->lang, $langValue, $valueKeyArray[0] ); // now add group label $groups_[$valueKeyArray[1]] = PHP_EOL . $this->_t(1) . $taber . $this->_t(2) . '<group label="' . $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 . '_' . ComponentbuilderHelper::safeFieldName( $valueKeyArray[1], true ); // add to lang array $this->setLangContent( $this->lang, $langValue, $valueKeyArray[1] ); // now add to option set $grouped_['group'][$valueKeyArray[2]][] = PHP_EOL . $this->_t(1) . $taber . $this->_t(3) . '<option value="' . $valueKeyArray[0] . '">' . PHP_EOL . $this->_t(1) . $taber . $this->_t(4) . $langValue . '</option>'; $optionArray[$valueKeyArray[0]] = $langValue; // set order $order_['group' . $valueKeyArray[2]] = $valueKeyArray[2]; } else { $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName( $valueKeyArray[1], true ); // add to lang array $this->setLangContent( $this->lang, $langValue, $valueKeyArray[1] ); // now add to option set $grouped_['option'][$valueKeyArray[0]] = PHP_EOL . $this->_t(1) . $taber . $this->_t(2) . '<option value="' . $valueKeyArray[0] . '">' . PHP_EOL . $this->_t(1) . $taber . $this->_t(3) . $langValue . '</option>'; $optionArray[$valueKeyArray[0]] = $langValue; // set order $order_['option' . $valueKeyArray[0]] = $valueKeyArray[0]; } } else { // text is also the value $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName( $option, true ); // add to lang array $this->setLangContent( $this->lang, $langValue, $option ); // now add to option set $grouped_['option'][$option] = PHP_EOL . $this->_t(1) . $taber . $this->_t(2) . '<option value="' . $option . '">' . PHP_EOL . $this->_t(1) . $taber . $this->_t(3) . $langValue . '</option>'; $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]) && ComponentbuilderHelper::checkArray( $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 . $this->_t(1) . $taber . $this->_t(2) . '</group>'; } elseif (isset($grouped_[$key_][$_id]) && ComponentbuilderHelper::checkString( $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 . '_' . ComponentbuilderHelper::safeFieldName( $t, true ); // add to lang array $this->setLangContent( $this->lang, $langValue, $t ); // now add to option set $optionSet .= PHP_EOL . $this->_t(1) . $taber . $this->_t(2) . '<option value="' . $v . '">' . PHP_EOL . $this->_t(1) . $taber . $this->_t(3) . $langValue . '</option>'; $optionArray[$v] = $langValue; } else { // text is also the value $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName( $option, true ); // add to lang array $this->setLangContent( $this->lang, $langValue, $option ); // now add to option set $optionSet .= PHP_EOL . $this->_t(2) . $taber . $this->_t(1) . '<option value="' . $option . '">' . PHP_EOL . $this->_t(2) . $taber . $this->_t(2) . $langValue . '</option>'; $optionArray[$option] = $langValue; } } } else { // one option if (strpos($value, '|') !== false) { // has other value then text list($v, $t) = explode('|', $value); $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName( $t, true ); // add to lang array $this->setLangContent($this->lang, $langValue, $t); // now add to option set $optionSet .= PHP_EOL . $this->_t(2) . $taber . $this->_t(1) . '<option value="' . $v . '">' . PHP_EOL . $this->_t(2) . $taber . $this->_t(2) . $langValue . '</option>'; $optionArray[$v] = $langValue; } else { // text is also the value $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName( $value, true ); // add to lang array $this->setLangContent( $this->lang, $langValue, $value ); // now add to option set $optionSet .= PHP_EOL . $this->_t(2) . $taber . $this->_t(1) . '<option value="' . $value . '">' . PHP_EOL . $this->_t(2) . $taber . $this->_t(2) . $langValue . '</option>'; $optionArray[$value] = $langValue; } } } } // if options were found if (ComponentbuilderHelper::checkString($optionSet)) { $field .= '>'; $field .= PHP_EOL . $this->_t(3) . $taber . "<!--" . $this->setLine(__LINE__) . " Option Set. -->"; $field .= $optionSet; $field .= PHP_EOL . $this->_t(2) . $taber . "</field>"; } // if no options found and must have a list of options elseif (ComponentbuilderHelper::fieldCheck($typeName, 'list')) { $optionArray = false; $field .= PHP_EOL . $this->_t(2) . $taber . "/>"; $field .= PHP_EOL . $this->_t(2) . $taber . "<!--" . $this->setLine(__LINE__) . " No Manual Options Were Added In Field Settings. -->" . PHP_EOL; } else { $optionArray = false; $field .= PHP_EOL . $this->_t(2) . $taber . "/>"; } } elseif ($setType === 'plain') { // now add to the field set $field .= PHP_EOL . $this->_t(2) . $taber . "<!--" . $this->setLine( __LINE__ ) . " " . ucfirst($name) . " Field. Type: " . ComponentbuilderHelper::safeString($typeName, 'F') . ". (joomla) -->"; $field .= PHP_EOL . $this->_t(2) . $taber . "<field"; foreach ($fieldAttributes as $property => $value) { if ($property != 'option') { $field .= PHP_EOL . $this->_t(2) . $taber . $this->_t(1) . $property . '="' . $value . '"'; } } $field .= PHP_EOL . $this->_t(2) . $taber . "/>"; } elseif ($setType === 'spacer') { // now add to the field set $field .= PHP_EOL . $this->_t(2) . "<!--" . $this->setLine(__LINE__) . " " . ucfirst($name) . " Field. Type: " . ComponentbuilderHelper::safeString($typeName, 'F') . ". A None Database Field. (joomla) -->"; $field .= PHP_EOL . $this->_t(2) . "<field"; foreach ($fieldAttributes as $property => $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 . $this->_t(2) . "<!--" . $this->setLine( __LINE__ ) . " " . ucfirst($name) . " Field. Type: " . ComponentbuilderHelper::safeString($typeName, 'F') . ". (joomla) -->"; $field .= PHP_EOL . $this->_t(2) . "<field"; $fieldsSet = array(); foreach ($fieldAttributes as $property => $value) { if ($property != 'fields') { $field .= PHP_EOL . $this->_t(3) . $property . '="' . $value . '"'; } } $field .= ">"; $field .= PHP_EOL . $this->_t(3) . '<fields name="' . $fieldAttributes['name'] . '_fields" label="">'; $field .= PHP_EOL . $this->_t(4) . '<fieldset hidden="true" name="' . $fieldAttributes['name'] . '_modal" 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 (ComponentbuilderHelper::checkArray($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 $this->setFieldDetails( $field, $nameSingleCode, $nameListCode, $_resolverKey ); // return field return $field; }, array_values($fieldsSets) ); // start the build foreach ($fieldsSets as $fieldData) { // if we have settings continue if (ComponentbuilderHelper::checkObject( $fieldData['settings'] )) { $r_name = $this->getFieldName( $fieldData, $nameListCode, $_resolverKey ); $r_typeName = $this->getFieldType($fieldData); $r_multiple = false; $r_langLabel = ''; // add the tabs needed $r_taber = $this->_t(3); // 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 (ComponentbuilderHelper::checkArray( $r_fieldValues )) { //reset options array $r_optionArray = array(); if (ComponentbuilderHelper::fieldCheck( $r_typeName, 'option' )) { // now add to the field set $field .= $this->setField( 'option', $r_fieldValues, $r_name, $r_typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $r_optionArray, null, $r_taber ); } elseif (isset($r_fieldValues['custom']) && ComponentbuilderHelper::checkArray( $r_fieldValues['custom'] )) { // add to custom $custom = $r_fieldValues['custom']; unset($r_fieldValues['custom']); // now add to the field set $field .= $this->setField( 'custom', $r_fieldValues, $r_name, $r_typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $r_optionArray, null, $r_taber ); // set lang (just incase) $r_listLangName = $langView . '_' . ComponentbuilderHelper::safeFieldName( $r_name, true ); // add to lang array $this->setLangContent( $this->lang, $r_listLangName, ComponentbuilderHelper::safeString( $r_name, 'W' ) ); // if label was set use instead if (ComponentbuilderHelper::checkString( $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 $field .= $this->setField( 'plain', $r_fieldValues, $r_name, $r_typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $r_optionArray, null, $r_taber ); } } } } } $field .= PHP_EOL . $this->_t(4) . "</fieldset>"; $field .= PHP_EOL . $this->_t(3) . "</fields>"; $field .= PHP_EOL . $this->_t(2) . "</field>"; } // set the subform fields (it is a repeatable without the modal) elseif ($typeName === 'subform') { // now add to the field set $field .= PHP_EOL . $this->_t(2) . $taber . "<!--" . $this->setLine(__LINE__) . " " . ucfirst($name) . " Field. Type: " . ComponentbuilderHelper::safeString( $typeName, 'F' ) . ". (joomla) -->"; $field .= PHP_EOL . $this->_t(2) . $taber . "<field"; $fieldsSet = array(); foreach ($fieldAttributes as $property => $value) { if ($property != 'fields') { $field .= PHP_EOL . $this->_t(3) . $taber . $property . '="' . $value . '"'; } } $field .= ">"; $field .= PHP_EOL . $this->_t(3) . $taber . '<form hidden="true" name="list_' . $fieldAttributes['name'] . '_modal" 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 (ComponentbuilderHelper::checkArray($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 $this->setFieldDetails( $field, $nameSingleCode, $nameListCode, $_resolverKey ); // return field return $field; }, array_values($fieldsSets) ); // start the build foreach ($fieldsSets as $fieldData) { // if we have settings continue if (ComponentbuilderHelper::checkObject( $fieldData['settings'] )) { $r_name = $this->getFieldName( $fieldData, $nameListCode, $_resolverKey ); $r_typeName = $this->getFieldType($fieldData); $r_multiple = false; $r_langLabel = ''; // add the tabs needed $r_taber = $this->_t(2) . $taber; // 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 (ComponentbuilderHelper::checkArray( $r_fieldValues )) { //reset options array $r_optionArray = array(); if (ComponentbuilderHelper::fieldCheck( $r_typeName, 'option' )) { // now add to the field set $field .= $this->setField( 'option', $r_fieldValues, $r_name, $r_typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $r_optionArray, null, $r_taber ); } 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 $field .= $this->setField( 'special', $r_fieldValues, $r_name, $r_typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $r_optionArray, null, $r_taber ); } } elseif (isset($r_fieldValues['custom']) && ComponentbuilderHelper::checkArray( $r_fieldValues['custom'] )) { // add to custom $custom = $r_fieldValues['custom']; unset($r_fieldValues['custom']); // now add to the field set $field .= $this->setField( 'custom', $r_fieldValues, $r_name, $r_typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $r_optionArray, null, $r_taber ); // set lang (just incase) $r_listLangName = $langView . '_' . ComponentbuilderHelper::safeFieldName( $r_name, true ); // add to lang array $this->setLangContent( $this->lang, $r_listLangName, ComponentbuilderHelper::safeString( $r_name, 'W' ) ); // if label was set use instead if (ComponentbuilderHelper::checkString( $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 $field .= $this->setField( 'plain', $r_fieldValues, $r_name, $r_typeName, $langView, $nameSingleCode, $nameListCode, $placeholders, $r_optionArray, null, $r_taber ); } } } } } $field .= PHP_EOL . $this->_t(3) . $taber . "</form>"; $field .= PHP_EOL . $this->_t(2) . $taber . "</field>"; } } elseif ($setType === 'custom') { // now add to the field set $field .= PHP_EOL . $this->_t(2) . $taber . "<!--" . $this->setLine( __LINE__ ) . " " . ucfirst($name) . " Field. Type: " . ComponentbuilderHelper::safeString($typeName, 'F') . ". (custom) -->"; $field .= PHP_EOL . $this->_t(2) . $taber . "<field"; $optionSet = ''; foreach ($fieldAttributes as $property => $value) { if ($property != 'option') { $field .= PHP_EOL . $this->_t(2) . $taber . $this->_t(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 . '_' . ComponentbuilderHelper::safeFieldName( $valueKeyArray[0], true ); // add to lang array $this->setLangContent( $this->lang, $langValue, $valueKeyArray[0] ); // now add group label $groups_[$valueKeyArray[1]] = PHP_EOL . $this->_t(1) . $taber . $this->_t(2) . '<group label="' . $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 . '_' . ComponentbuilderHelper::safeFieldName( $valueKeyArray[1], true ); // add to lang array $this->setLangContent( $this->lang, $langValue, $valueKeyArray[1] ); // now add to option set $grouped_['group'][$valueKeyArray[2]][] = PHP_EOL . $this->_t(1) . $taber . $this->_t(3) . '<option value="' . $valueKeyArray[0] . '">' . PHP_EOL . $this->_t(1) . $taber . $this->_t(4) . $langValue . '</option>'; $optionArray[$valueKeyArray[0]] = $langValue; // set order $order_['group' . $valueKeyArray[2]] = $valueKeyArray[2]; } else { $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName( $valueKeyArray[1], true ); // add to lang array $this->setLangContent( $this->lang, $langValue, $valueKeyArray[1] ); // now add to option set $grouped_['option'][$valueKeyArray[0]] = PHP_EOL . $this->_t(1) . $taber . $this->_t(2) . '<option value="' . $valueKeyArray[0] . '">' . PHP_EOL . $this->_t(1) . $taber . $this->_t(3) . $langValue . '</option>'; $optionArray[$valueKeyArray[0]] = $langValue; // set order $order_['option' . $valueKeyArray[0]] = $valueKeyArray[0]; } } else { // text is also the value $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName( $option, true ); // add to lang array $this->setLangContent( $this->lang, $langValue, $option ); // now add to option set $grouped_['option'][$option] = PHP_EOL . $this->_t(1) . $taber . $this->_t(2) . '<option value="' . $option . '">' . PHP_EOL . $this->_t(1) . $taber . $this->_t(3) . $langValue . '</option>'; $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]) && ComponentbuilderHelper::checkArray( $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 . $this->_t(1) . $taber . $this->_t(2) . '</group>'; } elseif (isset($grouped_[$key_][$_id]) && ComponentbuilderHelper::checkString( $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 . '_' . ComponentbuilderHelper::safeFieldName( $t, true ); // add to lang array $this->setLangContent( $this->lang, $langValue, $t ); // now add to option set $optionSet .= PHP_EOL . $this->_t(1) . $taber . $this->_t(2) . '<option value="' . $v . '">' . PHP_EOL . $this->_t(1) . $taber . $this->_t(3) . $langValue . '</option>'; $optionArray[$v] = $langValue; } else { // text is also the value $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName( $option, true ); // add to lang array $this->setLangContent( $this->lang, $langValue, $option ); // now add to option set $optionSet .= PHP_EOL . $this->_t(2) . $taber . $this->_t(1) . '<option value="' . $option . '">' . PHP_EOL . $this->_t(2) . $taber . $this->_t(2) . $langValue . '</option>'; $optionArray[$option] = $langValue; } } } else { // one option if (strpos($value, '|') !== false) { // has other value then text list($v, $t) = explode('|', $value); $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName( $t, true ); // add to lang array $this->setLangContent($this->lang, $langValue, $t); // now add to option set $optionSet .= PHP_EOL . $this->_t(2) . $taber . $this->_t(1) . '<option value="' . $v . '">' . PHP_EOL . $this->_t(2) . $taber . $this->_t(2) . $langValue . '</option>'; $optionArray[$v] = $langValue; } else { // text is also the value $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName( $value, true ); // add to lang array $this->setLangContent( $this->lang, $langValue, $value ); // now add to option set $optionSet .= PHP_EOL . $this->_t(2) . $taber . $this->_t(1) . '<option value="' . $value . '">' . PHP_EOL . $this->_t(2) . $taber . $this->_t(2) . $langValue . '</option>'; $optionArray[$value] = $langValue; } } } } // if options were found if (ComponentbuilderHelper::checkString($optionSet)) { $field .= '>'; $field .= PHP_EOL . $this->_t(3) . $taber . "<!--" . $this->setLine(__LINE__) . " Option Set. -->"; $field .= $optionSet; $field .= PHP_EOL . $this->_t(2) . $taber . "</field>"; } // if no options found and must have a list of options elseif (ComponentbuilderHelper::fieldCheck($typeName, 'list')) { $optionArray = false; $field .= PHP_EOL . $this->_t(2) . $taber . "/>"; $field .= PHP_EOL . $this->_t(2) . $taber . "<!--" . $this->setLine(__LINE__) . " No Manual Options Were Added In Field Settings. -->" . PHP_EOL; } else { $optionArray = false; $field .= PHP_EOL . $this->_t(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 . '_' . ComponentbuilderHelper::safeString($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/>'); $field->comment = $this->setLine(__LINE__) . " " . ucfirst($name) . " Field. Type: " . ComponentbuilderHelper::safeString( $typeName, 'F' ) . ". (joomla)"; foreach ($fieldAttributes as $property => $value) { if ($property != 'option') { $field->fieldXML->addAttribute($property, $value); } elseif ($property === 'option') { ComponentbuilderHelper::xmlComment( $field->fieldXML, $this->setLine(__LINE__) . " 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 . '_' . ComponentbuilderHelper::safeFieldName( $valueKeyArray[0], true ); // add to lang array $this->setLangContent( $this->lang, $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 . '_' . ComponentbuilderHelper::safeFieldName( $valueKeyArray[1], true ); // add to lang array $this->setLangContent( $this->lang, $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 . '_' . ComponentbuilderHelper::safeFieldName( $valueKeyArray[1], true ); // add to lang array $this->setLangContent( $this->lang, $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 . '_' . ComponentbuilderHelper::safeFieldName( $option, true ); // add to lang array $this->setLangContent( $this->lang, $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]) && ComponentbuilderHelper::checkArray( $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]) && ComponentbuilderHelper::checkString( $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 . '_' . ComponentbuilderHelper::safeFieldName( $t, true ); // add to lang array $this->setLangContent( $this->lang, $langValue, $t ); // now add to option set $optionXML->addAttribute('value', $v); $optionArray[$v] = $langValue; } else { // text is also the value $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName( $option, true ); // add to lang array $this->setLangContent( $this->lang, $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 . '_' . ComponentbuilderHelper::safeFieldName( $t, true ); // add to lang array $this->setLangContent($this->lang, $langValue, $t); // now add to option set $optionXML->addAttribute('value', $v); $optionArray[$v] = $langValue; } else { // text is also the value $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName( $value, true ); // add to lang array $this->setLangContent( $this->lang, $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, $this->setLine(__LINE__) . " No Manual Options Were Added In Field Settings." ); } } elseif ($setType === 'plain') { // now add to the field set $field->fieldXML = new SimpleXMLElement('<field/>'); $field->comment = $this->setLine(__LINE__) . " " . ucfirst($name) . " Field. Type: " . ComponentbuilderHelper::safeString( $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/>'); $field->comment = $this->setLine(__LINE__) . " " . ucfirst($name) . " Field. Type: " . ComponentbuilderHelper::safeString( $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/>'); $field->comment = $this->setLine(__LINE__) . " " . ucfirst( $name ) . " Field. Type: " . ComponentbuilderHelper::safeString( $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 (ComponentbuilderHelper::checkArray($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 $this->setFieldDetails( $field, $nameSingleCode, $nameListCode, $_resolverKey ); // return field return $field; }, array_values($fieldsSets) ); // start the build foreach ($fieldsSets as $fieldData) { // if we have settings continue if (ComponentbuilderHelper::checkObject( $fieldData['settings'] )) { $r_name = $this->getFieldName( $fieldData, $nameListCode, $_resolverKey ); $r_typeName = $this->getFieldType($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 (ComponentbuilderHelper::checkArray( $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']) && ComponentbuilderHelper::checkArray( $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 . '_' . ComponentbuilderHelper::safeFieldName( $r_name, true ); // add to lang array $this->setLangContent( $this->lang, $r_listLangName, ComponentbuilderHelper::safeString( $r_name, 'W' ) ); // if label was set use instead if (ComponentbuilderHelper::checkString( $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/>'); $field->comment = $this->setLine(__LINE__) . " " . ucfirst( $name ) . " Field. Type: " . ComponentbuilderHelper::safeString( $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']) && ComponentbuilderHelper::checkString( $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 (ComponentbuilderHelper::checkArray($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 $this->setFieldDetails( $field, $nameSingleCode, $nameListCode, $_resolverKey ); // return field return $field; }, array_values($fieldsSets) ); // start the build foreach ($fieldsSets as $fieldData) { // if we have settings continue if (ComponentbuilderHelper::checkObject( $fieldData['settings'] )) { $r_name = $this->getFieldName( $fieldData, $nameListCode, $_resolverKey ); $r_typeName = $this->getFieldType($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 (ComponentbuilderHelper::checkArray( $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']) && ComponentbuilderHelper::checkArray( $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 . '_' . ComponentbuilderHelper::safeFieldName( $r_name, true ); // add to lang array $this->setLangContent( $this->lang, $r_listLangName, ComponentbuilderHelper::safeString( $r_name, 'W' ) ); // if label was set use instead if (ComponentbuilderHelper::checkString( $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/>'); $field->comment = $this->setLine(__LINE__) . " " . ucfirst($name) . " Field. Type: " . ComponentbuilderHelper::safeString( $typeName, 'F' ) . ". (custom)"; foreach ($fieldAttributes as $property => $value) { if ($property != 'option') { $field->fieldXML->addAttribute($property, $value); } elseif ($property === 'option') { ComponentbuilderHelper::xmlComment( $field->fieldXML, $this->setLine(__LINE__) . " 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 . '_' . ComponentbuilderHelper::safeFieldName( $valueKeyArray[0], true ); // add to lang array $this->setLangContent( $this->lang, $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 . '_' . ComponentbuilderHelper::safeFieldName( $valueKeyArray[1], true ); // add to lang array $this->setLangContent( $this->lang, $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 . '_' . ComponentbuilderHelper::safeFieldName( $valueKeyArray[1], true ); // add to lang array $this->setLangContent( $this->lang, $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 . '_' . ComponentbuilderHelper::safeFieldName( $option, true ); // add to lang array $this->setLangContent( $this->lang, $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]) && ComponentbuilderHelper::checkArray( $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]) && ComponentbuilderHelper::checkString( $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 . '_' . ComponentbuilderHelper::safeFieldName( $t, true ); // add to lang array $this->setLangContent( $this->lang, $langValue, $t ); // now add to option set $optionXML->addAttribute('value', $v); $optionArray[$v] = $langValue; } else { // text is also the value $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName( $option, true ); // add to lang array $this->setLangContent( $this->lang, $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 . '_' . ComponentbuilderHelper::safeFieldName( $t, true ); // add to lang array $this->setLangContent($this->lang, $langValue, $t); // now add to option set $optionXML->addAttribute('value', $v); $optionArray[$v] = $langValue; } else { // text is also the value $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName( $value, true ); // add to lang array $this->setLangContent( $this->lang, $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 . '_' . ComponentbuilderHelper::safeString($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 (ComponentbuilderHelper::checkString($tabName) && $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]) && ComponentbuilderHelper::checkArray( $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 (ComponentbuilderHelper::checkArray($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 = $this->setPlaceholders($name, $placeholders); } elseif ($property['name'] === 'validate') { // check if we have validate (validation rule set) $xmlValue = ComponentbuilderHelper::getBetween( $field['settings']->xml, 'validate="', '"' ); if (ComponentbuilderHelper::checkString($xmlValue)) { $xmlValue = ComponentbuilderHelper::safeString( $xmlValue ); } } elseif ($property['name'] === 'extension' || $property['name'] === 'directory' || $property['name'] === 'formsource') { // get value & replace the placeholders $xmlValue = $this->setPlaceholders( ComponentbuilderHelper::getBetween( $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] = $this->setDynamicValues( ComponentbuilderHelper::openValidBase64( ComponentbuilderHelper::getBetween( $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) ComponentbuilderHelper::getBetween( $field['settings']->xml, $property['name'] . '="', '"' ); } elseif ($property['name'] === 'extends' && $setCustom) { // load the class that is being extended $fieldAttributes['custom']['extends'] = ComponentbuilderHelper::getBetween( $field['settings']->xml, 'extends="', '"' ); } elseif ($property['name'] === 'view' && $setCustom) { // load the view name & replace the placeholders $fieldAttributes['custom']['view'] = ComponentbuilderHelper::safeString( $this->setPlaceholders( ComponentbuilderHelper::getBetween( $field['settings']->xml, 'view="', '"' ), $placeholders ) ); } elseif ($property['name'] === 'views' && $setCustom) { // load the views name & replace the placeholders $fieldAttributes['custom']['views'] = ComponentbuilderHelper::safeString( $this->setPlaceholders( ComponentbuilderHelper::getBetween( $field['settings']->xml, 'views="', '"' ), $placeholders ) ); } elseif ($property['name'] === 'component' && $setCustom) { // load the component name & replace the placeholders $fieldAttributes['custom']['component'] = $this->setPlaceholders( ComponentbuilderHelper::getBetween( $field['settings']->xml, 'component="', '"' ), $placeholders ); } elseif ($property['name'] === 'table' && $setCustom) { // load the main table that is queried & replace the placeholders $fieldAttributes['custom']['table'] = $this->setPlaceholders( ComponentbuilderHelper::getBetween( $field['settings']->xml, 'table="', '"' ), $placeholders ); } elseif ($property['name'] === 'value_field' && $setCustom) { // load the text key $fieldAttributes['custom']['text'] = ComponentbuilderHelper::safeString( ComponentbuilderHelper::getBetween( $field['settings']->xml, 'value_field="', '"' ) ); } elseif ($property['name'] === 'key_field' && $setCustom) { // load the id key $fieldAttributes['custom']['id'] = ComponentbuilderHelper::safeString( ComponentbuilderHelper::getBetween( $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) ComponentbuilderHelper::safeString( ComponentbuilderHelper::getBetween( $field['settings']->xml, 'button="', '"' ) ); // add to custom values $fieldAttributes['custom']['add_button'] = (ComponentbuilderHelper::checkString($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) ComponentbuilderHelper::getBetween( $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 = ComponentbuilderHelper::getBetween( $field['settings']->xml, 'class="', '"' ); // add the type class if (ComponentbuilderHelper::checkString($xmlValue)) { if (strpos($xmlValue, $name) === false) { $xmlValue = $xmlValue . ' ' . $name; } } else { $xmlValue = $name; } } else { // set the rest of the fields $xmlValue = (string) $this->setPlaceholders( ComponentbuilderHelper::getBetween( $field['settings']->xml, $property['name'] . '="', '"' ), $placeholders ); } // check if translatable if (ComponentbuilderHelper::checkString($xmlValue) && isset($property['translatable']) && $property['translatable'] == 1) { // update label if field use multiple times if ($property['name'] === 'label') { if (isset($fieldAttributes['name']) && isset($this->uniqueNames[$nameListCode]['names'][$fieldAttributes['name']])) { $xmlValue .= ' (' . ComponentbuilderHelper::safeString( $this->uniqueNames[$nameListCode]['names'][$fieldAttributes['name']] ) . ')'; } } // replace placeholders $xmlValue = $this->setPlaceholders( $xmlValue, $placeholders ); // insure custom lables dont get messed up if ($setCustom) { $customLabel = $xmlValue; } // set lang key $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName( $name . ' ' . $property['name'], true ); // add to lang array $this->setLangContent($this->lang, $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 (ComponentbuilderHelper::checkString($xmlValue) || (isset($property['mandatory']) && $property['mandatory'] == 1 && !$setCustom)) { // make sure mantory fields are added if (!ComponentbuilderHelper::checkString($xmlValue)) { if (isset($property['example']) && ComponentbuilderHelper::checkString( $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 = ComponentbuilderHelper::getBetween( $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 (ComponentbuilderHelper::checkArray($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] = $this->setDynamicValues( 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 = ComponentbuilderHelper::getBetween( $field['settings']->xml, 'listclass="', '"' ); if (ComponentbuilderHelper::checkString($listclass)) { $this->listFieldClass[$nameListCode][$fieldAttributes['name']] = $listclass; } // check if we find reason to remove this field from being escaped $escaped = ComponentbuilderHelper::getBetween( $field['settings']->xml, 'escape="', '"' ); if (ComponentbuilderHelper::checkString($escaped)) { $this->doNotEscape[$nameListCode][] = $fieldAttributes['name']; } // check if we have display switch for dynamic placment $display = ComponentbuilderHelper::getBetween( $field['settings']->xml, 'display="', '"' ); if (ComponentbuilderHelper::checkString($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 = ComponentbuilderHelper::getBetween( $field['settings']->xml, 'validate="', '"' ); if (ComponentbuilderHelper::checkString($validationRule)) { $fieldAttributes['validate'] = ComponentbuilderHelper::safeString( $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 ) { // dbSwitch $dbSwitch = true; if (isset($field['list']) && $field['list'] == 2) { // do not add this field to the database $dbSwitch = false; } elseif ($typeName === 'tag') { // set tags for this view but don't load to DB $this->tagsBuilder[$nameSingleCode] = $nameSingleCode; } 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 = (isset($this->listJoinBuilder[$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 (isset($this->catOtherName[$nameListCode]) && ComponentbuilderHelper::checkArray( $this->catOtherName[$nameListCode] )) { $tempName = $this->catOtherName[$nameListCode]['name']; } else { $tempName = $nameListCode . ' categories'; } // set lang $listLangName = $langView . '_' . ComponentbuilderHelper::safeFieldName($tempName, true); // set field name $listFieldName = ComponentbuilderHelper::safeString($tempName, 'W'); // add to lang array $this->setLangContent( $this->lang, $listLangName, $listFieldName ); } else { // set lang (just in case) $listLangName = $langView . '_' . ComponentbuilderHelper::safeFieldName($name, true); // set field name $listFieldName = ComponentbuilderHelper::safeString($name, 'W'); // add to lang array $this->setLangContent( $this->lang, $listLangName, $listFieldName ); // if label was set use instead if (ComponentbuilderHelper::checkString($langLabel)) { $listLangName = $langLabel; } } // build the list values if (($listSwitch || $listJoin) && $typeName != 'repeatable' && $typeName != 'subform') { // load to list builder if ($listSwitch) { $this->listBuilder[$nameListCode][] = array( '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) { $this->listJoinBuilder[$nameListCode][(int) $field['field']] = array( '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 (isset($this->fieldRelations[$nameListCode]) && isset($this->fieldRelations[$nameListCode][(int) $field['field']]) && ComponentbuilderHelper::checkArray( $this->fieldRelations[$nameListCode][(int) $field['field']] )) { foreach ( $this->fieldRelations[$nameListCode][(int) $field['field']] as $area => &$field_values ) { $field_values['type'] = $typeName; $field_values['code'] = $name; $field_values['custom'] = $custom; } } // set the hidden field of this view if ($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 ($typeName != 'category' && $typeName != 'repeatable' && $typeName != 'subform' && !in_array($name, $this->defaultFields)) { if (!isset($this->dynamicfieldsBuilder[$nameSingleCode])) { $this->dynamicfieldsBuilder[$nameSingleCode] = ''; } if (isset($this->dynamicfieldsBuilder[$nameSingleCode]) && ComponentbuilderHelper::checkString( $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]) || !ComponentbuilderHelper::checkString( $this->maintextBuilder[$nameSingleCode] )) { $this->maintextBuilder[$nameSingleCode] = $name; } } // set the custom builder if (ComponentbuilderHelper::checkArray($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']) && ComponentbuilderHelper::checkString( $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 (isset($this->catOtherName[$nameListCode]) && ComponentbuilderHelper::checkArray( $this->catOtherName[$nameListCode] )) { $otherViews = $this->catOtherName[$nameListCode]['views']; $otherView = $this->catOtherName[$nameListCode]['view']; } else { $otherViews = $nameListCode; $otherView = $nameSingleCode; } // get the xml extension name $_extension = $this->setPlaceholders( ComponentbuilderHelper::getBetween( $field['settings']->xml, 'extension="', '"' ), $this->placeholders ); // if they left out the extension for some reason if (!ComponentbuilderHelper::checkString($_extension)) { $_extension = 'com_' . $this->componentCodeName . '.' . $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( '<hr /><h3>Category targeting view mismatch</h3> <p>The <a href="index.php?option=com_componentbuilder&view=fields&task=field.edit&id=%s" target="_blank" title="open field"> category field</a> in <b>(%s) admin view</b> has a mismatching target view. <br />To correct the mismatch, the <b>extension</b> value <code>%s</code> in the <a href="index.php?option=com_componentbuilder&view=fields&task=field.edit&id=%s" target="_blank" title="open category field"> field</a> must be changed to <code>%s</code> for <a href="https://github.com/vdm-io/Joomla-Component-Builder/issues/561" target="_blank" title="view issue on gitHub"> best category integration with Joomla</a>. <br /><b>Please watch <a href="https://youtu.be/R4WQgcu6Xns" target="_blank" title="very important info on the topic"> this tutorial</a> before proceeding!!!</b>, <a href="https://gist.github.com/Llewellynvdm/e053dc39ae3b2bf769c76a3e62c75b95" target="_blank" title="first watch the tutorial to understand how to use this code">code fix</a></p>', $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); // 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' || (ComponentbuilderHelper::checkArray($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 ); break; case 2: // BASE_SIXTY_FOUR $this->base64Builder[$nameSingleCode][] = $name; // Site settings of each field if needed $this->buildSiteFieldData( $nameSingleCode, $name, 'base64', $typeName ); break; case 3: // BASIC_ENCRYPTION_LOCALKEY $this->basicFieldModeling[$nameSingleCode][] = $name; // Site settings of each field if needed $this->buildSiteFieldData( $nameSingleCode, $name, 'basic_encryption', $typeName ); break; case 4: // WHMCS_ENCRYPTION_VDMKEY $this->whmcsFieldModeling[$nameSingleCode][] = $name; // Site settings of each field if needed $this->buildSiteFieldData( $nameSingleCode, $name, 'whmcs_encryption', $typeName ); break; case 5: // MEDIUM_ENCRYPTION_LOCALFILE $this->mediumFieldModeling[$nameSingleCode][] = $name; // Site settings of each field if needed $this->buildSiteFieldData( $nameSingleCode, $name, 'medium_encryption', $typeName ); 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; 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 (ComponentbuilderHelper::checkArray($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) && !ComponentbuilderHelper::checkArray($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 (ComponentbuilderHelper::checkArray($options) && ($listSwitch || $listJoin) && $typeName != 'repeatable' && $typeName != 'subform') { $this->selectionTranslationFixBuilder[$nameListCode][$name] = $options; } // main lang filter prefix $lang_filter_ = $this->langPrefix . '_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_ . ComponentbuilderHelper::safeString( $filter_name_asc, 'U' ); // and to translation $this->setLangContent( $this->lang, $filter_name_asc_lang, $filter_name_asc ); // set the language strings for descending $filter_name_desc = $listFieldName . ' descending'; $filter_name_desc_lang = $lang_filter_ . ComponentbuilderHelper::safeString( $filter_name_desc, 'U' ); // and to translation $this->setLangContent( $this->lang, $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 = ComponentbuilderHelper::safeString( $name . $field['filter'] . $typeName ); $filter_type_code = preg_replace('/_+/', '', $filter_type_code); $filter_function_name = ComponentbuilderHelper::safeString( $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_ . ComponentbuilderHelper::safeString( $filter_name_select, 'U' ); // and to translation $this->setLangContent( $this->lang, $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); } /** * 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) || !isset( $this->fileContentDynamic['customfield_' . $data['type']] ) || !ComponentbuilderHelper::checkArray( $this->fileContentDynamic['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' => $this->_t(1), '\n' => PHP_EOL ); // set the [[[PLACEHOLDER]]] options $replace = array( $this->bbb . 'JPREFIX' . $this->ddd => $jprefix, $this->bbb . 'TABLE' . $this->ddd => (isset($data['custom']['table'])) ? $data['custom']['table'] : '', $this->bbb . 'ID' . $this->ddd => (isset($data['custom']['id'])) ? $data['custom']['id'] : '', $this->bbb . 'TEXT' . $this->ddd => (isset($data['custom']['text'])) ? $data['custom']['text'] : '', $this->bbb . 'CODE_TEXT' . $this->ddd => (isset($data['code'], $data['custom']['text'])) ? $data['code'] . '_' . $data['custom']['text'] : '', $this->bbb . 'CODE' . $this->ddd => (isset($data['code'])) ? $data['code'] : '', $this->bbb . 'view_type' . $this->ddd => $nameSingleCode . '_' . $data['type'], $this->bbb . 'type' . $this->ddd => (isset($data['type'])) ? $data['type'] : '', $this->bbb . 'com_component' . $this->ddd => (isset($data['custom']['component']) && ComponentbuilderHelper::checkString( $data['custom']['component'] )) ? ComponentbuilderHelper::safeString( $data['custom']['component'] ) : 'com_' . $this->componentCodeName, // set the generic values $this->bbb . 'component' . $this->ddd => $this->componentCodeName, $this->bbb . 'Component' . $this->ddd => $this->fileContentStatic[$this->hhh . 'Component' . $this->hhh], $this->bbb . 'view' . $this->ddd => (isset($data['custom']['view']) && ComponentbuilderHelper::checkString( $data['custom']['view'] )) ? ComponentbuilderHelper::safeString( $data['custom']['view'] ) : $nameSingleCode, $this->bbb . 'views' . $this->ddd => (isset($data['custom']['views']) && ComponentbuilderHelper::checkString( $data['custom']['views'] )) ? ComponentbuilderHelper::safeString( $data['custom']['views'] ) : $nameListCode ); // now set the ###PLACEHOLDER### options foreach ($replace as $replacekey => $replacevalue) { // update the key value $replacekey = str_replace( array($this->bbb, $this->ddd), array($this->hhh, $this->hhh), $replacekey ); // now set the value $replace[$replacekey] = $replacevalue; } // load the global placeholders if (ComponentbuilderHelper::checkArray($this->globalPlaceholders)) { foreach ( $this->globalPlaceholders as $globalPlaceholder => $gloabalValue ) { $replace[$globalPlaceholder] = $gloabalValue; } } // start loading the field type $this->fileContentDynamic['customfield_' . $data['type']] = array(); // JPREFIX <<<DYNAMIC>>> $this->fileContentDynamic['customfield_' . $data['type']][$this->hhh . 'JPREFIX' . $this->hhh] = $jprefix; // Type <<<DYNAMIC>>> $this->fileContentDynamic['customfield_' . $data['type']][$this->hhh . 'Type' . $this->hhh] = ComponentbuilderHelper::safeString( $data['custom']['type'], 'F' ); // type <<<DYNAMIC>>> $this->fileContentDynamic['customfield_' . $data['type']][$this->hhh . 'type' . $this->hhh] = ComponentbuilderHelper::safeString($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::_('<hr /><h3>Dynamic Button Error</h3>'), 'Error' ); $this->app->enqueueMessage( JText::_( 'The option to add a dynamic button is not available in <b>own custom field types</b>, 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 = ComponentbuilderHelper::safeString( $data['custom']['extends'] ); // JFORM_TYPE_HEADER <<<DYNAMIC>>> $add_default_header = true; $this->fileContentDynamic['customfield_' . $data['type']][$this->hhh . 'JFORM_TYPE_HEADER' . $this->hhh] = "//" . $this->setLine( __LINE__ ) . " Import the " . $JFORM_extends . " field type classes needed"; // JFORM_extens <<<DYNAMIC>>> $this->fileContentDynamic['customfield_' . $data['type']][$this->hhh . 'JFORM_extends' . $this->hhh] = $JFORM_extends; // JFORM_EXTENDS <<<DYNAMIC>>> $this->fileContentDynamic['customfield_' . $data['type']][$this->hhh . 'JFORM_EXTENDS' . $this->hhh] = ComponentbuilderHelper::safeString( $data['custom']['extends'], 'F' ); // JFORM_TYPE_PHP <<<DYNAMIC>>> $this->fileContentDynamic['customfield_' . $data['type']][$this->hhh . 'JFORM_TYPE_PHP' . $this->hhh] = PHP_EOL . PHP_EOL . $this->_t(1) . "//" . $this->setLine( __LINE__ ) . " 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]) && ComponentbuilderHelper::checkArray( $data['custom']['php' . $x] )) { foreach ($data['custom']['php' . $x] as $line => $code) { if (ComponentbuilderHelper::checkString($code)) { $phpBucket .= PHP_EOL . $this->setPlaceholders( $code, $tabBreak ); } } // check if this is header text if ('HEADER' === $x) { $this->fileContentDynamic['customfield_' . $data['type']][$this->hhh . 'JFORM_TYPE_HEADER' . $this->hhh] .= PHP_EOL . $this->setPlaceholders( $phpBucket, $replace ); // stop default headers from loading $add_default_header = false; } else { // JFORM_TYPE_PHP <<<DYNAMIC>>> $this->fileContentDynamic['customfield_' . $data['type']][$this->hhh . 'JFORM_TYPE_PHP' . $this->hhh] .= PHP_EOL . $this->setPlaceholders( $phpBucket, $replace ); } } } // check if we should add default header if ($add_default_header) { $this->fileContentDynamic['customfield_' . $data['type']][$this->hhh . 'JFORM_TYPE_HEADER' . $this->hhh] .= PHP_EOL . "jimport('joomla.form.helper');"; $this->fileContentDynamic['customfield_' . $data['type']][$this->hhh . 'JFORM_TYPE_HEADER' . $this->hhh] .= PHP_EOL . "JFormHelper::loadFieldClass('" . $JFORM_extends . "');"; } // check the the JFormHelper::loadFieldClass(..) was set elseif (strpos( $this->fileContentDynamic['customfield_' . $data['type']][$this->hhh . 'JFORM_TYPE_HEADER' . $this->hhh], 'JFormHelper::loadFieldClass(' ) === false) { $this->fileContentDynamic['customfield_' . $data['type']][$this->hhh . 'JFORM_TYPE_HEADER' . $this->hhh] .= 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']) && ComponentbuilderHelper::checkArray( $data['custom']['php'] )) { foreach ($data['custom']['php'] as $line => $code) { if (ComponentbuilderHelper::checkString($code)) { if ($line == 1) { $phpCode .= $this->setPlaceholders( $code, $tabBreak ); } else { $phpCode .= PHP_EOL . $this->_t(2) . $this->setPlaceholders($code, $tabBreak); } } } // replace the placholders $phpCode = $this->setPlaceholders($phpCode, $replace); } // catch empty stuff if (!ComponentbuilderHelper::checkString($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 (ComponentbuilderHelper::checkArray( $data['custom']['phpx'] )) { foreach ($data['custom']['phpx'] as $line => $code) { if (ComponentbuilderHelper::checkString($code)) { if ($line == 1) { $phpxCode .= $this->setPlaceholders( $code, $tabBreak ); } else { $phpxCode .= PHP_EOL . $this->_t(2) . $this->setPlaceholders( $code, $tabBreak ); } } } // replace the placholders $phpxCode = $this->setPlaceholders($phpxCode, $replace); } // catch empty stuff if (!ComponentbuilderHelper::checkString($phpxCode)) { $phpxCode = 'return null;'; } // temp holder for name $tempName = $data['custom']['label'] . ' Group'; // set lang $groupLangName = $this->langPrefix . '_' . ComponentbuilderHelper::safeFieldName( $tempName, true ); // add to lang array $this->setLangContent( $this->lang, $groupLangName, ComponentbuilderHelper::safeString($tempName, 'W') ); // build the Group Control $this->setGroupControl[$data['type']] = $groupLangName; // JFORM_GETGROUPS_PHP <<<DYNAMIC>>> $this->fileContentDynamic['customfield_' . $data['type']][$this->hhh . 'JFORM_GETGROUPS_PHP' . $this->hhh] = $phpCode; // JFORM_GETEXCLUDED_PHP <<<DYNAMIC>>> $this->fileContentDynamic['customfield_' . $data['type']][$this->hhh . 'JFORM_GETEXCLUDED_PHP' . $this->hhh] = $phpxCode; } else { // JFORM_GETOPTIONS_PHP <<<DYNAMIC>>> $this->fileContentDynamic['customfield_' . $data['type']][$this->hhh . 'JFORM_GETOPTIONS_PHP' . $this->hhh] = $phpCode; } // type <<<DYNAMIC>>> $this->fileContentDynamic['customfield_' . $data['type']][$this->hhh . 'ADD_BUTTON' . $this->hhh] = $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' => $this->_t(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]) && ComponentbuilderHelper::checkArray( $custom['php' . $x] )) { foreach ($custom['php' . $x] as $line => $code) { if (ComponentbuilderHelper::checkString($code)) { $phpBucket .= PHP_EOL . $this->setPlaceholders( $code, $tabBreak ); } } // check if this is header text if ('HEADER' === $x) { $code_bucket['JFORM_TYPE_HEADER'] .= PHP_EOL . $phpBucket; } else { // JFORM_TYPE_PHP <<<DYNAMIC>>> $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 = $this->langPrefix . '_FILTER_SEARCH'; // and to translation $this->setLangContent( $this->lang, $lang_search, 'Search' . ComponentbuilderHelper::safeString($nameListCode, 'w') ); // the search description language string $lang_search_desc = $this->langPrefix . '_FILTER_SEARCH_' . strtoupper($nameListCode); // and to translation $this->setLangContent( $this->lang, $lang_search_desc, 'Search the ' . ComponentbuilderHelper::safeString($nameSingleCode, 'w') . ' items. Prefix with ID: to search for an item by ID.' ); // now build the XML $field_filter_sets = array(); $field_filter_sets[] = $this->_t(1) . '<fields name="filter">'; // we first add the search $field_filter_sets[] = $this->_t(2) . '<field'; $field_filter_sets[] = $this->_t(3) . 'type="text"'; $field_filter_sets[] = $this->_t(3) . 'name="search"'; $field_filter_sets[] = $this->_t(3) . 'inputmode="search"'; $field_filter_sets[] = $this->_t(3) . 'label="' . $lang_search . '"'; $field_filter_sets[] = $this->_t(3) . 'description="' . $lang_search_desc . '"'; $field_filter_sets[] = $this->_t(3) . 'hint="JSEARCH_FILTER"'; $field_filter_sets[] = $this->_t(2) . '/>'; // add the published filter if published is not set if (!isset($this->fieldsNames[$nameSingleCode]['published'])) { // the published language string $lang_published = $this->langPrefix . '_FILTER_PUBLISHED'; // and to translation $this->setLangContent( $this->lang, $lang_published, 'Status' ); // the published description language string $lang_published_desc = $this->langPrefix . '_FILTER_PUBLISHED_' . strtoupper($nameListCode); // and to translation $this->setLangContent( $this->lang, $lang_published_desc, 'Status options for ' . ComponentbuilderHelper::safeString($nameListCode, 'w') ); $field_filter_sets[] = $this->_t(2) . '<field'; $field_filter_sets[] = $this->_t(3) . 'type="status"'; $field_filter_sets[] = $this->_t(3) . 'name="published"'; $field_filter_sets[] = $this->_t(3) . 'label="' . $lang_published . '"'; $field_filter_sets[] = $this->_t(3) . 'description="' . $lang_published_desc . '"'; $field_filter_sets[] = $this->_t(3) . 'onchange="this.form.submit();"'; $field_filter_sets[] = $this->_t(2) . '>'; $field_filter_sets[] = $this->_t(3) . '<option value="">JOPTION_SELECT_PUBLISHED</option>'; $field_filter_sets[] = $this->_t(2) . '</field>'; } // add the category if found if (isset($this->categoryBuilder[$nameListCode]) && ComponentbuilderHelper::checkArray( $this->categoryBuilder[$nameListCode] ) && isset($this->categoryBuilder[$nameListCode]['extension'])) { $field_filter_sets[] = $this->_t(2) . '<field'; $field_filter_sets[] = $this->_t(3) . 'type="category"'; $field_filter_sets[] = $this->_t(3) . 'name="category_id"'; $field_filter_sets[] = $this->_t(3) . 'label="JOPTION_FILTER_CATEGORY"'; $field_filter_sets[] = $this->_t(3) . 'description="JOPTION_FILTER_CATEGORY_DESC"'; $field_filter_sets[] = $this->_t(3) . 'multiple="true"'; $field_filter_sets[] = $this->_t(3) . 'class="multipleCategories"'; $field_filter_sets[] = $this->_t(3) . 'extension="' . $this->categoryBuilder[$nameListCode]['extension'] . '"'; $field_filter_sets[] = $this->_t(3) . 'onchange="this.form.submit();"'; // TODO NOT SURE IF THIS SHOULD BE STATIC $field_filter_sets[] = $this->_t(3) . 'published="0,1,2"'; $field_filter_sets[] = $this->_t(2) . '/>'; } // add the access filter if this view has access // and if access manually is not set if (isset($this->accessBuilder[$nameSingleCode]) && ComponentbuilderHelper::checkString( $this->accessBuilder[$nameSingleCode] ) && !isset($this->fieldsNames[$nameSingleCode]['access'])) { $field_filter_sets[] = $this->_t(2) . '<field'; $field_filter_sets[] = $this->_t(3) . 'type="accesslevel"'; $field_filter_sets[] = $this->_t(3) . 'name="access"'; $field_filter_sets[] = $this->_t(3) . 'label="JOPTION_FILTER_ACCESS"'; $field_filter_sets[] = $this->_t(3) . 'description="JOPTION_FILTER_ACCESS_DESC"'; $field_filter_sets[] = $this->_t(3) . 'multiple="true"'; $field_filter_sets[] = $this->_t(3) . 'class="multipleAccessLevels"'; $field_filter_sets[] = $this->_t(3) . 'onchange="this.form.submit();"'; $field_filter_sets[] = $this->_t(2) . '/>'; } // now add the dynamic fields if (isset($this->filterBuilder[$nameListCode]) && ComponentbuilderHelper::checkArray( $this->filterBuilder[$nameListCode] )) { foreach ($this->filterBuilder[$nameListCode] as $r => &$filter) { if ($filter['type'] != 'category') { $field_filter_sets[] = $this->_t(2) . '<field'; // if this is a custom field if (ComponentbuilderHelper::checkArray( $filter['custom'] )) { // we use the field type from the custom field $field_filter_sets[] = $this->_t(3) . 'type="' . $filter['type'] . '"'; // set css classname of this field $filter['class'] = ucfirst($filter['type']); } else { // we use the filter field type that was build $field_filter_sets[] = $this->_t(3) . 'type="' . $filter['filter_type'] . '"'; // set css classname of this field $filter['class'] = ucfirst($filter['filter_type']); } $field_filter_sets[] = $this->_t(3) . 'name="' . $filter['code'] . '"'; $field_filter_sets[] = $this->_t(3) . 'label="' . $filter['label'] . '"'; // if this is a multi field if ($filter['multi'] == 2) { $field_filter_sets[] = $this->_t(3) . 'class="multiple' . $filter['class'] . '"'; $field_filter_sets[] = $this->_t(3) . 'multiple="true"'; } else { $field_filter_sets[] = $this->_t(3) . 'multiple="false"'; } $field_filter_sets[] = $this->_t(3) . 'onchange="this.form.submit();"'; $field_filter_sets[] = $this->_t(2) . '/>'; } } } $field_filter_sets[] = $this->_t(2) . '<input type="hidden" name="form_submited" value="1"/>'; $field_filter_sets[] = $this->_t(1) . '</fields>'; // 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[] = $this->_t(1) . '<fields name="list">'; $list_sets[] = $this->_t(2) . '<field'; $list_sets[] = $this->_t(3) . 'name="fullordering"'; $list_sets[] = $this->_t(3) . 'type="list"'; $list_sets[] = $this->_t(3) . 'label="COM_CONTENT_LIST_FULL_ORDERING"'; $list_sets[] = $this->_t(3) . 'description="COM_CONTENT_LIST_FULL_ORDERING_DESC"'; $list_sets[] = $this->_t(3) . 'onchange="this.form.submit();"'; // add dynamic ordering (Admin view) $default_ordering = $this->getListViewDefaultOrdering( $nameListCode ); // set the default ordering $list_sets[] = $this->_t(3) . 'default="' . $default_ordering['name'] . ' ' . $default_ordering['direction'] . '"'; $list_sets[] = $this->_t(3) . 'validate="options"'; $list_sets[] = $this->_t(2) . '>'; $list_sets[] = $this->_t(3) . '<option value="">JGLOBAL_SORT_BY</option>'; $list_sets[] = $this->_t(3) . '<option value="a.ordering ASC">JGRID_HEADING_ORDERING_ASC</option>'; $list_sets[] = $this->_t(3) . '<option value="a.ordering DESC">JGRID_HEADING_ORDERING_DESC</option>'; // 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[] = $this->_t(3) . '<option value="a.published ASC">JSTATUS_ASC</option>'; $list_sets[] = $this->_t(3) . '<option value="a.published DESC">JSTATUS_DESC</option>'; } // add the rest of the set filters if (isset($this->sortBuilder[$nameListCode]) && ComponentbuilderHelper::checkArray( $this->sortBuilder[$nameListCode] )) { foreach ($this->sortBuilder[$nameListCode] as $filter) { if (!isset($donelist[$filter['code']])) { if ($filter['type'] === 'category') { $list_sets[] = $this->_t(3) . '<option value="category_title ASC">' . $filter['lang_asc'] . '</option>'; $list_sets[] = $this->_t(3) . '<option value="category_title DESC">' . $filter['lang_desc'] . '</option>'; } elseif (ComponentbuilderHelper::checkArray( $filter['custom'] )) { $list_sets[] = $this->_t(3) . '<option value="' . $filter['custom']['db'] . '.' . $filter['custom']['text'] . ' ASC">' . $filter['lang_asc'] . '</option>'; $list_sets[] = $this->_t(3) . '<option value="' . $filter['custom']['db'] . '.' . $filter['custom']['text'] . ' DESC">' . $filter['lang_desc'] . '</option>'; } else { $list_sets[] = $this->_t(3) . '<option value="a.' . $filter['code'] . ' ASC">' . $filter['lang_asc'] . '</option>'; $list_sets[] = $this->_t(3) . '<option value="a.' . $filter['code'] . ' DESC">' . $filter['lang_desc'] . '</option>'; } // do not add again $donelist[$filter['code']] = true; } } } $list_sets[] = $this->_t(3) . '<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>'; $list_sets[] = $this->_t(3) . '<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>'; $list_sets[] = $this->_t(2) . '</field>' . PHP_EOL; $list_sets[] = $this->_t(2) . '<field'; $list_sets[] = $this->_t(3) . 'name="limit"'; $list_sets[] = $this->_t(3) . 'type="limitbox"'; $list_sets[] = $this->_t(3) . 'label="COM_CONTENT_LIST_LIMIT"'; $list_sets[] = $this->_t(3) . 'description="COM_CONTENT_LIST_LIMIT_DESC"'; $list_sets[] = $this->_t(3) . 'class="input-mini"'; $list_sets[] = $this->_t(3) . 'default="25"'; $list_sets[] = $this->_t(3) . 'onchange="this.form.submit();"'; $list_sets[] = $this->_t(2) . '/>'; $list_sets[] = $this->_t(1) . '</fields>'; 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 (!isset( $this->fileContentDynamic['customfilterfield_' . $filter['filter_type']] ) || !ComponentbuilderHelper::checkArray( $this->fileContentDynamic['customfilterfield_' . $filter['filter_type']] ) ) { // start loading the field type $this->fileContentDynamic['customfilterfield_' . $filter['filter_type']] = array(); // JPREFIX <<DYNAMIC>>> $this->fileContentDynamic['customfilterfield_' . $filter['filter_type']][$this->hhh . 'JPREFIX' . $this->hhh] = 'J'; // Type <<<DYNAMIC>>> $this->fileContentDynamic['customfilterfield_' . $filter['filter_type']][$this->hhh . 'Type' . $this->hhh] = ComponentbuilderHelper::safeString( $filter['filter_type'], 'F' ); // type <<<DYNAMIC>>> $this->fileContentDynamic['customfilterfield_' . $filter['filter_type']][$this->hhh . 'type' . $this->hhh] = ComponentbuilderHelper::safeString($filter['filter_type']); // JFORM_GETOPTIONS_PHP <<<DYNAMIC>>> $this->fileContentDynamic['customfilterfield_' . $filter['filter_type']][$this->hhh . 'JFORM_GETOPTIONS_PHP' . $this->hhh] = $getOptions; // ADD_BUTTON <<<DYNAMIC>>> $this->fileContentDynamic['customfilterfield_' . $filter['filter_type']][$this->hhh . 'ADD_BUTTON' . $this->hhh] = ''; // 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']) && ComponentbuilderHelper::checkString($fieldData['view']) && ComponentbuilderHelper::checkString($fieldData['views'])) { // set local component $local_component = "com_" . $this->componentCodeName; // check that the component value is set if (!isset($fieldData['component']) || !ComponentbuilderHelper::checkString( $fieldData['component'] )) { $fieldData['component'] = $local_component; } // check that the componet 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'], $this->hhh) !== false || strpos( $fieldData['component'], $this->bbb ) !== false) // should not be needed... but { $fieldData['component'] = $this->setPlaceholders( $fieldData['component'], $this->placeholders ); } // 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 . $this->_t(1) . "/**"; $addButton[] = $this->_t(1) . " * Override to add new button"; $addButton[] = $this->_t(1) . " *"; $addButton[] = $this->_t(1) . " * @return string The field input markup."; $addButton[] = $this->_t(1) . " *"; $addButton[] = $this->_t(1) . " * @since 3.2"; $addButton[] = $this->_t(1) . " */"; $addButton[] = $this->_t(1) . "protected function getInput()"; $addButton[] = $this->_t(1) . "{"; $addButton[] = $this->_t(2) . "//" . $this->setLine(__LINE__) . " see if we should add buttons"; $addButton[] = $this->_t(2) . "\$set_button = \$this->getAttribute('button');"; $addButton[] = $this->_t(2) . "//" . $this->setLine(__LINE__) . " get html"; $addButton[] = $this->_t(2) . "\$html = parent::getInput();"; $addButton[] = $this->_t(2) . "//" . $this->setLine(__LINE__) . " if true set button"; $addButton[] = $this->_t(2) . "if (\$set_button === 'true')"; $addButton[] = $this->_t(2) . "{"; $addButton[] = $this->_t(3) . "\$button = array();"; $addButton[] = $this->_t(3) . "\$script = array();"; $addButton[] = $this->_t(3) . "\$button_code_name = \$this->getAttribute('name');"; $addButton[] = $this->_t(3) . "//" . $this->setLine(__LINE__) . " get the input from url"; $addButton[] = $this->_t(3) . "\$app = JFactory::getApplication();"; $addButton[] = $this->_t(3) . "\$jinput = \$app->input;"; $addButton[] = $this->_t(3) . "//" . $this->setLine(__LINE__) . " get the view name & id"; $addButton[] = $this->_t(3) . "\$values = \$jinput->getArray(array("; $addButton[] = $this->_t(4) . "'id' => 'int',"; $addButton[] = $this->_t(4) . "'view' => 'word'"; $addButton[] = $this->_t(3) . "));"; $addButton[] = $this->_t(3) . "//" . $this->setLine(__LINE__) . " check if new item"; $addButton[] = $this->_t(3) . "\$ref = '';"; $addButton[] = $this->_t(3) . "\$refJ = '';"; if ($refLoad) { $addButton[] = $this->_t(3) . "if (!is_null(\$values['id']) && strlen(\$values['view']))"; $addButton[] = $this->_t(3) . "{"; $addButton[] = $this->_t(4) . "//" . $this->setLine(__LINE__) . " only load referral if not new item."; $addButton[] = $this->_t(4) . "\$ref = '&ref=' . \$values['view'] . '&refid=' . \$values['id'];"; $addButton[] = $this->_t(4) . "\$refJ = '&ref=' . \$values['view'] . '&refid=' . \$values['id'];"; $addButton[] = $this->_t(4) . "//" . $this->setLine(__LINE__) . " get the return value."; $addButton[] = $this->_t(4) . "\$_uri = (string) JUri::getInstance();"; $addButton[] = $this->_t(4) . "\$_return = urlencode(base64_encode(\$_uri));"; $addButton[] = $this->_t(4) . "//" . $this->setLine(__LINE__) . " load return value."; $addButton[] = $this->_t(4) . "\$ref .= '&return=' . \$_return;"; $addButton[] = $this->_t(4) . "\$refJ .= '&return=' . \$_return;"; $addButton[] = $this->_t(3) . "}"; } else { $addButton[] = $this->_t(3) . "if (!is_null(\$values['id']) && strlen(\$values['view']))"; $addButton[] = $this->_t(3) . "{"; $addButton[] = $this->_t(4) . "//" . $this->setLine(__LINE__) . " only load field details if not new item."; $addButton[] = $this->_t(4) . "\$ref = '&field=' . \$values['view'] . '&field_id=' . \$values['id'];"; $addButton[] = $this->_t(4) . "\$refJ = '&field=' . \$values['view'] . '&field_id=' . \$values['id'];"; $addButton[] = $this->_t(4) . "//" . $this->setLine(__LINE__) . " get the return value."; $addButton[] = $this->_t(4) . "\$_uri = (string) JUri::getInstance();"; $addButton[] = $this->_t(4) . "\$_return = urlencode(base64_encode(\$_uri));"; $addButton[] = $this->_t(4) . "//" . $this->setLine(__LINE__) . " load return value."; $addButton[] = $this->_t(4) . "\$ref = '&return=' . \$_return;"; $addButton[] = $this->_t(4) . "\$refJ = '&return=' . \$_return;"; $addButton[] = $this->_t(3) . "}"; } $addButton[] = $this->_t(3) . "//" . $this->setLine(__LINE__) . " get button label"; $addButton[] = $this->_t(3) . "\$button_label = trim(\$button_code_name);"; $addButton[] = $this->_t(3) . "\$button_label = preg_replace('/_+/', ' ', \$button_label);"; $addButton[] = $this->_t(3) . "\$button_label = preg_replace('/\s+/', ' ', \$button_label);"; $addButton[] = $this->_t(3) . "\$button_label = preg_replace(\"/[^A-Za-z ]/\", '', \$button_label);"; $addButton[] = $this->_t(3) . "\$button_label = ucfirst(strtolower(\$button_label));"; $addButton[] = $this->_t(3) . "//" . $this->setLine(__LINE__) . " get user object"; $addButton[] = $this->_t(3) . "\$user = JFactory::getUser();"; $addButton[] = $this->_t(3) . "//" . $this->setLine(__LINE__) . " 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']]) && ComponentbuilderHelper::checkArray( $this->permissionBuilder['global'][$core['core.create']] ) && in_array( $fieldData['view'], $this->permissionBuilder['global'][$core['core.create']] )) { $addButton[] = $this->_t(3) . "if (\$user->authorise('" . $core['core.create'] . "', '" . $component . "') && \$app->isAdmin()) // TODO for now only in admin area."; } else { $addButton[] = $this->_t(3) . "if (\$user->authorise('core.create', '" . $component . "') && \$app->isAdmin()) // TODO for now only in admin area."; } $addButton[] = $this->_t(3) . "{"; $addButton[] = $this->_t(4) . "//" . $this->setLine(__LINE__) . " build Create button"; $addButton[] = $this->_t(4) . "\$button[] = '<a id=\"'.\$button_code_name.'Create\" class=\"btn btn-small btn-success hasTooltip\" title=\"'.JText:" . ":sprintf('" . $this->langPrefix . "_CREATE_NEW_S', \$button_label).'\" style=\"border-radius: 0px 4px 4px 0px; padding: 4px 4px 4px 7px;\""; $addButton[] = $this->_t(5) . "href=\"index.php?option=" . $fieldData['component'] . "&view=" . $fieldData['view'] . "&layout=edit'.\$ref.'\" >"; $addButton[] = $this->_t(5) . "<span class=\"icon-new icon-white\"></span></a>';"; $addButton[] = $this->_t(3) . "}"; $addButton[] = $this->_t(3) . "//" . $this->setLine(__LINE__) . " 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']]) && ComponentbuilderHelper::checkArray( $this->permissionBuilder['global'][$core['core.edit']] ) && in_array( $fieldData['view'], $this->permissionBuilder['global'][$core['core.edit']] )) { $addButton[] = $this->_t(3) . "if (\$user->authorise('" . $core['core.edit'] . "', '" . $component . "') && \$app->isAdmin()) // TODO for now only in admin area."; } else { $addButton[] = $this->_t(3) . "if (\$user->authorise('core.edit', '" . $component . "') && \$app->isAdmin()) // TODO for now only in admin area."; } $addButton[] = $this->_t(3) . "{"; $addButton[] = $this->_t(4) . "//" . $this->setLine(__LINE__) . " build edit button"; $addButton[] = $this->_t(4) . "\$button[] = '<a id=\"'.\$button_code_name.'Edit\" class=\"btn btn-small hasTooltip\" title=\"'.JText:" . ":sprintf('" . $this->langPrefix . "_EDIT_S', \$button_label).'\" style=\"display: none; padding: 4px 4px 4px 7px;\" href=\"#\" >"; $addButton[] = $this->_t(5) . "<span class=\"icon-edit\"></span></a>';"; $addButton[] = $this->_t(4) . "//" . $this->setLine(__LINE__) . " build script"; $addButton[] = $this->_t(4) . "\$script[] = \""; $addButton[] = $this->_t(5) . "jQuery(document).ready(function() {"; $addButton[] = $this->_t(6) . "jQuery('#adminForm').on('change', '#jform_\".\$button_code_name.\"',function (e) {"; $addButton[] = $this->_t(7) . "e.preventDefault();"; $addButton[] = $this->_t(7) . "var \".\$button_code_name.\"Value = jQuery('#jform_\".\$button_code_name.\"').val();"; $addButton[] = $this->_t(7) . "\".\$button_code_name.\"Button(\".\$button_code_name.\"Value);"; $addButton[] = $this->_t(6) . "});"; $addButton[] = $this->_t(6) . "var \".\$button_code_name.\"Value = jQuery('#jform_\".\$button_code_name.\"').val();"; $addButton[] = $this->_t(6) . "\".\$button_code_name.\"Button(\".\$button_code_name.\"Value);"; $addButton[] = $this->_t(5) . "});"; $addButton[] = $this->_t(5) . "function \".\$button_code_name.\"Button(value) {"; $addButton[] = $this->_t(6) . "if (value > 0) {"; // TODO not ideal since value may not be an (int) $addButton[] = $this->_t(7) . "// hide the create button"; $addButton[] = $this->_t(7) . "jQuery('#\".\$button_code_name.\"Create').hide();"; $addButton[] = $this->_t(7) . "// show edit button"; $addButton[] = $this->_t(7) . "jQuery('#\".\$button_code_name.\"Edit').show();"; $addButton[] = $this->_t(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[] = $this->_t(7) . "jQuery('#\".\$button_code_name.\"Edit').attr('href', url);"; $addButton[] = $this->_t(6) . "} else {"; $addButton[] = $this->_t(7) . "// show the create button"; $addButton[] = $this->_t(7) . "jQuery('#\".\$button_code_name.\"Create').show();"; $addButton[] = $this->_t(7) . "// hide edit button"; $addButton[] = $this->_t(7) . "jQuery('#\".\$button_code_name.\"Edit').hide();"; $addButton[] = $this->_t(6) . "}"; $addButton[] = $this->_t(5) . "}\";"; $addButton[] = $this->_t(3) . "}"; $addButton[] = $this->_t(3) . "//" . $this->setLine(__LINE__) . " check if button was created for " . $fieldData['view'] . " field."; $addButton[] = $this->_t(3) . "if (is_array(\$button) && count(\$button) > 0)"; $addButton[] = $this->_t(3) . "{"; $addButton[] = $this->_t(4) . "//" . $this->setLine(__LINE__) . " Load the needed script."; $addButton[] = $this->_t(4) . "\$document = JFactory::getDocument();"; $addButton[] = $this->_t(4) . "\$document->addScriptDeclaration(implode(' ',\$script));"; $addButton[] = $this->_t(4) . "//" . $this->setLine(__LINE__) . " return the button attached to input field."; $addButton[] = $this->_t(4) . "return '<div class=\"input-append\">' .\$html . implode('',\$button).'</div>';"; $addButton[] = $this->_t(3) . "}"; $addButton[] = $this->_t(2) . "}"; $addButton[] = $this->_t(2) . "return \$html;"; $addButton[] = $this->_t(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 <?xml... tag * * @return string XML output * */ public function xmlPrettyPrint($xml, $nodename) { $dom = dom_import_simplexml($xml)->ownerDocument; $dom->formatOutput = true; $xmlString = $dom->saveXML( $dom->getElementsByTagName($nodename)->item(0) ); // make sure Tidy is enabled if ($this->tidy) { $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::_('<hr /><h3>Tidy Error</h3>'), 'Error' ); $this->app->enqueueMessage( JText::_( 'You must enable the <b>Tidy</b> extension in your php.ini file so we can tidy up your xml! If you need help please <a href="https://github.com/vdm-io/Joomla-Component-Builder/issues/197#issuecomment-351181754" target="_blank">start here</a>!' ), '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); } }