/** * @desc A file upload verification hook; if it returns false UploadBase::verifyUpload() will return UploadBase::HOOK_ABORTED error; we return it here when somebody tries to upload visualization files manually not on development environment * * @param string $destName * @param string $tempPath * @param $error * * @return bool true because it's a hook */ public static function UploadVerification($destName, $tempPath, &$error) { $promoImage = PromoImage::fromPathname($destName); if ($promoImage->isValid() and $promoImage->getCityId() == F::app()->wg->cityId) { // you cannot upload to this wiki an image with database name the same as this wiki $error = wfMsg('promote-manual-upload-error'); return false; } else { return true; } }
/** * Get details about one or more wikis * * @param Array $wikiIds An array of one or more wiki ID's * @param bool $getBlocked If set to true, will return also blocked (not displayed on global page) wikias * * @return Array A collection of results, the index is the wiki ID and each item has a name, * url, lang, hubId, headline, desc, image and flags index. */ public function getDetails(array $wikiIds = null, $getBlocked = false) { wfProfileIn(__METHOD__); $results = array(); if (!empty($wikiIds)) { $notFound = array(); foreach ($wikiIds as $index => $val) { $val = (int) $val; if (!empty($val)) { $cacheKey = wfSharedMemcKey(__METHOD__, self::CACHE_VERSION, $val); $item = $this->wg->Memc->get($cacheKey); if (is_array($item)) { $results[$val] = $item; } else { $notFound[] = $val; } } } $wikiIds = $notFound; } if (!empty($wikiIds)) { $db = $this->getSharedDB(); $where = array('city_list.city_public' => 1, 'city_list.city_id IN (' . implode(',', $wikiIds) . ')'); if (!$getBlocked) { $where[] = '((city_visualization.city_flags & ' . self::FLAG_BLOCKED . ') != ' . self::FLAG_BLOCKED . ' OR city_visualization.city_flags IS NULL)'; } $rows = $db->select(array('city_visualization', 'city_list'), array('city_list.city_id', 'city_list.city_title', 'city_list.city_url', 'city_visualization.city_lang_code', 'city_visualization.city_vertical', 'city_visualization.city_headline', 'city_visualization.city_description', 'city_visualization.city_main_image', 'city_visualization.city_flags'), $where, __METHOD__, array(), array('city_visualization' => array('LEFT JOIN', 'city_list.city_id = city_visualization.city_id'))); while ($row = $db->fetchObject($rows)) { $item = array('name' => $row->city_title, 'url' => $row->city_url, 'lang' => $row->city_lang_code, 'hubId' => $row->city_vertical, 'headline' => $row->city_headline, 'desc' => $row->city_description, 'image' => PromoImage::fromPathname($row->city_main_image)->ensureCityIdIsSet($row->city_id)->getPathname(), 'flags' => array('official' => ($row->city_flags & self::FLAG_OFFICIAL) == self::FLAG_OFFICIAL, 'promoted' => ($row->city_flags & self::FLAG_PROMOTED) == self::FLAG_PROMOTED)); $cacheKey = wfSharedMemcKey(__METHOD__, self::CACHE_VERSION, $row->city_id); $this->wg->Memc->set($cacheKey, $item, 43200); $results[$row->city_id] = $item; } } wfProfileOut(__METHOD__); return $results; }
<?php // get wiki thumbnail and thumbnail tracking $isOnWikiMatch = isset($result['onWikiMatch']) && $result['onWikiMatch']; $imageFileName = PromoImage::fromPathname($result['image_s'])->ensureCityIdIsSet($result['id'])->getPathname(); $imageOriginalURL = ImagesService::getImageSrcByTitle($corporateWikiId, $imageFileName, WikiaSearchController::CROSS_WIKI_PROMO_THUMBNAIL_WIDTH, WikiaSearchController::CROSS_WIKI_PROMO_THUMBNAIL_HEIGHT); if (!empty($imageOriginalURL)) { $imageURL = ImagesService::overrideThumbnailFormat($imageOriginalURL, ImagesService::EXT_JPG); $thumbTracking = 'class="wiki-thumb-tracking" data-pos="' . $pos . '" data-event="search_click_wiki-thumb"'; } if (empty($imageURL)) { // display placeholder image if no thumbnail $imageURL = $wg->ExtensionsPath . '/wikia/Search/images/wiki_image_placeholder.png'; $thumbTracking = 'class="wiki-thumb-tracking" data-pos="' . $pos . '" data-event="search_click_wiki-no-thumb"'; } $service = new Wikia\Search\MediaWikiService(); $pagesMsg = $service->shortnumForMsg($result['articles_i'] ?: 0, 'wikiasearch2-pages'); $imgMsg = $service->shortnumForMsg($result['images_i'] ?: 0, 'wikiasearch2-images'); $videoMsg = $service->shortnumForMsg($result['videos_i'] ?: 0, 'wikiasearch2-videos'); $title = ($sn = $result->getText('sitename_txt')) ? $sn : $result->getText('headline_txt'); $url = $result->getText('url'); ?> <li class="result"> <?php $suffix = $result['exactWikiMatch'] ? "match" : "wiki"; $trackingData = 'class="result-link" data-pos="' . $pos . '" data-event="search_click_' . $suffix . '"'; ?> <a href="<?php echo $url; ?>
/** * @param $targetWikiId * @param $targetWikiLang * @param $images */ private function addImagesToPromoteDb($targetWikiId, $targetWikiLang, $images) { global $wgExternalSharedDB; $imagesToAdd = []; foreach ($images as $image) { $promoImage = \PromoImage::fromPathname($image['name'])->ensureCityIdIsSet($targetWikiId); $imageData = new \stdClass(); $imageData->city_id = $targetWikiId; $imageData->page_id = $image['id']; $imageData->city_lang_code = $targetWikiLang; $imageData->image_index = $promoImage->getType(); $imageData->image_name = $promoImage->getPathname(); $imageData->image_review_status = \ImageReviewStatuses::STATE_APPROVED; $imageData->last_edited = date('Y-m-d H:i:s'); $imageData->review_start = null; $imageData->review_end = null; $imageData->reviewer_id = null; $imagesToAdd[] = $imageData; } if (count($imagesToAdd) > 0) { $dbm = wfGetDB(DB_MASTER, array(), $wgExternalSharedDB); $deleteArray = []; $insertArray = []; foreach ($imagesToAdd as $image) { $tmpArr = array(); foreach ($image as $field => $value) { $tmpArr[$field] = $value; } $insertArray[] = $tmpArr; $deleteArray[] = $image->page_id; } (new \WikiaSQL())->DELETE('city_visualization_images')->WHERE('page_id')->IN($deleteArray)->AND_('city_id')->EQUAL_TO($targetWikiId)->run($dbm); (new \WikiaSQL())->INSERT('city_visualization_images', array_keys($insertArray[0]))->VALUES($insertArray)->run($dbm); } }
public function saveImagesForReview($cityId, $langCode, $images, $imageReviewStatus = ImageReviewStatuses::STATE_UNREVIEWED) { $currentImages = $this->getImagesFromReviewTable($cityId, $langCode); $reversedImages = array_flip($images); $imagesToModify = array(); foreach ($currentImages as $image) { if (isset($reversedImages[$image->image_name])) { $image->last_edited = date('Y-m-d H:i:s'); $image->image_review_status = $imageReviewStatus; $imagesToModify[] = $image; unset($reversedImages[$image->image_name]); } } $newImages = array_flip($reversedImages); $imagesToAdd = array(); foreach ($newImages as $image) { $imageData = new stdClass(); $imageIndex = PromoImage::fromPathname($image)->ensureCityIdIsSet($cityId)->getType(); $title = Title::newFromText($image, NS_FILE); $imageData->city_id = $cityId; $imageData->page_id = $title->getArticleId(); $imageData->city_lang_code = $langCode; $imageData->image_index = $imageIndex; $imageData->image_name = $image; $imageData->image_review_status = $imageReviewStatus; $imageData->last_edited = date('Y-m-d H:i:s'); $imageData->review_start = null; $imageData->review_end = null; $imageData->reviewer_id = null; $imagesToAdd[] = $imageData; } if (!empty($imagesToAdd) || !empty($imagesToModify)) { $dbm = wfGetDB(DB_MASTER, array(), $this->wg->ExternalSharedDB); $dbm->begin(__METHOD__); foreach ($imagesToAdd as $image) { $insertArray = array(); foreach ($image as $field => $value) { $insertArray[$field] = $value; } $dbm->insert(self::CITY_VISUALIZATION_IMAGES_TABLE_NAME, $insertArray); } foreach ($imagesToModify as $image) { $updateArray = array(); $image->reviewer_id = null; $image->review_start = null; $image->review_end = null; $oldPageId = $image->page_id; $title = Title::newFromText($image->image_name, NS_FILE); if ($title instanceof Title) { $image->page_id = $title->getArticleId(); } foreach ($image as $field => $value) { $updateArray[$field] = $value; } $dbm->update(self::CITY_VISUALIZATION_IMAGES_TABLE_NAME, $updateArray, array('city_id' => $image->city_id, 'page_id' => $oldPageId, 'city_lang_code' => $image->city_lang_code)); } $dbm->commit(__METHOD__); } }
/** * @desc Adding data of wikis imported on wikia.com by import script * * @param $targetWikiId * @param $targetWikiLang * @param $images */ protected function addImagesToPromoteDb($targetWikiId, $targetWikiLang, $images) { global $wgExternalSharedDB; foreach ($images as $image) { $imageData = new stdClass(); $promoImage = PromoImage::fromPathname($image['name'])->ensureCityIdIsSet($targetWikiId); $imageData->city_id = $targetWikiId; $imageData->page_id = $image['id']; $imageData->city_lang_code = $targetWikiLang; $imageData->image_index = $promoImage->getType(); $imageData->image_name = $promoImage->getPathname(); $imageData->image_review_status = ImageReviewStatuses::STATE_APPROVED; $imageData->last_edited = date('Y-m-d H:i:s'); $imageData->review_start = null; $imageData->review_end = null; $imageData->reviewer_id = null; $imagesToAdd[] = $imageData; } $dbm = wfGetDB(DB_MASTER, array(), $wgExternalSharedDB); $deleteArray = array(); $insertArray = array(); foreach ($imagesToAdd as $image) { $tmpArr = array(); foreach ($image as $field => $value) { $tmpArr[$field] = $value; } $insertArray[] = $tmpArr; $deleteArray[] = $image->page_id; } $dbm->begin(__METHOD__); $sql = 'DELETE FROM city_visualization_images WHERE page_id IN (' . $dbm->makeList($deleteArray) . ') AND city_id = \'' . $targetWikiId . '\''; $dbm->query($sql); $dbm->commit(__METHOD__); $dbm->begin(__METHOD__); $dbm->insert('city_visualization_images', $insertArray); $dbm->commit(__METHOD__); }
protected function saveAdditionalFiles($additionalImagesNames) { $unchangedTypes = array(); $imagesToProcess = array(); $allFiles = array(); foreach ($additionalImagesNames as $singleFileName) { $promoImage = PromoImage::fromPathname($singleFileName); if (!$promoImage->isType(PromoImage::INVALID)) { // check if file exists, if not do not add it to processed files, effectively removing it $file = GlobalFile::newFromText($promoImage->getPathname(), $this->wg->cityId); if ($file->exists()) { array_push($promoImages, $promoImage); } if (in_array($unchangedTypes, $promoImage->getType())) { WikiaLogger::instance()->info("SpecialPromote additional files duplicated type", ['method' => __METHOD__, 'type_duplicated' => $promoImage->getType()]); } else { array_push($unchangedTypes, $promoImage->getType()); } array_push($allFiles, $promoImage); } else { array_push($imagesToProcess, $singleFileName); } } $freeImageTypeSlots = array_diff(PromoImage::listAllAdditionalTypes(), $unchangedTypes); foreach ($imagesToProcess as $uploadedImageFileName) { $imageType = array_shift($freeImageTypeSlots); if (!empty($imageType)) { $promoImage = new PromoImage($imageType, $this->wg->DBname); $promoImage->processUploadedFile($uploadedImageFileName); array_push($allFiles, $promoImage); } else { WikiaLogger::instance()->info("SpecialPromote too many uploaded files", ['method' => __METHOD__]); break; } } foreach ($freeImageTypeSlots as $imageType) { $promoImage = new PromoImage($imageType, $this->wg->DBname); // attempt to delete leftover image types from current wiki if ($promoImage->getOriginFile(F::app()->wg->cityId)->exists()) { $promoImage->deleteImage(); } // attempt to delete leftover image types from corporate wiki if ($promoImage->corporateFileByLang($this->wg->ContLanguageCode)->exists()) { $promoImage->deleteImageFromCorporate(); } } return $allFiles; }