/** * Метод перехода к определенному контроллеру приложения: * $controller - имя контроллера. * $action - имя действия контроллера. */ public function go($controller, $action = 'index') { if (class_exists($controller . 'Controller')) { $template = new Template(); $ctrl_class = $controller . 'Controller'; $ctrl = new $ctrl_class($this, $template); if (@$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { if (method_exists($ctrl, $action . 'AjaxAction')) { $this->controller = $controller; $this->action = $action; $result = json_encode(call_user_func(array($ctrl, $action . 'AjaxAction'), $this)); } else { $result = json_encode(false); } $template->headerOk(); $template->headerNoCache(); $template->headerContentType('text/javascript', 'UTF-8'); die($result); } if (method_exists($ctrl, $action . 'Action')) { $this->controller = $controller; $this->action = $action; if (call_user_func(array($ctrl, $action . 'Action'), $this, $template)) { $ctrl->process($template); } return true; } throw new Exception('Controller ' . $controller . ' has no ' . $action . ' action!'); } throw new Exception('Application has no ' . $controller . ' controller!'); }
/** * Действие "поделиться ссылкой" через букмарклет: */ public function shareLinkAction(Application $application, Template $template) { $kvs = KVS::getInstance(); $validator = new ValidatorHelper($_GET); $validator->assertExists('title', ''); $validator->assertLength('title', 70, ''); $validator->assertExists('link', ''); $validator->assertRegexp('link', ValidatorHelper::URL_REGEXP, ''); $validator->assertLength('description', 128, ''); if ($validator->isValid()) { $key = md5(strtolower($_GET['link'])); $ip = md5($_SERVER['REMOTE_ADDR']); $counter = $kvs->get(__CLASS__, 'shared_links_ip', $ip); if (!$kvs->exists(__CLASS__, 'shared_links', $key) && !$kvs->exists(__CLASS__, 'shared_links_ban', $ip)) { if ($kvs->exists(__CLASS__, 'shared_links_ip', $ip)) { if ($counter > 5) { $kvs->set(__CLASS__, 'shared_links_ban', $ip, true); $kvs->expire(__CLASS__, 'shared_links_ban', $ip, 5 * 60); } else { $lifetime = $kvs->lifetime(__CLASS__, 'shared_links_ip', $ip); $kvs->set(__CLASS__, 'shared_links_ip', $ip, ++$counter); $kvs->expire(__CLASS__, 'shared_links_ip', $ip, $lifetime); } } else { $kvs->set(__CLASS__, 'shared_links_ip', $ip, 1); $kvs->expire(__CLASS__, 'shared_links_ip', $ip, 60); } JabberBot::send('-=% /me Отправлена ссылка: ' . $_GET['link'] . ' (' . $_GET['title'] . ')' . "\n" . (!empty($_GET['description']) ? 'С описанием: ' . $_GET['description'] : '')); $kvs->set(__CLASS__, 'shared_links', $key, true); $kvs->expire(__CLASS__, 'shared_links', $key, 60 * 60); $template->headerOk(); $template->headerContentTypeWOCharset('image/png'); readfile(WEB_DIR . '/ico/tick.png'); exit; } } $template->headerBadRequest(); exit; }
/** * Действие просмотр rss ленты всех постов: */ public function rssAllAction(Application $application, Template $template) { $posts = Blog_BlogPostsModel::GetAllPosts(0, 20, false); if ($posts) { $rss = new rss('utf-8'); $rss->channel('Первый канал - Все', 'http://1chan.ru/', 'Новости имиджборд и не только.'); $rss->language('ru-ru'); $rss->copyright('Все права пренадлежат вам © 2010'); $rss->managingEditor('*****@*****.**'); $rss->category('Все'); $rss->startRSS(); foreach ($posts as $key => $post) { $title = $post['category'] ? TemplateHelper::BlogCategory($post['category'], 'title') . ' — ' . $post['title'] : $post['title']; $rss->itemTitle($title); $rss->itemLink('http://' . TemplateHelper::getSiteUrl() . '/news/res/' . $post['id'] . '/'); $rss->itemDescription($post['link'] ? '<a href="' . $post['link'] . '">' . $post['link'] . '</a><br />' . $post['text'] : $post['text']); $rss->itemAuthor('anonymous'); $rss->itemGuid('http://' . TemplateHelper::getSiteUrl() . '/news/res/' . $post['id'] . '/', true); $rss->itemPubDate(date('D, d M Y H:i:s O', $post['created_at'])); $rss->addItem(); } $result = $rss->RSSdone(); } EventModel::getInstance()->Broadcast('view_rss_all_post'); $template->headerOk(); $template->headerContentType('application/rss+xml', 'UTF-8'); echo $result; return false; }