Fix plugin base path in core plugins
Also fix note check in archiveorg plugin, and regression on vintage template. Documentation regarding relative path has been added. Fixes #1548
This commit is contained in:
parent
0d930454a2
commit
76fe68d924
7 changed files with 61 additions and 27 deletions
|
@ -139,6 +139,20 @@ Each file contain two keys:
|
|||
|
||||
> Note: In PHP, `parse_ini_file()` seems to want strings to be between by quotes `"` in the ini file.
|
||||
|
||||
### Understanding relative paths
|
||||
|
||||
Because Shaarli is a self-hosted tool, an instance can either be installed at the root directory, or under a subfolder.
|
||||
This means that you can *never* use absolute paths (eg `/plugins/mything/file.png`).
|
||||
|
||||
If a file needs to be included in server end, use simple relative path:
|
||||
`PluginManager::$PLUGINS_PATH . '/mything/template.html'`.
|
||||
|
||||
If it needs to be included in front end side (e.g. an image),
|
||||
the relative path must be prefixed with special data `_BASE_PATH_`:
|
||||
`($data['_BASE_PATH_'] ?? '') . '/' . PluginManager::$PLUGINS_PATH . '/mything/picture.png`.
|
||||
|
||||
Note that special placeholders for CSS and JS files (respectively `css_files` and `js_files`) are already prefixed
|
||||
with the base path in template files.
|
||||
|
||||
### It's not working!
|
||||
|
||||
|
|
|
@ -20,10 +20,12 @@ function hook_archiveorg_render_linklist($data)
|
|||
$path = ($data['_BASE_PATH_'] ?? '') . '/' . PluginManager::$PLUGINS_PATH;
|
||||
|
||||
foreach ($data['links'] as &$value) {
|
||||
if ($value['private'] && preg_match('/^\?[a-zA-Z0-9-_@]{6}($|&|#)/', $value['real_url'])) {
|
||||
$isNote = startsWith($value['real_url'], '/shaare/');
|
||||
if ($value['private'] && $isNote) {
|
||||
continue;
|
||||
}
|
||||
$archive = sprintf($archive_html, $value['url'], $path, t('View on archive.org'));
|
||||
$url = $isNote ? rtrim(index_url($_SERVER), '/') . $value['real_url'] : $value['real_url'];
|
||||
$archive = sprintf($archive_html, $url, $path, t('View on archive.org'));
|
||||
$value['link_plugin'][] = $archive;
|
||||
}
|
||||
|
||||
|
|
|
@ -49,7 +49,7 @@ function hook_isso_render_linklist($data, $conf)
|
|||
$isso = sprintf($issoHtml, $issoUrl, $issoUrl, $link['id'], $link['id']);
|
||||
$data['plugin_end_zone'][] = $isso;
|
||||
} else {
|
||||
$button = '<span><a href="?%s#isso-thread">';
|
||||
$button = '<span><a href="'. ($data['_BASE_PATH_'] ?? '') . '/shaare/%s#isso-thread">';
|
||||
// For the default theme we use a FontAwesome icon which is better than an image
|
||||
if ($conf->get('resource.theme') === 'default') {
|
||||
$button .= '<i class="linklist-plugin-icon fa fa-comment"></i>';
|
||||
|
|
|
@ -42,7 +42,7 @@ function hook_qrcode_render_linklist($data)
|
|||
function hook_qrcode_render_footer($data)
|
||||
{
|
||||
if ($data['_PAGE_'] == TemplatePage::LINKLIST) {
|
||||
$data['js_files'][] = ($data['_BASE_PATH_'] ?? '') . '/' . PluginManager::$PLUGINS_PATH . '/qrcode/shaarli-qrcode.js';
|
||||
$data['js_files'][] = PluginManager::$PLUGINS_PATH . '/qrcode/shaarli-qrcode.js';
|
||||
}
|
||||
|
||||
return $data;
|
||||
|
@ -58,7 +58,7 @@ function hook_qrcode_render_footer($data)
|
|||
function hook_qrcode_render_includes($data)
|
||||
{
|
||||
if ($data['_PAGE_'] == TemplatePage::LINKLIST) {
|
||||
$data['css_files'][] = ($data['_BASE_PATH_'] ?? '') . '/' . PluginManager::$PLUGINS_PATH . '/qrcode/qrcode.css';
|
||||
$data['css_files'][] = PluginManager::$PLUGINS_PATH . '/qrcode/qrcode.css';
|
||||
}
|
||||
|
||||
return $data;
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
<?php
|
||||
|
||||
namespace Shaarli\Plugin\Archiveorg;
|
||||
|
||||
/**
|
||||
* PluginArchiveorgTest.php
|
||||
*/
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Shaarli\Plugin\PluginManager;
|
||||
|
||||
require_once 'plugins/archiveorg/archiveorg.php';
|
||||
|
@ -13,20 +15,35 @@ require_once 'plugins/archiveorg/archiveorg.php';
|
|||
* Class PluginArchiveorgTest
|
||||
* Unit test for the archiveorg plugin
|
||||
*/
|
||||
class PluginArchiveorgTest extends \PHPUnit\Framework\TestCase
|
||||
class PluginArchiveorgTest extends TestCase
|
||||
{
|
||||
protected $savedScriptName;
|
||||
|
||||
/**
|
||||
* Reset plugin path
|
||||
*/
|
||||
public function setUp()
|
||||
public function setUp(): void
|
||||
{
|
||||
PluginManager::$PLUGINS_PATH = 'plugins';
|
||||
|
||||
// plugins manipulate global vars
|
||||
$_SERVER['SERVER_PORT'] = '80';
|
||||
$_SERVER['SERVER_NAME'] = 'shaarli.shaarli';
|
||||
$this->savedScriptName = $_SERVER['SCRIPT_NAME'] ?? null;
|
||||
$_SERVER['SCRIPT_NAME'] = '/index.php';
|
||||
}
|
||||
|
||||
public function tearDown(): void
|
||||
{
|
||||
unset($_SERVER['SERVER_PORT']);
|
||||
unset($_SERVER['SERVER_NAME']);
|
||||
$_SERVER['SCRIPT_NAME'] = $this->savedScriptName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test render_linklist hook on external bookmarks.
|
||||
*/
|
||||
public function testArchiveorgLinklistOnExternalLinks()
|
||||
public function testArchiveorgLinklistOnExternalLinks(): void
|
||||
{
|
||||
$str = 'http://randomstr.com/test';
|
||||
|
||||
|
@ -56,16 +73,16 @@ class PluginArchiveorgTest extends \PHPUnit\Framework\TestCase
|
|||
/**
|
||||
* Test render_linklist hook on internal bookmarks.
|
||||
*/
|
||||
public function testArchiveorgLinklistOnInternalLinks()
|
||||
public function testArchiveorgLinklistOnInternalLinks(): void
|
||||
{
|
||||
$internalLink1 = 'http://shaarli.shaarli/?qvMAqg';
|
||||
$internalLinkRealURL1 = '?qvMAqg';
|
||||
$internalLink1 = 'http://shaarli.shaarli/shaare/qvMAqg';
|
||||
$internalLinkRealURL1 = '/shaare/qvMAqg';
|
||||
|
||||
$internalLink2 = 'http://shaarli.shaarli/?2_7zww';
|
||||
$internalLinkRealURL2 = '?2_7zww';
|
||||
$internalLink2 = 'http://shaarli.shaarli/shaare/2_7zww';
|
||||
$internalLinkRealURL2 = '/shaare/2_7zww';
|
||||
|
||||
$internalLink3 = 'http://shaarli.shaarli/?z7u-_Q';
|
||||
$internalLinkRealURL3 = '?z7u-_Q';
|
||||
$internalLink3 = 'http://shaarli.shaarli/shaare/z7u-_Q';
|
||||
$internalLinkRealURL3 = '/shaare/z7u-_Q';
|
||||
|
||||
$data = array(
|
||||
'title' => $internalLink1,
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
namespace Shaarli\Plugin\Isso;
|
||||
|
||||
use DateTime;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Shaarli\Bookmark\Bookmark;
|
||||
use Shaarli\Config\ConfigManager;
|
||||
use Shaarli\Plugin\PluginManager;
|
||||
|
@ -13,12 +14,12 @@ require_once 'plugins/isso/isso.php';
|
|||
*
|
||||
* Test the Isso plugin (comment system).
|
||||
*/
|
||||
class PluginIssoTest extends \PHPUnit\Framework\TestCase
|
||||
class PluginIssoTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* Reset plugin path
|
||||
*/
|
||||
public function setUp()
|
||||
public function setUp(): void
|
||||
{
|
||||
PluginManager::$PLUGINS_PATH = 'plugins';
|
||||
}
|
||||
|
@ -26,7 +27,7 @@ class PluginIssoTest extends \PHPUnit\Framework\TestCase
|
|||
/**
|
||||
* Test Isso init without errors.
|
||||
*/
|
||||
public function testIssoInitNoError()
|
||||
public function testIssoInitNoError(): void
|
||||
{
|
||||
$conf = new ConfigManager('');
|
||||
$conf->set('plugins.ISSO_SERVER', 'value');
|
||||
|
@ -37,7 +38,7 @@ class PluginIssoTest extends \PHPUnit\Framework\TestCase
|
|||
/**
|
||||
* Test Isso init with errors.
|
||||
*/
|
||||
public function testIssoInitError()
|
||||
public function testIssoInitError(): void
|
||||
{
|
||||
$conf = new ConfigManager('');
|
||||
$errors = isso_init($conf);
|
||||
|
@ -47,7 +48,7 @@ class PluginIssoTest extends \PHPUnit\Framework\TestCase
|
|||
/**
|
||||
* Test render_linklist hook with valid settings to display the comment form.
|
||||
*/
|
||||
public function testIssoDisplayed()
|
||||
public function testIssoDisplayed(): void
|
||||
{
|
||||
$conf = new ConfigManager('');
|
||||
$conf->set('plugins.ISSO_SERVER', 'value');
|
||||
|
@ -87,7 +88,7 @@ class PluginIssoTest extends \PHPUnit\Framework\TestCase
|
|||
/**
|
||||
* Test isso plugin when multiple bookmarks are displayed (shouldn't be displayed).
|
||||
*/
|
||||
public function testIssoMultipleLinks()
|
||||
public function testIssoMultipleLinks(): void
|
||||
{
|
||||
$conf = new ConfigManager('');
|
||||
$conf->set('plugins.ISSO_SERVER', 'value');
|
||||
|
@ -115,14 +116,14 @@ class PluginIssoTest extends \PHPUnit\Framework\TestCase
|
|||
|
||||
$processed = hook_isso_render_linklist($data, $conf);
|
||||
// link_plugin should be added for the icon
|
||||
$this->assertContains('<a href="?'. $short1 .'#isso-thread">', $processed['links'][0]['link_plugin'][0]);
|
||||
$this->assertContains('<a href="?'. $short2 .'#isso-thread">', $processed['links'][1]['link_plugin'][0]);
|
||||
$this->assertContains('<a href="/shaare/'. $short1 .'#isso-thread">', $processed['links'][0]['link_plugin'][0]);
|
||||
$this->assertContains('<a href="/shaare/'. $short2 .'#isso-thread">', $processed['links'][1]['link_plugin'][0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test isso plugin when using search (shouldn't be displayed).
|
||||
*/
|
||||
public function testIssoNotDisplayedWhenSearch()
|
||||
public function testIssoNotDisplayedWhenSearch(): void
|
||||
{
|
||||
$conf = new ConfigManager('');
|
||||
$conf->set('plugins.ISSO_SERVER', 'value');
|
||||
|
@ -145,13 +146,13 @@ class PluginIssoTest extends \PHPUnit\Framework\TestCase
|
|||
$processed = hook_isso_render_linklist($data, $conf);
|
||||
|
||||
// link_plugin should be added for the icon
|
||||
$this->assertContains('<a href="?'. $short1 .'#isso-thread">', $processed['links'][0]['link_plugin'][0]);
|
||||
$this->assertContains('<a href="/shaare/'. $short1 .'#isso-thread">', $processed['links'][0]['link_plugin'][0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test isso plugin without server configuration (shouldn't be displayed).
|
||||
*/
|
||||
public function testIssoWithoutConf()
|
||||
public function testIssoWithoutConf(): void
|
||||
{
|
||||
$data = 'abc';
|
||||
$conf = new ConfigManager('');
|
||||
|
|
|
@ -32,6 +32,6 @@
|
|||
</form>
|
||||
</div>
|
||||
{if="$previous_page_url"} <a href="{$previous_page_url}" class="paging_older">◄Older</a> {/if}
|
||||
<div class="paging_current">page {$page_current} / {$page_max} </div>
|
||||
{if="$page_max>1"}<div class="paging_current">page {$page_current} / {$page_max} </div>{/if}
|
||||
{if="$next_page_url"} <a href="{$next_page_url}" class="paging_newer">Newer►</a> {/if}
|
||||
</div>
|
||||
|
|
Loading…
Reference in a new issue