Skip to content
Snippets Groups Projects
Commit 9c4378ad authored by André Noack's avatar André Noack
Browse files

Resolve "Impressum mit Option ausstatten: Seiten für nicht eingeloggte Nutzer...

Resolve "Impressum mit Option ausstatten: Seiten für nicht eingeloggte Nutzer ausblenden, Reihenfolge ändern, Entwurfsmodus"

Closes #3331

Merge request !2260
parent b2656cae
No related branches found
No related tags found
No related merge requests found
......@@ -12,6 +12,9 @@ class SiteinfoController extends StudipController
{
protected $with_session = true;
/**
* @var Siteinfo
*/
private $si;
/**
......@@ -25,13 +28,19 @@ class SiteinfoController extends StudipController
$this->si = new Siteinfo();
$this->populate_ids($args);
$this->add_navigation($action);
$detail = $this->si->get_detail($this->currentdetail);
$this->page_is_draft = $detail['draft_status'] ?? false;
$this->page_disabled_nobody = $detail['page_disabled_nobody'] ?? false;
if (is_object($GLOBALS['perm']) && $GLOBALS['perm']->have_perm('root')) {
$this->setupSidebar();
} else {
$action = 'show';
if ($this->page_is_draft || ($this->page_disabled_nobody && $GLOBALS['user']->id === 'nobody')) {
throw new Trails_Exception(404);
}
}
$this->add_navigation($action);
PageLayout::setTitle(_('Impressum'));
PageLayout::setTabNavigation('/footer/siteinfo');
......@@ -47,11 +56,11 @@ class SiteinfoController extends StudipController
if (isset($args[1]) && is_numeric($args[1])) {
$this->currentdetail = $args[1];
} else {
$this->currentdetail = $this->si->first_detail_id($args[0]);
$this->currentdetail = $this->si->first_detail_id($args[0], !$GLOBALS['perm']->have_perm('root'), $GLOBALS['user']->id === 'nobody');
}
} else {
$this->currentrubric = $this->si->first_rubric_id();
$this->currentdetail = $this->si->first_detail_id();
$this->currentdetail = $this->si->first_detail_id(null, !$GLOBALS['perm']->have_perm('root'), $GLOBALS['user']->id === 'nobody');
}
}
......@@ -67,20 +76,16 @@ class SiteinfoController extends StudipController
}
foreach ($this->si->get_all_details() as $detail) {
$detail[2] = language_filter($detail[2]);
if ($detail[2] == '') {
$detail[2] = _('unbenannt');
if ((!$GLOBALS['perm']->have_perm('root') && $detail['draft_status'])
|| ($detail['page_disabled_nobody'] && $GLOBALS['user']->id === 'nobody')) {
continue;
}
// check draft status and possibly hide site in navigation
if ($detail[3] == 1 && $GLOBALS['perm']->have_perm('root')) {
Navigation::addItem('/footer/siteinfo/'.$detail[1].'/'.$detail[0],
new Navigation($detail[2], $this->url_for('siteinfo/show/'.$detail[1].'/'.$detail[0])));
} else if ($detail[3] != 1) {
Navigation::addItem('/footer/siteinfo/'.$detail[1].'/'.$detail[0],
new Navigation($detail[2], $this->url_for('siteinfo/show/'.$detail[1].'/'.$detail[0])));
$detail['name'] = language_filter($detail['name']);
if ($detail['name'] == '') {
$detail['name'] = _('unbenannt');
}
Navigation::addItem('/footer/siteinfo/'.$detail['rubric_id'].'/'.$detail['detail_id'],
new Navigation($detail['name'], $this->url_for('siteinfo/show/'.$detail['rubric_id'].'/'.$detail['detail_id'])));
}
if ($action != 'new') {
......@@ -96,7 +101,7 @@ class SiteinfoController extends StudipController
{
$sidebar = Sidebar::get();
if (empty($GLOBALS['rubrics_empty'])) {
if (count($this->si->get_all_rubrics())) {
$actions = new ActionsWidget();
$actions->setTitle(_('Seiten-Aktionen'));
......@@ -140,11 +145,15 @@ class SiteinfoController extends StudipController
throw new AccessDeniedException();
}
$this->output = $this->si->get_detail_content_processed($this->currentdetail);
if ($this->page_is_draft) {
PageLayout::postInfo(_('Diese Seite befindet sich im Entwurfsmodus und ist daher noch unsichtbar.'));
}
}
public function new_action($givenrubric = null)
{
$this->edit_rubric = false;
$GLOBALS['perm']->check('root');
$this->edit_rubric = null;
if ($givenrubric === null) {
Navigation::addItem('/footer/siteinfo/rubric_new',
new AutoNavigation(_('Neue Rubrik'),
......@@ -160,48 +169,70 @@ class SiteinfoController extends StudipController
public function edit_action($givenrubric = null, $givendetail = null)
{
$this->edit_rubric = false;
$GLOBALS['perm']->check('root');
$this->edit_rubric = null;
if (is_numeric($givendetail)) {
$this->rubrics = $this->si->get_all_rubrics();
$this->rubric_id = $this->si->rubric_for_detail($this->currentdetail);
$this->detail_name = $this->si->get_detail_name($this->currentdetail);
$this->content = $this->si->get_detail_content($this->currentdetail);
$this->draft_status = $this->si->get_detail_draft_status($this->currentdetail);
$detail = $this->si->get_detail($this->currentdetail);
$this->rubric_id = $detail['rubric_id'];
$this->detail_name = $detail['name'];
$this->content = $detail['content'];
$this->draft_status = $detail['draft_status'];
$this->page_disabled_nobody = $detail['page_disabled_nobody'];
$this->page_position = $detail['position'];
} else {
$this->edit_rubric = true;
$this->rubric_id = $this->currentrubric;
}
$this->rubric_name = $this->si->rubric_name($this->currentrubric);
$rubric = $this->si->rubric($this->currentrubric);
$this->rubric_name = $rubric['name'];
$this->rubric_position = $rubric['position'];
}
public function save_action()
{
$GLOBALS['perm']->check('root');
CSRFProtection::verifyUnsafeRequest();
$detail_name = Request::get('detail_name');
$rubric_name = Request::get('rubric_name');
$content = Request::get('content');
$rubric_id = Request::int('rubric_id');
$detail_id = Request::int('detail_id');
$draft_status = Request::get('draft_status');
$draft_status = Request::submitted('draft_status');
$page_disabled_nobody = Request::submitted('page_disabled_nobody');
$page_position = Request::int('page_position');
$rubric_position = Request::int('rubric_position');
if ($rubric_id) {
if ($detail_id) {
list($rubric, $detail) = $this->si->save('update_detail', compact('rubric_id', 'detail_name', 'content', 'detail_id', 'draft_status'));
list($rubric, $detail) = $this->si->save('update_detail', compact('rubric_id', 'detail_name', 'content', 'detail_id', 'draft_status', 'page_disabled_nobody', 'page_position'));
} else {
if ($content) {
list($rubric, $detail) = $this->si->save('insert_detail', compact('rubric_id', 'detail_name','content', 'draft_status'));
if (isset($content)) {
if (!$page_position) {
$page_position = $this->si->get_detail_max_position($rubric_id) + 1;
}
list($rubric, $detail) = $this->si->save('insert_detail', compact('rubric_id', 'detail_name','content', 'draft_status', 'page_disabled_nobody', 'page_position'));
} else {
list($rubric, $detail) = $this->si->save('update_rubric', compact('rubric_id', 'rubric_name'));
list($rubric, $detail) = $this->si->save('update_rubric', compact('rubric_id', 'rubric_name', 'rubric_position'));
}
}
} else {
list($rubric, $detail) = $this->si->save('insert_rubric', compact('rubric_name'));
if (!$rubric_position) {
$rubric_position = $this->si->get_rubric_max_position() + 1;
}
list($rubric, $detail) = $this->si->save('insert_rubric', compact('rubric_name', 'rubric_position'));
}
$this->redirect('siteinfo/show/' . $rubric . '/' . $detail);
}
public function delete_action($givenrubric = null, $givendetail = null, $execute = false)
{
$GLOBALS['perm']->check('root');
if ($execute) {
CSRFProtection::verifyUnsafeRequest();
if ($givendetail === 'all') {
$this->si->delete('rubric', $this->currentrubric);
$this->redirect('siteinfo/show/');
......
......@@ -4,9 +4,9 @@ use Studip\Button, Studip\LinkButton;
?>
<div class="white" style="padding: 1ex;">
<? if (!$execute): ?>
<? if (empty($execute)): ?>
<div style="text-align: center;padding: 10px;">
<? if ($detail) :?>
<? if (!empty($detail)) :?>
<p><?= _("Wollen Sie die Seite wirklich löschen?") ?></p>
<? else : ?>
<p><?= _("Wollen Sie die Rubrik mit allen Seiten wirklich löschen?") ?></p>
......@@ -17,8 +17,11 @@ use Studip\Button, Studip\LinkButton;
$abort_url = 'siteinfo/show/'.$currentrubric;
$abort_url .= $detail ? "/".$currentdetail : '';
?>
<?= LinkButton::create(_('Löschen'), $controller->url_for($delete_url)) ?>
<form method="POST" action="<?=$controller->link_for($delete_url)?>">
<?=CSRFProtection::tokenTag() ?>
<?= Button::create(_('Löschen')) ?>
<?= LinkButton::createCancel(_('Abbrechen'), $controller->url_for($abort_url)) ?>
</form>
</div>
<div>
<hr>
......
......@@ -7,19 +7,23 @@ use Studip\Button, Studip\LinkButton;
<?= CSRFProtection::tokenTag() ?>
<fieldset>
<legend>
<? if ($edit_rubric): ?>
<? if(isset($edit_rubric)): ?>
<?= _('Rubrik bearbeiten') ?>
<? else : ?>
<?= _('Seite bearbeiten') ?>
<? endif ?>
</legend>
<? if ($edit_rubric): ?>
<? if(isset($edit_rubric)): ?>
<input type="hidden" name="rubric_id" value="<?= htmlReady($rubric_id) ?>">
<label>
<?= _('Titel der Rubrik')?>
<input type="text" name="rubric_name" id="rubric_name" value="<?= htmlReady($rubric_name) ?>">
</label>
<label>
<?= _('Position der Rubrik') ?>
<input type="number" name="rubric_position" id="rubric_position" value="<?= (int)$rubric_position ?>">
</label>
<? else: ?>
<label>
<?= _('Rubrik-Zuordnung')?>
......@@ -38,10 +42,20 @@ use Studip\Button, Studip\LinkButton;
</label>
<label>
<input type="checkbox" name="draft_status" id="draft_status" value="1" <?= $draft_status ? 'checked' : ''?>>
<input type="checkbox" name="draft_status" id="draft_status" <?= $draft_status ? 'checked' : ''?>>
<?= _('Entwurfsmodus (nur sichtbar für root)') ?>
</label>
<label>
<input type="checkbox" name="page_disabled_nobody" id="page_disabled_nobody" <?= $page_disabled_nobody ? 'checked' : ''?>>
<?= _('Seite nicht anzeigen für nicht angemeldete Benutzer') ?>
</label>
<label>
<?= _('Position der Seite') ?>
<input type="number" name="page_position" id="page_position" value="<?= (int)$page_position ?>">
</label>
<label>
<?= _('Seiteninhalt')?>
<textarea style="height: 15em;" name="content" id="content" class="size-l wysiwyg"><?= wysiwygReady($content) ?></textarea>
......@@ -57,6 +71,6 @@ use Studip\Button, Studip\LinkButton;
</footer>
</form>
<? if (!$edit_rubric): ?>
<? if(!isset($edit_rubric)): ?>
<?= $this->render_partial('siteinfo/help.php') ?>
<? endif; ?>
......@@ -11,18 +11,22 @@ use Studip\Button, Studip\LinkButton;
<fieldset>
<legend>
<? if($edit_rubric): ?>
<? if(isset($edit_rubric)): ?>
<?= _('Neue Rubrik anlegen') ?>
<? else : ?>
<?= _('Neue Seite anlegen') ?>
<? endif ?>
</legend>
<? if($edit_rubric): ?>
<? if(isset($edit_rubric)): ?>
<label>
<?= _('Titel der Rubrik') ?>
<input type="text" name="rubric_name" id="rubric_name">
</label>
<label>
<?= _('Position der Rubrik') ?>
<input type="number" name="rubric_position" id="rubric_position">
</label>
<? else: ?>
<label>
<?= _('Rubrik-Zuordnung') ?>
......@@ -39,13 +43,23 @@ use Studip\Button, Studip\LinkButton;
</label>
<label>
<input type="checkbox" name="draft_status" id="draft_status" value="1" <?= $draft_status ? 'checked' : ''?>>
<input type="checkbox" name="draft_status" id="draft_status" checked>
<?= _('Entwurfsmodus (nur sichtbar für root)') ?>
</label>
<label>
<input type="checkbox" name="page_disabled_nobody" id="page_disabled_nobody">
<?= _('Seite nicht anzeigen für nicht angemeldete Benutzer') ?>
</label>
<label>
<?= _('Position der Seite') ?>
<input type="number" name="page_position" id="page_position">
</label>
<label>
<?= _('Seiteninhalt') ?>
<textarea style="width: 90%;height: 15em;" name="content" id="content"></textarea><br>
<textarea style="width: 90%;height: 15em;" class="add_toolbar size-l wysiwyg" name="content" id="content"></textarea><br>
</label>
<? endif ?>
</fieldset>
......@@ -56,6 +70,6 @@ use Studip\Button, Studip\LinkButton;
</footer>
</form>
<? if(!$edit_rubric): ?>
<? if(!isset($edit_rubric)): ?>
<?= $this->render_partial('siteinfo/help') ?>
<? endif ?>
<?php
final class AddSiteinfoOptions extends Migration
{
public function description()
{
return 'adds options for siteinfo pages';
}
public function up()
{
$db = DBManager::get();
$db->exec("
ALTER TABLE `siteinfo_details`
ADD `page_disabled_nobody` TINYINT NOT NULL DEFAULT '0' AFTER `draft_status`
");
$position = 1;
foreach($db->fetchFirst("SELECT rubric_id
FROM siteinfo_rubrics
ORDER BY position, rubric_id ASC") as $rubric_id) {
$db->execute("UPDATE siteinfo_rubrics SET position=? WHERE rubric_id=?", [$position++, $rubric_id]);
$page_position = 1;
foreach($db->fetchFirst("SELECT detail_id
FROM siteinfo_details
WHERE rubric_id = ?
ORDER BY position, detail_id ASC", [$rubric_id]) as $detail_id) {
$db->execute("UPDATE siteinfo_details SET position=? WHERE detail_id=?", [$page_position++, $detail_id]);
}
}
}
public function down()
{
DBManager::get()->exec("
ALTER TABLE `siteinfo_details`
DROP `page_disabled_nobody`
");
}
}
......@@ -9,7 +9,7 @@ class AddSiteinfoDraftField extends Migration {
public function up()
{
DBManager::get()->exec("ALTER TABLE `siteinfo_details` ADD `draft_status` TINYINT(1) AFTER `position`");
DBManager::get()->exec("ALTER TABLE `siteinfo_details` ADD `draft_status` TINYINT NOT NULL DEFAULT '0' AFTER `position`");
}
public function down()
......
......@@ -49,6 +49,7 @@ class Siteinfo {
}
}
public function get_detail_draft_status($id) {
$sql = "SELECT draft_status
FROM siteinfo_details
......@@ -59,14 +60,14 @@ class Siteinfo {
return $statement->fetchColumn();
}
function get_detail_name($id) {
$sql = "SELECT name
function get_detail($id) {
$sql = "SELECT *
FROM siteinfo_details
WHERE detail_id = :id";
$statement = DBManager::get()->prepare($sql);
$statement->bindValue(':id', $id, PDO::PARAM_INT);
$statement->execute();
return $statement->fetchColumn();
return $statement->fetch(PDO::FETCH_ASSOC);
}
function get_detail_content_processed($id) {
......@@ -76,18 +77,25 @@ class Siteinfo {
}
function get_all_details() {
$sql = "SELECT detail_id, rubric_id, name, draft_status
$sql = "SELECT *
FROM siteinfo_details
ORDER BY position, detail_id ASC";
$result = $this->db->query($sql);
return $result->fetchAll();
}
function first_detail_id($rubric = NULL) {
function first_detail_id($rubric = null, $nodraft = null, $nobody = null) {
$rubric_id = $rubric ?: $this->first_rubric_id();
$sql = "SELECT detail_id
FROM siteinfo_details
WHERE rubric_id = IFNULL(?, rubric_id)
WHERE rubric_id = IFNULL(?, rubric_id)";
if ($nodraft) {
$sql .= " AND draft_status = 0 ";
}
if ($nobody) {
$sql .= " AND page_disabled_nobody = 0 ";
}
$sql .= "
ORDER BY position, detail_id ASC
LIMIT 1";
$statement = DBManager::get()->prepare($sql);
......@@ -98,7 +106,7 @@ class Siteinfo {
}
function get_all_rubrics() {
$sql = "SELECT rubric_id, name
$sql = "SELECT rubric_id, name, position
FROM siteinfo_rubrics
ORDER BY position, rubric_id ASC";
$result = $this->db->query($sql);
......@@ -130,24 +138,37 @@ class Siteinfo {
return $statement->fetchColumn();
}
function rubric_name($id) {
$sql = "SELECT name
function rubric($id) {
$sql = "SELECT *
FROM siteinfo_rubrics
WHERE rubric_id = :id";
$statement = DBManager::get()->prepare($sql);
$statement->bindValue(':id', $id, PDO::PARAM_INT);
$statement->execute();
return $statement->fetchColumn();
return $statement->fetch(PDO::FETCH_ASSOC);
}
function get_rubric_max_position()
{
return DBManager::get()->fetchColumn("SELECT MAX(position) FROM siteinfo_rubrics");
}
function get_detail_max_position($rubric_id)
{
return DBManager::get()->fetchColumn("SELECT MAX(position) FROM siteinfo_details WHERE rubric_id=?", [$rubric_id]);
}
function save($type, $input) {
//distinguish the subject and the action (modification/insertion)
$rubric = '';
$detail = '';
switch ($type) {
case 'update_detail':
$old_detail = $this->get_detail($input['detail_id']);
$query = "UPDATE siteinfo_details
SET rubric_id = :rubric_id, name = :name, content = :content, draft_status = :draft_status
SET rubric_id = :rubric_id, name = :name, content = :content,
draft_status = :draft_status, position = :position, page_disabled_nobody = :page_disabled_nobody
WHERE detail_id = :detail_id";
$statement = DBManager::get()->prepare($query);
$statement->bindValue(':rubric_id', $input['rubric_id'], PDO::PARAM_INT);
......@@ -155,44 +176,55 @@ class Siteinfo {
$statement->bindValue(':content', $input['content']);
$statement->bindValue(':detail_id', $input['detail_id'], PDO::PARAM_INT);
$statement->bindValue(':draft_status', $input['draft_status']);
$statement->bindValue(':position', $input['page_position'], PDO::PARAM_INT);
$statement->bindValue(':page_disabled_nobody', $input['page_disabled_nobody'], PDO::PARAM_BOOL);
$statement->execute();
$this->renumber_details($input['rubric_id'], $input['detail_id'], $old_detail['position'] <=> $input['page_position']);
$rubric = $input['rubric_id'];
$detail = $input['detail_id'];
break;
case 'insert_detail':
$query = "INSERT INTO siteinfo_details (rubric_id, name, content, draft_status)
VALUES (:rubric_id, :name, :content, :draft_status)";
$query = "INSERT INTO siteinfo_details (rubric_id, name, content, draft_status, position, page_disabled_nobody )
VALUES (:rubric_id, :name, :content, :draft_status, :position, :page_disabled_nobody)";
$statement = DBManager::get()->prepare($query);
$statement->bindValue(':rubric_id', $input['rubric_id'], PDO::PARAM_INT);
$statement->bindValue(':name', $input['detail_name']);
$statement->bindValue(':content', $input['content']);
$statement->bindValue(':draft_status', $input['draft_status']);
$statement->bindValue(':position', $input['page_position'], PDO::PARAM_INT);
$statement->bindValue(':page_disabled_nobody', $input['page_disabled_nobody'], PDO::PARAM_INT);
$statement->execute();
$detail = DBManager::get()->lastInsertId();
$this->renumber_details($input['rubric_id'], $detail, 1);
$rubric = $input['rubric_id'];
$detail = DBManager::get()->lastInsertId();
break;
case "update_rubric":
$old_rubric = $this->rubric($input['rubric_id']);
$query = "UPDATE siteinfo_rubrics
SET name = :name
SET name = :name, position = :position
WHERE rubric_id = :id";
$statement = DBManager::get()->prepare($query);
$statement->bindValue(':name', $input['rubric_name']);
$statement->bindValue(':id', $input['rubric_id'], PDO::PARAM_INT);
$statement->bindValue(':position', $input['rubric_position'], PDO::PARAM_INT);
$statement->execute();
$this->renumber_rubrics($input['rubric_id'], $old_rubric['position'] <=> $input['rubric_position']);
$rubric = $input['rubric_id'];
$detail = $this->first_detail_id($rubric);
break;
case "insert_rubric":
$query = "INSERT INTO siteinfo_rubrics (name)
VALUES (:name)";
$query = "INSERT INTO siteinfo_rubrics (name, position)
VALUES (:name, :position)";
$statement = DBManager::get()->prepare($query);
$statement->bindValue(':name', $input['rubric_name']);
$statement->bindValue(':position', $input['rubric_position'], PDO::PARAM_INT);
$statement->execute();
$rubric = DBManager::get()->lastInsertId();
$this->renumber_rubrics($rubric, 1);
$detail = 0;
}
return [$rubric, $detail];
......@@ -214,6 +246,29 @@ class Siteinfo {
$statement->execute([$id]);
}
}
public function renumber_rubrics($changed = 0, $direction = 0)
{
$db = DBManager::get();
$position = 1;
foreach($db->fetchFirst("SELECT rubric_id
FROM siteinfo_rubrics
ORDER BY position, rubric_id=" . (int)$changed . ($direction > 0 ? ' desc' : ' asc')) as $rubric_id) {
$db->execute("UPDATE siteinfo_rubrics SET position=? WHERE rubric_id=?", [$position++, $rubric_id]);
}
}
public function renumber_details($rubric_id, $changed = 0, $direction = 0)
{
$db = DBManager::get();
$page_position = 1;
foreach($db->fetchFirst("SELECT detail_id
FROM siteinfo_details
WHERE rubric_id = ?
ORDER BY position, detail_id=" . (int)$changed . ($direction > 0 ? ' desc' : ' asc'), [$rubric_id]) as $detail_id) {
$db->execute("UPDATE siteinfo_details SET position=? WHERE detail_id=?", [$page_position++, $detail_id]);
}
}
}
class SiteinfoMarkupEngine {
......
......@@ -99,13 +99,10 @@ class FooterNavigation extends Navigation
$url_parts = explode('/', $url);
$detail_id = $url_parts[4];
$si = new Siteinfo();
try {
$isdraft = $si->get_detail_draft_status($detail_id);
if ($isdraft) {
$detail = $si->get_detail($detail_id);
if (empty($detail) || !empty($detail['draft_status']) || (!empty($detail['page_disabled_nobody']) && $GLOBALS['user']->id === 'nobody')) {
return '';
}
} catch (PDOException $e) {}
}
return $url;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment