slug = $data['slug']; } public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $slug = PhrictionDocument::normalizeSlug($this->slug); if ($slug != $this->slug) { $uri = PhrictionDocument::getSlugURI($slug); // Canonicalize pages to their one true URI. return id(new AphrontRedirectResponse())->setURI($uri); } require_celerity_resource('phriction-document-css'); $document = id(new PhrictionDocument())->loadOneWhere( 'slug = %s', $slug); $breadcrumbs = $this->renderBreadcrumbs($slug); $version_note = null; if (!$document) { $create_uri = '/phriction/edit/?slug='.$slug; $page_content = '
'. 'No content here!
'. 'No document found at '.phutil_escape_html($slug).'. '. 'You can '. phutil_render_tag( 'a', array( 'href' => $create_uri, ), 'create a new document').'.'. '
'; $page_title = 'Page Not Found'; $button = phutil_render_tag( 'a', array( 'href' => $create_uri, 'class' => 'green button', ), 'Create Page'); } else { $version = $request->getInt('v'); if ($version) { $content = id(new PhrictionContent())->loadOneWhere( 'documentID = %d AND version = %d', $document->getID(), $version); if (!$content) { return new Aphront404Response(); } if ($content->getID() != $document->getContentID()) { $version_note = new AphrontErrorView(); $version_note->setSeverity(AphrontErrorView::SEVERITY_NOTICE); $version_note->setTitle('Older Version'); $version_note->appendChild( 'You are viewing an older version of this document, as it '. 'appeared on '. phabricator_datetime($content->getDateCreated(), $user).'.'); } } else { $content = id(new PhrictionContent())->load($document->getContentID()); } $page_title = $content->getTitle(); $phids = array($content->getAuthorPHID()); $handles = id(new PhabricatorObjectHandleData($phids))->loadHandles(); $age = time() - $content->getDateCreated(); $age = floor($age / (60 * 60 * 24)); if ($age < 1) { $when = 'today'; } else if ($age == 1) { $when = 'yesterday'; } else { $when = "{$age} days ago"; } $byline = '
'. "Last updated {$when} by ". $handles[$content->getAuthorPHID()]->renderLink().'.'. '
'; $engine = PhabricatorMarkupEngine::newPhrictionMarkupEngine(); $page_content = '
'. $byline. '
'. $engine->markupText($content->getContent()). '
'. '
'; $button = phutil_render_tag( 'a', array( 'href' => '/phriction/edit/'.$document->getID().'/', 'class' => 'button', ), 'Edit Page'); } if ($version_note) { $version_note = $version_note->render(); } $page = '
'. $button. '

'.phutil_escape_html($page_title).'

'. $breadcrumbs. '
'. $version_note. $page_content; return $this->buildStandardPageResponse( $page, array( 'title' => 'Phriction - '.$page_title, 'history' => PhrictionDocument::getSlugURI($slug, 'history'), )); } private function renderBreadcrumbs($slug) { $ancestor_handles = array(); $ancestral_slugs = PhrictionDocument::getSlugAncestry($slug); $ancestral_slugs[] = $slug; if ($ancestral_slugs) { $empty_slugs = array_fill_keys($ancestral_slugs, null); $ancestors = id(new PhrictionDocument())->loadAllWhere( 'slug IN (%Ls)', $ancestral_slugs); $ancestors = mpull($ancestors, null, 'getSlug'); $ancestor_phids = mpull($ancestors, 'getPHID'); $handles = array(); if ($ancestor_phids) { $handles = id(new PhabricatorObjectHandleData($ancestor_phids)) ->loadHandles(); } $ancestor_handles = array(); foreach ($ancestral_slugs as $slug) { if (isset($ancestors[$slug])) { $ancestor_handles[] = $handles[$ancestors[$slug]->getPHID()]; } else { $handle = new PhabricatorObjectHandle(); $handle->setName(PhrictionDocument::getDefaultSlugTitle($slug)); $handle->setURI(PhrictionDocument::getSlugURI($slug)); $ancestor_handles[] = $handle; } } } $breadcrumbs = array(); foreach ($ancestor_handles as $ancestor_handle) { $breadcrumbs[] = $ancestor_handle->renderLink(); } $list = phutil_render_tag( 'a', array( 'href' => '/phriction/', ), 'Document Index'); return '
'. $list.' · '. ''. implode(" \xC2\xBB ", $breadcrumbs). ''. '
'; } }