/**
  * Overrides content of parent page with contents of draft page
  * @param Title $draftTitle Title object of sub page (draft)
  * @throws PermissionsException
  */
 private function approveDraft(Title $draftTitle)
 {
     // Get Title object of parent page
     $helper = new TemplateDraftHelper();
     $parentTitle = $helper->getParentTitle($draftTitle);
     // Check edit rights
     if (!$parentTitle->userCan('templatedraft')) {
         throw new PermissionsException('edit');
     }
     // Get contents of draft page
     $article = Article::newFromId($draftTitle->getArticleID());
     $draftContent = $article->getContent();
     // Get WikiPage object of parent page
     $page = WikiPage::newFromID($parentTitle->getArticleID());
     // Save to parent page
     $page->doEdit($draftContent, wfMessage('templatedraft-approval-summary')->inContentLanguage()->plain());
     // Remove Draft page
     $draftPage = WikiPage::newFromID($draftTitle->getArticleID());
     $draftPage->doDeleteArticle(wfMessage('templatedraft-draft-removal-summary')->inContentLanguage()->plain());
     // Show a confirmation message to a user after redirect
     BannerNotificationsController::addConfirmation(wfMessage('templatedraft-approval-success-confirmation')->escaped(), BannerNotificationsController::CONFIRMATION_CONFIRM, true);
 }
 /**
  * Triggered if a user edits a Draft subpage of a template.
  * It adds an editintro message with help and links.
  *
  * @param Array $preloads
  * @param Title $title
  * @return bool
  */
 public static function onEditPageLayoutShowIntro(&$preloads, Title $title)
 {
     if ($title->getNamespace() == NS_TEMPLATE) {
         if (TemplateDraftHelper::isTitleDraft($title)) {
             $base = Title::newFromText($title->getBaseText(), NS_TEMPLATE);
             $baseHelp = Title::newFromText('Help:PortableInfoboxes');
             $preloads['EditPageIntro'] = ['content' => wfMessage('templatedraft-editintro')->rawParams(Xml::element('a', ['href' => $baseHelp->getFullURL(), 'target' => '_blank'], wfMessage('templatedraft-module-help')->plain()), Xml::element('a', ['href' => $base->getFullUrl(['action' => 'edit']), 'target' => '_blank'], wfMessage('templatedraft-module-view-parent')->plain()))->escaped()];
         } elseif (!TemplateDraftHelper::titleHasPortableInfobox($title)) {
             $base = Title::newFromText($title->getBaseText() . '/' . wfMessage('templatedraft-subpage'), NS_TEMPLATE);
             $draftUrl = $base->getFullUrl(['action' => 'edit', TemplateConverter::CONVERSION_MARKER => 1]);
             $preloads['EditPageIntro'] = ['content' => wfMessage('templatedraft-module-editintro-please-convert')->rawParams(Xml::element('a', ['href' => $draftUrl, 'target' => '_blank'], wfMessage('templatedraft-module-button-create')->plain()))->escaped()];
         }
     }
     return true;
 }
 public static function isInfoboxTemplate(Title $title)
 {
     $namespace = $title->getNamespace();
     if ($namespace === NS_TEMPLATE && class_exists('TemplateClassificationController')) {
         $tc = new TemplateClassificationController($title);
         return $tc->isType($tc::TEMPLATE_INFOBOX) || TemplateDraftHelper::isTitleDraft($title);
     }
     return false;
 }