Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Legacy/DataWriter/Phrase.php
<?php

namespace XF\Legacy\DataWriter;

use
XF\Legacy\Phrase as XenForo_Phrase;

class
Phrase extends \XF\Legacy\DataWriter
{
   
/**
     * Option that controls whether language-related caches will be rebuild.
     * Defaults to true.
     *
     * @var string
     */
   
const OPTION_REBUILD_LANGUAGE_CACHE = 'rebuildLanguageCache';

   
/**
     * Option that controls whether templates that use this phrase should be recompiled.
     * This can be a slow process if updating a lot of phrases. Defaults to true.
     *
     * @var string
     */
   
const OPTION_FULL_RECOMPILE = 'fullRecompile';

   
/**
     * Controls whether templates including this phrase are recompiled on change.
     * Defaults to true.
     *
     * @var string
     */
   
const OPTION_RECOMPILE_TEMPLATE = 'recompileTemplate';

   
/**
     * Controls whether effective phrase values are compiled for this phrase on change.
     * Defaults to true.
     *
     * @var string
     */
   
const OPTION_RECOMPILE_PHRASE = 'recompilePhrase';

   
/**
     * Option that controls if phrase map is rebuild when phrase is changed. Defaults to true.
     *
     * @var string
     */
   
const OPTION_REBUILD_PHRASE_MAP = 'rebuildPhraseMap';

   
/**
     * If false, duplicate checking is disabled. An error will occur on dupes. Defaults to true.
     *
     * @var string
     */
   
const OPTION_CHECK_DUPLICATE = 'checkDuplicate';

   
/**
     * Title of the phrase that will be created when a call to set the
     * existing data fails (when the data doesn't exist).
     *
     * @var string
     */
   
protected $_existingDataErrorPhrase = 'requested_phrase_not_found';

   
/**
    * Gets the fields that are defined for the table. See parent for explanation.
    *
    * @return array
    */
   
protected function _getFields()
    {
        return [
           
'xf_phrase' => [
               
'phrase_id'    => ['type' => self::TYPE_UINT,   'autoIncrement' => true],
               
'language_id'  => ['type' => self::TYPE_UINT,   'required' => true],
               
'title'        => ['type' => self::TYPE_BINARY, 'maxLength' => 100,
                   
'verification' => ['$this', '_verifyTitle'],
                   
'required' => 'please_enter_valid_title'
               
],
               
'phrase_text'  => ['type' => self::TYPE_STRING, 'default' => '', 'noTrim' => true],
               
'global_cache' => ['type' => self::TYPE_BOOLEAN, 'default' => 0],
               
'addon_id'     => ['type' => self::TYPE_STRING, 'maxLength' => 25, 'default' => ''],
               
'version_id'   => ['type' => self::TYPE_UINT, 'default' => 0],
               
'version_string' => ['type' => self::TYPE_STRING,  'maxLength' => 30, 'default' => '']
            ]
        ];
    }

   
/**
    * Gets the actual existing data out of data that was passed in. See parent for explanation.
    *
    * @param mixed
    *
    * @return array|false
    */
   
protected function _getExistingData($data)
    {
        if (!
$phrase_id = $this->_getExistingPrimaryKey($data))
        {
            return
false;
        }

        return [
'xf_phrase' => $this->_getPhraseModel()->getPhraseById($phrase_id)];
    }

   
/**
    * Gets SQL condition to update the existing record.
    *
    * @return string
    */
   
protected function _getUpdateCondition($tableName)
    {
        return
'phrase_id = ' . $this->_db->quote($this->getExisting('phrase_id'));
    }

   
/**
    * Gets the default set of options for this data writer.
    * If in debug mode and we have a development directory config, we set the
    * dev output directory automatically.
    *
    * @return array
    */
   
protected function _getDefaultOptions()
    {
       
$options = [
           
self::OPTION_REBUILD_LANGUAGE_CACHE => true,
           
self::OPTION_RECOMPILE_PHRASE => true,
           
self::OPTION_RECOMPILE_TEMPLATE => true,
           
self::OPTION_REBUILD_PHRASE_MAP => true,
           
self::OPTION_CHECK_DUPLICATE => true
       
];

        return
$options;
    }

   
/**
     * Sets an option. If the OPTION_FULL_RECOMPILE option is specified, other options are
     * set instead.
     *
     * @param string $name
     * @param mixed $value
     */
   
public function setOption($name, $value)
    {
        if (
$name === self::OPTION_FULL_RECOMPILE)
        {
           
parent::setOption(self::OPTION_RECOMPILE_PHRASE, $value);
           
parent::setOption(self::OPTION_RECOMPILE_TEMPLATE, $value);
        }
        else
        {
           
parent::setOption($name, $value);
        }
    }

   
/**
     * Verifies that the phrase title ID is valid.
     *
     * @param string $title
     *
     * @return boolean
     */
   
protected function _verifyTitle(&$title)
    {
        if (
preg_match('/[^a-zA-Z0-9_]/', $title))
        {
           
$this->error(new XenForo_Phrase('please_enter_title_using_only_alphanumeric'), 'title');
            return
false;
        }

        return
true;
    }

   
/**
     * Pre-save handling.
     */
   
protected function _preSave()
    {
        if (
$this->getOption(self::OPTION_CHECK_DUPLICATE))
        {
            if (
$this->isChanged('title') || $this->isChanged('language_id'))
            {
               
$existing = $this->_getPhraseModel()->getPhraseInLanguageByTitle($this->get('title'), $this->get('language_id'));
                if (
$existing)
                {
                   
$this->error(new XenForo_Phrase('phrase_titles_must_be_unique_in_language'), 'title');
                }
            }
        }

        if (
            (
$this->isChanged('addon_id') || $this->isChanged('title') || $this->isChanged('phrase_text'))
            && !
$this->isChanged('version_id')
        )
        {
           
$this->updateVersionId();
        }
    }
}