mambax7/gwiki

View on GitHub
edit.php

Summary

Maintainability
B
4 hrs
Test Coverage
<?php

/**
 * edit.php - edit a wiki page
 *
 * @copyright  Copyright © 2013 geekwright, LLC. All rights reserved.
 * @license    gwiki/docs/license.txt  GNU General Public License (GPL)
 * @since      1.0
 * @author     Richard Griffith <richard@geekwright.com>
 * @package    gwiki
 */

use Xmf\Request;

require_once __DIR__ . '/header.php';
require_once XOOPS_ROOT_PATH . '/class/xoopsformloader.php';

global $xoTheme, $xoopsTpl;

if (Request::hasVar('gwikiwizard', 'SESSION')) {
    $wizard_parms            = unserialize($_SESSION['gwikiwizard']);
    $_SESSION['gwikiwizard'] = null;
    unset($_SESSION['gwikiwizard']);
    $valid_keys = [
        'page',
        'op',
        'title',
        'body',
        'display_keyword',
        'parent_page',
        'page_set_home',
        'page_set_order',
        'meta_description',
        'meta_keywords',
        'show_in_index',
        'leave_inactive',
    ];
    foreach ($wizard_parms as $key => $value) {
        if (in_array($key, $valid_keys)) {
            $_POST[$key] = $value;
        }
    }
}

// $_GET and $_POST variables we use
if (Request::hasVar('page', 'GET')) {
    $page = cleaner($_GET['page']);
}
if (Request::hasVar('page', 'POST')) {
    $page = cleaner($_POST['page']);
}

if (Request::hasVar('op', 'GET')) {
    $op = mb_strtolower(cleaner($_GET['op']));
}
if (Request::hasVar('op', 'POST')) {
    $op = mb_strtolower(cleaner($_POST['op']));
}
if (empty($op) || ('preview' !== $op && 'edit' !== $op && 'insert' !== $op)) {
    $op = 'edit';
} // get a valid op

// namespace id (prefix_id) is set by newpage block, turn it into a full page name
if (Request::hasVar('nsid', 'GET')) {
    $page = $wikiPage->makeKeywordFromPrefix(Request::getInt('nsid', 0, 'GET'), $page);
}
if (empty($page)) {
    $page = $wikiPage->wikiHomePage;
}

$normpage = $wikiPage->normalizeKeyword($page);
if (_MI_GWIKI_WIKI404 === $normpage && 0 !== strcasecmp($page, _MI_GWIKI_WIKI404)) {
    redirect_header("index.php?page=$page", 2, _MI_GWIKI_WIKI404);
} else {
    $page = $normpage;
}

$id               = 0;
$uid              = 0;
$title            = '';
$body             = '';
$display_keyword  = '';
$parent_page      = '';
$page_set_home    = '';
$page_set_order   = 0;
$meta_description = '';
$meta_keywords    = '';
$show_in_index    = 1;
$leave_inactive   = 0;

if (Request::hasVar('id', 'GET')) {
    $id = Request::getInt('id', 0, 'GET');
} // post value will override
// $_POST variables we use
if (Request::hasVar('id', 'POST')) {
    $id = Request::getInt('id', 0, 'POST');
}
if (Request::hasVar('uid', 'POST')) {
    $uid = Request::getInt('uid', 0, 'POST');
}
if (Request::hasVar('title', 'POST')) {
    $title = cleaner($_POST['title']);
}
if (Request::hasVar('body', 'POST')) {
    $body = cleaner($_POST['body'], false);
}
if (Request::hasVar('display_keyword', 'POST')) {
    $display_keyword = cleaner($_POST['display_keyword']);
}
if (Request::hasVar('parent_page', 'POST')) {
    $parent_page = cleaner($_POST['parent_page']);
}
if (Request::hasVar('page_set_home', 'POST')) {
    $page_set_home = cleaner($_POST['page_set_home']);
}
if (Request::hasVar('page_set_order', 'POST')) {
    $page_set_order = Request::getInt('page_set_order', 0, 'POST');
}
if (Request::hasVar('meta_description', 'POST')) {
    $meta_description = cleaner($_POST['meta_description']);
}
if (Request::hasVar('meta_keywords', 'POST')) {
    $meta_keywords = cleaner($_POST['meta_keywords']);
}
if (Request::hasVar('show_in_index', 'POST')) {
    $show_in_index = Request::getInt('show_in_index', 0, 'POST');
}
if (Request::hasVar('leave_inactive', 'POST')) {
    $leave_inactive = Request::getInt('leave_inactive', 0, 'POST');
}

global $wikiPage;
$pageX   = $wikiPage->getPage($page, (0 === $id ? null : $id));
$mayEdit = $wikiPage->checkEdit();

if ($pageX) {
    $pageX['author']       = $wikiPage->getUserName($wikiPage->uid);
    $pageX['revisiontime'] = date($wikiPage->dateFormat, $pageX['lastmodified']);
    $pageX['mayEdit']      = $mayEdit;
    $pageX['pageFound']    = true;
    if (!empty($highlight)) {
        $pageX['body'] = $wikiPage->highlightWords($highlight);
    }
} else {
    $pageX                 = [];
    $uid                   = $xoopsUser ? $xoopsUser->getVar('uid') : 0;
    $pageX['uid']          = $uid;
    $pageX['author']       = $wikiPage->getUserName($uid);
    $pageX['revisiontime'] = date($wikiPage->dateFormat);
    $pageX['mayEdit']      = $mayEdit;
    $pageX['keyword']      = $page;
    $pageX['pageFound']    = false;
}
$dir               = basename(__DIR__);
$pageX['moddir']   = $dir;
$pageX['modpath']  = XOOPS_ROOT_PATH . '/modules/' . $dir;
$pageX['modurl']   = XOOPS_URL . '/modules/' . $dir;
$pageX['ineditor'] = true;
$pageX['imglib']   = $wikiPage->getImageLib($page);
$pageX['maxsize']  = $wikiPage->getMaxUploadSize();

if (!$mayEdit) {
    $err_message = _MD_GWIKI_NO_PAGE_PERMISSION;
    redirect_header("index.php?page=$page", 2, $err_message);
}

if ($wikiPage->admin_lock) {
    redirect_header("index.php?page=$page", 2, _MD_GWIKI_PAGE_IS_LOCKED);
}

if ('insert' === $op) {
    // check if this page was updated elsewhere while we were editing
    // if so, we save it, but don't make it the active revision
    if ($id === $wikiPage->getCurrentId($page)) {
        $forced_inactive = false;
    } else {
        $leave_inactive  = true;
        $forced_inactive = true;
    }
    $wikiPage->keyword         = $page;
    $wikiPage->title           = $title;
    $wikiPage->display_keyword = $display_keyword;
    $wikiPage->body            = $body;
    $wikiPage->uid             = $uid;

    $wikiPage->parent_page      = $parent_page;
    $wikiPage->page_set_home    = $page_set_home;
    $wikiPage->page_set_order   = $page_set_order;
    $wikiPage->meta_description = $meta_description;
    $wikiPage->meta_keywords    = $meta_keywords;
    $wikiPage->show_in_index    = $show_in_index;

    $success = $wikiPage->addRevision($leave_inactive);

    if ($success) {
        if ($forced_inactive) {
            $err_message = _MD_GWIKI_EDITCONFLICT;
            $op          = 'edit';
            $id          = $success;
        } else {
            $message = _MD_GWIKI_DBUPDATED;
            if ($leave_inactive) {
                $message = _MD_GWIKI_SAVED_INACTIVE;
            }
            $op = '';
            redirect_header("index.php?page=$page", 2, $message);
        }
    } else {
        $err_message = _MD_GWIKI_ERRORINSERT;
        $op          = 'edit';
    }
}

