public function getSpeakers(string $id_slug = null) { $single_theme = isset($id_slug); if (!$id_slug) { /** @var Theme[] $themes */ $theme = null; if (\Auth::check()) { $themes = \Auth::user()->all_themes; } else { $themes = Theme::mostFrequent(); } } else { $id = unslug($id_slug)[0]; $theme = Theme::find($id); $themes = [$theme]; //FIXME: find a way to create a list of "related" themes } $speakers = []; foreach ($themes as $t) { //take care to not override $theme foreach ($t->sessions as $session) { /** @var \App\Models\Session $session */ $speakers += $session->speakers->all(); } } $themed_speakers = (bool) sizeof($speakers); if (!$speakers) { $speakers = User::findSpeakers(); } return view('user.speakers', compact('theme', 'themes', 'speakers', 'themed_speakers', 'single_theme')); }
/** * Updates an existing Form model (except id). * Updates an existing FormData model (only data field). * Updates an existing FormConfirmation model (except id & form_id). * Updates an existing FormEmail model (except id & form_id). * If update is successful, the browser will be redirected to the 'index' page. * * @param int|null $id * @return string|\yii\web\Response * @throws NotFoundHttpException * @throws \Exception * @throws \yii\db\Exception */ public function actionSettings($id = null) { /** @var \app\models\Form $formModel */ $formModel = $this->findFormModel($id); $formDataModel = $formModel->formData; $formConfirmationModel = $formModel->formConfirmation; $formEmailModel = $formModel->formEmail; $formUIModel = $formModel->ui; $postData = Yii::$app->request->post(); if ($formModel->load($postData) && $formConfirmationModel->load($postData) && $formEmailModel->load($postData) && $formUIModel->load($postData) && Model::validateMultiple([$formModel, $formConfirmationModel, $formEmailModel, $formUIModel])) { // Save data in single transaction $transaction = Form::getDb()->beginTransaction(); try { // Save Form Model if (!$formModel->save()) { throw new \Exception(Yii::t("app", "Error saving Form Model")); } // Save data field in FormData model if (isset($postData['Form']['name'])) { // Convert JSON Data of Form Data Model to PHP Array /** @var \app\components\JsonToArrayBehavior $builderField */ $builderField = $formDataModel->behaviors['builderField']; // Set form name by json key path. If fail, throw \ArrayAccessException $builderField->setSafeValue('settings.name', $postData['Form']['name']); // Save to DB $builderField->save(); // If fail, throw \Exception } // Save FormConfirmation Model if (!$formConfirmationModel->save()) { throw new \Exception(Yii::t("app", "Error saving Form Confirmation Model")); } // Save FormEmail Model if (!$formEmailModel->save()) { throw new \Exception(Yii::t("app", "Error saving Form Email Model")); } // Save FormUI Model if (!$formUIModel->save()) { throw new \Exception(Yii::t("app", "Error saving Form UI Model")); } $transaction->commit(); Yii::$app->getSession()->setFlash('success', Yii::t('app', 'The form settings have been successfully updated')); return $this->redirect(['index']); } catch (\Exception $e) { // Rolls back the transaction $transaction->rollBack(); // Rethrow the exception throw $e; } } else { // Select id & name of all themes in the system $themes = Theme::find()->select(['id', 'name'])->asArray()->all(); $themes = ArrayHelper::map($themes, 'id', 'name'); return $this->render('settings', ['formModel' => $formModel, 'formDataModel' => $formDataModel, 'formConfirmationModel' => $formConfirmationModel, 'formEmailModel' => $formEmailModel, 'formUIModel' => $formUIModel, 'themes' => $themes]); } }
/** * @param $id * @param $inputs */ public function update($id, $inputs) { $theme = Theme::find($id); $theme->fill($inputs); $theme->save(); }