%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/Builder.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\Container\Container; use SimpleXMLElement; /** * Scaffolding Builder * * Creates an automatic XML form definition to render a view based on the database fields you've got in the model. This * is not designed for production; it's designed to give you a way to quickly add some test data to your component * and get started really fast with FOF development. * * @package FOF30\Factory\Scaffolding * * @deprecated 3.1 Support for XML forms will be removed in FOF 4 */ class Builder { /** @var \FOF30\Container\Container The container we belong to */ protected $container = null; /** @var bool Should I save the scaffolding results? */ protected $saveScaffolding = false; /** @var SimpleXMLElement The form we will be returning to the caller */ protected $xml; /** @var array Language string definitions we need to add to the component's language file */ protected $strings = array(); /** * Create the scaffolding builder instance * * @param \FOF30\Container\Container $c */ public function __construct(Container $c) { $this->container = $c; $this->saveScaffolding = $this->container->factory->isSaveScaffolding(); } /** * Make a new scaffolding document * * @param string $requestedFilename The requested filename, e.g. form.default.xml * @param string $viewName The name of the view this form will be used to render * * @return string|null The XML source or null if we can't make a scaffolding XML */ public function make($requestedFilename, $viewName) { // Initialise $this->xml = null; $this->strings = array(); // The requested filename should be in the format "form.SOMETHING.xml" if (substr($requestedFilename, 0, 5) !== 'form.') { return null; } // Get the requested form type $formType = substr($requestedFilename, 5); // Make sure the requested form type is supported by this builder if (!in_array($formType, array('default', 'form', 'item'))) { return null; } switch ($formType) { default: case 'default': $builderType = 'Browse'; break; case 'form': $builderType = 'Form'; break; case 'item': $builderType = 'Item'; break; } // Get the model $model = $this->container->factory->model($viewName); // Create the scaffolding object and build the XML file $className = 'FOF30\\Factory\\Scaffolding\\Layout\\' . $builderType . 'Erector'; /** @var ErectorInterface $erector */ $erector = new $className($this, $model, $viewName); $erector->build(); if ($this->saveScaffolding) { $this->saveXml($requestedFilename, $viewName); $this->saveStrings(); } $this->applyStrings(); return $this->xml->asXML(); } /** * Set the XML form document * * @param SimpleXMLElement $xml The XML document to set */ public function setXml(SimpleXMLElement $xml) { $this->xml = $xml; } /** * Set the additional strings array * * @param array $strings The strings array to set */ public function setStrings(array $strings) { $this->strings = $strings; } /** * Load the strings array in Joomla!'s JLanguage object */ protected function applyStrings() { // If we don't have language strings there's no point continuing if (empty($this->strings)) { return; } // Get a temporary filename $baseDirs = $this->container->platform->getPlatformBaseDirs(); $tempDir = $baseDirs['tmp']; $filename = tempnam($tempDir, 'fof'); if ($filename === false) { return; } // Save the strings to a temporary file $this->saveStrings($filename); // Load the temporary file $lang = $this->container->platform->getLanguage(); $langReflection = new \ReflectionObject($lang); $loadLangReflection = $langReflection->getMethod('loadLanguage'); $loadLangReflection->setAccessible(true); $loadLangReflection->invoke($lang, $filename, $this->container->componentName); // Delete temporary filename @unlink($filename); } /** * Gets the container this builder belongs to * * @return Container */ public function getContainer() { return $this->container; } /** * Save the XML form as a file * * @param string $requestedFilename The requested filename, e.g. form.default.xml * @param string $viewName The name of the view this form will be used to render */ protected function saveXml($requestedFilename, $viewName) { $path = $this->container->frontEndPath; if ($this->container->platform->isBackend()) { $path = $this->container->backEndPath; } $targetFilename = $path . '/View/' . $viewName . '/tmpl/' . $requestedFilename; $directory = dirname($targetFilename); if (!is_dir($directory)) { $createdDirectory = @mkdir($directory, 0755, true); if (!@$createdDirectory) { \JLoader::import('joomla.filesystem.folder'); \JFolder::create($directory, 0755); } } $xml = $this->xml->asXML(); $domDocument = new \DOMDocument('1.0'); $domDocument->loadXML($xml); $domDocument->preserveWhiteSpace = false; $domDocument->formatOutput = true; $xml = $domDocument->saveXML(); $saveResult = @file_put_contents($targetFilename . '.xml', $xml); if ($saveResult === false) { \JLoader::import('joomla.filesystem.file'); \JFile::write($targetFilename, $xml); } } /** * Saves the language strings, merged with any old ones, to a Joomla! INI language file * * @param string $targetFilename The full path to the INI file, leave blank for auto-detection */ protected function saveStrings($targetFilename = null) { // If no filename is defined, get the component's language definition filename if (empty($targetFilename)) { $jLang = $this->container->platform->getLanguage(); $basePath = $this->container->platform->isBackend() ? JPATH_ADMINISTRATOR : JPATH_SITE; $lang = $jLang->setLanguage('en-GB'); $jLang->setLanguage($lang); $path = $jLang->getLanguagePath($basePath, $lang); $targetFilename = $path . '/' . $lang . '.' . $this->container->componentName . '.ini'; } // Try to load the existing language file $strings = array(); if (@file_exists($targetFilename)) { $contents = file_get_contents($targetFilename); $contents = str_replace('_QQ_', '"\""', $contents); $strings = @parse_ini_string($contents); } $strings = array_merge($strings, $this->strings); // Create the INI file $iniFile = ''; foreach ($strings as $k => $v) { $iniFile .= strtoupper($k) . '="' . str_replace('"', '"_QQ_"', $v) . "\"\n"; } // Save it $saveResult = @file_put_contents($targetFilename, $iniFile); if ($saveResult === false) { \JLoader::import('joomla.filesystem.file'); \JFile::write($targetFilename, $iniFile); } } }