$pagestatmessage = '';
$pagechanged     = '';
$result          = false;
if (('preview' === $op) && isset($id)) {
    $result          = (int)$id;
    $pagestatmessage = _MD_GWIKI_PAGENOTSAVED;
    $pagechanged     = 'yes';
} else {
    //print_r($pageX);
    if ($pageX['pageFound']) {
        $result = true;
    } else {
        $result           = false;
        $pagestatmessage  = _MD_GWIKI_PAGENOTFOUND;
        $op               = 'edit';
        $pageX['keyword'] = $page;
        //      $pageX['pageFound'] = true; // not really, but used in template only from here on
    }

    $gwiki_id         = $wikiPage->gwiki_id;
    $keyword          = $wikiPage->keyword;
    $display_keyword  = $wikiPage->display_keyword;
    $title            = $wikiPage->title;
    $body             = $wikiPage->body;
    $parent_page      = $wikiPage->parent_page;
    $page_set_home    = $wikiPage->page_set_home;
    $page_set_order   = $wikiPage->page_set_order;
    $meta_description = $wikiPage->meta_description;
    $meta_keywords    = $wikiPage->meta_keywords;
    $show_in_index    = $wikiPage->show_in_index;
    $lastmodified     = $wikiPage->lastmodified;
    $uid              = $wikiPage->uid;
    $admin_lock       = $wikiPage->admin_lock;
    $active           = $wikiPage->active;
}

