source: pmb4.1/trunk/fuentes/pmb/cms/modules/common/modules/cms_module_common_module.class.php @ 478

Last change on this file since 478 was 478, checked in by mabarracus, 4 years ago

copy trusty code 4.1

  • Property svn:executable set to *
File size: 37.1 KB
Line 
1<?php
2// +-------------------------------------------------+
3// | 2002-2011 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: cms_module_common_module.class.php,v 1.56.2.2 2014-11-18 12:03:54 dgoron Exp $
6
7if (stristr($_SERVER['REQUEST_URI'], ".class.php")) die("no access");
8
9class cms_module_common_module extends cms_module_root{
10        protected $module_path = "";
11        protected $manifest;
12        public $informations = array();
13        public $elements_used = array();
14        public $name= "";
15        public $styles;
16        public $dom_parent;
17        public $dom_after;
18        protected $datasource = array();
19        protected $filter = array();
20        protected $view = array();
21        protected $conditions = array();
22        protected $managed_datas;
23        public $fixed = false;
24        protected $extension_datas = array();
25        protected $modcache = "get_post_view";
26       
27        public function __construct($id=0){
28                $this->id = $id+0;
29                $infos = self::read_manifest();
30                $this->informations = $infos['informations'];
31                $this->elements_used = $infos['elements_used'];
32                parent::__construct();
33                //on va chercher le contenu de la boite noire...
34                $this->fetch_managed_datas();
35        }
36       
37        public static function get_informations(){
38                $infos = self::read_manifest();
39                return $infos['informations'];
40        }
41       
42        public static function read_manifest(){
43                global $base_path;
44                $informations = array();
45                @ini_set("zend.ze1_compatibility_mode", "0");
46                $manifest = new domDocument();
47                $module_path = realpath(dirname($base_path."/cms/modules/".str_replace("cms_module_","",get_called_class())."/".get_called_class().".class.php"));
48               
49                $manifest->load($module_path."/manifest.xml");
50                //on récupère le nom
51                $name = $manifest->getElementsByTagName("name")->item(0);
52                $informations['informations']['name']= cms_module_root::charset_normalize($name->nodeValue,"utf-8");
53                //on récupère le(les) auteur(s)
54                $informations['informations']['author'] = array();
55                $authors = $manifest->getElementsByTagName("author");
56                for($i=0 ; $i<$authors->length ; $i++){
57                        $author = array();
58                        //on récupère son nom
59                        $author['name'] = cms_module_root::charset_normalize($authors->item($i)->getElementsByTagName('name')->item(0)->nodeValue,"utf-8");
60                        //on récupère son organisation
61                        $organisation = $authors->item($i)->getElementsByTagName("organisation");
62                        if($organisation->length>0){
63                                $author['organisation'] = cms_module_root::charset_normalize($organisation->item(0)->nodeValue,"utf-8");
64                        }
65                        $informations['informations']['author'][] = $author;
66                }
67               
68                //on récupère les dates
69                $created_date = $manifest->getElementsByTagName("created_date")->item(0);
70                $informations['informations']['created_date']= cms_module_root::charset_normalize($created_date->nodeValue,"utf-8");
71                $updated_date = $manifest->getElementsByTagName("updated_date");
72                if($updated_date->length>0){
73                        $informations['informations']['updated_date'] = cms_module_root::charset_normalize($updated_date->item(0)->nodeValue,"utf-8");
74                }
75                //on récupère la version
76                $version = $manifest->getElementsByTagName("version")->item(0);
77                $informations['informations']['version']= cms_module_root::charset_normalize($version->nodeValue,"utf-8");
78               
79                // on récupère la langue par défaut du module...
80                $informations['informations']['default_language'] = self::get_module_default_language($manifest);
81               
82                // administrable?
83                $informations['informations']['managed'] = ($manifest->getElementsByTagName("managed") && $manifest->getElementsByTagName("managed")->item(0)->nodeValue == "true" ? true : false);
84               
85                //fournisseur de liens?
86                $informations['informations']['extension_form'] = ($manifest->getElementsByTagName("extension_form") && $manifest->getElementsByTagName("extension_form")->item(0)->nodeValue == "true" ? true : false);
87               
88               
89                @ini_set("zend.ze1_compatibility_mode", "0");
90                //on récupère la listes des éléments utilisés par le module...
91                $use = $manifest->getElementsbyTagName("use")->item(0);
92                $informations['elements_used'] = self::read_elements_used($use);
93                @ini_set("zend.ze1_compatibility_mode", "1");
94                return $informations;
95        }
96               
97        protected function fetch_datas(){
98                if($this->id){
99                        $this->classement_list=array();
100                        //on va cherches les infos du cadres...
101                        $query = "select * from cms_cadres where id_cadre = ".$this->id;
102                        $result = mysql_query($query);
103                        if(mysql_num_rows($result)){
104                                $row = mysql_fetch_object($result);
105                                $this->id = $row->id_cadre+0;
106                                $this->hash = $row->cadre_hash;
107                                $this->name = $row->cadre_name;
108                                $this->fixed = $row->cadre_fixed;
109                                $this->styles = unserialize($row->styles);
110                                $this->dom_parent = $row->cadre_dom_parent;
111                                $this->dom_after = $row->cadre_dom_after;
112                                $this->memo_url = $row->cadre_memo_url;
113                                $this->cadre_url = $row->cadre_url;                             
114                                $this->classement = $row->cadre_classement;     
115                                $this->modcache = $row->cadre_modcache;
116                                $query = "select id_cadre_content,cadre_content_object,cadre_content_type from cms_cadre_content where cadre_content_num_cadre = ".$this->id;
117                                $result = mysql_query($query);
118                                if($result && mysql_num_rows($result)){
119                                        while ($ligne=mysql_fetch_object($result)) {
120                                                switch ($ligne->cadre_content_type) {
121                                                        case "datasource":
122                                        $this->datasource = array(
123                                                                        'id' => $ligne->id_cadre_content+0,
124                                                                        'name' => $ligne->cadre_content_object
125                                        );
126                                                                break;
127                                                        case "filter":
128                                        $this->filter = array(
129                                                                        'id' => $ligne->id_cadre_content+0,
130                                                                        'name' => $ligne->cadre_content_object
131                                        );
132                                                                break;
133                                                        case "view":
134                                        $this->view = array(
135                                                                        'id' => $ligne->id_cadre_content+0,
136                                                                        'name' => $ligne->cadre_content_object
137                                        );
138                                                                break;
139                                                        case "condition":
140                                                $this->conditions[] = array(
141                                                                        'id' => $ligne->id_cadre_content+0,
142                                                                        'name' => $ligne->cadre_content_object
143                                                );
144                                                                                                                break;
145                                                        default:
146                                                                break;
147                                                }
148                                        }
149                                }
150                        }
151                }
152        }
153       
154        static function read_elements_used($use_node){
155                @ini_set("zend.ze1_compatibility_mode", "0");
156                $elements_used = array();
157                $types = array(
158                        'condition',
159                        'view',
160                        'datasource',
161                        'filter'
162                );
163                foreach($types as $type){
164                        $elements = $use_node->getElementsByTagName($type);
165                        $elements_used[$type] = array();
166                        if($elements->length>0){
167                                for($i=0 ; $i<$elements->length ; $i++){
168                                        if($elements->item($i)->nodeValue != ""){
169                                                $elements_used[$type][] = $elements->item($i)->nodeValue;
170                                        }
171                                }
172                        }
173                }
174                //certaines conditions sont par défaut dans tous les modules...
175                if(!in_array("cms_module_common_condition_authentificated",$elements_used['condition'])) $elements_used['condition'][] = "cms_module_common_condition_authentificated";
176                if(!in_array("cms_module_common_condition_page",$elements_used['condition'])) $elements_used['condition'][] = "cms_module_common_condition_page";
177                if(!in_array("cms_module_common_condition_lvl",$elements_used['condition'])) $elements_used['condition'][] = "cms_module_common_condition_lvl";
178                if(!in_array("cms_module_common_condition_global_var",$elements_used['condition'])) $elements_used['condition'][] = "cms_module_common_condition_global_var";
179                if(!in_array("cms_module_common_condition_global_var_value",$elements_used['condition'])) $elements_used['condition'][] = "cms_module_common_condition_global_var_value";
180                if(!in_array("cms_module_common_condition_view",$elements_used['condition'])) $elements_used['condition'][] = "cms_module_common_condition_view";
181               
182                @ini_set("zend.ze1_compatibility_mode", "1");
183                return $elements_used;
184        }
185       
186        static function get_elements_used($file=""){
187                @ini_set("zend.ze1_compatibility_mode", "0");
188                //on récupère la partie intéressante du manifest...
189                $dom = new domDocument();
190                $dom->load($file);
191                $use = $dom->getElementsbyTagName("use")->item(0);
192                $elements_used = self::read_elements_used($use);
193                @ini_set("zend.ze1_compatibility_mode", "1");
194                return $elements_used;
195        }
196
197        protected function get_datasources_list_form(){
198                if(count($this->elements_used['datasource'])>1){
199                        $form = "
200                        <div class='colonne3'>
201                                <label for='datasource_choice'>".$this->format_text($this->msg['cms_module_datasource_choice'])."</label>
202                        </div>
203                        <div class='colonne-suite'>
204                                <select name='datasource_choice' onchange='load_datasource_form(this.value)'>
205                                        <option value=''>".$this->format_text($this->msg['cms_module_datasource_choice'])."</option>";
206                        foreach($this->elements_used['datasource'] as $datasource){
207                                $form.= "
208                                        <option value='".$datasource."'".($datasource == $this->datasource['name'] ? " selected='selected'" : "").">".$this->format_text($this->msg[$datasource])."</option>";
209                        }
210                        $form.="
211                                </select>
212                                <script type='text/javascript'>
213                                        function load_datasource_form(datasource){
214                                                if(datasource != ''){
215                                                        cms_module_load_elem_form(datasource,'0','datasource_form');
216                                                }                               
217                                        }
218                                </script>
219                        </div>";                       
220                }else{
221                        $form = "
222                                <input type='hidden' name='datasource_choice' value='".$this->elements_used['datasource'][0]."'/>";
223                }
224                return $form;
225        }
226       
227        protected function get_views_list_form(){
228                if(count($this->elements_used['view'])>1){
229                        $form= "
230                                <div class='colonne3'>
231                                        <label for='view_choice'>".$this->format_text($this->msg['cms_module_common_module_view_choice'])."</label>
232                                </div>
233                                <div class='colonne-suite'>
234                                        <select name='view_choice' onchange='load_view_form(this.value)'>
235                                                <option value=''>".$this->format_text($this->msg['cms_module_view_choice'])."</option>";
236                        foreach($this->elements_used['view'] as $view){
237                                $form.= "
238                                                <option value='".$view."'".($view == $this->view['name'] ? " selected='selected'" : "").">".$this->format_text($this->msg[$view])."</option>";
239                        }
240                        $form.="
241                                        </select>
242                                <script type='text/javascript'>
243                                        function load_view_form(datasource){
244                                                if(datasource != ''){
245                                                        cms_module_load_elem_form(datasource,'0','view_form');
246                                                }                               
247                                        }
248                                </script>
249                        </div>";               
250                }else{
251                        $form = "
252                                        <input type='hidden' name='view_choice' value='".$this->elements_used['view'][0]."'/>";
253                }
254               
255                return $form;
256        }
257       
258       
259        public function get_form($ajax= true,$callback='',$cancel_callback='',$delete_callback='',$action="?action=save"){
260                global $charset;
261               
262                //en création ,on peut permettre certaines choses par défaut (pré-chargement de conditions,...)
263                if(!$this->id){
264                        $this->creation_init();
265                }               
266                if($ajax){
267                        $action = "./ajax.php?module=cms&categ=module&elem=".$this->class_name."&action=save_form";
268                }
269                $form = "
270                <script type='text/javascript'>
271                        function test_form_".$this->class_name."() {           
272                                if(document.getElementById('cms_module_common_module_name').value=='' ) {
273                                        alert(\"".$this->msg['cms_module_common_module_name_empty']."\");
274                                        document.getElementById('cms_module_common_module_name').focus();
275                                        return false;
276                                }
277                                return true;
278                        }               
279                </script>
280                <form name='".$this->class_name."_form' id='".$this->class_name."_form' method='POST' action='".$action."' style='width:800px'>
281                        <h3>".$this->format_text(($this->id ? sprintf($this->msg['cms_module_common_module_alter_cadre'],$this->informations['name']." : ".$this->name) : $this->msg['cms_module_common_module_new_cadre']." - ". $this->informations['name'] ))."</h3>
282                        <div class='form-contenu'>
283                                <div class='row'>
284                                        <div class='colonne3'>
285                                                <label for='cms_module_common_module_name'>".$this->msg['cms_module_common_module_name']."</label>
286                                        </div>
287                                        <div class='colonne-suite'>
288                                                <input type='text' id='cms_module_common_module_name' name='cms_module_common_module_name' value = '".addslashes($this->format_text($this->name))."' />
289                                        </div>
290                                </div>
291                                <div class='row'>
292                                        <div class='colonne3'>
293                                                <label for='cms_module_common_module_fixed'>".$this->msg['cms_module_common_module_fixed']."</label>
294                                        </div>
295                                        <div class='colonne-suite'>
296                                                <input type='checkbox' name='cms_module_common_module_fixed' value='1' ".($this->fixed? "checked='checked'":"")."/>
297                                        </div>
298                                </div>
299                                <div class='row'>               
300                                        <div class='colonne3'>
301                                                <label for='cms_module_common_module_memo_url'>".$this->msg['cms_module_common_module_memo_url']."</label>
302                                        </div>
303                                        <div class='colonne-suite'>
304                                                <input type='checkbox' name='cms_module_common_module_memo_url' value='1' ".($this->memo_url? "checked='checked'":"")."/>
305                                        </div>
306                                </div>
307                                <div class='row'>
308                                        <div class='colonne3'>
309                                                <label for='cms_module_common_module_modcache'>".$this->msg['cms_module_common_module_modcache']."</label>
310                                        </div>
311                                        <div class='colonne_suite'>
312                                                <select name='cms_module_common_module_modcache'>";
313                $modcache_choices = $this->get_modcache_choices();             
314                foreach($modcache_choices as $choice){
315                        $form.="
316                                                        <option value='".$choice['value']."'".($this->modcache == $choice['value'] ? " selected='selected'" : "").">".$this->format_text($choice['name'])."</option>";
317                }               
318                $form.="
319                                                </select>
320                                        </div>
321                                </div>
322                                <div class='row'></div>
323                                <hr/>";
324               
325                $form.= $this->get_conditions_form();
326                $form.= "
327                                <hr/>
328                                <div class='row'>";
329                $form.= $this->get_datasources_list_form();
330                if($this->datasource['id'] || count($this->elements_used['datasource'])==1){
331                        if($this->datasource['id']){
332                                $datasource_name = $this->datasource['name'];
333                                $datasource_id = $this->datasource['id'];
334                        }else if(count($this->elements_used['datasource'])==1){
335                                $datasource_name = $this->elements_used['datasource'][0];
336                                $datasource_id = 0;
337                        }
338                        $form.="
339                                <script type='text/javascript'>
340                                        cms_module_load_elem_form('".$datasource_name."','".$datasource_id."','datasource_form');
341                                </script>";                     
342                }
343                $form.="               
344                                <div id='datasource_form' dojoType='dojox.layout.ContentPane'>
345                                </div>
346                        </div>";
347                $form.=$this->get_filters_form();
348                if($this->filter['id']){
349                        $form.="
350                        <script type='text/javascript'>
351                                cms_module_load_elem_form('".$this->filter['name']."','".$this->filter['id']."','filter_form');
352                        </script>";
353                }
354                $form.="
355                        <hr/>
356                        <div class='row'>";
357                $form.= $this->get_views_list_form();
358                if($this->view['id'] || count($this->elements_used['view'])==1 ){
359                        if($this->view['id']){
360                                $view_name = $this->view['name'];
361                                $view_id = $this->view['id'];
362                        }else if(count($this->elements_used['view'])==1){
363                                $view_name = $this->elements_used['view'][0];
364                                $view_id = 0;
365                        }
366                        $form.="
367                                <script type='text/javascript'>
368                                        cms_module_load_elem_form('".$view_name."','".$view_id."','view_form');
369                                </script>";     
370                }
371                $form.="               
372                                <div id='view_form' dojoType='dojox.layout.ContentPane'>
373                                </div>
374                                <div class='row'>&nbsp;</div>
375                        </div> 
376                        <div class='row'><hr></div>
377                        <div class='row'>
378                                <input type='hidden' name='cms_build_info' id='cms_build_info' value='".htmlentities(serialize($this->cms_build_env),ENT_QUOTES,$charset)."' />
379                                <input type='hidden' name='cms_module_common_module_id' id='cms_module_common_module_id' value='".$this->id."' />
380                                <div class='left'>
381                                        <input type='submit' id='cms_module_common_module_submit' class='bouton' value='".$this->msg['cms_module_common_module_save']."' ".( $ajax ? "onclick=\"if(test_form_".$this->class_name."())cms_module_save();return false;\"" : "")."/>
382                                        &nbsp;
383                                        <input type='button' class='bouton' value='".$this->msg['cms_module_common_module_cancel']."' ".($cancel_callback != '' ? "onclick='".$cancel_callback."();'" : "")."/>
384                                </div>
385                                <div class='right'>
386                                        <input type='button' class='bouton' value='".$this->msg['cms_module_common_module_delete']."' onclick=\"if(confirm('".addslashes($this->msg['cms_module_common_module_confirm_delete'])."')) {cms_module_delete()}\"/>
387                                </div>
388                        </div>
389                </form>
390                <script type='text/javacript'>
391                        function cms_module_load_elem_form(elem,id,dom_id){
392                                dojo.xhrPost({
393                                        url : './ajax.php?module=cms&categ=module&elem='+elem+'&action=get_form&id='+id,
394                                        postData : 'cms_build_info=".rawurlencode(serialize($this->cms_build_env))."&cms_module_class=".rawurlencode($this->class_name)."',
395                                        handelAs : 'text/html',
396                                        load : function(data){
397                                                dijit.byId(dom_id).set('content',data);
398                                        }
399                                });             
400                        }
401                </script>";
402                if($ajax){
403                        $form.="
404                <script type='text/javascript'>
405                        function cms_module_save(){
406                                dojo.xhrPost({
407                                        form: '".$this->class_name."_form',
408                                        handleAs: 'json',
409                                        load: function(data) {
410                                                dojo.byId('cms_module_common_module_id').value = data;";
411                        if($callback!=''){
412                                $form.="
413                                                if(typeof(".$callback.") == 'function'){
414                                                        ".$callback."(data);
415                                                }else{
416                                                        alert('".$this->addslashes($this->msg['cms_module_common_module_saved'])."');
417                                                }";     
418                        }else{
419                                $form.="
420                                                alert('".$this->addslashes($this->msg['cms_module_common_module_saved'])."');";
421                        }
422                        $form.="
423                                        },
424                                        error: function(error) {
425                                                alert('".$this->addslashes($this->msg['cms_module_common_module_save_error'])."');
426                                        }
427                                });
428                        }
429                       
430                        function cms_module_delete(){
431                                dojo.xhrGet({
432                                        url: './ajax.php?module=cms&categ=module&elem=".$this->class_name."&action=delete&id=".$this->id."',
433                                        handleAs: 'json',
434                                        load: function(data) {";
435                                if($delete_callback!=''){
436                                        $form.="
437                                                if(typeof(".$delete_callback.") == 'function'){
438                                                        ".$delete_callback."(data);
439                                                }else{
440                                                        alert('".$this->addslashes($this->msg['cms_module_common_module_deleted'])."');
441                                                }";     
442                                }else{
443                                        $form.="
444                                                alert('".$this->addslashes($this->msg['cms_module_common_module_deleted'])."');";
445                                }
446                                $form.="
447                                        },
448                                        error: function(error) {
449                                                alert('".$this->addslashes($this->msg['cms_module_common_module_delete_error'])."');
450                                        }
451                                });             
452                        }
453                </script>";
454                }
455                return $form;
456        }
457       
458        protected function get_modcache_choices(){
459                return array(
460                        array(
461                                'value' => "no_cache",
462                                'name' => $this->msg['cms_module_common_module_no_cache']
463                        ),
464                        array(
465                                'value' => "get_post",
466                                'name' => $this->msg['cms_module_common_module_cache_get_post']
467                        ),
468                        array(
469                                'value' => "get_post_view",
470                                'name' => $this->msg['cms_module_common_module_cache_get_post_view']
471                        ),
472                        array(
473                                'value' => "view",
474                                'name' => $this->msg['cms_module_common_module_cache_view']
475                        ),
476                        array(
477                                'value' => "all",
478                                'name' => $this->msg['cms_module_common_module_cache_all']
479                        ),
480                );
481        }
482       
483        public static function get_hash_cache($obj_name,$id){
484                global $dbh, $lang;
485                $str_to_hash = "";
486                $hash = "";
487                $str_to_hash_more="";
488                if($tmp=$_SERVER["REQUEST_URI"]){
489                        if(preg_match("#/([^/]*?\.php)#i",$tmp,$matches)){
490                                if($tmp2=trim($matches[1])){
491                                        $str_to_hash_more.=$tmp2;
492                                }
493                        }
494                }
495                if($_SESSION["id_empr_session"]){//utilisateur connecté
496                        $str_to_hash_more.="_empr_is_logged";
497                }
498               
499                if($id){
500                        $query = "select cadre_modcache from cms_cadres where id_cadre = ".$id;
501                        $result = mysql_query($query,$dbh);
502                        if(mysql_num_rows($result)){
503                                $mode = mysql_result($result,0,0);
504                        }else{
505                                $mode = "get_post";
506                        }
507                        switch($mode){
508                                case "no_cache" :
509                                        $str_to_hash = "";
510                                        break;
511                                case "get_post_view" :
512                                        $str_to_hash = $obj_name."_".serialize($_GET)."_".serialize($_POST)."_".$_SESSION['opac_view'];
513                                        break;
514                                case "view" :
515                                        $str_to_hash = $obj_name."_".$_SESSION['opac_view'];
516                                        break;
517                                case "all" :
518                                        $str_to_hash = $obj_name;
519                                        break;
520                                case "get_post" :
521                                        $str_to_hash = $obj_name."_".serialize($_GET)."_".serialize($_POST);
522                                        break;
523                        }
524                }
525                if($str_to_hash) {
526                        $hash = md5($lang."_".$str_to_hash.$str_to_hash_more);
527                }
528                return $hash;
529        }
530       
531
532        public function build_cadre_url(){             
533                global $cms_build_info;
534               
535                if(!is_array($cms_build_info))return "";
536                $url=$cms_build_info['input']."?";     
537
538                foreach($cms_build_info['get'] as $key => $val){
539                        if($key!="database" && $key!="cms_build_activate" && $key!="build_id_version")
540                                $url.="&$key=$val";
541                }       
542                foreach($cms_build_info['post'] as $key => $val){
543                        $url.="&$key=$val";
544                }
545                return $url;
546        }
547       
548        public function save_form(){
549                global $datasource_choice;
550                global $view_choice;
551                global $filter_choice;
552                global $cms_module_common_module_name;
553                global $cms_module_common_module_fixed;
554                global $cms_module_common_module_memo_url;             
555                global $cms_module_common_module_modcache;     
556               
557                $this->name = strip_tags(stripslashes($cms_module_common_module_name));
558                //on calcule un hash...
559                $this->get_hash();             
560                //on enregistre le cadre...
561                if($cms_module_common_module_memo_url){
562                        $cadre_url = " cadre_url = '".$this->build_cadre_url()."', ";
563                }
564                if($this->id){
565                        $query = "update cms_cadres set ";
566                        $clause = " where id_cadre = ".$this->id;
567                }else{
568                        $query = "insert into cms_cadres set ";
569                        $clause= "";
570                }
571                $query.= "
572                        cadre_hash = '".$this->hash."',
573                        cadre_object = '".$this->class_name."',
574                        cadre_name = '".addslashes($this->name)."',
575                        cadre_fixed = ".($cms_module_common_module_fixed ? "1" : "0")." ,       
576                        $cadre_url             
577                        cadre_memo_url = ".($cms_module_common_module_memo_url ? "1" : "0").",
578                        cadre_modcache ='".addslashes($cms_module_common_module_modcache)."'           
579                        ".$clause;
580               
581                $result = mysql_query($query);
582                if($result){
583                        if(!$this->id){
584                                $this->id = mysql_insert_id();
585                        } 
586                       
587                        //les Conditions
588                        $result = $this->save_conditions();
589                        if($result){
590                                //source de donnée
591                                if($datasource_choice == $this->datasource['name']){
592                                        $datasource_id = $this->datasource['id'];
593                                }else{
594                                        $datasource_id = 0;
595                                }
596                                $datasource = new $datasource_choice($datasource_id);
597                                $datasource->set_cadre_parent($this->id);
598                                $result = $datasource->save_form();
599                                if($result){
600                                        $this->datasource = array(
601                                                'id' => $datasource->id,
602                                                'name' => $datasource_choice
603                                        );
604                                        //le filtre
605                                        if($filter_choice == $this->filter['name']){
606                                                $filter_id = $this->filter['id'];
607                                        }else{
608                                                $filter_id = 0;
609                                        }
610                                        if($filter_choice){
611                                                $filter = new $filter_choice($filter_id);
612                                                $filter->set_cadre_parent($this->id);
613                                                $result = $filter->save_form();
614                                               
615                                                if($result){
616                                                        $this->filter = array(
617                                                                        'id' => $filter->id,
618                                                                        'name' => $filter_choice
619                                                        );
620                                                }else{
621                                                        //      sauvegarde du filtre ratée, on supprime le cadre...
622                                                        $this->delete();
623                                                }
624                                        }
625                                        //vue
626                                        if($view_choice == $this->view['name']){
627                                                $view_id = $this->view['id'];
628                                        }else{
629                                                $view_id = 0;
630                                        }
631                                        $view = new $view_choice($view_id);
632                                        $view->set_cadre_parent($this->id);
633                                        $result = $view->save_form();
634                                        if($result){
635                                                $this->view = array(
636                                                                'id' => $view->id,
637                                                                'name' => $view_choice
638                                                );
639                                                       
640                                                //reste à nettoyer la table de hash...
641                                                $this->clean_hash_table();
642                                                //tout est bon, on a fini
643                                                return $this->utf8_normalize(array(
644                                                                'id' => $this->id,
645                                                                'name' => $this->name,
646                                                                'object' => $this->class_name,
647                                                                'dom_id' => $this->get_dom_id()
648                                                ));
649                                        }else{
650                                                //      sauvegarde de la vue ratée, on supprime le cadre...
651                                                $this->debug(sprintf($this->msg['cms_module_commom_module_view_save_error'],$view_choice),CMS_DEBUG_MODE_FILE);
652                                                $this->delete();
653                                        }
654                                }else{
655                                        //sauvegarde de la source de donnée ratée, on supprime le cadre...
656                                        $this->debug(sprintf($this->msg['cms_module_commom_module_datasource_save_error'],$datasource_choice),CMS_DEBUG_MODE_FILE);
657                                        $this->delete();
658                                }
659                        }else{
660                                //sauvegarde des conditions ratée, on supprime le cadre...
661                                $this->debug($this->msg['cms_module_commom_module_conditions_save_error'],CMS_DEBUG_MODE_FILE);
662                                $this->delete();
663                        }
664                }else{
665                        //création du cadre ratée, on supprime le hash de la table...
666                        $this->debug(sprintf($this->msg['cms_module_commom_module_cadre_save_error'],$this->cadre_name),CMS_DEBUG_MODE_FILE);
667                        $this->delete_hash();
668                }
669                return false;
670        }
671       
672        public function get_conditions_form(){
673                $form ="
674                        <div class='row'>
675                                <div class='colonne3'>
676                                        <label for='cms_module_common_module_conditions_selector'>".$this->format_text($this->msg['cms_module_common_module_conditions_selector'])."</label>
677                                </div>
678                                <div class='colonne-suite'>
679                                        <select name='cms_module_common_module_conditions_selector' onchange='load_condition_form(this.value);'>
680                                                <option value='0'>".$this->format_text($this->msg['cms_module_common_module_conditions_selector_choice'])."</option>";
681                for($i=0 ; $i<count($this->elements_used['condition']) ; $i++){
682                        $form.= "
683                                                <option value='".$this->elements_used['condition'][$i]."'>".$this->format_text($this->msg[$this->elements_used['condition'][$i]])."</option>";
684                }
685                $form.="                               
686                                        </select>
687                                        <input type='hidden' name='cms_module_common_module_conditions[]' id='cms_module_common_module_conditions'/>
688                                </div>
689                                <div id='cms_module_common_module_conditions_form'>";
690                for($i=0 ; $i<count($this->conditions) ; $i++){
691                        $form.="
692                                <script type='text/javascript'>
693                                        dojo.xhrPost({
694                                                url : './ajax.php?module=cms&categ=module&elem=".$this->conditions[$i]['name']."&action=get_form&id=".$this->conditions[$i]['id']."',
695                                                postData : 'cms_build_info=".rawurlencode(serialize($this->cms_build_env))."&cms_module_class=".rawurlencode($this->class_name)."',
696                                                handelAs : 'text/html',
697                                                load : function(data){
698                                                        var form_content = dojo.create('div');
699                                                        var condition_form= new dojox.layout.ContentPane({
700                                                                content : data
701                                                        },form_content);
702                                                        dojo.place(form_content,'cms_module_common_module_conditions_form');
703                                                }
704                                        });                                                     
705                                </script>";
706                }
707                $form.="       
708                                </div>
709                        </div>
710                        <script type='text/javascript'>
711                                dojo.require('dojox.layout.ContentPane');
712                                function load_condition_form(condition){
713                                        if(condition!=0){
714                                                var form_content = dojo.create('div');
715                                                dojo.xhrPost({
716                                                        url : './ajax.php?module=cms&categ=module&elem='+condition+'&action=get_form&id=0',
717                                                        postData : 'cms_build_info=".rawurlencode(serialize($this->cms_build_env))."&cms_module_class=".rawurlencode($this->class_name)."',
718                                                        handelAs : 'text/html',
719                                                        load : function(data){
720                                                                var condition_form= new dojox.layout.ContentPane({
721                                                                        content : data
722                                                                },form_content);
723                                                                dojo.place(form_content,'cms_module_common_module_conditions_form');
724                                                        }
725                                                });             
726                                        }
727                                }
728                        </script>";
729                return $form;
730        }
731       
732        public function save_conditions(){
733                global $cms_module_common_module_conditions; 
734                $result = true;
735                for($i=0 ; $i<count($cms_module_common_module_conditions) ; $i++){
736                        if($cms_module_common_module_conditions[$i] != ""){                                             
737                                $condition_id=0;
738                                for($j=0 ; $j<count($this->conditions) ; $j++){
739                                        if($cms_module_common_module_conditions[$i] == $this->conditions[$j]['name']){
740                                                $condition_id = $this->conditions[$j]['id'];
741                                                break;
742                                        }
743                                }
744                                $condition = new $cms_module_common_module_conditions[$i]($condition_id);
745                                $condition->set_cadre_parent($this->id);
746                                $result = $condition->save_form();
747                                if($result){
748                                        if($condition_id == 0){
749                                                $this->conditions[]=array(
750                                                        'id' => $condition->id,
751                                                        'name' => $cms_module_common_module_conditions[$i]
752                                                );
753                                        }
754                                        continue;
755                                }else{
756                                        break;
757                                }
758                        }
759                }
760                return $result;
761        }
762       
763        public function delete(){
764                $dom_id = $this->get_dom_id();
765                //on commence par supprimer la définition dans le portail...
766                $query = "delete from cms_build where build_obj = '".$dom_id."'";
767                mysql_query($query);
768               
769                //on élimine tous les éléments associés directement au cadre...
770                $query = "select id_cadre_content, cadre_content_object from cms_cadre_content where cadre_content_num_cadre = ".$this->id." and cadre_content_num_cadre_content = 0";
771                $result=mysql_query($query);
772                if(mysql_num_rows($result)){
773                        //pour éviter tout problème, on ne supprime pas directement les élements de la table, on appelle la méthode de suppression de l'objet...
774                        while($row = mysql_fetch_object($result)){
775                                $elem = new $row->cadre_content_object($row->id_cadre_content);
776                                $success = $elem->delete();
777                                if(!$success){
778                                        //TODO verbose mode
779                                        return false;
780                                }
781                        }
782                }
783                //il ne peut en rester qu'un, et c'est perdu pour celui-ci...
784                $query = "delete from cms_cadres where id_cadre = ".$this->id;
785                $result = mysql_query($query);
786                if($result){
787                        $this->delete_hash();
788                        return array('dom_id' =>$dom_id);
789                }else{
790                        //TODO verbose mode
791                        return false;
792                }
793        }
794       
795        public function check_conditions(){
796                for($i=0 ; $i<count($this->conditions) ; $i++){
797                        $condition = new $this->conditions[$i]['name']($this->conditions[$i]['id']);
798                        if(!$condition->check_condition()){
799                                return false;
800                        }else{
801                                continue;
802                        }
803                }
804                return true;
805        }
806       
807        public function show_cadre(){
808                if($this->datasource['id']!= 0){
809                        $datasource = new $this->datasource['name']($this->datasource['id']);   
810                        if($this->filter['id']!= 0){
811                                $filter = new $this->filter['name']($this->filter['id']);
812                                $datasource->set_filter($filter);
813                        }
814                        $datas = $datasource->get_datas();
815                        if($this->view['id'] != 0){
816                                $view = new $this->view['name']($this->view['id']);
817                                return "<div id='".$this->get_dom_id()."'>".$view->render($datas)."</div>";
818                        }
819                }
820                return "";
821        }
822       
823        public function get_dom_id(){
824                return $this->class_name."_".$this->id;
825        }
826       
827        protected function creation_init(){
828                //on regarde si des conditions peuvent être pré-chargées...
829                for($i=0 ; $i<count($this->elements_used['condition']) ; $i++){
830                        //appel statique du test de la conditions
831                        if(call_user_func(array($this->elements_used['condition'][$i],is_loadable_default))){
832                                //      si c'est positif, on ajoute la condition...
833                                $this->conditions[]=array(
834                                        'id' => 0,
835                                        'name' => $this->elements_used['condition'][$i]
836                                );
837                        }
838                }
839        }
840
841        public function get_headers(){
842                $headers=array();
843                $datasource = new $this->datasource['name']($this->datasource['id']);
844                $headers = array_merge($headers,$datasource->get_headers());
845                $headers = array_unique($headers);
846                $view = new $this->view['name']($this->view['id']);
847                $headers = array_merge($headers,$view->get_headers());
848                $headers = array_unique($headers);
849                for($i=0 ; $i<count($this->conditions) ; $i++){
850                        $condition = new $this->conditions[$i]['name']($this->conditions[$i]['id']);
851                        $headers = array_merge($headers,$condition->get_headers());
852                        $headers = array_unique($headers);
853                }               
854                return $headers;
855        }
856       
857        protected function fetch_managed_datas(){
858                $query = "select managed_module_box from cms_managed_modules where managed_module_name = '".$this->class_name."'";
859                $result = mysql_query($query);
860                if(mysql_num_rows($result)){
861                        $this->managed_datas = unserialize(mysql_result($result,0,0));
862                }
863        }
864       
865        public function get_manage_forms(){
866                global $base_path;
867                global $quoi;
868               
869                switch($quoi){
870                        case "views" :
871                        case "datasources" :
872                        case "conditions" :
873                                $form = $this->get_element_manage_form($quoi);
874                                break;
875                        case "module" :
876                                $form= $this->get_manage_form();
877                                break;
878                }
879                return $form;
880        }
881       
882        public function save_manage_forms(){
883                global $quoi,$elem;
884                       
885                //on sauvegarde les infos modifiées
886                switch ($quoi){
887                        case "views" :
888                        case "datasources" :
889                        case "conditions" :
890                                $this->managed_datas[$quoi][$elem] = call_user_func(array($elem,"save_manage_form"),$this->managed_datas[$quoi][$elem]);
891                                break;
892                        case "module" :
893                                $this->managed_datas[$quoi] = $this->save_manage_form();
894                                break;         
895                }
896                $query = "replace into cms_managed_modules set managed_module_name = '".$this->class_name."', managed_module_box = '".$this->addslashes(serialize($this->managed_datas))."'";
897                return mysql_query($query);
898        }
899       
900        public function get_manage_menu(){
901                global $javascript_path;
902                $manage_menu = "
903                        <script type='text/javascript' src='".$javascript_path."/cms/cms_form.js'></script>
904                ";
905                //on regarde si le module lui-même est administrable
906                if(method_exists($this->class_name,"get_manage_form")){
907                        $manage_menu.= "
908                        <span".ongletSelect("categ=manage&sub=".str_replace("cms_module_","",$this->class_name)."&quoi=module").">
909                                <a title='".$this->format_text($this->msg["cms_manage_module_general"])."' href='./cms.php?categ=manage&sub=".str_replace("cms_module_","",$this->class_name)."&quoi=module'>
910                                        ".$this->format_text($this->msg["cms_manage_module_general"])."
911                                </a>
912                        </span>";
913                }
914                //on regarde aussi pour chaque type d'éléments
915                $elements=array("view","datasource","condition");
916                foreach($elements as $element){
917                        if($this->check_managed_elem($element)){
918                                $manage_menu.= "
919                <span".ongletSelect("categ=manage&sub=".str_replace("cms_module_","",$this->class_name)."&quoi=".$element."s").">
920                        <a title='".$this->format_text($this->msg["cms_manage_module_".$element."s"])."' href='./cms.php?categ=manage&sub=".str_replace("cms_module_","",$this->class_name)."&quoi=".$element."s'>
921                                ".$this->format_text($this->msg["cms_manage_module_".$element."s"])."
922                        </a>
923                </span>";
924                        }
925                }
926                return $manage_menu;
927        }
928       
929        protected function check_managed_elem($elem){
930                foreach($this->elements_used[$elem] as $element){
931                        if(method_exists($element,"get_manage_form")){
932                                return true;
933                        }
934                }
935                return false;
936        }
937       
938        protected function get_element_manage_form($quoi){
939                global $base_path;
940                global $elem;
941                $type = substr($quoi,0,strlen($quoi)-1);
942                $nb_managed_elems=0;
943                $elem_choice="";
944                for($i=0 ; $i<count($this->elements_used[$type]) ; $i++){
945                        if(method_exists($this->elements_used[$type][$i],"get_manage_form")){
946                                if(!$elem) $elem = $this->elements_used[$type][$i];
947                                $nb_managed_elems++;
948                                $elem_choice.="<p><a href='".$base_path."/cms.php?categ=manage&sub=".str_replace("cms_module_","",$this->class_name)."&quoi=".$quoi."&elem=".$this->elements_used[$type][$i]."&action=get_form'>".$this->format_text($this->msg[$this->elements_used[$type][$i]])."</a></p>";
949                        }
950                }
951               
952                $form="
953                <div dojoType='dijit.layout.BorderContainer' style='width: 100%; height: 800px;'>";
954                if($nb_managed_elems>1){
955                        $form.="
956                        <div dojoType='dijit.layout.ContentPane' region='left' splitter='true' style='width:300px;' >
957                                ".$elem_choice."
958                        </div>";
959                }
960                $form.="
961                        <div dojoType='dijit.layout.ContentPane' region='center' >";
962                $view = new $elem();
963                $view->set_module_class_name($this->class_name);
964                $form.= $view->get_manage_form();
965                $form.="
966                        </div>
967                </div>";
968                return $form;           
969        }
970       
971        protected function get_filters_form(){
972                $form = "";
973                if(count($this->elements_used['filter'])){
974                        $form.="
975                        <hr/>
976                        <div class='row'>
977                                <div class='colonne3'>
978                                        <label>".$this->format_text($this->msg['cms_module_common_module_filter_label'])."
979                                </div>
980                                <div class='colonne_suite'>
981                                        <select name='filter_choice' onchange='load_filter_form(this.value)'>
982                                                <option value=''>".$this->format_text($this->msg['cms_module_common_module_filter_choice'])."</option>";
983                        foreach($this->elements_used['filter'] as $filter){
984                                $form.= "
985                                                <option value='".$filter."'".($filter == $this->filter['name'] ? " selected='selected'" : "").">".$this->format_text($this->msg[$filter])."</option>";
986                        }
987                        $form.="
988                                        </select>
989                                        <script type='text/javascript'>
990                                                function load_filter_form(filter){
991                                                        if(filter != ''){
992                                                                cms_module_load_elem_form(filter,'0','filter_form');
993                                                        }else{
994                                                                dojo.byId('filter_form').innerHTML= '';
995                                                        }
996                                                }
997                                        </script>                                       
998                                </div>
999                        </div>
1000                        <div class='row' id='filter_form' dojoType='dojox.layout.ContentPane'></div>
1001                        <div class='row'>&nbsp;</div>"; 
1002                }
1003                return $form;
1004        }
1005       
1006        public function get_exported_datas(){
1007                $infos = array(
1008                        "id" => $this->id,
1009                        "class" => $this->class_name,
1010                        "name" => $this->name,
1011                        "hash" => $this->hash,
1012                        "fixed"=> $this->fixed,
1013                        "managed_datas" => $this->managed_datas,
1014                        "parameters" => $this->parameters
1015                );
1016                $datasource = new $this->datasource['name']($this->datasource['id']);
1017                $infos['datasource'] = $datasource->get_exported_datas();
1018                $view = new $this->view['name']($this->view['id']);
1019                $infos['view'] = $view->get_exported_datas();
1020                $infos['conditions'] = array();
1021                for($i=0 ; $i<count($this->conditions) ; $i++){
1022                        $condition = new $this->conditions[$i]['name']($this->conditions[$i]['id']);
1023                        $infos['conditions'][] = $condition->get_exported_datas();
1024                }
1025                return $infos;
1026        }
1027       
1028       
1029        public function get_extension_form($type,$type_elem,$num_elem){
1030                $query = "select extension_datas_datas from cms_modules_extensions_datas where extension_datas_module = '".$this->class_name."' and extension_datas_type = '".$type."' and extension_datas_type_element = '".$type_elem."' and extension_datas_num_element = '".$num_elem."'";
1031                $result = mysql_query($query);
1032                if(mysql_num_rows($result)){
1033                        $this->extension_datas = unserialize(mysql_result($result,0,0));
1034                }
1035                //on var chercher les données pour l'élément courant
1036                return $this->get_hash_form();
1037        }
1038       
1039       
1040        protected function save_extension_form($type,$type_elem,$num_elem){
1041                //on supprime ceux d'avant...
1042                $query = "delete from cms_modules_extensions_datas where extension_datas_module = '".$this->class_name."' and extension_datas_type = '".$type."' and extension_datas_type_element = '".$type_elem."' and extension_datas_num_element = '".$num_elem."'";
1043                mysql_query($query);
1044               
1045                $query = "insert into cms_modules_extensions_datas set
1046                        extension_datas_module = '".$this->class_name."',
1047                        extension_datas_type_element = '".$type_elem."',
1048                        extension_datas_num_element = '".$num_elem."',
1049                        extension_datas_type = '".$type."',
1050                        extension_datas_datas = '".addslashes(serialize($this->extension_datas))."'";
1051                mysql_query($query);
1052        }
1053       
1054
1055        //on parcours les conditions pour savoir si rien n'empeche la mise en cache du cadre!
1056        public function check_for_cache(){
1057                for($i=0 ; $i<count($this->conditions) ; $i++){
1058                        $condition = $this->conditions[$i]['name'];
1059                        if(!$condition::use_cache()){
1060                                return false;
1061                        }else{
1062                                continue;
1063                        }
1064                }
1065                return true;           
1066        }
1067}
Note: See TracBrowser for help on using the repository browser.