/** * @return string|void */ protected function renderContent() { $lastNews = TranslatedNews::model()->getLast($this->nbNewsToDisplay); /** @var $n News */ foreach ($lastNews as $n) { $this->renderItem($n); } }
/** * @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"; }
/** * 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); }
/** * Updates a particular model. * If update is successful, the browser will be redirected to the 'view' page. * @param integer $id the ID of the model to be updated * @throws Exception */ public function actionUpdate($id) { /** @var myWebUser $webUser */ /** @noinspection PhpUndefinedFieldInspection */ $webUser = Yii::app()->user; /** @var News $model */ $model = News::model()->findByPk($id); $hasErrors = false; // Sauvegarde de l'objet News if (isset($_POST['News'])) { $model->attributes = $_POST['News']; if ($model->save()) { $webUser->setFlash('success', Yii::t('msg', 'Object saved')); } else { $webUser->setFlash('error', Yii::t('msg', 'There are errors. Please check the form')); $hasErrors = true; } } // Sauvegarde d'une des traductions if (isset($_POST['TranslatedNews'])) { $fields = array_shift($_POST['TranslatedNews']); /** @var $translation TranslatedNews */ if (!($translation = TranslatedNews::model()->findByPk($fields['id']))) { throw new Exception(h::_("Traduction introuvable #" . $fields['id'], __FILE__, __LINE__, __METHOD__)); } $oldTagsString = $translation->tagsString; $translation->attributes = $fields; if ($translation->save() && $this->saveTranslatedNewsTags($translation, $oldTagsString)) { $webUser->setFlash('success', Yii::t('msg', 'Object saved')); } else { $webUser->setFlash('error', Yii::t('msg', "There are errors in some sub-forms")); $hasErrors = true; } $translations = array(); foreach ($model->translatedNews as $i => $it) { // Dans la liste des traduction de la news, on cherche celle qui est l'objet de la mise à jour // et on remplace le modèle chargé initialement par celui qui vient d'être validé, // (donc qui a une liste d'erreurs en cas de problèmes) if ($it->id == $translation->id) { $translations[$i] = $translation; } else { $translations[$i] = $it; } } } if (isset($_POST['backToList']) && !$hasErrors) { // On a cliqué le bouton 'revenir à la liste' et le formulaire a bien été traité $this->redirect(array('admin')); } /** @noinspection PhpUndefinedMethodInspection */ $this->render('update', array('model' => $model, 'translations' => isset($translations) ? $translations : $model->translatedNews, 'categories' => NewsCategory::model()->alpha()->findAll(), 'languages' => $this->languages)); }
/** * @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); }