/**
  * Get explore module data from given date and city id
  *
  * @requestParam integer $module [REQUIRED] module id see EditHubModel.class.php from line 9 to 17
  * @requestParam integer $city [REQUIRED] city id of given hub
  * @requestParam integer $timestamp [OPTIONAL] unix timestamp, default current date
  *
  * @responseParam array $data - Data return by hub module - structure depends on $module parameter
  *
  * @example
  * @example &module=1&city=2&ts=1359504000
  */
 public function getModuleDataV3()
 {
     wfProfileIn(__METHOD__);
     $moduleId = $this->request->getInt(self::PARAMETER_MODULE);
     $cityId = $this->request->getInt(self::PARAMETER_CITY);
     $timestamp = $this->request->getInt(self::PARAMETER_TIMESTAMP, strtotime('00:00'));
     $model = $this->getModelV3();
     $data = null;
     if (!$this->isValidModule($model, $moduleId)) {
         throw new InvalidParameterApiException(self::PARAMETER_MODULE);
     }
     if (!$this->isValidCity($cityId)) {
         throw new InvalidParameterApiException(self::PARAMETER_CITY);
     }
     if (!$this->isValidTimestamp($timestamp)) {
         throw new InvalidParameterApiException(self::PARAMETER_TIMESTAMP);
     }
     $moduleName = $model->getNotTranslatedModuleName($moduleId);
     $moduleService = WikiaHubsModuleService::getModuleByName($moduleName, $cityId);
     if ($this->isValidModuleService($moduleService)) {
         $moduleService->setShouldFilterCommercialData($this->hideNonCommercialContent());
         $data = $moduleService->loadData($model, ['city_id' => $cityId, 'ts' => $timestamp]);
     } else {
         throw new BadRequestApiException();
     }
     $this->setResponseData(['data' => $data], ['urlFields' => ['articleUrl', 'href', 'hubUrl', 'imageLink', 'imageUrl', 'photoUrl', 'url', 'userUrl', 'wikiUrl']], WikiaResponse::CACHE_STANDARD);
     wfProfileOut(__METHOD__);
 }
 /**
  * Main action for editing hub modules
  */
 public function editHubAction()
 {
     global $wgCityId;
     if (!$this->checkAccess()) {
         return false;
     }
     $this->retriveDataFromUrl();
     $this->wg->Out->addJsConfigVars(['wgEditHubModuleIdSelected' => $this->selectedModuleId, 'wgEditHubModuleIdPopularVideos' => WikiaHubsModulePopularvideosService::MODULE_ID, 'wgEditHubModuleIdFeaturedVideo' => WikiaHubsModuleFeaturedvideoService::MODULE_ID]);
     $this->checkDate($this->date);
     $this->flashMessage = FlashMessages::pop();
     $modulesData = $this->editHubModel->getModulesData($wgCityId, $this->date, $this->selectedModuleId);
     $this->prepareLayoutData($this->selectedModuleId, $modulesData);
     $this->response->addAsset('resources/jquery/jquery.validate.js');
     $this->response->addAsset('/extensions/wikia/SpecialEditHub/js/EditHub.js');
     $this->response->addAsset('/extensions/wikia/SpecialEditHub/js/EditHubNavigation.js');
     $this->response->addAsset('/extensions/wikia/SpecialEditHub/js/jquery.MetaData.js');
     $selectedModuleValues = $modulesData['moduleList'][$this->selectedModuleId]['data'];
     $module = WikiaHubsModuleService::getModuleByName($this->editHubModel->getNotTranslatedModuleName($this->selectedModuleId), $wgCityId);
     $form = new FormBuilderService(EditHubModel::FORM_FIELD_PREFIX);
     $form->setFields($module->getFormFields());
     if ($this->request->wasPosted()) {
         $selectedModuleValues = $this->request->getParams();
         $selectedModuleValues = $module->filterData($selectedModuleValues);
         $isValid = $form->validate($selectedModuleValues);
         if ($isValid) {
             $this->editHubModel->saveModule(['cityId' => $wgCityId, 'langCode' => $this->wg->ContLang->getCode(), 'verticalId' => WikiFactoryHub::getInstance()->getCategoryId($wgCityId)], $this->date, $this->selectedModuleId, $selectedModuleValues, $this->wg->user->getId());
             $this->purgeCache($module);
             FlashMessages::put(wfMessage('edit-hub-module-save-ok', $modulesData['activeModuleName'])->escaped());
             $nextUrl = $this->getNextModuleUrl();
             $this->response->redirect($nextUrl);
         } else {
             $this->errorMessage = wfMessage('edit-hub-module-save-error')->escaped();
         }
     }
     $form->setFieldsValues($selectedModuleValues);
     $this->moduleName = $modulesData['activeModuleName'];
     $this->moduleContent = $module->renderEditor(['form' => $form]);
     $this->overrideTemplate('editHub');
 }
 /**
  * Render one module with given data
  *
  * @param EditHubModel $editHubModel
  * @param int $moduleId
  * @param string  $moduleName
  *
  * @return string
  */
 protected function renderModule($editHubModel, $moduleId, $moduleName)
 {
     $params = $this->getParams();
     $module = WikiaHubsModuleService::getModuleByName($moduleName, $this->cityId);
     $moduleData = $module->loadData($editHubModel, $params);
     if (!empty($moduleData)) {
         return $module->render($moduleData);
     } else {
         Wikia::log(__METHOD__, '', 'no module data for day: ' . $this->wg->lang->date($this->hubTimestamp) . ', lang: ' . $this->wg->ContLang->getCode() . ', vertical: ' . $this->verticalId . ', moduleId: ' . $moduleId);
         return null;
     }
 }