[ Index ]

PHP Cross Reference of Joomla 4.2.2 documentation

title

Body

[close]

/administrator/components/com_languages/src/Model/ -> OverrideModel.php (source)

   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  }


Generated: Wed Sep 7 05:41:13 2022 Chilli.vc Blog - For Webmaster,Blog-Writer,System Admin and Domainer