switch ($op) {
    case 'edit':
    case 'preview':
        //case "images":
        $GLOBALS['xoopsOption']['template_main'] = 'gwiki_edit.tpl';
        require_once XOOPS_ROOT_PATH . '/header.php';

        $title = prepOut($title); // we need title ready to display in several places
        if ('preview' === $op) {
            $pageX['keyword'] = $page;
            $pageX['title']   = $title;
            $pageX['body']    = $wikiPage->renderPage($body);
            $pageX['preview'] = true;
        } else {
            unset($pageX['title'], $pageX['body']);
            $pageX['preview'] = false;
        }

        $uid = $xoopsUser ? $xoopsUser->getVar('uid') : 0;

        $form = new \XoopsThemeForm(_MD_GWIKI_EDITPAGE . ": $page", 'gwikiform', "edit.php?page=$page");

        if (empty($display_keyword)) {
            $display_keyword = $page;
        }

        $form->addElement(new \XoopsFormHidden('op', 'insert'));
        $form->addElement(new \XoopsFormHidden('page', $page));
        $form->addElement(new \XoopsFormHidden('id', $wikiPage->getCurrentId($page)));
        $form->addElement(new \XoopsFormHidden('uid', $uid));
        $form->addElement(new \XoopsFormHidden('pagechanged', $pagechanged));

        $form->addElement(new \XoopsFormText(_MD_GWIKI_TITLE, 'title', 40, 250, $title));
        $form->addElement(new \XoopsFormLabel('', '', 'gwikieditbuttons')); // edit buttons added in template

        $form_edit_body = new \XoopsFormTextArea(_MD_GWIKI_BODY, 'body', htmlspecialchars($body, ENT_QUOTES | ENT_HTML5), 20, 80);
        $form_edit_body->setExtra("onclick='setWikiChanged();'");
        $form->addElement($form_edit_body);

        $btn_tray   = new \XoopsFormElementTray('', ' ', 'gwikiformpage1');
        $submit_btn = new \XoopsFormButton('', 'submit', _SUBMIT, 'submit');
        $submit_btn->setExtra("onclick='prepForSubmit();'");
        $btn_tray->addElement($submit_btn);

        $metadata_btn = new \XoopsFormButton('', 'metaedit', _MD_GWIKI_EDIT_SHOW_META, 'button');
        $metadata_btn->setExtra('onclick=' . "'var ele = document.getElementById(\"gwikiformmetaedit\"); ele.style.display = \"inherit\";" . " var ele2 = document.getElementById(\"gwikiformbodyedit\"); ele2.style.display = \"none\";'");
        $btn_tray->addElement($metadata_btn);

        $preview_btn = new \XoopsFormButton('', 'preview', _PREVIEW, 'button');
        $preview_btn->setExtra("onclick='prepForPreview();'");
        $btn_tray->addElement($preview_btn);

        $cancel_btn = new \XoopsFormButton('', 'cancel', _CANCEL, 'button');
        $cancel_btn->setExtra("onclick='" . (('edit' === $op) ? 'history.back();' : 'document.location.href="index.php' . ($result ? "?page=$page" : '') . '";') . "'");
        $btn_tray->addElement($cancel_btn);

        $btn_tray->addElement(new \XoopsFormLabel('', " - <strong>{$pagestatmessage}</strong>"));

        $form->addElement($btn_tray);

        $form->addElement(new \XoopsFormText(_MD_GWIKI_DISPLAY_KEYWORD, 'display_keyword', 40, 250, htmlspecialchars($display_keyword, ENT_QUOTES | ENT_HTML5)));
        $form->addElement(new \XoopsFormText(_MD_GWIKI_PARENT_PAGE, 'parent_page', 40, 250, htmlspecialchars($parent_page, ENT_QUOTES | ENT_HTML5)));
        $form->addElement(new \XoopsFormText(_MD_GWIKI_PAGE_SET_HOME, 'page_set_home', 40, 250, htmlspecialchars($page_set_home, ENT_QUOTES | ENT_HTML5)));
        $form->addElement(new \XoopsFormText(_MD_GWIKI_PAGE_SET_ORDER, 'page_set_order', 4, 10, htmlspecialchars($page_set_order, ENT_QUOTES | ENT_HTML5)));
        $form->addElement(new \XoopsFormText(_MD_GWIKI_META_KEYWORDS, 'meta_keywords', 80, 500, htmlspecialchars($meta_keywords, ENT_QUOTES | ENT_HTML5)));
        $form->addElement(new \XoopsFormTextArea(_MD_GWIKI_META_DESCRIPTION, 'meta_description', htmlspecialchars($meta_description, ENT_QUOTES | ENT_HTML5), 6, 80));
        $form->addElement(new \XoopsFormRadioYN(_MD_GWIKI_SHOW_IN_INDEX, 'show_in_index', $show_in_index));
        $form->addElement(new \XoopsFormRadioYN(_MD_GWIKI_LEAVE_INACTIVE, 'leave_inactive', (int)$leave_inactive));
        $btn_tray2 = new \XoopsFormElementTray('', ' ', 'gwikiformpage2');

        $submit_btn2 = new \XoopsFormButton('', 'submit2', _SUBMIT, 'submit');
        $submit_btn2->setExtra("onclick='prepForSubmit();'");
        $btn_tray2->addElement($submit_btn2);

        $bodydata_btn = new \XoopsFormButton('', 'bodyedit', _MD_GWIKI_EDIT_SHOW_BODY, 'button');
        $bodydata_btn->setExtra('onclick=' . "'var ele = document.getElementById(\"gwikiformmetaedit\"); ele.style.display = \"none\"; " . " var ele2 = document.getElementById(\"gwikiformbodyedit\"); ele2.style.display = \"inherit\";'");
        $btn_tray2->addElement($bodydata_btn);

        $preview_btn2 = new \XoopsFormButton('', 'preview2', _PREVIEW, 'button');
        $preview_btn2->setExtra("onclick='prepForPreview();'");
        $btn_tray2->addElement($preview_btn2);

        $cancel_btn2 = new \XoopsFormButton('', 'cancel2', _CANCEL, 'button');
        $cancel_btn2->setExtra("onclick='" . (('edit' === $op) ? 'history.back();' : 'document.location.href="index.php' . ($result ? "?page=$page" : '') . '";') . "'");
        $btn_tray2->addElement($cancel_btn2);

        $btn_tray2->addElement(new \XoopsFormLabel('', " - <strong>{$pagestatmessage}</strong>"));

        $form->addElement($btn_tray2);

        $form->assign($xoopsTpl);
        $xoopsTpl->assign('gwiki', $pageX);
        $xoopsTpl->assign('showwizard', empty($body));
        break;
}

$xoTheme->addStylesheet(XOOPS_URL . '/modules/gwiki/assets/css/module.css');
if (empty($title)) {
    $title = $xoopsModule->name();
}
$xoopsTpl->assign('xoops_pagetitle', $title);
if (!empty($message)) {
    $xoopsTpl->assign('message', htmlspecialchars($message, ENT_QUOTES | ENT_HTML5));
}
if (!empty($err_message)) {
    $xoopsTpl->assign('err_message', htmlspecialchars($err_message, ENT_QUOTES | ENT_HTML5));
}

require_once XOOPS_ROOT_PATH . '/footer.php';