Ejemplo n.º 1
0
    /**
     * Write into base and check data. Also work for additional fields.
     */
    public function add()
    {
        if (!empty($_SESSION['user']['id'])) {
            redirect('/');
        }
        // Обрезаем переменные до длины, указанной в параметре maxlength тега input
        $fields = array('name', 'password', 'confirm', 'email', 'icq', 'jabber', 'pol', 'city', 'telephone', 'byear', 'bmonth', 'bday', 'url', 'about', 'signature', 'keystring');
        $fields_settings = (array) $this->Register['Config']->read('fields', 'users');
        $fields_settings = array_merge($fields_settings, array('email', 'login', 'password', 'confirm'));
        foreach ($fields as $field) {
            ${$field} = isset($_POST[$field]) ? trim($_POST[$field]) : '';
        }
        if ('1' === $pol) {
            $pol = 'm';
        } else {
            if ('2' === $pol) {
                $pol = 'f';
            } else {
                $pol = '';
            }
        }
        // Обрезаем переменные до длины, указанной в параметре maxlength тега input
        $name = mb_substr($name, 0, 30);
        $password = mb_substr($password, 0, 30);
        $confirm = mb_substr($confirm, 0, 30);
        $email = mb_substr($email, 0, 60);
        $icq = mb_substr($icq, 0, 12);
        $jabber = mb_substr($jabber, 0, 100);
        $city = mb_substr($city, 0, 50);
        $telephone = !empty($telephone) ? number_format(mb_substr($telephone, 0, 20), 0, '', '') : '';
        $byear = intval(mb_substr($byear, 0, 4));
        $bmonth = intval(mb_substr($bmonth, 0, 2));
        $bday = intval(mb_substr($bday, 0, 2));
        $url = mb_substr($url, 0, 60);
        $about = mb_substr($about, 0, 1000);
        $signature = mb_substr($signature, 0, 500);
        $errors = $this->Register['Validate']->check($this->Register['action']);
        // Проверяем, заполнены ли обязательные поля
        // Additional fields checker
        if (is_object($this->AddFields)) {
            try {
                $_addFields = $this->AddFields->checkFields();
            } catch (Exception $e) {
                $errors[] = $this->AddFields->getErrors();
            }
        }
        // Проверяем поле "код"
        if (!empty($keystring)) {
            if (!$this->Register['Protector']->checkCaptcha('reguser', $keystring)) {
                $errors[] = __('Wrong protection code');
            }
        }
        $this->Register['Protector']->cleanCaptcha('reguser');
        $new_name = preg_replace("#[^- _0-9a-zА-Яа-я]#i", "", $name);
        // Формируем SQL-запрос
        $res = $this->Model->getSameNics($new_name);
        if ($res) {
            $errors[] = sprintf(__('Name already exists'), $new_name);
        }
        /* check avatar */
        $tmp_key = rand(0, 9999999);
        if (!empty($_FILES['avatar']['name'])) {
            $path = ROOT . '/sys/tmp/images/' . $tmp_key . '.jpg';
            if (move_uploaded_file($_FILES['avatar']['tmp_name'], $path)) {
                chmod($path, 0644);
                @($sizes = resampleImage($path, $path, 100));
                if (!$sizes) {
                    @unlink($path);
                    $errors[] = __('Some error in avatar');
                }
            }
        }
        $timezone = (int) $_POST['timezone'];
        if ($timezone < -12 or $timezone > 12) {
            $timezone = 0;
        }
        // Если были допущены ошибки при заполнении формы - перенаправляем посетителя на страницу регистрации
        if (!empty($errors)) {
            $_SESSION['FpsForm'] = array_merge(array('name' => null, 'email' => null, 'timezone' => null, 'icq' => null, 'url' => null, 'about' => null, 'signature' => null, 'pol' => $pol, 'telephone' => null, 'city' => null, 'jabber' => null, 'byear' => null, 'bmonth' => null, 'bday' => null), $_POST);
            $_SESSION['FpsForm']['errors'] = $errors;
            redirect('/users/add_form/yes');
        }
        if (!empty($url) and substr($url, 0, 7) != 'http://') {
            $url = 'http://' . $url;
        }
        // Уникальный код для активации учетной записи
        $email_activate = $this->Register['Config']->read('email_activate');
        $code = !empty($email_activate) ? md5(uniqid(rand(), true)) : '';
        // Все поля заполнены правильно - продолжаем регистрацию
        $data = array('name' => $name, 'passw' => md5($password), 'email' => $email, 'timezone' => $timezone, 'url' => $url, 'icq' => $icq, 'jabber' => $jabber, 'city' => $city, 'telephone' => $telephone, 'pol' => $pol, 'byear' => $byear, 'bmonth' => $bmonth, 'bday' => $bday, 'about' => $about, 'signature' => $signature, 'photo' => '', 'puttime' => new Expr('NOW()'), 'last_visit' => new Expr('NOW()'), 'themes' => 0, 'status' => 1, 'activation' => $code);
        $entity = new UsersEntity($data);
        $id = $entity->save();
        // Additional fields saver
        if (is_object($this->AddFields)) {
            $this->AddFields->save($id, $_addFields);
        }
        if (file_exists(ROOT . '/sys/tmp/images/' . $tmp_key . '.jpg')) {
            if (copy(ROOT . '/sys/tmp/images/' . $tmp_key . '.jpg', ROOT . '/sys/avatars/' . $id . '.jpg')) {
                chmod(ROOT . '/sys/avatars/' . $id . '.jpg', 0644);
            }
            unlink(ROOT . '/sys/tmp/images/' . $tmp_key . '.jpg');
        }
        /* clean DB cache */
        $this->DB->cleanSqlCache();
        cleanAllUsersCount();
        // Activate by Email
        if (!empty($email_activate)) {
            $entity->setPassw($password);
            $context = array('activation_link' => 'http://' . $_SERVER['SERVER_NAME'] . '/users/activate/' . $code, 'user' => $entity);
            $subject = 'Регистрация на форуме ' . $_SERVER['SERVER_NAME'];
            $mailer = new AtmMail(ROOT . '/sys/settings/email_templates/');
            $mailer->prepare('registration');
            $mailer->sendMail($email, $subject, $context);
            if ($this->Log) {
                $this->Log->write('adding user', 'user id(' . $id . ')');
            }
            $msg = 'На Ваш e-mail выслано письмо с просьбой подтвердить регистрацию.
				  Чтобы завершить регистрацию и активировать учетную запись, зайдите
				  по адресу, указанному в письме.';
        } else {
            // Activate without Email
            $msg = __('Registration complete');
        }
        $source = $this->render('infomessage.html', array('info_message' => $msg));
        return $this->_view($source);
    }