Added #31 feature to build fields and views dynamically via a sql dump. Fixed #29 to insure that a redirect loop does not occur easily. Made many other compiler improvements.
This commit is contained in:
294
admin/helpers/extrusion/b_builder.php
Normal file
294
admin/helpers/extrusion/b_builder.php
Normal file
@ -0,0 +1,294 @@
|
||||
<?php
|
||||
/*--------------------------------------------------------------------------------------------------------| www.vdm.io |------/
|
||||
__ __ _ _____ _ _ __ __ _ _ _
|
||||
\ \ / / | | | __ \ | | | | | \/ | | | | | | |
|
||||
\ \ / /_ _ ___| |_ | | | | _____ _____| | ___ _ __ _ __ ___ ___ _ __ | |_ | \ / | ___| |_| |__ ___ __| |
|
||||
\ \/ / _` / __| __| | | | |/ _ \ \ / / _ \ |/ _ \| '_ \| '_ ` _ \ / _ \ '_ \| __| | |\/| |/ _ \ __| '_ \ / _ \ / _` |
|
||||
\ / (_| \__ \ |_ | |__| | __/\ V / __/ | (_) | |_) | | | | | | __/ | | | |_ | | | | __/ |_| | | | (_) | (_| |
|
||||
\/ \__,_|___/\__| |_____/ \___| \_/ \___|_|\___/| .__/|_| |_| |_|\___|_| |_|\__| |_| |_|\___|\__|_| |_|\___/ \__,_|
|
||||
| |
|
||||
|_|
|
||||
/-------------------------------------------------------------------------------------------------------------------------------/
|
||||
|
||||
@version 1.0.0
|
||||
@created 26th December, 2016
|
||||
@package Component Builder
|
||||
@subpackage builder.php
|
||||
@author Llewellyn van der Merwe <http://www.vdm.io>
|
||||
@my wife Roline van der Merwe <http://www.vdm.io/>
|
||||
@copyright Copyright (C) 2015. All Rights Reserved
|
||||
@license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
|
||||
|
||||
Builds Complex Joomla Components
|
||||
|
||||
/-----------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
// No direct access to this file
|
||||
defined('_JEXEC') or die('Restricted access');
|
||||
|
||||
/**
|
||||
* Builder class
|
||||
*/
|
||||
class Builder extends Mapping
|
||||
{
|
||||
/**
|
||||
* Some default fields
|
||||
*/
|
||||
public $user;
|
||||
public $today;
|
||||
public $db;
|
||||
public $views = array();
|
||||
protected $fields = array();
|
||||
protected $title = array();
|
||||
protected $description = array();
|
||||
protected $alias = array();
|
||||
protected $list = array();
|
||||
|
||||
/**
|
||||
* Field that should not be used in name, alias, disc, and list view
|
||||
* (TODO) We may need to set this dynamicly
|
||||
*/
|
||||
protected $avoidList = array('not_required');
|
||||
|
||||
/***
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct(&$data)
|
||||
{
|
||||
// first we run the perent constructor
|
||||
if (parent::__construct($data))
|
||||
{
|
||||
// always reset the building values if found
|
||||
$data['buildcomp'] = 0;
|
||||
$data['buildcompsql'] = '';
|
||||
// set some globals
|
||||
$this->db = JFactory::getDbo();
|
||||
$this->user = JFactory::getUser();
|
||||
$this->today = JFactory::getDate()->toSql();
|
||||
|
||||
// no start the building of the views and fields
|
||||
if ($this->setBuild())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* The building function
|
||||
* To build the views and fields that are needed
|
||||
*/
|
||||
protected function setBuild()
|
||||
{
|
||||
foreach ($this->map as $view => $fields)
|
||||
{
|
||||
// set this field with all its needed data
|
||||
foreach ($fields as $field)
|
||||
{
|
||||
$this->setField($view, $field);
|
||||
}
|
||||
// set this view with all its needed data
|
||||
$this->setView($view);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* The building function for views
|
||||
*/
|
||||
protected function setView(&$name)
|
||||
{
|
||||
// set the view object
|
||||
$object = new stdClass();
|
||||
$object->system_name = ComponentbuilderHelper::safeString($name, 'W') . ' (dynamic build)';
|
||||
$object->name_single = $name;
|
||||
$object->name_list = $name. 's';
|
||||
$object->short_description = $name. ' view (dynamic build)';
|
||||
$object->type = 1;
|
||||
$object->description = $name. ' view (dynamic build)';
|
||||
$object->add_fadein = 1;
|
||||
$object->add_sql = (isset($this->addSql[$name])) ? $this->addSql[$name]: 0;
|
||||
$object->source = (isset($this->source[$name])) ? $this->source[$name]: 0;
|
||||
$object->sql = (isset($this->sql[$name])) ? base64_encode($this->sql[$name]): '';
|
||||
$object->addpermissions = '{"action":["view.edit","view.edit.own","view.edit.state","view.create","view.delete","view.access"],"implementation":["3","3","3","3","3","3"]}';
|
||||
$object->addfields = $this->addFields($name);
|
||||
$object->created = $this->today;
|
||||
$object->created_by = $this->user->id;
|
||||
$object->published = 1;
|
||||
// add to data base
|
||||
if ($this->db->insertObject('#__componentbuilder_admin_view', $object))
|
||||
{
|
||||
// make sure the access of asset is set
|
||||
$id = $this->db->insertid();
|
||||
ComponentbuilderHelper::setAsset($id, 'admin_view');
|
||||
// load the views
|
||||
$this->views[] = $id;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the fields to the view
|
||||
*/
|
||||
protected function addFields(&$view)
|
||||
{
|
||||
if (isset($this->fields[$view]))
|
||||
{
|
||||
// set some defaults
|
||||
$addField = array (
|
||||
'field' => array(),
|
||||
'list' => array(),
|
||||
'order_list' => array(),
|
||||
'title' => array(),
|
||||
'alias' => array(),
|
||||
'sort' => array(),
|
||||
'search' => array(),
|
||||
'filter' => array(),
|
||||
'link' => array(),
|
||||
'tab' => array(),
|
||||
'alignment' => array(),
|
||||
'order_edit' => array(),
|
||||
'permission' => array()
|
||||
);
|
||||
$fixLink = (isset($this->title[$view])) ? 0 : 1;
|
||||
// build the field data... hmmm
|
||||
foreach ($this->fields[$view] as $nr => $id)
|
||||
{
|
||||
$alignment = 1;
|
||||
if ($nr % 2 == 0)
|
||||
{
|
||||
$alignment = 2;
|
||||
}
|
||||
// some defaults
|
||||
$isTitle = (isset($this->title[$view]) && $this->title[$view] == $id) ? 1 : 0;
|
||||
$isAlias = (isset($this->alias[$view]) && $this->alias[$view] == $id) ? 1 : 0;
|
||||
$isList = ($key = array_search($id, $this->list[$view])) ? 1 : 0;
|
||||
$isLink = ($isTitle) ? 1 : (($isList && $fixLink) ? 1 : 0);
|
||||
if ($isLink)
|
||||
{
|
||||
$fixLink = 0;
|
||||
}
|
||||
// load the field values
|
||||
$addField['field'][] = $id;
|
||||
$addField['list'][] = $isList;
|
||||
$addField['order_list'][] = ($key) ? $key : 0;
|
||||
$addField['title'][] = $isTitle;
|
||||
$addField['alias'][] = $isAlias;
|
||||
$addField['sort'][] = $isList;
|
||||
$addField['search'][] = $isList;
|
||||
$addField['filter'][] = $isList;
|
||||
$addField['link'][] = $isLink;
|
||||
$addField['tab'][] = 1;
|
||||
$addField['alignment'][] = ($isTitle || $isAlias) ? 4 : $alignment;
|
||||
$addField['order_edit'][] = $nr;
|
||||
$addField['permission'][] = 0;
|
||||
}
|
||||
return json_encode($addField);
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* The building function for fields
|
||||
*/
|
||||
protected function setField(&$view, &$field)
|
||||
{
|
||||
if ($fieldType = $this->getFieldType($field['fieldType']))
|
||||
{
|
||||
// set the field object
|
||||
$object = new stdClass();
|
||||
$object->name = $field['label'] . ' (dynamic build)';
|
||||
$object->fieldtype = $fieldType;
|
||||
$object->datatype = $field['dataType'];
|
||||
$object->indexes = $field['key'];
|
||||
$object->null_switch = $field['null'];
|
||||
$object->datalenght = $field['size'];
|
||||
$object->datalenght_other = $field['sizeOther'];
|
||||
$object->datadefault = $field['default'];
|
||||
$object->datadefault_other = $field['defaultOther'];
|
||||
$object->created = $this->today;
|
||||
$object->created_by = $this->user->id;
|
||||
$object->published = 1;
|
||||
$object->store = 0;
|
||||
$object->xml = $this->setFieldXML($field, $fieldType);
|
||||
// add to data base
|
||||
if ($this->db->insertObject('#__componentbuilder_field', $object))
|
||||
{
|
||||
// make sure the access of asset is set
|
||||
$id = $this->db->insertid();
|
||||
ComponentbuilderHelper::setAsset($id, 'field');
|
||||
// check if any field for this field was already set, if not set array
|
||||
if (!isset($this->fields[$view]))
|
||||
{
|
||||
$this->fields[$view] = array();
|
||||
}
|
||||
// load the field
|
||||
$this->fields[$view][] = $id;
|
||||
|
||||
if (!isset($this->list[$view]))
|
||||
{
|
||||
$this->list[$view] = array();
|
||||
}
|
||||
// insure that some fields are avoided
|
||||
if (!in_array($field['name'], $this->avoidList))
|
||||
{
|
||||
// set the name/title field if found
|
||||
if (!isset($this->title[$view]) && (stripos($field['name'], 'name') !== false || stripos($field['name'], 'title') !== false))
|
||||
{
|
||||
$this->title[$view] = $id;
|
||||
$this->list[$view][] = $id;
|
||||
}
|
||||
// set the alias field if found
|
||||
elseif (!isset($this->alias[$id]) && stripos($field['name'], 'alias') !== false)
|
||||
{
|
||||
$this->alias[$view] = $id;
|
||||
}
|
||||
// set the alias field if found
|
||||
elseif (!isset($this->description[$id]) && stripos($field['name'], 'desc') !== false)
|
||||
{
|
||||
$this->description[$view] = $id;
|
||||
$this->list[$view][] = $id;
|
||||
}
|
||||
elseif ('Text' == $field['fieldType'] && count($this->list[$view]) < 5)
|
||||
{
|
||||
$this->list[$view][] = $id;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* get the field type id from system
|
||||
*/
|
||||
protected function getFieldType($fieldName)
|
||||
{
|
||||
// load the field settings
|
||||
return ComponentbuilderHelper::getVar('fieldtype', $fieldName, 'name', 'id');
|
||||
}
|
||||
|
||||
/**
|
||||
* The building function for field xml
|
||||
*/
|
||||
protected function setFieldXML(&$field, $fieldId)
|
||||
{
|
||||
// load the field settings
|
||||
$settings = array();
|
||||
$settings['name'] = $field['name'];
|
||||
$settings['description'] = 'The '.strtolower($field['label']) . ' is set here.';
|
||||
$settings['message'] = "Error! Please add some ".strtolower($field['label'])." here.";
|
||||
$settings['label'] = $field['label'];
|
||||
$settings['default'] = ($field['default'] == 'Other') ? $field['defaultOther'] : $field['default'];
|
||||
$settings['hint'] = $field['label'] .' Here!';
|
||||
// okay set the xml field values
|
||||
if ($fieldOptions = ComponentbuilderHelper::getFieldOptions($fieldId, 'id', $settings))
|
||||
{
|
||||
return json_encode($fieldOptions['values']);
|
||||
}
|
||||
return '';
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user