%PDF- %PDF-
Direktori : /home/lightco1/upgrade.lightco.com.au/libraries/fof30/Factory/Scaffolding/Layout/ |
Current File : /home/lightco1/upgrade.lightco.com.au/libraries/fof30/Factory/Scaffolding/Layout/BaseErector.php |
<?php /** * @package FOF * @copyright 2010-2017 Nicholas K. Dionysopoulos / Akeeba Ltd * @license GNU GPL version 2 or later */ namespace FOF30\Factory\Scaffolding\Layout; use FOF30\Model\DataModel; /** * Class BaseErector * @package FOF30\Factory\Scaffolding\Layout * @deprecated 3.1 Support for XML forms will be removed in FOF 4 */ class BaseErector implements ErectorInterface { /** * The Builder which called us * * @var \FOF30\Factory\Scaffolding\Layout\Builder */ protected $builder = null; /** * The Model attached to the view we're building * * @var \FOF30\Model\DataModel */ protected $model = null; /** * The name of our view * * @var string */ protected $viewName = null; /** * The XML document we're constructing * * @var \SimpleXMLElement */ protected $xml; /** * The common language key prefix, e.g. COM_EXAMPLE_MYVIEW_ * * @var null */ private $langKeyPrefix = null; /** * Strings to add to the language definition * * @var array */ private $strings = array(); /** * Construct the erector object * * @param \FOF30\Factory\Scaffolding\Layout\Builder $parent The parent builder * @param \FOF30\Model\DataModel $model The model we're erecting a scaffold against * @param string $viewName The view name for this model */ public function __construct(Builder $parent, DataModel $model, $viewName) { $this->builder = $parent; $this->model = $model; $this->viewName = $viewName; $this->xml = new \SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><form></form>'); } /** * Erects a scaffold. It then uses the parent's setXml and setStrings to assign the erected scaffold and the * additional language strings to the parent which will decide what to do with that. * * @return void * * @throws \LogicException Because it's not implemented */ public function build() { throw new \LogicException('You need to implement build() in your Erector class'); } /** * Returns the common language key prefix, something like "COM_EXAMPLE_MYVIEW_" * * @return string */ protected function getLangKeyPrefix() { if (empty($this->langKeyPrefix)) { $prefix = $key = $this->builder->getContainer()->componentName . '_' . $this->viewName . '_'; $this->langKeyPrefix = strtoupper($prefix); } return $this->langKeyPrefix; } /** * Returns the language definition for a field. The hashed array has two keys, label and desc, each one containing * the language definition for the label and description of the field. Each definition has the keys key and value * with the language key and actual language string. * * @param string $fieldName * * @return array */ protected function getFieldLabel($fieldName) { $fieldNameForKey = strtoupper($fieldName); $definition = array( 'label' => array( 'key' => $this->getLangKeyPrefix() . $fieldNameForKey . '_LABEL', 'value' => ucfirst($fieldName), ), 'desc' => array( 'key' => $this->getLangKeyPrefix() . $fieldNameForKey . '_DESC', 'value' => 'Description for ' . ucfirst($fieldName), ) ); return $definition; } /** * Convert the database type into something we can use * * @param string $type The type of the database field * * @return array */ public static function getFieldType($type) { if (empty($type)) { return null; } // Remove parentheses, indicating field options / size (they don't matter in type detection) if (strpos($type, '(') === false) { $type .= '()'; } list($type, $parameters) = explode('(', $type); $detectedType = null; $detectedParameters = null; $type = strtolower($type); switch (trim($type)) { case 'varchar': case 'text': case 'char': case 'character varying': case 'nvarchar': case 'nchar': $detectedType = 'Text'; break; case 'smalltext': case 'longtext': case 'mediumtext': $detectedType = 'Text'; break; case 'date': case 'datetime': case 'time': case 'year': case 'timestamp': case 'timestamp without time zone': case 'timestamp with time zone': $detectedType = 'Calendar'; break; case 'tinyint': case 'smallint': $detectedType = 'Checkbox'; break; case 'int': case 'integer': case 'bigint': // Because the Integer field is rendered in Joomla! as a drop-down list. Ugh!!! $detectedType = 'Numeric'; break; case 'float': case 'double': case 'currency': $detectedType = 'Numeric'; break; case 'enum': $detectedType = 'GenericList'; $parameters = trim($parameters, "\t\n\r\0\x0B )"); $detectedParameters = explode(',', $parameters); $detectedParameters = array_map(function ($x) { return trim($x, "'\n\r\t\0\x0B"); }, $detectedParameters); $temp = array(); foreach ($detectedParameters as $v) { $temp[$v] = $v; } $detectedParameters = $temp; break; } // Sometimes we have character types followed by a space and some cruft. Let's handle them. if (is_null($detectedType) && !empty($type)) { list ($type, ) = explode(' ', $type); switch (trim($type)) { case 'varchar': case 'text': case 'char': case 'character varying': case 'nvarchar': case 'nchar': $detectedType = 'Text'; break; case 'smalltext': case 'longtext': case 'mediumtext': $detectedType = 'Text'; break; case 'date': case 'datetime': case 'time': case 'year': case 'timestamp': $detectedType = 'Calendar'; break; case 'tinyint': case 'smallint': $detectedType = 'Checkbox'; break; default: $detectedType = 'Integer'; break; } } // If all else fails assume it's a Text and hope for the best if (empty($detectedType)) { $detectedType = 'Text'; } return array('type' => $detectedType, 'params' => $detectedParameters); } /** * Adds a language string definition as long as it doesn't exist in the existing language file. * * @param string $key The language string key * @param string $value The language string */ protected function addString($key, $value) { if (\JText::_($key) != $key) { return; } $this->strings[$key] = $value; } /** * Push the form and strings to the builder */ protected function pushResults() { $this->builder->setStrings($this->strings); $this->builder->setXml($this->xml); } }