Skip to content

Fix metadata rendering problem #609

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 6 commits into from
Closed
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
24 changes: 24 additions & 0 deletions _test/SearchConfig.test.php
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,30 @@ public function test_filtervars_user()
$this->assertEquals(array('user', 'test'), $searchConfig->applyFilterVars('$USER.grps$'));
}

public function test_metadata_render()
{
$searchConfig = new SearchConfig(array("limit" => 50), true);
$reflection = new \ReflectionClass(get_class($searchConfig));
$rangeVar = $reflection->getProperty('range_end');
$rangeVar->setAccessible(true);
$dynamicFilterVar = $reflection->getProperty('dynamicParameters');
$dynamicFilterVar->setAccessible(true);

$this->assertTrue($rangeVar->getValue($searchConfig) == 0);
$this->assertTrue(is_null($dynamicFilterVar->getValue($searchConfig)));
$this->assertTrue(is_null($searchConfig->getDynamicParameters()));

$searchConfig = new SearchConfig(array("limit" => 50), false);
$this->assertTrue($rangeVar->getValue($searchConfig) == 50);
$this->assertFalse(is_null($dynamicFilterVar->getValue($searchConfig)));
$this->assertFalse(is_null($searchConfig->getDynamicParameters()));

$searchConfig = new SearchConfig(array("limit" => 50));
$this->assertTrue($rangeVar->getValue($searchConfig) == 50);
$this->assertFalse(is_null($dynamicFilterVar->getValue($searchConfig)));
$this->assertFalse(is_null($searchConfig->getDynamicParameters()));
}

