| <?php␊ | 
| /* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */␊ | 
| /*␊ | 
| # ***** BEGIN LICENSE BLOCK *****␊ | 
| # This file is part of InDefero, an open source project management application.␊ | 
| # Copyright (C) 2008 Céondo Ltd and contributors.␊ | 
| #␊ | 
| # InDefero is free software; you can redistribute it and/or modify␊ | 
| # it under the terms of the GNU General Public License as published by␊ | 
| # the Free Software Foundation; either version 2 of the License, or␊ | 
| # (at your option) any later version.␊ | 
| #␊ | 
| # InDefero is distributed in the hope that it will be useful,␊ | 
| # but WITHOUT ANY WARRANTY; without even the implied warranty of␊ | 
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the␊ | 
| # GNU General Public License for more details.␊ | 
| #␊ | 
| # You should have received a copy of the GNU General Public License␊ | 
| # along with this program; if not, write to the Free Software␊ | 
| # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA␊ | 
| #␊ | 
| # ***** END LICENSE BLOCK ***** */␊ | 
| ␊ | 
| Pluf::loadFunction('Pluf_HTTP_URL_urlForView');␊ | 
| Pluf::loadFunction('Pluf_Shortcuts_RenderToResponse');␊ | 
| Pluf::loadFunction('Pluf_Shortcuts_GetObjectOr404');␊ | 
| Pluf::loadFunction('Pluf_Shortcuts_GetFormForModel');␊ | 
| ␊ | 
| /**␊ | 
| * Documentation pages views.␊ | 
| */␊ | 
| class IDF_Views_Wiki␊ | 
| {␊ | 
| /**␊ | 
| * View list of issues for a given project.␊ | 
| */␊ | 
| public $index_precond = array('IDF_Precondition::accessWiki');␊ | 
| public function index($request, $match, $api=false)␊ | 
| {␊ | 
| $prj = $request->project;␊ | 
| $title = sprintf(__('%s Documentation'), (string) $prj);␊ | 
| // Paginator to paginate the pages␊ | 
| $pag = new Pluf_Paginator(new IDF_WikiPage());␊ | 
| $pag->class = 'recent-issues';␊ | 
| $pag->item_extra_props = array('project_m' => $prj,␊ | 
| 'shortname' => $prj->shortname,␊ | 
| 'current_user' => $request->user);␊ | 
| $pag->summary = __('This table shows the documentation pages.');␊ | 
| $pag->action = array('IDF_Views_Wiki::index', array($prj->shortname));␊ | 
| $pag->edit_action = array('IDF_Views_Wiki::view', 'shortname', 'title');␊ | 
| $sql = 'project=%s';␊ | 
| $ptags = self::getWikiTags($prj);␊ | 
| $dtag = array_pop($ptags); // The last tag is the deprecated tag.␊ | 
| $ids = self::getDeprecatedPagesIds($prj, $dtag);␊ | 
| if (count($ids)) {␊ | 
| $sql .= ' AND id NOT IN ('.implode(',', $ids).')';␊ | 
| }␊ | 
| $pag->forced_where = new Pluf_SQL($sql, array($prj->id));␊ | 
| $list_display = array(␊ | 
| 'title' => __('Page Title'),␊ | 
| array('summary', 'IDF_Views_Wiki_SummaryAndLabels', __('Summary')),␊ | 
| array('modif_dtime', 'Pluf_Paginator_DateYMD', __('Updated')),␊ | 
| );␊ | 
| $pag->configure($list_display, array(), array('title', 'modif_dtime'));␊ | 
| $pag->items_per_page = 25;␊ | 
| $pag->no_results_text = __('No documentation pages were found.');␊ | 
| $pag->sort_order = array('title', 'ASC');␊ | 
| $pag->setFromRequest($request);␊ | 
| //$tags = $prj->getTagCloud('downloads');␊ | 
| return Pluf_Shortcuts_RenderToResponse('idf/wiki/index.html',␊ | 
| array(␊ | 
| 'page_title' => $title,␊ | 
| 'pages' => $pag,␊ | 
| //'tags' => $tags,␊ | 
| 'deprecated' => count($ids),␊ | 
| 'dlabel' => $dtag,␊ | 
| ),␊ | 
| $request);␊ | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * Create a new documentation page.␊ | 
| */␊ | 
| public $create_precond = array('IDF_Precondition::accessWiki',␊ | 
| 'Pluf_Precondition::loginRequired');␊ | 
| public function create($request, $match)␊ | 
| {␊ | 
| $prj = $request->project;␊ | 
| $title = __('New Page');␊ | 
| $preview = false;␊ | 
| if ($request->method == 'POST') {␊ | 
| $form = new IDF_Form_WikiCreate($request->POST,␊ | 
| array('project' => $prj,␊ | 
| 'user' => $request->user␊ | 
| ));␊ | 
| if ($form->isValid() and !isset($request->POST['preview'])) {␊ | 
| $page = $form->save();␊ | 
| $urlpage = Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::view', ␊ | 
| array($prj->shortname, $page->title));␊ | 
| $request->user->setMessage(sprintf(__('The page <a href="%s">%s</a> has been created.'), $urlpage, Pluf_esc($page->title)));␊ | 
| $url = Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::index', ␊ | 
| array($prj->shortname));␊ | 
| return new Pluf_HTTP_Response_Redirect($url);␊ | 
| } elseif (isset($request->POST['preview'])) {␊ | 
| $preview = $request->POST['content'];␊ | 
| }␊ | 
| } else {␊ | 
| $form = new IDF_Form_WikiCreate(null,␊ | 
| array('project' => $prj,␊ | 
| 'user' => $request->user));␊ | 
| }␊ | 
| return Pluf_Shortcuts_RenderToResponse('idf/wiki/create.html',␊ | 
| array(␊ | 
| 'auto_labels' => self::autoCompleteArrays($prj),␊ | 
| 'page_title' => $title,␊ | 
| 'form' => $form,␊ | 
| 'preview' => $preview,␊ | 
| ),␊ | 
| $request);␊ | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * View a documentation page.␊ | 
| */␊ | 
| public $view_precond = array('IDF_Precondition::accessWiki');␊ | 
| public function view($request, $match)␊ | 
| {␊ | 
| $prj = $request->project;␊ | 
| // Find the page␊ | 
| $sql = new Pluf_SQL('project=%s AND title=%s', ␊ | 
| array($prj->id, $match[2]));␊ | 
| $pages = Pluf::factory('IDF_WikiPage')->getList(array('filter'=>$sql->gen()));␊ | 
| if ($pages->count() != 1) {␊ | 
| throw new Pluf_HTTP_Error404($request);␊ | 
| }␊ | 
| $page = $pages[0];␊ | 
| $title = $page->title;␊ | 
| $revision = $page->get_current_revision();␊ | 
| return Pluf_Shortcuts_RenderToResponse('idf/wiki/view.html',␊ | 
| array(␊ | 
| 'page_title' => $title,␊ | 
| 'page' => $page,␊ | 
| 'rev' => $revision,␊ | 
| 'tags' => $page->get_tags_list(),␊ | 
| ),␊ | 
| $request);␊ | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * View a documentation page.␊ | 
| */␊ | 
| public $update_precond = array('IDF_Precondition::accessWiki',␊ | 
| 'Pluf_Precondition::loginRequired');␊ | 
| public function update($request, $match)␊ | 
| {␊ | 
| $prj = $request->project;␊ | 
| // Find the page␊ | 
| $sql = new Pluf_SQL('project=%s AND title=%s', ␊ | 
| array($prj->id, $match[2]));␊ | 
| $pages = Pluf::factory('IDF_WikiPage')->getList(array('filter'=>$sql->gen()));␊ | 
| if ($pages->count() != 1) {␊ | 
| throw new Pluf_HTTP_Error404($request);␊ | 
| }␊ | 
| $page = $pages[0];␊ | 
| $title = sprintf(__('Update %s'), $page->title);␊ | 
| $revision = $page->get_current_revision();␊ | 
| $preview = false;␊ | 
| $params = array('project' => $prj,␊ | 
| 'user' => $request->user,␊ | 
| 'page' => $page);␊ | 
| if ($request->method == 'POST') {␊ | 
| $form = new IDF_Form_WikiUpdate($request->POST, $params);␊ | 
| if ($form->isValid() and !isset($request->POST['preview'])) {␊ | 
| $page = $form->save();␊ | 
| $urlpage = Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::view', ␊ | 
| array($prj->shortname, $page->title));␊ | 
| $request->user->setMessage(sprintf(__('The page <a href="%s">%s</a> has been updated.'), $urlpage, Pluf_esc($page->title)));␊ | 
| $url = Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::index', ␊ | 
| array($prj->shortname));␊ | 
| return new Pluf_HTTP_Response_Redirect($url);␊ | 
| } elseif (isset($request->POST['preview'])) {␊ | 
| $preview = $request->POST['content'];␊ | 
| }␊ | 
| } else {␊ | 
| ␊ | 
| $form = new IDF_Form_WikiUpdate(null, $params);␊ | 
| }␊ | 
| return Pluf_Shortcuts_RenderToResponse('idf/wiki/update.html',␊ | 
| array(␊ | 
| 'auto_labels' => self::autoCompleteArrays($prj),␊ | 
| 'page_title' => $title,␊ | 
| 'page' => $page,␊ | 
| 'rev' => $revision,␊ | 
| 'form' => $form,␊ | 
| 'preview' => $preview,␊ | 
| ),␊ | 
| $request);␊ | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * Get the wiki tags.␊ | 
| *␊ | 
| * @param IDF_Project␊ | 
| * @return ArrayObject The tags␊ | 
| */␊ | 
| public static function getWikiTags($project)␊ | 
| {␊ | 
| return $project->getTagsFromConfig('labels_wiki_predefined',␊ | 
| IDF_Form_WikiConf::init_predefined);␊ | 
| ␊ | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * Get deprecated page ids.␊ | 
| *␊ | 
| * @param IDF_Project␊ | 
| * @param IDF_Tag Deprecated tag (null)␊ | 
| * @return array Ids of the deprecated pages.␊ | 
| */␊ | 
| public static function getDeprecatedPagesIds($project, $dtag=null)␊ | 
| {␊ | 
| if (is_null($dtag)) {␊ | 
| $ptags = self::getDownloadTags($project);␊ | 
| $dtag = array_pop($ptags); // The last tag is the deprecated tag␊ | 
| }␊ | 
| $sql = new Pluf_SQL('project=%s AND idf_tag_id=%s', array($project->id,␊ | 
| $dtag->id));␊ | 
| $ids = array();␊ | 
| foreach (Pluf::factory('IDF_WikiPage')->getList(array('filter' => $sql->gen(), 'view' => 'join_tags'))␊ | 
| as $file) {␊ | 
| $ids[] = (int) $file->id;␊ | 
| }␊ | 
| return $ids;␊ | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * Create the autocomplete arrays for the little AJAX stuff.␊ | 
| */␊ | 
| public static function autoCompleteArrays($project)␊ | 
| {␊ | 
| $conf = new IDF_Conf();␊ | 
| $conf->setProject($project);␊ | 
| $st = preg_split("/\015\012|\015|\012/", ␊ | 
| $conf->getVal('labels_wiki_predefined', IDF_Form_UploadConf::init_predefined), -1, PREG_SPLIT_NO_EMPTY);␊ | 
| $auto = '';␊ | 
| foreach ($st as $s) {␊ | 
| $v = '';␊ | 
| $d = '';␊ | 
| $_s = split('=', $s, 2);␊ | 
| if (count($_s) > 1) {␊ | 
| $v = trim($_s[0]);␊ | 
| $d = trim($_s[1]);␊ | 
| } else {␊ | 
| $v = trim($_s[0]);␊ | 
| }␊ | 
| $auto .= sprintf('{ name: "%s", to: "%s" }, ',␊ | 
| Pluf_esc($d), Pluf_esc($v));␊ | 
| }␊ | 
| return substr($auto, 0, -1);␊ | 
| }␊ | 
| ␊ | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * Display the summary of a page, then on a new line, display the␊ | 
| * list of labels.␊ | 
| */␊ | 
| function IDF_Views_Wiki_SummaryAndLabels($field, $page, $extra='')␊ | 
| {␊ | 
| $tags = array();␊ | 
| foreach ($page->get_tags_list() as $tag) {␊ | 
| $tags[] = Pluf_esc((string) $tag);␊ | 
| }␊ | 
| $out = '';␊ | 
| if (count($tags)) {␊ | 
| $out = '<br /><span class="note label">'.implode(', ', $tags).'</span>';␊ | 
| }␊ | 
| return Pluf_esc($page->summary).$out;␊ | 
| }␊ |