Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions assets/script.js
Original file line number Diff line number Diff line change
Expand Up @@ -354,3 +354,9 @@ var structureTweaks = function() {
return this;
};
};

$(document).on('rex:ready', function() {
if ($('#rex-structure-tweaks-startartikel-type').length) {
new structureTweaks().pageCategories();
}
});
95 changes: 54 additions & 41 deletions lib/hide_categories.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,24 @@
* @author Friends of REDAXO
*/

namespace FriendsOfREDAXO\StructureTweaks;

use Dom\HTMLDocument;
use rex;
use rex_addon;
use rex_extension;
use rex_extension_point;
use rex_plugin;
use rex_request;
use rex_response;
use rex_sql;

class structure_tweaks_hide_categories extends structure_tweaks_base
{
/**
* Check page and category, hide if necessary
*/
public static function init()
public static function init(): void
{
rex_extension::register('PACKAGES_INCLUDED', function () {
if (rex_addon::get('structure')->isAvailable() &&
Expand All @@ -24,10 +36,9 @@ public static function init()
}

/**
* @param bool $non_admin
* @return array
* @return array<int, int>
*/
protected static function getHiddenCategories($non_admin = false)
protected static function getHiddenCategories(bool $non_admin = false): array
{
if ($non_admin) {
$type = 'hide_categories_non_admin';
Expand All @@ -39,17 +50,15 @@ protected static function getHiddenCategories($non_admin = false)
}

/**
* EP CALLBACK
* @param rex_extension_point $ep
* @return string
* @param rex_extension_point<mixed> $ep
*/
public static function ep(rex_extension_point $ep)
public static function ep(rex_extension_point $ep): string
{
$subject = $ep->getSubject();

// Pass hidden categories to JavaScript
$hidden_categories = self::getHiddenCategories();
if (!empty($hidden_categories)) {
if ($hidden_categories !== []) {
if (rex_request('page', 'string') == 'structure') {
$subject .= self::getScript($hidden_categories);
}
Expand All @@ -60,7 +69,8 @@ public static function ep(rex_extension_point $ep)

// Pass hidden non-admin categories to JavaScript
$hidden_categories = self::getHiddenCategories(true);
if (!empty($hidden_categories) && !rex::getUser()->isAdmin()) {
$user = rex::requireUser();
if ($hidden_categories !== [] && !$user->isAdmin()) {
if (rex_request('page', 'string') == 'structure') {
$subject .= self::getScript($hidden_categories);
}
Expand All @@ -73,24 +83,23 @@ public static function ep(rex_extension_point $ep)
}

/**
* EP CALLBACK
* @param rex_extension_point $ep
* @return string
* @param rex_extension_point<mixed> $ep
*/
public static function epFunctions(rex_extension_point $ep)
public static function epFunctions(rex_extension_point $ep): string
{
$subject = $ep->getSubject();

// Hidden categories
$hidden_categories = self::getHiddenCategories();
if (!empty($hidden_categories)) {
if ($hidden_categories !== []) {
$subject = self::removeCategoryOptions($subject, 'category_id_new', $hidden_categories);
$subject = self::removeCategoryOptions($subject, 'category_copy_id_new', $hidden_categories);
}

// Hidden non-admin categories
$hidden_categories = self::getHiddenCategories(true);
if (!empty($hidden_categories) && !rex::getUser()->isAdmin()) {
$user = rex::requireUser();
if ($hidden_categories !== [] && !$user->isAdmin()) {
$subject = self::removeCategoryOptions($subject, 'category_id_new', $hidden_categories);
$subject = self::removeCategoryOptions($subject, 'category_copy_id_new', $hidden_categories);
}
Expand All @@ -99,58 +108,62 @@ public static function epFunctions(rex_extension_point $ep)
}

/**
* @param array $hidden_categories
* @return string
* @param array<int, int> $hidden_categories
*/
protected static function getScript($hidden_categories)
protected static function getScript(array $hidden_categories): string
{
return '
<script>
<script nonce="' . rex_response::getNonce() . '">
$(document).on("rex:ready", function() {
let structureTweaks_hideCategoryRows = new structureTweaks();
structureTweaks_hideCategoryRows.setHiddenCategoryRows(\''.json_encode($hidden_categories).'\').hideCategories();
structureTweaks_hideCategoryRows.hideCategories();
const structureTweaksHideCategoryRows = new structureTweaks();
structureTweaksHideCategoryRows.setHiddenCategoryRows(\'' . json_encode($hidden_categories) . '\').hideCategories();
});
</script>
';
}

/**
* @param array $hidden_categories
* @return string
* @param array<int, int> $hidden_categories
*/
protected static function getScriptInLinkmap($hidden_categories)
protected static function getScriptInLinkmap(array $hidden_categories): string
{
return '
<script>
<script nonce="' . rex_response::getNonce() . '">
$(document).on("rex:ready", function() {
let structureTweaks_hideCategoryRows = new structureTweaks();
structureTweaks_hideCategoryRows.setHiddenCategoryRows(\''.json_encode($hidden_categories).'\').hideCategories();
structureTweaks_hideCategoryRows.hideCategoriesInLinkmap();
const structureTweaksHideCategoryRows = new structureTweaks();
structureTweaksHideCategoryRows.setHiddenCategoryRows(\'' . json_encode($hidden_categories) . '\').hideCategoriesInLinkmap();
});
</script>
';
}

/**
* @param array<int, int> $hidden_categories
*/
private static function removeCategoryOptions(string $subject, string $select_id, array $hidden_categories): string
{
libxml_use_internal_errors(true); // Disable HTML parsing warnings @see https://stackoverflow.com/questions/9149180/domdocumentloadhtml-error

$dom = new DOMDocument('1.0', 'utf-8');
$dom->loadHTML($subject);
try {
/** @phpstan-ignore-next-line PHP 8.4 DOM API is available at runtime */
$document = HTMLDocument::createFromString($subject);
} catch (\Throwable $exception) {
return $subject;
}

$element = $dom->getElementById($select_id);
$element = $document->getElementById($select_id);
if ($element) {
/** @var DOMElement $option */
$optionsToRemove = [];
foreach ($element->getElementsByTagName('option') as $option) {
if (in_array($option->getAttribute('value'), $hidden_categories)) {
$element->removeChild($option);
/** @phpstan-ignore-next-line PHP 8.4 DOM API is available at runtime */
if (in_array((int) $option->getAttribute('value'), $hidden_categories, true)) {
$optionsToRemove[] = $option;
}
}
}

libxml_use_internal_errors(false); // Enable HTML parsing warnings
foreach ($optionsToRemove as $option) {
$element->removeChild($option);
}
}

return $dom->saveHTML();
return $document->saveHtml();
}
}
73 changes: 38 additions & 35 deletions lib/pages/page_categories.php
Original file line number Diff line number Diff line change
@@ -1,11 +1,23 @@
<?php

namespace FriendsOfREDAXO\StructureTweaks;

use rex;
use rex_article;
use rex_category_select;
use rex_form;
use rex_fragment;
use rex_list;
use rex_request;
use rex_view;
use rex_sql;

class structure_tweaks_page_categories extends structure_tweaks_base
{
/**
* @return string
*/
public static function getPage()
public static function getPage(): string
{
$return = '';

Expand All @@ -29,17 +41,18 @@ public static function getPage()
/**
* @return string
*/
protected static function delete()
protected static function delete(): string
{
$sql = rex_sql::factory();
#$sql->setDebug(true);
$sql->setTable(rex::getTable(self::name()));
$sql->setWhere('id='.self::getArticleId().' LIMIT 1');

/** @phpstan-ignore-next-line delete() returns a rex_sql control object in REDAXO */
if ($sql->delete()) {
$message = rex_view::info(self::msg('deleted'));
} else {
$message = rex_view::warning($sql->getError());
$message = rex_view::warning((string) $sql->getError());
}

return $message;
Expand All @@ -48,7 +61,7 @@ protected static function delete()
/**
* @return string
*/
protected static function getTable()
protected static function getTable(): string
{
$list = rex_list::factory('SELECT * FROM '.rex::getTable(self::name()).' ORDER BY id');

Expand Down Expand Up @@ -95,7 +108,7 @@ protected static function getTable()
/**
* @return string
*/
protected static function getForm()
protected static function getForm(): string
{
$article_id = self::getArticleId();

Expand All @@ -104,14 +117,19 @@ protected static function getForm()
if (self::getFunc() == 'edit') {
$form->addParam('article_id', $article_id);
}
$form->addErrorMessage(REX_FORM_ERROR_VIOLATE_UNIQUE_KEY, self::msg('article_exists'));
$form->addErrorMessage(\REX_FORM_ERROR_VIOLATE_UNIQUE_KEY, self::msg('article_exists'));

$field = $form->addLinkmapField('article_id');
$field = $form->addSelectField('article_id');
$field->setLabel(self::msg('article_linkmap'));
$field->setAttribute('class', 'form-control selectpicker show-menu-arrow');
$field->setAttribute('data-live-search', 'true');
$field->setAttribute('data-size', '15');
$categorySelect = new rex_category_select(false, false, true, true);
$field->setSelect($categorySelect);

$field = $form->addSelectField('type');
$field->setLabel(self::msg('type'));
$field->setAttribute('class', 'form-control selectpicker');
$field->setAttribute('class', 'form-control');
$select = $field->getSelect();
$select->setSize(1);
$select->addOption('---', '');
Expand All @@ -128,65 +146,50 @@ protected static function getForm()
$field = $form->addTextField('label');
$field->setLabel(self::msg('splitter_label'));

$form->addRawField('
<script>
$(function() {
var structureTweaks_pageCategories = new structureTweaks();
structureTweaks_pageCategories.pageCategories();
});
</script>
');

return $form->get();
Comment thread
skerbis marked this conversation as resolved.
}

/**
* @return string
*/
protected static function getFunc()
protected static function getFunc(): string
{
return \rex_request::request('func', 'string');
}

/**
* @return int
*/
protected static function getArticleId()
protected static function getArticleId(): int
{
return \rex_request::request('article_id', 'int');
}

/**
* EP CALLBACK
* @param array $p
* @return string
* @param array{list: rex_list} $p
*/
public static function getArticleName($p)
public static function getArticleName(array $p): string
{
/** @var rex_list $list */
$list = $p["list"];

$article = rex_article::get($list->getValue("article_id"));
$article = rex_article::get((int) $list->getValue('article_id'));

if ($article instanceof rex_article) {
$return = $article->getName();
} else {
$return = self::msg('article_not_found');
if (!$article instanceof rex_article) {
return self::msg('article_not_found');
}

return $return;
return $article->getName();
}

/**
* EP CALLBACK
* @param array $p
* @return string
* @param array{list: rex_list} $p
*/
public static function getType($p)
public static function getType(array $p): string
{
/** @var rex_list $list */
$list = $p["list"];
$type = $list->getValue("type");
$type = (string) $list->getValue('type');

$text = [
'' => '---',
Expand All @@ -201,6 +204,6 @@ public static function getType($p)
'split_category' => self::msg('split_category'),
];

return $text[$type];
return $text[$type] ?? '---';
}
}
Loading