noalyss-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Noalyss-commit] [noalyss] 15/16: Task #1052 - Automatic integration of


From: Dany De Bontridder
Subject: [Noalyss-commit] [noalyss] 15/16: Task #1052 - Automatic integration of plugin Plugin management
Date: Tue, 18 Nov 2014 01:09:07 +0000

sparkyx pushed a commit to branch master
in repository noalyss.

commit f8c4c1d0e767f83106e2ea450fcdffd251f8f853
Author: Dany De Bontridder <address@hidden>
Date:   Tue Nov 18 01:34:05 2014 +0100

    Task #1052 - Automatic integration of plugin
    Plugin management
---
 include/cfgplugin.inc.php   |  154 +++++++++++++++++++++++++++++++++++++++++++
 include/class_extension.php |  119 ++++++++++++++++++++++++++++++++--
 include/menu.inc.php        |    3 +-
 sql/upgrade.sql             |    5 ++
 4 files changed, 275 insertions(+), 6 deletions(-)

diff --git a/include/cfgplugin.inc.php b/include/cfgplugin.inc.php
new file mode 100644
index 0000000..4113459
--- /dev/null
+++ b/include/cfgplugin.inc.php
@@ -0,0 +1,154 @@
+<?php
+/*
+ *   This file is part of PhpCompta.
+ *
+ *   PhpCompta is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   PhpCompta is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with PhpCompta; if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+// Copyright (2014) Author Dany De Bontridder <address@hidden>
+
+if ( ! defined ('ALLOWED') ) die('Appel direct ne sont pas permis');
+require_once 'class_extension.php';
+
+/**
+ * @file
+ * @brief Automatic installation of plugins and activation
+ */
+global $cn;
+
+/******************************************************************************
+ * Scan the plugin folder and file in each subfolder a property file and
+ * store them into an array a_plugin
+ ******************************************************************************
+ */
+$dirscan=scandir('../include/ext/');
+$nb_dirscan=count($dirscan);
+$a_plugin=array();
+for ($e=0;$e<$nb_dirscan;$e++) {
+    if ($dirscan[$e] != '.' && $dirscan[$e]!='..' && 
is_dir('../include/ext/'.$dirscan[$e])) {
+        $dir_plugin=$dirscan[$e];
+        if (file_exists('../include/ext/'.$dir_plugin.'/plugin.xml')) {
+
+            
$extension=Extension::read_definition('../include/ext/'.$dir_plugin.'/plugin.xml');
+            for ($i=0;$i<count($extension);$i++)
+            {
+                $a_plugin[]=clone $extension[$i];
+            }
+            
+        }
+    }
+}
+$nb_plugin=count($a_plugin);
+
+/**
+ * available profiles
+ */
+$a_profile=$cn->get_array('select p_id,p_name from profile where p_id > 0 
order by p_name');
+$nb_profile=count($a_profile);
+/******************************************************************************
+ * save 
+ 
******************************************************************************/
+if ( isset ($_POST['save_plugin'])){
+    // retrieve array of plugin
+    $plugin=HtmlInput::default_value_post('plugin', array());
+    // for each extension
+    for ($i=0;$i<$nb_plugin;$i++) {
+        
+        $code=$a_plugin[$i]->me_code;
+        // for each profile
+        for ($e=0;$e<$nb_profile;$e++)
+        {
+            $profile=$a_profile[$e]['p_id'];
+            if ( isset ($plugin[$code][$profile])) {
+                // insert or update into db
+                $count = $cn->get_value("select count(*) from menu_ref where 
me_code=$1", array($code));
+                if ( $count == 0 ) {
+                    $a_plugin[$i]->insert();
+                }
+                $a_plugin[$i]->insert_profile_menu($profile,'EXT');
+            } else {
+                // delete
+                $a_plugin[$i]->remove_from_profile_menu ($profile);
+            }
+    }
+    }
+}
+/******************************************************************************
+ * Display the Plugin and for each profile were it is installed or not
+ 
******************************************************************************/
+
+
+?>
+<div class="content">
+    <?php echo _('Nombre de plugins trouvés')." ".$nb_plugin; ?>
+    <form method="post">
+    <table class="result">
+        <tr>
+            <th><?php echo _('Extension')?></th>
+            <th><?php echo _('Menu')?></th>
+            <th><?php echo _('Description')?></th>
+            <th><?php echo _('Chemin')?></th>
+            <th><?php echo _('Disponible')?></th>
+        </tr>
+        <?php for ($e=0;$e<$nb_plugin;$e++) : 
+            //-----
+            $a_profile=$cn->get_array("select distinct
+                    p_id,p_name,
+                    (select count(*)  from profile_menu as a where 
a.p_id=b.p_id and me_code=$1 )+
+                    (select count(*)  from menu_ref as c join profile_menu as 
d on (d.me_code=c.me_code) where d.p_id=b.p_id and me_file=$2 )  as cnt 
+                    from profile as b  
+                    where p_id > 0 
+                    order by 
p_name",array($a_plugin[$e]->me_code,$a_plugin[$e]->me_file));
+
+            $class=($e%2==0)?'odd':'even';
+            ?>
+        <tr class="<?php echo $class?>">
+            <td>
+                <?php echo h($a_plugin[$e]->me_code); ?>
+            </td>
+            <td>
+                <?php echo h($a_plugin[$e]->me_menu); ?>
+            </td>
+            <td>
+                <?php echo h($a_plugin[$e]->me_description); ?>
+            </td>
+            <td>
+                <?php echo h($a_plugin[$e]->me_file); ?>
+            </td>
+            <td>
+                <?php 
+                
+                    for ($w=0;$w<$nb_profile;$w++) :
+                        ?>
+                    <span style="display:block">
+                    
+                    <?php
+                        $a=new 
ICheckBox('plugin['.$a_plugin[$e]->me_code.']['.$a_profile[$w]['p_id'].']');
+                        if ($a_profile[$w]['cnt']>0) $a->selected=true;
+                        echo $a->input();
+                        echo $a_profile[$w]['p_name'];
+                 ?>
+                    </span>
+                    <?php
+                    endfor;
+                ?>
+            </td>
+        </tr>
+        
+        <?php endfor; ?>
+    </table>
+        <?php echo HtmlInput::submit('save_plugin', _('Valider')); ?>
+   </form>
+</div>
+
diff --git a/include/class_extension.php b/include/class_extension.php
index 6188e66..cadce76 100644
--- a/include/class_extension.php
+++ b/include/class_extension.php
@@ -36,6 +36,9 @@
  *    - filepath (extension.ex_file)
  */
 require_once 'class_menu_ref_sql.php';
+include_once 'class_profile_sql.php';
+require_once 'class_menu_ref.php';
+require_once 'class_profile_menu.php';
 
 class Extension extends Menu_Ref_sql
 {
@@ -96,6 +99,53 @@ class Extension extends Menu_Ref_sql
         }
         Extension::check_plugin_version();
     }
+    /**
+     * insert into the table profile_menu for the given profile id and 
depending
+     * of the module $p_module
+     * @global type $cn
+     * @param type $p_id profile.p_id
+     * @param type $p_module menu_ref.me_code
+     * @throws Exception 10 : profile absent 20 module absent
+     */
+    function insert_profile_menu($p_id=1,$p_module='EXT')
+    {
+        global $cn;
+        //profile exists ?
+        $profile=new Profile_sql($cn,$p_id);
+        if ( $profile->p_id != $p_id) {
+                throw new Exception(_('Profil inexistant'),10);
+        }
+        // Menu exists
+        $module=new Menu_Ref($cn,$p_module);
+        if ($module->me_code==null) {
+                throw new Exception(_('Module inexistant'),20);
+        }
+        
+        $profil_menu=new Profile_Menu($cn);
+        $profil_menu->me_code=$this->me_code;
+        $profil_menu->me_code_dep=$p_module;
+        $profil_menu->p_type_display='S';
+        $profil_menu->p_id=$p_id;
+        $cnt=$profil_menu->count(' where p_id=$1 and me_code = 
$2',array($p_id,$this->me_code));
+        if ( $cnt==0) {
+            $profil_menu->insert();
+        }
+
+        
+    }
+    function remove_from_profile_menu($p_id)
+    {
+        global $cn;
+       
+         $cn->exec_sql('delete from profile_menu  where (me_code = $1 or 
me_code in (select me_code from menu_ref where me_file=$2)) and 
p_id=$3',array($this->me_code,$this->me_file,$p_id));
+        
+    }
+    /**
+     * Insert a plugin into the given profile, by default always insert into 
EXT
+     * 
+     * @param type $p_id profile.p_id
+     * @throws Exception if duplicate or error db
+     */
        function insert_plugin()
        {
                try
@@ -109,11 +159,6 @@ class Extension extends Menu_Ref_sql
                                throw new Exception("Doublon");
                        $this->me_type = 'PL';
                        $this->insert();
-                       /**
-                        * insert into default profile
-                        */
-                       $this->cn->exec_sql("insert into 
profile_menu(me_code,me_code_dep,p_type_display,p_id)
-                                       values 
($1,$2,$3,$4)",array($this->me_code,'EXT','S',1));
                        $this->cn->commit();
                }
                catch (Exception $exc)
@@ -181,5 +226,69 @@ class Extension extends Menu_Ref_sql
                 }
             }
         }
+        /**
+         * Check that the xml contains all the needed information to change 
them into
+         * a extension, the exception code is 0 if the element is optional
+         * @brief Check XML.
+         * @param SimpleXMLElement $xml
+         * @throws Exception
+         */
+        function check_xml(SimpleXMLElement $xml)
+        {
+            try {
+                if ( !isset ($xml->plugin)) throw new Exception(_('Manque 
plugin'),1);
+                $nb_plugin=count($xml->plugin);
+            
+                for ($i=0;$i<$nb_plugin;$i++)
+                {
+                    if ( !isset ($xml->plugin[$i]->name)) throw new 
Exception(_('Manque nom'),1);
+                    if ( !isset ($xml->plugin[$i]->description)) throw new 
Exception(_('Manque description'),0);
+                    if ( !isset ($xml->plugin[$i]->code)) throw new 
Exception(_('Manque code'),1);
+                    if ( !isset ($xml->plugin[$i]->author)) throw new 
Exception(_('Manque auteur'),0);
+                    if ( !isset ($xml->plugin[$i]->root)) throw new 
Exception(_('Manque répertoire racine'),1);
+                    if ( !isset ($xml->plugin[$i]->file)) throw new 
Exception(_('Manque fichier à inclure'),1);
+                }
+            } catch (Exception $ex) {
+                throw $ex;
+            }
+        }
+         /**
+         * Parse a XML file to complete an array of extension objects
+         * @brief Create extension from XML.
+         * @param type $p_file filename
+         * @return array of Extension
+         */
+        static function read_definition($p_file)
+        {
+            global $cn;
+            $dom=new DomDocument('1.0');
+            $dom->load($p_file);
+            $xml=simplexml_import_dom($dom);
+            $nb_plugin=count($xml->plugin);
+            $a_extension=array();
+            for ($i=0;$i<$nb_plugin;$i++)
+            {
+                
+                $extension=new Extension($cn);
+                try {
+                        $extension->check_xml($xml);
+                } catch (Exception $ex) {
+                    echo_warning($e->getMessage());
+                    if ( $ex->getCode()==1) {
+                        continue;
+                    }
+                    
+                }
+                
$extension->me_file=trim($xml->plugin[$i]->root).'/'.trim($xml->plugin[$i]->file);
+                $extension->me_code=trim($xml->plugin[$i]->code);
+                $extension->me_description=(isset 
($xml->plugin[$i]->description))?$xml->plugin[$i]->description:"";
+                
$extension->me_description_etendue=($xml->plugin[$i]->author)?$xml->plugin[$i]->author:"";
+                $extension->me_type='PL';
+                $extension->me_menu=$xml->plugin[$i]->name;
+                
$extension->me_parameter='plugin_code='.trim($xml->plugin[$i]->code);
+                $a_extension[]=clone $extension;
+            }
+            return $a_extension;
+        }
 }
 
diff --git a/include/menu.inc.php b/include/menu.inc.php
index b0420a8..cbc769d 100644
--- a/include/menu.inc.php
+++ b/include/menu.inc.php
@@ -46,6 +46,7 @@ if ( isset($_POST['save_plugin']))
        $plugin->me_description=$me_description;
        $plugin->me_parameter='plugin_code='.$me_code;
        $plugin->insert_plugin();
+        $plugin->insert_profile_module();
 }
 /**
  * if post update then we update
@@ -138,7 +139,7 @@ if ( $iselect->selected != '')
 {
        $sql="where me_type='".sql_string($_REQUEST['p_type'])."'  ";
 }
-$menu=new Menu_Ref_sql();
+$menu=new Menu_Ref_sql($cn);
 $ret=$menu->seek($sql.$order);
 ?>
 <fieldset><legend>Recherche</legend>
diff --git a/sql/upgrade.sql b/sql/upgrade.sql
index 7421d80..f236c2f 100644
--- a/sql/upgrade.sql
+++ b/sql/upgrade.sql
@@ -24,6 +24,11 @@ INSERT INTO menu_ref(me_code, me_menu, me_file,   
me_type,me_description_etendue
 insert into 
profile_menu(me_code,p_id,p_type_display,pm_default,me_code_dep,p_order) values 
('ANCKEY',1,'E',0,'ANC',15);
 insert into 
profile_menu(me_code,p_id,p_type_display,pm_default,me_code_dep,p_order) values 
('ANCKEY',2,'E',0,'ANC',15);
 
+INSERT INTO menu_ref(me_code, me_menu, me_file,   
me_type,me_description_etendue)VALUES ('CFGPLUGIN', 'Configuration extension',  
'cfgplugin.inc.php','ME','Permet d''installer et d''activer facilement des 
extensions');
+
+insert into 
profile_menu(me_code,p_id,p_type_display,pm_default,me_code_dep,p_order) values 
('CFGPLUGIN',1,'E',0,'PARAM',15);
+insert into 
profile_menu(me_code,p_id,p_type_display,pm_default,me_code_dep,p_order) values 
('CFGPLUGIN',2,'E',0,'PARAM',15);
+
 create table key_distribution (
     kd_id serial primary key,
     kd_name text,



reply via email to

[Prev in Thread] Current Thread [Next in Thread]