ServerUIPropertiesMenu for Configurator to edit builtin UIProperties of MP (#194)
This commit is contained in:
		
				
					committed by
					
						
						Lukas Kremsmayr
					
				
			
			
				
	
			
			
			
						parent
						
							3bc3a4e65d
						
					
				
				
					commit
					8c2ae55d97
				
			@@ -18,6 +18,7 @@ use ManiaControl\Manialinks\ManialinkManager;
 | 
				
			|||||||
use ManiaControl\Manialinks\ManialinkPageAnswerListener;
 | 
					use ManiaControl\Manialinks\ManialinkPageAnswerListener;
 | 
				
			||||||
use ManiaControl\Players\Player;
 | 
					use ManiaControl\Players\Player;
 | 
				
			||||||
use ManiaControl\Server\ServerOptionsMenu;
 | 
					use ManiaControl\Server\ServerOptionsMenu;
 | 
				
			||||||
 | 
					use ManiaControl\Server\ServerUIPropertiesMenu;
 | 
				
			||||||
use ManiaControl\Server\VoteRatiosMenu;
 | 
					use ManiaControl\Server\VoteRatiosMenu;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -51,6 +52,8 @@ class Configurator implements CallbackListener, CommandListener, ManialinkPageAn
 | 
				
			|||||||
	private $maniaControl = null;
 | 
						private $maniaControl = null;
 | 
				
			||||||
	/** @var ServerOptionsMenu $serverOptionsMenu */
 | 
						/** @var ServerOptionsMenu $serverOptionsMenu */
 | 
				
			||||||
	private $serverOptionsMenu = null;
 | 
						private $serverOptionsMenu = null;
 | 
				
			||||||
 | 
						/** @var ServerUIPropertiesMenu $serverUIPropertiesMenu */
 | 
				
			||||||
 | 
						private $serverUIPropertiesMenu = null;
 | 
				
			||||||
	/** @var ScriptSettings $scriptSettings */
 | 
						/** @var ScriptSettings $scriptSettings */
 | 
				
			||||||
	private $scriptSettings = null;
 | 
						private $scriptSettings = null;
 | 
				
			||||||
	/** @var VoteRatiosMenu $voteRatiosMenu */
 | 
						/** @var VoteRatiosMenu $voteRatiosMenu */
 | 
				
			||||||
@@ -93,6 +96,10 @@ class Configurator implements CallbackListener, CommandListener, ManialinkPageAn
 | 
				
			|||||||
		$this->serverOptionsMenu = new ServerOptionsMenu($maniaControl);
 | 
							$this->serverOptionsMenu = new ServerOptionsMenu($maniaControl);
 | 
				
			||||||
		$this->addMenu($this->serverOptionsMenu);
 | 
							$this->addMenu($this->serverOptionsMenu);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Create server UI properties menu
 | 
				
			||||||
 | 
							$this->serverUIPropertiesMenu = new ServerUIPropertiesMenu($maniaControl);
 | 
				
			||||||
 | 
							$this->addMenu($this->serverUIPropertiesMenu);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Create script settings
 | 
							// Create script settings
 | 
				
			||||||
		$this->scriptSettings = new ScriptSettings($maniaControl);
 | 
							$this->scriptSettings = new ScriptSettings($maniaControl);
 | 
				
			||||||
		$this->addMenu($this->scriptSettings);
 | 
							$this->addMenu($this->scriptSettings);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										488
									
								
								core/Server/ServerUIPropertiesMenu.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										488
									
								
								core/Server/ServerUIPropertiesMenu.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,488 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace ManiaControl\Server;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use FML\Components\CheckBox;
 | 
				
			||||||
 | 
					use FML\Controls\Entry;
 | 
				
			||||||
 | 
					use FML\Controls\Frame;
 | 
				
			||||||
 | 
					use FML\Controls\Label;
 | 
				
			||||||
 | 
					use FML\Controls\Labels\Label_Text;
 | 
				
			||||||
 | 
					use FML\Controls\Quad;
 | 
				
			||||||
 | 
					use FML\Controls\Quads\Quad_Icons64x64_1;
 | 
				
			||||||
 | 
					use FML\Script\Features\Paging;
 | 
				
			||||||
 | 
					use FML\Script\Script;
 | 
				
			||||||
 | 
					use FML\XmlRpc\UIProperties;
 | 
				
			||||||
 | 
					use ManiaControl\Admin\AuthenticationManager;
 | 
				
			||||||
 | 
					use ManiaControl\Callbacks\CallbackListener;
 | 
				
			||||||
 | 
					use ManiaControl\Callbacks\Callbacks;
 | 
				
			||||||
 | 
					use ManiaControl\Callbacks\TimerListener;
 | 
				
			||||||
 | 
					use ManiaControl\Callbacks\Structures\Common\UIPropertiesBaseStructure;
 | 
				
			||||||
 | 
					use ManiaControl\Configurator\Configurator;
 | 
				
			||||||
 | 
					use ManiaControl\Configurator\ConfiguratorMenu;
 | 
				
			||||||
 | 
					use ManiaControl\Logger;
 | 
				
			||||||
 | 
					use ManiaControl\ManiaControl;
 | 
				
			||||||
 | 
					use ManiaControl\Players\Player;
 | 
				
			||||||
 | 
					use ManiaControl\Utils\DataUtil;
 | 
				
			||||||
 | 
					use Maniaplanet\DedicatedServer\Xmlrpc\FaultException;
 | 
				
			||||||
 | 
					use Maniaplanet\DedicatedServer\Xmlrpc\GameModeException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Class offering a Configurator for the Server UI Properties
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @author    axelalex2
 | 
				
			||||||
 | 
					 * @copyright 
 | 
				
			||||||
 | 
					 * @license   http://www.gnu.org/licenses/ GNU General Public License, Version 3
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					class ServerUIPropertiesMenu implements ConfiguratorMenu, CallbackListener, TimerListener {
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Constants
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						const ACTION_PREFIX_SERVER_UI_PROPERTIES                  = 'ServerUIProperties.';
 | 
				
			||||||
 | 
						const CB_SERVERUIPROPERTY_CHANGED                         = 'ServerUIProperties.PropertyChanged';
 | 
				
			||||||
 | 
						const CB_SERVERUIPROPERTIES_CHANGED                       = 'ServerUIProperties.PropertiesChanged';
 | 
				
			||||||
 | 
						const TABLE_SERVER_UI_PROPERTIES                          = 'mc_serveruiproperties';
 | 
				
			||||||
 | 
						const SETTING_LOAD_DEFAULT_SERVER_UI_PROPERTIES_MAP_BEGIN = 'Load Stored ServerUIProperties on Map-Begin';
 | 
				
			||||||
 | 
						const SETTING_PERMISSION_CHANGE_SERVER_UI_PROPERTIES      = 'Change ServerUIProperties';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const CONFIGURATOR_MENU_DELIMITER                         = '.';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Private properties
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						/** @var ManiaControl $maniaControl */
 | 
				
			||||||
 | 
						private $maniaControl     = null;
 | 
				
			||||||
 | 
						/** @var string $gameShort */
 | 
				
			||||||
 | 
						private $gameShort        = '';
 | 
				
			||||||
 | 
						/** @var array $liveUIProperties */
 | 
				
			||||||
 | 
						private $liveUIProperties = array();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Construct a new ServerUIPropertiesMenu instance
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @param ManiaControl $maniaControl
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public function __construct(ManiaControl $maniaControl) {
 | 
				
			||||||
 | 
							$this->maniaControl = $maniaControl;
 | 
				
			||||||
 | 
							$this->initTables();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Callbacks
 | 
				
			||||||
 | 
							$this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::ONINIT, $this, 'onInit');
 | 
				
			||||||
 | 
							$this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::BEGINMAP, $this, 'onBeginMap');
 | 
				
			||||||
 | 
							$this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::SM_UIPROPERTIES, $this, 'onUIProperties');
 | 
				
			||||||
 | 
							$this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::TM_UIPROPERTIES, $this, 'onUIProperties');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Settings
 | 
				
			||||||
 | 
							$this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_LOAD_DEFAULT_SERVER_UI_PROPERTIES_MAP_BEGIN, false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Permissions
 | 
				
			||||||
 | 
							$this->maniaControl->getAuthenticationManager()->definePermissionLevel(self::SETTING_PERMISSION_CHANGE_SERVER_UI_PROPERTIES, AuthenticationManager::AUTH_LEVEL_ADMIN);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Create all necessary database tables
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @return boolean
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private function initTables() {
 | 
				
			||||||
 | 
							$mysqli = $this->maniaControl->getDatabase()->getMysqli();
 | 
				
			||||||
 | 
							$query  = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_SERVER_UI_PROPERTIES . "` (
 | 
				
			||||||
 | 
									`index` int(11) NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
 | 
									`serverIndex` int(11) NOT NULL,
 | 
				
			||||||
 | 
									`uiPropertyName` varchar(100) NOT NULL DEFAULT '',
 | 
				
			||||||
 | 
									`uiPropertyValue` varchar(500) NOT NULL DEFAULT '',
 | 
				
			||||||
 | 
									PRIMARY KEY (`index`),
 | 
				
			||||||
 | 
									UNIQUE KEY `uiProperty` (`serverIndex`, `uiPropertyName`)
 | 
				
			||||||
 | 
									) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Server UI Properties' AUTO_INCREMENT=1;";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$statement = $mysqli->prepare($query);
 | 
				
			||||||
 | 
							if ($mysqli->error) {
 | 
				
			||||||
 | 
								trigger_error($mysqli->error, E_USER_ERROR);
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$statement->execute();
 | 
				
			||||||
 | 
							if ($statement->error) {
 | 
				
			||||||
 | 
								trigger_error($statement->error, E_USER_ERROR);
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$statement->close();
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * @see \ManiaControl\Configurator\ConfiguratorMenu::getTitle()
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public static function getTitle() {
 | 
				
			||||||
 | 
							return 'Server UI Properties';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Handle OnInit callback
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public function onInit() {
 | 
				
			||||||
 | 
							$this->gameShort = $this->maniaControl->getMapManager()->getCurrentMap()->getGame();
 | 
				
			||||||
 | 
							$this->loadServerUIPropertiesFromDatabase();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Handle Begin Map Callback
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public function onBeginMap() {
 | 
				
			||||||
 | 
							if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_LOAD_DEFAULT_SERVER_UI_PROPERTIES_MAP_BEGIN)) {
 | 
				
			||||||
 | 
								$this->loadServerUIPropertiesFromDatabase();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Handle UI Properties Callback
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @param UIPropertiesBaseStructure
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public function onUIProperties(UIPropertiesBaseStructure $structure) {
 | 
				
			||||||
 | 
							$liveUIProperties = DataUtil::flattenArray($structure->getUiPropertiesArray(), self::CONFIGURATOR_MENU_DELIMITER);
 | 
				
			||||||
 | 
							ksort($liveUIProperties);
 | 
				
			||||||
 | 
							$this->liveUIProperties = $liveUIProperties;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * @see \ManiaControl\Configurator\ConfiguratorMenu::getMenu()
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public function getMenu($width, $height, Script $script, Player $player) {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								$this->loadLiveServerUIProperties();
 | 
				
			||||||
 | 
							} catch (GameModeException $e) {
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$paging = new Paging();
 | 
				
			||||||
 | 
							$script->addFeature($paging);
 | 
				
			||||||
 | 
							$frame = new Frame();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Config
 | 
				
			||||||
 | 
							$pagerSize        = 9.;
 | 
				
			||||||
 | 
							$uiPropertyHeight = 5.;
 | 
				
			||||||
 | 
							$labelTextSize    = 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Pagers
 | 
				
			||||||
 | 
							$pagerPrev = new Quad_Icons64x64_1();
 | 
				
			||||||
 | 
							$frame->addChild($pagerPrev);
 | 
				
			||||||
 | 
							$pagerPrev->setPosition($width * 0.39, $height * -0.44, 2);
 | 
				
			||||||
 | 
							$pagerPrev->setSize($pagerSize, $pagerSize);
 | 
				
			||||||
 | 
							$pagerPrev->setSubStyle($pagerPrev::SUBSTYLE_ArrowPrev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$pagerNext = new Quad_Icons64x64_1();
 | 
				
			||||||
 | 
							$frame->addChild($pagerNext);
 | 
				
			||||||
 | 
							$pagerNext->setPosition($width * 0.45, $height * -0.44, 2);
 | 
				
			||||||
 | 
							$pagerNext->setSize($pagerSize, $pagerSize);
 | 
				
			||||||
 | 
							$pagerNext->setSubStyle($pagerNext::SUBSTYLE_ArrowNext);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$paging->addButtonControl($pagerNext);
 | 
				
			||||||
 | 
							$paging->addButtonControl($pagerPrev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$pageCountLabel = new Label_Text();
 | 
				
			||||||
 | 
							$frame->addChild($pageCountLabel);
 | 
				
			||||||
 | 
							$pageCountLabel->setHorizontalAlign($pageCountLabel::RIGHT);
 | 
				
			||||||
 | 
							$pageCountLabel->setPosition($width * 0.35, $height * -0.44, 1);
 | 
				
			||||||
 | 
							$pageCountLabel->setStyle($pageCountLabel::STYLE_TextTitle1);
 | 
				
			||||||
 | 
							$pageCountLabel->setTextSize(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$paging->setLabel($pageCountLabel);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Setting pages
 | 
				
			||||||
 | 
							$pageFrame = null;
 | 
				
			||||||
 | 
							$posY      = 0.;
 | 
				
			||||||
 | 
							$index     = 0;
 | 
				
			||||||
 | 
							$maxCount  = (int) floor(($height - 2*$pagerSize) / $uiPropertyHeight);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							foreach ($this->liveUIProperties as $uiPropertyName => $uiPropertyValue) {
 | 
				
			||||||
 | 
								if (!isset($this->liveUIProperties[$uiPropertyName])) {
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if ($index % $maxCount === 0) {
 | 
				
			||||||
 | 
									$pageFrame = new Frame();
 | 
				
			||||||
 | 
									$frame->addChild($pageFrame);
 | 
				
			||||||
 | 
									$posY = $height * 0.41;
 | 
				
			||||||
 | 
									$paging->addPageControl($pageFrame);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								$uiPropertyFrame = new Frame();
 | 
				
			||||||
 | 
								$pageFrame->addChild($uiPropertyFrame);
 | 
				
			||||||
 | 
								$uiPropertyFrame->setY($posY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								$nameLabel = new Label_Text();
 | 
				
			||||||
 | 
								$uiPropertyFrame->addChild($nameLabel);
 | 
				
			||||||
 | 
								$nameLabel->setHorizontalAlign($nameLabel::LEFT);
 | 
				
			||||||
 | 
								$nameLabel->setX($width * -0.46);
 | 
				
			||||||
 | 
								$nameLabel->setSize($width * 0.4, $uiPropertyHeight);
 | 
				
			||||||
 | 
								$nameLabel->setStyle($nameLabel::STYLE_TextCardSmall);
 | 
				
			||||||
 | 
								$nameLabel->setTextSize($labelTextSize);
 | 
				
			||||||
 | 
								$nameLabel->setText($uiPropertyName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (is_bool($uiPropertyValue)) {
 | 
				
			||||||
 | 
									// Boolean checkbox
 | 
				
			||||||
 | 
									$quad = new Quad();
 | 
				
			||||||
 | 
									$quad->setX($width / 2 * 0.545);
 | 
				
			||||||
 | 
									$quad->setSize(4, 4);
 | 
				
			||||||
 | 
									$checkBox = new CheckBox(self::ACTION_PREFIX_SERVER_UI_PROPERTIES . $uiPropertyName, $uiPropertyValue, $quad);
 | 
				
			||||||
 | 
									$uiPropertyFrame->addChild($checkBox);
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									// Value entry
 | 
				
			||||||
 | 
									$entry = new Entry();
 | 
				
			||||||
 | 
									$uiPropertyFrame->addChild($entry);
 | 
				
			||||||
 | 
									$entry->setStyle(Label_Text::STYLE_TextValueSmall);
 | 
				
			||||||
 | 
									$entry->setX($width / 2 * 0.55);
 | 
				
			||||||
 | 
									$entry->setTextSize(1);
 | 
				
			||||||
 | 
									$entry->setSize($width * 0.3, $uiPropertyHeight * 0.9);
 | 
				
			||||||
 | 
									$entry->setName(self::ACTION_PREFIX_SERVER_UI_PROPERTIES . $uiPropertyName);
 | 
				
			||||||
 | 
									$entry->setDefault($uiPropertyValue);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								$posY -= $uiPropertyHeight;
 | 
				
			||||||
 | 
								$index++;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return $frame;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * @see \ManiaControl\Configurator\ConfiguratorMenu::saveConfigData()
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public function saveConfigData(array $configData, Player $player) {
 | 
				
			||||||
 | 
							if (!$this->maniaControl->getAuthenticationManager()->checkPermission($player, self::SETTING_PERMISSION_CHANGE_SERVER_UI_PROPERTIES)) {
 | 
				
			||||||
 | 
								$this->maniaControl->getAuthenticationManager()->sendNotAllowed($player);
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (!$configData[3] || strpos($configData[3][0]['Name'], self::ACTION_PREFIX_SERVER_UI_PROPERTIES) !== 0) {
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$prefixLength = strlen(self::ACTION_PREFIX_SERVER_UI_PROPERTIES);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$newUIProperties = array();
 | 
				
			||||||
 | 
							foreach ($configData[3] as $uiProperty) {
 | 
				
			||||||
 | 
								$uiPropertyName = substr($uiProperty['Name'], $prefixLength);
 | 
				
			||||||
 | 
								if (!isset($this->liveUIProperties[$uiPropertyName])) {
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if ($uiProperty['Value'] == $this->liveUIProperties[$uiPropertyName]) {
 | 
				
			||||||
 | 
									// Not changed
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								$newUIProperties[$uiPropertyName] = $uiProperty['Value'];
 | 
				
			||||||
 | 
								settype($newUIProperties[$uiPropertyName], gettype($this->liveUIProperties[$uiPropertyName]));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$success = $this->applyNewServerUIProperties($newUIProperties, $player);
 | 
				
			||||||
 | 
							if ($success) {
 | 
				
			||||||
 | 
								$this->maniaControl->getChat()->sendSuccess('Server UI Properties saved!', $player);
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								$this->maniaControl->getChat()->sendError('Server UI Properties Saving failed!', $player);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Reopen the Menu (delayed, so Configurator doesn't show nothing)
 | 
				
			||||||
 | 
							$this->maniaControl->getTimerManager()->registerOneTimeListening(
 | 
				
			||||||
 | 
								$this,
 | 
				
			||||||
 | 
								function () use ($player) {
 | 
				
			||||||
 | 
									$this->maniaControl->getConfigurator()->showMenu($player, $this);
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								100
 | 
				
			||||||
 | 
							);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Load Settings from Database
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @return bool
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public function loadServerUIPropertiesFromDatabase() {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								$this->loadLiveServerUIProperties();
 | 
				
			||||||
 | 
							} catch (GameModeException $e) {
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$mysqli      = $this->maniaControl->getDatabase()->getMysqli();
 | 
				
			||||||
 | 
							$serverIndex = $this->maniaControl->getServer()->index;
 | 
				
			||||||
 | 
							$query       = "SELECT * FROM `" . self::TABLE_SERVER_UI_PROPERTIES . "`
 | 
				
			||||||
 | 
									WHERE serverIndex = {$serverIndex};";
 | 
				
			||||||
 | 
							$result      = $mysqli->query($query);
 | 
				
			||||||
 | 
							if ($mysqli->error) {
 | 
				
			||||||
 | 
								trigger_error($mysqli->error);
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$loadedUIProperties = array();
 | 
				
			||||||
 | 
							while ($row = $result->fetch_object()) {
 | 
				
			||||||
 | 
								if (!isset($this->liveUIProperties[$row->uiPropertyName])) {
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								$loadedUIProperties[$row->uiPropertyName] = $row->uiPropertyValue;
 | 
				
			||||||
 | 
								settype($loadedUIProperties[$row->uiPropertyName], gettype($this->liveUIProperties[$row->uiPropertyName]));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$result->free();
 | 
				
			||||||
 | 
							if (empty($loadedUIProperties)) {
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return $this->setServerUIProperties($loadedUIProperties);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Triggers a callback to receive the current UI Properties of the server.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private function loadLiveServerUIProperties() {
 | 
				
			||||||
 | 
							switch ($this->gameShort) {
 | 
				
			||||||
 | 
								case 'sm':
 | 
				
			||||||
 | 
									$this->maniaControl->getModeScriptEventManager()->getShootmaniaUIProperties();
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case 'tm':
 | 
				
			||||||
 | 
									$this->maniaControl->getModeScriptEventManager()->getTrackmaniaUIProperties();
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Sets the given UI Properties by XML to the server.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @param array $uiProperties
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private function setServerUIProperties(array $uiProperties) {
 | 
				
			||||||
 | 
							$xmlProperties = $this->buildXmlUIProperties($uiProperties);
 | 
				
			||||||
 | 
							switch ($this->gameShort) {
 | 
				
			||||||
 | 
								case 'sm':
 | 
				
			||||||
 | 
									$this->maniaControl->getModeScriptEventManager()->setShootmaniaUIProperties($xmlProperties);
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case 'tm':
 | 
				
			||||||
 | 
									$this->maniaControl->getModeScriptEventManager()->setTrackmaniaUIProperties($xmlProperties);
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Builds the given UI Properties into a XML string representation.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @param array $uiProperties
 | 
				
			||||||
 | 
						 * @return string
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private function buildXmlUIProperties(array $uiProperties) {
 | 
				
			||||||
 | 
							$this->includePositions($uiProperties);
 | 
				
			||||||
 | 
							$uiProperties = DataUtil::unflattenArray($uiProperties, self::CONFIGURATOR_MENU_DELIMITER);
 | 
				
			||||||
 | 
							$uiProperties = DataUtil::implodePositions($uiProperties);
 | 
				
			||||||
 | 
							return DataUtil::buildXmlStandaloneFromArray($uiProperties, 'ui_properties');
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Includes possibly missing position properties in given UI Properties.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @param array &$uiProperties
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private function includePositions(array &$uiProperties) {
 | 
				
			||||||
 | 
							$uiPropertiesToAdd = array();
 | 
				
			||||||
 | 
							$positions = array('x', 'y', 'z');
 | 
				
			||||||
 | 
							foreach ($uiProperties as $key => $value) {
 | 
				
			||||||
 | 
								$keySplits = explode(self::CONFIGURATOR_MENU_DELIMITER, $key);
 | 
				
			||||||
 | 
								$numKeySplits = count($keySplits);
 | 
				
			||||||
 | 
								$keySplit = $keySplits[$numKeySplits-1];
 | 
				
			||||||
 | 
								if (in_array($keySplit, $positions)) {
 | 
				
			||||||
 | 
									foreach ($positions as $position) {
 | 
				
			||||||
 | 
										$keySplits[$numKeySplits-1] = $position;
 | 
				
			||||||
 | 
										$keyToAdd = implode(self::CONFIGURATOR_MENU_DELIMITER, $keySplits);
 | 
				
			||||||
 | 
										if (array_key_exists($keyToAdd, $this->liveUIProperties)) {
 | 
				
			||||||
 | 
											$uiPropertiesToAdd[$keyToAdd] = $this->liveUIProperties[$keyToAdd];
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$uiProperties = $uiProperties + $uiPropertiesToAdd;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Apply the Array of new Server UI Properties
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @param array  $newUIProperties
 | 
				
			||||||
 | 
						 * @param Player $player
 | 
				
			||||||
 | 
						 * @return bool
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private function applyNewServerUIProperties(array $newUIProperties, Player $player) {
 | 
				
			||||||
 | 
							if (empty($newUIProperties)) {
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								$this->setServerUIProperties($newUIProperties);
 | 
				
			||||||
 | 
							} catch (FaultException $e) {
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Save Settings into Database
 | 
				
			||||||
 | 
							$mysqli = $this->maniaControl->getDatabase()->getMysqli();
 | 
				
			||||||
 | 
							$query  = "INSERT INTO `" . self::TABLE_SERVER_UI_PROPERTIES . "` (
 | 
				
			||||||
 | 
									`serverIndex`,
 | 
				
			||||||
 | 
									`uiPropertyName`,
 | 
				
			||||||
 | 
									`uiPropertyValue`
 | 
				
			||||||
 | 
									) VALUES (
 | 
				
			||||||
 | 
									?, ?, ?
 | 
				
			||||||
 | 
									) ON DUPLICATE KEY UPDATE
 | 
				
			||||||
 | 
									`uiPropertyValue` = VALUES(`uiPropertyValue`);";
 | 
				
			||||||
 | 
							$statement = $mysqli->prepare($query);
 | 
				
			||||||
 | 
							if ($mysqli->error) {
 | 
				
			||||||
 | 
								trigger_error($mysqli->error);
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$uiPropertyDbName  = null;
 | 
				
			||||||
 | 
							$uiPropertyDbValue = null;
 | 
				
			||||||
 | 
							$statement->bind_param('iss', $this->maniaControl->getServer()->index, $uiPropertyDbName, $uiPropertyDbValue);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Notifications
 | 
				
			||||||
 | 
							$uiPropertiesCount = count($newUIProperties);
 | 
				
			||||||
 | 
							$uiPropertyIndex   = 0;
 | 
				
			||||||
 | 
							$title             = $this->maniaControl->getAuthenticationManager()->getAuthLevelName($player);
 | 
				
			||||||
 | 
							$chatMessage       = '$ff0' . $title . ' ' . $player->getEscapedNickname() . ' set ServerUIPropert' . ($uiPropertiesCount > 1 ? 'ies' : 'y') . ' ';
 | 
				
			||||||
 | 
							foreach ($newUIProperties as $uiPropertyName => $uiPropertyValue) {
 | 
				
			||||||
 | 
								$chatMessage .= '$<$fff' . $uiPropertyName . '$>$ff0 ';
 | 
				
			||||||
 | 
								$chatMessage .= 'to $<$fff' . $this->parseServerUIPropertyValue($uiPropertyValue) . '$>';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if ($uiPropertyIndex < $uiPropertiesCount-1) {
 | 
				
			||||||
 | 
									$chatMessage .= ', ';
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Add To Database
 | 
				
			||||||
 | 
								$uiPropertyDbName = $uiPropertyName;
 | 
				
			||||||
 | 
								$uiPropertyDbValue = $uiPropertyValue;
 | 
				
			||||||
 | 
								$statement->execute();
 | 
				
			||||||
 | 
								if ($statement->error) {
 | 
				
			||||||
 | 
									trigger_error($statement->error);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Trigger own callback
 | 
				
			||||||
 | 
								$this->maniaControl->getCallbackManager()->triggerCallback(self::CB_SERVERUIPROPERTY_CHANGED, $uiPropertyName, $uiPropertyValue);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								$uiPropertyIndex++;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$statement->close();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$this->maniaControl->getCallbackManager()->triggerCallback(self::CB_SERVERUIPROPERTIES_CHANGED);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$chatMessage .= '!';
 | 
				
			||||||
 | 
							$this->maniaControl->getChat()->sendInformation($chatMessage);
 | 
				
			||||||
 | 
							Logger::logInfo($chatMessage, true);
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Parse the Server UI Property to a String Representation
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @param mixed $value
 | 
				
			||||||
 | 
						 * @return string
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private function parseServerUIPropertyValue($value) {
 | 
				
			||||||
 | 
							if (is_bool($value)) {
 | 
				
			||||||
 | 
								return ($value ? 'True' : 'False');
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return (string) $value;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										158
									
								
								core/Utils/DataUtil.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								core/Utils/DataUtil.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,158 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace ManiaControl\Utils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use InvalidArgumentException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Utility Class offering Methods related to Data Structures
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @author    axelalex2
 | 
				
			||||||
 | 
					 * @copyright 
 | 
				
			||||||
 | 
					 * @license   http://www.gnu.org/licenses/ GNU General Public License, Version 3
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					abstract class DataUtil {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Build a multi-dimensional array into XML-String.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @param  array  $a
 | 
				
			||||||
 | 
						 * @param  string $root
 | 
				
			||||||
 | 
						 * @return string
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public static function buildXmlStandaloneFromArray(array $a, string $root = '') {
 | 
				
			||||||
 | 
							$domDocument                = new \DOMDocument("1.0", "utf-8");
 | 
				
			||||||
 | 
							$domDocument->xmlStandalone = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if ($root === '') {	
 | 
				
			||||||
 | 
								if (count($a) != 1) {
 | 
				
			||||||
 | 
									throw new InvalidArgumentException('Array needs to have a single root!');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								reset($a);
 | 
				
			||||||
 | 
								$root = key($a);
 | 
				
			||||||
 | 
								if (!is_string($root)) {
 | 
				
			||||||
 | 
									throw new InvalidArgumentException('All keys have to be strings!');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								$a = $a[$root];
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$domRootElement = $domDocument->createElement($root);
 | 
				
			||||||
 | 
							$domDocument->appendChild($domRootElement);
 | 
				
			||||||
 | 
							self::buildXmlChildFromArray($domDocument, $domRootElement, $a);
 | 
				
			||||||
 | 
							return $domDocument->saveXML();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Build a multi-dimensional array into XML-String (recursion for children).
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @param \DOMDocument $domDocument
 | 
				
			||||||
 | 
						 * @param \DOMElement  &$domElement
 | 
				
			||||||
 | 
						 * @param array        $a
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private static function buildXmlChildFromArray(\DOMDocument $domDocument, \DOMElement &$domElement, array $a) {
 | 
				
			||||||
 | 
							foreach ($a as $key => $value) {
 | 
				
			||||||
 | 
								if (is_array($value)) {
 | 
				
			||||||
 | 
									$domSubElement = $domDocument->createElement($key);
 | 
				
			||||||
 | 
									$domElement->appendChild($domSubElement);
 | 
				
			||||||
 | 
									self::buildXmlChildFromArray($domDocument, $domSubElement, $a[$key]);
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									$valueString = (is_string($value) ? $value : var_export($value, true));
 | 
				
			||||||
 | 
									$domElement->setAttribute($key, $valueString);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Implodes sub-arrays with position properties.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @param array $a
 | 
				
			||||||
 | 
						 * @param bool  $recurse
 | 
				
			||||||
 | 
						 * @return array
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public static function implodePositions(array $a, bool $recurse = true) {
 | 
				
			||||||
 | 
							$result = array();
 | 
				
			||||||
 | 
							foreach ($a as $key => $value) {
 | 
				
			||||||
 | 
								if (is_array($value)) {
 | 
				
			||||||
 | 
									$arrayKeys = array_keys($value);
 | 
				
			||||||
 | 
									if (in_array('x', $arrayKeys) && in_array('y', $arrayKeys)) {
 | 
				
			||||||
 | 
										$value = $value['x'].' '.$value['y'].(in_array('z', $arrayKeys) ? ' '.$value['z'] : '');
 | 
				
			||||||
 | 
									} elseif ($recurse) {
 | 
				
			||||||
 | 
										$value = self::implodePositions($value, $recurse);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								$result[$key] = $value;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return $result;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Transforms a multidimensional-array into a 1-dimensional with concatenated keys.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @param array  $a
 | 
				
			||||||
 | 
						 * @param string $delimiter
 | 
				
			||||||
 | 
						 * @param string $prefix (used for recursion)
 | 
				
			||||||
 | 
						 * @return array
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public static function flattenArray(array $a, string $delimiter = '.', string $prefix = '') {
 | 
				
			||||||
 | 
							$result = array();
 | 
				
			||||||
 | 
							foreach ($a as $key => $value)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (!is_string($key)) {
 | 
				
			||||||
 | 
									throw new InvalidArgumentException('All keys have to be strings!');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								$new_key = $prefix . (empty($prefix) ? '' : $delimiter) . $key;
 | 
				
			||||||
 | 
								if (is_array($value)) {
 | 
				
			||||||
 | 
									$result = array_merge($result, self::flattenArray($value, $delimiter, $new_key));
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									$result[$new_key] = $value;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return $result;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Transforms a 1-dimensional array into a multi-dimensional by splitting the keys by a given delimiter.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @param array  $a
 | 
				
			||||||
 | 
						 * @param string $delimiter
 | 
				
			||||||
 | 
						 * @return array
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public static function unflattenArray(array $a, string $delimiter = '.') {
 | 
				
			||||||
 | 
							$result = array();
 | 
				
			||||||
 | 
							foreach ($a as $key => $value) {
 | 
				
			||||||
 | 
								if (!is_string($key)) {
 | 
				
			||||||
 | 
									throw new InvalidArgumentException('All keys have to be strings!');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								$keySplits = explode($delimiter, $key);
 | 
				
			||||||
 | 
								$numSplits = count($keySplits);
 | 
				
			||||||
 | 
								$subResult = &$result;
 | 
				
			||||||
 | 
								for ($i = 0; $i < $numSplits; $i++) {
 | 
				
			||||||
 | 
									$keySplit = $keySplits[$i];
 | 
				
			||||||
 | 
									if ($i < $numSplits-1) {
 | 
				
			||||||
 | 
										// subarray
 | 
				
			||||||
 | 
										if (!array_key_exists($keySplit, $subResult)) {
 | 
				
			||||||
 | 
											$subResult[$keySplit] = array();
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										if (!is_array($subResult[$keySplit])) {
 | 
				
			||||||
 | 
											throw new InvalidArgumentException('');
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											$subResult = &$subResult[$keySplit];
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										// insert value
 | 
				
			||||||
 | 
										if (array_key_exists($keySplit, $subResult)) {
 | 
				
			||||||
 | 
											throw new InvalidArgumentException('Found duplicated key!');
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											$subResult[$keySplit] = $value;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return $result;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user