/**
  * @return bool|void
  * @internal Il y a un 'implicit' commit de MySQL sur le create table
  * @see      http://dev.mysql.com/doc/refman/5.1/en/implicit-commit.html
  */
 public function up()
 {
     // Ajout de la colonne tag.language_id
     $this->addColumn('tag', 'language_id', 'INT(10) UNSIGNED NOT NULL DEFAULT 1 AFTER id');
     $this->addForeignKey('fk_language_id_tag', 'tag', 'language_id', 'language', 'id', 'cascade', 'cascade');
     $this->dropIndex('tag_index_name', 'tag');
     $this->createIndex('tag_index_name', 'tag', 'name, language_id', true);
     // Ajout de la table translated_news introduisant la version multilingue des textes
     $this->createTable('translated_news', array('id' => 'int(10) UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY', 'news_id' => 'int(10) UNSIGNED NOT NULL', 'language_id' => 'int(10) UNSIGNED NOT NULL', 'title' => 'varchar(255) NOT NULL', 'slug' => 'varchar(255) NOT NULL', 'description' => 'varchar(255)', 'keywords' => 'varchar(255)', 'content' => 'text', 'created_at' => 'datetime NOT NULL', 'updated_at' => 'datetime NOT NULL'), 'ENGINE = InnoDB');
     // clés dans translated_news
     $this->addForeignKey('fk_news_id_translated_news', 'translated_news', 'news_id', 'news', 'id', 'cascade', 'cascade');
     $this->addForeignKey('fk_language_id_translated_news', 'translated_news', 'language_id', 'language', 'id', 'restrict', 'cascade');
     $this->createIndex('idx_title_translated_news', 'translated_news', 'title');
     $this->createIndex('idx_slug_translated_news', 'translated_news', 'slug', true);
     // Ajout de la table d'association translated_news_has_tag
     $this->createTable('translated_news_has_tag', array('translated_news_id' => 'INT(10) UNSIGNED NOT NULL', 'tag_id' => 'INT(10) UNSIGNED NOT NULL'), 'ENGINE = InnoDB');
     // clés dans translated_news_has_tag
     $this->addPrimaryKey('PRIMARY', 'translated_news_has_tag', 'translated_news_id, tag_id');
     $this->addForeignKey('fk_translated_news_id_translated_news_has_tag', 'translated_news_has_tag', 'translated_news_id', 'translated_news', 'id', 'cascade', 'cascade');
     $this->addForeignKey('fk_tag_id_translated_news_has_tag', 'translated_news_has_tag', 'tag_id', 'tag', 'id', 'cascade', 'cascade');
     // Copie des textes depuis news vers translated_news
     /** @var $news News */
     foreach (News::model()->findAll() as $news) {
         $translated = new TranslatedNews();
         $translated->news_id = $news->id;
         $translated->language_id = $news->language_id ? $news->language_id : 1;
         $translated->title = $news->title;
         $translated->slug = $news->slug;
         $translated->description = $news->description;
         $translated->content = $news->content;
         $translated->created_at = $news->created_at;
         $translated->updated_at = $news->updated_at;
         if (!$translated->save()) {
             echo "\nErreur sur save() pour la migration de la news {$news->id}\n";
         }
     }
     // Migration de news_tag vers translated_news_has_tags
     /** @var $translation TranslatedNews */
     foreach (TranslatedNews::model()->findAll() as $translation) {
         /** @var $oldAsso NewsTag */
         // On récupère la news associée à chaque traduction : c'est l'id de cette news qui donne les tags dans news_tag
         // les news en anglais n'ont pas de tags, on corrige ça à la main
         foreach (NewsTag::model()->findAllByAttributes(array('news_id' => $translation->news_id)) as $oldAsso) {
             $newAsso = new TranslatedNewsHasTag();
             $newAsso->tag_id = $oldAsso->tag_id;
             $newAsso->translated_news_id = $translation->id;
             if (!$newAsso->save()) {
                 echo "Erreur sur newAsso->save() pour translated_news_id = {$translation->id} / tag_id = {$oldAsso->tag_id}\n";
             }
             // NB : on ne met par tag.language_id à jour car actuellement, plusieurs tags sont utilisés en fr et en en :
             // PHP, JQuery, etc...
         }
     }
     echo "\nPasser le champ language_id a anglais pour les news en anglais\n";
     echo "Faire pointer les news traduites et les news originales vers la meme news de base\n";
     echo "Penser a corriger les tags pour les articles en anglais\n";
     echo "A faire apres : nettoyer la table news et supprimer comments\n";
 }
