CloudCyberSystems Posted April 6, 2015 Share Posted April 6, 2015 (edited) Ok so i had a problem installing my module which is now solved. BUT now for some reason i cant get the module form to add records entered into the form to the database. Can someone please point out where i am going wrong. (here is the entire page code <?php if (!defined('_PS_VERSION_')) exit; class XmlApi extends Module { public function __construct() { $this->name = 'xmlapi'; $this->tab = 'administration'; $this->version = '1.0.0'; $this->author = 'Andrew Burston'; $this->need_instance = 0; $this->ps_versions_compliancy = array('min' => '1.6', 'max' => _PS_VERSION_); $this->bootstrap = true; parent::__construct(); $this->displayName = $this->l('Xml API'); $this->description = $this->l('Import/Update Products and send orders to your suppliers!.'); $this->confirmUninstall = $this->l('Are you sure you want to uninstall?'); if (!Configuration::get('xml_api')) $this->warning = $this->l('No name provided'); } public function install() { /* Config values and register */ $languages = $this->getAvailableLanguages($this->id_shop); $homecat = array(); if (!parent::install() || !$this->installDB() ) return false; return true; } public function installDB() { return Db::getInstance()->execute(' CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'xmlapi` ( `xml_service_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `xml_service_customer_code` VARCHAR(255) NOT NULL, `xml_service_user_id` VARCHAR(255) NOT NULL, `xml_service_login_key` VARCHAR(255) NOT NULL, INDEX (`xml_service_id`) ) DEFAULT CHARSET=utf8;'); } public function uninstall() { if (!parent::uninstall() || !$this->uninstallDB() ) return false; return true; } public function uninstallDB() { return Db::getInstance()->execute(' DROP TABLE `'._DB_PREFIX_.'xmlapi`'); } public function getAvailableLanguages($id_shop) { if (version_compare(_PS_VERSION_, '1.5', '>')) $shopLanguages = Language::getLanguages(false, (int)($id_shop)); else $shopLanguages = Language::getLanguages(false); $okLanguages = array(); foreach ($shopLanguages as $language) if ($language['active'] && array_key_exists($language['iso_code'], $this->gMerchantCenterCountries)) $okLanguages[] = $language; return $okLanguages; } public function getContent() { $output = null; if (Tools::isSubmit('submit'.$this->name)) { $xmlapi = strval(Tools::getValue('xml_api')); if (!$xmlapi || empty($xmlapi) || !Validate::isGenericName($xmlapi)) $output .= $this->displayError($this->l('Invalid Configuration value')); else { Configuration::updateValue('xml_api', $xmlapi); $output .= $this->displayConfirmation($this->l('Settings updated')); } } return $output.$this->displayForm(); } public function displayForm() { // Get default language $default_lang = (int)Configuration::get('PS_LANG_DEFAULT'); // Init Fields form array $fields_form[0]['form'] = array( 'legend' => array( 'title' => $this->l('Add XML Server'), ), 'input' => array( 'xml_service_customer_code' => array( 'type' => 'text', 'label' => $this->l('Customer Code'), 'name' => 'xml_service_customer_code', 'size' => 20, 'required' => false ), 'xml_service_user_id' => array( 'type' => 'text', 'label' => $this->l('User ID'), 'name' => 'xml_service_user_id', 'size' => 20, 'required' => true ), 'xml_service_login_key' => array( 'type' => 'text', 'label' => $this->l('Login Key'), 'name' => 'xml_service_login_key', 'size' => 20, 'required' => true ) ), 'submit' => array( 'title' => $this->l('Save XML Server'), 'class' => 'button' ) ); $helper = new HelperForm(); // Module, token and currentIndex $helper->module = $this; $helper->name_controller = $this->name; $helper->token = Tools::getAdminTokenLite('AdminModules'); $helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name; // Language $helper->default_form_language = $default_lang; $helper->allow_employee_form_lang = $default_lang; // Title and toolbar $helper->title = $this->displayName; $helper->show_toolbar = true; // false -> remove toolbar $helper->toolbar_scroll = true; // yes - > Toolbar is always visible on the top of the screen. $helper->submit_action = 'submit'.$this->name; $helper->toolbar_btn = array( 'save' => array( 'desc' => $this->l('Save'), 'href' => AdminController::$currentIndex.'&configure='.$this->name.'&save'.$this->name. '&token='.Tools::getAdminTokenLite('AdminModules'), ), 'back' => array( 'href' => AdminController::$currentIndex.'&token='.Tools::getAdminTokenLite('AdminModules'), 'desc' => $this->l('Back to list') ) ); // Load current value $helper->fields_value['xml_api'] = Configuration::get('xml_api'); return $helper->generateForm($fields_form); } } Edited April 6, 2015 by CloudCyberSystems (see edit history) Link to comment Share on other sites More sharing options...
rytiz2873 Posted April 7, 2015 Share Posted April 7, 2015 first of all you didn't have xml_api field, you must create it in your form as hidden. You didn't load all data to your form. Link to comment Share on other sites More sharing options...
CloudCyberSystems Posted April 7, 2015 Author Share Posted April 7, 2015 I'm new to prestashop modules how do I do this? Link to comment Share on other sites More sharing options...
rytiz2873 Posted April 7, 2015 Share Posted April 7, 2015 sample from module protected function renderForm() { $default_lang = (int)Configuration::get('PS_LANG_DEFAULT'); $fields_form = array( 'tinymce' => true, 'legend' => array( 'title' => $this->l('New custom CMS block'), ), 'input' => array( 'id_info' => array( 'type' => 'hidden', 'name' => 'id_info' ), 'content' => array( 'type' => 'textarea', 'label' => $this->l('Text'), 'lang' => true, 'name' => 'text', 'cols' => 40, 'rows' => 10, 'class' => 'rte', 'autoload_rte' => true, ), ), 'submit' => array( 'title' => $this->l('Save'), ), 'buttons' => array( array( 'href' => AdminController::$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules'), 'title' => $this->l('Back to list'), 'icon' => 'process-icon-back' ) ) ); if (Shop::isFeatureActive() && Tools::getValue('id_info') == false) { $fields_form['input'][] = array( 'type' => 'shop', 'label' => $this->l('Shop association'), 'name' => 'checkBoxShopAsso_theme' ); } $helper = new HelperForm(); $helper->module = $this; $helper->name_controller = 'blockcmsinfo'; $helper->identifier = $this->identifier; $helper->token = Tools::getAdminTokenLite('AdminModules'); foreach (Language::getLanguages(false) as $lang) $helper->languages[] = array( 'id_lang' => $lang['id_lang'], 'iso_code' => $lang['iso_code'], 'name' => $lang['name'], 'is_default' => ($default_lang == $lang['id_lang'] ? 1 : 0) ); $helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name; $helper->default_form_language = $default_lang; $helper->allow_employee_form_lang = $default_lang; $helper->toolbar_scroll = true; $helper->title = $this->displayName; $helper->submit_action = 'saveblockcmsinfo'; $helper->fields_value = $this->getFormValues(); return $helper->generateForm(array(array('form' => $fields_form))); Link to comment Share on other sites More sharing options...
rytiz2873 Posted April 7, 2015 Share Posted April 7, 2015 (edited) loading values to form public function getFormValues() { $fields_value = array(); $id_info = (int)Tools::getValue('id_info'); foreach (Language::getLanguages(false) as $lang) if ($id_info) { $info = new InfoBlock((int)$id_info); $fields_value['text'][(int)$lang['id_lang']] = $info->text[(int)$lang['id_lang']]; } else $fields_value['text'][(int)$lang['id_lang']] = Tools::getValue('text_'.(int)$lang['id_lang'], ''); $fields_value['id_info'] = $id_info; return $fields_value; } Edited April 7, 2015 by rytiz2873 (see edit history) Link to comment Share on other sites More sharing options...
CloudCyberSystems Posted April 7, 2015 Author Share Posted April 7, 2015 (edited) Thanks for the help rytiz2873, I have modified the code as follows; protected function renderForm() { $default_lang = (int)Configuration::get('PS_LANG_DEFAULT'); $fields_form = array( 'tinymce' => true, 'legend' => array( 'title' => $this->l('Add XML Service'), ), 'input' => array( 'xml_service_id' => array( 'type' => 'hidden', 'name' => 'xml_service_id' ), 'content' => array( 'type' => 'text', 'label' => $this->l('Service Name'), 'lang' => true, 'name' => 'xml_service_name', 'size' => '15', 'class' => 'rte', 'required' => true ), 'content' => array( 'type' => 'text', 'label' => $this->l('Customer Code'), 'lang' => true, 'name' => 'xml_service_customer_code', 'size' => '15', 'class' => 'rte', 'required' => true ), ), 'submit' => array( 'title' => $this->l('Add Service'), ), 'buttons' => array( array( 'href' => AdminController::$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules'), 'title' => $this->l('Back to list'), 'icon' => 'process-icon-back' ) ) ); if (Shop::isFeatureActive() && Tools::getValue('xml_service_id') && Tools::getValue('xml_service_name') == false) { $fields_form['input'][] = array( 'type' => 'shop', 'label' => $this->l('Shop association'), 'name' => 'checkBoxShopAsso_theme' ); } $helper = new HelperForm(); $helper->module = $this; $helper->name_controller = $this->name; $helper->identifier = $this->identifier; $helper->token = Tools::getAdminTokenLite('AdminModules'); foreach (Language::getLanguages(false) as $lang) $helper->languages[] = array( 'id_lang' => $lang['id_lang'], 'iso_code' => $lang['iso_code'], 'name' => $lang['name'], 'is_default' => ($default_lang == $lang['id_lang'] ? 1 : 0) ); $helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name; $helper->default_form_language = $default_lang; $helper->allow_employee_form_lang = $default_lang; $helper->toolbar_scroll = true; $helper->title = $this->displayName; $helper->submit_action = 'submit'.$this->name; $helper->fields_value = $this->getFormValues(); return $helper->generateForm(array(array('form' => $fields_form))); } public function getFormValues() { $fields_value = array(); $xml_service_id = (int)Tools::getValue('xml_service_id'); foreach (Language::getLanguages(false) as $lang) if ($xml_service_id) { $info = new InfoBlock((int)$xml_service_id); $fields_value['text'][(int)$lang['id_lang']] = $info->text[(int)$lang['id_lang']]; } else $fields_value['text'][(int)$lang['id_lang']] = Tools::getValue('text_'.(int)$lang['id_lang'], ''); $fields_value['xml_service_id'] = $xml_service_id; return $fields_value; } } But the form is only showing the "Customer Code" text area... not Service Name & Customer Code Edited April 7, 2015 by CloudCyberSystems (see edit history) Link to comment Share on other sites More sharing options...
rytiz2873 Posted April 7, 2015 Share Posted April 7, 2015 this is sample how to add hidden field (in your case is "xml_api", if this is your id) and how to load fields values Link to comment Share on other sites More sharing options...
CloudCyberSystems Posted April 7, 2015 Author Share Posted April 7, 2015 this is sample how to add hidden field (in your case is "xml_api", if this is your id) and how to load fields values The hidden field has been added what i mean is there should be to visible fields now 'input' => array( 'xml_service_id' => array( 'type' => 'hidden', 'name' => 'xml_service_id' ), 'content' => array( 'type' => 'text', 'label' => $this->l('Service Name'), 'lang' => true, 'name' => 'xml_service_name', 'size' => '15', 'class' => 'rte', 'required' => true ), 'content' => array( 'type' => 'text', 'label' => $this->l('Customer Code'), 'lang' => true, 'name' => 'xml_service_customer_code', 'size' => '15', 'class' => 'rte', 'required' => true ), ), Service Name & Customer Code Link to comment Share on other sites More sharing options...
rytiz2873 Posted April 7, 2015 Share Posted April 7, 2015 you used two times "content", use same values as field name Link to comment Share on other sites More sharing options...
CloudCyberSystems Posted April 7, 2015 Author Share Posted April 7, 2015 you used two times "content", use same values as field name Great! all fields are showing now. but when i fill out the form and press save I get Invalid Configuration value public function getContent() { $output = null; if (Tools::isSubmit('submit'.$this->name)) { $xmlapi = strval(Tools::getValue('xml_service_id')); if (!$xmlapi || empty($xmlapi) || !Validate::isGenericName($xmlapi)) $output .= $this->displayError($this->l('Invalid Configuration value')); else { Configuration::updateValue('xml_service_id', $xmlapi); $output .= $this->displayConfirmation($this->l('Settings updated')); } } return $output.$this->renderForm(); } protected function renderForm() { $default_lang = (int)Configuration::get('PS_LANG_DEFAULT'); $fields_form = array( 'tinymce' => true, 'legend' => array( 'title' => $this->l('Add XML Service'), ), 'input' => array( 'xml_service_id' => array( 'type' => 'hidden', 'name' => 'xml_service_id' ), 'xml_service_name' => array( 'type' => 'text', 'label' => $this->l('Service Name'), 'lang' => true, 'name' => 'xml_service_name', 'size' => '15', 'class' => 'rte', 'required' => true ), 'xml_service_customer_code' => array( 'type' => 'text', 'label' => $this->l('Customer Code'), 'lang' => true, 'name' => 'xml_service_customer_code', 'size' => '15', 'class' => 'rte', 'required' => true ), 'xml_service_customer_user_id' => array( 'type' => 'text', 'label' => $this->l('User ID'), 'lang' => true, 'name' => 'xml_service_customer_user_id', 'size' => '15', 'class' => 'rte', 'required' => true ), 'xml_service_customer_login_key' => array( 'type' => 'text', 'label' => $this->l('Login Key'), 'lang' => true, 'name' => 'xml_service_customer_login_key', 'size' => '15', 'class' => 'rte', 'required' => true ), ), 'submit' => array( 'title' => $this->l('Add Service'), ), 'buttons' => array( array( 'href' => AdminController::$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules'), 'title' => $this->l('Back to list'), 'icon' => 'process-icon-back' ) ) ); if (Shop::isFeatureActive() && Tools::getValue('xml_service_id') && Tools::getValue('xml_service_name') && Tools::getValue('xml_service_user_id`') && Tools::getValue('xml_service_login_key`') == false) { $fields_form['input'][] = array( 'type' => 'shop', 'label' => $this->l('Shop association'), 'name' => 'checkBoxShopAsso_theme' ); } $helper = new HelperForm(); $helper->module = $this; $helper->name_controller = $this->name; $helper->identifier = $this->identifier; $helper->token = Tools::getAdminTokenLite('AdminModules'); foreach (Language::getLanguages(false) as $lang) $helper->languages[] = array( 'id_lang' => $lang['id_lang'], 'iso_code' => $lang['iso_code'], 'name' => $lang['name'], 'is_default' => ($default_lang == $lang['id_lang'] ? 1 : 0) ); $helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name; $helper->default_form_language = $default_lang; $helper->allow_employee_form_lang = $default_lang; $helper->toolbar_scroll = true; $helper->title = $this->displayName; $helper->submit_action = 'submit'.$this->name; $helper->fields_value = $this->getFormValues(); return $helper->generateForm(array(array('form' => $fields_form))); Link to comment Share on other sites More sharing options...
rytiz2873 Posted April 7, 2015 Share Posted April 7, 2015 becouse form is used just to create display. You need to save all data by your self. if (!$xmlapi|| empty($xmlapi)|| !Validate::isGenericName($xmlapi))$output .= $this->displayError($this->l('Invalid Configuration value'));else{Configuration::updateValue('xml_service_id', $xmlapi);$output .= $this->displayConfirmation($this->l('Settings updated'));} you're just updating just id, nothing more Link to comment Share on other sites More sharing options...
CloudCyberSystems Posted April 7, 2015 Author Share Posted April 7, 2015 (edited) becouse form is used just to create display. You need to save all data by your self. if (!$xmlapi || empty($xmlapi) || !Validate::isGenericName($xmlapi)) $output .= $this->displayError($this->l('Invalid Configuration value')); else { Configuration::updateValue('xml_service_id', $xmlapi); $output .= $this->displayConfirmation($this->l('Settings updated')); } you're just updating just id, nothing more Ok, so I need to replace that code with code to update the database? This gives me Error updating database. Is there something I'm missing? public function getContent() { $output = null; $xml_service_name=Tools::getValue('xml_service_name'); $xml_service_customer_code=Tools::getValue('xml_service_customer_code'); $xml_service_user_id=Tools::getValue('xml_service_user_id'); $xml_service_login_key=Tools::getValue('xml_service_login_key'); if (Tools::isSubmit('submit'.$this->name)) { if(Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'xmlapi` (`xml_service_name`, `xml_service_customer_code`, `xml_service_user_id`,`xml_service_login_key`) VALUES ("","'.$xml_service_name.'","'.$xml_service_customer_code.'","'.$xml_service_user_id.'","'.$xml_service_login_key.'")')) { $output .= $this->displayConfirmation($this->l('Service Added.')); } else { $output .= $this->displayError($this->l('Error updating database.')); } } return $output.$this->renderForm(); } Edited April 7, 2015 by CloudCyberSystems (see edit history) Link to comment Share on other sites More sharing options...
rytiz2873 Posted April 8, 2015 Share Posted April 8, 2015 first of all you trying to add 5 values to 4 columns... Link to comment Share on other sites More sharing options...
CloudCyberSystems Posted April 8, 2015 Author Share Posted April 8, 2015 first of all you trying to add 5 values to 4 columns... theres 4 of each here... if(Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'xmlapi` (`xml_service_name`, `xml_service_customer_code`, `xml_service_user_id`,`xml_service_login_key`) VALUES ("","'.$xml_service_name.'","'.$xml_service_customer_code.'","'.$xml_service_user_id.'","'.$xml_service_login_key.'")')) Link to comment Share on other sites More sharing options...
rytiz2873 Posted April 8, 2015 Share Posted April 8, 2015 if(Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'xmlapi` ( 1 --- `xml_service_name`, 2 --- `xml_service_customer_code`, 3 --- `xml_service_user_id`, 4 --- `xml_service_login_key`) VALUES ( 1 --- "", 2 --- "'.$xml_service_name.'", 3 --- "'.$xml_service_customer_code.'", 4 --- "'.$xml_service_user_id.'", 5 ---"'.$xml_service_login_key.'")')) i see 4 columns and 5 values.... Link to comment Share on other sites More sharing options...
CloudCyberSystems Posted April 8, 2015 Author Share Posted April 8, 2015 if(Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'xmlapi` ( 1 --- `xml_service_name`, 2 --- `xml_service_customer_code`, 3 --- `xml_service_user_id`, 4 --- `xml_service_login_key`) VALUES ( 1 --- "", 2 --- "'.$xml_service_name.'", 3 --- "'.$xml_service_customer_code.'", 4 --- "'.$xml_service_user_id.'", 5 ---"'.$xml_service_login_key.'")')) i see 4 columns and 5 values.... Dear lord..... thanks for spotting that Ok its updating now but! if i fill one of the 4 required fields in it does not say required fields are missing. also its putting empty values into the database. public function getContent() { $output = null; if (Tools::isSubmit('submit'.$this->name)) { $xml_service_name=Tools::getValue('xml_service_name'); $xml_service_customer_code=Tools::getValue('xml_service_customer_code'); $xml_service_user_id=Tools::getValue('xml_service_user_id'); $xml_service_login_key=Tools::getValue('xml_service_login_key'); if(Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'xmlapi` (`xml_service_name`, `xml_service_customer_code`, `xml_service_user_id`,`xml_service_login_key`) VALUES ("'.$xml_service_name.'","'.$xml_service_customer_code.'","'.$xml_service_user_id.'","'.$xml_service_login_key.'")')) { $output .= $this->displayConfirmation($this->l('Service Added.')); } else { $output .= $this->displayError($this->l('Error updating database.')); $output .= $this->displayError($this->l("Customer Code: ".$xml_service_customer_code)); } } return $output.$this->renderForm(); } protected function renderForm() { $default_lang = (int)Configuration::get('PS_LANG_DEFAULT'); $fields_form = array( 'tinymce' => true, 'legend' => array( 'title' => $this->l('Add XML Service'), ), 'input' => array( 'xml_service_id' => array( 'type' => 'hidden', 'name' => 'xml_service_id' ), 'xml_service_name' => array( 'type' => 'text', 'label' => $this->l('Service Name'), 'lang' => true, 'name' => 'xml_service_name', 'size' => '15', 'class' => 'rte', 'required' => true ), 'xml_service_customer_code' => array( 'type' => 'text', 'label' => $this->l('Customer Code'), 'lang' => true, 'name' => 'xml_service_customer_code', 'size' => '15', 'class' => 'rte', 'required' => true ), 'xml_service_customer_user_id' => array( 'type' => 'text', 'label' => $this->l('User ID'), 'lang' => true, 'name' => 'xml_service_customer_user_id', 'size' => '15', 'class' => 'rte', 'required' => true ), 'xml_service_customer_login_key' => array( 'type' => 'text', 'label' => $this->l('Login Key'), 'lang' => true, 'name' => 'xml_service_customer_login_key', 'size' => '15', 'class' => 'rte', 'required' => true ), ), 'submit' => array( 'title' => $this->l('Add Service'), ), 'buttons' => array( array( 'href' => AdminController::$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules'), 'title' => $this->l('Back to list'), 'icon' => 'process-icon-back' ) ) ); if (Shop::isFeatureActive() && Tools::getValue('xml_service_id') && Tools::getValue('xml_service_name') && Tools::getValue('xml_service_user_id') && Tools::getValue('xml_service_login_key') == false) { $fields_form['input'][] = array( 'type' => 'shop', 'label' => $this->l('Shop association'), 'name' => 'checkBoxShopAsso_theme' ); } $helper = new HelperForm(); $helper->module = $this; $helper->name_controller = $this->name; $helper->identifier = $this->identifier; $helper->token = Tools::getAdminTokenLite('AdminModules'); foreach (Language::getLanguages(false) as $lang) $helper->languages[] = array( 'id_lang' => $lang['id_lang'], 'iso_code' => $lang['iso_code'], 'name' => $lang['name'], 'is_default' => ($default_lang == $lang['id_lang'] ? 1 : 0) ); $helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name; $helper->default_form_language = $default_lang; $helper->allow_employee_form_lang = $default_lang; $helper->toolbar_scroll = true; $helper->title = $this->displayName; $helper->submit_action = 'submit'.$this->name; $helper->fields_value = $this->getFormValues(); return $helper->generateForm(array(array('form' => $fields_form))); } public function getFormValues() { $fields_value = array(); $xml_service_name = (int)Tools::getValue('xml_service_name'); $xml_service_customer_code = (int)Tools::getValue('xml_service_customer_code'); $xml_service_user_id = (int)Tools::getValue('xml_service_user_id'); $xml_service_login_key = (int)Tools::getValue('xml_service_login_key'); foreach (Language::getLanguages(false) as $lang) if ($xml_service_id) { $info = new InfoBlock((int)$xml_service_id); $fields_value['text'][(int)$lang['id_lang']] = $info->text[(int)$lang['id_lang']]; } else $fields_value['text'][(int)$lang['id_lang']] = Tools::getValue('text_'.(int)$lang['id_lang'], ''); $fields_value['xml_service_name'] = $xml_service_name; $fields_value['xml_service_customer_code'] = $xml_service_customer_code; $fields_value['xml_service_user_id'] = $xml_service_user_id; $fields_value['xml_service_login_key'] = $xml_service_login_key; return $fields_value; } Link to comment Share on other sites More sharing options...
rytiz2873 Posted April 8, 2015 Share Posted April 8, 2015 because you didn't check any value for validating, check blockcms module, postProcess and postValidation functions. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now