mambax7/gwiki

View on GitHub
sortpageset.php

Summary

Maintainability
A
2 hrs
Test Coverage
<?php

/**
 * sortpageset.php - change order of pages within a page set
 *
 * @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';
global $xoTheme, $xoopsTpl;
global $wikiPage;
$GLOBALS['xoopsOption']['template_main'] = 'gwiki_view.tpl';
require_once XOOPS_ROOT_PATH . '/header.php';
$currentscript = basename(__FILE__);
require_once XOOPS_ROOT_PATH . '/class/xoopsformloader.php';

$page_set_home   = '';
$display_keyword = '';

/**
 * @param $page
 *
 * @return bool
 */
function fetchPageSet($page)
{
    global $xoopsDB, $wikiPage, $page_set_home, $display_keyword;

    $q_page = $wikiPage->escapeForDB($page);

    $pageset = false;

    $sql = 'SELECT gwiki_id, keyword, display_keyword, page_set_home, page_set_order';
    $sql .= ' FROM ' . $xoopsDB->prefix('gwiki_pages');
    $sql .= " WHERE active=1 and keyword='{$q_page}' ";

    $result = $xoopsDB->query($sql);

    $rows = $xoopsDB->getRowsNum($result);
    if ($rows) {
        $row = $xoopsDB->fetchArray($result);
        if (!empty($row['page_set_home'])) {
            $page            = $row['page_set_home']; // this is passed back up to caller!
            $page_set_home   = $row['page_set_home'];
            $display_keyword = $row['display_keyword'];
            $q_page          = $wikiPage->escapeForDB($row['page_set_home']);
            $xoopsDB->freeRecordSet($result);
            $sql = 'SELECT gwiki_id, keyword, display_keyword, page_set_home, page_set_order ';
            $sql .= ' FROM ' . $xoopsDB->prefix('gwiki_pages');
            $sql .= " WHERE active=1 and page_set_home='{$q_page}' ";
            $sql .= ' ORDER BY page_set_order, keyword ';

            $result = $xoopsDB->query($sql);
            while (false !== ($row = $xoopsDB->fetchArray($result))) {
                $row['display_keyword'] = strip_tags($row['display_keyword']);
                if ($row['page_set_home'] === $row['keyword']) {
                    $display_keyword = $row['display_keyword'];
                }
                $pageset[$row['gwiki_id'] . ''] = $row;
            }
        }
    }
    $xoopsDB->freeRecordSet($result);

    return $pageset;
}

// $_GET variables we use
$page = '';
if (Request::hasVar('page', 'POST')) {
    $page = cleaner($_POST['page']);
} elseif (Request::hasVar('page', 'GET')) {
    $page = cleaner($_GET['page']);
}
$page = $wikiPage->normalizeKeyword(!empty($page) ? $page : $wikiPage->wikiHomePage);

$selectalert = _MD_GWIKI_SORT_PAGE_SELECT;
$sortelement = 'sortelement';
$sort_js     = <<<ENDJSCODE
function move(f,bDir) {
  var el = f.elements["$sortelement"]
  var idx = el.selectedIndex
  if (idx==-1)
    alert("$selectalert")
  else {
    var nxidx = idx+( bDir? -1 : 1)
    if (nxidx<0) return; // nxidx=el.length-1
    if (nxidx>=el.length) return; // nxidx=0
    var oldVal = el[idx].value
    var oldText = el[idx].text
    el[idx].value = el[nxidx].value
    el[idx].text = el[nxidx].text
    el[nxidx].value = oldVal
    el[nxidx].text = oldText
    el.selectedIndex = nxidx
  }
}

function reverseorder(f) {
  var el = f.elements["$sortelement"];
  var b = 0;
  var t = el.length;
  t = t-1;
  while (b<t) {
    var oldVal = el[t].value;
    var oldText = el[t].text;
    el[t].value = el[b].value;
    el[t].text = el[b].text;
    el[b].value = oldVal;
    el[b].text = oldText;
    b = b+1;
    t = t-1;
  }
}

function processForm(f) {
  for (var i=0;i<f.length;i++) {
    var el = f[i]
    // If reorder listbox, then generate value for hidden field
    if (el.name=="$sortelement") {
      var strIDs = ""
      for (var j=0;j<f[i].options.length;j++)
        strIDs += f[i].options[j].value + ","
        f.elements['neworder'].value = strIDs.substring(0,strIDs.length-1)
    }
  }
}
ENDJSCODE;

$xoTheme->addScript(null, ['type' => 'text/javascript'], $sort_js);

$pageX = $wikiPage->getPage($page);
if (!$pageX) {
    redirect_header("index.php?page=$page", 3, _MD_GWIKI_PAGENOTFOUND);
}

// leave if we don't have admin authority
$mayEdit = $wikiPage->checkEdit();
if (!$mayEdit) {
    redirect_header("index.php?page=$page", 3, _NOPERM);
}

