/**
  * saves the settings to the database
  * @param array $aData an associative array of fieldnames and values
  */
 public function savePreferences($aData)
 {
     if (wfReadOnly()) {
         $url = SpecialPage::getTitleFor('WikiAdmin')->getFullURL(array('mode' => 'Preferences', 'success' => 0));
         $this->getOutput()->redirect($url);
         return false;
     }
     $vars = BsConfig::getRegisteredVars();
     foreach ($vars as $var) {
         $options = $var->getOptions();
         if (!($options & (BsConfig::LEVEL_PUBLIC | BsConfig::LEVEL_USER))) {
             continue;
         }
         if ($options & BsConfig::NO_DEFAULT) {
             continue;
         }
         $name = $this->generateFieldId($var);
         $value = isset($aData[$name]) ? $aData[$name] : NULL;
         if ($var->getOptions() & BsConfig::TYPE_BOOL && $value == NULL) {
             BsConfig::set($var->getKey(), 0, true);
         }
         $bReturn = true;
         wfRunHooks('BSWikiAdminPreferencesBeforeSetVariable', array($this, &$var, &$value, &$bReturn));
         if ($value !== null && $bReturn !== false) {
             BsConfig::set($var->getKey(), $value, true);
         }
     }
     BsConfig::saveSettings();
     $url = SpecialPage::getTitleFor('WikiAdmin')->getFullURL(array('mode' => 'Preferences', 'success' => 1));
     $this->getOutput()->redirect($url);
     return false;
 }
 /**
  * Hook handler for UserSaveOptions
  * @param User $user User whose options are being modified.
  * @param Array &$options Options array
  * @return true always true to keep hook alive
  */
 public function onUserSaveOptions($user, &$options)
 {
     BsConfig::loadSettings();
     $oCurrentTitle = $this->getTitle();
     //May return null in CLI
     if ($oCurrentTitle instanceof Title && $oCurrentTitle->isSpecialPage()) {
         $bDeliverUserSettings = true;
     } else {
         $bDeliverUserSettings = false;
     }
     $bOrigDeliver = BsConfig::deliverUsersSettings($bDeliverUserSettings);
     $aRegisteredVariables = BsConfig::getRegisteredVars();
     $aSortedVariables = array();
     foreach ($aRegisteredVariables as $oVariable) {
         $iOptions = $oVariable->getOptions();
         if (!($iOptions & BsConfig::LEVEL_USER)) {
             continue;
         }
         if ($bDeliverUserSettings === false) {
             if ($iOptions & BsConfig::NO_DEFAULT) {
                 continue;
             }
         }
         $sAdapterName = strtoupper($oVariable->getAdapter());
         $sExtensionName = $oVariable->getExtension();
         if (empty($sExtensionName)) {
             $sExtensionName = 'BASE';
         }
         $aSortedVariables[$sAdapterName][$sExtensionName][] = $oVariable;
     }
     foreach ($aSortedVariables as $sAdapterName => $aExtensions) {
         if (!count($aExtensions)) {
             continue;
         }
         foreach ($aExtensions as $sExtensionName => $aSettings) {
             // if continue, then $oAdapterSetView is not added to output
             if (!count($aSettings)) {
                 continue;
             }
             foreach ($aSettings as $oVariable) {
                 //Avoid "undefined index" notices and weird NULL values in settings
                 $value = $oVariable->getValue();
                 if (isset($options[$oVariable->generateFieldId()])) {
                     //Set but no bool
                     $value = $options[$oVariable->generateFieldId()];
                 }
                 if (isset($options[$oVariable->getKey()])) {
                     //Set but no bool
                     $value = $options[$oVariable->getKey()];
                 }
                 $options[$oVariable->getKey()] = BsStringHelper::isSerialized($value) ? $value : serialize($value);
                 unset($options[$oVariable->generateFieldId()]);
             }
         }
     }
     BsConfig::deliverUsersSettings($bOrigDeliver);
     return true;
 }