aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbrettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>2011-02-08 05:28:42 +0000
committerbrettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>2011-02-08 05:28:42 +0000
commit5829097649009879edd325b38b978e4061553805 (patch)
tree83eac52ecf9f4c906fa3b7fbb362aad5ea6f35ec
parentb1d46a40d6e04fe14ac83e5d761cdb8db8bac7f1 (diff)
downloadelgg-5829097649009879edd325b38b978e4061553805.tar.gz
elgg-5829097649009879edd325b38b978e4061553805.tar.bz2
Added suggests to the plugins deps system. It parallels the requires system, but doesn't affect if the plugin can be enabled and only shows up in the deps table on the advanced view.
git-svn-id: http://code.elgg.org/elgg/trunk@8070 36083f99-b078-4883-b0ff-0f9b5a30f544
-rw-r--r--engine/classes/ElggPluginManifest.php170
-rw-r--r--engine/classes/ElggPluginManifestParser18.php7
-rw-r--r--engine/classes/ElggPluginPackage.php9
-rw-r--r--engine/lib/plugins.php14
-rw-r--r--engine/tests/api/plugins.php16
-rw-r--r--engine/tests/test_files/plugin_18/manifest.xml6
-rw-r--r--languages/en.php4
-rw-r--r--views/default/admin/components/plugin.php8
-rw-r--r--views/default/admin/components/plugin_dependencies.php5
-rw-r--r--views/default/css/admin.php14
10 files changed, 168 insertions, 85 deletions
diff --git a/engine/classes/ElggPluginManifest.php b/engine/classes/ElggPluginManifest.php
index 7a261a755..7c9c0670e 100644
--- a/engine/classes/ElggPluginManifest.php
+++ b/engine/classes/ElggPluginManifest.php
@@ -25,7 +25,7 @@ class ElggPluginManifest {
/**
* The expected structure of a requires element
*/
- private $depsRequiresStructPlugin = array(
+ private $depsStructPlugin = array(
'type' => '',
'name' => '',
'version' => '',
@@ -35,7 +35,7 @@ class ElggPluginManifest {
/**
* The expected structure of a requires element
*/
- private $depsRequiresStructPriority = array(
+ private $depsStructPriority = array(
'type' => '',
'priority' => '',
'plugin' => ''
@@ -44,7 +44,7 @@ class ElggPluginManifest {
/*
* The expected structure of elgg and elgg_release requires element
*/
- private $depsRequiresStructElgg = array(
+ private $depsStructElgg = array(
'type' => '',
'version' => '',
'comparison' => 'ge'
@@ -53,7 +53,7 @@ class ElggPluginManifest {
/**
* The expected structure of a requires php_ini dependency element
*/
- private $depsRequiresStructPhpIni = array(
+ private $depsStructPhpIni = array(
'type' => '',
'name' => '',
'value' => '',
@@ -63,7 +63,7 @@ class ElggPluginManifest {
/**
* The expected structure of a requires php_extension dependency element
*/
- private $depsRequiresStructPhpExtension = array(
+ private $depsStructPhpExtension = array(
'type' => '',
'name' => '',
'version' => '',
@@ -427,88 +427,118 @@ class ElggPluginManifest {
$normalized = array();
foreach ($reqs as $req) {
+ $normalized[] = $this->normalizeDep($req);
+ }
- switch ($req['type']) {
- case 'elgg_version':
- case 'elgg_release':
- $struct = $this->depsRequiresStructElgg;
- break;
+ return $normalized;
+ }
- case 'plugin':
- $struct = $this->depsRequiresStructPlugin;
- break;
+ /**
+ * Returns the suggests elements.
+ *
+ * @return array
+ */
+ public function getSuggests() {
+ $suggests = $this->parser->getAttribute('suggests');
- case 'priority':
- $struct = $this->depsRequiresStructPriority;
- break;
+ if (!$suggests) {
+ $suggests = array();
+ }
- case 'php_extension':
- $struct = $this->depsRequiresStructPhpExtension;
- break;
+ $normalized = array();
+ foreach ($suggests as $suggest) {
+ $normalized[] = $this->normalizeDep($suggest);
+ }
+
+ return $normalized;
+ }
- case 'php_ini':
- $struct = $this->depsRequiresStructPhpIni;
-
- // also normalize boolean values
- if (isset($req['value'])) {
- switch (strtolower($normalized_req['value'])) {
- case 'yes':
- case 'true':
- case 'on':
- case 1:
- $normalized_req['value'] = 1;
- break;
-
- case 'no':
- case 'false':
- case 'off':
- case 0:
- case '':
- $normalized_req['value'] = 0;
- break;
- }
+ /**
+ * Normalizes a dependency array using the defined structs.
+ * Can be used with either requires or suggests.
+ *
+ * @param array $dep An dependency array.
+ * @return array The normalized deps array.
+ */
+ private function normalizeDep($dep) {
+ switch ($dep['type']) {
+ case 'elgg_version':
+ case 'elgg_release':
+ $struct = $this->depsStructElgg;
+ break;
+
+ case 'plugin':
+ $struct = $this->depsStructPlugin;
+ break;
+
+ case 'priority':
+ $struct = $this->depsStructPriority;
+ break;
+
+ case 'php_extension':
+ $struct = $this->depsStructPhpExtension;
+ break;
+
+ case 'php_ini':
+ $struct = $this->depsStructPhpIni;
+
+ // also normalize boolean values
+ if (isset($dep['value'])) {
+ switch (strtolower($normalized_dep['value'])) {
+ case 'yes':
+ case 'true':
+ case 'on':
+ case 1:
+ $normalized_dep['value'] = 1;
+ break;
+
+ case 'no':
+ case 'false':
+ case 'off':
+ case 0:
+ case '':
+ $normalized_dep['value'] = 0;
+ break;
}
+ }
- break;
- }
+ break;
+ }
- $normalized_req = $this->buildStruct($struct, $req);
+ $normalized_dep = $this->buildStruct($struct, $dep);
- // normalize comparison operators
- if (isset($normalized_req['comparison'])) {
- switch ($normalized_req['comparison']) {
- case '<':
- $normalized_req['comparison'] = 'lt';
- break;
+ // normalize comparison operators
+ if (isset($normalized_dep['comparison'])) {
+ switch ($normalized_dep['comparison']) {
+ case '<':
+ $normalized_dep['comparison'] = 'lt';
+ break;
- case '<=':
- $normalized_req['comparison'] = 'le';
- break;
+ case '<=':
+ $normalized_dep['comparison'] = 'le';
+ break;
- case '>':
- $normalized_req['comparison'] = 'gt';
- break;
+ case '>':
+ $normalized_dep['comparison'] = 'gt';
+ break;
- case '>=':
- $normalized_req['comparison'] = 'ge';
- break;
+ case '>=':
+ $normalized_dep['comparison'] = 'ge';
+ break;
- case '==':
- case 'eq':
- $normalized_req['comparison'] = '=';
- break;
+ case '==':
+ case 'eq':
+ $normalized_dep['comparison'] = '=';
+ break;
- case '<>':
- case 'ne':
- $normalized_req['comparison'] = '!=';
- break;
- }
+ case '<>':
+ case 'ne':
+ $normalized_dep['comparison'] = '!=';
+ break;
}
-
- $normalized[] = $normalized_req;
}
- return $normalized;
+ return $normalized_dep;
}
/**
diff --git a/engine/classes/ElggPluginManifestParser18.php b/engine/classes/ElggPluginManifestParser18.php
index 1f5b51bb5..c74b23e32 100644
--- a/engine/classes/ElggPluginManifestParser18.php
+++ b/engine/classes/ElggPluginManifestParser18.php
@@ -14,9 +14,9 @@ class ElggPluginManifestParser18 extends ElggPluginManifestParser {
*/
protected $validAttributes = array(
'name', 'author', 'version', 'blurb', 'description',
- 'website', 'copyright', 'license', 'requires', 'screenshot',
- 'category', 'conflicts', 'provides', 'on_activate', 'on_deactivate',
- 'admin_interface', 'activate_on_install'
+ 'website', 'copyright', 'license', 'requires', 'suggests',
+ 'screenshot', 'category', 'conflicts', 'provides', 'on_activate',
+ 'on_deactivate', 'admin_interface', 'activate_on_install'
);
/**
@@ -63,6 +63,7 @@ class ElggPluginManifestParser18 extends ElggPluginManifestParser {
case 'provides':
case 'conflicts':
case 'requires':
+ case 'suggests':
if (!isset($element->children)) {
return false;
}
diff --git a/engine/classes/ElggPluginPackage.php b/engine/classes/ElggPluginPackage.php
index 48a5fc4a8..2ae686b25 100644
--- a/engine/classes/ElggPluginPackage.php
+++ b/engine/classes/ElggPluginPackage.php
@@ -340,7 +340,14 @@ class ElggPluginPackage {
}
}
- foreach (array('requires', 'conflicts') as $dep_type) {
+ $check_types = array('requires', 'conflicts');
+
+ if ($full_report) {
+ $suggests = $this->getManifest()->getSuggests();
+ $check_types[] = 'suggests';
+ }
+
+ foreach ($check_types as $dep_type) {
$inverse = ($dep_type == 'conflicts') ? true : false;
foreach (${$dep_type} as $dep) {
diff --git a/engine/lib/plugins.php b/engine/lib/plugins.php
index 31420a826..8d6daef6e 100644
--- a/engine/lib/plugins.php
+++ b/engine/lib/plugins.php
@@ -722,10 +722,18 @@ function elgg_get_plugin_dependency_strings($dep) {
break;
}
- if ($dep['status']) {
- $strings['comment'] = elgg_echo('ok');
+ if ($dep['type'] == 'suggests') {
+ if ($dep['status']) {
+ $strings['comment'] = elgg_echo('ok');
+ } else {
+ $strings['comment'] = elgg_echo('ElggPlugin:Dependencies:Suggests:Unsatisfied');
+ }
} else {
- $strings['comment'] = elgg_echo('error');
+ if ($dep['status']) {
+ $strings['comment'] = elgg_echo('ok');
+ } else {
+ $strings['comment'] = elgg_echo('error');
+ }
}
return $strings;
diff --git a/engine/tests/api/plugins.php b/engine/tests/api/plugins.php
index ac1278410..853af45e9 100644
--- a/engine/tests/api/plugins.php
+++ b/engine/tests/api/plugins.php
@@ -101,6 +101,10 @@ class ElggCorePluginsAPITest extends ElggCoreUnitTest {
array('type' => 'php_extension', 'name' => 'big_math', 'version' => 1.0)
),
+ 'suggests' => array(
+ array('type' => 'plugin', 'name' => 'facebook_connect', 'version' => 1.0),
+ ),
+
'on_activate' => array('setup_function'),
'on_deactivate' => array('teardown_function'),
'admin_interface' => 'simple',
@@ -196,6 +200,18 @@ class ElggCorePluginsAPITest extends ElggCoreUnitTest {
$this->assertEqual($this->package17->getManifest()->getRequires(), $requires);
}
+ public function testElggPluginManifestGetSuggests() {
+ $suggests = array(
+ array('type' => 'plugin', 'name' => 'facebook_connect', 'version' => '1.0', 'comparison' => 'ge'),
+ );
+
+ $this->assertEqual($this->package18->getManifest()->getSuggests(), $suggests);
+
+ $suggests = array();
+
+ $this->assertEqual($this->package17->getManifest()->getSuggests(), $suggests);
+ }
+
public function testElggPluginManifestGetDescription() {
$this->assertEqual($this->package18->getManifest()->getDescription(), 'A longer, more interesting description.');
$this->assertEqual($this->package17->getManifest()->getDescription(), 'A 1.7-style manifest.');
diff --git a/engine/tests/test_files/plugin_18/manifest.xml b/engine/tests/test_files/plugin_18/manifest.xml
index 2a4d72c65..76837977d 100644
--- a/engine/tests/test_files/plugin_18/manifest.xml
+++ b/engine/tests/test_files/plugin_18/manifest.xml
@@ -99,4 +99,10 @@
<version>1.0</version>
</provides>
+ <suggests>
+ <type>plugin</type>
+ <name>facebook_connect</name>
+ <version>1.0</version>
+ </suggests>
+
</plugin_manifest>
diff --git a/languages/en.php b/languages/en.php
index 2dd61751e..5195264bd 100644
--- a/languages/en.php
+++ b/languages/en.php
@@ -7,7 +7,6 @@
*/
$english = array(
-
/**
* Sites
*/
@@ -85,6 +84,7 @@ $english = array(
'PluginException:ParserErrorMissingRequiredAttribute' => "Missing required '%s' attribute in manifest for plugin %s.",
'ElggPlugin:Dependencies:Requires' => 'Requires',
+ 'ElggPlugin:Dependencies:Suggests' => 'Suggests',
'ElggPlugin:Dependencies:Conflicts' => 'Conflicts',
'ElggPlugin:Dependencies:Conflicted' => 'Conflicted',
'ElggPlugin:Dependencies:Provides' => 'Provides',
@@ -96,7 +96,7 @@ $english = array(
'ElggPlugin:Dependencies:Plugin' => 'Plugin: %s',
'ElggPlugin:Dependencies:Priority:After' => 'After %s',
'ElggPlugin:Dependencies:Priority:Before' => 'Before %s',
-
+ 'ElggPlugin:Dependencies:Suggests:Unsatisfied' => 'Missing',
'InvalidParameterException:NonElggUser' => "Passing a non-ElggUser to an ElggUser constructor!",
diff --git a/views/default/admin/components/plugin.php b/views/default/admin/components/plugin.php
index 229dd8c57..e75c2c63e 100644
--- a/views/default/admin/components/plugin.php
+++ b/views/default/admin/components/plugin.php
@@ -167,15 +167,12 @@ if (elgg_view_exists($settings_view)) {
}
?>
<h3 class="elgg-head"><?php echo $plugin->manifest->getName() . " $version $settings_link"; ?></h3>
- <div class="plugin_description"><?php echo $description; ?></div>
- <p class="plugin_author"><?php echo $author . ' - ' . $website; ?></p>
-
<?php
if ($plugin->manifest->getApiVersion() < 1.8) {
$reqs = $plugin->manifest->getRequires();
if (!$reqs) {
$message = elgg_echo('admin:plugins:warning:elgg_version_unknown');
- echo "<p class=\"plugin-cannot-activate\">$message</p>";
+ echo "<p class=\"elgg-unsatisfied-dependency\">$message</p>";
}
}
@@ -185,6 +182,9 @@ if (elgg_view_exists($settings_view)) {
}
?>
+ <div class="plugin_description"><?php echo $description; ?></div>
+ <p class="plugin_author"><?php echo $author . ' - ' . $website; ?></p>
+
<div class="pts"><a class="manifest_details small link"><?php echo elgg_echo("admin:plugins:label:moreinfo"); ?></a></div>
<div class="manifest_file hidden">
diff --git a/views/default/admin/components/plugin_dependencies.php b/views/default/admin/components/plugin_dependencies.php
index cd38e98b0..bb0fa4eec 100644
--- a/views/default/admin/components/plugin_dependencies.php
+++ b/views/default/admin/components/plugin_dependencies.php
@@ -27,11 +27,12 @@ echo '<tr/>';
$row = 'odd';
foreach ($deps as $dep) {
$fields = elgg_get_plugin_dependency_strings($dep);
+ $type = $dep['type'];
if ($dep['status']) {
- $class = 'elgg-satisfied-dependency';
+ $class = "elgg-satisfied-dependency elgg-dependency-$type";
} else {
- $class = 'elgg-unsatisfied-dependency';
+ $class = "elgg-unsatisfied-dependency elgg-dependency-$type";
}
echo "<tr class=\"$row\">";
diff --git a/views/default/css/admin.php b/views/default/css/admin.php
index e1aee66fe..729c770bb 100644
--- a/views/default/css/admin.php
+++ b/views/default/css/admin.php
@@ -1001,6 +1001,7 @@ ul.admin_plugins {
.plugin_details h3 {
margin-top:-13px;
color:black;
+ padding-bottom: 10px;
}
.plugin_settings {
font-weight: normal;
@@ -1008,9 +1009,22 @@ ul.admin_plugins {
.elgg-unsatisfied-dependency {
font-weight: bold;
}
+.elgg-dependency-suggests {
+ font-weight: normal;
+}
+p.elgg-unsatisfied-dependency {
+ padding: 5px 0;
+ font-weight: bold;
+}
+p.elgg-dependency-suggests {
+ font-weight: normal;
+}
.elgg-plugin-screenshot {
display: inline;
}
+.elgg-plugin-screenshot img {
+ border: 1px solid #999999;
+}
.elgg-plugin-screenshot-lightbox {
display: block;
position: absolute;