$pageset = $page;
$pages   = fetchPageSet($pageset);

// leave if there is nothing to sort
if (false === $pages || count($pages) < 2) {
    redirect_header("index.php?page=$page", 3, _MD_GWIKI_SORT_EMPTY);
}

$op = 'display';
if (Request::hasVar('submit', 'POST')) {
    $op = 'update';
}

if ('update' === $op) {
    if (Request::hasVar('neworder', 'POST')) {
        $neworder = [];
        $neworder = explode(',', $_POST['neworder']);
    } else {
        $op = 'display';
    }
}

if ('update' === $op) {
    foreach ($neworder as $i => $p) {
        if (isset($pages[$p])) {
            $pages[$p]['page_set_order'] = $i + 1;
        } else {
            $op = 'display';
        }
    }
}

if ('update' === $op) {
    $q_page = $wikiPage->escapeForDB($page);
    foreach ($pages as $i => $v) {
        $sql    = 'UPDATE ' . $xoopsDB->prefix('gwiki_pages');
        $sql    .= ' SET page_set_order = ' . $v['page_set_order'];
        $sql    .= ' WHERE gwiki_id = ' . $v['gwiki_id'] . " and active=1 and page_set_home='{$q_page}' ";
        $result = $xoopsDB->queryF($sql);
    }
    $pages = [];
    $pages = fetchPageSet($pageset);
    $op    = 'display';
    $pageX = $wikiPage->getPage($page); // reset current to clean up
    if (!$pageX) {
        redirect_header("index.php?page=$page", 3, _MD_GWIKI_PAGENOTFOUND);
    } // better not happen, but ...
}

$token = 0;

$caption = _MD_GWIKI_SORT_PAGE_FORM;
$form    = new \XoopsThemeForm($caption, 'form1', 'sortpageset.php', 'POST', $token);

$caption = _MD_GWIKI_SORT_PAGE_FORM;
$form->addElement(new \XoopsFormLabel($caption, '<a href="edit.php?page=' . $page_set_home . '">' . $display_keyword . '</a>', 'page_set_home'), false);

$form->addElement(new \XoopsFormHidden('page', $page_set_home));

$caption    = _MD_GWIKI_SORT_ACTIONS;
$buttontray = new \XoopsFormElementTray($caption, '');

$button_moveup = new \XoopsFormButton('', 'moveup', _MD_GWIKI_SORT_UP, 'button');
$button_moveup->setExtra('onClick="move(this.form,true)" ');
$buttontray->addElement($button_moveup);

$button_movedown = new \XoopsFormButton('', 'movedown', _MD_GWIKI_SORT_DOWN, 'button');
$button_movedown->setExtra('onClick="move(this.form,false)" ');
$buttontray->addElement($button_movedown);

$button_reverse = new \XoopsFormButton('', 'reverse', _MD_GWIKI_SORT_REVERSE, 'button');
$button_reverse->setExtra('onClick="reverseorder(this.form)" ');
$buttontray->addElement($button_reverse);

$button_submit = new \XoopsFormButton('', 'submit', _MD_GWIKI_SORT_SAVE, 'submit');
$button_submit->setExtra('onClick="processForm(this.form)" ');
$buttontray->addElement($button_submit);

$form->addElement($buttontray);

// XoopsFormSelect( string $caption, string $name, [mixed $value = null], [int $size = 1], [bool $multiple = false])
$listbox = new \XoopsFormSelect(_MD_GWIKI_SORT_PAGES, 'sortelement', null, count($pages), false);
foreach ($pages as $i => $v) {
    $listbox->addOption($i, $v['display_keyword']);
}
$form->addElement($listbox);

$form->addElement($buttontray);

$form->addElement(new \XoopsFormHidden('neworder', ''));
$body = $form->render();

$title = _MD_GWIKI_SORT_PAGE_FORM;
$xoopsTpl->assign('xoops_pagetitle', $title);

$dir                = basename(__DIR__);
$pageX['moddir']    = $dir;
$pageX['modpath']   = XOOPS_ROOT_PATH . '/modules/' . $dir;
$pageX['modurl']    = XOOPS_URL . '/modules/' . $dir;
$pageX['mayEdit']   = $mayEdit;
$pageX['pageFound'] = true;

$pageX['body'] = $body;

$pageX['title'] = $title;
$xoopsTpl->assign('gwiki', $pageX);
$xoTheme->addStylesheet(XOOPS_URL . '/modules/gwiki/assets/css/module.css');

if (isset($message)) {
    $xoopsTpl->assign('message', $message);
}
if (isset($err_message)) {
    $xoopsTpl->assign('err_message', $err_message);
}
if (isset($debug)) {
    $xoopsTpl->assign('debug', $debug);
}

require_once XOOPS_ROOT_PATH . '/footer.php';