Robert Vogel has uploaded a new change for review. (
https://gerrit.wikimedia.org/r/397471 )
Change subject: [WIP] Add RenderFactory
......................................................................
[WIP] Add RenderFactory
Extensions should only add array-data to the SkinTemplate::data field.
The skin then decides where to render it and uses a Renderer from the factory.
The registry allows skins to override default rendering.
Change-Id: Ie151494d3624fe5c27a68458d4f34a29c1582a23
---
M extension.json
M includes/ServiceWiring.php
A src/ExtensionAttributeBasedRegistry.php
A src/IRegistry.php
A src/IRenderer.php
A src/Renderer/SimpleList.php
A src/RendererFactory.php
M src/Services.php
8 files changed, 176 insertions(+), 1 deletion(-)
git pull
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/BlueSpiceFoundation
refs/changes/71/397471/1
diff --git a/extension.json b/extension.json
index d1d1ed8..a327f0c 100644
--- a/extension.json
+++ b/extension.json
@@ -25,7 +25,19 @@
"userprofileimage":
"\\BlueSpice\\DynamicFileDispatcher\\UserProfileImage",
"articlepreviewimage":
"\\BlueSpice\\DynamicFileDispatcher\\ArticlePreviewImage"
},
- "EntityRegistry": {}
+ "EntityRegistry": {},
+ "RendererRegistry": {
+ "form": "\\BlueSpice\\Renderer\\Form",
+ "SimpleList":
"\\BlueSpice\\Renderer\\SimpleList",
+ "panel": "\\BlueSpice\\Renderer\\Panel",
+ "table": "\\BlueSpice\\Renderer\\Table",
+ "treenavigation":
"\\BlueSpice\\Renderer\\TreeNavigation"
+ },
+ "SkinDataRendererRegistry": {
+ "bs_navigation_site":
"\\BlueSpice\\Renderer\\TreeNavigation",
+ "bs_navigation_globalactions_general":
"\\BlueSpice\\Renderer\\SimpleList",
+ "bs_navigation_globalactions_admin":
"\\BlueSpice\\Renderer\\SimpleList"
+ }
}
},
"ExtensionFunctions": [
diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php
index cc15ae4..ca5bb73 100644
--- a/includes/ServiceWiring.php
+++ b/includes/ServiceWiring.php
@@ -2,6 +2,8 @@
use MediaWiki\MediaWikiServices;
+use BlueSpice\ExtensionAttributeBasedRegistry;
+
return [
'BSExtensionRegistry' => function ( MediaWikiServices $services ) {
@@ -57,4 +59,26 @@
$services->getConfigFactory()->makeConfig( 'bsg' )
);
},
+
+ 'BSRendererFactory' => function ( MediaWikiServices $services ) {
+ $registry = new ExtensionAttributeBasedRegistry(
+ 'BlueSpiceFoundationRendererRegistry'
+ );
+
+ return new \BlueSpice\RendererFactory(
+ $registry,
+ $services->getConfigFactory()->makeConfig( 'bsg' )
+ );
+ },
+
+ 'BSSkinDataRendererFactory' => function ( MediaWikiServices $services )
{
+ $registry = new ExtensionAttributeBasedRegistry(
+ 'BlueSpiceFoundationSkinDataRendererRegistry'
+ );
+
+ return new \BlueSpice\SkinDataRendererFactory(
+ $registry,
+ $services->getConfigFactory()->makeConfig( 'bsg' )
+ );
+ }
];
diff --git a/src/ExtensionAttributeBasedRegistry.php
b/src/ExtensionAttributeBasedRegistry.php
new file mode 100644
index 0000000..c02f30e
--- /dev/null
+++ b/src/ExtensionAttributeBasedRegistry.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace BlueSpice;
+
+use ExtensionRegistry;
+
+class ExtensionAttributeBasedRegistry implements IRegistry {
+
+ /**
+ *
+ * @var string
+ */
+ protected $attribName = '';
+
+ /**
+ *
+ * @var ExtensionRegistry
+ */
+ protected $extensionRegistry = null;
+
+ /**
+ *
+ * @param string $attribName
+ * @param ExtensionRegistry $extensionRegistry
+ */
+ public function __construct( $attribName, $extensionRegistry = null ) {
+ $this->attribName = $attribName;
+ $this->extensionRegistry = $extensionRegistry;
+ if( $this->extensionRegistry === null ) {
+ $this->extensionRegistry =
\ExtensionRegistry::getInstance();
+ }
+ }
+
+ /**
+ *
+ * @param string $key
+ * @param string $default
+ * @return string
+ */
+ public function getValue( $key, $default = '' ) {
+ $registry = $this->extensionRegistry->getAttribute(
$this->attribName );
+ $value = isset( $registry[$key] ) ? $registry[$key] : $default;
+
+ if( is_array( $value ) ) {
+ //Attributes get merged together instead of being
overwritten,
+ //so just take the last one
+ $value = end( $value );
+ }
+
+ return (string)$value;
+ }
+}
\ No newline at end of file
diff --git a/src/IRegistry.php b/src/IRegistry.php
new file mode 100644
index 0000000..c92da46
--- /dev/null
+++ b/src/IRegistry.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace BlueSpice;
+
+interface IRegistry {
+
+ /**
+ *
+ * @param string $key
+ * @param string $default
+ * @return string
+ */
+ public function getValue( $key, $default = '' );
+}
\ No newline at end of file
diff --git a/src/IRenderer.php b/src/IRenderer.php
new file mode 100644
index 0000000..e9e1241
--- /dev/null
+++ b/src/IRenderer.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace BlueSpice;
+
+interface IRenderer {
+ /**
+ * @return string
+ */
+ public function render();
+}
\ No newline at end of file
diff --git a/src/Renderer/SimpleList.php b/src/Renderer/SimpleList.php
new file mode 100644
index 0000000..79e8d03
--- /dev/null
+++ b/src/Renderer/SimpleList.php
@@ -0,0 +1,7 @@
+<?php
+
+namespace BlueSpice\Renderer;
+
+class SimpleList {
+
+}
\ No newline at end of file
diff --git a/src/RendererFactory.php b/src/RendererFactory.php
new file mode 100644
index 0000000..babdb5e
--- /dev/null
+++ b/src/RendererFactory.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace BlueSpice;
+
+class RendererFactory {
+
+ /**
+ *
+ * @var IRegistry
+ */
+ protected $registry = null;
+
+ /**
+ *
+ * @var \Config
+ */
+ protected $config = null;
+
+ /**
+ *
+ * @param IRegistry $registry
+ * @param \Config $config
+ */
+ public function __construct( $registry, $config ) {
+ $this->registry = $registry;
+ $this->config = $config;
+ }
+
+ /**
+ *
+ * @param string $key
+ * @param array|mixed $data
+ * @return IRenderer
+ */
+ public function get( $key, $data ) {
+ $className = $this->registry->getValue( $key,
'\\BlueSpice\\Renderer\\NullRenderer' );
+ $instance = new $className( $data );
+ return $instance;
+ }
+}
\ No newline at end of file
diff --git a/src/Services.php b/src/Services.php
index 5f8f51d..2b9de1b 100644
--- a/src/Services.php
+++ b/src/Services.php
@@ -69,4 +69,20 @@
public function getBSEntityFactory() {
return $this->getService( 'BSEntityFactory' );
}
+
+ /**
+ *
+ * @return RendererFactory
+ */
+ public function getBSRendererFactory() {
+ return $this->getService( 'BSRendererFactory' );
+ }
+
+ /**
+ *
+ * @return SkinDataRendererFactory
+ */
+ public function getBSSkinDataRendererFactory() {
+ return $this->getService( 'BSSkinDataRendererFactory' );
+ }
}
\ No newline at end of file
--
To view, visit https://gerrit.wikimedia.org/r/397471
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie151494d3624fe5c27a68458d4f34a29c1582a23
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/BlueSpiceFoundation
Gerrit-Branch: master
Gerrit-Owner: Robert Vogel <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits