/** * @param integer $book_id * @param integer $chap_id * @param bool $check_can_read * @throws CHttpException * @internal param string $class * @return Chapter */ protected function loadChapter($book_id, $chap_id, $check_can_read = true) { $book_id = (int) $book_id; $chap_id = (int) $chap_id; $chap = Chapter::model()->with("book.membership")->findByPk((int) $chap_id); if (!$chap) { throw new CHttpException(404, "Главы не существует. Возможно, она была удалена. <a href='/book/{$book_id}/'>Вернуться к оглавлению перевода</a>."); } if ($chap->book->id != $book_id) { $this->redirect($chap->book->getUrl($chap_id)); } // ac_read для всего перевода. Если нельзя в весь перевод, редиректим в оглавление перевода, пусть контроллер Book объясняет, почему да как. if (!$chap->book->can("read")) { $this->redirect($chap->book->url); } if ($chap->book->opts_get(Book::OPTS_BAN_COPYRIGHT)) { $chap->book->facecontrol = Book::FC_INVITE; foreach (Yii::app()->params["ac_areas"] as $ac => $title) { if ($chap->book->{$ac} == "a") { $chap->book->{$ac} = "g"; } } $reason = BookBanReason::model()->findByPk($chap->book->id); if (!$reason) { $reason = new BookBanReason(); } if (!$chap->book->can("read")) { throw new CHttpException(403, "Сожалеем, но этот перевод заблокирован по заявке правообладателей."); } } // ac_read для этой главы if ($check_can_read && !$chap->can("read")) { $msg = $chap->deniedWhy; $msg .= "<br /><br /><a href='{$chap->book->url}'>Вернуться к оглавлению</a>."; throw new CHttpException(403, $msg); } return $chap; }
public function actionBan_copyright($book_id) { $book = $this->loadBook($book_id); $reason = BookBanReason::model()->findByPk($book->id); if (!$reason) { $reason = new BookBanReason(); } $reason->book_id = $book->id; $reason->book = $book; if (isset($_POST["BookBanReason"])) { $reason->setAttributes($_POST["BookBanReason"]); if ($reason->save()) { $book->opts_set(Book::OPTS_BAN_COPYRIGHT, 1); $book->facecontrol = Book::FC_INVITE; foreach (Yii::app()->params["ac_areas"] as $ac => $title) { if ($book->{$ac} == "a") { $book->{$ac} = "g"; } } $book->save(false); $this->redirect($book->url); } } $this->render("ban_copyright", array("book" => $book, "reason" => $reason)); }
/** @return Book */ protected function loadBook($book_id, $class = "Book") { $book_id = (int) $book_id; if ($this->book === null) { $this->book = $class::model()->with("owner", "membership", "cat")->findByPk($book_id); } if (!$this->book) { throw new CHttpException(404, "Такого перевода не существует. Возможно, он удалён или вы неправильно набрали адрес. Попробуйте воспользоваться <a href='/search'>поиском</a>, например."); } if ($this->book->typ == "P") { throw new CHttpException(410, "Извините, раздел перевода фраз временно отключен для переосмысления. Следите за <a href='/blog?topic=64'>нашим блогом</a>, если хотите первыми узнать, когда он снова будет запущен."); } if ($this->book->opts_get(Book::OPTS_BAN_COPYRIGHT)) { $this->book->facecontrol = Book::FC_INVITE; foreach (Yii::app()->params["ac_areas"] as $ac => $title) { if ($this->book->{$ac} == "a") { $this->book->{$ac} = "g"; } } $reason = BookBanReason::model()->findByPk($this->book->id); if (!$reason) { $reason = new BookBanReason(); } if (!$this->book->can("read")) { $html = "Сожалеем, но этот перевод заблокирован по заявке правообладателя"; if ($reason->url != "") { $html .= " <a href='{$reason->url}' rel='nofollow'>{$reason->title}</a>"; } elseif ($reason->title != "") { $html .= " {$reason->title}"; } if ($reason->email != "") { $html .= " (<a href='mailto:{$reason->email}'>{$reason->email}</a>)"; } $html .= ".<br /><br />"; $html .= "<img src='http://img.leprosorium.com/2182718' style='display: block; margin: 20px auto' />"; throw new CHttpException(403, $html); } } // Формируем понятное сообщение об ошибке, если нам нельзя в этот перевод (!$this->book->can("read")) if (!$this->book->can("read")) { $msg = $this->book->deniedWhy; // Bells & Whistles, показываются только на странице с ошибкой, а не при ajax-запросе if (!Yii::app()->request->isAjaxRequest) { // Ебала с группами, предлагаем вступить или проверяем, есть ли инвайт if ($this->book->membership->status != GroupMember::BANNED) { if ($this->book->ac_read == "g") { if ($this->book->facecontrol == Book::FC_CONFIRM) { $msg .= $this->renderPartial("//book/_join", array("book" => $this->book), true); } elseif ($this->book->facecontrol == Book::FC_INVITE) { if ($this->book->user_invited(Yii::app()->user->id)) { $msg .= "<br /><br />И, кстати, это приглашение у вас есть.<br /><br />" . "<a href='" . $this->book->getUrl("invite_accept") . "' class='btn btn-success'><i class='icon-ok icon-white'></i> Принять</a> " . "<a href='" . $this->book->getUrl("invite_decline") . "' class='btn btn-inverse'><i class='icon-remove-sign icon-white'></i> Отказать</a>"; } } } } $msg .= "<br /><br /><a href='/search?t=" . urlencode($this->book->s_title) . "'>Поискать похожие переводы</a> | "; $msg .= "<a href='" . $this->book->owner->getUrl("books") . "'>Другие переводы от {$this->book->owner->login}</a> | "; if (!Yii::app()->user->isGuest) { $msg .= "<a href='/mail/write?to=" . urlencode($this->book->owner->login) . "'>Написать письмо {$this->book->owner->login}</a> "; } } throw new CHttpException(403, $msg); } return $this->book; }