mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-24 10:23:17 +00:00
Add Configuration logic
This commit is contained in:
@@ -9,6 +9,8 @@
|
||||
*/
|
||||
namespace Alchemy\Phrasea\Plugin;
|
||||
|
||||
use Assert\Assertion;
|
||||
|
||||
class BasePluginMetadata implements PluginMetadataInterface
|
||||
{
|
||||
/** @var string */
|
||||
@@ -19,6 +21,8 @@ class BasePluginMetadata implements PluginMetadataInterface
|
||||
private $iconUrl;
|
||||
/** @var string */
|
||||
private $localeTextDomain;
|
||||
/** @var ConfigurationTabInterface[] */
|
||||
private $configurationTabs;
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
@@ -65,4 +69,38 @@ class BasePluginMetadata implements PluginMetadataInterface
|
||||
{
|
||||
return $this->localeTextDomain;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ConfigurationTabInterface[] $tabs
|
||||
*/
|
||||
public function setConfigurationTabs($tabs)
|
||||
{
|
||||
Assertion::allIsInstanceOf($tabs, 'Alchemy\Phrasea\Plugin\ConfigurationTabInterface');
|
||||
|
||||
foreach ($tabs as $name => $tab) {
|
||||
$this->addConfigurationTab($name, $tab);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
* @param ConfigurationTabInterface $tab
|
||||
*/
|
||||
public function addConfigurationTab($name, ConfigurationTabInterface $tab)
|
||||
{
|
||||
Assertion::regex($name, '/^[a-zA-Z][-_a-zA-Z0-9]*$/');
|
||||
if (isset($this->configurationTabs[$name])) {
|
||||
throw new \LogicException(sprintf(
|
||||
'A configuration tab with name "%s" is already defined. Registered tabs: "%s"',
|
||||
implode('", "', array_keys($this->configurationTabs))
|
||||
));
|
||||
}
|
||||
|
||||
$this->configurationTabs[$name] = $tab;
|
||||
}
|
||||
|
||||
public function getConfigurationTabs()
|
||||
{
|
||||
return $this->configurationTabs;
|
||||
}
|
||||
}
|
||||
|
||||
27
lib/Alchemy/Phrasea/Plugin/ConfigurationTabInterface.php
Normal file
27
lib/Alchemy/Phrasea/Plugin/ConfigurationTabInterface.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
/*
|
||||
* This file is part of Phraseanet
|
||||
*
|
||||
* (c) 2005-2015 Alchemy
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
namespace Alchemy\Phrasea\Plugin;
|
||||
|
||||
interface ConfigurationTabInterface
|
||||
{
|
||||
/**
|
||||
* Get the title translation key in plugin domain
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getTitle();
|
||||
|
||||
/**
|
||||
* Get the url where configuration tab can be retrived
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUrl();
|
||||
}
|
||||
@@ -6,15 +6,55 @@
|
||||
<h1>{% trans 'plugin.name' plugin.localeTextDomain %}</h1>
|
||||
</div>
|
||||
|
||||
{{ block('about') }}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block about %}
|
||||
<h1>{% trans 'admin::plugins: about' %}</h1>
|
||||
<div>
|
||||
<!-- Nav tabs -->
|
||||
<ul class="nav nav-tabs" id="configurationTabs">
|
||||
{% for divId, configurationTab in plugin.configurationTabs %}
|
||||
{% set tabTitle = configurationTab.title %}
|
||||
<li role="presentation"><a href="#{{ divId }}" aria-controls="{{ divId }}" role="tab" data-toggle="tab" data-url="{{ configurationTab.url }}">{% trans tabTitle plugin.localeTextDomain %}</a></li>
|
||||
{% endfor %}
|
||||
<li role="presentation" class="active"><a href="#about" aria-controls="about" role="tab" data-toggle="tab">{% trans 'admin::plugins: about' %}</a></li>
|
||||
</ul>
|
||||
|
||||
<!-- Tab panes -->
|
||||
<div class="tab-content">
|
||||
{% for divId, configurationTab in plugin.configurationTabs %}
|
||||
<div role="tabpanel" class="tab-pane fade" id="{{ divId }}"></div>
|
||||
{% endfor %}
|
||||
<div role="tabpanel" class="tab-pane fade in active" id="about">
|
||||
<ul>
|
||||
<li>{{ 'admin::plugins: name'|trans }}{{ plugin.name }}</li>
|
||||
<li>{{ 'admin::plugins: version'|trans }}{{ plugin.version }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
var contentsDownloaded = {};
|
||||
var remoteContent = function(url) {
|
||||
return $.get(url);
|
||||
};
|
||||
|
||||
var tabs = $('#configurationTabs a[data-toggle="tab"]');
|
||||
|
||||
tabs.on('show', function (e) {
|
||||
if (e.target.hash != '#about' && contentsDownloaded[e.target.hash] === undefined) {
|
||||
$(e.target.hash).empty().html('<img src="/skins/icons/main-loader.gif" alt="loading"/>');
|
||||
}
|
||||
});
|
||||
tabs.on('shown', function (e) {
|
||||
if (e.target.hash != '#about' && contentsDownloaded[e.target.hash] === undefined) {
|
||||
var targetDiv = $(e.target.hash);
|
||||
|
||||
remoteContent($(e.target).attr('data-url')).then(function(response) {
|
||||
targetDiv.empty().html(response);
|
||||
contentsDownloaded[e.target.hash] = true;
|
||||
}, function(error) {
|
||||
console.log(error);
|
||||
targetDiv.empty().html('<i class="icon-fire">{% trans 'admin::plugins: retrieveConfigurationError' %}</i>');
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
Reference in New Issue
Block a user