예제 #2
0
 /**
  * @return string|void
  */
 protected function renderContent()
 {
     $lastNews = TranslatedNews::model()->getLast($this->nbNewsToDisplay);
     /** @var $n News */
     foreach ($lastNews as $n) {
         $this->renderItem($n);
     }
 }
예제 #3
0
 /**
  * Vérification des champs obligatoires, création d'une news et redirection vers le formulaire en update
  * @test
  */
 public function create()
 {
     $this->logUser('admin', 'admin');
     $this->open('news/news/create');
     $this->checkBackendSharedElements();
     // Formulaire vide -> incomplet
     $this->clickAndWait('name=yt0');
     $this->assertElementPresent('css=.errorSummary');
     // champ rempli : activé -> incomplet
     $this->open('news/news/create');
     $this->click('News_enabled');
     $this->clickAndWait('name=yt0');
     $this->assertElementPresent('css=.errorSummary');
     // champ rempli : date -> ok car le champ 'activé' est rempli (0) par défaut puisque c'est une case à cocher
     $this->open('news/news/create');
     $this->type('News_event_date', '2014-09-12');
     $this->clickAndWait('name=yt0');
     $this->assertElementNotPresent('css=.errorSummary');
     // on revient sur la page de mise à jour pour l'actualité nouvellement créée
     $lastId = $this->getLastInsertID('news');
     $this->assertEquals(TEST_BASE_URL . "/news/news/update/{$lastId}", $this->getLocation());
     // une traduction par défaut a été automatiquement créée pour cette nouvelle actualité
     $translation = TranslatedNews::model()->findByAttributes(array('news_id' => $lastId));
     $this->assertNotNull($translation);
     $this->assertEquals(Yii::app()->language, $translation->language->code);
     // et on peut y accéder sur la page de mise à jour
     $count = $this->getCssCount('css=ul.nav-tabs li');
     $this->assertEquals(1, $count);
 }
예제 #4
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;
 }
예제 #5
0
 /**
  * @test
  */
 public function getLast()
 {
     // Il y a 9 news dans la base, dont 1 désactivée.
     $query = "SELECT COUNT(t.id) AS cpt FROM translated_news t\n\t\t\tINNER JOIN news n ON n.id = t.news_id\n\t\t\tWHERE n.enabled = 1 AND t.language_id = 1";
     $count = Yii::app()->db->createCommand($query)->queryScalar();
     $items = TranslatedNews::model()->getLast(33333);
     $this->assertEquals($count, count($items));
     $query = "SELECT COUNT(t.id) AS cpt FROM translated_news t\n\t\t\tINNER JOIN news n ON n.id = t.news_id\n\t\t\tWHERE t.language_id = 1";
     $count = Yii::app()->db->createCommand($query)->queryScalar();
     $items = TranslatedNews::model()->getLast(33333, false);
     $this->assertEquals($count, count($items));
     // Les 3 dernières news actives & traduites sont n7, n5 et n4
     $count = 3;
     $items = TranslatedNews::model()->getLast($count);
     $this->assertEquals($count, count($items));
     $this->assertEquals($this->translations('n7')->id, $items[0]->id);
     $this->assertEquals($this->translations('n5')->id, $items[1]->id);
     $this->assertEquals($this->translations('n4')->id, $items[2]->id);
 }