From a507f859183bc19d6a3bee9c0504eafe0e65f501 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tim=20D=C3=BCsterhus?= Date: Fri, 19 Jul 2013 16:32:15 +0200 Subject: [PATCH] Properly handle duplicate smileyCodes in SmileyImporter --- .../system/importer/SmileyImporter.class.php | 53 ++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/wcfsetup/install/files/lib/system/importer/SmileyImporter.class.php b/wcfsetup/install/files/lib/system/importer/SmileyImporter.class.php index 498a1fee9e..551c2fdd86 100644 --- a/wcfsetup/install/files/lib/system/importer/SmileyImporter.class.php +++ b/wcfsetup/install/files/lib/system/importer/SmileyImporter.class.php @@ -1,11 +1,13 @@ * @package com.woltlab.wcf @@ -13,6 +15,35 @@ use wcf\data\smiley\SmileyEditor; * @category Community Framework */ class SmileyImporter implements IImporter { + /** + * known smiley codes + * + * @var array + */ + public $knownCodes = array(); + + /** + * Reads out known smiley codes. + */ + public function __construct() { + $sql = "SELECT smileyID, smileyCode, aliases + FROM wcf".WCF_N."_smiley"; + $statement = WCF::getDB()->prepareStatement($sql); + $statement->execute(); + + while ($row = $statement->fetchArray()) { + $known = array(); + if (!empty($row['aliases'])) { + $known = explode("\n", $row['aliases']); + } + $known[] = $row['smileyCode']; + + foreach ($known as $smileyCode) { + $this->knownCodes[StringUtil::toLowerCase($smileyCode)] = $row['smileyID']; + } + } + } + /** * @see wcf\system\importer\IImporter::import() */ @@ -21,11 +52,31 @@ class SmileyImporter implements IImporter { $data['smileyPath'] = 'images/smilies/'.basename($additionalData['fileLocation']); if (!@copy($additionalData['fileLocation'], WCF_DIR.$data['smileyPath'])) return 0; + // check smileycode + if (isset($this->knownCodes[StringUtil::toLowerCase($data['smileyCode'])])) return $this->knownCodes[StringUtil::toLowerCase($data['smileyCode'])]; + $data['packageID'] = 1; + if (!isset($data['aliases'])) $data['aliases'] = ''; + + // check aliases + $aliases = array(); + if (!empty($data['aliases'])) { + $aliases = explode("\n", StringUtil::unifyNewlines($data['aliases'])); + foreach ($aliases as $key => $alias) { + if (isset($this->knownCodes[StringUtil::toLowerCase($alias)])) unset($aliases[$key]); + } + $data['aliases'] = implode("\n", $aliases); + } // save smiley $smiley = SmileyEditor::create($data); + // add smileyCode + aliases to knownCodes + $this->knownCodes[StringUtil::toLowerCase($data['smileyCode'])] = $smiley->smileyID; + foreach ($aliases as $alias) { + $this->knownCodes[StringUtil::toLowerCase($alias)] = $smiley->smileyID; + } + return $smiley->smileyID; } } -- 2.20.1