user->pass('contributor'); } /** * 发布文章 */ public function writePost() { $contents = $this->request->from( 'password', 'allowComment', 'allowPing', 'allowFeed', 'slug', 'tags', 'text', 'visibility' ); $contents['category'] = $this->request->getArray('category'); $contents['title'] = $this->request->get('title', _t('未命名文档')); $contents['created'] = $this->getCreated(); if ($this->request->is('markdown=1') && $this->options->markdown) { $contents['text'] = '' . $contents['text']; } $contents = self::pluginHandle()->filter('write', $contents, $this); if ($this->request->is('do=publish')) { /** 重新发布已经存在的文章 */ $contents['type'] = 'post'; $this->publish($contents); // 完成发布插件接口 self::pluginHandle()->call('finishPublish', $contents, $this); /** 发送ping */ $trackback = array_filter( array_unique(preg_split("/(\r|\n|\r\n)/", trim($this->request->get('trackback', '')))) ); Service::alloc()->sendPing($this, $trackback); /** 设置提示信息 */ Notice::alloc()->set('post' == $this->type ? _t('文章 "%s" 已经发布', $this->permalink, $this->title) : _t('文章 "%s" 等待审核', $this->title), 'success'); /** 设置高亮 */ Notice::alloc()->highlight($this->theId); /** 获取页面偏移 */ $pageQuery = $this->getPageOffsetQuery($this->cid); /** 页面跳转 */ $this->response->redirect(Common::url('manage-posts.php?' . $pageQuery, $this->options->adminUrl)); } else { /** 保存文章 */ $contents['type'] = 'post_draft'; $draftId = $this->save($contents); // 完成保存插件接口 self::pluginHandle()->call('finishSave', $contents, $this); /** 设置高亮 */ Notice::alloc()->highlight($this->cid); if ($this->request->isAjax()) { $created = new TypechoDate(); $this->response->throwJson([ 'success' => 1, 'time' => $created->format('H:i:s A'), 'cid' => $this->cid, 'draftId' => $draftId ]); } else { /** 设置提示信息 */ Notice::alloc()->set(_t('草稿 "%s" 已经被保存', $this->title), 'success'); /** 返回原页面 */ $this->response->redirect(Common::url('write-post.php?cid=' . $this->cid, $this->options->adminUrl)); } } } /** * 获取页面偏移的URL Query * * @param integer $cid 文章id * @param string|null $status 状态 * @return string * @throws DbException */ protected function getPageOffsetQuery(int $cid, ?string $status = null): string { return 'page=' . $this->getPageOffset( 'cid', $cid, 'post', $status, $this->request->is('__typecho_all_posts=on') ? 0 : $this->user->uid ); } /** * 标记文章 * * @throws DbException */ public function markPost() { $status = $this->request->get('status'); $statusList = [ 'publish' => _t('公开'), 'private' => _t('私密'), 'hidden' => _t('隐藏'), 'waiting' => _t('待审核') ]; if (!isset($statusList[$status])) { $this->response->goBack(); } $posts = $this->request->filter('int')->getArray('cid'); $markCount = 0; foreach ($posts as $post) { // 标记插件接口 self::pluginHandle()->call('mark', $status, $post, $this); $condition = $this->db->sql()->where('cid = ?', $post); $postObject = $this->db->fetchObject($this->db->select('status', 'type') ->from('table.contents')->where('cid = ? AND (type = ? OR type = ?)', $post, 'post', 'post_draft')); if ($this->isWriteable(clone $condition) && count((array)$postObject)) { /** 标记状态 */ $this->db->query($condition->update('table.contents')->rows(['status' => $status])); // 刷新Metas if ($postObject->type == 'post') { $op = null; if ($status == 'publish' && $postObject->status != 'publish') { $op = '+'; } elseif ($status != 'publish' && $postObject->status == 'publish') { $op = '-'; } if (!empty($op)) { $metas = $this->db->fetchAll( $this->db->select()->from('table.relationships')->where('cid = ?', $post) ); foreach ($metas as $meta) { $this->db->query($this->db->update('table.metas') ->expression('count', 'count ' . $op . ' 1') ->where('mid = ? AND (type = ? OR type = ?)', $meta['mid'], 'category', 'tag')); } } } // 处理草稿 $draft = $this->db->fetchRow($this->db->select('cid') ->from('table.contents') ->where('table.contents.parent = ? AND table.contents.type = ?', $post, 'revision') ->limit(1)); if (!empty($draft)) { $this->db->query($this->db->update('table.contents')->rows(['status' => $status]) ->where('cid = ?', $draft['cid'])); } // 完成标记插件接口 self::pluginHandle()->call('finishMark', $status, $post, $this); $markCount++; } unset($condition); } /** 设置提示信息 */ Notice::alloc() ->set( $markCount > 0 ? _t('文章已经被标记为%s', $statusList[$status]) : _t('没有文章被标记'), $markCount > 0 ? 'success' : 'notice' ); /** 返回原网页 */ $this->response->goBack(); } /** * 删除文章 * * @throws DbException */ public function deletePost() { $posts = $this->request->filter('int')->getArray('cid'); $deleteCount = 0; foreach ($posts as $post) { // 删除插件接口 self::pluginHandle()->call('delete', $post, $this); $condition = $this->db->sql()->where('cid = ?', $post); $postObject = $this->db->fetchObject($this->db->select('status', 'type') ->from('table.contents')->where('cid = ? AND (type = ? OR type = ?)', $post, 'post', 'post_draft')); if ($this->isWriteable(clone $condition) && count((array)$postObject) && $this->delete($condition)) { /** 删除分类 */ $this->setCategories($post, [], 'publish' == $postObject->status && 'post' == $postObject->type); /** 删除标签 */ $this->setTags($post, null, 'publish' == $postObject->status && 'post' == $postObject->type); /** 删除评论 */ $this->db->query($this->db->delete('table.comments') ->where('cid = ?', $post)); /** 解除附件关联 */ $this->unAttach($post); /** 删除草稿 */ $draft = $this->db->fetchRow($this->db->select('cid') ->from('table.contents') ->where('table.contents.parent = ? AND table.contents.type = ?', $post, 'revision') ->limit(1)); /** 删除自定义字段 */ $this->deleteFields($post); if ($draft) { $this->deleteContent($draft['cid']); $this->deleteFields($draft['cid']); } // 完成删除插件接口 self::pluginHandle()->call('finishDelete', $post, $this); $deleteCount++; } unset($condition); } // 清理标签 if ($deleteCount > 0) { Metas::alloc()->clearTags(); } /** 设置提示信息 */ Notice::alloc()->set( $deleteCount > 0 ? _t('文章已经被删除') : _t('没有文章被删除'), $deleteCount > 0 ? 'success' : 'notice' ); /** 返回原网页 */ $this->response->goBack(); } /** * 删除文章所属草稿 * * @throws DbException */ public function deletePostDraft() { $posts = $this->request->filter('int')->getArray('cid'); $deleteCount = 0; foreach ($posts as $post) { /** 删除草稿 */ $draft = $this->db->fetchRow($this->db->select('cid') ->from('table.contents') ->where('table.contents.parent = ? AND table.contents.type = ?', $post, 'revision') ->limit(1)); if ($draft) { $this->deleteContent($draft['cid']); $this->deleteFields($draft['cid']); $deleteCount++; } } /** 设置提示信息 */ Notice::alloc() ->set( $deleteCount > 0 ? _t('草稿已经被删除') : _t('没有草稿被删除'), $deleteCount > 0 ? 'success' : 'notice' ); /** 返回原网页 */ $this->response->goBack(); } /** * @return $this * @throws DbException * @throws Exception */ public function prepare(): self { return $this->prepareEdit('post', true, _t('文章不存在')); } /** * 绑定动作 * * @throws Exception|DbException */ public function action() { $this->security->protect(); $this->on($this->request->is('do=publish') || $this->request->is('do=save')) ->prepare()->writePost(); $this->on($this->request->is('do=delete'))->deletePost(); $this->on($this->request->is('do=mark'))->markPost(); $this->on($this->request->is('do=deleteDraft'))->deletePostDraft(); $this->response->redirect($this->options->adminUrl); } /** * @return string */ protected function getThemeFieldsHook(): string { return 'themePostFields'; } }