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

Reply via email to