/** * Formulaire de connexion */ public function actionLogin() { /** @var myWebUser $webUser */ if (Yii::app()->user->isGuest) { $model = new UserLogin(); if (isset($_POST['UserLogin'])) { // Connexion demandée $model->attributes = $_POST['UserLogin']; if ($model->validate()) { if (!$this->registerLastLogin()) { Yii::log(h::_('Erreur sur registerLastLogin()', __FILE__, __LINE__, __METHOD__), CLogger::LEVEL_ERROR); } Yii::app()->user->setFlash('success', Yii::t('UserModule.msg', 'You are now logged to your user account')); if (Yii::app()->user->returnUrl == '/index.php') { Yii::log(h::_(Yii::app()->user->getId(), __FILE__, __LINE__, __METHOD__), 'debug'); $this->redirect(Yii::app()->controller->module->returnUrl); } else { Yii::log(h::_(Yii::app()->user->getId(), __FILE__, __LINE__, __METHOD__), 'debug'); Yii::log(h::_(Yii::app()->user->returnUrl, __FILE__, __LINE__, __METHOD__), 'debug'); $this->redirect(Yii::app()->user->returnUrl); } } } // Affichage du formulaire de connexion (affichage initial ou erreur de validation) $this->render('/user/login', array('model' => $model)); } else { // Utilisateur déjà connecté, RAF $this->redirect(Yii::app()->controller->module->returnUrl); } }
/** * Tronque un texte formatté en HTML à partir du marqueur {{LIRE_LA_SUITE}}. * Toutes les balises ouvertes sont refermées pour que le texte renvoyé soit toujours du HTML correct. * Le marqueur {{LIRE_LA_SUITE}} est remplacé par le bouton $buttonMore * @param string $fullText * @param string $buttonMore * @return string */ public static function getShortHTMLText($fullText, $buttonMore = null) { $tag = '{{LIRE_LA_SUITE}}'; if (strpos($fullText, $tag) === false) { // Si le marqueur n'est pas là, inutile de faire tous ces traitements... return $fullText; } if (is_null($buttonMore)) { $buttonMore = self::getButtonMore(); } $helper = new DOMHelper(); try { if (!($out = $helper->trimFromHTMLString($fullText, $tag, $buttonMore))) { Yii::log(h::_("Erreur sur l'appel à trimFromHTMLString()", __FILE__, __LINE__, __METHOD__), CLogger::LEVEL_ERROR); return $fullText; } } catch (Exception $x) { Yii::log(h::_($x, __FILE__, __LINE__, __METHOD__), CLogger::LEVEL_ERROR); return "<error>" . $x->getMessage() . "</error>"; } return $out; }
/** * Dans le code $fullHtml, remplace la chaîne $needle par l'élément $replace. Cette fonctionnalité sert par exemple à insérer un * bouton 'lire la suite' à la place du marqueur {{LIRE_LA_SUITE}} dans un bloc de texte qu'on ne veut pas afficher entièrement. * @param string $fullHtml Le code HTML à traiter * @param string $needle Le marqueur * @param string $replace Le code de remplacement * @return string|bool Le code HTML modifié, false en cas d'erreur * @throws \Exception */ public function trimFromHTMLString($fullHtml, $needle, $replace = "") { $text = trim(html_entity_decode($fullHtml)); if (!Inflector::seemsUtf8($text)) { // @internal Conserver ce bloc car le serveur de production pose des problèmes d'encodage... require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'ForceUTF8' . DIRECTORY_SEPARATOR . 'Encoding.php'; $text = ForceUTF8\Encoding::toUTF8($text); } // On charge le texte dans un DOMDocument pour le manipuler proprement $this->dom = new DOMDocument(); $htmlHead = '<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><title>***</title></head><body>'; $htmlFoot = '</body></html>'; if (!$this->dom->loadHTML($htmlHead . $text . $htmlFoot)) { Yii::log(h::_("Erreur sur loadXML()\n{$text}", __FILE__, __LINE__, __METHOD__), CLogger::LEVEL_ERROR); return false; } // On récupère le noeud texte contenant $needle. // Si aucun noeud n'a été trouvé, on renvoie le texte complet tel qu'on l'a reçu. $zeunode = $this->findStringNode($needle, $this->dom); if (!$zeunode) { Yii::log(h::_("!!!! Pas de noeud contenant -> {$needle} <-", __FILE__, __LINE__, __METHOD__), 'debug'); Yii::log(h::_(h::xmlTreeDump($this->dom), __FILE__, __LINE__, __METHOD__), 'debug'); return $fullHtml; } // On supprime tout le texte après $needle et tous les noeuds suivant $zeunode $zeunode->data = preg_replace("/({$needle}).*/ms", "\$1", $zeunode->data); $this->removeNextNodes($zeunode); $out = $this->dom->saveHTML(); // On retire le code HTML ajouté de part et d'autre de $text // On remplace le marqueur $needle par le code HTML $replace if (($pos = strpos($out, $htmlHead)) === false) { Yii::log(h::_("Erreur sur : strpos({$htmlHead}, {$out})", __FILE__, __LINE__, __METHOD__), CLogger::LEVEL_ERROR); } else { $out = substr($out, $pos + strlen($htmlHead)); } $out = str_replace($htmlFoot, '', $out); $out = trim(preg_replace("/{$needle}/", $replace, $out)); return $out; }
/** * Updates a particular model. * If update is successful, the browser will be redirected to the 'view' page. */ public function actionUpdate() { $model = $this->loadModel(); $this->performAjaxValidation($model); if (isset($_POST['User'])) { /** @var myWebUser $webUser */ $webUser = Yii::app()->user; $model->attributes = $_POST['User']; if ($model->validate()) { /** @noinspection PhpUndefinedMethodInspection */ $old_password = User::model()->findByPk($model->id); if ($old_password->password != $model->password) { /** @var UserModule $module */ $module = Yii::app()->controller->module; $model->password = $module->encrypting($model->password); $model->activkey = $module->encrypting(microtime() . $model->password); } if (!$model->save()) { $msg = array("Erreur sur \$model->save()", $model); Yii::log(h::_($msg, __FILE__, __LINE__, __METHOD__), CLogger::LEVEL_ERROR); $webUser->setFlash('error', Yii::t('UserModule.user', 'There are errors. Please check the form')); } else { // Sauvegarde OK $webUser->setFlash('success', Yii::t('UserModule.user', 'User saved')); if (isset($_POST['backToList'])) { // On a cliqué le bouton 'revenir à la liste' et le formulaire a bien été traité $this->redirect(array('admin')); } } } } $this->render('update', array('model' => $model)); }
/** * Ajoute une traduction à la news * @param News $news * @return boolean */ private function addTranslationTo(News $news) { $translation = new TranslatedNews(); $availableLanguages = $news->getUnusedLanguages(); /** @var myWebUser $webUser */ /** @noinspection PhpUndefinedFieldInspection */ $webUser = Yii::app()->user; if (!$availableLanguages) { $webUser->setFlash('warning', Yii::t('NewsModule.msg', 'There is no language left for this news')); return false; } $tmpLanguage = $availableLanguages[0]; $translation->title = $tmpLanguage->code; $translation->content = '...'; $translation->news_id = $news->id; $translation->language_id = $tmpLanguage->id; if (!$translation->save()) { $webUser->setFlash('error', Yii::t('msg', 'There are errors. Please check the form')); Yii::log(h::_($translation->errors, __FILE__, __LINE__, __METHOD__), CLogger::LEVEL_ERROR); return false; } $webUser->setFlash('success', Yii::t('NewsModule.msg', 'A new translation has been added to your news')); return true; }
/** * Modification du profil utilisateur */ public function actionEdit() { /** @var myWebUser $webUser */ $webUser = Yii::app()->user; $currentUser = $webUser->getUser(); $profile = $currentUser->profile; if (isset($_POST['ajax']) && $_POST['ajax'] === 'profile-form') { echo UActiveForm::validate(array($currentUser, $profile)); Yii::app()->end(); } // @internal $current->username a déjà la nouvelle valeur (voir pourquoi...) // On utilise donc $webUser->username pour vérifier les changements $oldUsername = $webUser->username; if (isset($_POST['User'])) { $currentUser->attributes = $_POST['User']; $profile->attributes = $_POST[get_class($profile)]; if ($currentUser->validate() && $profile->validate()) { $transaction = Yii::app()->db->beginTransaction(); if (!$currentUser->save()) { $transaction->rollback(); $msg = array("Erreur sur \$currentUser->save()", $currentUser); Yii::log(h::_($msg, __FILE__, __LINE__, __METHOD__), CLogger::LEVEL_ERROR); $webUser->setFlash('error', UserModule::t("Unable to validate user data")); } elseif (!$profile->save()) { $transaction->rollback(); $msg = array("Erreur sur \$profile->save()", $profile); Yii::log(h::_($msg, __FILE__, __LINE__, __METHOD__), CLogger::LEVEL_ERROR); $webUser->setFlash('error', UserModule::t("Unable to validate profile data")); } else { // Tout va bien, on enregistre les modifications dans la base de données $transaction->commit(); // Si l'utilisateur a modifié son username, on le déconnecte pour forcer une ré-authentification if ($currentUser->username != $oldUsername) { $this->redirect('/user/logout'); } $webUser->setFlash('success', UserModule::t("Profile updated")); $this->redirect(array('/user/profile')); } } } $this->renderProfilePanel('edit', $currentUser, $profile); }
/** * Associe les tags du tableau $tags avec l'actualité $this * @param string|array $tags Suite de tags séparés par des virgules. * @return bool */ public function insertTags($tags) { if (is_string($tags)) { $tags = explode(',', $tags); } if (!is_array($tags)) { Yii::log(h::_(CVarDumper::dumpAsString($tags), __FILE__, __LINE__, __METHOD__), CLogger::LEVEL_ERROR); return false; } foreach (array_map('trim', array_unique($tags)) as $tagName) { /** @var $tag Tag */ if (!($tag = Tag::model()->findByAttributes(array('name' => $tagName, 'language_id' => $this->language_id)))) { // Si le tag n'existe pas, on le crée $tag = new Tag(); $tag->name = $tagName; $tag->language_id = $this->language_id; if (!$tag->save()) { Yii::log(h::_($tag->getErrors(), __FILE__, __LINE__, __METHOD__), CLogger::LEVEL_ERROR); return false; } } else { // S'il existe déjà, on vérifie qu'il n'est pas déjà associé à $this... if (TranslatedNewsHasTag::model()->countByAttributes(array('translated_news_id' => $this->id, 'tag_id' => $tag->id))) { // ... et s'il l'est, RAF, on passe à la suite continue; } } $record = new TranslatedNewsHasTag(); $record->translated_news_id = $this->id; $record->tag_id = $tag->id; if (!$record->save()) { Yii::log(h::_($record->getErrors(), __FILE__, __LINE__, __METHOD__), CLogger::LEVEL_ERROR); return false; } } return true; }
/** * @param string $pageName * @param bool $returnDefault * @return \CActiveRecord|\WebPage */ protected function getPage($pageName, $returnDefault = true) { if (!($out = \WebPage::getByName($pageName))) { \Yii::log(\h::_("Objet WebPage inconnu : #{$pageName}", __FILE__, __LINE__, __METHOD__), \CLogger::LEVEL_ERROR); $this->setFlash('warning', \Yii::t('msg', 'Some elements of this page are missing')); } if (!$out && $returnDefault) { $out = \WebPage::defaultObject(); } return $out; }
/** * */ public function init() { parent::init(); $this->setImport(array('user.models.*', 'user.components.*', 'user.*')); Yii::app()->attachEventHandler('onEndRequest', function ($event) { // on enregistre la trace de la dernière activité de l'utilisateur s'il est authentifié /** @var myWebUser $webUser */ $webUser = Yii::app()->user; if ($user = $webUser->getUser()) { $user->setLastActivityFromTime(time()); if (!$user->save()) { $msg = array('Erreur sur user->save()', $event, $user); Yii::log(h::_($msg, __FILE__, __LINE__, __METHOD__), CLogger::LEVEL_ERROR); } } }); }
/** * Suppression du texte #$id * @param int $id */ public function actionDeleteText($id) { $webText = WebText::model()->findByPk($id); try { if ($webText->delete()) { $this->setFlash('success', Yii::t('WebPagesModule.msg', 'The text "%name%" has been deleted', array('%name%' => $webText->name))); } else { $this->setFlash('error', Yii::t('WebPagesModule.msg', 'An error has occurred while deleting the text "%name%"', array('%name%' => $webText->name))); } } catch (Exception $x) { $this->setFlash('error', Yii::t('WebPagesModule.msg', 'An error has occurred while deleting the text "%name%"', array('%name%' => $webText->name))); Yii::log(h::_($x, __FILE__, __LINE__, __METHOD__), CLogger::LEVEL_ERROR); } if (!Yii::app()->request->isAjaxRequest) { $urlReferrer = Yii::app()->request->urlReferrer; $this->redirect($urlReferrer); } }
/** * Affichage et traitement du formulaire d'inscription */ public function actionRegistration() { $form = new RegistrationForm(); $profile = UserModuleFactory::profile(); $profile->regMode = true; // ajax validator if (isset($_POST['ajax']) && $_POST['ajax'] === 'registration-form') { echo UActiveForm::validate(array($form, $profile)); Yii::app()->end(); } /** @var UserModule $userModule */ $userModule = Yii::app()->controller->module; if (Yii::app()->user->id) { // Utilisateur déjà identifié : on le redirige sur sa page de profil $this->redirect($userModule->profileUrl); } if (isset($_POST['RegistrationForm'])) { // Création d'un nouvel utilisateur $form->attributes = $_POST['RegistrationForm']; if (!$form->validate()) { Yii::app()->user->setFlash('error', UserModule::t("Unable to validate user data")); } else { $profile->attributes = $_POST[get_class($profile)]; if (!$profile->validate()) { Yii::app()->user->setFlash('error', UserModule::t("Unable to validate profile data")); } else { $sourcePassword = $form->password; $form->activkey = UserModule::encrypting(microtime() . $form->password); $form->password = UserModule::encrypting($form->password); $form->verifyPassword = UserModule::encrypting($form->verifyPassword); $form->superuser = 0; $form->status = $userModule->activeAfterRegister ? User::STATUS_ACTIVE : User::STATUS_INACTIVE; $transaction = Yii::app()->db->beginTransaction(); if ($ok = $form->save(false)) { $profile->user_id = $form->id; if ($ok = $profile->save()) { // On envoie le mail de confirmation if (!$this->notifyRegistration($form)) { Yii::app()->user->setFlash('error', UserModule::t("The confirmation mail has not been sent. Please contact the administrator")); } // Connexion automatique du nouvel inscrit, selon la configuration $autoConnect = ($userModule->loginNotActiv || $userModule->activeAfterRegister && $userModule->sendActivationMail == false) && $userModule->autoLogin; if ($autoConnect) { // Connexion automatique $identity = new user\components\UserIdentity($form->username, $sourcePassword); $identity->authenticate(); Yii::app()->user->login($identity, 0); $this->redirect($userModule->returnUrl); } else { if (!$userModule->activeAfterRegister && !$userModule->sendActivationMail) { // Pas d'activation automatique ni de mail : il faut passer par l'admin pour activer le compte Yii::app()->user->setFlash('success', Yii::t("UserModule.msg", "Thank you for your registration. Please contact the administrator to activate your account")); } elseif ($userModule->activeAfterRegister && $userModule->sendActivationMail == false) { // Activation au compte, pas de mail de confirmation : on peut se connecter tout de suite Yii::app()->user->setFlash('success', Yii::t("UserModule.msg", "Thank you for your registration. You can now {{login}}.", array('{{login}}' => CHtml::link(UserModule::t('login'), $userModule->loginUrl)))); } elseif ($userModule->loginNotActiv) { // Yii::app()->user->setFlash('success', Yii::t("UserModule.msg", "Thank you for your registration. Please check your email or login.")); } else { // par défaut : pas d'activation automatique, il faut répondre au mail de confirmation Yii::app()->user->setFlash('success', Yii::t("UserModule.msg", "Thank you for your registration. Please check your email.")); } } } else { // if ($ok = $profile->save()) $msg = array("Erreur sur \$profile->save()", $profile); Yii::log(h::_($msg, __FILE__, __LINE__, __METHOD__), CLogger::LEVEL_ERROR); Yii::app()->user->setFlash('error', Yii::t('msg', 'There are errors. Please check the form')); } } else { // if ($ok = $form->save(false)) $msg = array("Erreur sur \$form->save()", $form); Yii::log(h::_($msg, __FILE__, __LINE__, __METHOD__), CLogger::LEVEL_ERROR); Yii::app()->user->setFlash('error', UserModule::t("Registration failed. Please contact the administrator")); } if ($ok) { // Inscription validée, on redirige en page d'accueil $transaction->commit(); $this->redirect('/'); } else { $transaction->rollback(); $form->password = $sourcePassword; $form->verifyPassword = $sourcePassword; $this->refresh(); } } } } // Inscription en erreur, on ré-affiche le formulaire $this->render('/user/registration', array('model' => $form, 'profile' => $profile, 'page' => $this->getPage('inscription'))); }
/** * @return bool */ public static function saveLog() { $log = new \BadUrlLog(); $log->setEventDate(); $log->initializeFromGlobalVariables(); if (!$log->save()) { // En cas de problème on enregistre l'erreur et on revient au comportement par défaut (throw CHttpException) Yii::log(h::_('Erreur sur BadUrlLog::save()', __FILE__, __LINE__, __METHOD__), \CLogger::LEVEL_ERROR); return false; } return true; }