[ Index ] |
PHP Cross Reference of Joomla 4.2.2 documentation |
[Summary view] [Print] [Text view]
1 <?php 2 3 /** 4 * @package Joomla.Administrator 5 * @subpackage com_languages 6 * 7 * @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org> 8 * @license GNU General Public License version 2 or later; see LICENSE.txt 9 */ 10 11 namespace Joomla\Component\Languages\Administrator\Model; 12 13 use Joomla\CMS\Factory; 14 use Joomla\CMS\Filesystem\Path; 15 use Joomla\CMS\Language\Language; 16 use Joomla\CMS\Language\LanguageHelper; 17 use Joomla\CMS\Language\Text; 18 use Joomla\CMS\MVC\Model\AdminModel; 19 20 // phpcs:disable PSR1.Files.SideEffects 21 \defined('_JEXEC') or die; 22 // phpcs:enable PSR1.Files.SideEffects 23 24 /** 25 * Languages Override Model 26 * 27 * @since 2.5 28 */ 29 class OverrideModel extends AdminModel 30 { 31 /** 32 * Method to get the record form. 33 * 34 * @param array $data Data for the form. 35 * @param boolean $loadData True if the form is to load its own data (default case), false if not. 36 * 37 * @return \Joomla\CMS\Form\Form|bool A Form object on success, false on failure. 38 * 39 * @since 2.5 40 */ 41 public function getForm($data = array(), $loadData = true) 42 { 43 // Get the form. 44 $form = $this->loadForm('com_languages.override', 'override', array('control' => 'jform', 'load_data' => $loadData)); 45 46 if (empty($form)) { 47 return false; 48 } 49 50 $client = $this->getState('filter.client', 'site'); 51 $language = $this->getState('filter.language', 'en-GB'); 52 $langName = Language::getInstance($language)->getName(); 53 54 if (!$langName) { 55 // If a language only exists in frontend, its metadata cannot be 56 // loaded in backend at the moment, so fall back to the language tag. 57 $langName = $language; 58 } 59 60 $form->setValue('client', null, Text::_('COM_LANGUAGES_VIEW_OVERRIDE_CLIENT_' . strtoupper($client))); 61 $form->setValue('language', null, Text::sprintf('COM_LANGUAGES_VIEW_OVERRIDE_LANGUAGE', $langName, $language)); 62 $form->setValue('file', null, Path::clean(constant('JPATH_' . strtoupper($client)) . '/language/overrides/' . $language . '.override.ini')); 63 64 return $form; 65 } 66 67 /** 68 * Method to get the data that should be injected in the form. 69 * 70 * @return mixed The data for the form. 71 * 72 * @since 2.5 73 */ 74 protected function loadFormData() 75 { 76 // Check the session for previously entered form data. 77 $data = Factory::getApplication()->getUserState('com_languages.edit.override.data', array()); 78 79 if (empty($data)) { 80 $data = $this->getItem(); 81 } 82 83 $this->preprocessData('com_languages.override', $data); 84 85 return $data; 86 } 87 88 /** 89 * Method to get a single record. 90 * 91 * @param string $pk The key name. 92 * 93 * @return mixed Object on success, false otherwise. 94 * 95 * @since 2.5 96 */ 97 public function getItem($pk = null) 98 { 99 $input = Factory::getApplication()->input; 100 $pk = !empty($pk) ? $pk : $input->get('id'); 101 $fileName = constant('JPATH_' . strtoupper($this->getState('filter.client'))) 102 . '/language/overrides/' . $this->getState('filter.language', 'en-GB') . '.override.ini'; 103 $strings = LanguageHelper::parseIniFile($fileName); 104 105 $result = new \stdClass(); 106 $result->key = ''; 107 $result->override = ''; 108 109 if (isset($strings[$pk])) { 110 $result->key = $pk; 111 $result->override = $strings[$pk]; 112 } 113 114 $oppositeFileName = constant('JPATH_' . strtoupper($this->getState('filter.client') == 'site' ? 'administrator' : 'site')) 115 . '/language/overrides/' . $this->getState('filter.language', 'en-GB') . '.override.ini'; 116 $oppositeStrings = LanguageHelper::parseIniFile($oppositeFileName); 117 $result->both = isset($oppositeStrings[$pk]) && ($oppositeStrings[$pk] == $strings[$pk]); 118 119 return $result; 120 } 121 122 /** 123 * Method to save the form data. 124 * 125 * @param array $data The form data. 126 * @param boolean $oppositeClient Indicates whether the override should not be created for the current client. 127 * 128 * @return boolean True on success, false otherwise. 129 * 130 * @since 2.5 131 */ 132 public function save($data, $oppositeClient = false) 133 { 134 $app = Factory::getApplication(); 135 136 if ($app->isClient('api')) { 137 $client = $this->getState('filter.client'); 138 $language = $this->getState('filter.language'); 139 } else { 140 $client = $app->getUserState('com_languages.overrides.filter.client', 0); 141 $language = $app->getUserState('com_languages.overrides.filter.language', 'en-GB'); 142 } 143 144 // If the override should be created for both. 145 if ($oppositeClient) { 146 $client = 1 - $client; 147 } 148 149 // Return false if the constant is a reserved word, i.e. YES, NO, NULL, FALSE, ON, OFF, NONE, TRUE 150 $reservedWords = array('YES', 'NO', 'NULL', 'FALSE', 'ON', 'OFF', 'NONE', 'TRUE'); 151 152 if (in_array($data['key'], $reservedWords)) { 153 $this->setError(Text::_('COM_LANGUAGES_OVERRIDE_ERROR_RESERVED_WORDS')); 154 155 return false; 156 } 157 158 $client = $client ? 'administrator' : 'site'; 159 160 // Parse the override.ini file in order to get the keys and strings. 161 $fileName = constant('JPATH_' . strtoupper($client)) . '/language/overrides/' . $language . '.override.ini'; 162 $strings = LanguageHelper::parseIniFile($fileName); 163 164 if (isset($strings[$data['id']])) { 165 // If an existent string was edited check whether 166 // the name of the constant is still the same. 167 if ($data['key'] == $data['id']) { 168 // If yes, simply override it. 169 $strings[$data['key']] = $data['override']; 170 } else { 171 // If no, delete the old string and prepend the new one. 172 unset($strings[$data['id']]); 173 $strings = array($data['key'] => $data['override']) + $strings; 174 } 175 } else { 176 // If it is a new override simply prepend it. 177 $strings = array($data['key'] => $data['override']) + $strings; 178 } 179 180 // Write override.ini file with the strings. 181 if (LanguageHelper::saveToIniFile($fileName, $strings) === false) { 182 return false; 183 } 184 185 // If the override should be stored for both clients save 186 // it also for the other one and prevent endless recursion. 187 if (isset($data['both']) && $data['both'] && !$oppositeClient) { 188 return $this->save($data, true); 189 } 190 191 return true; 192 } 193 194 /** 195 * Method to auto-populate the model state. 196 * 197 * Note. Calling getState in this method will result in recursion. 198 * 199 * @return void 200 * 201 * @since 2.5 202 */ 203 protected function populateState() 204 { 205 $app = Factory::getApplication(); 206 207 if ($app->isClient('api')) { 208 return; 209 } 210 211 $client = $app->getUserStateFromRequest('com_languages.overrides.filter.client', 'filter_client', 0, 'int') ? 'administrator' : 'site'; 212 $this->setState('filter.client', $client); 213 214 $language = $app->getUserStateFromRequest('com_languages.overrides.filter.language', 'filter_language', 'en-GB', 'cmd'); 215 $this->setState('filter.language', $language); 216 } 217 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Wed Sep 7 05:41:13 2022 | Chilli.vc Blog - For Webmaster,Blog-Writer,System Admin and Domainer |