summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/Helper/Hook.php20
-rw-r--r--app/Template/layout.php3
-rw-r--r--doc/plugins.markdown29
-rw-r--r--tests/units/Helper/HookHelperTest.php36
4 files changed, 87 insertions, 1 deletions
diff --git a/app/Helper/Hook.php b/app/Helper/Hook.php
index d7fe3d34..bf879878 100644
--- a/app/Helper/Hook.php
+++ b/app/Helper/Hook.php
@@ -11,6 +11,26 @@ namespace Helper;
class Hook extends \Core\Base
{
/**
+ * Add assets JS or CSS
+ *
+ * @access public
+ * @param string $type
+ * @param string $hook
+ * @param array $variables
+ * @return string
+ */
+ public function asset($type, $hook)
+ {
+ $buffer = '';
+
+ foreach ($this->hook->getListeners($hook) as $file) {
+ $buffer .= $this->helper->asset->$type($file);
+ }
+
+ return $buffer;
+ }
+
+ /**
* Render all attached hooks
*
* @access public
diff --git a/app/Template/layout.php b/app/Template/layout.php
index 49ac2a08..cba8d2a3 100644
--- a/app/Template/layout.php
+++ b/app/Template/layout.php
@@ -21,6 +21,9 @@
<?= $this->asset->css('assets/css/print.css', true, 'print') ?>
<?= $this->asset->customCss() ?>
+ <?= $this->hook->asset('css', 'template:layout:css') ?>
+ <?= $this->hook->asset('js', 'template:layout:js') ?>
+
<link rel="icon" type="image/png" href="<?= $this->url->dir() ?>assets/img/favicon.png">
<link rel="apple-touch-icon" href="<?= $this->url->dir() ?>assets/img/touch-icon-iphone.png">
<link rel="apple-touch-icon" sizes="72x72" href="<?= $this->url->dir() ?>assets/img/touch-icon-ipad.png">
diff --git a/doc/plugins.markdown b/doc/plugins.markdown
index cccda796..1f04374f 100644
--- a/doc/plugins.markdown
+++ b/doc/plugins.markdown
@@ -154,6 +154,34 @@ List of merge hooks:
- `$start` Calendar start date (string, ISO-8601 format)
- `$end` Calendar end date (string, ISO-8601 format)
+Asset Hooks
+-----------
+
+Asset hooks can be used to add easily a new stylesheet or a new javascript file in the layout. You can use this feature to create a theme and override all Kanboard default styles.
+
+Example to add a new stylesheet:
+
+```php
+<?php
+
+namespace Plugin\Css;
+
+use Core\Plugin\Base;
+
+class Plugin extends Base
+{
+ public function initialize()
+ {
+ $this->hook->on('template:layout:css', 'plugins/Css/skin.css');
+ }
+}
+```
+
+List of asset Hooks:
+
+- `template:layout:css`
+- `template:layout:js`
+
Template hooks
--------------
@@ -338,3 +366,4 @@ Examples of plugins
- [User timetable](https://github.com/kanboard/plugin-timetable)
- [Subtask Forecast](https://github.com/kanboard/plugin-subtask-forecast)
- [Theme plugin sample](https://github.com/kanboard/plugin-example-theme)
+- [CSS plugin sample](https://github.com/kanboard/plugin-example-css)
diff --git a/tests/units/Helper/HookHelperTest.php b/tests/units/Helper/HookHelperTest.php
index 6661c90b..7745c674 100644
--- a/tests/units/Helper/HookHelperTest.php
+++ b/tests/units/Helper/HookHelperTest.php
@@ -37,4 +37,38 @@ class HookHelperTest extends Base
$h->attach('test', 'tpl2');
$this->assertEquals('tpl1_contenttpl2_content', $h->render('test'));
}
-} \ No newline at end of file
+
+ public function testAssetHooks()
+ {
+ $this->container['helper']->asset = $this
+ ->getMockBuilder('\Helper\Asset')
+ ->setConstructorArgs(array($this->container))
+ ->setMethods(array('css', 'js'))
+ ->getMock();
+
+ $this->container['helper']
+ ->asset
+ ->expects($this->at(0))
+ ->method('css')
+ ->with(
+ $this->equalTo('skin.css')
+ )
+ ->will($this->returnValue('<link rel="stylesheet" href="skin.css"></link>'));
+
+ $this->container['helper']
+ ->asset
+ ->expects($this->at(1))
+ ->method('js')
+ ->with(
+ $this->equalTo('skin.js')
+ )
+ ->will($this->returnValue('<script src="skin.js"></script>'));
+
+ $h = new Hook($this->container);
+ $h->attach('test1', 'skin.css');
+ $h->attach('test2', 'skin.js');
+
+ $this->assertContains('<link rel="stylesheet" href="skin.css"></link>', $h->asset('css', 'test1'));
+ $this->assertContains('<script src="skin.js"></script>', $h->asset('js', 'test2'));
+ }
+}