/class.xmodtable.inc
PHP | 4658 lines | 4000 code | 247 blank | 411 comment | 778 complexity | 55424be8b9a6697202b4b2a0f9d9c4c8 MD5 | raw file
Possible License(s): LGPL-2.0, LGPL-2.1, GPL-3.0, Apache-2.0, BSD-3-Clause
- <?php
- /****c* tzr-5/XModTable
- * NAME
- * XModTable -- gestion d'un ensemble de fiches
- * DESCRIPTION
- * Affichage edition et manipulations diverses sur une ensemble de fiches.
- * SYNOPSIS
- * La creation d'un module est realisee par utilisation de la methode de classe XModule::objectFactory.
- * PARAMETERS
- ****/
- /// Module de gestion de fiches, base sur une simple table SQL
- class XModTable extends XModule implements XModuleContainerInterface, XCalInterface {
- static $_templates;
- public $xset=NULL;
- public $fieldssec=array();
- public $boid;
- public $table='T001';
- public $multipleedit=true;
- public $owner_sec=true;
- public $filter='';
- public $order='UPD DESC';
- public $quickquery=true;
- public $stored_query=false;
- public $pagesize=TZR_XMODTABLE_BROWSE_PAGESIZE;
- public $templates='';
- public $btemplates='';
- public $captcha=false;
- public $savenext='standard';
- public $showsystprop='show';
- public $persistentquery=false;
- public $trackaccess=false;
- public $trackchanges=true;
- public $archive=false;
- public $searchtemplate='xmodtable/searchResult.html';
- public $submodsearch=false;
- private $secOids_cache;
- private $navActions = NULL;
- function __construct($ar=NULL) {
- parent::__construct($ar);
- XLabels::loadLabels('xmodtable');
- $this->xset=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$this->table);
- if (!is_object($this->xset)) {
- throw new Exception('Non existent table: "'.$this->table.'"');
- }
- $this->boid=$this->xset->getBoid();
- if(XShell::admini_mode() && empty($this->_templates) && (!empty($this->templates) || !empty($this->btemplates)))
- $this->_templates=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS=TEMPLATES');
- if(!XShell::isRoot() && !empty($GLOBALS['XUSER'])) $this->loadFieldsSec($this->fieldssec);
- }
- /// Duplication d'un module, méthode interne
- /// Retour : duplicatetables => liste des tables dupliquées par le module (cle : ancienne table, valeur : nouvelle table))
- /// Retour : duplicatemods => liste des modules dupliqués par le module (cle : ancien moid, valeur : nouveau moid))
- function _duplicateModule($newmoid,&$params,$prefix) {
- if(!is_array($params['tables'])) $params['tables']=array();
- if(!$params['noduplicatetable']){
- if(empty($params['tables'][$this->table])){
- $ar['newtable']=XDSTable::newTableNumber();
- if(($pos=strpos($this->xset->getLabel(),':'))!==false) $ar['mtxt']=$prefix.substr($this->xset->getLabel(),$pos);
- else $ar['mtxt']=$prefix.':'.$this->xset->getLabel();
- $ar['data']=true;
- $ar['_options']=array('local'=>1);
- $xset2=$this->xset->procDuplicateDataSource($ar);
- $params['table']=$ar['newtable'];
- }else{
- $params['table']=$params['tables'][$this->table];
- }
- }
- unset($params['noduplicatetable']);
- return array('duplicatetables'=>array($this->table=>$params['table']),'duplicatemods'=>array());
- }
- /// securite des fonctions accessibles par le web
- function secGroups($function, $group=NULL) {
- $g=array();
- $g['browse']=array('list','ro','rw','rwv','admin');
- $g['browseFiles']=array('list','ro','rw','rwv','admin');
- $g['del']=array('rw','rwv','admin');
- $g['delAll']=array('rw','rwv','admin');
- $g['delStoredQuery']=array('rw','rwv','admin');
- $g['display']=array('ro','rw','rwv','admin');
- $g['XMCdisplay']=array('ro','rw','rwv','admin');
- $g['edit']=array('rw','rwv','admin');
- $g['editSelection']=array('rw','rwv','admin');
- $g['editAll']=array('rw','rwv','admin');
- $g['export']=array('list','ro','rw','rwv','admin');
- $g['exportDisplay']=array('ro','rw','rwv','admin');
- $g['exportFilesBatch']=array('ro','rw','rwv','admin');
- $g['gDisplay']=array('admin');
- $g['insert']=array('rw','rwv','admin');
- $g['journal']=array('ro','rw','rwv','admin');
- $g['prePrintBrowse']=array('list','ro','rw','rwv','admin');
- $g['prePrintDisplay']=array('list','ro','rw','rwv','admin');
- $g['preExportBrowse']=array('list','ro','rw','rwv','admin');
- $g['preExportDisplay']=array('list','ro','rw','rwv','admin');
- $g['printBrowse']=array('list','ro','rw','rwv','admin');
- $g['printDisplay']=array('ro','rw','rwv','admin');
- $g['procEdit']=array('rw','rwv','admin');
- $g['procEditDup']=array('rw','rwv','admin');
- $g['procEditAllLang']=array('rw','rwv','admin');
- $g['procEditSelection']=array('rw','rwv','admin');
- $g['procInsert']=array('rw','rwv','admin');
- $g['procQuery']=array('list','ro','rw','rwv','admin');
- $g['procQueryFiles']=array('list','ro','rw','rwv','admin');
- $g['publish']=array('rwv','admin');
- $g['query']=array('list', 'ro','rw','rwv','admin');
- $g['quickquery']=array('list','ro','rw','rwv','admin');
- $g['adminSubscribe']=array('admin');
- $g['getUnread']=array('list','ro','rw','rwv','admin');
- $g['markAsRead']=array('list','ro','rw','rwv','admin');
- self::getGetAdminSecGroups($g);
- if(isset($g[$function])) {
- if(!empty($group)) return in_array($group, $g[$function]);
- return $g[$function];
- }
- return parent::secGroups($function,$group);
- }
- /// Complete le tableau des focntion du module avec les fonction d'administration
- function getGetAdminSecGroups(&$g){
- $g['adminBrowseFields']=array('admin');
- $g['adminPrint']=array('admin');
- $g['adminClear']=array('admin');
- $g['adminDuplicate']=array('admin');
- $g['adminProcDuplicate']=array('admin');
- $g['adminChk']=array('admin');
- $g['adminEditSourceProperties']=array('admin');
- $g['adminProcEditSourceProperties']=array('admin');
- $g['adminNewField']=array('admin');
- $g['adminProcNewField']=array('admin');
- $g['adminEditField']=array('admin');
- $g['adminProcEditField']=array('admin');
- $g['adminProcEditFields']=array('admin');
- $g['adminDelField']=array('admin');
- $g['adminBrowseStrings']=array('admin');
- $g['adminNewString']=array('admin');
- $g['adminProcNewString']=array('admin');
- $g['adminEditString']=array('admin');
- $g['adminProcEditString']=array('admin');
- $g['adminDelString']=array('admin');
- $g['adminSortStrings']=array('admin');
- $g['adminClearStrings']=array('admin');
- $g['adminPreImportFieldsSec']=array('admin');
- $g['adminImportFieldsSec']=array('admin');
- $g['adminResetChrono']=array('admin');
- }
- /* Webservice du module */
- /// Sous fonction chargée d'ajouter les types necessaires
- function _SOAPWSDLTypes(&$wsdl){
- $fields=array(array('minOccurs'=>1,'maxOccurs'=>1,'name'=>'oid','type'=>'xsd:string'));
- foreach($this->xset->desc as $n=>&$f){
- $type=$f->getSoapType();
- $fields[]=array('minOccurs'=>0,'maxOccurs'=>1,'name'=>$n,'type'=>$type['name']);
- if(!empty($type['descr'])) $this->_SOAPAddTypes($wsdl,$type['descr']);
- }
- $this->_SOAPAddTypes($wsdl,array('browseParam'=>array(array('name'=>'filter','minOccurs'=>0,'maxOccurs'=>1,'type'=>'xsd:string'),
- array('name'=>'fields','minOccurs'=>0,'maxOccurs'=>1,'type'=>'xsd:string')),
- 'displayParam'=>array(array('name'=>'oid','minOccurs'=>1,'maxOccurs'=>1,'type'=>'xsd:string')),
- 'displayResult'=>$fields,
- 'browseResult'=>array(array('name'=>'line','minOccurs'=>0,'maxOccurs'=>'unbounded','type'=>'tns:displayResult'))));
- return;
- }
- /// Sous fonction chargée d'ajouter les messages necessaires
- function _SOAPWSDLMessages(&$wsdl){
- $wsdl->addMessage('browseIn',array('context'=>'tns:contextParam','param'=>'tns:browseParam'));
- $wsdl->addMessage('browseOut',array('return'=>'tns:browseResult'));
- $wsdl->addMessage('displayIn',array('context'=>'tns:contextParam','param'=>'tns:displayParam'));
- $wsdl->addMessage('displayOut',array('return'=>'tns:displayResult'));
- return;
- }
- /// Sous fonction chargée d'ajouter les ports necessaires
- function _SOAPWSDLPortOps(&$wsdl,&$pt){
- $wsdl->addPortOperation($pt,'browse','tns:browseIn','tns:browseOut');
- $wsdl->addPortOperation($pt,'display','tns:displayIn','tns:displayOut');
- return;
- }
- /// Sous fonction chargée d'ajouter les operations necessaires
- function _SOAPWSDLBindingOps(&$wsdl,&$b){
- $bo=$wsdl->addBindingOperation($b,'browse',array('use'=>'literal'),array('use'=>'literal'));
- $o=$wsdl->addSoapOperation($bo,'');
- $o->setAttribute('style','rpc');
- $bo=$wsdl->addBindingOperation($b,'display',array('use'=>'literal'),array('use'=>'literal'));
- $o=$wsdl->addSoapOperation($bo,'');
- $o->setAttribute('style','rpc');
- return;
- }
- /// Sous fonction declarant les fonctions du module
- function _SOAPRequestFunctions(&$server) {
- function browse($context,$params){
- global $soapmod;
- $LANG_DATA = XShell::getLangData();
- XLogs::debug("SOAPRequest function browse LANG:$LANG_DATA filter:".$params->filter." fields:".$params->fields);
- $soapmod->SOAPContext($context,'browse');
- $ar=array('tplentry'=>TZR_RETURN_DATA,'pagesize'=>999999);
- if(!empty($params->fields)){
- if($params->fields=='all' || $params->fields=='*') $ar['selectedfields']='all';
- else $ar['selectedfields']=explode(',',$params->fields);
- }
- if(!empty($params->filter)){
- $translatable = $soapmod->xset->getTranslatable();
- if(!$translatable) $LANG_DATA=TZR_DEFAULT_LANG;
- $ar['select']='select * from '.$soapmod->table.' where LANG="'.$LANG_DATA.'" AND ('.str_ireplace(' select ','',$params->filter).')';
- }
- $ar['nocount'] = 1;
- foreach($ar['selectedfields'] as $fieldname){
- $ar['options'][$fieldname]['nofollowlinks']=1;
- }
- $br=$soapmod->browse($ar);
- $lines=array();
- foreach($br['lines_oid'] as $i=>$oid){
- $line=array('oid'=>$oid);
- foreach($br['header_fields'] as $j=>&$f){
- $line[$f->field]=$br['lines_o'.$f->field][$i]->getSoapValue();
- }
- $lines[]=$line;
- }
- return array('line'=>$lines);
- }
- function display($context,$params){
- global $soapmod;
- XLogs::debug("SOAPRequest function display oid:".$params->oid);
- $soapmod->SOAPContext($context,'display',$params->oid);
- $ar=array('tplentry'=>TZR_RETURN_DATA,'oid'=>$params->oid);
- $br=$soapmod->display($ar);
- $ret=array('oid'=>$br['oid']);
- foreach($br['fields_object'] as $j=>&$f){
- $ret[$f->field]=$br['o'.$f->field]->getSoapValue();
- }
- return $ret;
- }
- $server->addFunction(array('browse','display'));
- }
- /// Rend la liste des fonctions utilisables dans le gestionnaire de rubriques en mode fonction (tableau de paires fonction=>label)
- function getUIFunctionList() {
- return array('display'=>XLabels::getSysLabel('xmodtable','uidisplay','text'),
- 'procQuery'=>XLabels::getSysLabel('xmodtable','uiquery','text'),
- 'insert'=>XLabels::getSysLabel('xmodtable','uiinsert','text'));
- }
- /// Suppression du module
- function delete($ar=NULL) {
- return parent::delete($ar);
- }
- /// Initialisation des propriétés
- public function initOptions() {
- parent::initOptions();
- $genlabel=XLabels::getSysLabel('xmodule.general');
- $this->_options->setOpt(XLabels::getSysLabel('xmodtable','multipleedit'),'multipleedit','boolean',NULL,NULL,$genlabel);
- $slabel=XLabels::getSysLabel('general','security','text');
- $this->_options->setOpt(XLabels::getSysLabel('xmodtable','owner_sec'),'owner_sec','boolean',NULL,NULL,$slabel);
- $alabel = XLabels::getSysLabel('xmodtable.modulename');
- $this->_options->setOpt(XLabels::getSysLabel('xmodtable','table'),'table','table',array('validate'=>true),NULL,$alabel);
- $this->_options->setOpt(XLabels::getSysLabel('xmodtable','filter'),'filter','text',NULL,NULL,$alabel);
- $this->_options->setOpt(XLabels::getSysLabel('xmodtable.order'),'order','text',NULL,NULL,$alabel);
- $this->_options->setOpt(XLabels::getSysLabel('xmodtable.quickquery'),'quickquery','boolean',NULL,NULL,$alabel);
- $this->_options->setOpt(XLabels::getSysLabel('xmodtable.stored_query'),'stored_query','boolean',NULL,NULL,$alabel);
- $this->_options->setOpt(XLabels::getSysLabel('xmodtable.pagesize'),'pagesize','text',NULL,NULL,$alabel);
- $this->_options->setOpt(XLabels::getSysLabel('xmodtable.templates'),'templates','template',array('moid'=>$this->_moid, 'cond'=>"(gtype like '%')"),
- NULL,$alabel);
- $this->_options->setOpt(XLabels::getSysLabel('xmodtable.btemplates'),'btemplates','template',array('moid'=>$this->_moid, 'cond'=>"(gtype like '%')"),
- NULL,$alabel);
- $this->_options->setOpt(XLabels::getSysLabel('xmodtable.captcha'),'captcha','boolean',NULL,NULL,$alabel);
- $this->_options->setOpt(XLabels::getSysLabel('xmodtable.savenext'),'savenext','list',
- array('values'=>array('standard','display','edit'),
- 'labels'=>array(XLabels::getSysLabel('xmodtable.savenext_std'),
- XLabels::getSysLabel('xmodtable.savenext_display'),
- XLabels::getSysLabel('xmodtable.savenext_edit'))),
- NULL, $alabel);
- $this->_options->setOpt(XLabels::getSysLabel('general.systemproperties'),'showsystprop','list',
- array('values'=>array('show','hide'),
- 'labels'=>array(XLabels::getSysLabel('general.yes'),
- XLabels::getSysLabel('general.no'))),
- NULL,$alabel);
- $this->_options->setOpt(XLabels::getSysLabel('xmodtable.persistentquery'),'persistentquery','boolean',NULL,NULL,$alabel);
- $slabel=XLabels::getSysLabel('xmodule.ssmod');
- $tlabel=XLabels::getSysLabel('general','title','text');
- $flabel=XLabels::getSysLabel('general','field','text');
- $ilabel=XLabels::getSysLabel('xmodtable','activate_additem');
- $dlabel=XLabels::getSysLabel('xmodtable','dependentfiles');
- $this->_options->setOpt(XLabels::getSysLabel('xmodtable','submodmax'),'submodmax','text',NULL,NULL,$slabel);
- $this->_options->setOpt(XLabels::getSysLabel('xmodtable','submodsearch'),'submodsearch','boolean',NULL,NULL,$slabel);
- if(!empty(XModule::$_mcache[$this->_moid]['MPARAM']['submodmax']))
- $this->_options->set($this,'submodmax',XModule::$_mcache[$this->_moid]['MPARAM']['submodmax']);
- for($i=1;$i<=$this->submodmax;$i++) {
- $this->_options->setOpt($tlabel.' '.$i,'ssmodtitle'.$i,'text',NULL,'',$slabel);
- $this->_options->setOpt($flabel.' '.$i,'ssmodfield'.$i,'text',NULL,'',$slabel);
- $this->_options->setOpt($slabel.' '.$i,'ssmod'.$i,'module',array('validate'=>true),'', $slabel);
- $this->_options->setOpt($ilabel.' '.$i,'ssmodactivate_additem'.$i,'boolean',NULL,true,$slabel);
- $this->_options->setOpt($dlabel.' '.$i,'ssmoddependent'.$i,'boolean',NULL,false,$slabel);
- }
- $tlabel=XLabels::getSysLabel('xmodule.tracking');
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','trackchanges'),'trackchanges','boolean',NULL,NULL,$tlabel);
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','trackaccess'),'trackaccess','boolean',NULL,NULL,$tlabel);
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','archive'),'archive','boolean',NULL,NULL,$tlabel);
- }
- /// Cette fonction est appliquee pour afficher l'ensemble des methodes de ce module
- protected function _actionlist(&$my) {
- parent::_actionlist($my);
- $myclass=get_class($this);
- $moid=$this->_moid;
- $myoid=@$_REQUEST['oid'];
- $user=&XUser::get_user();
- $f=XShell::_function();
- $uniqid='v'.XShell::uniqid();
- $submodcontext=NULL;
- // Parcourir
- if($this->secure('','browse')){
- // recupération du contexte sous module
- $submodcontext = $this->subModuleContext(array(), true);
- // en sous fiche, le browse est un retour à la fiche parent
- if($this->dependant_module && $submodcontext) {
- $o1=new XModuleAction($this,'browse',XLabels::getSysLabel('general','browse','text'),
- '&moid='.$this->dependant_module.'&_function=display&template=xmodtable/view.html&tplentry=br&oid='.
- $submodcontext['_parentoids'][0].$submodcontext['urlparms'],'display');
- } else {
- $o1=new XModuleAction($this,'browse',XLabels::getSysLabel('general','browse','text'),
- '&moid='.$moid.'&_function=browse&template=xmodtable/browse.html&tplentry=br','display');
- }
- $o1->containable=true;
- $o1->setToolbar('general','browse');
- $my['browse']=$o1;
- }
- // Recherche
- if((!$this->dependant_module || !$submodcontext) && $this->secure('','query')) {
- $o1=new XModuleAction($this,'query',XLabels::getSysLabel('general','query','text'),
- '&moid='.$moid.'&_function=query&template=xmodtable/query2.html&tplentry=br&querymode=query2','display');
- $o1->containable=true;
- $o1->setToolbar('general','query');
- $my['query']=$o1;
- }
- // Recherche en cours
- if($this->isThereAQueryActive()) {
- $o1=new XModuleAction($this,'procQuery',XLabels::getSysLabel('general','currentquery','text'),
- '&moid='.$moid.'&_function=procQuery&template=xmodtable/browse.html&tplentry=br','display');
- $o1->setToolbar('general','currentquery');
- $my['procquery']=$o1;
- }
- // Insert
- $lang_data=XShell::getLangData();
- $foo=NULL;
- if($this->xset->getTranslatable()==3) $sec=$this->secure($myoid,'insert',$foo,$lang_data);
- else $sec=$this->secure($myoid,'insert');
- if($sec && (!$this->dependant_module || !$submodcontext)) {
- $o1=new XModuleAction($this,'insert',XLabels::getSysLabel('general','new','text'),
- '&moid='.$moid.'&_function=insert&template=xmodtable/new.html&tplentry=br','edit');
- $o1->setToolbar('general','new');
- $o1->order=1;
- $my['insert']=$o1;
- }
- // Actions de navigation de fiche en fiche : nous ne sommes pas en sous module
- if(!empty($this->navActions) && !$submodcontext){
- foreach($this->navActions as $ak=>$o){
- $my[$ak] = $o;
- }
- }
- // Avertir
- $oid=@$_REQUEST['oid'];
- if ($this->secure('', 'sendACopyTo')){
- if(!empty($oid)) {
- $o1=new XModuleAction($this,'sendACopy',XLabels::getSysLabel('xmodule','sendacopyto','text'),
- '&moid='.$moid.'&tplentry=br&oid='.$oid.'&_function=sendACopyTo&template=xmodule/sendacopyto.html&tplentry=br');
- }else{
- $o1=new XModuleAction($this,'sendACopy',XLabels::getSysLabel('xmodule','sendacopyto','text'),
- 'javascript:'.$uniqid.'.applyfunction("sendACopyTo","",{template:"xmodule/sendacopyto.html"},true,true);');
- }
- $o1->menuable=true;
- $o1->group='more';
- $my['sendacopy']=$o1;
- }
- // Impression
- if(in_array(XShell::_function(),array('display','edit'))) $printfct='printDisplay';
- else $printfct='printBrowse';
- if(XShell::_function()!='insert' && $this->secure($myoid,$printfct)){
- $o1=new XModuleAction($this,'print',XLabels::getSysLabel('general','print','text'),
- 'javascript:'.$uniqid.'.printselected();','display');
- $o1->setToolbar('general','print');
- $my['print']=$o1;
- }
- // Export
- if(in_array(XShell::_function(),array('display','edit'))) $expfct='exportDisplay';
- else $expfct='export';
- if(XShell::_function()!='insert' && $this->secure($myoid,$expfct)){
- $o1=new XModuleAction($this,'export',XLabels::getSysLabel('general','export','text'),'javascript:'.$uniqid.'.exportselected();',
- 'edit');
- $o1->menuable=true;
- $my['sexport']=$o1;
- }
- //Import
- if($this->secure('','manage')){
- $o1=new XModuleAction($this,'manage',XLabels::getSysLabel('general','import','text'),
- $GLOBALS['TZR_SESSION_MANAGER']::complete_self().'&moid='.$this->_moid.'&function=manage&template=xmodule/manage.html','edit');
- $o1->menuable=true;
- $my['import']=$o1;
- }
- // Voir les documents non lus
- if($this->trackaccess && $this->secure('','getUnread')){
- $o1=new XModuleAction($this,'lastdoc',XLabels::getSysLabel('xmodule','unread','text'),
- '&moid='.$this->_moid.'&_function=getUnread&tplentry=br&template=xmodtable/getUnread.html','more');
- $o1->menuable=true;
- $my['unread']=$o1;
- }
- // Abonnements
- $modsubmoid=XModule::getMoid(XMODSUB_TOID);
- if(!empty($modsubmoid)){
- $o1=new XModuleAction($this, 'subscribe', XLabels::getSysLabel('xmodsub','subadd','text'),
- '&amoid='.$this->_moid.'&moid='.$modsubmoid.
- '&_function=preSubscribe&tplentry=br&template=xmodsub/sub.html&aoid='.$myoid);
- $o1->menuable=true;
- $o1->group='more';
- $my['subscribe']=$o1;
- }
- // Regles workflow
- if($this->stored_query){
- $modrulemoid=XModule::getMoid(XMODRULE_TOID);
- if(!empty($modrulemoid)){
- $o1=new XModuleAction($this, 'rule', XLabels::getSysLabel('xmodrule','addrule','text'),
- '&amoid='.$this->_moid.'&moid='.$modrulemoid.
- '&_function=insertRule&tplentry=br&template=xmodrule/newRule.html&atemplate=xmodtable/editSelection.html');
- $o1->menuable=true;
- $o1->group='more';
- $my['rule']=$o1;
- }
- }
- // Mode conception et administration
- if($this->secure('','adminBrowseFields')){
- $o1=new XModuleAction($this, 'administration', XLabels::getSysLabel('general', 'administration', 'text'),
- '&moid='.$this->_moid.'&function=adminBrowseFields&template=xmodule/admin/browseFields.html','admin');
- $o1->setToolBar('general', 'administration');
- $my['administration']=$o1;
- }
- // Chemin
- if($this->interactive) {
- if($this->dependant_module && $submodcontext) {
- $mod1=XModule::objectFactory($this->dependant_module);
- $o1=new XModuleAction($this,'browse',$mod1->modulename,
- '&moid='.$this->dependant_module.'&_function=browse&template=xmodtable/browse.html&tplentry=br');
- $my['stack'][]=$o1;
- $d1=&$mod1->xset->rDisplayText($submodcontext['_parentoids'][0], array());
- $o1=new XModuleAction($this,'d1',$d1['link'],
- '&moid='.$this->dependant_module.'&_function=display&template=xmodtable/view.html&tplentry=br&oid='.
- $submodcontext['_parentoids'][0]);
- $my['stack'][]=$o1;
- } else {
- $o1=new XModuleAction($this,'browse',$this->modulename,
- '&moid='.$moid.'&_function=browse&template=xmodtable/browse.html&tplentry=br','display');
- $my['stack'][]=$o1;
- $f=XShell::_function();
- if(strpos($f,'admin')===0){
- $o1=new XModuleAction($this,'adminBrowseFields',XLabels::getSysLabel('xmodule','browsefields','text').' ('.$this->xset->getTable().')',
- '&moid='.$moid.'&_function=adminBrowseFields&template=xmodule/admin/browseFields.html','display');
- $my['stack'][]=$o1;
- }
- }
- if(!empty($oid) && !is_array($oid)) {
- $br=&XShell::from_screen('br');
- $br=&$this->xset->rDisplayText($oid, array());
- if($submodcontext) {
- $o1=new XModuleAction($this,'browse',$br['link'],
- '&moid='.$moid.$submodcontext['urlparms'].
- '&_function=display&template=xmodtable/view.html&tplentry=br&oid='.$oid,'display');
- } else {
- $o1=new XModuleAction($this,'browse',$br['link'],
- '&moid='.$moid.'&_function=display&template=xmodtable/view.html&tplentry=br&oid='.$oid,'display');
- }
- $my['stack'][]=$o1;
- }
- }
- }
- /// Action principale du menu
- public function getMainAction(){
- return $GLOBALS['TZR_SESSION_MANAGER']::complete_self().'moid='.$this->_moid.'&function=browse&tplentry=br&template=xmodtable/browse.html&_persistent=1';
- }
- /**
- * Contruit la liste des actions relatives aux sous-modules
- * @param &$my array() Liste de XModuleAction
- */
- function getSSMAl(&$my){
- $uniqid='v'.XShell::uniqid();
- $myoid=@$_REQUEST['oid'];
- $ssmmenu=array();
- for($i=1;$i<=$this->submodmax;$i++) {
- $f='ssmod'.$i;
- $ff='ssmodfield'.$i;
- $fa='ssmodactivate_additem'.$i;
- if(!$this->$fa || !$this->$f) continue;
- if(empty($this->$ff)){
- $smod=XModule::objectFactory($this->$f);
- $links=$smod->xset->getXLinkDefs(NULL,$this->table);
- if(!empty($links)) list($foo,$linkfield)=each($links);
- } else {
- $linkfield = $this->$ff;
- }
- $ssm=XModule::objectFactory($this->$f);
- if(!$ssm->secure('','insert')) continue;
- $submodcontext=$this->subModuleContext($ar); // ???? sert pas
- $o1=new XModuleAction($this,$f,$ssm->modulename,
- 'javascript:'.$uniqid.'.addTabs("'.$this->$f.'","'.$GLOBALS['TZR_SESSION_MANAGER']::complete_self().'&moid='.$this->$f.'&function=insert&template=xmodtable/new.html&tplentry=br&_linkedfields[]='.$linkfield.
- '&_parentoids[]='.$myoid.'&_parentoid='.$myoid.'&_linkedfield='.$linkfield.'&_raw=1&_ajax=1&skip=1'.
- '&tabsmode=1","'.XLabels::getSysLabel('general','add','text').' : '.addslashes($ssm->modulename).'");');
- $o1->menuable=true;
- $ssmmenu[]=$o1;
- }
- if(count($ssmmenu)>1){
- $o1=new XModuleAction($this,'alladd',XLabels::getSysLabel('general','add','text'),'#');
- $o1->menuable=true;
- $o1->newgroup='ssm';
- $my['ssm']=$o1;
- foreach($ssmmenu as &$o1){
- $o1->group='ssm';
- $my[$o1->xfunction]=$o1;
- }
- }else{
- foreach($ssmmenu as &$o1){
- $o1->name=XLabels::getSysLabel('general','add','text').' : '.$o1->name;
- $my[$o1->xfunction]=$o1;
- }
- }
- }
- /**
- * Construit la liste des actions à rendre disponible lors de l'affichage d'une fiche (display)
- * @param &$my array() Liste de XModuleAction
- */
- function al_display(&$my){
- $uniqid='v'.XShell::uniqid();
- $moid=$this->_moid;
- $myoid=@$_REQUEST['oid'];
- $sec=$this->secure($myoid,'edit');
- if($sec) {
- // recuperation contexte sous module
- $submodcontext=$this->subModuleContext();
- $o1=new XModuleAction($this,'edit',XLabels::getSysLabel('general','edit','text'),
- '&function=edit&moid='.$moid.'&template=xmodtable/edit.html&tplentry=br&oid='.$myoid.$submodcontext['urlparms'],'edit');
- $o1->order=2;
- $o1->setToolbar('general','edit');
- $my['edit']=$o1;
- }
- $sec=$this->secure($myoid,'del');
- if($sec){
- $o1=new XModuleAction($this,'del',XLabels::getSysLabel('general','delete','text'),'javascript:'.$uniqid.'.deleterecord();','edit');
- $o1->order=3;
- $o1->setToolbar('general','delete');
- $my['del']=$o1;
- }
- $this->getSSMAl($my);
- }
- /**
- * Construit la liste des actions à rendre disponible lors de la préparation à l'édition d'une fiche (edit)
- * @param &$my array() Liste de XModuleAction
- */
- function al_edit(&$my){
- $uniqid='v'.XShell::uniqid();
- $myoid=@$_REQUEST['oid'];
- $o1=new XModuleAction($this,'save',XLabels::getSysLabel('general','save','text'),'javascript:'.$uniqid.'.saverecord();','edit');
- $o1->order=1;
- $o1->setToolbar('general','save');
- $my['save']=$o1;
- // recuperation contexte sous module
- $submodcontext=$this->subModuleContext();
- $o1=new XModuleAction($this,'display',XLabels::getSysLabel('general','display','text'),
- '&function=display&moid='.$this->_moid.'&template=xmodtable/view.html&tplentry=br&oid='.$myoid.$submodcontext['urlparms'],
- 'edit');
- $o1->order=2;
- $o1->setToolbar('general','display');
- $my['display']=$o1;
- $sec=$this->secure($myoid,'del');
- if($sec){
- $o1=new XModuleAction($this,'del',XLabels::getSysLabel('general','delete','text'),'javascript:'.$uniqid.'.deleterecord();','edit');
- $o1->order=3;
- $o1->setToolbar('general','delete');
- $my['del']=$o1;
- }
- $this->getSSMAl($my);
- }
- /**
- * Construit la liste des actions à rendre disponible lors de l'édition d'une fiche (procEdit)
- * @param &$my array() Liste de XModuleAction
- */
- function al_procEdit(&$my){
- $this->al_edit($my);
- }
- /**
- * Construit la liste des actions à rendre disponible lors de la duplication d'une fiche (procEditDup)
- * @param &$my array() Liste de XModuleAction
- */
- function al_procEditDup(&$my){
- $this->al_insert($my);
- }
- /**
- * Construit la liste des actions à rendre disponible lors de la préparation à l'insertion d'une fiche (insert)
- * @param &$my array() Liste de XModuleAction
- */
- function al_insert(&$my){
- $uniqid='v'.XShell::uniqid();
- $o1=new XModuleAction($this,'save',XLabels::getSysLabel('general','save','text'),'javascript:'.$uniqid.'.saverecord();','edit');
- $o1->order=1;
- $o1->setToolbar('general','save');
- $my['save']=$o1;
- }
- /**
- * Construit la liste des actions à rendre disponible lors de l'insertion d'une fiche (procInsert)
- * @param &$my array() Liste de XModuleAction
- */
- function al_procInsert(&$my){
- $this->al_insert($my);
- }
- /**
- * Construit la liste des actions à rendre disponible lors du listing des fiches du module (browse)
- * @param &$my array() Liste de XModuleAction
- */
- function al_browse(&$my){
- $uniqid='v'.XShell::uniqid();
- $moid=$this->_moid;
- $myoid=@$_REQUEST['oid'];
- if($this->secure($myoid,'del')){
- $o1=new XModuleAction($this,'del',XLabels::getSysLabel('general','delete','text'),'javascript:'.$uniqid.'.deleteselected();','edit');
- $o1->setToolbar('general','delete');
- $o1->order=3;
- $my['del']=$o1;
- }
- if($this->objectSecurityEnabled() && $this->secure($myoid,'secEditSimple')){
- $o1=new XModuleAction($this,'seceditsimple',XLabels::getSysLabel('general','security','text'),
- 'javascript:TZR.editSec("'.$GLOBALS['TZR_SESSION_MANAGER']::complete_self(true).'","'.$this->_moid.'","",'.$uniqid.');','edit');
- $o1->setToolbar('general','security');
- $o1->order=4;
- $my['secEditSimple']=$o1;
- }
- if(isset($this->xset->desc['PUBLISH'])){
- if($this->secure($myoid,'publish')){
- $o1=new XModuleAction($this,'approve',XLabels::getSysLabel('general','approve','text'),
- 'javascript:'.$uniqid.".applyfunction('publish','',{value:1});",'edit');
- $o1->menuable=true;
- $my['approve']=$o1;
- $o1=new XModuleAction($this,'unapprove',XLabels::getSysLabel('general','unapprove','text'),
- 'javascript:'.$uniqid.".applyfunction('publish','',{value:2});",'edit');
- $o1->menuable=true;
- $my['unapprove']=$o1;
- }
- }
- // Affichage (changement taille page, ajout de champ...)
- $o1=new XModuleAction($this,'fieldgrp',XLabels::getSysLabel('xmodtable','field_label','text'),'#','display');
- $o1->menuable=true;
- $o1->newgroup='fieldgrp';
- $my['fieldgrp']=$o1;
- foreach($this->xset->orddesc as $i=>$fn){
- $f=$this->xset->getField($fn);
- $o1=new XModuleAction($this,'field'.$fn,$f->label,'javascript:'.$uniqid.'.add_field(\''.$fn.'\');'.$uniqid.'.go_browse(\'\',0);','fieldgrp');
- $o1->menuable=true;
- $my['field'.$fn]=$o1;
- }
- $o1=new XModuleAction($this,'pgmore',XLabels::getSysLabel('xmodtable','page_size','text').' * 2',
- 'javascript:'.$uniqid.'.go_browse("start","*2");','display');
- $o1->menuable=true;
- $my['pgmore']=$o1;
- $o1=new XModuleAction($this,'pgless',XLabels::getSysLabel('xmodtable','page_size','text').' / 2',
- 'javascript:'.$uniqid.'.go_browse("start","/2");','display');
- $o1->menuable=true;
- $my['pgless']=$o1;
- if($this->multipleedit && $this->secure('','editSelection')){
- $o1=new XModuleAction($this,'editselection',XLabels::getSysLabel('xmodmedia','editselection','text'),
- 'javascript:'.$uniqid.'.applyfunction("editSelection","",{template:"xmodtable/editSelection.html"},true,true);','edit');
- $o1->order=2;
- $o1->setToolbar('general','edit');
- $my['editselection']=$o1;
- }
- // Edition/suppression sur le resultat d'une recherche
- if($this->isThereAQueryActive()){
- if($this->secure('','editAll')){
- $o1=new XModuleAction($this,'editall',XLabels::getSysLabel('general','editall','text'),
- 'javascript:'.$uniqid.'.applyfunction("editAll","",{template:"xmodmedia/editSelection.html"},false,true);','edit');
- $o1->order=2;
- $o1->menuable=true;
- $my['editall']=$o1;
- }
- if($this->secure('','delAll')){
- $o1=new XModuleAction($this,'delall',XLabels::getSysLabel('general','delall','text'),
- 'javascript:'.$uniqid.'.applyfunction("delAll","'.XLabels::getSysLabel('general','confirm_delete_object','text').'","");','edit');
- $o1->order=3;
- $o1->menuable=true;
- $my['delall']=$o1;
- }
- }
- }
- /**
- * Construit la liste des actions à rendre disponible lors d'une recherche sur les fiches du module (procQuery)
- * @param &$my array() Liste de XModuleAction
- */
- function al_procQuery(&$my){
- $this->al_browse($my);
- }
- /// Fonctions sur gestion des champs
- function al_adminBrowseFields(&$my){
- $uniqid='v'.XShell::uniqid();
- $o1=new XModuleAction($this,'importfieldssec',XLabels::getSysLabel('xmodule','importfieldssec','text'),
- '&moid='.$this->_moid.'&_function=adminPreImportFieldsSec&template=xmodule/admin/preimportfieldssec.html&tplentry=br','more');
- $o1->menuable=true;
- $my['importfieldssec']=$o1;
- $o1=new XModuleAction($this,'newfield',XLabels::getSysLabel('xdatasource','new_field','text'),
- '&moid='.$this->_moid.'&function=adminNewField&template=xmodule/admin/newField.html');
- $o1->menuable=true;
- $my['newfield']=$o1;
- $o1=new XModuleAction($this,'emptydata',XLabels::getSysLabel('xdatasource','empty_data','text'),
- 'javascript:'.$uniqid.'.emptybase();','more');
- $o1->menuable=true;
- $my['emptydata']=$o1;
- $o1=new XModuleAction($this,'clonebase',XLabels::getSysLabel('general','clone','text'),
- '&moid='.$this->_moid.'&function=adminDuplicate&template=xmodule/admin/duplicate.html&tplentry=br','more');
- $o1->menuable=true;
- $my['clonebase']=$o1;
- $o1=new XModuleAction($this,'checkbase',XLabels::getSysLabel('general','check','text'),
- '&moid='.$this->_moid.'&function=adminChk&skip=1&_next='.rawurlencode($GLOBALS['XSHELL']->get_back_url(0)),'more');
- $o1->menuable=true;
- $my['checkbase']=$o1;
- $o1=new XModuleAction($this,'checkrbase',XLabels::getSysLabel('general','check_and_repair','text'),
- '&moid='.$this->_moid.'&function=adminChk&skip=1&repair=1&_next='.rawurlencode($GLOBALS['XSHELL']->get_back_url(0)),'more');
- $o1->menuable=true;
- $my['checkrbase']=$o1;
- $o1=new XModuleAction($this,'propbase',XLabels::getSysLabel('general','properties','text'),
- '&moid='.$this->_moid.'&function=adminEditSourceProperties&template=xmodule/admin/editSource.html','more');
- $o1->menuable=true;
- $my['propbase']=$o1;
- $o1=new XModuleAction($this,'printbase',XLabels::getSysLabel('general','print','text'),
- 'javascript:'.$uniqid.'.printselected();');
- $o1->menuable=true;
- $my['printbase']=$o1;
- }
- /// Fonctions sur gestion des champs
- function al_adminBrowseStrings(&$my){
- $uniqid='v'.XShell::uniqid();
- $o1=new XModuleAction($this,'alphasort',XLabels::getSysLabel('general','alpha_sort','text'),
- '&moid='.$this->_moid.'&function=adminSortStrings&skip=1&field='.$_REQUEST['field'].'&_next='.rawurlencode($GLOBALS['XSHELL']->get_back_url(0)));
- $o1->menuable=true;
- $my['alphasort']=$o1;
- $o1=new XModuleAction($this,'deletebase',XLabels::getSysLabel('general','delete_all','text'),
- 'javascript:'.$uniqid.'.deleteall();');
- $o1->menuable=true;
- $my['deleteall']=$o1;
- $o1=new XModuleAction($this,'newstring',XLabels::getSysLabel('general','new','text'),
- '&moid='.$this->_moid.'&function=adminNewString&template=xmodule/admin/newString.html&field='.$_REQUEST['field']);
- $o1->menuable=true;
- $my['newstring']=$o1;
- }
- /// Fonctions sur gestion des champs
- function al_adminEditField(&$my){
- $uniqid='v'.XShell::uniqid();
- $br=&XShell::from_screen('');
- $o1=new XModuleAction($this,'resetchrono','Reset',
- '&moid='.$this->_moid.'&_function=adminResetChrono&field='.$br['field'].'&boid='.$br['boid'].'&skip=1&_next='.
- rawurlencode($GLOBALS['XSHELL']->get_back_url(0)),'more');
- $o1->menuable=true;
- $my['resetchrono']=$o1;
- }
- function nav($ar=NULL){
- parent::nav($ar);
- if(substr(XShell::_function(),0,5)=='admin') {
- $this->pushNav(XLabels::getSysLabel('general','administration','text'),
- '&function=adminBrowseFields&moid='.$this->_moid.'&template=xmodule/admin/browseFields.html&boid='.$this->boid);
- }
- }
- function isDependant() {
- return XDbIni::get('dependant:'.$this->_moid,'val');
- }
- /// Preparartion des donnees pour ecran de parametrage d'impression
- public function prePrintBrowse($ar) {
- $p=new XParam($ar,array());
- $order=$p->get('order');
- $tplentry=$p->get('tplentry');
- if(empty($order)) $order=$this->order;
- $ar['order']=$order;
- $ar['table']=$this->table;
- // Recherche des templates d'impression
- if(empty($this->_templates)) $this->_templates=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS=TEMPLATES');
- if(!empty($this->_templates)) {
- $q1=$this->_templates->select_query(array('cond'=>array('modid'=>array('=',$this->_moid),
- 'gtype'=>array('=','xmodtable_browse_print'))));
- $r=&$this->_templates->browse(array('select'=>$q1,'pagesize'=>100,'tplentry'=>TZR_RETURN_DATA));
- XShell::toScreen1($tplentry.'t',$r);
- }
- // recherche des donnees
- $ar['_filter']=$this->getFilter(true,$ar);
- $ar['tplentry']=TZR_RETURN_DATA;
- $ar['fieldssec']=$this->getFieldsSec($ar);
- $ar['selectedfields']='all';
- $ar['pagesize']=1;
- $ar['ssmoid']='all';
- for($i=1;$i<=$this->submodmax;$i++) {
- $f='ssmod'.$i;
- $ar['options'][$this->$f]['selectedfields']='all';
- }
- // cas module ayant lui meme en sous modules
- $mycurrentquery = NULL;
- if($this->isThereAQueryActive())
- $mycurrentquery = $this->_getSession('query');
- $r=&$this->xset->browse($ar);
- $this->setSubModules($ar,$r);
- if ($mycurrentquery != NULL)
- $this->_setSession('query', $mycurrentquery);
- // calcul du nombre d'enregistrements impactes (passage d'oid, browseSelection ou browse/query classique)
- $r['_selected']=$p->get('_selected');
- if(is_array($r['_selected'])) {
- $r['record_count']=count($r['_selected']);
- }elseif($p->get('fromfunction')=='browseSelection') {
- $selection=getSessionVar('selection');
- $r['_selected']=$selection[$this->_moid];
- $r['record_count']=count($r['_selected']);
- }else{
- $context=$this->getContextQuery($ar,false);
- $ar['select']=$context['query'];
- $q=$this->xset->getSelectQuery($ar);
- $r['record_count']=countSelectQuery($q[1],true);
- $r['queryfields']=$context['all']['queryfields'];
- }
- return XShell::toScreen1($tplentry,$r);
- }
- /// Retourne la requete permattant de recuperer tous les objets suivant le contexte (selection, recherche en cours...)
- function getContextQuery($ar,$queryonly=true){
- $p=new XParam($ar,array());
- $oidsel=$p->get('_selected');
- $noreg=$p->get('noreg');
- $from=$p->get('fromfunction');
- if(is_array($oidsel)) {
- $oid=array_keys($oidsel);
- $q=$this->xset->select_query(array('cond'=>array('KOID'=>array('=',$oid))));
- }elseif($this->isThereAQueryActive() && ($from=='procQuery')) {
- $_storedquery=$this->_getSession('query');
- $ar1=array_merge($_storedquery,$ar);
- if($queryonly){
- $ar1['getselectonly']=true;
- $q=$this->xset->procQuery($ar1);
- }else{
- $ar1['getselectonly']=false;
- $ar1['pagesize']=1;
- $r=$this->xset->procQuery($ar1);
- $q=$r['select'];
- $params=array('queryobject'=>$r['queryobject']);
- }
- if(!$noreg) $q=preg_replace('@select (.*) from (.*)$@i','select '.$this->table.'.* from $2',$q);
- }else{
- $q=$this->xset->select_query(array("cond"=>array()));
- }
- if($queryonly) return $q;
- else return array('query'=>$q,'all'=>$r);
- }
- /// Impression sur un browse
- public function printBrowse($ar) {
- $p=new XParam($ar,array());
- $title=$p->get('title');
- $email=$p->get('dest');
- $target=$p->get('_target');
- $linkedfield=$p->get('_linkedfield');
- $fmt=$p->get('fmt');
- $context=$this->getContextQuery($ar,false);
- $q=$context['query'];
- $ar['selected']='0';
- $ar['pagesize']='100000';
- $ar['select']=$q;
- $ar['_format']='text/html';
- $ar['tplentry']=TZR_RETURN_DATA;
- $tpldata['param']=array('title'=>$title,'queryfields'=>$context['all']['queryfields']);
- $oldinteractive=$this->interactive;
- $this->interactive=false;
- if(!empty($target) && $target!=$this->_moid){
- $mod=XModule::objectFactory($target);
- if($mod->secure('','export')){
- $ar2=$ar;
- $ar['selectedfields']=array('xx');
- $ar['order']=$this->order;
- $b=$this->browse($ar);
- $q='select * from '.$mod->table.' where '.$linkedfield.' in ("'.implode('","',$b['lines_oid']).'")';
- $ar2['select']=$q;
- $ar2['tplentry']=$tplentry;
- if($fmt=='pdf') $ar2['_format']='application/prince';
- $res=$mod->browse($ar2);
- }
- }else{
- if($fmt=='pdf') $ar['_format']='application/prince';
- $res=$this->browse($ar);
- $mod=&$this;
- }
- $this->interactive=$oldinteractive;
- if($fmt=='pdf') {
- // Impression PDF par defaut
- if(!empty($this->_templates) && !empty($this->btemplates)) {
- $r=&$this->_templates->display(array('oid'=>$this->btemplates,'_options'=>array('error'=>'return'),'tplentry'=>TZR_RETURN_DATA));
- if(!empty($r['oprintp']->filename)) $filename=$r['oprintp']->filename;
- }
- $this->_printBrowsePDF($ar,$filename);
- }elseif(Kernel::isAKoid($fmt)) {
- // Impression via un template d'impressions
- $t=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$fmt);
- $dispfmt=$t->rDisplay($fmt);
- $displayformats=explode(',',$dispfmt['odfmt']->raw);
- if(in_array('text/html',$displayformats) || empty($dispfmt['odfmt']->raw)) $this->_printBrowseHTML($ar,$dispfmt['oprint']->filename);
- elseif(in_array('application/prince',$displayformats)) $this->_printBrowsePDF($ar,$dispfmt['oprint']->filename);
- }else{
- // Impression HTML par defaut
- $template=$p->get('template');
- $this->_printBrowseHTML($ar,$template);
- }
- }
- /// Sous fonction d'impression au format HTML
- function _printBrowseHTML($ar=NULL,$filename=NULL){
- $p=new XParam($ar,NULL);
- $email=$p->get('dest');
- if(empty($filename)) $filename='xmodtable/print.html';
- $content=$this->_printGetContent($ar,$filename,'browse');
- if(!empty($email)) $this->sendMail2User('print','',$email,NULL,false,NULL,'report.html',$content);
- echo $content;
- exit(0);
- }
- /// Sous fonction d'impression au format PDF
- function _printBrowsePDF($ar=NULL,$filename=NULL){
- $p=new XParam($ar,array('pdfname'=>'browse.pdf'));
- $email=$p->get('dest');
- if(empty($filename)) $filename='xmodtable/print.xml';
- $ar['_format']='application/prince';
- $content=$this->_printGetContent($ar,$filename,'browse');
- $tmpname=princeTidyXML2PDF(NULL,$content);
- if(!empty($email) && !empty($tmpname)) {
- $content=file_get_contents($tmpname);
- $this->sendMail2User('print','',$email,NULL,false,NULL,'browse.pdf',$content,'application/pdf');
- }
- $pdfname=$p->get('pdfname');
- header('Content-type: application/pdf');
- header('Content-disposition: attachment; filename='.$pdfname);
- $size=filesize($tmpname);
- header('Accept-Ranges: bytes');
- header('Content-Length: '.$size);
- readfile($tmpname);
- unlink($tmpname);
- exit(0);
- }
- /// Impression d'une fiche
- public function printDisplay($ar) {
- $p=new XParam($ar,array('pdfname'=>'view.pdf'));
- $tplentry=$p->get('tplentry');
- $ar['tplentry']=TZR_RETURN_DATA;
- $ar['ssmoid']='all';
- $fmt=$p->get('fmt');
- if($fmt=='pdf') {
- // Impression PDF par defaut
- if(!empty($this->_templates) && !empty($this->templates)) {
- $r=&$this->_templates->display(array('oid'=>$this->templates,'_options'=>array('error'=>'return'),'tplentry'=>TZR_RETURN_DATA));
- if(!empty($r['oprintp']->filename)) $filename=$r['oprintp']->filename;
- }
- $this->_printDisplayPDF($ar,$filename);
- }elseif(Kernel::isAKoid($fmt)) {
- // Impression via un template d'impressions
- $t=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.$fmt);
- $dispfmt=$t->display(array('oid'=>$fmt,'tplentry'=>TZR_RETURN_DATA));
- $displayformats=explode(',',$dispfmt['odfmt']->raw);
- if(in_array('text/html',$displayformats) || empty($dispfmt['odfmt']->raw)) $this->_printDisplayHTML($ar,$dispfmt['oprint']->filename);
- elseif(in_array('application/prince',$displayformats)) $this->_printDisplayPDF($ar,$dispfmt['oprint']->filename);
- }else{
- // Impression HTML par defaut
- $template=$p->get('template');
- $this->_printDisplayHTML($ar,$template);
- }
- }
- /// Sous fonction d'impression au format HTML
- function _printDisplayHTML($ar=NULL,$filename=NULL){
- $p=new XParam($ar,NULL);
- $email=$p->get('dest');
- if(empty($filename)) $filename='xmodtable/printdisplay.html';
- $content=$this->_printGetContent($ar,$filename,'display');
- if(!empty($email)) $this->sendMail2User('print','',$email,NULL,false,NULL,'report.html',$content);
- echo $content;
- exit(0);
- }
- /// Sous fonction d'impression au format PDF
- function _printDisplayPDF($ar=NULL,$filename=NULL){
- $p=new XParam($ar,array('pdfname'=>'view.pdf'));
- $email=$p->get('dest');
- if(empty($filename)) $filename='xmodtable/print-view.xml';
- $ar['_format']='application/prince';
- $content=$this->_printGetContent($ar,$filename,'display');
- $tmpname=princeTidyXML2PDF(NULL,$content);
- if(!empty($email) && !empty($tmpname)) {
- $content=file_get_contents($tmpname);
- $this->sendMail2User('print','',$email,NULL,false,NULL,'view.pdf',$content,'application/pdf');
- }
- $pdfname=$p->get('pdfname');
- header('Content-type: application/pdf');
- header('Content-disposition: attachment; filename='.$pdfname);
- $size=filesize($tmpname);
- header('Accept-Ranges: bytes');
- header('Content-Length: '.$size);
- readfile($tmpname);
- unlink($tmpname);
- exit(0);
- }
- /// Recupere le contenu pour une impression
- function &_printGetContent($ar,$filename,$f,$tpldata=array()){
- $p=new XParam($ar,NULL);
- $title=$p->get('title');
- $res=&$this->$f($ar);
- $xt=new XTemplate('file:'.$filename);
- $labels=&$GLOBALS['XSHELL']->labels->get_labels(array('selectors'=>array('global'),'local'=>true));
- $xt->set_glob(array('labels'=>&$labels));
- $r3=array();
- $tpldata['param']=array('title'=>$title);
- $tpldata['br']=$res;
- $tpldata['imod']=&XShell::from_screen('imod');
- $content=$xt->parse($tpldata,$r3,NULL);
- return $content;
- }
- /// Exporte une fiche
- public function exportDisplay($ar=NULL){
- $p= new XParam($ar,array());
- $fmt=$p->get('fmt');
- $ar['norow']=1;
- $ar['nodef']=1;
- $ar['ssmoid']='all';
- $ar['_options']=array('genpublishtag'=>false);
- if($fmt=='xl' || $fmt=='xl07') $ar['_format']='application/excel';
- $this->display($ar);
- if($fmt=='xl' || $fmt=='xl07') $this->_exportXLSDisplay($ar);
- if($fmt=='html') $this->printDisplay($ar);
- if($fmt=='csv') $this->_exportCSVDisplay($ar);
- }
- /// Exporte une fiche au format excel
- public function _exportXLSDisplay($ar){
- require_once('add-ons/PHPExcel/PHPExcel.php');
- $p=new XParam($ar,NULL);
- $fmt=$p->get('fmt');
- $br=&XShell::from_screen('br');
- $ss=new PHPExcel();
- $ss->setActiveSheetIndex(0);
- $ws=$ss->getActiveSheet();
- $ws->setTitle('Main');
- $ws->SetCellValue('A1','OID');
- $ws->SetCellValue('B1',$br['oid']);
- $row=2;
- foreach($br['fields_object'] as $j => &$f) {
- if(!$f->sys){
- $l=$f->fielddef->label;
- $c=$f->field;
- convert_charset($l,TZR_INTERNAL_CHARSET,'UTF-8');
- $ws->setCellValueByColumnAndRow(0,$row,$l);
- $f1=&$this->xset->getField($c);
- $f1->writeXLS($ws,$row++,1,$br['o'.$c],0,$ss);
- }
- }
- $ws->getStyle('A1:A'.($row-1))->getFont()->setBold(true);
- foreach($br['__ssmod'] as $i=>&$ssr){
- $ssmod=XModule::objectFactory($br['__ssprops'][$i]['_moid']);
- $l=$br['__ssprops'][$i]['modulename'];
- convert_charset($l,TZR_INTERNAL_CHARSET,'UTF-8');
- $ss->createSheet($i+1);
- $ss->setActiveSheetIndex($i+1);
- $ws=$ss->getActiveSheet();
- $ws->setTitle($l);
- foreach($ssr['header_fields'] as $j => &$f) {
- $l=$ssr['header_fields'][$j]->label;
- convert_charset($l,TZR_INTERNAL_CHARSET,'UTF-8');
- $ws->setCellValueByColumnAndRow($j,1,$l);
- }
- foreach($ssr['lines_oid'] as $j=>$oid){
- foreach($ssr['header_fields'] as $k=>&$f) {
- $f->writeXLS($ws,$j+2,$k,$ssr['lines_o'.$f->field][$j],0,$ss);
- }
- }
- $ws->getStyle('A1:'.PHPExcel_Cell::stringFromColumnIndex($k).'1')->getFont()->setBold(true);
- }
- $ss->setActiveSheetIndex(0);
- sendPHPExcelFile($ss,$fmt,'export');
- }
- /// Exporte une fiche et ses sous fiches au format csv (si sous fiches, un fichier csv par sous modules, le tout dans un zip)
- public function _exportCSVDisplay($ar=NULL){
- $p= new XParam($ar,array('fname'=>'Export'));
- $fsep=$p->get('csvfsep');
- $textsep=stripslashes($p->get('csvtextsep'));
- $charset=stripslashes($p->get('csvcharset'));
- $fname=$p->get('fname');
- $br=&XShell::from_screen('br');
- $csv=$headers=$row=array();
- foreach($br['fields_object'] as $j => &$f) {
- if(!$f->sys){
- $f1=&$this->xset->getField($f->field);
- $headers[]=$textsep.$f->fielddef->label.$textsep;
- $row[]=$f1->writeCSV($br['o'.$f->field],$textsep);
- }
- }
- $csv[]=implode($fsep,$headers);
- $csv[]=implode($fsep,$row);
- $csv=implode("\r\n",$csv);
- convert_charset($csv,TZR_INTERNAL_CHARSET,$charset);
- if(empty($br['__ssmod'])){
- ob_clean();
- header('Content-Type: text/csv; charset='.$charset);
- header('Content-Transfer-Encoding:'.$charset);
- header('Content-disposition: attachment; filename='.str_replace(' ','_',removeaccents($fname)).'.csv');
- header('Content-Length: '.strlen($csv));
- echo $csv;
- exit(0);
- }else{
- $dir=TZR_TMP_DIR.'exportdisp'.uniqid();
- @mkdir($dir);
- file_put_contents($dir.'/Main.csv',$csv);
- foreach($br['__ssmod'] as $i=>&$ssr){
- $csv=$headers=$row=array();
- $ssmod=XModule::objectFactory($br['__ssprops'][$i]['_moid']);
- $l=$br['__ssprops'][$i]['modulename'];
- $fields=array();
- foreach($ssr['header_fields'] as $j=>&$f) {
- $headers[]=$textsep.$f->label.$textsep;
- }
- $csv[]=implode($fsep,$headers);
- foreach($ssr['lines_oid'] as $j=>$oid){
- $row=array();
- foreach($ssr['header_fields'] as $k=>&$f) {
- $row[]=$f->writeCSV($ssr['lines_o'.$f->field][$j],$textsep);
- }
- $csv[]=implode($fsep,$row);
- }
- $csv=implode("\r\n",$csv);
- convert_charset($csv,TZR_INTERNAL_CHARSET,$charset);
- file_put_contents($dir.'/'.removeaccents($l).'.csv',$csv);
- }
- exec('(cd '.$dir.'; zip -r '.$dir.'.zip .)2>&1 > '.TZR_TMP_DIR.'errorlog');
- $size=filesize($dir.'.zip');
- header('Content-type: application/zip');
- header('Content-disposition: attachment; filename='.str_replace(' ','_',removeaccents($fname)).'.zip');
- header('Accept-Ranges: bytes');
- header('Content-Length: '.$size);
- @readfile($dir.'.zip');
- XDir::unlink($dir);
- unlink($dir.'.zip');
- exit(0);
- }
- }
- /// Suppression de toutes les entrées correspondant à la recherche en cours
- function delAll($ar) {
- $p=new XParam($ar,NULL);
- $tplentry=$p->get('tplentry');
- if($this->isThereAQueryActive() && empty($clearrequest)) {
- $_storedquery=$this->_getSession('query');
- $ar=array_merge($_storedquery,$ar);
- $ar['fmoid']=$this->_moid;
- $ar['tplentry']=TZR_RETURN_DATA;
- $ar['selectedfields']=array('KOID');
- $ar['pagesize']=999999;
- $r1=$this->xset->procQuery($ar);
- if(count($r1['lines_oid'])){
- $this->del(array('oid'=>$r1['lines_oid']));
- }
- }
- }
- /// Suppression d'un objet ou d'une ensemble d'objet
- function del($ar) {
- $p=new XParam($ar,array('onlyssm'=>false,'ssmnottodel'=>array()));
- $nolog=$p->get('_nolog','local');
- $onlyssm=$p->get('onlyssm');
- $noworkflow=$p->get('_noworkflow');
- $ssmnottodel=$p->get('ssmnottodel');
- $ar['table']=$this->table;
- $ar['action']='OK';
- // traitement du contexte sous module
- $subMods = $this->getSubModules();
- $p=new XParam($ar,array());
- // faire une requete de delete pour chacun des sous modules sur chaque oid
- $oids=Kernel::getSelectedOids($p);
- foreach($oids as $parentoid){
- /// application du workflow
- if(empty($noworkflow) && XModule::getMoid(XMODWORKFLOW_TOID)) {
- $umod=XModule::singletonFactory(XMODWORKFLOW_TOID);
- $umod->checkAndRun($this, $this, $parentoid, 'delete');
- }
- foreach($subMods as $i=>$subMod) {
- // si sous module dépendant, on supprime toutes les sous-fiches en relation avec cette fiche
- // si sous module avec lien obl et multiple (donc pas considéré comme dependant), on edite ou supprime toutes les sous-fiches
- if(in_array($subMod['moid'],$ssmnottodel)) continue;
- if(!empty($subMod['mod']->dependant_module) || $this->{'ssmoddependent'.$i}) {
- $sel=$subMod['xset']->select_query(array('cond'=>array($subMod['linkfield']=>array('=',$parentoid))));
- $ssRecords=$subMod['xset']->browse(array('select'=>$sel, 'tplentry'=>TZR_RETURN_DATA,
- 'selected'=>'0','selectedfields'=>$subMod['linkfield']));
- if(!empty($ssRecords)) {
- foreach($ssRecords['lines_oid'] as $i=>$ssoid){
- $subMod['mod']->del(array('tplentry'=>TZR_RETURN_DATA, 'oid'=>$ssoid,'_selectedok'=>'','_selected'=>''));
- }
- }
- }else{
- $sel=$subMod['xset']->select_query(array('cond'=>array($subMod['linkfield']=>array('LIKE','%'.$parentoid.'%'))));
- $ssRecords=$subMod['xset']->browse(array('select'=>$sel,'tplentry'=>TZR_RETURN_DATA,
- 'selected'=>'0','selectedfields'=>$subMod['linkfield']));
- if(!empty($ssRecords)) {
- foreach($ssRecords['lines_oid'] as $i=>$ssoid){
- $links=$ssRecords['lines_o'.$subMod['linkfield']][$i]->raw;
- if($subMod['xset']->desc[$subMod['linkfield']]->compulsory && preg_match("/^\|*".$parentoid."\|*$/",$links)){
- $subMod['mod']->del(array('tplentry'=>TZR_RETURN_DATA, 'oid'=>$ssoid,'_selectedok'=>'','_selected'=>'','_nolog'=>$nolog));
- }else{
- $subMod['mod']->procEdit(array('tplentry'=>TZR_RETURN_DATA,'oid'=>$ssoid,'_nolog'=>$nolog,
- $subMod['linkfield']=>str_replace($parentoid,'',$links)));
- }
- }
- }
- }
- }
- }
- if (!$onlyssm)
- $this->xset->del($ar);
- return true;
- }
- /// Positinne si necessaire l'oid dans le tri pour dedoublonner
- function checkOrderFields(&$order){
- $t=$this->xset->getTable();
- if(empty($order)) $order=$this->order;
- $decorder=explode(',',$order);
- $allDesc = true;
- $koidFound = false;
- foreach ($decorder as $_order) {
- $allDesc &= (bool)strripos($_order, ' DESC'); // permet d'utiliser les index
- $koidFound |= (stripos($_order, 'KOID') !== false);
- }
- if (!$koidFound)
- $decorder[] = $t.'.KOID' . ($allDesc?' DESC':'');
- $order=implode(',',$decorder);
- }
- /// Contruction des actions de navigation
- function setNavActions($myoid,$navfunction,$navtemplate){
- $moid=$this->_moid;
- $o1=new XModuleAction($this,'navprev',XLabels::getSysLabel('general','previous','text'),
- '&moid='.$moid.'&_function='.$navfunction.'&template='.$navtemplate.'&tplentry=br&oid='.$myoid.'&navdir=prev',
- 'display');
- $o1->setToolBar('general', 'previous');
- $this->navActions['prev']=$o1;
- $o1=new XModuleAction($this,'navnext',XLabels::getSysLabel('general','next','text'),
- '&moid='.$moid.'&_function='.$navfunction.'&template='.$navtemplate.'&tplentry=br&oid='.$myoid.'&navdir=next',
- 'display');
- $o1->setToolBar('general', 'next');
- $this->navActions['next']=$o1;
- }
- /// Recherche des infos sur la position d'un oid dans un browse. Retourn : array(oid precedent,oid suivant, oid actuel, prec le premier, suiv le dernier)
- function mkNavParms($ar){
- $p=new XParam($ar, array());
- $oid=$p->get('oid');
- // Lecture de l'ordre en cour
- if($this->_issetSession('lastorder')) $order=$this->_getSession('lastorder');
- if(empty($order)) $order=$this->order;
- $ar['order']=$order;
- $ar['table']=$this->table;
- $ar['_filter']=$this->getFilter(true,$ar);
- // Cas ou on a une requete
- if($this->isThereAQueryActive()){
- $_storedquery=$this->_getSession('query');
- $ar2=array();
- $ar2=array_merge($ar, $_storedquery);
- $ar2['getselectonly']=true;
- $q=$this->xset->procQuery($ar2);
- $ar['select']=str_replace('*','KOID',$q);
- }
- $this->checkOrderFields($order);
- $oids=$this->xset->browseOids($ar);
- // Appliquer les droits si necessaire
- if($this->object_sec) {
- $lang_data=XShell::getLangData();
- $oidsrights=$GLOBALS['XUSER']->getObjectsAccess($this,$lang_data,$oids);
- foreach($oidsrights as $i=>&$rights) {
- if(!array_key_exists('ro',$rights)) unset($oids[$i]);
- }
- }
- if($oid) $myi=array_search($oid,$oids);
- else $myi=0;
- $mylst=count($oids)-1;
- if($myi==0) $navprev=$oids[$mylst];
- else $navprev=$oids[$myi-1];
- if($myi==$mylst) $navnext=$oids[0];
- else $navnext = $oids[$myi+1];
- $navact=$oids[$myi];
- return array($navprev,$navnext,$navact,$myi-1==0,$myi+1==$mylst);
- }
- /// Prépare l'ensemble des éléments d'affichage des fiches
- public function &browse($ar) {
- $p=new XParam($ar,array());
- $order=$p->get('order');
- $select=$p->get('select');
- $tplentry=$p->get('tplentry');
- $editfields=$p->get('editfields');
- $persistent=$p->get('_persistent');
- $assubmodule=$p->get('assubmodule');
- $this->checkOrderFields($order);
- if($this->persistentquery && $persistent) clearSessionVar('filterquery'.$this->_moid);
- // pour gestion de la navigation de page/page en display et edit
- if($this->interactive){
- $this->_setSession('lastorder',$order);
- if($this->isThereAQueryActive()) $this->_clearSession('query');
- }
- $ar['order']=$order;
- $ar['table']=$this->table;
- $pagesize=$p->get('pagesize');
- if(empty($pagesize)) $pagesize=$this->pagesize;
- if(empty($pagesize)) $pagesize=TZR_XMODTABLE_BROWSE_MAXPAGESIZE;
- $ar['pagesize']=$pagesize;
- if(!empty($this->_templates) && !empty($this->btemplates)) {
- $r=&$this->_templates->display(array('oid'=>$this->btemplates,'_options'=>array('error'=>'return'),'tplentry'=>TZR_RETURN_DATA));
- XShell::toScreen1($tplentry.'t',$r);
- }
- // recherche des donnees
- $ar['_filter']=$this->getFilter(true,$ar);
- if($this->object_sec) {
- $oids=$this->xset->browseOids($ar);
- // calcul des droits sur les objets retournés
- $lang_data = XShell::getLangData();
- $oidsrights=$GLOBALS['XUSER']->getObjectsAccess($this, $lang_data, $oids);
- $oidsrigths2=$noeditoids=array();
- foreach($oidsrights as $i => $rights) {
- if(!array_key_exists('ro',$rights)) unset($oids[$i]);
- else{
- $oidsrights2[$oids[$i]]=$rights;
- if(!empty($editfields) && !array_key_exists('rw',$rights)) $noeditoids[]=$oids[$i];
- }
- }
- if(!empty($oids)){
- if(preg_match('/order[ ]+by/i',$select)) $order='field(KOID,"'.implode('","',$oids).'")';
- else $order=$ar['order'];
- $ar['select']=$this->xset->select_query(array('order'=>$order, 'cond'=>array('KOID'=>array('=',$oids))));
- $ar['noeditoids']=$noeditoids;
- }
- }
- $ar['tplentry']=TZR_RETURN_DATA;
- if(empty($ar['fmoid'])) $ar['fmoid']=$this->_moid;
- $ar['fieldssec']=$this->getFieldsSec($ar);
- $r=&$this->xset->browse($ar);
- $r['function']='browse';
- $r['_fieldssec']=$ar['fieldssec'];
- if($this->object_sec){
- $r['objects_sec']=array();
- foreach($r['lines_oid'] as $i=>$oid){
- $r['objects_sec'][$i]=$oidsrights2[$oid];
- }
- }else{
- $lang_data = XShell::getLangData();
- $r['objects_sec']=$GLOBALS['XUSER']->getObjectsAccess($this, $lang_data, $r['lines_oid']);
- }
- if(XShell::admini_mode()) {
- // passage du contexte sous module
- $submodcontext = $this->subModuleContext($ar);
- $r['urlparms'] = @$submodcontext['urlparms'];
- if (!$p->get('without_actions')) $this->browse_actions($r, false, $ar);
- if ($this->quickquery && !$assubmodule) {
- $ar['tplentry']=TZR_RETURN_DATA;
- $r['_qq']=$this->quickquery($ar);
- }
- }
- $this->browseSumFields($ar, $r, true);
- return XShell::toScreen1($tplentry,$r);
- }
- /// Parcours le module pour la selection d'un fichier
- public function &browseFiles($ar) {
- $fields = array();
- //cinq champ publié max et les champ fichier
- foreach($this->xset->desc as $fname=>$fdef){
- if( (count($fields) < 5 && $fdef->get_published()) || ($fdef->get_ftype() == 'XFileDef' || $fdef->get_ftype() == 'XImageDef')){
- $fields[]=$fname;
- }
- }
- $ar['selectedfields']=$fields;
- return $this->browse($ar);
- }
-
- /// Preparartion des donnees pour ecran de parametrage d'impression
- public function prePrintDisplay($ar) {
- $p = new XParam($ar,array());
- $order=$p->get('order');
- $tplentry=$p->get('tplentry');
- if(empty($order)) $order=$this->order;
- $ar['order']=$order;
- $ar['table']=$this->table;
- // recherche des templates d'impression
- if(empty($this->_templates)) $this->_templates=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS=TEMPLATES');
- if(!empty($this->_templates)) {
- $q1=$this->_templates->select_query(array('cond'=>array('modid'=>array('=',$this->_moid),
- 'gtype'=>array('=','xmodtable_display_print'))));
- $r=&$this->_templates->browse(array('select'=>$q1,'pagesize'=>100,'tplentry'=>TZR_RETURN_DATA));
- XShell::toScreen1($tplentry.'t',$r);
- }
- $ar['ssmoid']='all';
- for($i=1;$i<=$this->submodmax;$i++) {
- $f='ssmod'.$i;
- $ar['options'][$this->$f]['selectedfields']='all';
- }
- return $this->display($ar);
- }
- function preExportBrowse($ar=NULL){
- $this->prePrintBrowse($ar);
- }
- function preExportDisplay($ar=NULL){
- $this->prePrintDisplay($ar);
- }
- function browse_actions(&$r, $assubmodule=false, $ar=null) {
- $p = new XParam($ar);
- $noeditoids = $p->get('noeditoids');
- if(!is_array($noeditoids)) $noeditoids=array();
- $self=$GLOBALS['TZR_SESSION_MANAGER']::complete_self().'&moid='.$this->_moid.'&oid=<oid>&tplentry=br&function=';
- if(!is_array($r['lines_oid'])) return;
- $approved=XLabels::getSysLabel('general','approved');
- $not_approved=XLabels::getSysLabel('general','not_approved');
- $viewico = XLabels::getSysLabel('general','view');
- $viewtxt = XLabels::getSysLabel('general','view','text');
- $editico = XLabels::getSysLabel('general','edit');
- $edittxt = XLabels::getSysLabel('general','edit','text');
- $delico = XLabels::getSysLabel('general','delete');
- $deltxt = XLabels::getSysLabel('general','delete','text');
- $secico = XLabels::getSysLabel('general','security');
- $sectxt = XLabels::getSysLabel('general','security','text');
- $editlvl=$this->secGroups('edit');
- $dellvl=$this->secGroups('del');
- $hassubmodules=$this->hasSubModules();
- foreach($r['lines_oid'] as $i =>$oid) {
- $oidlvl=array_keys($r['objects_sec'][$i]);
- $self1=str_replace('<oid>',$oid,$self);
- $url=$self1.'display&template=xmodtable/view.html'.$r['urlparms'];
- $r['actions'][$i][0]='<a class="cv8-ajaxlink cv8-dispaction" href="'.$url.'" title="'.$viewtxt.'">'.$viewico.'</a>';
- $r['actions_url'][$i][0]=$url;
- $r['actions_label'][$i][0]=$viewico;
- // edition
- $inter=array_intersect($editlvl,$oidlvl);
- if(!empty($inter) && !in_array($oid, $noeditoids)){
- $url=$self1.'edit&template=xmodtable/edit.html'.$r['urlparms'];
- $r['actions'][$i][1]='<a class="cv8-ajaxlink cv8-editaction" href="'.$url.'" title="'.$edittxt.'">'.$editico.'</a>';
- $r['actions_url'][$i][1]=$url;
- $r['actions_label'][$i][1]=$editico;
- }
- // suppression
- $inter=array_intersect($dellvl,$oidlvl);
- if(!empty($inter) && !in_array($oid, $noeditoids)){
- $url=$self1.'del&template=basic/message.html&skip=1';
- $r['actions'][$i][2]='<a class="cv8-delaction" href="'.$url.'" title="'.$deltxt.'">'.$delico.'</a>';
- $r['actions_url'][$i][2]=$url;
- $r['actions_label'][$i][2]=$deltxt;
- }
- // securité
- if($this->object_sec && !empty($r['objects_sec'][$i]['admin'])) {
- $url='TZR.editSec(\''.$GLOBALS['TZR_SESSION_MANAGER']::complete_self(true).'\',\''.$this->_moid.'\',\''.$oid.'\')';
- $r['actions'][$i][9]='<a href="#" onclick="'.$url.'; return false;" title="'.$sectxt.'">'.
- $secico.'</a>';
- $r['actions_url'][$i][9]=$self1.'secEditSimple&template=xmodule/edit-sec.html';
- $r['actions_label'][$i][9]=$sectxt;
- }
- }
- }
- /// Edition d'une fiche
- function edit($ar) {
- $p=new XParam($ar,array());
- $tplentry=$p->get('tplentry');
- $navdir=$p->get('navdir');
- $ar['table']=$this->table;
- $ar['tplentry']=TZR_RETURN_DATA;
- if(empty($ar['fmoid'])) $ar['fmoid']=$this->_moid;
- $ar['fieldssec']=$this->getFieldsSec($ar);
- if($this->interactive){
- if($this->trackaccess) $ar['accesslog']=1;
- // Gestion de la nav page/page
- if(!empty($navdir)){
- list($navprev,$navnext,$foo,$isfirst,$islast)=$this->mkNavParms($ar);
- if($navdir=='next') $_REQUEST['oid']=$navnext;
- else $_REQUEST['oid']=$navprev;
- }
- }
- $r2=$this->xset->edit($ar);
- if(!empty($navdir)){
- $r2['_isfirst']=$isfirst;
- $r2['_islast']=$islast;
- }
- // Choix du templates d'affichage s'il existe
- if(!empty($this->_templates) && !empty($this->templates)) {
- $this->_templates->display(array('oid'=>$this->templates,'_options'=>array('error'=>'return'),'tplentry'=>$tplentry.'t'));
- }
- $this->setSubModules($ar, $r2);
- if(XShell::admini_mode()) {
- // calcul des droits
- if ($this->object_sec) {
- $acl=$GLOBALS['XUSER']->listObjectAccess($this, XShell::getLangData(), $p->get('oid'));
- $r3=array_merge($r2, $acl);
- $sec=$GLOBALS['XUSER']->getObjectAccess($this, XShell::getLangData(), $r2['oid']);
- $sec=array_flip($sec[0]);
- $r2['object_sec']=$sec;
- }
- // passage du context sous module
- $submodcontext = $this->subModuleContext($ar);
- $r2['urlparms'] = @$submodcontext['urlparms'];
- }
- if($this->captcha && (!XShell::admini_mode() || XUser::isNobody())) $r2['captcha']=$this->createCaptcha($ar);
- if($tplentry!=TZR_RETURN_DATA) XShell::toScreen1('iacl',$r3);
- return XShell::toScreen1($tplentry,$r2);
- }
- /// Prepare l'edition par lot
- function &editSelection($ar=NULL){
- $p=new XParam($ar,NULL);
- $tplentry=$p->get('tplentry');
- $oids=Kernel::getSelectedOids($p);
- $ar['editbatch']=true;
- $ar['fmoid']=$this->_moid;
- $result=$this->xset->input($ar);
- $result['oids']=$oids;
- return XShell::toScreen1($tplentry,$result);
- }
- /// Prepare l'edition par lot de tout le resultat de la recherche active
- function &editAll($ar=NULL){
- $p=new XParam($ar,NULL);
- $tplentry=$p->get('tplentry');
- if($this->isThereAQueryActive() && empty($clearrequest)) {
- $_storedquery=$this->_getSession('query');
- $ar=array_merge($_storedquery,$ar);
- $ar['editbatch']=true;
- $ar['fmoid']=$this->_moid;
- $ar['tplentry']=TZR_RETURN_DATA;
- $ar['selectedfields']=array('KOID');
- $ar['pagesize']=10000;
- $r1=$this->xset->procQuery($ar);
- $result=$this->editSelection(array('oid'=>$r1['lines_oid']));
- }
- return XShell::toScreen1($tplentry,$result);
- }
- /// Fonction de controle du formulaire
- function procEditCtrl($ar) {
- $p = new XParam($ar,array());
- $captcha_ok = $p->get('captcha_ok','local');
- if($this->captcha && (!XShell::admini_mode() || XUser::isNobody()) && !$captcha_ok){
- $captcha_key = md5($p->get('captcha_key'));
- $captcha_id = $p->get('captcha_id');
- $cnt=countSelectQuery('SELECT COUNT(*) FROM _VARS WHERE name = "CAPTCHA_'.$captcha_id.'" AND value = "'.$captcha_key.'" ');
- updateQuery('DELETE FROM _VARS WHERE name="CAPTCHA_'.$captcha_id.'" or (UPD<"'.date('YmdHis',strtotime('- 20 minutes')).'" AND '.
- 'name LIKE "CAPTCHA_%")');
- if($cnt) {
- return true;
- }else{
- $onerror=$p->get('onerror');
- if(!empty($onerror)) {
- if(!preg_match('@(^http://|^/)@',$onerror)) $onerror=$GLOBALS['TZR_SESSION_MANAGER']::complete_self().$onerror;
- header('Location: '.$onerror);
- die();
- }
- return false;
- }
- }
- return true;
- }
- /// Fonction de controle du formulaire avant insertion
- function procInsertCtrl($ar) {
- return $this->procEditCtrl($ar);
- }
- /// Fonction de controle du formulaire avant duplication
- function procEditDupCtrl($ar) {
- return $this->procEditCtrl($ar);
- }
- /****m* XModTable/procEdit
- * NAME
- * XModTable::procEdit - traitement d'une formulaire préparé avec la méthode edit.
- * DESCRIPTION
- * Traitement d'une formulaire préparé avec la méthode edit. Les données sont modifiées
- * en base de donnée
- * INPUTS
- * Passage de paramètre indirect via $ar
- ****/
- function procEdit($ar) {
- $p=new XParam($ar,array('applyrules'=>true));
- $ar['table']=$this->table;
- $ar['_track']=$this->trackchanges;
- $ar['_archive']=$this->archive;
- $ar['fieldssec']=$this->getFieldsSec($ar);
- $oid = $p->get('oid');
- $tplentry = $p->get('tplentry');
- $applyrules=$p->get('applyrules');
- $noworkflow=$p->get('_noworkflow');
- $langs=$p->get('_langs');
- if (isset($this->xset->desc['PUBLISH']) && !$this->secure('', ':rwv'))
- unset($_REQUEST['PUBLISH'], $_REQUEST['PUBLISH_HID']);
- if(is_array($oid)) {
- $P1=array();
- $reeditone=$p->get('reeditone');
- $editfields = $p->get('editfields');
- $editbatch=$p->get('editbatch');
- foreach($this->xset->desc as $f => $o) {
- if(($editfields=='all') || in_array($f,$editfields)){
- $P1[$f]=$p->get($f);
- $P1[$f.'_HID']=$p->get($f.'_HID');
- }
- }
- foreach($oid as $i=>$oid1) {
- $ar1=array();
- if(!$editbatch){
- foreach($this->xset->desc as $f => $o) {
- if(($editfields=='all') || in_array($f,$editfields)){
- if(isset($P1[$f][$i]) || isset($P1[$f.'_HID'][$i])) {
- $ar1[$f]=$P1[$f][$i];
- $ar1[$f.'_HID']=$P1[$f.'_HID'][$i];
- }
- }
- }
- }else{
- $ar1=$P1;
- }
- $ar1['_options'] = array('local'=>true);
- $ar1['oid']=$oid1;
- $ar1['editfields']=$editfields;
- $ar1['editbatch']=$editbatch;
- $ar1['applyrules']=$applyrules;
- $this->procEdit($ar1);
- }
- if($reeditone){
- $_storedquery=$this->xset->captureQuery(array('_options'=>array('local'=>true),'oids'=>$oid,'order'=>'KOID'));
- $this->_setSession('query',$_storedquery);
- $this->_setSession('lastorder','KOID');
- list($p,$n,$a)=$this->mkNavParms(array('_options'=>array('local'=>true)));
- XShell::setNext('moid='.$this->_moid.'&function=edit&template=xmodtable/edit.html&tplentry=br&oid='.$a.'&usenav=1');
- }
- return;
- }
- if($this->procEditCtrl($ar)) {
- // Traitement des cas ou l'on veut sauver dans plusieurs langues
- $ar['_langs']=$this->getAuthorizedLangs($langs,$oid,'procEdit');
- if(empty($ar['fmoid'])) $ar['fmoid']=$this->_moid;
- $r=$this->xset->procEdit($ar);
- if($applyrules) {
- XModRule::applyRules($this,$oid);
- }
- /// application du workflow
- if(empty($noworkflow) && XModule::getMoid(XMODWORKFLOW_TOID)) {
- $umod=XModule::singletonFactory(XMODWORKFLOW_TOID);
- $umod->checkAndRun($this, $this, $oid, 'edit');
- }
- if($this->savenext && in_array($this->savenext,array('display','edit')) && $tplentry!=TZR_RETURN_DATA){
- $editfields=$p->get('editfields');
- if(empty($editfields) || count($editfields)==0){
- $submodcontext=$this->subModuleContext($ar);
- XShell::setnext($GLOBALS['TZR_SESSION_MANAGER']::complete_self(true, true).'&moid='.$this->_moid.
- '&function='.$this->savenext.'&template=xmodtable/'.($this->savenext == 'display' ? 'view' : 'edit').'.html&tplentry=br&oid='.
- $oid.@$submodcontext['urlparms']);
- }
- }
- } else {
- if (XShell::admini_mode()) {
- unset($_REQUEST['skip'], $_REQUEST['_skip']);
- XShell::changeTemplate('xmodtable/edit.html');
- XShell::setNext();
- }
- $ar['options']=$this->xset->prepareReEdit($ar);
- $ar['tplentry']= 'br';
- return $this->edit($ar);
- }
- return $r;
- }
- /// Mise à jour de toutes les langues pour lesquel l'utilisateur à les droits
- function procEditAllLang($ar) {
- $ar['_langs']='all';
- return $this->procEdit($ar);
- }
- /// Duplique une fiche à partir d'une edition
- function procEditDup($ar) {
- $p = new XParam($ar, NULL);
- $tplentry = $p->get('tplentry');
- $oid=$p->get('oid');
- $ar['table']=$this->table;
- if($this->procEditDupCtrl($ar)) {
- $ret=$this->xset->procEditDup($ar);
- $this->duplicateSubModules($oid,$ret['oid']);
- if ($this->savenext && in_array($this->savenext,array('display','edit')) && $tplentry!=TZR_RETURN_DATA){
- $oid = $ret['oid'];
- $submodcontext = $this->subModuleContext($ar);
- XShell::setnext($GLOBALS['TZR_SESSION_MANAGER']::complete_self(true, true).'&class='.get_class($this).'&moid='.$this->_moid.'&function='.$this->savenext.'&template=xmodtable/'.($this->savenext == 'display' ? 'view' : 'edit').'.html&tplentry=br&oid='.$oid.@$submodcontext['urlparms']/* vide si pas sous module */);
- }
- } else {
- $options=&$this->xset->prepareReInput($ar);
- $t='xmodtable/new.html';
- XShell::changeTemplate($t);
- XShell::setNext();
- $ar['options']=$options;
- $ar['tplentry']= 'br';
- $this->insert($ar);
- unset($_REQUEST['_skip'],$_REQUEST['skip']);
- return;
- }
- return XShell::toScreen1($tplentry, $ret);
- }
- /// Traitement d'une edition par lot
- function procEditSelection($ar){
- $ar['editbatch']=true;
- return $this->procEdit($ar);
- }
- /// Duplique une fiche
- function duplicate($ar=NULL){
- $p=new XParam($ar);
- $oid=$p->get('oid');
- $ar['oid']=$oid;
- $noid=$this->xset->duplicate($ar);
- $this->duplicateSubModules($oid,$noid);
- return $noid;
- }
- /// Duplication des sous fiches d'une fiche
- function duplicateSubModules($oid,$oiddst) {
- $oids=array();
- $subMods=$this->getSubModules(true);
- foreach($subMods as $subMod) {
- $sel=$subMod['xset']->select_query(array('cond'=>array($subMod['linkfield']=>array('LIKE','%'.$oid.'%'))));
- $ssRecords=$subMod['xset']->browse(array('select'=>$sel,'tplentry'=>TZR_RETURN_DATA,
- 'selected'=>'0','selectedfields'=>$subMod['linkfield']));
- foreach($ssRecords['lines_oid'] as $i=>$ssoid){
- $oids[]=$n=$subMod['mod']->duplicate(array('oid'=>$ssoid,'_options'=>array('local')));
- updateQuery('update '.$subMod['mod']->table.' set '.$subMod['linkfield'].'="'.$oiddst.'" where KOID="'.$n.'"');
- }
- }
- return $oids;
- }
- /****m* XModTable/query
- * NAME
- * XModTable::query - génération du formulaire de requête
- * DESCRIPTION
- * Calcul des éléments du formalaire de requête pour l'ensemble de fichier. Le traitement
- * du formulaire est ensuite assuré par XModTable::procQuery ()
- * INPUTS
- * Passage de paramètre indirect via $ar
- ****/
- function query($ar) {
- $p = new XParam($ar,array());
- $tplentry=$p->get('tplentry');
- $ar['table']=$this->table;
- $ar['fieldssec']=$this->getFieldsSec($ar);
- if($this->interactive && $this->_issetSession('query')) $this->_clearSession('query');
- if($this->interactive && !$this->stored_query) $ar['searchmode']='simple';
- if(empty($ar['fmoid'])) $ar['fmoid']=$this->_moid;
- $ar['module_filter']=$this->getFilter(true,$ar); // filtre pour les SelectBox
- $r=$this->xset->query($ar);
- if($tplentry!=TZR_RETURN_DATA && XShell::admini_mode() && $this->interactive && XDataSource::sourceExists('QUERIES')) {
- $r1=$this->storedQueries();
- XShell::toScreen1('queries',$r1);
- }
- return XShell::toScreen1($tplentry,$r);
- }
- /// Recherches sauvegardées
- function storedQueries() {
- $queries = XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS=QUERIES');
- $q=$queries->select_query(array('order'=>'grp',
- 'cond'=>array('modid'=>array('=',$this->_moid),'rtype'=>array('=','table'))));
- $r1=&$queries->browse(array('select'=>$q,'selected'=>0,'tplentry'=>TZR_RETURN_DATA,'pagesize'=>'100'));
- return $r1;
- }
- /****m* XModTable/quickquery
- * NAME
- * XModTable::quickquery - génération du formulaire de requête
- * DESCRIPTION
- * Calcul des éléments du formalaire de requête pour l'ensemble de fichier. Le traitement
- * du formulaire est ensuite assuré par XModTable::procQuery ()
- * INPUTS
- * Passage de paramètre indirect via $ar
- ****/
- function &quickquery($ar) {
- $p = new XParam($ar,array());
- $ar['table']=$this->table;
- if(empty($ar['fmoid'])) $ar['fmoid']=$this->_moid;
- $r=&$this->xset->quickquery($ar);
-
- // recherche sur les sous-fiches
- if ($this->submodsearch) {
- // liste id/title
- for($i=1; $i<=$this->submodmax; $i++) {
- $ssmod = 'ssmod'.$i;
- $ssmoid = $this->$ssmod;
- if ($ssmoid) {
- $mod = XModule::objectFactory($ssmoid);
- $sec = $mod->getAccess();
- if (isset($sec['list'])) {
- $title = 'ssmodtitle'.$i;
- $ssmod_title = $this->$title;
- if (empty($ssmod_title))
- $ssmod_title = $mod->modulename;
- $r['submodules'][$i] = $ssmod_title;
- }
- }
- }
- // les criteres retenus dans la recherche
- $r['submodules_searchselected'] = $this->_submodules_searchselected;
- }
- return $r;
- }
- /// Supprime une requete sauvegardée
- function delStoredQuery($ar=NULL) {
- $p=new XParam($ar,array());
- if(XDataSource::sourceExists('QUERIES')) {
- $storename=$p->get('oidr');
- if(!empty($storename)) {
- $queries=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS='.'QUERIES');
- $queries->del(array('oid'=>$storename));
- }
- }
- }
- /**
- * Affiche le formulaire d'édition des sections fonction de type "Liste"
- * @param $ar array Paramètres de la section précédemment sauvegardés
- * @return $ret array Ensemble des champs d'édition des paramètres de la section fonction
- */
- public function &UIEdit_procQuery($ar=NULL){
- // Récupération des champs de filtrage et ajout dans le groupe "Filtre"
- $ret = $this->query($ar);
- foreach ($ret['fields_object'] as $f) {
- $ret['o'.$f->field]->fielddef->fgroup = $f->fgroup = XLabels::getSysLabel('general','filter','text');
- }
- // Construction des options génériques d'affichage de la liste
- $grp=XLabels::getSysLabel('general','result','text');
- $fs['___storedquery']=XFieldDef::objectFactory((object)array('FIELD'=>'___storedquery','FTYPE'=>'XLinkDef','MULTIVALUED'=>0,
- 'COMPULSORY'=>false,'TARGET'=>'QUERIES',
- 'LABEL'=>XLabels::getSysLabel('xmodtable','stored_query','text')));
- $fs['___storedquery']->filter='modid="'.$this->_moid.'"';
- $fs['___storedquery']->fgroup=$grp;
- $fs['__viewheader']=XFieldDef::objectFactory((object)array('FIELD'=>'__viewheader','FTYPE'=>'XBoolDef','MULTIVALUED'=>0,
- 'COMPULSORY'=>false,
- 'LABEL'=>XLabels::getSysLabel('xmodtable','viewheader','text')));
- $fs['__viewheader']->default=1;
- $fs['__viewheader']->fgroup=$grp;
- $fs['__selectedfields']=XFieldDef::objectFactory((object)array('FIELD'=>'__selectedfields','FTYPE'=>'XTableFieldDef','MULTIVALUED'=>1,
- 'COMPULSORY'=>false,'TARGET'=>$this->table,
- 'LABEL'=>XLabels::getSysLabel('general','fields','text')));
- $fs['__selectedfields']->doublebox=true;
- $fs['__selectedfields']->fgroup=$grp;
- $fs['__order']=XFieldDef::objectFactory((object)array('FIELD'=>'__order','FTYPE'=>'XTableFieldDef','MULTIVALUED'=>1,
- 'COMPULSORY'=>false,'TARGET'=>$this->table,
- 'LABEL'=>XLabels::getSysLabel('general','order','text')));
- $fs['__order']->doublebox=$fs['__order']->withorder=$fs['__order']->allowrandom=true;
- $fs['__order']->fgroup=$grp;
- $fs['__filterfields']=XFieldDef::objectFactory((object)array('FIELD'=>'__filterfields','FTYPE'=>'XTableFieldDef','MULTIVALUED'=>1,
- 'COMPULSORY'=>false,'TARGET'=>$this->table,
- 'LABEL'=>XLabels::getSysLabel('xmodinfotree','filterfields','text')));
- $fs['__filterfields']->doublebox=$fs['__filterfields']->onlyqueryable=true;
- $fs['__filterfields']->fgroup=$grp;
- $fs['__filterlabelin']=XFieldDef::objectFactory((object)array('FIELD'=>'__filterlabelin','FTYPE'=>'XBoolDef','MULTIVALUED'=>0,
- 'COMPULSORY'=>false,
- 'LABEL'=>XLabels::getSysLabel('general','filter','text') .' : '. XLabels::getSysLabel('xfielddef','label_in','text')));
- $fs['__filterlabelin']->default=2;
- $fs['__filterlabelin']->fgroup=$grp;
- $fs['__sortfields']=XFieldDef::objectFactory((object)array('FIELD'=>'__sortfields','FTYPE'=>'XTableFieldDef','MULTIVALUED'=>1,
- 'COMPULSORY'=>false,'TARGET'=>$this->table,
- 'LABEL'=>XLabels::getSysLabel('xmodinfotree','weborderselector','text')));
- $fs['__sortfields']->doublebox=true;
- $fs['__sortfields']->fgroup=$grp;
-
- $fs['__sortAscDesc']=XFieldDef::objectFactory((object)array('FIELD'=>'__sortAscDesc','FTYPE'=>'XBoolDef','MULTIVALUED'=>0,
- 'COMPULSORY'=>false,'TARGET'=>$this->table,
- 'LABEL'=>XLabels::getSysLabel('xmodinfotree','sortascdesc','text')));
- $fs['__sortAscDesc']->default=2;
- $fs['__sortAscDesc']->fgroup=$grp;
-
- $fs['__groupfields']=XFieldDef::objectFactory((object)array('FIELD'=>'__groupfields','FTYPE'=>'XTableFieldDef','MULTIVALUED'=>1,
- 'COMPULSORY'=>false,'TARGET'=>$this->table,
- 'LABEL'=>XLabels::getSysLabel('xmodinfotree','groupfields','text')));
- $fs['__groupfields']->doublebox=true;
- $fs['__groupfields']->fgroup=$grp;
-
- $fs['__pagesize']=XFieldDef::objectFactory((object)array('FIELD'=>'__pagesize','FTYPE'=>'XShortTextDef','COMPULSORY'=>false,
- 'LABEL'=>XLabels::getSysLabel('xmodinfotree','max_nb','text')));
- $fs['__pagesize']->default=$this->pagesize;
- $fs['__pagesize']->listbox=false;
- $fs['__pagesize']->fgroup=$grp;
- $fs['__linktodetail']=XFieldDef::objectFactory((object)array('FIELD'=>'__linktodetail','FTYPE'=>'XShortTextDef','COMPULSORY'=>false,
- 'FCOUNT'=>255, 'LABEL'=>XLabels::getSysLabel('xmodinfotree','linktodetail','text')));
- $fs['__linktodetail']->fgroup=$grp;
- $fs['__linktodetail']->listbox=false;
- $fs['__linktodetaillabel']=XFieldDef::objectFactory((object)array('FIELD'=>'__linktodetaillabel','FTYPE'=>'XShortTextDef','COMPULSORY'=>false,
- 'FCOUNT'=>255, 'LABEL'=>XLabels::getSysLabel('xmodinfotree','linktodetaillabel','text')));
- $fs['__linktodetaillabel']->fgroup=$grp;
- $fs['__linktodetaillabel']->listbox=false;
- $fs['__viewpagination']=XFieldDef::objectFactory((object)array('FIELD'=>'__viewpagination','FTYPE'=>'XBoolDef','MULTIVALUED'=>0,
- 'COMPULSORY'=>false,
- 'LABEL'=>XLabels::getSysLabel('xmodtable','viewpagination','text')));
- $fs['__viewpagination']->default=2;
- $fs['__viewpagination']->fgroup=$grp;
-
- foreach($fs as $fn=>&$f){
- if( empty($ar[$fn]) ){
- $value = $f->default;
- }elseif(is_array($ar[$fn])){
- $value = implode('||',$ar[$fn]);
- }else{
- $value = $ar[$fn];
- }
- $o = $f->edit($value);
- $ret['o'.$fn] = $ret['fields_object'][] = $o;
- }
- // Définit les champs disponibles uniquement en mode expert (caché par défaut aux non admin)
- $ret['__advancedfields'] = array(
- '__viewheader',
- '__filterfields',
- '__filterlabelin',
- '__sortfields',
- '__sortAscDesc',
- '__sortAscDesc',
- '__groupfields',
- '__viewpagination',
- '__linktodetail',
- '__linktodetaillabel',
- '___storedquery',
- '__selectedfields',
- );
- return $ret;
- }
- /**
- * Enregistre les paramètres des sections fonction de type "Liste"
- * @param $ar array Récupère les paramètres par défaut
- * @return $params array Liste des paramètres transformés à enregistrer
- */
- public function &UIProcEdit_procQuery($ar=NULL){
- $p=new XParam($ar,NULL);
- $xbool=new XBoolDef();
- $params=$this->xset->captureQuery($ar);
- $params['___storedquery']=$p->get('___storedquery');
- $params['__selectedfields']=implode('||',$p->get('__selectedfields'));
- $params['__order']=implode('||',$p->get('__order'));
- $params['__filterfields']=implode('||',$p->get('__filterfields'));
- $xbool->field='__filterlabelin';
- $tmp=$xbool->post_edit($p->get('__filterlabelin'),$opt=array('__filterlabelin_HID'=>$p->get('__filterlabelin_HID')));
- $params['__filterlabelin']=$tmp->raw;
- $params['__sortfields']=implode('||',$p->get('__sortfields'));
- $xbool->field='__sortAscDesc';
- $tmp=$xbool->post_edit($p->get('__sortAscDesc'),$opt=array('__sortAscDesc_HID'=>$p->get('__sortAscDesc_HID')));
- $params['__sortAscDesc']=$tmp->raw;
- $params['__groupfields']=implode('||',$p->get('__groupfields'));
- $params['__pagesize']=$p->get('__pagesize');
- $params['__linktodetail']=$p->get('__linktodetail');
- // si on a un alias détail, stoker l'oid correspondant
- if ($params['__linktodetail']) {
- list($ittable) = preg_split('/:/', $p->get('oidit'));
- $params['__linktodetail_oidit'] = selectQuery('select koid from '.$ittable.' where alias="'.$params['__linktodetail'].'"')->fetch(PDO::FETCH_COLUMN);
- // si alias incorect, supprimer
- if (!$params['__linktodetail_oidit'])
- $params['__linktodetail'] = '';
- }
- $params['__linktodetaillabel']=$p->get('__linktodetaillabel');
- $xbool->field='__viewheader';
- $tmp=$xbool->post_edit($p->get('__viewheader'),$opt=array('__viewheader_HID'=>$p->get('__viewheader_HID')));
- $params['__viewheader']=$tmp->raw;
- $xbool->field='__viewpagination';
- $tmp=$xbool->post_edit($p->get('__viewpagination'),$opt=array('__viewpagination_HID'=>$p->get('__viewpagination_HID')));
- $params['__viewpagination']=$tmp->raw;
- return $params;
- }
- /**
- * Affiche une section fonction de type "Liste" dans un gestionnaire de rubriques
- * @param $ar array Récupère les paramètres de la section
- * @return $result array Liste des résultats
- */
- public function &UIView_procQuery($ar=NULL){
- $params = $_REQUEST['sectionopts'][$ar['itoid']];
- $ar['_storedquery'] = $ar['___storedquery'];
- if(!empty($ar['__selectedfields']))
- $selectedfields = explode('||',$ar['__selectedfields']);
- else
- $selectedfields = $this->xset->browsableFields();
- $groupfields = preg_split('/\|\|/', $ar['__groupfields'], 0, PREG_SPLIT_NO_EMPTY);
- $sortfields = preg_split('/\|\|/', $ar['__sortfields'], 0, PREG_SPLIT_NO_EMPTY);
- $orderfields = preg_split('/\|\|/', $ar['__order'], 0, PREG_SPLIT_NO_EMPTY);
- $ar['order'] = implode(',', $orderfields);
- // nb de réponses
- $pagesizes = explode(',', $ar['__pagesize']);
- if ($params['pagesize']) {
- $pagesize = $params['pagesize'];
- $_SESSION['pagesize_'.$ar['itoid']] = $pagesize;
- } else {
- if (issetSessionVar('pagesize_'.$ar['itoid']))
- $pagesize = getSessionVar('pagesize_'.$ar['itoid']);
- elseif($pagesizes[0])
- $pagesize = $pagesizes[0];
- }
- if (!isset($pagesize))
- $pagesize = TZR_XMODTABLE_BROWSE_PAGESIZE;
- // recupération des parametres postés (pagination, ordre, )
- if ($params)
- $ar = array_merge($ar, $params);
-
- // ajouter les champs de groupage en premier dans l'ordre
- // permettre de trier sur ces champs
- $sqlorder = $ar['order'];
- if ($groupfields) {
- $grpfields = $groupfields;
- $sqlorderfields = preg_split('/\|\|/', $sqlorder, 0, PREG_SPLIT_NO_EMPTY);
- foreach ($sqlorderfields as $i => $orderfield) {
- $field = preg_replace('/( ASC| DESC)/i', '', $orderfield);
- if (($index = array_search($field, $grpfields)) !== false) {
- $grpfields[$index] = $orderfield;
- unset($sqlorderfields[$i]);
- }
- }
- $ar['order'] = implode(',', array_merge($grpfields, $sqlorderfields));
- }
-
- // retour depuis une fiche
- if (!isset($_SESSION['oids_'.$ar['itoid']])) {
- $do_select = true;
- $first = 0;
- } else {
- // les oids
- $oids = $_SESSION['oids_'.$ar['itoid']];
-
- if ($params['oid']
- && ($index = array_search($params['oid'], $oids)) !== false) {
- $do_select = false;
- $first = floor($index/$pagesize) * $pagesize;
- }
- // on ne poste pas le filtre (pagination)
- elseif($params && !$params['insidefilter']) {
- $do_select = false;
- $storedfilter = $_SESSION['filter_'.$ar['itoid']];
- $first = $params['first'];
- } else {
- $do_select = true;
- $first = 0;
- }
- }
-
- // calcul des filtres et récupération des valeurs
- if(!empty($ar['__filterfields'])) {
- $filterfields = preg_split('/\|\|/', $ar['__filterfields'], 0, PREG_SPLIT_NO_EMPTY);
- $filter = array('_preparedquery' => $ar, 'tplentry' => TZR_RETURN_DATA);
- $filter['searchmode'] = 'simple';
- if ($params['insidefilter']) {
- foreach ($filterfields as $field) {
- if ($_REQUEST[$field] && $_REQUEST[$field] != array('0' => '')
- && $_REQUEST[$field]!= array('0' => 'Foo')) {
- $filter[$field] = $_REQUEST[$field];
- $filter[$field.'_empty'] = $_REQUEST[$field.'_empty'];
- $filter[$field.'_op'] = $_REQUEST[$field.'_op'];
- $filter[$field.'_HID'] = $_REQUEST[$field.'_HID'];
- $filter[$field.'_FMT'] = $_REQUEST[$field.'_FMT'];
- $filter[$field.'_PAR'] = $_REQUEST[$field.'_PAR'];
- }
- }
- $ar = array_merge($ar, $filter);
- }
- // pagination
- elseif ($storedfilter) {
- $filter = array_merge($filter, $storedfilter);
- $ar = array_merge($ar, $storedfilter);
- }
- // préparation des inputs
- $filter['selectedfields'] = $filterfields;
- if ($ar['__filterlabelin'] == 1)
- foreach ($filterfields as $field)
- $filter['options'][$field]['labelin'] = true;
- $queryfields = $this->query($filter);
- // mise dans l'ordre du select
- $ordered_filterfields = array_flip($filterfields);
- foreach ($queryfields as $ofield) {
- if ($ofield->field)
- $ordered_filterfields[$ofield->field] = $ofield;
- }
- }
- if ($do_select) {
- // calcul du select
- $quickquery_value = $this->quickquery;
- $this->quickquery = false;
- $ar['getselectonly'] = true;
- $select = $this->procQuery($ar);
- $this->quickquery = $quickquery_value;
- // calcul des oids
- $select = preg_replace('/^select .* from '.$this->table.'/', 'select '.$this->table.'.KOID from '.$this->table, $select);
- if ($rs = selectQuery($select))
- $oids = $rs->fetchAll(PDO::FETCH_COLUMN);
- // verification des droits sur les enregistrements
- if($this->object_sec) {
- $tmp = array('lines_oid' => $oids);
- $this->applyObjectsSec($tmp);
- $oids = $tmp['lines_oid'];
- }
- // sauvegarde des oids en session
- $_SESSION['oids_'.$ar['itoid']] = $oids;
- }
- $result = $this->xset->browse(array(
- 'tplentry' => TZR_RETURN_DATA,
- 'selectedfields' => array_merge($selectedfields, $groupfields),
- 'nocount' => 1,
- 'tlink' => 1,
- 'pagesize' => $pagesize,
- 'where' => 'KOID in ("'.implode('","', array_slice($oids, $first, $pagesize)).'")',
- 'order' => 'field(koid, "'.implode('","', array_slice($oids, $first, $pagesize)).'")',
- 'options' => $ar['options'],
- '_options' => array('genpublishtag' => false)
- ));
- // calcul de la pagination
- $result['pagesize'] = $pagesize;
- $result['first'] = $first;
- $result['last'] = count($oids);
- if ($pagesize < $result['last']) {
- for ($p=0, $i=0; ($i<$result['last']); $p++, $i+=$pagesize)
- $result['pages'][$p] = $i;
- }
-
- // asciify keywords (url detail)
- for ($i=0; $i<count($result['lines_tlink']); $i++)
- $result['lines_tlink'][$i] = rewriteToAscii(trim($result['lines_tlink'][$i]));
-
- // passer le filtre au résultat
- $result['filterfields'] = $ordered_filterfields;
- // trie
- $result['defaultOrder'] = implode(',', $orderfields);
- foreach ($sortfields as $field) {
- if ($ar['__sortAscDesc'] == 1) {
- $result['sortfields'][$field] = array(
- 'label' => $this->xset->desc[$field]->label . ' +',
- 'selected' => $field == $sqlorder ? 'selected="selected"' : '');
- $result['sortfields']["$field DESC"] = array(
- 'label' => $this->xset->desc[$field]->label . ' -',
- 'selected' => "$field DESC" == $sqlorder ? 'selected="selected"' : '');
- } else
- $result['sortfields'][$field] = array(
- 'label' => $this->xset->desc[$field]->label,
- 'selected' => $field == $sqlorder ? 'selected="selected"' : '');
- }
- if (count($pagesizes) > 1)
- $result['pagesizes'] = $pagesizes;
- // grouper
- if ($groupfields) {
- $result['groups'] = $this->group($groupfields, $selectedfields, $result);
- // supprimer les champs de groupage (dans le header)
- for ($i=count($result['header_fields'])-1; $i>=0; $i--) {
- if (in_array($result['header_fields'][$i]->field, $groupfields))
- unset($result['header_fields'][$i]);
- }
- $result['header_fields'] = array_values($result['header_fields']);
- }
-
- // stocker le filtre pour la pagination
- if($params['insidefilter']) {
- $filter['order'] = $ar['order'];
- unset($filter['selectedfields']);
- $_SESSION['filter_'.$ar['itoid']] = $filter;
- }
- // la page ne peut pas être mise en cache
- $GLOBALS['XSHELL']->_cache = false;
- return $result;
- }
- // groupe le résultat d'un browse
- function group($groupfields, $selectedfields, $browse, $limit_characters = 0) {
- $groupfield = array_shift($groupfields);
- $neededfields = array_unique(array_merge($selectedfields, $groupfields));
- foreach ($browse['lines_oid'] as $i => $oid) {
- $line_groupfield = $browse['lines_o'.$groupfield][$i];
- // Dans le cas d'un champ multivalué
- if ($line_groupfield->collection) {
- foreach ($line_groupfield->oidcollection as $j => $oidgroup) {
- $group_label = $line_groupfield->collection[$j]->html;
- if ($limit_characters) $group_label = substr($group_label, 0, $limit_characters);
- if (in_array($oid, $groups[$group_label]['lines_oid'])) continue;
- $groups[$group_label]['lines_oid'][] = $oid;
- $groups[$group_label]['olabel'] = $line_groupfield->collection[$j];
- foreach ($neededfields as $field) {
- $groups[$group_label]['lines_o'.$field][] = &$browse['lines_o'.$field][$i];
- }
- }
- // Champ non multivalué
- } else {
- $group_label = $line_groupfield->html;
- if ($limit_characters) $group_label = substr($group_label, 0, $limit_characters);
- if (in_array($oid, $groups[$group_label]['lines_oid'])) continue;
- $groups[$group_label]['lines_oid'][] = $oid;
- $groups[$group_label]['olabel'] = $browse['lines_o'.$groupfield][$i];
- foreach ($neededfields as $field) {
- $groups[$group_label]['lines_o'.$field][] = &$browse['lines_o'.$field][$i];
- }
- }
- }
- // appel recursif
- if (count($groupfields)) {
- foreach ($groups as $group_label => $group)
- $groups[$group_label] = $this->group($groupfields, $selectedfields, $group);
- }
- ksort($groups);
- return $groups;
- }
- /// Traitement d'une recherche
- function procQuery($ar) {
- $p=new XParam($ar,array('_FIELDS'=>array(),'first'=>0));
- $tplentry=$p->get('tplentry');
- $clearrequest=$p->get('clearrequest');
- $storedquery=$p->get('_storedquery');
- if(!empty($storedquery)) $clearrequest=1;
- $first=$p->get('first');
- $getselectonly=$p->get('getselectonly');
- $persistent=$p->get('_persistent');
- // traitement de la taille des pages
- $pagesize=$p->get('pagesize');
- if(empty($pagesize)) $pagesize=$this->pagesize;
- if(empty($pagesize)) $pagesize=TZR_XMODTABLE_BROWSE_MAXPAGESIZE;
- $ar['pagesize']=$pagesize;
- // Ordre
- $order=$p->get('order');
- $this->checkOrderFields($order);
- $ar['order']=$order;
- $ar['table']=$this->table;
- $ar['tplentry']=TZR_RETURN_DATA;
- if(empty($ar['fmoid'])) $ar['fmoid']=$this->_moid;
- // Filtre
- if($this->persistentquery && $persistent) clearSessionVar('filterquery'.$this->_moid);
- $ar['_filter']=$this->getFilter(true,$ar);
- $ar['fieldssec']=$this->getFieldsSec($ar);
- // Pour gestion de la navigation page/page en display et edit
- if($this->interactive) $this->_setSession('lastorder',$p->get('order'));
- // Stockage des requêtes nommées
- if(XDataSource::sourceExists('QUERIES')) {
- $storename=$p->get('_storename');
- $storegroup=$p->get('_storegroup');
- // Sauvegarde éventuelle de la requête
- if(!empty($storename)) {
- $st=$this->xset->captureQuery($ar);
- $queries = XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS=QUERIES');
- $queries->procInput(array('title'=>$storename, 'rtype'=>'table', 'modid'=>$this->_moid,'grp'=>$storegroup,
- 'query'=>addslashes(serialize($st))));
- }
- }
- // recherche sous fiches
- if ($this->submodsearch)
- $this->checkSSmodFilter($ar);
- // Mode de recherche
- if($this->isThereAQueryActive() && empty($clearrequest) && $this->interactive) {
- // Recuperation de la requete active s'il y en a une
- $_storedquery=$this->_getSession('query');
- $ar=array_merge($_storedquery,$ar);
- } elseif (!empty($storedquery)){
- // Recherche sauvegardée
- $_storedquery = $this->xset->prepareQuery($ar, $storedquery);
- $_storedquery=$this->xset->captureQuery($ar);
- $this->_setSession('query',$_storedquery);
- $ar=array_merge($_storedquery,$ar);
- $ar['_storedquery']='';
- } elseif($this->interactive && sessionActive()) {
- $_storedquery=$this->xset->captureQuery($ar);
- // Mode affinage
- if((int)$clearrequest=='2'){
- $_storedquery2=$this->_getSession('query');
- $_storedquery['_FIELDS']=array_merge($_storedquery2['_FIELDS'],$_storedquery['_FIELDS']);
- $_storedquery=array_merge($_storedquery2,$_storedquery);
- }
- $this->_setSession('query',$_storedquery);
- $ar=array_merge($_storedquery,$ar);
- }
- $r=$this->xset->procQuery($ar);
- if(!empty($getselectonly)) return $r;
- elseif($this->persistentquery && $persistent) setSessionVar('filterquery'.$this->_moid,$r['select']);
- if($this->object_sec) $this->applyObjectsSec($r);
- else $r['objects_sec']=$GLOBALS['XUSER']->getObjectsAccess($this, XShell::getLangData(), $r['lines_oid']);
- $r['function']='procQuery';
- if(!empty($this->_templates) && !empty($this->btemplates)) {
- $r=&$this->_templates->display(array('oid'=>$this->btemplates,'_options'=>array('error'=>'return'),'tplentry'=>TZR_RETURN_DATA));
- XShell::toScreen1($tplentry.'t',$r);
- }
- if(XShell::admini_mode()) {
- // passage du contexte sous module
- $submodcontext = $this->subModuleContext($ar);
- $r['urlparms'] = @$submodcontext['urlparms'];
- $this->browse_actions($r, false, $ar);
- if ($this->quickquery && !$assubmodule) {
- $ar['tplentry']=TZR_RETURN_DATA;
- $r['_qq']=$this->quickquery($ar);
- }
- }
- $this->browseSumFields($ar,$r,!$this->object_sec);
- return XShell::toScreen1($tplentry, $r);
- }
- /// Parcours le module pour la selection d'un fichier
- public function &procQueryFiles($ar) {
- return $this->procQuery($ar);
- }
- /// traite les filtres sur les sous fiches (présence/absence)
- /// disponible dans le qquery uniquement
- /// complète $ar['_select']
- function checkSSmodFilter(&$ar) {
- $p = new XParam($ar);
- $ssmods_search = $p->get('ssmods_search');
- for ($i=1; $i<=$this->submodmax; $i++) {
- if (in_array("$i", $ssmods_search)) {
- $op = 'in';
- $this->_submodules_searchselected[$i] = $i;
- } elseif (in_array("$i:not", $ssmods_search)) {
- $op = 'not in';
- $this->_submodules_searchselected["$i:not"] = "$i:not";
- } else
- continue;
- $moid = $this->{'ssmod'.$i};
- $linkfield = $this->{'ssmodfield'.$i};
- $ssmod = XModule::objectFactory($moid);
- $table = $ssmod->table;
- // recherche des liens qui pointent vers moi
- if (empty($linkfield)){
- $links = $ssmod->xset->getXLinkDefs(NULL, $this->table);
- if (!empty($links))
- list($foo, $linkfield) = each($links);
- else
- continue;
- }
- if ($ssmod->xset->isTranslatable())
- $cond[] = 'LANG="'.XShell::getLangData().'"';
- $filter = $ssmod->getFilter(true,$ar);
- if (!empty($filter))
- $cond[] = $filter;
- if (!XShell::admini_mode() && $this->xset->fieldExists('PUBLISH'))
- $cond[] = 'PUBLISH=1';
- if (!empty($cond))
- $cond = ' where ' . implode(' and ', $cond);
- else
- $cond = '';
- $ar['_select'][] = "KOID $op (select distinct $linkfield from $table $cond)";
- }
- }
- function UIParam_insert(){
- $ret['__selectedfields']=XFieldDef::objectFactory((object)array('FIELD'=>'__selectedfields','FTYPE'=>'XTableFieldDef','MULTIVALUED'=>1,
- 'TARGET'=>$this->table,
- 'LABEL'=>XLabels::getSysLabel('general','fields','text')));
- $ret['__selectedfields']->doublebox=true;
- $ret['__dispfgroup']=XFieldDef::objectFactory((object)array('FIELD'=>'__dispfgroup','FTYPE'=>'XBoolDef','COMPULSORY'=>1,
- 'LABEL'=>XLabels::getSysLabel('xmodtable','uiinsert_dispfgroup','text')));
- $ret['__labelvalidate']=XFieldDef::objectFactory((object)array('FIELD'=>'__labelvalidate','FTYPE'=>'XShortTextDef','COMPULSORY'=>0,
- 'LABEL'=>XLabels::getSysLabel('xmodtable','uiinsert_btvalidate','text')));
- $ret['__labelvalidate']->listbox=false;
- $ret['__nextalias']=XFieldDef::objectFactory((object)array('FIELD'=>'__nextalias','FTYPE'=>'XShortTextDef','COMPULSORY'=>1,
- 'LABEL'=>XLabels::getSysLabel('xmodtable','uiinsert_okalias','text')));
- $ret['__nextalias']->listbox=false;
- return $ret;
- }
- /// Prepare l'insertion d'une fiche
- function insert($ar) {
- $p=new XParam($ar,array());
- $ar['table']=$this->table;
- $options=$p->get('options');
- $options['PUBLISH']['value']=($this->defaultispublished?'1':'2');
- $ar['options']=$options;
- $tplentry=$p->get('tplentry');
- $ar['tplentry']=TZR_RETURN_DATA;
- $ar['fieldssec']=$this->getFieldsSec($ar);
- $ar['module_filter']=$this->getFilter(true,$ar); // filtre pour les SelectBox
- if(empty($ar['fmoid'])) $ar['fmoid']=$this->_moid;
- $submodcontext=$this->subModuleContext($ar);
- // insertion en sous fiche, remplir le lien
- if($submodcontext)
- $ar['options'][$submodcontext['_linkedfields'][0]]['value']=$submodcontext['_parentoids'][0];
- $r2=$this->xset->input($ar);
- // choix du templates d'affichage s'il existe
- if(!empty($this->_templates) && !empty($this->templates)) {
- $r=$this->_templates->display(array('oid'=>$this->templates,'_options'=>array('error'=>'return'),'tplentry'=>TZR_RETURN_DATA));
- XShell::toScreen1($tplentry.'t',$r);
- }
- if($this->captcha) $r2['captcha']=$this->createCaptcha($ar);
- return XShell::toScreen1($tplentry,$r2);
- }
- /// Insere une nouvelle fiche
- function procInsert($ar) {
- $p=new XParam($ar,array('_applyrules'=>true));
- $tplentry=$p->get('tplentry');
- $noworkflow=$p->get('_noworkflow');
- $applyrules=$p->get('_applyrules');
- if($this->procInsertCtrl($ar)) {
- $ar['table']=$this->table;
- $ar['tplentry']=TZR_RETURN_DATA;
- $ar['fieldssec']=$this->getFieldsSec($ar);
- if(empty($ar['fmoid'])) $ar['fmoid']=$this->_moid;
- // recuperation du contexte sous module
- $submodcontext=$this->subModuleContext($ar);
- if($submodcontext) // insertion en sous fiche, autoriser le champ lien
- $ar['fieldssec'][$submodcontext['_linkedfield'][0]]='rw';
- if(!$p->is_set('PUBLISH')) $ar['PUBLISH']=($this->defaultispublished?1:2);
- $r=$this->xset->procInput($ar);
- if(empty($noworkflow) && XModule::getMoid(XMODWORKFLOW_TOID)) {
- $umod=XModule::singletonFactory(XMODWORKFLOW_TOID);
- $umod->checkAndRun($this, $this, $r['oid'], 'new');
- }
- if($applyrules) {
- XModRule::applyRules($this,$r['oid']);
- }
- if($this->object_sec && $this->owner_sec)
- $GLOBALS['XUSER']->setUserAccess(get_class($this),$this->_moid,XShell::getLangData(),$r['oid'],'admin');
- if(in_array($this->savenext,array('display','edit')) && $tplentry!=TZR_RETURN_DATA){
- XShell::setnext($GLOBALS['TZR_SESSION_MANAGER']::complete_self(true, true).'&moid='.$this->_moid.'&function='.$this->savenext.'&'.
- 'template=xmodtable/'.($this->savenext == 'display' ? 'view' : 'edit').'.html&tplentry=br&oid='.
- $r['oid'].@$submodcontext['urlparms']/* vide si pas sous module */);
- }elseif($p->get('_nextmode')=='edit') {
- if(XShell::admini_mode()) {
- XShell::setNext('&moid='.$this->_moid.'&function=edit&template=xmodtable/edit.html&tplentry=br&oid='.$r['oid'].@$submodcontext['urlparms']/* vide si pas sous module */);
- }else{
- XShell::setTemplates('xmodtable/edit.html');
- XShell::setNext('');
- return $this->edit(array('oid'=>$r['oid'],'tplentry'=>'br','_parentoids'=>$subModuleContext['_parentoids'],
- '_linkedfields'=>$subModuleContext['_linkedfields']));
- }
- }
- }else{
- if (XShell::admini_mode()) {
- unset($_REQUEST['skip'], $_REQUEST['_skip']);
- XShell::changeTemplate('xmodtable/new.html');
- XShell::setNext();
- }
- $ar['options']=$this->xset->prepareReEdit($ar);
- $ar['tplentry']='br';
- return $this->insert($ar);
- }
- return XShell::toScreen1($tplentry, $r);
- }
- public function UIEdit_display($ar) {
- $fs['__oid']=XFieldDef::objectFactory((object)array(
- 'FIELD'=>'__oid', 'FTYPE'=>'XLinkDef', 'COMPULSORY'=>1, 'TARGET'=>$this->table,
- 'LABEL'=>XLabels::getSysLabel('xmodtable','record','text')));
- $fs['__oid']->autocomplete=0;
- $fs['__selectedfields']=XFieldDef::objectFactory((object)array(
- 'FIELD'=>'__selectedfields', 'FTYPE'=>'XTableFieldDef', 'MULTIVALUED'=>1,
- 'TARGET'=>$this->table,
- 'LABEL'=>XLabels::getSysLabel('general','fields','text')));
- $fs['__selectedfields']->doublebox=1;
- $fs['__usegroup']=XFieldDef::objectFactory((object)array(
- 'FIELD'=>'__usegroup', 'FTYPE'=>'XBoolDef', 'MULTIVALUED'=>0, 'COMPULSORY'=>false,
- 'LABEL'=>XLabels::getSysLabel('xmodtable','uiinsert_dispfgroup','text')));
- $fs['__usegroup']->default = 2;
-
- // choix des sous-modules et de leurs champs
- $ssmod_grp = XLabels::getSysLabel('xmodule','ssmod','text');
- for($i=1; $i<=$this->submodmax; $i++) {
- if ($this->{'ssmod'.$i}) {
- $mod = XModule::objectFactory($this->{'ssmod'.$i});
- $fs['__view_'.$this->{'ssmod'.$i}]=XFieldDef::objectFactory((object)array(
- 'FIELD'=>'__view_'.$this->{'ssmod'.$i}, 'FTYPE'=>'XBoolDef', 'MULTIVALUED'=>0,
- 'COMPULSORY'=>false,
- 'LABEL'=>XLabels::getSysLabel('general','view','text').' '.$mod->modulename));
- $fs['__view_'.$this->{'ssmod'.$i}]->default = 2;
- $fs['__view_'.$this->{'ssmod'.$i}]->fgroup = $ssmod_grp;
-
- $fs['__selectedfields_'.$this->{'ssmod'.$i}]=XFieldDef::objectFactory((object)array(
- 'FIELD'=>'__selectedfields_'.$this->{'ssmod'.$i}, 'FTYPE'=>'XTableFieldDef','MULTIVALUED'=>1,
- 'TARGET'=>$mod->table,
- 'LABEL'=>XLabels::getSysLabel('general','fields','text').' '.$mod->modulename));
- $fs['__selectedfields_'.$this->{'ssmod'.$i}]->doublebox = 1;
- $fs['__selectedfields_'.$this->{'ssmod'.$i}]->fgroup = $ssmod_grp;
- }
- }
- foreach($fs as $fn=>&$f){
- $value=(is_array($ar[$fn])?implode('||',$ar[$fn]):$ar[$fn]);
- $o=$f->edit($ar[$fn]);
- $ret['o'.$fn]=$ret['fields_object'][]=$o;
- }
- return $ret;
- }
- public function UIProcEdit_display($ar) {
- $p = new XParam($ar);
- $params['__oid'] = $p->get('__oid');
- if(is_array($p->get('__selectedfields'))) $params['__selectedfields'] = implode('||', $p->get('__selectedfields'));
- else $params['__selectedfields']=$p->get('__selectedfields');
- $xbool=new XBoolDef();
- $xbool->field='__usegroup';
- $tmp=$xbool->post_edit($p->get('__usegroup'),$opt=array('__usegroup_HID'=>$p->get('__usegroup_HID')));
- $params['__usegroup']=$tmp->raw;
- for($i=1; $i<=$this->submodmax; $i++) {
- if ($this->{'ssmod'.$i}) {
- $xbool->field = '__view_'.$this->{'ssmod'.$i};
- $tmp = $xbool->post_edit($p->get('__view_'.$this->{'ssmod'.$i}), $opt = array('__view_'.$this->{'ssmod'.$i}.'_HID' => $p->get('__view_'.$this->{'ssmod'.$i}.'_HID')));
- $params['__view_'.$this->{'ssmod'.$i}] = $tmp->raw;
- $params['__selectedfields_'.$this->{'ssmod'.$i}] = implode('||', $p->get('__selectedfields_'.$this->{'ssmod'.$i}));
- }
- }
- return $params;
- }
- public function UIView_display($params) {
- $p = new XParam($params);
- $showsubmodules = 0 ;
- $requested_submodules=array();
- $options=array();
- $oid = $p->get('__oid');
- if (!empty($_REQUEST['oid'])) {
- $oid = $_REQUEST['oid'];
- }
- // controle des droits
- if (!$this->secure($oid, 'display'))
- return false;
-
- // gestion des sous-modules
- for($i=1; $i<=$this->submodmax; $i++) {
- if ($this->{'ssmod'.$i} && $params['__view_'.$this->{'ssmod'.$i}] == 1) {
- $requested_submodules[] = $this->{'ssmod'.$i};
- $options[$this->{'ssmod'.$i}]['selectedfields'] = explode('||', $params['__selectedfields_'.$this->{'ssmod'.$i}]);
- $showsubmodules = 1;
- }
- }
-
- $result = $this->display(array(
- 'tplentry' => TZR_RETURN_DATA,
- 'oid' => $oid,
- 'selectedfields' => explode('||',$params['__selectedfields']),
- 'ssmoid' => 'all',
- 'requested_submodules' => $requested_submodules,
- 'options' => $options,
- '_options' => array('genpublishtag' => false, 'error'=>'return')
- ));
- if(!is_array($result))
- $result = array('message'=>$result);
- // canonical link
- if (!empty($_REQUEST['alias']))
- header('Link: <'.$GLOBALS['HOME_ROOT_URL'].$_REQUEST['alias'].'.html?oid='.$oid.'&keywords='.rewriteToAscii($result['link']).'>; rel="canonical"');
-
- // si on vient d'une liste
- if (!empty($_REQUEST['from']) && !empty($_REQUEST['oid'])) {
- // test que l'oid appartient à une liste
- $oids = $_SESSION['oids_'.$_REQUEST['from']['itoid']];
- if (($current_index = array_search($oid, $oids)) !== false) {
- $result['_from']['alias'] = $_REQUEST['from']['alias'];
- $result['_from']['oidit'] = $_REQUEST['from']['oidit'];
- $result['_from']['itoid'] = $_REQUEST['from']['itoid'];
- $result['_prev_oid'] = $oids[$current_index-1];
- $result['_next_oid'] = $oids[$current_index+1];
- }
- }
- // indiquer au template d'afficher les sous-modules
- $result['_showsubmodules'] = $showsubmodules;
- return $result;
- }
-
- public function &display($ar) {
- $p=new XParam($ar,array());
- $oid=$p->get('oid');
- $tplentry=$p->get('tplentry');
- $ssmoid=$p->get('ssmoid');
- // On demande l'affiche d'un sous module d'une fiche seulement
- if(!empty($ssmoid) || $ssmoid=='all'){
- $ssmods=array();
- for($i=1;$i<=$this->submodmax;$i++) {
- $f='ssmod'.$i;
- $ssmods[$i]=$this->$f;
- }
- if($ssmoid!='all' && !in_array($ssmoid,$ssmods)) return;
- $r2=array('oid'=>$oid);
- }
- if(empty($ssmoid) || $ssmoid=='all'){
- // Gestion de la nav page/page
- if($this->interactive){
- if($p->is_set('navdir')){
- list($navprev, $navnext)=$this->mkNavParms($ar);
- if($p->get('navdir')=='next') $_REQUEST['oid']=$navnext;
- else $_REQUEST['oid']=$navprev;
- }
- $this->setNavActions($p->get('oid'), 'display', 'xmodtable/view.html');
- if($this->trackaccess) $ar['accesslog']=1;
- }
- $oid=$p->get('oid');
- $ar['table']=$this->table;
- $ar['tplentry']=TZR_RETURN_DATA;
- if(empty($ar['fmoid'])) $ar['fmoid']=$this->_moid;
- $ar['fieldssec']=$this->getFieldsSec($ar);
- $ar['_filter'] = $this->getFilter(true,$ar);
- $r2=$this->xset->display($ar);
- // choix du templates d'affichage s'il existe
- if(!empty($this->_templates) && !empty($this->templates)) {
- $r=&$this->_templates->display(array('oid'=>$this->templates,'_options'=>array('error'=>'return'),'tplentry'=>TZR_RETURN_DATA));
- XShell::toScreen1($tplentry.'t',$r);
- }
- if(XShell::admini_mode() && $this->object_sec) {
- $acl=$GLOBALS['XUSER']->listObjectAccess($this, XShell::getLangData(),$oid);
- $r2=array_merge($r2, $acl);
- $sec=$GLOBALS['XUSER']->getObjectAccess($this, XShell::getLangData(),$oid);
- $sec=array_flip($sec[0]);
- $r2['object_sec']=$sec;
- }
- }
- // passage du context sous module
- if (XShell::admini_mode()) {
- $submodcontext = $this->subModuleContext($ar);
- $r2['urlparms'] = @$submodcontext['urlparms'];
- }
- if(is_array($r2)) $this->setSubModules($ar, $r2);
- return XShell::toScreen1($tplentry,$r2);
- }
- /// Recupere la securité des champs
- function getFieldsSec($ar){
- if(!empty($ar['fieldssec']) && is_array($ar['fieldssec'])) return array_merge($this->fieldssec,$ar['fieldssec']);
- else return $this->fieldssec;
- }
- /// Recherche les data (browse) des sous modules
- function getSubModules($dependentOnly = false) {
- $ssmods=array();
- for($i=1;$i<=$this->submodmax;$i++) {
- if ($dependentOnly && !$this->{'ssmoddependent'.$i})
- continue;
- $f='ssmod'.$i;
- $ssmods[$i]=$this->$f;
- }
- $r = array();
- foreach($ssmods as $i=>$mymoid) {
- if(!empty($mymoid)) {
- $mod1=XModule::objectFactory($mymoid);
- if(!is_object($mod1)) continue;
- $tab1=&$mod1->xset;
- // recherche des liens qui pointent vers moi
- unset($linkfield);
- unset($fieldname);
- $fieldname=$this->{'ssmodfield'.$i};
- if(!empty($fieldname)) {
- $o=$tab1->getField($fieldname);
- if(!empty($o)) {
- $linkfield = $fieldname;
- }
- }
- if(empty($linkfield)) {
- $links1=$tab1->getXLinkDefs();
- foreach($links1 as $j=>$field) {
- $o=$tab1->getField($field);
- if($o->get_target()==$this->table)
- $linkfield = $field;
- }
- }
- if (!empty($linkfield)) {
- $r[]= array('moid'=>$mymoid, 'xset'=>$tab1, 'linkfield'=>$linkfield, 'mod'=>$mod1);
- }
- }
- }
- return $r;
- }
- function hasSubModules($moid=NULL){
- for($i=1;$i<=$this->submodmax;$i++) {
- $f='ssmod'.$i;
- $tmoid=$this->$f;
- if(!empty($tmoid) && (empty($moid) || $tmoid==$moid)) return true;
- }
- return false;
- }
- /// Recherche des données dans les sous-modules, en lecture
- /// ssmoid => all pour calculer tous les sous-modules,
- /// ou moid du sous-module demandé
- /// requested_submodules => tableau des moid des sous-modules à calculer (défaut tous)
- /// l'ordre des sous-modules est conservé
- function setSubModules($ar, &$r) {
- $p=new XParam($ar,array());
- $options=$p->get('options');
- $ssmoid=$p->get('ssmoid');
- // traitement des sous modules
- $ssmods=array();
- for($i=1;$i<=$this->submodmax;$i++) {
- $f='ssmod'.$i;
- $moid=$this->$f;
- if(!empty($ssmoid) && $ssmoid!='all' && $moid!=$ssmoid) continue;
- $ssmods[$i]=$moid;
- }
- $requested_submodules = $p->get('requested_submodules');
- $ssfield=array();
- foreach($ssmods as $i=>$mymoid) {
- if (isset($requested_submodules) && !in_array($mymoid, $requested_submodules)) {
- $r['__ssmod'][]=array();
- $r['__ssaccess'][]=array();
- $r['__ssinsert'][]=false;
- $r['__ssprops'][]=array();
- continue;
- }
- if(!empty($mymoid)) {
- // recherche du module concerné par la sous-fiche
- $mod1=XModule::objectFactory($mymoid);
- if(!is_object($mod1)) continue;
- $sec=$mod1->getAccess();
- $ins=$mod1->secure(NULL,'insert');
- if(isset($sec['ro']) || (isset($sec['list']) && $mod1->object_sec)){
- // recherche de la table qui contient les données
- $tab1=&$mod1->xset;
- // on change le titre si nécessaire
- if(!empty($this->{'ssmodtitle'.$i})) $mod1->modulename=$this->{'ssmodtitle'.$i};
- // on regarde si le champ a ete fixe
- $linkfield=$this->{'ssmodfield'.$i};
- if(!$tab1->fieldExists($linkfield)) $linkfield=NULL;
- // recherche des liens qui pointent vers moi
- if(empty($linkfield)) $links1=&$tab1->getXLinkDefs(NULL,$this->table);
- if(!empty($links1)) list($foo,$linkfield)=each($links1);
- // on fait le browse si on a trouve le champ
- if(!empty($linkfield)) {
- $order1=$p->get('_order');
- $order1=$order1[$mod1->_moid];
- if(empty($order1)) $order1=$mod1->order;
- if(!empty($ssmoid) || !XShell::admini_mode()){
- if(!empty($options[$mymoid]['selectedfields'])){
- if($listfield=$options[$mymoid]['selectedfields']=='all') $listfield=$tab1->getFieldsList();
- else $listfield=$options[$mymoid]['selectedfields'];
- } else {
- $listfield=$tab1->browsableFields();
- }
- }else{
- $listfield=array('KOID');
- }
- $tmp1=array_flip($listfield);
- if(isset($tmp1[$linkfield])) unset($tmp1[$linkfield]);
- $tmp2=array_flip($tmp1);
- // donneer une chance a une classe fille d'étendre le browse des sous fiches
- if (isset($options[$mymoid]['cond'])) {
- $cond = $options[$mymoid]['cond'];
- $cond[$linkfield] = array('=',$r['oid']);
- } else
- $cond = array($linkfield=>array('=',$r['oid']));
- if(!empty($r['oid'])){
- $select=$tab1->select_query(array('order'=>$order1, 'cond'=>$cond, 'where' => $options[$mymoid]['where']));
- $params=array('ssmodule'=>&$mod1,
- 'issmodule'=>$i,
- 'parentoid'=>$r['oid'],
- 'linkedfield'=>$linkfield,
- 'select'=>$select,
- 'selectedfields'=>$tmp2,
- 'selectedtypes'=>array(),
- 'selectedprops'=>array(),
- 'options' => $options[$mymoid]);
- $b1 = &$this->browseSubModule($ar, $params, $r);
- }else{
- $params=array('ssmodule'=>&$mod1,
- 'issmodule'=>$i,
- 'parentoid'=>'',
- 'linkedfield'=>$linkfield,
- 'select'=>'select KOID from '.$mod1->table.' order by KOID limit 1',
- 'selectedfields'=>$tmp2,
- 'selectedtypes'=>array(),
- 'selectedprops'=>array(),
- 'options' => $options[$mymoid]);
- $b1 = &$this->browseSubModule($ar, $params, $r);
- }
- // preparation des données pour affichage
- $r['__ssmod'][]=$b1;
- $r['__ssaccess'][]=$sec;
- $r['__ssinsert'][]=$ins;
- $r['__ssprops'][]=get_object_vars($mod1);
- $r['__ssprops'][count($r['__ssprops'])-1]['linkedfield']= $linkfield;
- $r['__ssprops'][count($r['__ssprops'])-1]['activate_additem']= $this->{'ssmodactivate_additem'.$i};
- }
- }else{
- $r['__ssmod'][]=array();
- $r['__ssaccess'][]=$sec;
- $r['__ssinsert'][]=$ins;
- $r['__ssprops'][]=get_object_vars($mod1);
- $r['__ssprops'][count($r['__ssprops'])-1]['linkedfield']= $linkfield;
- $r['__ssprops'][count($r['__ssprops'])-1]['activate_additem']= $this->{'ssmodactivate_additem'.$i};
- }
- }
- }
- }
- /// Appel au browse d'un module dans le cadre de l'edition ou de la visualisation de la fiche parente
- function &browseSubModule(&$ar, &$browseparm, &$result){
- $p = new XParam($ar, array());
- // champ de tri
- $orderfield = $p->get('orderfield');
- // module trie
- $ordermoid = $p->get('ssmodorder');
- // champ en edition demande(s)
- $editfield = $p->get('editfield');
- // module en edition
- $editmoid = $p->get('ssmoidedit');
- // module en enregistrement
- $savemoid = $p->get('ssmoidsave');
- // faudrait extaire les champs du champ editer pour pas avoir de conflits ...
- $editfields = false;
- $select = $browseparm['select'];
- $selectedfields = $browseparm['selectedfields'];
- $ssmodule = &$browseparm['ssmodule'];
- $filter = $browseparm['filter'];
- $order = '';
- $editfields = '';
- // traitement de la mise jour des sous fiches
- if (!empty($editfield) && $savemoid == $browseparm['ssmodule']->_moid) {
- if ($editfield != 'all')
- $editfieldsname = array($editfield);
- else
- $editfieldsname = $browseparm['selectedfields'];
- $lar = array();
- // on construit toutes les valeurs dans un contexte qui sera local
- foreach($editfieldsname as $foo=>$fn){
- $lar[$fn] = $p->get($fn);
- $lar[$fn.'_HID'] = $p->get($fn.'_HID');
- // a completer pour les champs complexes etc ?
- // semble ok texte, oui/non, date, liens liste de valeurs
- }
- $lar['tplentry']=TZR_RETURN_DATA;
- $lar['editfields']=$editfieldsname;
- // Selection des oid uniquement du module concerné
- $lar['oid']=$p->get('ssoid'.$savemoid);
- $lar['_options']=array('local'=>true);
- if($browseparm['ssmodule']->object_sec){
- foreach($lar['oid'] as $i=>$foo){
- $sec=$browseparm['ssmodule']->secure($foo,'procEdit');
- if(!$sec) unset($lar['oid'][$i]);
- }
- }else{
- $sec=$browseparm['ssmodule']->secure('','procEdit');
- if(!$sec) $lar['oid']=array();
- }
- if(!empty($lar['oid'])){
- $browseparm['ssmodule']->procEdit($lar);
- }
- // ajout des prop pour focus
- $browseparm['ssmodule']->focused=true;
- }
- // traitement du passage en mode edit
- if (!empty($editfield) && $editmoid == $browseparm['ssmodule']->_moid) {
- if ($editfield == 'all')
- $editfields = $browseparm['selectedfields'];
- else
- $editfields = array($editfield);
- // ajout des prop
- $browseparm['ssmodule']->focused=true;
- $browseparm['ssmodule']->edited=true;
- $browseparm['ssmodule']->editfield=$editfield;
- }
- // traitement du tri
- if (!empty($orderfield) && $ordermoid == $browseparm['ssmodule']->_moid){
- $order = $orderfield;
- $browseparm['ssmodule']->focused=true;
- }
- // traitement du contexte sous module
- if ($submodcontext = $this->subModuleContext($ar)) {
- $parentoids = $submodcontext['_parentoids'];
- array_unshift($parentoids, $browseparm['parentoid']);
- $linkedfields = $submodcontext['_linkedfields'];
- array_unshift($linkedfields, $browseparm['linkedfield']);
- } else {
- $parentoids = array($browseparm['parentoid']);
- $linkedfields = array($browseparm['linkedfield']);
- }
- // browse std du sous module avec les editfields et order
- return $ssmodule->browse(array('_options'=>array('local'=>true),
- 'select'=>$select,
- 'tplentry'=>TZR_RETURN_DATA,
- 'selected'=>'0',
- 'selectedfields'=>$selectedfields,
- 'pagesize'=>'200',
- 'editfields'=>$editfields,
- 'order'=>$order,
- 'assubmodule'=>true,
- 'selectedfields'=>$selectedfields,
- 'options'=>$browseparm['options'],
- 'nocount'=>$browseparm['options']['nocount'],
- '_parentoids'=>$parentoids,
- '_linkedfields'=>$linkedfields
- )
- );
- }
- function status($ar=NULL) {
- parent::status($ar);
- $b1=&XShell::from_screen('br');
- $nb=0;
- if(!empty($b1['lines_oid']))
- $nb=max(count($b1['lines_oid']),$b1['last']);
- if($nb==1)
- $msg=$nb.' '.XLabels::getSysLabel('xmodtable','record','text');
- elseif($nb>1)
- $msg=$nb.' '.XLabels::getSysLabel('xmodtable','records','text');
- $msg1=XShell::from_screen('imod','status');
- if(empty($msg)) $msg1=array();
- if(!empty($msg)) $msg1[]=$msg;
- XShell::toScreen2('imod','status',$msg1);
- }
- /// Liste des tables utilisé par le module
- public function usedTables() {
- return array($this->table);
- }
- /// Liste des tables dont les objects sont consultables dans le module
- public function usedMainTables() {
- return array($this->table);
- }
- /// Liste des boid utilisés par le module
- function usedBoids() {
- return array($this->xset->getBoid());
- }
- protected function _exportXLS(&$ar) {
- require_once('add-ons/PHPExcel/PHPExcel.php');
- $p=new XParam($ar);
- $fmt=$p->get('fmt');
- $tplentry=$p->get('tplentry');
- $oidisvisible=$p->get('oidisvisible');
- $fname=$p->get('fname');
- if(empty($fname)){
- if(!empty($this->modulename)) $fname='Export '.$this->modulename;
- else $fname='Export '.$this->xset->table_title;
- $fname = rewriteToAscii($fname);
- }
- $fname=str_replace(' ','_',removeaccents($fname));
- $br=&XShell::from_screen('br');
- $ss=new PHPExcel();
- $ss->setActiveSheetIndex(0);
- $ws=$ss->getActiveSheet();
- $ws->setTitle('Main');
- if (isset($oidisvisible)) {
- $ws->SetCellValue('A1','OID');
- $pad = 1;
- } else
- $pad = 0;
- foreach($br['header_fields'] as $j => &$f1) {
- $l=$f1->get_label();
- convert_charset($l,TZR_INTERNAL_CHARSET,'UTF-8');
- $ws->setCellValueByColumnAndRow($j+$pad,1,$l);
- }
- $ws->getStyle('A1:'.PHPExcel_Cell::stringFromColumnIndex($j+$pad).'1')->getFont()->setBold(true);
- foreach($br['lines_oid'] as $i=>$oid) {
- if($pad == 1) $ws->SetCellValue('A'.($i+2),$oid);
- foreach($br['header_fields'] as $j => &$f1) {
- $f1->writeXLS($ws,$i+2,$j+$pad,$br['lines_o'.$f1->field][$i],0,$ss);
- }
- }
- if($fmt=='xl07'){
- require_once('add-ons/PHPExcel/PHPExcel/Writer/Excel2007.php');
- $objWriter=new PHPExcel_Writer_Excel2007($ss);
- }else{
- require_once('add-ons/PHPExcel/PHPExcel/Writer/Excel5.php');
- $objWriter=new PHPExcel_Writer_Excel5($ss);
- }
- if($tplentry==TZR_RETURN_DATA) {
- $fname=TZR_TMP_DIR.uniqid().'-'.$fname;
- if($fmt=='xl07')
- $fname .= '.xlsx';
- else
- $fname .= '.xls';
- $objWriter->save($fname);
- return $fname;
- }else{
- ob_clean();
- if($fmt=='xl07'){
- header('Content-Disposition: attachment;filename="'.$fname.'.xlsx"');
- header('Cache-Control: max-age=0');
- header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
- $objWriter->save('php://output');
- }else{
- header('Content-Disposition: attachment;filename="'.$fname.'.xls"');
- header('Cache-Control: max-age=0');
- header('Content-Type: application/vnd.ms-excel');
- $objWriter->save('php://output');
- }
- die();
- }
- }
- protected function _exportHTML(&$ar) {
- $p=new XParam($ar,array());
- $tplentry=$p->get('tplentry');
- $fname=$p->get('fname');
- if(empty($fname)){
- if(!empty($this->modulename)) $fname='Export '.$this->modulename;
- else $fname='Export '.$this->xset->table_title;
- }
- $fname=str_replace(' ','_',removeaccents($fname)).'.html';
- $txt='<html>';
- $txt.='<style type="text/css">';
- $txt.='TH {text-align: right;vertical-align:top;}';
- $txt.='</style>';
- $txt.='<body>';
- $br=&XShell::from_screen('br');
- $table = $p->get('table');
- $oidisvisible = $p->get('oidisvisible');
- if($table=='table') {
- $txt.='<table>';
- if($oidisvisible) $ext='OID';
- $txt.='<tr><th><!-- OID -->'.$ext.'</th>';
- foreach($br['header_fields'] as $j => &$f1) {
- $l=$f1->get_label();
- $txt.='<th class="tzr-exp-header">'.$l.'<!-- Field:'.$j.' --></th>';
- }
- $txt.='</tr>'."\n";
- for($i=0;$i<count($br['lines_oid']);$i++) {
- $oid=$br['lines_oid'][$i];
- if($oidisvisible) $ext=$oid;
- $txt.='<tr><td><!-- '.$oid.' -->'.$ext.'</td>';
- foreach($br['header_fields'] as $j => &$f1) {
- $c=$f1->field;
- $txt.='<td class="export-'.$c.'">';
- if(!empty($br['lines_o'.$c][$i]->url)) {
- $lab=$br['lines_o'.$c][$i]->text;
- if(empty($lab)) $lab='Link';
- $txt2='<a href="'.$GLOBALS['HOME_ROOT_URL'].$br['lines_o'.$c][$i]->url.'">'.$lab.'</a>';
- $txt.=$br['lines_o'.$c][$i]->html;
- }else{
- $txt.=$br['lines_o'.$c][$i]->html;
- }
- $txt.='</td>';
- }
- $txt.='</tr>'."\n";
- }
- $txt.='</table></body></html>';
- }elseif($table=='file') {
- for($i=0;$i<count($br['lines_oid']);$i++) {
- $txt.='<table border="0" bgcolor="#DDDDDD" width="100%"><tr><td>Page #'.$i.'</td></tr></table>';
- $txt.='<table id="'.$br['lines_oid'][$i].'">';
- $txt.='<tr><th><label id="label-KOID">Object ID</label></th><td ID="content-KOID">'.$br['lines_oid'][$i].'</td></tr>';
- foreach($br['header_fields'] as $j => &$f1) {
- $c=$f1->field;
- $txt.='<tr><th><label id="label-'.$c.'">'.$f1->label.'</label></th>';
- $txt.='<td ID="content-'.$c.'">'.$br['lines_o'.$c][$i]->html.'</td></tr>'."\n";
- }
- $txt.='</table>'."\n";
- }
- $txt.='</body></html>';
- }
- if($tplentry==TZR_RETURN_DATA){
- $fname=TZR_TMP_DIR.uniqid().'-'.$fname;
- file_put_contents($fname,$txt);
- return $fname;
- }else{
- die($txt);
- }
- }
- // Export d'un browse au format csv
- public function _exportCSV(&$ar) {
- $p= new XParam($ar,array());
- $tplentry=$p->get('tplentry');
- $fsep=$p->get('csvfsep');
- $textsep=$p->get('csvtextsep');
- $charset=stripslashes($p->get('csvcharset'));
- $oidisvisible=$p->get('oidisvisible');
- $exportfiles=$p->get('exportfiles');
- $selectedfields=$p->get('selectedfields');
- $fname=$p->get('fname');
- if(empty($fname)){
- if(!empty($this->modulename)) $fname='Export '.$this->modulename;
- else $fname='Export '.$this->xset->table_title;
- }
- $fname=str_replace(' ','_',removeaccents($fname)).'.csv';
- $br=&XShell::from_screen('br');
- $csv=$headers=array();
- if($oidisvisible) $headers[]='OID';
- foreach($br['header_fields'] as $j => &$f1) {
- $headers[]=$textsep.$f1->get_label().$textsep;
- }
- $csv[]=implode($fsep,$headers);
- foreach($br['lines_oid'] as $i=>$oid){
- $row=array();
- if($oidisvisible) $row[]=$br['lines_oid'][$i];
- foreach($br['header_fields'] as $j => &$f1) {
- $row[]=$f1->writeCSV($br['lines_o'.$f1->field][$i],$textsep);
- }
- $csv[]=implode($fsep,$row);
- }
- $csv=implode("\r\n",$csv);
- convert_charset($csv,TZR_INTERNAL_CHARSET,$charset);
- if($tplentry==TZR_RETURN_DATA){
- $fname=TZR_TMP_DIR.uniqid().'-'.$fname;
- file_put_contents($fname,$txt);
- return $fname;
- }else{
- ob_clean();
- header('Content-Type: text/csv; charset='.$charset);
- header('Content-Transfer-Encoding:'.$charset);
- header('Content-disposition: attachment; filename='.$fname);
- header('Content-Length: '.strlen($csv));
- echo $csv;
- exit(0);
- }
- }
- public function export($ar) {
- $p=new XParam($ar,array());
- $fmt=$p->get('fmt');
- $target=$p->get('_target');
- $linkedfield=$p->get('_linkedfield');
- $tplentry=$p->get('tplentry');
- $exportfiles=$p->get('exportfiles');
- $exportftp=$p->get('exportftp');
- $selectedfields=$p->get('selectedfields');
- $ar['selected']='0';
- $ar['pagesize']='100000';
- $ar['norow']=1;
- $ar['nodef']=1;
- $ar['_options']=array('genpublishtag'=>false);
- if($fmt=='xl' || $fmt=='xl07') $ar['_format']='application/excel';
- $oldinteractive=$this->interactive;
- $this->interactive=false;
- $query = $this->getContextQuery($ar);
- if(!empty($target) && ($target!=$this->_moid)){
- $mod=XModule::objectFactory($target);
- if($mod->secure('','export')){
- $oids = $this->xset->browseOids(array('select' => $query, 'local' => true));
- $rs = selectQuery('select KOID from '.$mod->table.' where '.$linkedfield.' in ("'.implode('","',$oids).'")');
- unset( $ar['_selected']);
- while($ors=$rs->fetch()) {
- $ar['_selected'][$ors['KOID']] = 'on';
- }
- return $mod->export($ar);
- } else {
- XShell::redirect2auth();
- }
- }
- $ar['select']=$query;
- $browse = $this->browse($ar);
- $this->interactive=$oldinteractive;
- if($exportfiles || $exportftp) $ar['tplentry']=TZR_RETURN_DATA;
- if($fmt=='xl' || $fmt=='xl07') $file_name=$this->_exportXLS($ar);
- if($fmt=='html') $file_name=$this->_exportHTML($ar);
- if($fmt=='csv') $file_name=$this->_exportCSV($ar);
- if($exportftp){
- $scheduler=new XModScheduler();
- $o=array();
- $o['function']='exportFilesBatch';
- $o['uid']=getSessionVar('UID');
- $o['ftpserver']=$p->get('ftpserver');
- $o['ftplogin']=$p->get('ftplogin');
- $o['ftppassword']=$p->get('ftppassword');
- $o['select']=$query;
- $o['selectedfields']=$selectedfields;
- $o['fname']=$file_name;
- $roid=$scheduler->createJob($this->_moid,date('Y-m-d H:i:s'),'Export with files',$o,'',$file_name,NULL);
- XShell::setNext('template=basic/message-popup.html&message='.rawurlencode(XLabels::getSysLabel('xmodtable','exportfilescreated')).'&popupmode=1');
- }
- elseif($exportfiles) {
- $zip = $this->exportToZip($file_name, $browse);
- if ($zip['error']) {
- XShell::setNext('template=basic/message-popup.html&message='.rawurlencode($zip['message']).'&popupmode=1');
- return;
- }
- $zipsize = filesize(TZR_TMP_DIR.$zip['zipname']);
- if (!empty($GLOBALS['TZR_DLSTATS'][$this->table])
- && $GLOBALS['TZR_DLSTATS'][$this->table] == '_all')
- XModDLStats::trace($GLOBALS['XUSER']->_curoid, $this->_moid, $zip['zipname'], $zipsize);
- header('Content-type: application/zip');
- header('Content-Disposition: attachment; filename="' . $zip['zipname'] . '"');
- header('Content-length: ' . $zipsize);
- readfile(TZR_TMP_DIR.$zip['zipname']);
- unlink(TZR_TMP_DIR.$zip['zipname']);
- }
- }
- /// Permet d'exporter les fichiers via scheduler (est appelé suite à un export browse avec export des fichiers)
- function exportFilesBatch(XModScheduler &$scheduler,&$o,&$more){
- $ar=(array)$more;
- $ftpserver=$ar['ftpserver'];
- $ftplogin=$ar['ftplogin'];
- $ftppass=$ar['ftppassword'];
- $ftp=ftp_connect($ftpserver);
- if(!$ftp) $msg='Unable to connect to '.$ftpserver;
- else{
- $ftpl=ftp_login($ftp,$ftplogin,$ftppass);
- if(!$ftpl) $msg='Error logging into '.$ftpserver;
- else{
- $browse = $this->browse($ar);
- $zip = $this->exportToZip($ar['fname'], $browse);
- if($ret['error']){
- $msg=$ret['message'];
- }else{
- $dir=$ret['dir'];
- $ftpp=ftp_put($ftp,$zip['zipname'],TZR_TMP_DIR.$zip['zipname'],FTP_BINARY);
- if(!$ftpp)
- $msg='Unable to send file '.$zip['zipname'].' on the ftp server '.$ftpserver;
- elseif (!empty($GLOBALS['TZR_DLSTATS'][$this->table])
- && $GLOBALS['TZR_DLSTATS'][$this->table] == '_all')
- XModDLStats::trace($GLOBALS['XUSER']->_curoid, $this->_moid, $zip['zipname'], filesize($zip['zipname']));
- }
- }
- }
- ftp_close($ftp);
- unlink(TZR_TMP_DIR.$zip['zipname']);
- if(!empty($msg))
- $msg=sprintf(XLabels::getSysLabel('xmodtable','exportfileserror'),$msg);
- else
- $msg=sprintf(XLabels::getSysLabel('xmodtable','exportfilesok'),$zip['zipname']);
- $GLOBALS['XUSER']->sendMail2User(sprintf(XLabels::getSysLabel('xmodtable','exportfilessub'),$this->modulename),$msg,$GLOBALS['XUSER']->email());
- return $msg;
- }
- /// Cree une archive zip avec le fichier d'export et les fichiers du module
- /// @param $file fichier exporte
- /// @param $browse browse des fiches a exporter
- /// @return array
- function exportToZip($file, &$browse){
- $ret = $this->exportFiles($browse);
- if($ret['error'])
- return $ret;
- $dir = $ret['dir'];
- $file_name = basename($file);
- $file_name = substr($file_name,strpos($file_name,'-')+1);
- $file_name = str_replace('.', '_'.date('Y-m-d_H-i-s').'.', $file_name);
- rename($file, TZR_TMP_DIR.$dir.'/'.$file_name);
- $zipname = $file_name.'.zip';
- exec('(cd '.TZR_TMP_DIR.$dir.';zip -rm ../'.$zipname.' . )2>&1 > /dev/null');
- rmdir(TZR_TMP_DIR.$dir);
- return array('zipname'=>$zipname,'error'=>false);
- }
- /// Exporte les fichiers du module (copie dans un repertoire)
- /// @param $browse browse des fiches a exporter
- function exportFiles(&$browse){
- ini_set('max_execution_time', 600);
- $dirname = uniqid('exportfiles').'/';
- $dir=TZR_TMP_DIR.$dirname;
- $ret=mkdir($dir);
- if(!$ret){
- XDir::unlink($dir);
- return array('error'=>true,'message'=>'Can\'t create export dir');
- }
- $fields=array();
- foreach($browse['header_fields'] as $j=>$f) {
- if(in_array($f->ftype,array('XImageDef','XFileDef','XFolderDef'))){
- $fields[$f->field]=$f->ftype;
- $ret=mkdir($dir.$f->field.'/');
- if(!$ret){
- XDir::unlink($dir);
- return array('error'=>true,'message'=>'Can\'t create export dir');
- }
- }
- }
- foreach($browse['lines_oid'] as $i=>$oid) {
- foreach($fields as $field_name => $field_type) {
- $ofile = $browse['lines_o'.$field_name][$i];
- if($field_type=='XImageDef' || $field_type=='XFileDef'){
- if(empty($ofile->filename)) continue;
- // a voir, nom du fichier dans le zip
- // $ext=substr($ofile->originalname,strrpos($ofile->originalname,'.'));
- // $fn=basename($ofile->filename).$ext;
- $fn = $ofile->originalname;
- if ($ofile->filedef->gzipped == 1) {
- $fh = gzopen($ofile->filename, 'r');
- $content = gzread($fh, 100000000);
- gzclose($fh);
- $ret = file_put_contents($dir.$field_name.'/'.$fn, $content);
- } else
- $ret=copy($ofile->filename,$dir.$field_name.'/'.$fn);
- if(!$ret){
- XDir::unlink($dir);
- return array('error'=>true,'message'=>'Can\'t copy '.$ofile->filename);
- }
- }elseif($field_type=='XFolderDef'){
- if(empty($ofile->catalog[0])) continue;
- $_ofile=$ofile->catalog[0];
- $dir2=basename(dirname($_ofile->filename)).'/';
- $ret=mkdir($dir.$dir2);
- if(!$ret){
- XDir::unlink($dir);
- return array('error'=>true,'message'=>'Can\'t copy '.$ofile->filename);
- }
- foreach($ofile->catalog as $k => $ofile_inside){
- // a voir, nom du fichier dans le zip
- // $ext=substr($ofile_inside->originalname,strrpos($ofile_inside->originalname,'.'));
- // $fn=basename($ofile_inside->filename).$ext;
- $fn = $ofile_inside->originalname;
- if ($ofile_inside->filedef->gzipped == 1) {
- $fh = gzopen($ofile_inside->filename, 'r');
- $content = gzread($fh, 100000000);
- gzclose($fh);
- $ret = file_put_contents($dir.$dir2.$fn, $content);
- } else{
- if (file_exists($ofile_inside->filename))
- $ret=copy($ofile_inside->filename,$dir.$dir2.$fn);
- }
- if(!$ret){
- XDir::unlink($dir);
- return array('error'=>true,'message'=>'Can\'t copy '.$ofile_inside->filename);
- }
- }
- }
- }
- }
- return array('dir'=>$dirname,'error'=>false);
- }
- /// Fonction d'import automatisé des données
- function import($ar=NULL) {
- $p=new XParam($ar, array());
- $linestoskip=$p->get('linestoskip');
- $spec=$p->get('spec');
- $fieldsname=$p->get('fieldsname');
- if($spec=='default'){
- $infos=pathinfo($_FILES['file']['name']);
- if($infos['extension']=='xls') $format='xl';
- elseif($infos['extension']=='xlsx') $format='xl07';
- else $format='csv';
- $sxml='<?xml version="1.0"?><import><general format="'.$format.'" fieldsinheader="true"><linestoskip value="'.$linestoskip.'"></linestoskip><location></location><quote>"</quote><separator>;</separator><endofline></endofline><strategy clearbefore="false" updateifexists="true"></strategy><key></key></general><catalog><field tzr="KOID" name="KOID"></field><field tzr="KOID" name="OID"></field><field tzr="LANG" name="LANG"></field>';
- foreach($this->xset->desc as $fn=>&$f){
- if($fieldsname=='label') $sxml.='<field tzr="'.$fn.'" name="'.$f->label.'"></field>';
- else $sxml.='<field tzr="'.$fn.'" name="'.$fn.'"></field>';
- }
- $sxml.='</catalog></import>';
- $xml=simplexml_load_string($sxml);
- $file=$_FILES['file']['tmp_name'];
- $this->_import(array('spec'=>$xml,'file'=>$file));
- }else{
- return parent::import($ar);
- }
- }
- /// Sous fonction pour l'import automatisé
- function _import($ar=NULL) {
- $p=new XParam($ar, array());
- $spec=$p->get('spec');
- $imported=false;
- $dirpath=(string)$p->get('dir');
- if(empty($dirpath)) $dirpath=(string)$spec->general[0]->location;
- $file=$p->get('file');
- $lockfile=NULL;
- if(empty($file)) {
- $file=(string)$spec->general[0]->file;
- $lockfile=$file.'.ok';
- }
- // Manage actionbefore here
- if(property_exists($spec,'action') && property_exists($spec->action,'before')){
- $moidBefore = property_exists($spec->action->before,'moid')?(string)$spec->action->before->moid:false;
- $functionBefore = property_exists($spec->action->before,'function')?(string)$spec->action->before->function:false;
- if($moidBefore && $functionBefore){
- XLogs::notice('XModTable::_import','Try to execute moid: '.$moidBefore.' function:'.$functionBefore);
- $mod = XModule::objectFactory($moidBefore);
- $mod->$functionBefore($ar);
- }
- }
- // Import d'un fichier
- if(!empty($file) && (empty($lockfile) || file_exists($lockfile))) {
- $ar['spec']=$spec;
- $ar['file']=$file;
- $imported=$this->_import_data($ar);
- if(!empty($lockfile)) @unlink($lockfile);
- }elseif(in_array($spec->general[0]['format'],array('csv','xl','xl07'))){
- // Import de csv depuis un repertoire
- XLogs::notice('XModTable::_import','module '.$this->_moid." $dirpath");
- $dir=opendir($dirpath);
- while($dir!==false && ($file=readdir($dir))!==false) {
- if(preg_match('/(.*).(txt|csv|xml)/i',$file)) {
- $ar['file']=$dirpath.$file;
- $ar['spec']=$spec;
- $imported = $this->_import_data($ar);
- }
- }
- }elseif($spec->general[0]['format']=='files'){
- // Import de fichier
- $ar['spec']=$spec;
- $imported=$this->_import_files($ar);
- }
- // Manage actionafter here
- if($imported){
- if(property_exists($spec,'action') && property_exists($spec->action,'after')){
- $moidAfter = property_exists($spec->action->after,'moid')?(string)$spec->action->after->moid:false;
- $functionAfter = property_exists($spec->action->after,'function')?(string)$spec->action->after->function:false;
- if($moidAfter && $functionAfter){
- XLogs::notice('XModTable::_import','Try to execute After function moid: '.$moidAfter.' function:'.$functionAfter);
- $mod = XModule::objectFactory($moidAfter);
- $mod->$functionAfter($ar);
- }
- }
- }
- }
- /// Import des fichiers d'un dossier et ses sous dossiers (retourne true si au moins un fichier est importé)
- function _import_files($ar=NULL) {
- ini_set('max_execution_time', 600);
- $p=new XParam($ar, array());
- $found=false;
- $specs=$p->get('spec');
- $location=(string)$specs->general->location;
- @$filefield=(string)$specs->general->filefield;
- if(empty($filefield)){
- $flist=$this->xset->getFieldsList(array('XImageDef'));
- if(!empty($flist)) $filefield=$flist[0];
- else return false;
- }
- if(!empty($specs->general->authext)){
- $authext=explode(',',$specs->general->authext);
- foreach($authext as $i=>$ext) $authext[$i]=strtolower($ext);
- }
- @$titlefield=(string)$specs->general->titlefield;
- @$importedfield=(string)$specs->general->importedfield;
- @$unique=(string)$specs->general[0]->strategy[0]['unique'];
- @$updateifexist=(boolean)$specs->general[0]->strategy[0]['updateifexists'];
- @$notdel=(string)$specs->general[0]->strategy[0]['notdeletefiles'];
- if($unique && $unique!='false') $unique=true;
- else $unique=false;
- if($updateifexist && $updateifexist!='false') $updateifexist=true;
- else $updateifexist=false;
- if($notdel && $notdel!='false') $notdel=true;
- else $notdel=false;
- $return=false;
- $xmime=XMimeTypes::getInstance();
- $files=XDir::scan($location);
- foreach($files as $i=>$file) {
- $filename=$file;
- $info=pathinfo($filename);
- if(!empty($authext)){
- if(!in_array(strtolower($info['extension']),$authext)) continue;
- }
- if(filetype($filename)=='file') {
- $return=true;
- $ar1=array();
- $value=array('tmp_name'=>$filename,'type'=>$xmime->getValidMime('',$filename,$filename),'name'=>$info['basename'],'title'=>'',
- 'size'=>filesize($filename));
- $ar1[$filefield]=$value;
- if(!empty($titlefield)){
- $ar1[$titlefield]=$info['filename'];
- if($unique) $ar1['_unique']=array($titlefield);
- if($updateifexist) $ar1['_updateifexists']=1;
- }
- if($importedfield){
- $f1=&$this->xset->getField($importedfield);
- if($f1->get_ftype()=='XBoolDef') $ar1[$importedfield]=1;
- else $ar1[$importedfield]=date('Y-m-d H:i:s');
- }
- if($notdel) $ar1['options'][$filefield]['del']=false;
- $ar1['_allfields']=true;
- $ret=$this->xset->procInput($ar1);
- }
- }
- return $return;
- }
- /// Importe un fichier (csv/xls/xlsx) dans la base. Renvoie true si au moins une ligne est importée
- function _import_data($ar=NULL) {
- $p=new XParam($ar, array());
- $found=false;
- $file=$p->get('file');
- XLogs::notice('XModTable::_import_data','module '.$this->_moid.' file='.$file);
- $specs=$p->get('spec');
- $data=@file_get_contents($file);
- if(file_exists($file)) {
- $format=(string)$specs->general[0]['format'];
- if($format=='csv'){
- $charset=(string)$specs->general[0]['charset'];
- if($charset) convert_charset($data,$charset,TZR_INTERNAL_CHARSET);
- $data=_getCSVData($data,$specs);
- }elseif($format=='xl'){
- $data=_getXLSData($file,'Excel5');
- }elseif($format=='xl07'){
- $data=_getXLSData($file,'Excel2007');
- }
- if(!empty($data)) $found = $this->_doImportData($data, $specs);
- @unlink($file);
- }
- return $found;
- }
- ///effective import data from array ($data) returned by getXXXdata
- protected function _doImportData(&$data, &$specs) {
- $unique=array();
- $found=false;
- $koid=(string)$specs->general[0]->koid[0];
- $updateifexists=(string)$specs->general[0]->strategy[0]['updateifexists'];
- if(!empty($updateifexists) && $updateifexists!='false') $updateifexists=true;
- else $updateifexists=false;
- $keys=$specs->general[0]->key;
- $unique=array();
- foreach($specs->general->key as $i=>$u){
- if(!empty($u)) $unique[]=(string)$u;
- }
- if(!empty($unique)) $unique[]='LANG';
- // Vide la table si demandé
- $clearbefore=(string)$specs->general[0]->strategy[0]['clearbefore'];
- if(!empty($clearbefore) && ($clearbefore!='false')) {
- XLogs::notice('XModTable::_import_data','clearing before importing');
- $deleterequest=(string)$specs->general[0]->strategy[0]->clearrequest[0];
- if(!empty($deleterequest)) $this->xset->clear($deleterequest);
- else $this->xset->clear();
- }
- // Creation des entetes
- $head=array();
- $fieldsinheader=(string)$specs->general[0]['fieldsinheader'];
- if(!empty($fieldsinheader) && $fieldsinheader!='false') $fieldsinheader=true;
- else $fieldsinheader=false;
- if($fieldsinheader){
- $line=$data[0];
- foreach($line as $i=>$field){
- if($field) $head[mb_strtoupper($field,TZR_INTERNAL_CHARSET)]=$i;
- }
- unset($data[0]);
- }else{
- $j=0;
- foreach($specs->catalog->field as $i=>$field){
- $head[(string)$field['tzr']]=$j;
- $j++;
- }
- }
- // Supprime les lignes à ne pas importer
- $linestoskip=(string)$specs->general[0]->linestoskip[0]['value'];
- if(!empty($linestoskip)) {
- for($i=0;$i<$linestoskip;$i++) unset($data[$i]);
- }
- $message='<dl>';
- $tot=$ok=$nok=$update=0;
- $incompletelines=$emptylines=array();
- foreach($data as $line=>&$tuple) {
- $tot++;
- $message.='<dt><strong>- Line '.($line+1).'</strong></dt>';
- if(count($tuple)<count($head)){
- $message.='<dd>Incomplete line</dd>';
- $incompletelines[]=$line+1;
- continue;
- }
- $isempty=true;
- foreach($tuple as $i=>$value){
- if(!empty($value)){
- $isempty=false;
- break;
- }
- }
- if($isempty){
- $message.='<dd>Empty line</dd>';
- $emptylines[]=$linet+1;
- continue;
- }
- $input=array();
- $refsql= array();
- $input['_unique']=$unique;
- // Specifie la langue par defaut de l'entrée
- if($specs->general[0]->lang[0]) $input['LANG']=$specs->general[0]->lang[0];
- else $input['LANG']=TZR_DEFAULT_LANG;
- foreach($specs->catalog->field as $i=>$field) {
- $tzrfield=(string)$field['tzr'];
- $namefield=(string)$field['name'];
- $skip=(string)$field['skip'];
- if(!empty($skip) && $skip!='false') continue;
- if($fieldsinheader && $namefield) $value=$tuple[$head[mb_strtoupper($namefield, TZR_INTERNAL_CHARSET)]];
- else $value=$tuple[$head[$tzrfield]];
- if($tzrfield != 'LANG' AND in_array($tzrfield,$unique)){
- $refsql[] = "$tzrfield like '".trim($value)."'";
- }
- // On passe les champs du catalogue qui ne sont pas dans le fichier
- if($value===NULL) continue;
- $defaultvalue=(string)$field->default[0];
- if(!empty($tzrfield)) {
- if($tzrfield=='KOID'){
- if(empty($value)) break;
- if(strpos($value,$this->table.':')===0) $input[$tzrfield]=$value;
- else $input[$tzrfield]=$this->table.':'.$value;
- }elseif($tzrfield=='LANG') $input[$tzrfield]=$value;
- else{
- $v=$this->xset->getField($tzrfield);
- if(!is_object($v)){
- $message='Error : field "'.$tzrfield.'" doesn\'t exists<br>';
- break 2;
- }
- $ret=$v->import($value,$field);
- $input[$tzrfield]=$ret['value'];
- if(empty($input[$tzrfield]) && !empty($defaultvalue)) $input[$tzrfield]=$defaultvalue;
- if(!empty($ret['message'])) $message.='<dd>'.$ret['message'].'</dd>';
- }
- }
- }
- // Recupere un eventuel oid
- if(!empty($koid)){
- if(strpos($input[$koid],':')) $input['newoid']=$input[$koid];
- else $input['newoid']=$this->table.':'.rewriteToAscii($input[$koid]);
- }elseif(!empty($input['KOID'])){
- if(strpos($input['KOID'],':')) $input['newoid']=$input['KOID'];
- else $input['newoid']=$this->table.':'.rewriteToAscii($input['KOID']);
- }elseif(!empty($refsql) && !empty($updateifexists)){
- $sele = 'SELECT KOID FROM '.$this->table.' WHERE LANG = \''.TZR_DEFAULT_LANG.'\' AND '.implode(' AND ',$refsql);
- $rsk = &selectQuery($sele);
- $Koid ='';
- if($rsk && $rsk->rowCount()==1 && $orsk = $rsk->fetch(PDO::FETCH_ASSOC)){
- $input['newoid'] = $orsk['KOID'];
- }
- }
- $input['_updateifexists']=$updateifexists;
- $input['_delayed']=false;
- $input['_nolog']=true;
- $input['tplentry']=TZR_RETURN_DATA;
- if(empty($input['LANG']) || $input['LANG']==TZR_DEFAULT_LANG || $this->xset->getTranslatable()==3){
- if(!empty($input['LANG']) && $input['LANG']!=TZR_DEFAULT_LANG && !$this->secure('','procInsert',$u=NULL,$input['LANG'])){
- $message.='<dd>Write in '.$input['LANG'].' is not allowed</dd>';
- $nok++;
- }else{
- $input['LANG_DATA']=$input['LANG'];
- $r=&$this->xset->procInput($input);
- if(!empty($r['oid'])){
- if(!$found) $found=true;
- $message.='<dd>Insert : success -> '.$r['oid'].'</dd>';
- $ok++;
- }elseif(empty($r['error'])){
- $message.='<dd>Insert : update an existing entry</dd>';
- $update++;
- }else{
- $message.='<dd>Insert : error ('.$r['message'].')</dd>';
- $nok++;
- }
- }
- }elseif(!empty($input['newoid']) ){
- if(!array_key_exists($input['LANG'],$GLOBALS['TZR_LANGUAGES'])){
- $message.='<dd>Lang '.$input['LANG'].' does not exist</dd>';
- $nok++;
- }elseif($this->secure('','procEdit',$u=NULL,$input['LANG'])){
- $input['LANG_DATA']=$input['LANG'];
- if(!empty($input['newoid'])) $input['oid']=$input['newoid'];
- $r=&$this->xset->procEdit($input);
- $message.='<dd>Update '.$input['oid'].' in '.$input['LANG'].'</dd>';
- $update++;
- }else{
- $message.='<dd>Write in '.$input['LANG'].' is not allowed</dd>';
- $nok++;
- }
- }else{
- $message.='<dd>Not default lang and no KOID</dd>';
- $nok++;
- }
- unset($input);
- }
- $message.='</dl>';
- $message='Total : '.$tot.'<br>Insert : '.$ok.'<br>Update : '.$update.'<br>Error : '.$nok.'<br>'.
- 'Empty lines : '.count($emptylines).' ('.implode(', ',$emptylines).')<br>'.
- 'Incomplete line : '.count($incompletelines).' ('.implode(', ',$incompletelines).')<br>'.$message;
- XShell::toScreen2('','message',$message);
- return $found;
- }
- function sub($ar) {
- return parent::sub($ar);
- }
- protected function _lasttimestamp() {
- $upd=countSelectQuery('select ifnull(MAX(UPD),0) from '.$this->table);
- if($this->trackchanges && !$this->getFilter() && !$this->object_sec)
- $upd2=countSelectQuery('select ifnull(MAX(UPD),0) from LOGS where etype="delete" and comment like "%('.$this->table.':%"');
- else
- $upd2=0;
- return max($upd,$upd2);
- }
- /// rend la liste des fiches modifiees depuis ts et jusqu'a timestamp
- protected function _whatsNew($ts,$user, $group=NULL, $specs=NULL,$timestamp=NULL) {
- @list($oid,$details)=explode(';',$specs);
- $query='select KOID from '.$this->table.' where UPD >= "'.$ts. '" and UPD<"'.$timestamp.'"';
- $oids = $this->xset->browseOids(array('select'=>$query, 'pagesize'=>'99', 'tplentry'=>TZR_RETURN_DATA, '_filter'=>$this->getFilter()));
- $txt='';
- foreach ($oids as $oid) {
- $d1=$this->xset->display(array('_lastupdate'=>true,'tplentry'=>TZR_RETURN_DATA,'tlink'=>true,'oid'=>$oid,'_options'=>array('error'=>'return')));
- $url=$GLOBALS['TZR_SESSION_MANAGER']::admin_url(true,false).'&moid='.$this->_moid.'&function=display&oid='.$oid.'&tplentry=br&template=xmodtable/view.html&_direct=1';
- if(is_array($d1) && ($d1['lst_upd']['user']!=$user)) {
- $when=$d1['oUPD']->html;
- $who=$d1['lst_upd']['usernam'];
- $what=XLabels::getSysLabel('general',$d1['lst_upd']['etype'],'text');;
- $j=XLogs::getJournal($oid,NULL,$ts,$timestamp,$this->xset);
- $modifs="<br/>";
- $whoarray=array();
- foreach($j['lines_journal'] as $entry=>$log) {
- if(!in_array($j['lines_ousernam'][$entry]->text, $whoarray))
- $whoarray[]=$j['lines_ousernam'][$entry]->text;
- $modifs.=implode('<br/>',$log);
- $modifs.='<br/>';
- }
- // construction du texte
- $who=implode(', ',$whoarray);
- $txt.='<li><a href="'.$url.'">'.$d1['tlink'].'</a> ('.$when.
- ($this->trackchanges?(', '.$who.', '.$what):'').')';
- // on ajoute le detail des logs si abonnement avec detail
- if($details && $this->trackchanges) {
- $txt.=$modifs;
- }
- $txt.='</li>';
- }
- }
- if($this->trackchanges && !$this->getFilter() && !$this->object_sec){
- $x=XDataSource::objectFactoryHelper8('BCLASS=XDSTable&SPECS=LOGS');
- $rs=selectQuery('select * from LOGS where UPD>="'.$ts. '" and UPD<"'.$timestamp.'" and etype="delete" and comment like "%('.$this->table.':%)"');
- while($rs && $ors=$rs->fetch()){
- $d=$x->rDisplay($ors['KOID'],$ors,false);
- $txt.='<li>'.$d['ocomment']->text.' ('.$d['oUPD']->html.', '.$d['ousernam']->html.', '.$d['oetype']->html.')</li>';
- }
- }
- return $txt;
- }
- function goto1($ar=NULL) {
- $p=new XParam($ar,array());
- $oid=$p->get('oid');
- $url=$GLOBALS['TZR_SESSION_MANAGER']::admin_url(false,true);
- $moid=$this->_moid;
- $right= $this->secure($oid, 'display');
- if(!$right) securityWarning('XModTable::goto1: could not access to objet '.$oid.' in module '.$moid);
- header("Location: {$url}&moid=$moid&template=xmodtable/view.html&oid=$oid&function=display&tplentry=br");
- }
- function gDisplay($ar=NULL) {
- self::developer($ar);
- $p=new XParam($ar,array());
- $tplentry=$p->get('tplentry');
- }
- function developer($ar=NULL) {
- parent::developer($ar);
- $r['lines_title'][]='Display template';
- $r['lines_url'][]='&function=gDisplay';
- XShell::toScreen1('dev',$r);
- }
- // rend le journal des modifs d'un objet
- //
- public function &journal($ar) {
- $p = new XParam($ar, array());
- $tplentry=$p->get('tplentry');
- $oid=$p->get('oid');
- $r=&XLogs::getJournal($oid,array('etype'=>array('=',array('create','update','rule'))),NULL,NULL,$this->xset, $this->fieldssec);
- $this->browseSumFields($ar, $r, true);
- return XShell::toScreen1($tplentry,$r);
- }
- /// Validation des oid ou des rubriques
- public function publish($ar) {
- $p=new XParam($ar,array());
- $oids=Kernel::getSelectedOids($p);
- foreach($oids as $oid) {
- if($this->secure($oid,'publish')){
- $ar1['_selected'] = array();
- $ar1['value'] = $p->get('value');
- $ar1['_local'] = true;
- $ar1['oid']= $oid;
- $this->xset->publish($ar1);
- }
- }
- }
-
-
- /// Retourne le filtre du module
- public function getFilter($instanciate=true,$ar=array()) {
- $q=getSessionVar('filterquery'.$this->_moid);
- // Pas très beau, mais afin de contourner le filtre dans les actions venant de la selection, si on est dans l'admin et ques des oids sont fournis, alors on ne l'applique pas.
- if(XShell::admini_mode()){
- $oids=Kernel::getSelectedOids($ar);
- if(!empty($oids) && Kernel::getTable($oids[0])==$this->table){
- $q=null;
- }
- }
- if(!empty($q)){
- // si pas de jointure on renvoie un filtre simple
- if (preg_match('/select .* from (.*) where (.*)/i', $q, $matches) && $matches[1] == $this->table) {
- $q=preg_replace('/order by .*$/i','',$matches[2]);
- $filter='('.$q.')';
- } else { // sinon un subselect
- $q=preg_replace('/select .* from/i','select '.$this->table.'.KOID from',$q);
- $q=preg_replace('/order by .*$/i','',$q);
- $filter=$this->table.'.KOID in ('.$q.')';
- }
- }else{
- $filter=$this->filter;
- if($instanciate) {
- $context=array();
- $u=XUser::get_user();
- $context['/(\$\(user\))/']=XUser::get_current_user_uid();
- if(!empty($u->_cur['alias'])) $context['/(\$\(user\.alias\))/']=$u->_cur['alias'];
- $filter=preg_replace(array_keys($context),array_values($context),$filter);
- }
- }
- if(!empty($ar['_filter'])){
- if($filter) $filter='('.$filter.') AND ('.$ar['_filter'].')';
- else $filter=$ar['_filter'];
- }
- return $filter?'('.$filter.')':'';
- }
- /// Filtre sql utilisé par les xfielddef pour filtrer les valeurs utilisées
- function getUsedValuesFilter(){
- return $this->getFilter();
- }
- public function isThereAQueryActive() {
- if(sessionActive()) {
- $_storedquery=$this->_getSession('query');
- if($_storedquery['_table']==$this->table) {
- return true;
- }
- }
- return false;
- }
- /// gestion du contexte sous module
- /// $shift dépile le premier élément dans l'url, pour un retour à la fiche parente
- protected function subModuleContext($ar=array(), $shift=false){
- $p = new XParam($ar, array());
- $_parentoids = $p->get('_parentoids');
- $_linkedfields = $p->get('_linkedfields');
- $ret = false;
- if (!empty($_parentoids) && !empty($_linkedfields)) {
- $urlparms = '';
- foreach ($_parentoids as $i => $parentoid) {
- if (!$i && $shift)
- continue;
- $urlparms .= '&_parentoids[]='.$parentoid;
- }
- foreach ($_linkedfields as $i => $linkedfield) {
- if (!$i && $shift)
- continue;
- $urlparms .= '&_linkedfields[]='.$linkedfield;
- }
- // deprecated, backward compatibility
- $urlparms .= '&_parentoid='.$_parentoids[0].'&_linkedfield='.$_linkedfields[0];
- $ret = array('_parentoids' => $_parentoids,
- '_linkedfields' => $_linkedfields,
- 'urlparms' => $urlparms);
- }
- return $ret;
- }
- /// Prepare le HTML pour l'affichage d'un captcha dans un formulaire
- function createCaptcha($ar,$force=false){
- $p=new XParam($ar,NULL);
- $tplentry=$p->get('tplentry');
- if($this->captcha || $force){
- XLogs::notice('XModTable::_createcaptcha','module '.$this->_moid." ");
- $varid=uniqid('c');
- $color = XIni::get('error_color');
- $captcha['html']='<div class="tzrDivCaptcha"><img id="cimg'.$varid.'"/>'.
- '<a id="ca'.$varid.'" href="#" onclick="TZR.actualizeCaptcha(\''.TZR_CAPTCHA.'\',\''.$varid.'\'); return false;">'.
- XLabels::getSysLabel('xmodtable','captcha_reload').'</a>'.
- '<input type="text" id="'.$varid.'" name="captcha_key" maxlength="'.TZR_CAPTCHA_LENGTH.'" size="'.TZR_CAPTCHA_LENGTH.'" />'.
- '<input type="hidden" name="captcha_id" value="'.$varid.'" />'.
- "<script type=\"text/javascript\">TZR.actualizeCaptcha('".TZR_CAPTCHA."','$varid'); ".
- "TZR.addValidator(['$varid','','Captcha','$color','Captcha']);</script></div>";
- $captcha['label'] = XLabels::getSysLabel('xmodtable','captcha_label');
- return XShell::toScreen1($tplentry,$captcha);
- }
- }
- // implementation de l'interface des documents
- function &XMCinput($ar) {
- return $this->insert($ar);
- }
- function &XMCprocInput($ar) {
- return $this->procInsert($ar);
- }
- function &XMCedit($ar) {
- return $this->edit($ar);
- }
- function &XMCprocEdit($ar) {
- $e = &$this->procEdit($ar);
- return $e;
- }
- function &XMCprocEditDup($ar) {
- return $this->procEditDup($ar);
- }
- function &XMCdisplay($ar) {
- return $this->display($ar);
- }
- function &XMCdel($ar) {
- return $this->del($ar);
- }
- function &XMCduplicate($oidsrc){
- if(!is_array($oidsrc)) $oidsrc=array('oid'=>$oidsrc);
- return $this->duplicate($oidsrc);
- }
- function &XMCquery($ar){
- return $this->query($ar);
- }
- function &XMCprocQuery($ar){
- return $this->procQuery($ar);
- }
- function tablesToTrack() {
- if($this->trackchanges) return array($this->table);
- }
- function apply($f) {
- $rs=selectQuery('SELECT DISTINCT KOID FROM '.$this->table);
- while($ors=$rs->fetch()) {
- $d=&$this->xset->rDisplay($ors['KOID']);
- $f($this, $d);
- }
- $rs->closeCursor();
- }
- // verification qu'un module est bien installé. Si le parametre
- // repair est a oui, on fait les reparations si possible.
- //
- public function chk($ar=NULL) {
- parent::chk($ar);
- // Créer des index sur tous les champs servant de lien dans des sous fiches
- for($i=1;$i<=$this->submodmax;$i++) {
- $l='ssmod'.$i;
- $moid=$this->$l;
- $l='ssmodfield'.$i;
- $f=$this->$l;
- if(!empty($moid) && !empty($f)){
- $mod=XModule::objectFactory($moid);
- $l=$mod->xset->desc[$f]->multivalued?300:40;
- updateQuery('CREATE INDEX '.$f.' ON '.$mod->table.' ('.$f.'('.$l.'))');
- }
- }
- return true;
- }
- /// recherche si on oid est autorise dans le module
- protected function secOidOk($oid) {
- if(substr($oid,0,7)=='_field-') return true;
- if(isset($this->secOids_cache[$oid])) return $this->secOids_cache[$oid];
-
- // Vérifie que l'oid est dans la selection. Si oui, c'est que l'utilisateur a accès à celui ci
- $selection=$this->getSelectionFromSession();
- if($selection && array_key_exists($oid,$selection)) return true;
- // Applique le filtre du module pour vérifier sir l'oid est accessible
- $filter=$this->getFilter(true);
- if(!empty($filter)) {
- // dans le cas d'un filtre, on verifie si on appartient au filtre
- $rs=selectQuery('select KOID from '.$this->table.' where KOID="'.$oid.'" AND '.$filter);
- if($rs && ($ors=$rs->fetch())) {
- $this->secOids_cache[$oid] = !empty($ors['KOID']);
- return $this->secOids_cache[$oid];
- }
- } else {
- return true;
- }
- }
- /// Calcul des champs totalisés suite à un browse
- function browseSumFields($ar, &$r, $withtotal){
- $p = new XParam($ar, array());
- $tpl = $p->get('tplentry');
- // totalisation des champs numériques listés
- $numfields = array();
- $fsums = ""; $sep = '';
- foreach($r['header_fields'] as $if=>$fd){
- if (!$fd->is_summable()) continue;
- $numfield = (object)array('if'=>$if,
- 'fc'=>$fd->field,
- 'ffc'=>$this->table . '.' . $fd->field,
- 'ffa'=>'sumof_'.$this->table . '_' . $fd->field,
- );
- $numfields[$fd->field] = $numfield;
- $fsums = $fsums . $sep . 'ifnull('.$fd->sqlsumfunction().', 0) as '.$numfield->ffa;
- $sep = ',';
- }
- if (count($numfields) == 0)
- return;
- // requete de base
- $selectsum = preg_replace('/select (.*) from (.*)$/Ui','select '.$fsums.' from $2',$r['select']);
- // total de la selection en cours
- if ($withtotal){
- $srs = selectQuery($selectsum);
- $osrs = $srs->fetch();
- } else {
- $osrs = NULL;
- }
- // total de la page en cours
- // -> liste des oid de la page
- // -> l'ordre n'a pas d'importance
- $pagesize=$p->get('pagesize');
- if(empty($pagesize)) {
- $pagesize=$this->pagesize;
- }
- if(empty($pagesize))
- $pagesize=TZR_XMODTABLE_BROWSE_MAXPAGESIZE;
- $ar['pagesize']=$pagesize;
- $last = $p->get('last');
- if (empty($last)){
- $last = $r['last'];
- }
- if ($last > $pagesize || !$withtotal){
- // calcul du total page par iteration sur les lignes
- $osprs = array();
- foreach($r['header_fields'] as $foo=>&$fd){
- if (isset($numfields[$fd->field])){
- $osprs[$fd->field]=0;
- foreach($r['lines_o'.$fd->field] as $il=>&$fv){
- $osprs[$numfields[$fd->field]->ffa]+=$fv->raw;
- }
- }
- }
- unset($foo);
- }
- // mise en forme des totaux
- $linetot = $linepage = '';
- foreach($r['header_fields'] as $foo=>&$fd){
- if (isset($numfields[$fd->field])){
- if ($withtotal)
- $linetot.='<td style="text-align:'.$fd->align.';">'.$fd->my_display($osrs[$numfields[$fd->field]->ffa])->html.'</td>';
- if ($last > $pagesize || !$withtotal)
- $linepage.='<td style="text-align:'.$fd->align.';">'.$fd->my_display($osprs[$numfields[$fd->field]->ffa])->html.'</td>';
- else
- $linepage.='<td></td>';
- } else {
- if ($withtotal)
- $linetot.='<td></td>';
- $linepage.='<td></td>';
- }
- }
- if (!$withtotal)
- $linetot = NULL;
- if ($last <= $pagesize && $withtotal)
- $linepage = NULL;
- $sums = array();
- $sums['line_tot'] = $linetot;
- $sums['line_page'] = $linepage;
- if ($tpl != TZR_RETURN_DATA){
- XShell::toScreen2($tpl, 'sums', $sums);
- } else {
- $r['sums']['line_tot'] = $linetot;
- $r['sums']['line_page'] = $linepage;
- }
- }
- /// Sous fonctions de parcours de la selection
- function &_browseUserSelection($oid,&$data){
- if(!$this->object_sec || $this->secure($oid,'display')){
- return $this->xset->rDisplay($oid,array(),true,'','',array('fmoid'=>$this->_moid));
- }
- return false;
- }
- /// Liste des fonctions utilisable sur la selection du module
- function userSelectionActions(){
- $actions=array();
- if($this->secure('','procQuery')){
- $viewtxt=XLabels::getSysLabel('general','view','text');
- $actions['view']='<a href="#" onclick="TZR.SELECTION.viewselected'.$this->_moid.'(); return false;">'.$viewtxt.'</a>';
- }
- if($this->secure('','editSelection')) {
- $editalltxt=XLabels::getSysLabel('xmodtable','editselection','text');
- $actions['editselection']='<a href="#" onclick="TZR.SELECTION.applyToInContentDiv('.$this->_moid.',\'editSelection\',false,{template:\'xmodtable/editSelection.html\',tplentry:\'br\'}); return false;">'.$editalltxt.'</a>';
- }
- if($this->secure('','del')) {
- $deltxt=XLabels::getSysLabel('general','delete','text');
- $actions['del']='<a href="#" onclick="TZR.SELECTION.applyTo('.$this->_moid.',\'del\',null,null,TZR.confirmDelete); return false;">'.$deltxt.'</a>';
- }
- if($this->secure('','sendACopyTo')){
- $sendtxt=XLabels::getSysLabel('xmodule','sendacopyto','text');
- $actions['sendacopy']='<a href="#" onclick="TZR.SELECTION.applyToInContentDiv('.$this->_moid.',\'sendACopyTo\',false,{template:\'xmodule/sendacopyto.html\'}); return false;">'.$sendtxt.'</a>';
- }
- if($this->secure('','export')) {
- $exportselectiontext = XLabels::getSysLabel('xmodtable','exportselection','text');
- $actions['exportSelection'] = '<a href="#" onclick="TZR.SELECTION.exportSelection('.$this->_moid.');return false;">'.$exportselectiontext.'</a>';
- }
- if($this->object_sec && $this->secure('','secEditSimple')) {
- $sectxt=XLabels::getSysLabel('general','security','text');
- $actions['secselection']='<a href="#" onclick="TZR.editSec(\''.$GLOBALS['TZR_SESSION_MANAGER']::complete_self(true).'\',\''.$this->_moid.'\',\'\',\'selectionform'.$this->_moid.'\'); return false;">'.$sectxt.'</a>';
- }
- return $actions;
- }
- /// Indexation du module dans le moteur de recherche
- public function _buildSearchIndex(&$searchEngine,$checkbefore=true,$limit=NULL,$cond=NULL){
- $done=0;
- if(!empty($cond)){
- if($cond=='UPD'){
- $last=XDbIni::get('lastindexation_'.$this->_moid,'val');
- if(empty($last)) $last=date('2000-01-01 00:00:00');
- XDbIni::set('lastindexation_'.$this->_moid,date('Y-m-d H:i:s'));
- $cond='UPD>="'.$last.'"';
- }
- $cond=' where '.$cond;
- }else{
- $cond=' where 1';
- }
- $filter=$this->getFilter(true);
- if($filter) $cond.=' AND '.$filter;
- $rs=selectQuery('SELECT * FROM '.$this->table.' '.$cond);
- while($rs && ($ors=$rs->fetch())) {
- XLogs::debug('XModTable'.$this->_moid.'::buildSearchIndex: testing '.$ors['KOID']);
- if($checkbefore && $searchEngine->docExists($ors['KOID'],$this->_moid,NULL)) continue;
- XLogs::debug('XModTable'.$this->_moid.'::buildSearchIndex: adding '.$ors['KOID']);
- $this->addToSearchEngine($searchEngine,$ors['KOID']);
- $done++;
- if($done%30==0){
- XLogs::debug('XModTable'.$this->_moid.'::buildSearchIndex: commit');
- $searchEngine->index->commit();
- }
- if($limit && $done>$limit){
- XLogs::debug('XModTable'.$this->_moid.'::buildSearchIndex: break at '.$done);
- break;
- }
- }
- $searchEngine->commit();
- return true;
- }
- /// Recupere les infos d'un objet par l'affichage du résultat d'une recherche
- public function getSearchResult($oid,$filter=NULL){
- return parent::getSearchResult($oid,$filter);
- }
- /// presentation d'un resultat de recherche dans le module
- public function showSearchResult($oids) {
- $_REQUEST = array(
- 'function' => 'procQuery',
- 'template' => 'xmodtable/browse.html',
- 'moid' => $this->_moid,
- 'tplentry' => 'br',
- 'clearrequest' => 1,
- 'oids' => $oids
- );
- $GLOBALS['XSHELL']->run();
- exit;
- }
- /// Ajout d'une fiche au moteur de recherche : données
- function &getSearchEngineData($oid) {
- // selected fields = published + indexables
- $indexables = $this->xset->getIndexablesFields();
- $publisheds = $this->xset->getPublished(true);
- $selecteds = array_merge($indexables, $publisheds);
- $d=$this->xset->display(array('tplentry'=>TZR_RETURN_DATA,'oid'=>$oid,'tlink'=>true, 'selectedfields'=>$selecteds));
- // filtrer les indexables ?
- $text=getFilesContent($d, $indexables);
- $files = getFilesDetails($d);
- $notice = NULL;
- foreach($indexables as $f){
- if (!$this->xset->desc[$f]->get_published()
- && !($this->xset->desc[$f] instanceof XFileDef)
- && !($this->xset->desc[$f] instanceof XFolderDef)
- ) {
- $notice .= ' '.$d['o'.$f]->toText();
- }
- }
- foreach($files as $afile){
- if (in_array($afile['field'], $indexables)){
- $notice .= ' '.$afile['title'];
- if ($afile['name'] != $afile['title'])
- $notice .= ' '.$afile['name'];
- }
- }
- $fields = array('title'=>$d['tlink'], 'notice'=>$notice, 'contents'=>&$text);
- return $fields;
- }
- /// Ajout d'une fiche au moteur de recherche
- function addToSearchEngine(&$searchEngine,$oid) {
- $fields = $this->getSearchEngineData($oid);
- $searchEngine->addItem($oid,$fields,$this->_moid, NULL);
- unset($fields);
- XLogs::notice(get_class($this),get_class($this).'::addToSearchEngine lucene');
- }
- /// Action effectuée à chaque suppression d'un oid de la base
- function _removeRegisteredOid($oid) {
- // Suppression du moteur de recherche
- if($this->insearchengine && Kernel::getTable($oid)==$this->table){
- $se=&XSearch::objectFactory();
- $se->deleteItem($oid,$this->_moid);
- }
- }
- ////////////////////////////////////
- // FONCTIONS INTERFACE XCAL //
- ////////////////////////////////////
- /// Retourne la liste des champs pouvant servir à la consolidation
- function XCalParamsConsolidation($ar){
- $ar1=$ar2=array();
- $p=new XParam($ar,array());
- $tplentry=$p->get('tplentry');
- $datefields=$this->xset->getFieldsList(array('XDateDef','XDateTimeDef','XTimestampDef'));
- $stextfields=$this->xset->getFieldsList(array('XShortTextDef','XLinkDef'));
- $textfields=$this->xset->getFieldsList();
- foreach($datefields as $opt){
- $info=$this->xset->getField($opt);
- $ar1[$opt]=$info->label;
- }
- foreach($stextfields as $opt){
- $info=$this->xset->getField($opt);
- $ar2[$opt]=$info->label;
- }
- foreach($textfields as $opt){
- $info=$this->xset->getField($opt);
- $ar3[$opt]=$info->label;
- }
- XShell::toScreen2($tplentry,'date',$ar1);
- XShell::toScreen2($tplentry,'stexte',$ar2);
- XShell::toScreen2($tplentry,'texte',$ar3);
- }
- function XCalGetConsolidationQuery(&$diary,$params,$fields,$begin,$end,$type='all'){
- $vals=array('visib'=>'PU','DKOID'=>$this->_moid,'DNAME'=>$this->modulename);
- if($this->xset->desc[$params['begin']]->ftype=="XDateDef" || $this->xset->desc[$params['end']]->ftype=="XDateDef"){
- if($type=='event') return NULL;
- $vals['allday']=1;
- }else{
- $datetime=true;
- if($type=='event'){
- $vals['allday']=0;
- $begin=date('Y-m-d H:i:s',strtotime($begin.' GMT'));
- $end=date('Y-m-d H:i:s',strtotime($end.' GMT'));
- }elseif($type=='note'){
- $vals['allday']=1;
- }
- }
- $filter=$this->getFilter(true);
- if(!empty($filter)) $filter=' AND '.$filter;
- $filter.=' AND (date_format('.$params['begin'].',"%Y-%m-%d %H:%i:%s") BETWEEN "'.$begin.'" AND "'.$end.'" OR '.
- '"'.$begin.'" BETWEEN date_format('.$params['begin'].',"%Y-%m-%d %H:%i:%s") AND '.
- 'date_format('.$params['end'].',"%Y-%m-%d %H:%i:%s"))';
- if($datetime){
- if($type=='event'){
- $filter.=' AND (date_format('.$params['begin'].',"%H:%i")!="00:00" OR date_format('.$params['end'].',"%H:%i")!="00:00")';
- }elseif($type=='note'){
- $filter.=' AND date_format('.$params['begin'].',"%H:%i")="00:00" AND date_format('.$params['end'].',"%H:%i")="00:00"';
- }
- }
- $rq=$this->xset->select_query(array('local'=>true,'getselectonly'=>true)).$filter;
- if($this->object_sec){
- $oids=$this->xset->browseOids(array('select'=>$rq,'local'=>true));
- $lang_data=XShell::getLangData();
- $oidsrights=$GLOBALS['XUSER']->getObjectsAccess($this,$lang_data,$oids);
- foreach($oidsrights as $i=>$rights) {
- if(!array_key_exists('ro',$rights)) unset($oids[$i]);
- }
- $rq.=' AND KOID IN("'.implode('","',$oid).'")';
- }
- $select='select KOID,LANG';
- foreach($fields as $f){
- if($f=='begin' || $f=='end'){
- if($vals['allday']!=1) $select.=',convert_tz(date_format('.$params[$f].',"%Y-%m-%d %H:%i:%s"),"'.date("P").'","+00:00") as '.$f;
- else $select.=',date_format('.$params[$f].',"%Y-%m-%d %H:%i:%s") as '.$f;
- }
- elseif(isset($vals[$f])) $select.=',"'.$vals[$f].'" as '.$f;
- elseif(!empty($params[$f])) $select.=','.$params[$f].' as '.$f;
- else $select.=', NULL as '.$f;
- }
- $select.=',"'.$this->_moid.'" as MOID';
- $rq=preg_replace('/select .+ from /i',$select.' from ',$rq);
- return $rq;
- }
- function XCalGetUrl($type){
- if($type=='display') return $GLOBALS['TZR_SESSION_MANAGER']::complete_self().'moid='.$this->_moid.'&oid=%s&function=display&tplentry=br&template=xmodtable/view.html';
- else return $GLOBALS['TZR_SESSION_MANAGER']::complete_self().'moid='.$this->_moid.'&function=browse&tplentry=br&template=xmodtable/browse.html';
- }
- function XCalRDisplay($oid,$params){
- $opts['selectedfields']=array_values($params);
- $d=$this->xset->rDisplay($oid,array(),false,'','',$opts);
- foreach($params as $evf=>$f){
- if(isset($d['o'.$f])){
- $d['o'.$evf]=&$d['o'.$f];
- }
- }
- return $d;
- }
- /// Rend les documents qui n'ont jamais été consultés
- function getUnread($ar=NULL){
- $p=new XParam($ar,array('nb'=>20));
- $tplentry=$p->get('tplentry');
- $docs=array();
- $rs=selectQuery('select '.$this->table.'.* from '.$this->table.' left outer join LOGS on '.$this->table.'.KOID=LOGS.object and LOGS.etype="access" and LOGS.user="'.XUser::get_current_user_uid().'" and LOGS.UPD>'.$this->table.'.UPD where LOGS.KOID is null order by '.$this->table.'.UPD');
- while($rs && $ors=$rs->fetch()){
- $oid=$ors['KOID'];
- if(!$this->secure($oid,'display')) continue;
- $docs[]=$this->xset->rDisplay($oid,array(),false,'','');
- }
- return XShell::toScreen2($tplentry,'docs',$docs);
- }
- /// Marque des documents comme lu
- function markAsRead($ar=NULL){
- Kernel::getSelectedOids($ar);
- foreach($oids as $i=>$oid){
- XLogs::uniqueUpdate('access',$oid);
- }
- }
- /// Recupere des infos sur le module
- function getInfos($ar=NULL){
- $p=new XParam($ar,array('tplentry'=>TZR_RETURN_DATA));
- $tplentry=$p->get('tplentry');
- $ar['tplentry']=TZR_RETURN_DATA;
- $ret=parent::getInfos($ar);
- // Nombre d'enregistrement dans la table
- $filter=$this->getFilter(true,$ar);
- $ret['infos']['cnt']=(object)array('label'=>XLabels::getSysLabel('xmodtable','records','text'),
- 'html'=>countSelectQuery('select count(distinct KOID) from '.$this->table.($filter?' where '.$filter:'')));
- // Place occupé sur le disque par les data : Appliquer le filtre au calcul...
- $s=XDbIni::get('xmodadmin:workspacesize_'.$this->table,'val');
- $ret['infos']['size']->label=XLabels::getSysLabel('xmodule','workspace','text');
- if($s!==NULL) $ret['infos']['size']->html=getStringBytes($s*1024);
- else $ret['infos']['size']->html=XLabels::getSysLabel('xmodule','infonotcalculate','text');
- return XShell::toScreen1($tplentry,$ret);
- }
- ////////////////////////////////////
- // FONCTIONS D'ADMINISTRATION //
- ////////////////////////////////////
- /// Liste des champs d'une table du module
- public function adminBrowseFields($ar=NULL) {
- $p=new XParam($ar, array());
- $tplentry=$p->get('tplentry');
- $r1=$this->xset->browseFields($ar);
- $tablesec=array();
- $this->anyFieldsSec($tablesec);
- $r1['tableSec']=$tablesec;
- XShell::toScreen1($tplentry, $r1);
- }
- /// Imprime la liste des champs d'une table
- public function adminPrint($ar=NULL) {
- $p = new XParam($ar, array());
- $tplentry=$p->get('tplentry');
- $r1=$this->xset->browseFields($ar);
- XShell::toScreen1($tplentry, $r1);
- }
- /// Ecran de generation d'un nouveau champ
- public function adminNewField($ar=NULL) {
- $p=new XParam($ar,NULL);
- $tplentry=$p->get('tplentry');
- $r1=$this->xset->newField($ar);
- XShell::toScreen1($tplentry,$r1);
- }
- /// Créér un nouveau champ
- public function adminProcNewField($ar=NULL) {
- $p=new XParam($ar,NULL);
- $tplentry=$p->get('tplentry');
- $r1=$this->xset->procNewField($ar);
- XShell::toScreen1($tplentry, $r1);
- }
- /// Ecran edition d'un champ
- public function adminEditField($ar=NULL) {
- $p=new XParam($ar,NULL);
- $tplentry=$p->get('tplentry');
- $r1=$this->xset->editField($ar);
- XShell::toScreen1($tplentry,$r1);
- }
- /// Enregistre les modification sur un champ
- public function adminProcEditField($ar=NULL) {
- $p=new XParam($ar,NULL);
- $tplentry=$p->get('tplentry');
- $r1=$this->xset->procEditField($ar);
- XShell::toScreen1($tplentry,$r1);
- }
- /// Edition des champs multiple à partir du browse
- public function adminProcEditFields($ar=NULL) {
- $p=new XParam($ar,NULL);
- $tplentry=$p->get('tplentry');
- $r1=$this->xset->procEditFields($ar);
- XShell::toScreen1($tplentry,$r1);
- }
- /// Supprime un champ
- public function adminDelField($ar=NULL) {
- $p=new XParam($ar,NULL);
- $tplentry=$p->get('tplentry');
- $r1=$this->xset->delField($ar);
- XShell::toScreen1($tplentry,$r1);
- }
- /// Vide la table
- public function adminClear($ar=NULL){
- $p=new XParam($ar,NULL);
- $tplentry=$p->get('tplentry');
- $ret=$this->xset->clear(array('tplentry'=>TZR_RETURN_DATA));
- if(XShell::hasNext()) setSessionVar('message',$ret['message']);
- return XShell::toScreen1($tplentry,$ret);
- }
- /// Prepare la duplication d'une source
- public function adminDuplicate($ar=NULL){
- $p=new XParam($ar,NULL);
- $tplentry=$p->get('tplentry');
- $ret=$this->xset->duplicateDataSource($ar);
- return XShell::toScreen1($tplentry, $ret);
- }
- /// Duplique une table du module
- public function adminProcDuplicate($ar=NULL){
- $p=new XParam($ar,NULL);
- $tplentry=$p->get('tplentry');
- $ret=$this->xset->procDuplicateDataSource($ar);
- if(XShell::hasNext()) setSessionVar('message',$ret['message']);
- return XShell::toScreen1($tplentry, $ret);
- }
- /// Check/repare une table du module
- public function adminChk($ar=NULL){
- $p=new XParam($ar,NULL);
- $tplentry=$p->get('tplentry');
- $ret=$this->xset->chk($ar);
- if(XShell::hasNext()) setSessionVar('message',$ret['message']);
- return XShell::toScreen1($tplentry, $ret);
- }
- /// Prepare l'edition des propriétés d'une source du module
- public function adminEditSourceProperties($ar=NULL){
- $p=new XParam($ar,NULL);
- $tplentry=$p->get('tplentry');
- $ret=$this->xset->editProperties($ar);
- return XShell::toScreen1($tplentry, $ret);
- }
- /// Enregistre les modifications des propriétés d'une source du module
- public function adminProcEditSourceProperties($ar=NULL){
- $p=new XParam($ar,NULL);
- $tplentry=$p->get('tplentry');
- $ret=$this->xset->procEditProperties($ar);
- return XShell::toScreen1($tplentry, $ret);
- }
- /// Parcours les valeurs d'un XStringSetDef
- public function adminBrowseStrings($ar=NULL) {
- $p=new XParam($ar,NULL);
- $tset=new XTSet(array('boid'=>$this->boid,'field'=>$field));
- $tset->browse($ar);
- }
- /// Prepare l'ajout d'une valeur à un XStringSetDef
- public function adminNewString($ar=NULL) {
- $p=new XParam($ar,NULL);
- $tset=new XTSet(array('boid'=>$this->boid,'_options'=>array('local'=>true)));
- $tset->newString($ar);
- }
- /// Ajout d'une valeur à un XStringSetDe
- public function adminProcNewString($ar=NULL) {
- $p=new XParam($ar,NULL);
- $tset=new XTSet(array('boid'=>$this->boid,'_options'=>array('local'=>true)));
- $tset->procNewString($ar);
- if($ret['error']) setSessionVar('message',$ret['message']);
- }
- /// Prepare l'edition d'une valeur d'un XStringSetDef
- public function adminEditString($ar=NULL) {
- $p=new XParam($ar,NULL);
- $tset=new XTSet(array('boid'=>$this->boid,'_options'=>array('local'=>true)));
- $tset->editString($ar);
- }
- /// Enregistre les modification d'une valeur d'un XStringSetDef
- public function adminProcEditString($ar=NULL) {
- $p=new XParam($ar,NULL);
- $tset=new XTSet(array('boid'=>$this->boid,'_options'=>array('local'=>true)));
- $ret=$tset->procEditString($ar);
- if($ret['error']) setSessionVar('message',$ret['message']);
- }
- /// Supprime une valeur d'un XStringSetDef
- public function adminDelString($ar=NULL) {
- $p=new XParam($ar,NULL);
- $tset=new XTSet(array('boid'=>$this->boid,'_options'=>array('local'=>true)));
- $tset->delString($ar);
- }
- /// Supprime toutes les valeurs d'un XStringSetDef
- public function adminClearStrings($ar=NULL) {
- $p=new XParam($ar,NULL);
- $tset=new XTSet(array('boid'=>$this->boid,'_options'=>array('local'=>true)));
- $tset->clearStrings($ar);
- }
- /// Reoordonne les valeurs d'un XStringSetDef par ordre alphabétique
- public function adminSortStrings($ar=NULL) {
- $p=new XParam($ar,NULL);
- $boid=$p->get('boid');
- $tset=new XTSet(array('boid'=>$this->boid,'_options'=>array('local'=>true)));
- $tset->sortStrings($ar);
- }
- /// Réinitialise un chrono
- public function adminResetChrono($ar=NULL){
- $p=new XParam($ar, array());
- $table=$this->table;
- $field=$p->get('field');
- XDBIni::clear('Chrono::'.$table.'::'.$field);
- }
- /// Prepare l'importation d'un csv contenant les regles de securité sur les champs
- public function adminPreImportFieldsSec($ar=NULL){
- }
- /// Importe d'un csv contenant les regles de securité sur les champs
- /// Colonne en entete : AKOID => nom sql du champ, AFUNCTION => niveau de droit, AGRP => uid ou gid ou chaine de ugrpnames (voir param)
- public function adminImportFieldsSec($ar=NULL){
- $p=new XParam($ar,array('delallfields'=>0,'delotherfields'=>0,'file'=>$_FILES['file']['tmp_name'],
- 'endofline'=>"\r\n",'separator'=>';','quote'=>"\"",
- 'ugrpnames'=>array('AUTH'=>TZR_GROUPID_AUTH,'ALL'=>TZR_USERID_NOBODY)));
- $ugrpnames=$p->get('ugrpnames');
- $delbefore=$p->get('delbefore');
- if(!empty($delbefore)){
- updateQuery('delete from ACL4 where AMOID="'.$this->_moid.'" and AKOID like "_field-%"');
- XLogs::update('security', XUser::get_current_user_uid(), 'Delete all fields security rules for '.$this->_moid);
- }
- $file=$p->get('file');
- $message='';
- $spec->general->endofline=$p->get('endofline');
- $spec->general->separator=$p->get('separator');
- $spec->general->quote=$p->get('quote');
- $rawdata=@file_get_contents($file);
- $data=_getCSVData($rawdata,$spec);
- $head=$data[0];
- $l=count($data);
- $tot=0;
- for($i=1;$i<$l;$i++){
- $row=array();
- foreach($head as $j=>$h){
- if($data[$i][$j]==='') continue;
- $pos=strpos($h,'[');
- if($pos) $tmp='['.substr($h,0,$pos).']'.substr($h,$pos);
- else $tmp='['.$h.']';
- $tmp=str_replace(array('[',']'),array("['","']"),$tmp);
- $data[$i][$j]=addslashes($data[$i][$j]);
- eval('$row'.$tmp.'="'.str_replace('"','\"',$data[$i][$j]).'";');
- }
- if(empty($row['AKOID']) || empty($row['AFUNCTION']) || empty($row['AGRP'])){
- $message.='AKOID, AFUNCTION ou AGRP manquant ligne '.($i+1).'<br>';
- continue;
- }
- if(empty($this->xset->desc[$row['AKOID']])){
- $message.='Le champ '.$row['AKOID'].' n\'existe pas à la ligne '.($i+1).'<br>';
- continue;
- }
- if(!in_array($row['AFUNCTION'],array('none','ro','rw'))){
- $message.='Les droits doivent être none, ro ou rw à la ligne '.($i+1).'<br>';
- continue;
- }
- if(!empty($ugrpnames[$row['AGRP']])) $row['AGRP']=$ugrpnames[$row['AGRP']];
- if(in_array(Kernel::getTable($row['AGRP']),array('USERS','GRP'))){
- $rs=selectQuery('select KOID from '.Kernel::getTable($row['AGRP']).' where KOID="'.$row['AGRP'].'"');
- if($rs->rowCount()!=1){
- $message.='La cible des droits n\'existe pas à la ligne '.($i+1).'<br>';
- continue;
- }
- }else{
- $message.='La cible des droits n\'est ni un USERS ni un GRP à la ligne '.($i+1).'<br>';
- continue;
- }
- $tot++;
- $this->procSecEdit(array('oid'=>'_field-'.$row['AKOID'],'level'=>$row['AFUNCTION'],'uid'=>$row['AGRP']));
- }
- $message.='Nombre de règle importée : '.$tot.'<br>';
- XShell::toScreen2('','message',$message);
- }
- }
- /// Verifie la validité d'un captcha
- function xmodtable_captcha(){
- $value=$_REQUEST['value'];
- $id=$_REQUEST['id'];
- if(!preg_match('/^[a-z0-9A-Z]+$/', $value)) die('0');
- if(!preg_match('/^[a-z0-9A-Z]+$/', $id)) die('0');
- $cnt=countSelectQuery('SELECT COUNT(*) from _VARS where name="CAPTCHA_'.$id.'" and value="'.md5($value).'"');
- if($cnt) die('1');
- else die('0');
- }