/** * @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; }