/** * @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"; }
/** * @test */ public function delete() { // La suppression simple se passe correctement /** @var Tag $tag */ $tag = $this->tags('php'); $this->assertTrue($tag->delete()); // les news qui avaient le tag supprimé ne l'ont plus $this->assertEquals(0, TranslatedNewsHasTag::model()->countByAttributes(array('tag_id' => $tag->id))); }
/** * @test */ public function getTagsNames() { /** @var TranslatedNews $model */ $model = $this->translations('n2'); $count = TranslatedNewsHasTag::model()->countByAttributes(array('translated_news_id' => $model->id)); $this->assertEquals($count, count($model->getTagsNames())); }
/** * 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; }