Extensions should be able to register their own Views to display other types of entity. This requires a common interface on the one hand and an extension mechanism plus a factor on the other hand.
Description
Details
Event Timeline
Change 271345 had a related patch set uploaded (by Bene):
Allow injection of entity views
From my point of view, WikibaseView is a component providing widgets for a specific set of WikibaseDataModel concepts. Since the widgets for items and properties use all other widgets, we provide an EntityViewFactory wiring them together. Wikibase\View\EntityViewFactory could look like the following for all I (aka WikibaseView) care about:
EntityViewFactory __construct() newItemView( ...allTheServicesAndValues ): ItemView newPropertyView( ...allTheServicesAndValues ): PropertyView
Also, WikibaseView should define an EntityView interface:
EntityView getTitleHtml( Entity ): HtmlString getHtml( Entity ): HtmlString getPlaceholders(): mixed[]
With that, WikibaseView seems done to me.
WikibaseRepo (namely EntityParserOutputGenerator) on the other hand needs something where it can just put in an entity type and a few other things and get a view. That factory thing should be defined in WikibaseRepo, instantiated in WikibaseRepo.php based on config, and passed to EntityParserOutputGenerator. It would use Wikibase\View\EntityViewFactory.
I'd also add factory methods for the StatementSectionsView and EntityTermsView because extensions of Wikibase defining new entity types want to reuse those views.
Also, WikibaseView should define an EntityView interface:
EntityView getTitleHtml( Entity ): HtmlString getHtml( Entity ): HtmlString getPlaceholders(): mixed[]
This is almost what EntityView currently does. We can however refactor this and define a new public interface of EntityView which doesn't contain the protected abstract functions for main and side HTML.
With that, WikibaseView seems done to me.
WikibaseRepo (namely EntityParserOutputGenerator) on the other hand needs something where it can just put in an entity type and a few other things and get a view. That factory thing should be defined in WikibaseRepo, instantiated in WikibaseRepo.php based on config, and passed to EntityParserOutputGenerator. It would use Wikibase\View\EntityViewFactory.
I agree on that.
Why is a factory method necessary for them? They can just be instantiated in the factory method creating the view.
@adrianheine mainly because they need access to the TemplateFactory which isn't available outside of Wikibase.
But TemplateFactory is constructed in WikibaseRepo via TemplateFactory::getDefaultInstance() and then injected into EntityViewFactory. The same could be done for a MediaInfoViewFactory.
TemplateFactory doesn't seem to serve a purpose here because we cannot inject other templates from another component/extension. It might be nice to make that class modular to be able to support other template files as well but for now it isn't useful for any other extensions.
Change 271345 merged by jenkins-bot:
Move entity type dispatching out of WikibaseView
Change 274393 had a related patch set uploaded (by Bene):
Dispatch entity views based on callbacks
Change 274731 had a related patch set uploaded (by Bene):
Add view-factory-callback to the entity type definitions
Change 274731 merged by jenkins-bot:
Add view-factory-callback to the entity type definitions