Beispiel #1
0
 /**
  * @param string $extension
  * @param int $store_id
  * @return bool
  */
 private function _validateSettings($extension, $store_id)
 {
     if (!$this->user->canModify('extension/extensions')) {
         $this->error['warning'] = $this->language->get('error_permission');
     }
     if (!$this->error) {
         //then check required fields and validate it
         $ext = new ExtensionUtils($extension, $store_id);
         $validate = $ext->validateSettings($this->request->post);
         if (!$validate['result']) {
             if (!isset($validate['errors'])) {
                 $this->error['warning'] = $this->language->get('error_required_field');
             } else {
                 $this->error['warning'] = array();
                 foreach ($validate['errors'] as $field_id => $error_text) {
                     $error = $error_text ? $error_text : $this->language->get($field_id . '_validation_error');
                     $this->error['warning'][] = $error;
                 }
                 $this->error['warning'] = implode('<br>', $this->error['warning']);
             }
         }
     }
     $this->extensions->hk_ValidateData($this);
     return $this->error ? false : true;
 }
 /**
  * Save extention settings into database
  * @param string $extension_txt_id
  * @param array $data
  * @return bool
  */
 public function editSetting($extension_txt_id, $data)
 {
     if (empty($data)) {
         return false;
     }
     if (empty($extension_txt_id)) {
         $error = new AError("Error: Can't edit setting because field \"extension_txt_id\" is empty. Settings array: " . implode(",", array_keys($data)));
         $error->toLog()->toDebug();
         return false;
     }
     // parameters that placed in extension table
     $masks = array('status', 'version', 'date_installed', 'priority', 'license_key');
     $keys = array_keys($data);
     unset($keys['store_id']);
     // check if settings required and it is not status
     $ext = new ExtensionUtils($extension_txt_id, (int) $data['store_id']);
     if (isset($data['one_field']) && !isset($data[$extension_txt_id . "_status"])) {
         $validate = $ext->validateSettings($data);
         if (!$validate['result']) {
             // check is all required settings are set
             if (!isset($validate['errors'])) {
                 $this->errors[] = "Can't save setting because value is empty. ";
             } else {
                 $this->load->language($extension_txt_id . '/' . $extension_txt_id);
                 foreach ($validate['errors'] as $field_id => $error_text) {
                     $this->errors[] = $error_text ? $error_text : $this->language->get($field_id . '_validation_error');
                 }
             }
             return false;
         }
     }
     unset($data['one_field']);
     //remove sign to prevent writing into settings table
     $this->db->query("DELETE FROM " . $this->db->table("settings") . " \n\t\t\t\t\t\t  WHERE `group` = '" . $this->db->escape($extension_txt_id) . "'\n\t\t\t\t\t\t        AND `key` IN ('" . implode("', '", $keys) . "')\n\t\t\t\t\t\t        AND `store_id` = '" . (int) $data['store_id'] . "' ");
     foreach ($data as $key => $value) {
         $setting_name = str_replace($extension_txt_id . "_", '', $key);
         //check if setting is multi-value (array) and save serialized value.
         if (is_array($value)) {
             //validate values in array. If setting is array of all members = 0 save only single value of 0
             //This is to match standard post format in regular form submit
             $concat = implode('', $value);
             if (preg_match('/[^0]/', $concat)) {
                 $value = serialize($value);
             } else {
                 $value = 0;
             }
         }
         // status check
         if ($setting_name == 'status') {
             //when try to enable extension
             if ($value == 1) {
                 // check is parent extension enabled
                 $validate = $ext->validateSettings($data);
                 // check is all required settings are set and valid
                 if (!$validate['result']) {
                     $value = 0;
                     // disable extension
                     if (!isset($validate['errors'])) {
                         $error = "Cannot enable extension \"" . $extension_txt_id . "\". Please fill all required fields on settings edit page. ";
                         $this->messages->saveError('App Error', $error);
                         $this->errors[] = $error;
                         $error = new AError($error);
                         $error->toLog()->toDebug();
                     } else {
                         $this->load->language($extension_txt_id . '/' . $extension_txt_id);
                         foreach ($validate['errors'] as $field_id => $error_text) {
                             $error = $error_text ? $error_text : $this->language->get($field_id . '_validation_error');
                             $this->messages->saveError('App Error: ' . $field_id, $error);
                             $this->errors[] = $error;
                             $error = new AError($error);
                             $error->toLog()->toDebug();
                         }
                     }
                 } else {
                     // if all fine with required fields - check childen
                     $parents = $this->getParentsExtensionTextId($extension_txt_id);
                     $enabled = $this->extensions->getEnabledExtensions();
                     foreach ($parents as $parent) {
                         if (!in_array($parent['key'], $enabled)) {
                             $error = "Cannot enable extension \"" . $extension_txt_id . "\". It's depends on extension \"" . $parent['key'] . "\" which not enabled. ";
                             $this->messages->saveError('Extension App Error', $error);
                             $this->errors[] = $error;
                             $error = new AError($error);
                             $error->toLog()->toDebug();
                             //prevents enabling
                             $value = 0;
                             break;
                         }
                     }
                 }
             } else {
                 // When try to disable disable dependants too
                 if ($this->isExtensionInstalled($extension_txt_id)) {
                     $children_keys = array();
                     $children = $this->getChildrenExtensions($extension_txt_id);
                     foreach ($children as $child) {
                         if ($this->config->get($child['key'] . "_status") == 1) {
                             $children_keys[] = $this->db->escape($child['key']);
                         }
                     }
                     if ($children_keys) {
                         foreach ($children_keys as $child) {
                             $sql = "UPDATE " . $this->db->table("settings") . " \n\t\t\t\t\t\t\t\t\tSET `value` = 0\n\t\t\t\t\t\t\t\t\tWHERE `group` = '" . $child . "'\n\t\t\t\t\t\t\t\t\tAND `key`= '" . $child . "_status'";
                             $this->db->query($sql);
                         }
                         $sql = "UPDATE " . $this->db->table("extensions") . " \n\t\t\t\t\t\t\t\t\tSET `" . $setting_name . "` = '" . $this->db->escape($value) . "'\n\t\t\t\t\t\t\t\t\tWHERE  `key` IN ('" . implode("','", $children_keys) . "')";
                         $this->db->query($sql);
                     }
                 }
             }
         }
         //Special case.
         //Check that we have single mode RL with ID
         if (has_value($data[$key . "_resource_id"]) && !has_value($value)) {
             //save ID if resource path is missing
             $value = $data[$key . "_resource_id"];
         }
         //skip saving ???
         // now re-insert settings
         $this->db->query("INSERT INTO " . $this->db->table("settings") . " \n\t\t\t\t\t\t\t  SET `store_id` = '" . (int) $data['store_id'] . "',\n\t\t\t\t\t\t\t      `group` = '" . $this->db->escape($extension_txt_id) . "',\n\t\t\t\t\t\t\t      `key` = '" . $this->db->escape($key) . "',\n\t\t\t\t\t\t\t      `value` = '" . $this->db->escape($value) . "'");
         if (in_array($setting_name, $masks)) {
             $sql = "UPDATE " . $this->db->table("extensions") . " \n\t\t\t\t\t\tSET `" . $setting_name . "` = '" . $this->db->escape($value) . "'\n\t\t\t\t\t\tWHERE  `key` = '" . $this->db->escape($extension_txt_id) . "'";
             $this->db->query($sql);
         }
     }
     // update date of changes in extension list
     $sql = "UPDATE " . $this->db->table("extensions") . " \n\t\t\t\t\t\tSET `date_modified` = NOW()\n\t\t\t\t\t\tWHERE  `key` = '" . $this->db->escape($extension_txt_id) . "'";
     $this->db->query($sql);
     $this->cache->delete('admin_menu');
     $this->cache->delete('settings');
     return true;
 }