Exemplo n.º 1
0
 /**
  * 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);
     }
 }
Exemplo n.º 2
0
 /**
  * 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;
 }
Exemplo n.º 3
0
 /**
  * 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;
 }
Exemplo n.º 4
0
 /**
  * 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));
 }
Exemplo n.º 5
0
 /**
  * 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;
 }
Exemplo n.º 6
0
 /**
  * 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);
 }
Exemplo n.º 7
0
 /**
  * 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;
 }
Exemplo n.º 8
0
 /**
  * @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;
 }
Exemplo n.º 9
0
 /**
  *
  */
 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);
             }
         }
     });
 }
Exemplo n.º 10
0
 /**
  * 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);
     }
 }
Exemplo n.º 11
0
 /**
  * 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')));
 }
Exemplo n.º 12
0
 /**
  * @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;
 }