165 lines
5.7 KiB
PHP
165 lines
5.7 KiB
PHP
<?php
|
|
|
|
/**
|
|
* DataTables Action Plugin
|
|
*
|
|
* Add DataTables support to DokuWiki
|
|
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
|
|
* @author Giuseppe Di Terlizzi <giuseppe.diterlizzi@gmail.com>
|
|
* @copyright (C) 2015-2020, Giuseppe Di Terlizzi
|
|
*/
|
|
class action_plugin_datatables extends DokuWiki_Action_Plugin
|
|
{
|
|
const ASSET_DIR = __DIR__ . '/assets';
|
|
const ASSET_URL = DOKU_BASE . 'lib/plugins/datatables/assets';
|
|
|
|
|
|
/**
|
|
* Register events
|
|
*
|
|
* @param Doku_Event_Handler $controller
|
|
*/
|
|
public function register(Doku_Event_Handler $controller)
|
|
{
|
|
$controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'datatables');
|
|
$controller->register_hook('DOKUWIKI_STARTED', 'AFTER', $this, 'jsinfo');
|
|
}
|
|
|
|
/**
|
|
* Set config for DataTables in JSINFO
|
|
*
|
|
* @param Doku_Event $event DOKUWIKI_STARTED
|
|
* @param mixed $param
|
|
* @return void
|
|
*/
|
|
public function jsinfo(Doku_Event $event, $param)
|
|
{
|
|
global $JSINFO;
|
|
|
|
// default config
|
|
$datatables_config = [
|
|
'config' => [
|
|
'dom' => 'lBfrtip'
|
|
],
|
|
'enableForAllTables' => $this->getConf('enableForAllTables'),
|
|
'enableColumnFilters' => $this->getConf('enableColumnFilters'),
|
|
'columnFiltersPosition' => $this->getConf('columnFiltersPosition'),
|
|
];
|
|
|
|
// find a matching language file
|
|
foreach ($this->getLangPath() as $path) {
|
|
if (file_exists(self::ASSET_DIR . '/' . $path)) {
|
|
$datatables_config['config']['language']['url'] = self::ASSET_URL . '/' . $path;
|
|
break;
|
|
}
|
|
}
|
|
|
|
$JSINFO['plugin']['datatables'] = $datatables_config;
|
|
}
|
|
|
|
/**
|
|
* Add DataTables scripts and styles
|
|
*
|
|
* @param Doku_Event $event TPL_METAHEADER_OUTPUT
|
|
*/
|
|
public function datatables(Doku_Event $event, $param)
|
|
{
|
|
|
|
global $ID;
|
|
global $conf;
|
|
|
|
$excluded_pages = $this->getConf('excludedPages');
|
|
|
|
if (!empty($excluded_pages) && (bool)preg_match("/$excluded_pages/", $ID)) {
|
|
return;
|
|
}
|
|
|
|
$base_url = self::ASSET_URL;
|
|
|
|
$dt_scripts[] = "$base_url/datatables.net/js/jquery.dataTables.min.js";
|
|
|
|
$dt_scripts[] = "$base_url/datatables.net-fixedheader-dt/js/fixedHeader.dataTables.min.js";
|
|
$dt_styles[] = "$base_url/datatables.net-fixedheader-dt/css/fixedHeader.dataTables.min.css";
|
|
|
|
$dt_scripts[] = "$base_url/datatables.net-fixedcolumns-dt/js/fixedColumns.dataTables.min.js";
|
|
$dt_styles[] = "$base_url/datatables.net-fixedcolumns-dt/css/fixedColumns.dataTables.min.css";
|
|
|
|
$dt_scripts[] = "$base_url/datatables.net-buttons/js/dataTables.buttons.min.js";
|
|
$dt_scripts[] = "$base_url/datatables.net-buttons/js/buttons.html5.min.js";
|
|
$dt_scripts[] = "$base_url/datatables.net-buttons/js/buttons.print.min.js";
|
|
|
|
$dt_scripts[] = "$base_url/jszip/jszip.min.js";
|
|
$dt_scripts[] = "$base_url/pdfmake/pdfmake.min.js";
|
|
$dt_scripts[] = "$base_url/pdfmake/vfs_fonts.js";
|
|
|
|
switch ($conf['template']) {
|
|
case 'bootstrap3':
|
|
$dt_scripts[] = "$base_url/datatables.net/js/dataTables.bootstrap.min.js";
|
|
$dt_styles[] = "$base_url/datatables.net/css/dataTables.bootstrap.min.css";
|
|
$dt_scripts[] = "$base_url/datatables.net-buttons/js/buttons.bootstrap.min.js";
|
|
$dt_styles[] = "$base_url/datatables.net-buttons/css/buttons.bootstrap.min.css";
|
|
break;
|
|
default:
|
|
$dt_scripts[] = "$base_url/datatables.net/js/dataTables.jqueryui.min.js";
|
|
$dt_styles[] = "$base_url/datatables.net/css/dataTables.jqueryui.min.css";
|
|
$dt_scripts[] = "$base_url/datatables.net-buttons/js/buttons.jqueryui.min.js";
|
|
$dt_styles[] = "$base_url/datatables.net-buttons/css/buttons.jqueryui.min.css";
|
|
}
|
|
|
|
foreach ($dt_scripts as $script) {
|
|
$event->data['script'][] = [
|
|
'type' => 'text/javascript',
|
|
'src' => $script,
|
|
'defer' => 'defer',
|
|
'_data' => null,
|
|
];
|
|
}
|
|
|
|
foreach ($dt_styles as $style) {
|
|
$event->data['link'][] = [
|
|
'type' => 'text/css',
|
|
'rel' => 'stylesheet',
|
|
'href' => $style,
|
|
];
|
|
}
|
|
|
|
// Add custom plugin CSS for column filters
|
|
$event->data['link'][] = [
|
|
'type' => 'text/css',
|
|
'rel' => 'stylesheet',
|
|
'href' => DOKU_BASE . 'lib/plugins/datatables/style.css',
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Get possible language file paths for the current language
|
|
*
|
|
* @return Generator<string> Path relative to the asset locations
|
|
*/
|
|
protected function getLangPath()
|
|
{
|
|
global $conf;
|
|
[$lang, $dialect] = array_pad(explode('-', $conf['lang'], 2), 2, null);
|
|
$dialect = strtoupper($dialect);
|
|
|
|
// exact match with dialect
|
|
if ($dialect) {
|
|
yield "datatables.net-i18n/{$lang}-{$dialect}.json";
|
|
}
|
|
|
|
// exact match with language only
|
|
yield "datatables.net-i18n/{$lang}.json";
|
|
|
|
// fake dialect
|
|
$dialect = strtoupper($lang);
|
|
yield "datatables.net-i18n/{$lang}-{$dialect}.json";
|
|
|
|
// any matching language
|
|
$glob = self::ASSET_DIR . '/datatables.net-i18n/' . $lang . '*.json';
|
|
$result = glob($glob);
|
|
if ($result) {
|
|
yield 'datatables.net-i18n/' . basename($result[0]);
|
|
}
|
|
}
|
|
}
|