public function test_cacheflags()
{
$searchConfig = new SearchConfig(array());
Expand Down
4 changes: 2 additions & 2 deletions _test/mock/SearchConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

class SearchConfig extends meta\SearchConfig
{
public function applyFilterVars($filter)
public function applyFilterVars($filter, $isMetadataRender = false)
{
return parent::applyFilterVars($filter);
return parent::applyFilterVars($filter, $isMetadataRender);
}

public function determineCacheFlag($filters)
Expand Down
1 change: 0 additions & 1 deletion helper.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ class helper_plugin_struct extends DokuWiki_Plugin
* All descendants are also blacklisted.
*/
public const BLACKLIST_RENDERER = [
'Doku_Renderer_metadata',
'\renderer_plugin_qc'
];

Expand Down
39 changes: 24 additions & 15 deletions meta/SearchConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,9 @@ class SearchConfig extends Search
/**
* SearchConfig constructor.
* @param array $config The parsed configuration for this search
* @param bool $isMetadataRender If this is true, then dynamic filters will not be parsed.
*/
public function __construct($config)
public function __construct($config, $isMetadataRender=false)
{
parent::__construct();

Expand All @@ -54,19 +55,21 @@ public function __construct($config)
if (!empty($config['filters'])) $this->cacheFlag = $this->determineCacheFlag($config['filters']);

// apply dynamic paramters
$this->dynamicParameters = new SearchConfigParameters($this);
$config = $this->dynamicParameters->updateConfig($config);
if (!$isMetadataRender) {
$this->dynamicParameters = new SearchConfigParameters($this);
$config = $this->dynamicParameters->updateConfig($config);
}

// configure search from configuration
if (!empty($config['filter'])) foreach ($config['filter'] as $filter) {
$this->addFilter($filter[0], $this->applyFilterVars($filter[2]), $filter[1], $filter[3]);
$this->addFilter($filter[0], $this->applyFilterVars($filter[2], $isMetadataRender), $filter[1], $filter[3]);
}

if (!empty($config['sort'])) foreach ($config['sort'] as $sort) {
$this->addSort($sort[0], $sort[1]);
}

if (!empty($config['limit'])) {
if (!empty($config['limit']) && !$isMetadataRender) {
$this->setLimit($config['limit']);
}

Expand Down Expand Up @@ -106,12 +109,14 @@ protected function determineCacheFlag($filters)
* @param string $filter
* @return string|string[] Result may be an array when a multi column placeholder is used
*/
protected function applyFilterVars($filter)
protected function applyFilterVars($filter, $isMetadataRender=false)
{
global $INPUT;
global $INFO;
if (!isset($INFO['id'])) {
$INFO['id'] = null;

if (is_null($INFO) || $isMetadataRender) {
$pageinfo = pageinfo();
} else {
$pageinfo = $INFO;
}

// apply inexpensive filters first
Expand All @@ -124,10 +129,10 @@ protected function applyFilterVars($filter)
'$TODAY$'
),
array(
$INFO['id'],
getNS($INFO['id']),
noNS($INFO['id']),
$INPUT->server->str('REMOTE_USER'),
$pageinfo['id'],
getNS($pageinfo['id']),
noNS($pageinfo['id']),
isset($_SERVER['REMOTE_USER']) ? $_SERVER['REMOTE_USER'] : '',
date('Y-m-d')
),
$filter
Expand Down Expand Up @@ -231,11 +236,15 @@ public function getCacheFlag()
*
* Note: This call returns a clone of the parameters as they were initialized
*
* @return SearchConfigParameters
* @return SearchConfigParameters|null
*/
public function getDynamicParameters()
{
return clone $this->dynamicParameters;
if (isset($this->dynamicParameters)) {
return clone $this->dynamicParameters;
} else {
return null;
}
}

/**
Expand Down
11 changes: 9 additions & 2 deletions syntax/cloud.php
Original file line number Diff line number Diff line change
Expand Up @@ -85,15 +85,22 @@ public function handle($match, $state, $pos, Doku_Handler $handler)
*/
public function render($mode, Doku_Renderer $renderer, $data)
{
if ($mode != 'xhtml') return false;
if ($mode != "metadata" && $mode != "xhtml") return false;
if (!$data) return false;
if (!empty($data['filter'])) {
msg($this->getLang('Warning: no filters for cloud'), -1);
}
global $INFO, $conf;

if (is_null($INFO)) {
$pageinfo = pageinfo();
} else {
$pageinfo = $INFO;
}

try {
$search = new SearchCloud($data);
$cloud = new AggregationCloud($INFO['id'], $mode, $renderer, $search);
$cloud = new AggregationCloud($pageinfo['id'], $mode, $renderer, $search);
$cloud->render();
if ($mode == 'metadata') {
/** @var Doku_Renderer_metadata $renderer */
Expand Down
13 changes: 10 additions & 3 deletions syntax/list.php
Original file line number Diff line number Diff line change
Expand Up @@ -96,30 +96,37 @@ protected function checkForInvalidOptions($config)
/**
* Render xhtml output or metadata
*
* @param string $mode Renderer mode (supported modes: xhtml)
* @param string $mode Renderer mode
* @param Doku_Renderer $renderer The renderer
* @param array $data The data from the handler() function
* @return bool If rendering was successful.
*/
public function render($mode, Doku_Renderer $renderer, $data)
{
if ($mode != 'xhtml') return false;
if ($mode != "metadata" && $mode != "xhtml") return false;
if (!$data) return false;
global $INFO;
global $conf;

if (is_null($INFO) || $mode == "metadata") {
$pageinfo = pageinfo();
} else {
$pageinfo = $INFO;
}

try {
$this->checkForInvalidOptions($data);
$search = new SearchConfig($data);

/** @var AggregationList $list */
$list = new $this->tableclass($INFO['id'], $mode, $renderer, $search);
$list = new $this->tableclass($pageinfo['id'], $mode, $renderer, $search);
$list->render();

if ($mode == 'metadata') {
/** @var Doku_Renderer_metadata $renderer */
$renderer->meta['plugin']['struct']['hasaggregation'] = $search->getCacheFlag();
}

} catch (StructException $e) {
msg($e->getMessage(), -1, $e->getLine(), $e->getFile());
if ($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1);
Expand Down
24 changes: 19 additions & 5 deletions syntax/output.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

class syntax_plugin_struct_output extends DokuWiki_Syntax_Plugin
{
protected $hasBeenRendered = false;
protected $hasBeenRendered = array('metadata'=>false, 'xhtml'=>false);

protected const XHTML_OPEN = '<div id="plugin__struct_output">';
protected const XHTML_CLOSE = '</div>';
Expand Down Expand Up @@ -97,13 +97,27 @@ public function render($format, Doku_Renderer $renderer, $data)
return true;
}
}
if ($ID != $INFO['id']) return true;
if (!$INFO['exists']) return true;
if ($this->hasBeenRendered) return true;

if (!isset($INFO) || $format == "metadata") {
$pagename = pageinfo()['id'];
} else {
$pagename = $INFO['id'];
}

if ($ID != $pagename) return true;
if (!page_exists($pagename)) return true;
if ($this->hasBeenRendered['metadata'] && $format == 'metadata') return true;
if ($this->hasBeenRendered['xhtml'] && $format == 'xhtml') return true;
if (!preg_match(self::WHITELIST_ACTIONS, act_clean($ACT))) return true;

// do not render the output twice on the same page, e.g. when another page has been included
$this->hasBeenRendered = true;
if ($format == 'metadata') {
$this->hasBeenRendered['metadata'] = true;
}
else if ($format == 'xhtml') {
$this->hasBeenRendered['xhtml'] = true;
}

try {
$assignments = Assignments::getInstance();
} catch (StructException $e) {
Expand Down
2 changes: 1 addition & 1 deletion syntax/table.php
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ public function render($format, Doku_Renderer $renderer, $config)
$config = $this->addTypeFilter($config); // add type specific filters

try {
$search = new SearchConfig($config);
$search = new SearchConfig($config, $format == 'metadata');
if ($format === 'struct_csv') {
// no pagination in export
$search->setLimit(0);
Expand Down