/** * 引用处理函数 * * @access private * @return void */ private function trackback() { /** 如果不是POST方法 */ if (!$this->request->isPost() || $this->request->getReferer()) { $this->response->redirect($this->_content->permalink); } /** 如果库中已经存在当前ip为spam的trackback则直接拒绝 */ if ($this->size($this->select()->where('status = ? AND ip = ?', 'spam', $this->request->getIp())) > 0) { /** 使用404告诉机器人 */ throw new Typecho_Widget_Exception(_t('找不到内容'), 404); } $trackback = array('cid' => $this->_content->cid, 'created' => $this->options->gmtTime, 'agent' => $this->request->getAgent(), 'ip' => $this->request->getIp(), 'ownerId' => $this->_content->author->uid, 'type' => 'trackback', 'status' => $this->options->commentsRequireModeration ? 'waiting' : 'approved'); $trackback['author'] = $this->request->filter('trim')->blog_name; $trackback['url'] = $this->request->filter('trim')->url; $trackback['text'] = $this->request->excerpt; //检验格式 $validator = new Typecho_Validate(); $validator->addRule('url', 'required', 'We require all Trackbacks to provide an url.')->addRule('url', 'url', 'Your url is not valid.')->addRule('url', 'maxLength', 'Your url is not valid.', 200)->addRule('text', 'required', 'We require all Trackbacks to provide an excerption.')->addRule('author', 'required', 'We require all Trackbacks to provide an blog name.')->addRule('author', 'xssCheck', 'Your blog name is not valid.')->addRule('author', 'maxLength', 'Your blog name is not valid.', 200); $validator->setBreak(); if ($error = $validator->run($trackback)) { $message = array('success' => 1, 'message' => current($error)); $this->response->throwXml($message); } /** 截取长度 */ $trackback['text'] = Typecho_Common::subStr($trackback['text'], 0, 100, '[...]'); /** 如果库中已经存在重复url则直接拒绝 */ if ($this->size($this->select()->where('cid = ? AND url = ? AND type <> ?', $this->_content->cid, $trackback['url'], 'comment')) > 0) { /** 使用403告诉机器人 */ throw new Typecho_Widget_Exception(_t('禁止重复提交'), 403); } /** 生成过滤器 */ $trackback = $this->pluginHandle()->trackback($trackback, $this->_content); /** 添加引用 */ $this->insert($trackback); /** 评论完成接口 */ $this->pluginHandle()->finishTrackback($this); /** 返回正确 */ $this->response->throwXml(array('success' => 0, 'message' => 'Trackback has registered.')); }