2021-10-24 01:38:13 +02:00
< ? php
/* Copyright ( C ) 2021 John BOTELLA < john . botella @ atm - consulting . fr >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < https :// www . gnu . org / licenses />.
*/
/**
* This class help you create setup render
*/
2021-11-02 14:11:36 +01:00
class FormSetup
2021-10-30 12:54:13 +02:00
{
2021-10-24 01:38:13 +02:00
/**
* @ var DoliDB Database handler .
*/
public $db ;
2021-11-02 14:11:36 +01:00
/** @var FormSetupItem[] */
2021-11-02 14:07:36 +01:00
public $items = array ();
2021-10-24 01:38:13 +02:00
2021-11-02 13:55:12 +01:00
/**
* @ var int
*/
2021-10-24 01:38:13 +02:00
public $setupNotEmpty = 0 ;
/** @var Translate */
public $langs ;
/** @var Form */
public $form ;
2021-11-02 13:55:12 +01:00
/** @var int */
protected $maxItemRank ;
2021-11-28 12:11:03 +01:00
/**
2021-12-14 12:12:54 +01:00
* this is an html string display before output form
2021-11-28 12:11:03 +01:00
* @ var string
*/
public $htmlBeforeOutputForm = '' ;
/**
* this is an html string display after output form
* @ var string
*/
public $htmlAfterOutputForm = '' ;
/**
* this is an html string display on buttons zone
* @ var string
*/
public $htmlOutputMoreButton = '' ;
/**
*
* @ var array
*/
public $formAttributes = array (
'action' => '' , // set in __construct
'method' => 'POST'
);
/**
* an list of hidden inputs used only in edit mode
* @ var array
*/
public $formHiddenInputs = array ();
2023-08-24 11:29:29 +02:00
/**
* @ var string [] $errors
*/
public $errors = array ();
2021-11-28 12:11:03 +01:00
2021-10-24 01:38:13 +02:00
/**
* Constructor
*
2021-10-30 12:54:13 +02:00
* @ param DoliDB $db Database handler
* @ param Translate $outputLangs if needed can use another lang
2021-10-24 01:38:13 +02:00
*/
2023-11-21 23:16:46 +01:00
public function __construct ( $db , $outputLangs = null )
2021-10-24 01:38:13 +02:00
{
global $langs ;
$this -> db = $db ;
2023-10-15 15:32:35 +02:00
2021-10-24 01:38:13 +02:00
$this -> form = new Form ( $this -> db );
2021-11-28 12:11:03 +01:00
$this -> formAttributes [ 'action' ] = $_SERVER [ " PHP_SELF " ];
$this -> formHiddenInputs [ 'token' ] = newToken ();
$this -> formHiddenInputs [ 'action' ] = 'update' ;
2021-10-30 12:54:13 +02:00
if ( $outputLangs ) {
2021-10-24 01:38:13 +02:00
$this -> langs = $outputLangs ;
2021-10-30 12:54:13 +02:00
} else {
2021-10-24 01:38:13 +02:00
$this -> langs = $langs ;
}
}
2021-11-28 12:11:03 +01:00
/**
2021-11-28 12:15:31 +01:00
* Generate an attributes string form an input array
2021-12-21 14:58:34 +01:00
*
* @ param array $attributes an array of attributes keys and values ,
* @ return string attribute string
2021-11-28 12:11:03 +01:00
*/
2023-12-04 12:04:36 +01:00
public static function generateAttributesStringFromArray ( $attributes )
2021-11-28 12:11:03 +01:00
{
$Aattr = array ();
if ( is_array ( $attributes )) {
foreach ( $attributes as $attribute => $value ) {
if ( is_array ( $value ) || is_object ( $value )) {
continue ;
}
2021-12-01 16:59:30 +01:00
$Aattr [] = $attribute . '="' . dol_escape_htmltag ( $value ) . '"' ;
2021-11-28 12:11:03 +01:00
}
}
2023-12-04 12:04:36 +01:00
return ! empty ( $Aattr ) ? implode ( ' ' , $Aattr ) : '' ;
2021-11-28 12:11:03 +01:00
}
2021-10-24 01:38:13 +02:00
/**
2021-12-21 14:58:34 +01:00
* generateOutput
*
* @ param bool $editMode true will display output on edit mod
* @ return string html output
2021-10-24 01:38:13 +02:00
*/
2021-10-30 12:54:13 +02:00
public function generateOutput ( $editMode = false )
{
2022-05-11 18:05:06 +02:00
global $hookmanager , $action , $langs ;
2021-10-24 01:38:13 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/class/html.form.class.php' ;
2021-11-02 13:55:12 +01:00
$parameters = array (
'editMode' => $editMode
);
$reshook = $hookmanager -> executeHooks ( 'formSetupBeforeGenerateOutput' , $parameters , $this , $action ); // Note that $action and $object may have been modified by some hooks
if ( $reshook < 0 ) {
setEventMessages ( $hookmanager -> error , $hookmanager -> errors , 'errors' );
}
if ( $reshook > 0 ) {
return $hookmanager -> resPrint ;
} else {
2021-11-28 12:11:03 +01:00
$out = '<!-- Start generateOutput from FormSetup class -->' ;
$out .= $this -> htmlBeforeOutputForm ;
if ( $editMode ) {
$out .= '<form ' . self :: generateAttributesStringFromArray ( $this -> formAttributes ) . ' >' ;
// generate hidden values from $this->formHiddenInputs
if ( ! empty ( $this -> formHiddenInputs ) && is_array ( $this -> formHiddenInputs )) {
foreach ( $this -> formHiddenInputs as $hiddenKey => $hiddenValue ) {
2021-12-01 16:59:30 +01:00
$out .= '<input type="hidden" name="' . dol_escape_htmltag ( $hiddenKey ) . '" value="' . dol_escape_htmltag ( $hiddenValue ) . '">' ;
2021-11-28 12:11:03 +01:00
}
}
}
// generate output table
$out .= $this -> generateTableOutput ( $editMode );
$reshook = $hookmanager -> executeHooks ( 'formSetupBeforeGenerateOutputButton' , $parameters , $this , $action ); // Note that $action and $object may have been modified by some hooks
if ( $reshook < 0 ) {
setEventMessages ( $hookmanager -> error , $hookmanager -> errors , 'errors' );
}
if ( $reshook > 0 ) {
return $hookmanager -> resPrint ;
} elseif ( $editMode ) {
$out .= '<br>' ; // Todo : remove this <br/> by adding style to form-setup-button-container css class in all themes
$out .= '<div class="form-setup-button-container center">' ; // Todo : remove .center by adding style to form-setup-button-container css class in all themes
$out .= $this -> htmlOutputMoreButton ;
$out .= '<input class="button button-save" type="submit" value="' . $this -> langs -> trans ( " Save " ) . '">' ; // Todo fix dolibarr style for <button and use <button instead of input
2022-05-11 18:05:06 +02:00
$out .= ' ' ;
$out .= '<a class="button button-cancel" type="submit" href="' . $this -> formAttributes [ 'action' ] . '">' . $langs -> trans ( 'Cancel' ) . '</a>' ;
2021-11-28 12:11:03 +01:00
$out .= '</div>' ;
}
2021-11-02 13:55:12 +01:00
if ( $editMode ) {
2021-11-28 12:11:03 +01:00
$out .= '</form>' ;
2021-11-02 13:55:12 +01:00
}
2021-11-28 12:11:03 +01:00
$out .= $this -> htmlAfterOutputForm ;
return $out ;
}
}
/**
2021-12-21 14:58:34 +01:00
* generateTableOutput
*
* @ param bool $editMode true will display output on edit mod
* @ return string html output
2021-11-28 12:11:03 +01:00
*/
public function generateTableOutput ( $editMode = false )
{
global $hookmanager , $action ;
require_once DOL_DOCUMENT_ROOT . '/core/class/html.form.class.php' ;
$parameters = array (
'editMode' => $editMode
);
$reshook = $hookmanager -> executeHooks ( 'formSetupBeforeGenerateTableOutput' , $parameters , $this , $action ); // Note that $action and $object may have been modified by some hooks
if ( $reshook < 0 ) {
setEventMessages ( $hookmanager -> error , $hookmanager -> errors , 'errors' );
}
if ( $reshook > 0 ) {
return $hookmanager -> resPrint ;
} else {
$out = '<table class="noborder centpercent">' ;
2021-11-02 13:55:12 +01:00
$out .= '<thead>' ;
$out .= '<tr class="liste_titre">' ;
2022-01-09 10:24:28 +01:00
$out .= ' <td>' . $this -> langs -> trans ( " Parameter " ) . '</td>' ;
2021-11-02 13:55:12 +01:00
$out .= ' <td>' . $this -> langs -> trans ( " Value " ) . '</td>' ;
$out .= '</tr>' ;
$out .= '</thead>' ;
// Sort items before render
$this -> sortingItems ();
$out .= '<tbody>' ;
2021-11-02 14:07:36 +01:00
foreach ( $this -> items as $item ) {
2021-11-02 13:55:12 +01:00
$out .= $this -> generateLineOutput ( $item , $editMode );
}
$out .= '</tbody>' ;
$out .= '</table>' ;
return $out ;
2021-10-30 12:54:13 +02:00
}
2021-11-02 13:55:12 +01:00
}
2021-10-30 12:54:13 +02:00
2021-11-02 13:55:12 +01:00
/**
2021-12-21 14:58:34 +01:00
* saveConfFromPost
*
* @ param bool $noMessageInUpdate display event message on errors and success
2022-05-20 22:34:44 +02:00
* @ return int - 1 if KO , 1 if OK
2021-11-02 13:55:12 +01:00
*/
public function saveConfFromPost ( $noMessageInUpdate = false )
{
2023-06-16 01:36:46 +02:00
global $hookmanager , $conf ;
2022-05-20 22:34:44 +02:00
$parameters = array ();
$reshook = $hookmanager -> executeHooks ( 'formSetupBeforeSaveConfFromPost' , $parameters , $this ); // Note that $action and $object may have been modified by some hooks
if ( $reshook < 0 ) {
2023-08-24 11:29:29 +02:00
$this -> errors = $hookmanager -> errors ;
2022-05-20 22:34:44 +02:00
return - 1 ;
}
if ( $reshook > 0 ) {
return $reshook ;
}
2021-11-02 14:07:36 +01:00
if ( empty ( $this -> items )) {
2021-11-02 13:55:12 +01:00
return null ;
}
$this -> db -> begin ();
$error = 0 ;
2021-11-02 14:07:36 +01:00
foreach ( $this -> items as $item ) {
2023-06-09 00:06:07 +02:00
if ( $item -> getType () == 'yesno' && ! empty ( $conf -> use_javascript_ajax )) {
continue ;
}
2021-11-02 13:55:12 +01:00
$res = $item -> setValueFromPost ();
if ( $res > 0 ) {
$item -> saveConfValue ();
} elseif ( $res < 0 ) {
$error ++ ;
break ;
}
2021-10-24 01:38:13 +02:00
}
2021-11-02 13:55:12 +01:00
if ( ! $error ) {
$this -> db -> commit ();
if ( empty ( $noMessageInUpdate )) {
setEventMessages ( $this -> langs -> trans ( " SetupSaved " ), null );
}
2022-05-20 22:34:44 +02:00
return 1 ;
2021-11-02 13:55:12 +01:00
} else {
$this -> db -> rollback ();
if ( empty ( $noMessageInUpdate )) {
setEventMessages ( $this -> langs -> trans ( " SetupNotSaved " ), null , 'errors' );
}
2022-05-20 22:34:44 +02:00
return - 1 ;
2021-11-02 13:55:12 +01:00
}
2021-10-24 01:38:13 +02:00
}
/**
2021-12-21 14:58:34 +01:00
* generateLineOutput
*
* @ param FormSetupItem $item the setup item
* @ param bool $editMode Display as edit mod
* @ return string the html output for an setup item
2021-10-24 01:38:13 +02:00
*/
2021-10-30 12:54:13 +02:00
public function generateLineOutput ( $item , $editMode = false )
{
2021-10-24 01:38:13 +02:00
$out = '' ;
if ( $item -> enabled == 1 ) {
2022-05-11 18:05:06 +02:00
$trClass = 'oddeven' ;
if ( $item -> getType () == 'title' ) {
$trClass = 'liste_titre' ;
}
2021-10-24 01:38:13 +02:00
$this -> setupNotEmpty ++ ;
2022-05-11 18:05:06 +02:00
$out .= '<tr class="' . $trClass . '">' ;
2021-10-24 01:38:13 +02:00
$out .= '<td class="col-setup-title">' ;
$out .= '<span id="helplink' . $item -> confKey . '" class="spanforparamtooltip">' ;
$out .= $this -> form -> textwithpicto ( $item -> getNameText (), $item -> getHelpText (), 1 , 'info' , '' , 0 , 3 , 'tootips' . $item -> confKey );
$out .= '</span>' ;
$out .= '</td>' ;
$out .= '<td>' ;
2021-10-30 12:54:13 +02:00
if ( $editMode ) {
2021-10-24 02:09:49 +02:00
$out .= $item -> generateInputField ();
2021-10-30 12:54:13 +02:00
} else {
2021-10-24 02:09:49 +02:00
$out .= $item -> generateOutputField ();
2021-10-24 01:38:13 +02:00
}
2021-10-30 12:54:13 +02:00
if ( ! empty ( $item -> errors )) {
2021-10-24 01:38:13 +02:00
// TODO : move set event message in a methode to be called by cards not by this class
setEventMessages ( null , $item -> errors , 'errors' );
}
$out .= '</td>' ;
$out .= '</tr>' ;
}
return $out ;
}
/**
2021-12-21 14:58:34 +01:00
* Method used to test module builder convertion to this form usage
*
2023-01-06 19:24:57 +01:00
* @ param array $params an array of arrays of params from old modulBuilder params
2023-03-19 10:19:35 +01:00
* @ return boolean
2021-10-24 01:38:13 +02:00
*/
2021-10-30 12:54:13 +02:00
public function addItemsFromParamsArray ( $params )
{
2023-12-04 12:04:36 +01:00
if ( ! is_array ( $params ) || empty ( $params )) {
return false ;
}
2021-10-30 12:54:13 +02:00
foreach ( $params as $confKey => $param ) {
2021-10-24 01:38:13 +02:00
$this -> addItemFromParams ( $confKey , $param ); // todo manage error
}
2023-03-19 10:19:35 +01:00
return true ;
2021-10-24 01:38:13 +02:00
}
/**
* From old
2021-12-21 14:58:34 +01:00
* Method was used to test module builder convertion to this form usage .
*
* @ param string $confKey the conf name to store
* @ param array $params an array of params from old modulBuilder params
* @ return bool
2021-10-24 01:38:13 +02:00
*/
2021-10-30 12:54:13 +02:00
public function addItemFromParams ( $confKey , $params )
{
2023-12-04 12:04:36 +01:00
if ( empty ( $confKey ) || empty ( $params [ 'type' ])) {
return false ;
}
2021-10-24 01:38:13 +02:00
/*
* Exemple from old module builder setup page
* // 'MYMODULE_MYPARAM1'=>array('type'=>'string', 'css'=>'minwidth500' ,'enabled'=>1),
// 'MYMODULE_MYPARAM2'=>array('type'=>'textarea','enabled'=>1),
//'MYMODULE_MYPARAM3'=>array('type'=>'category:'.Categorie::TYPE_CUSTOMER, 'enabled'=>1),
//'MYMODULE_MYPARAM4'=>array('type'=>'emailtemplate:thirdparty', 'enabled'=>1),
//'MYMODULE_MYPARAM5'=>array('type'=>'yesno', 'enabled'=>1),
//'MYMODULE_MYPARAM5'=>array('type'=>'thirdparty_type', 'enabled'=>1),
//'MYMODULE_MYPARAM6'=>array('type'=>'securekey', 'enabled'=>1),
//'MYMODULE_MYPARAM7'=>array('type'=>'product', 'enabled'=>1),
*/
2021-11-02 14:11:36 +01:00
$item = new FormSetupItem ( $confKey );
2022-01-09 10:24:28 +01:00
// need to be ignored from scrutinizer setTypeFromTypeString was created as deprecated to incite developper to use object oriented usage
/** @scrutinizer ignore-deprecated */ $item -> setTypeFromTypeString ( $params [ 'type' ]);
2021-10-24 01:38:13 +02:00
2021-10-30 12:54:13 +02:00
if ( ! empty ( $params [ 'enabled' ])) {
2021-10-24 01:38:13 +02:00
$item -> enabled = $params [ 'enabled' ];
}
2021-10-30 12:54:13 +02:00
if ( ! empty ( $params [ 'css' ])) {
2021-10-24 02:09:49 +02:00
$item -> cssClass = $params [ 'css' ];
2021-10-24 01:38:13 +02:00
}
2021-11-02 14:07:36 +01:00
$this -> items [ $item -> confKey ] = $item ;
2021-10-24 01:38:13 +02:00
return true ;
}
2021-10-30 16:36:51 +02:00
/**
2021-12-21 14:58:34 +01:00
* Used to export param array for / core / actions_setmoduleoptions . inc . php template
* Method exists only for manage setup convertion
*
2021-10-30 16:36:51 +02:00
* @ return array $arrayofparameters for / core / actions_setmoduleoptions . inc . php
*/
public function exportItemsAsParamsArray ()
{
$arrayofparameters = array ();
2021-11-28 12:11:03 +01:00
foreach ( $this -> items as $item ) {
2021-10-30 16:36:51 +02:00
$arrayofparameters [ $item -> confKey ] = array (
2021-11-01 10:32:37 +01:00
'type' => $item -> getType (),
2021-10-30 16:36:51 +02:00
'enabled' => $item -> enabled
);
}
return $arrayofparameters ;
}
2021-10-30 12:54:13 +02:00
/**
* Reload for each item default conf
* note : this will override custom configuration
2021-12-21 14:58:34 +01:00
*
2021-10-30 12:54:13 +02:00
* @ return bool
*/
public function reloadConfs ()
{
2023-12-04 12:04:36 +01:00
if ( ! array ( $this -> items )) {
return false ;
}
2021-11-02 14:07:36 +01:00
foreach ( $this -> items as $item ) {
2022-05-21 16:35:10 +02:00
$item -> loadValueFromConf ();
2021-10-30 12:54:13 +02:00
}
return true ;
}
/**
* Create a new item
2021-11-02 13:55:12 +01:00
* the tagret is useful with hooks : that allow externals modules to add setup items on good place
2021-12-21 14:58:34 +01:00
*
* @ param string $confKey the conf key used in database
* @ param string $targetItemKey target item used to place the new item beside
* @ param bool $insertAfterTarget insert before or after target item ?
2021-11-02 14:11:36 +01:00
* @ return FormSetupItem the new setup item created
2021-10-30 12:54:13 +02:00
*/
2023-11-21 23:16:46 +01:00
public function newItem ( $confKey , $targetItemKey = '' , $insertAfterTarget = false )
2021-10-30 12:54:13 +02:00
{
2021-11-02 14:11:36 +01:00
$item = new FormSetupItem ( $confKey );
2021-11-02 13:55:12 +01:00
// set item rank if not defined as last item
if ( empty ( $item -> rank )) {
$item -> rank = $this -> getCurentItemMaxRank () + 1 ;
$this -> setItemMaxRank ( $item -> rank ); // set new max rank if needed
}
// try to get rank from target column, this will override item->rank
if ( ! empty ( $targetItemKey )) {
2021-11-02 14:07:36 +01:00
if ( isset ( $this -> items [ $targetItemKey ])) {
$targetItem = $this -> items [ $targetItemKey ];
2021-11-02 13:55:12 +01:00
$item -> rank = $targetItem -> rank ; // $targetItem->rank will be increase after
if ( $targetItem -> rank >= 0 && $insertAfterTarget ) {
$item -> rank ++ ;
}
}
// calc new rank for each item to make place for new item
2021-11-02 14:07:36 +01:00
foreach ( $this -> items as $fItem ) {
2021-11-02 13:55:12 +01:00
if ( $item -> rank <= $fItem -> rank ) {
$fItem -> rank = $fItem -> rank + 1 ;
$this -> setItemMaxRank ( $fItem -> rank ); // set new max rank if needed
}
}
}
2021-11-02 14:07:36 +01:00
$this -> items [ $item -> confKey ] = $item ;
return $this -> items [ $item -> confKey ];
2021-10-30 12:54:13 +02:00
}
2021-11-02 13:55:12 +01:00
/**
* Sort items according to rank
2021-12-21 14:58:34 +01:00
*
2021-11-02 13:55:12 +01:00
* @ return bool
*/
public function sortingItems ()
{
// Sorting
2021-11-02 14:07:36 +01:00
return uasort ( $this -> items , array ( $this , 'itemSort' ));
2021-11-02 13:55:12 +01:00
}
/**
2021-12-21 14:58:34 +01:00
* getCurentItemMaxRank
*
2021-11-02 13:55:12 +01:00
* @ param bool $cache To use cache or not
* @ return int
*/
public function getCurentItemMaxRank ( $cache = true )
{
2021-11-02 14:07:36 +01:00
if ( empty ( $this -> items )) {
2021-11-02 13:55:12 +01:00
return 0 ;
}
if ( $cache && $this -> maxItemRank > 0 ) {
return $this -> maxItemRank ;
}
$this -> maxItemRank = 0 ;
2021-11-02 14:07:36 +01:00
foreach ( $this -> items as $item ) {
2021-11-02 13:55:12 +01:00
$this -> maxItemRank = max ( $this -> maxItemRank , $item -> rank );
}
return $this -> maxItemRank ;
}
/**
* set new max rank if needed
2021-12-21 14:58:34 +01:00
*
* @ param int $rank the item rank
* @ return int | void new max rank
2021-11-02 13:55:12 +01:00
*/
public function setItemMaxRank ( $rank )
{
$this -> maxItemRank = max ( $this -> maxItemRank , $rank );
}
/**
2021-12-21 14:58:34 +01:00
* get item position rank from item key
2021-11-02 13:55:12 +01:00
*
2021-12-21 14:58:34 +01:00
* @ param string $itemKey the item key
* @ return int rank on success and - 1 on error
2021-11-02 13:55:12 +01:00
*/
public function getLineRank ( $itemKey )
{
2021-11-02 14:07:36 +01:00
if ( ! isset ( $this -> items [ $itemKey ] -> rank )) {
2021-11-02 13:55:12 +01:00
return - 1 ;
}
2021-11-02 14:07:36 +01:00
return $this -> items [ $itemKey ] -> rank ;
2021-11-02 13:55:12 +01:00
}
/**
* uasort callback function to Sort params items
*
2021-11-02 14:11:36 +01:00
* @ param FormSetupItem $a formSetup item
* @ param FormSetupItem $b formSetup item
2021-12-21 14:58:34 +01:00
* @ return int Return compare result
2021-11-02 13:55:12 +01:00
*/
2021-11-02 14:11:36 +01:00
public function itemSort ( FormSetupItem $a , FormSetupItem $b )
2021-11-02 13:55:12 +01:00
{
if ( empty ( $a -> rank )) {
$a -> rank = 0 ;
}
if ( empty ( $b -> rank )) {
$b -> rank = 0 ;
}
if ( $a -> rank == $b -> rank ) {
return 0 ;
}
return ( $a -> rank < $b -> rank ) ? - 1 : 1 ;
}
2021-10-30 12:54:13 +02:00
}
2021-10-24 01:38:13 +02:00
2021-10-30 12:54:13 +02:00
/**
* This class help to create item for class formSetup
*/
2021-11-02 14:11:36 +01:00
class FormSetupItem
2021-10-24 01:38:13 +02:00
{
/**
* @ var DoliDB Database handler .
*/
public $db ;
/** @var Translate */
public $langs ;
2021-11-02 13:55:12 +01:00
/** @var int */
public $entity ;
2021-10-24 01:38:13 +02:00
/** @var Form */
public $form ;
/** @var string $confKey the conf key used in database */
public $confKey ;
/** @var string|false $nameText */
public $nameText = false ;
/** @var string $helpText */
public $helpText = '' ;
2022-01-09 10:24:28 +01:00
/** @var string $fieldValue */
2021-10-30 12:54:13 +02:00
public $fieldValue ;
2022-05-21 16:35:10 +02:00
/** @var string $defaultFieldValue */
public $defaultFieldValue = null ;
2022-01-09 10:24:28 +01:00
/** @var array $fieldAttr fields attribute only for compatible fields like input text */
2022-05-21 16:35:10 +02:00
public $fieldAttr = array ();
2022-01-09 10:24:28 +01:00
2021-10-30 12:54:13 +02:00
/** @var bool|string set this var to override field output will override $fieldInputOverride and $fieldOutputOverride too */
2021-10-24 01:38:13 +02:00
public $fieldOverride = false ;
2022-01-09 10:24:28 +01:00
/** @var bool|string set this var to override field input */
2021-10-30 12:54:13 +02:00
public $fieldInputOverride = false ;
/** @var bool|string set this var to override field output */
public $fieldOutputOverride = false ;
2021-11-02 13:55:12 +01:00
/** @var int $rank */
public $rank = 0 ;
2022-05-11 18:05:06 +02:00
/** @var array set this var for options on select and multiselect items */
public $fieldOptions = array ();
/** @var callable $saveCallBack */
public $saveCallBack ;
/** @var callable $setValueFromPostCallBack */
public $setValueFromPostCallBack ;
2021-10-24 01:38:13 +02:00
/**
2023-08-24 11:29:29 +02:00
* @ var string [] $errors
2021-10-24 01:38:13 +02:00
*/
public $errors = array ();
/**
2021-10-30 12:54:13 +02:00
* TODO each type must have setAs { type } method to help configuration
* And set var as protected when its done configuration must be done by method
2022-01-09 10:24:28 +01:00
* this is important for retrocompatibility of futures versions
2021-10-24 01:38:13 +02:00
* @ var string $type 'string' , 'textarea' , 'category:' . Categorie :: TYPE_CUSTOMER ', ' emailtemplate ', ' thirdparty_type '
*/
2021-10-31 09:29:20 +01:00
protected $type = 'string' ;
2021-10-24 01:38:13 +02:00
2021-10-30 12:54:13 +02:00
public $enabled = 1 ;
2021-10-24 01:38:13 +02:00
public $cssClass = '' ;
/**
* Constructor
*
2022-01-09 10:24:28 +01:00
* @ param string $confKey the conf key used in database
2021-10-24 01:38:13 +02:00
*/
public function __construct ( $confKey )
{
2022-01-09 10:24:28 +01:00
global $langs , $db , $conf , $form ;
2021-10-24 01:38:13 +02:00
$this -> db = $db ;
2022-01-09 10:24:28 +01:00
if ( ! empty ( $form ) && is_object ( $form ) && get_class ( $form ) == 'Form' ) { // the form class has a cache inside so I am using it to optimize
$this -> form = $form ;
} else {
$this -> form = new Form ( $this -> db );
}
2021-10-24 01:38:13 +02:00
$this -> langs = $langs ;
2021-11-02 13:55:12 +01:00
$this -> entity = $conf -> entity ;
2021-10-24 01:38:13 +02:00
$this -> confKey = $confKey ;
2022-05-21 16:35:10 +02:00
$this -> loadValueFromConf ();
2021-10-24 01:38:13 +02:00
}
2021-10-30 12:54:13 +02:00
/**
2022-05-21 16:35:10 +02:00
* load conf value from databases
2023-10-15 15:32:35 +02:00
*
2022-05-21 16:35:10 +02:00
* @ return bool
2021-10-30 12:54:13 +02:00
*/
2022-05-21 16:35:10 +02:00
public function loadValueFromConf ()
2021-10-30 12:54:13 +02:00
{
global $conf ;
2022-05-21 16:35:10 +02:00
if ( isset ( $conf -> global -> { $this -> confKey })) {
2022-12-30 18:43:43 +01:00
$this -> fieldValue = getDolGlobalString ( $this -> confKey );
2022-05-21 16:35:10 +02:00
return true ;
} else {
$this -> fieldValue = null ;
return false ;
}
}
/**
* reload conf value from databases is an aliase of loadValueFromConf
2023-10-15 15:32:35 +02:00
*
2022-05-21 16:35:10 +02:00
* @ deprecated
* @ return bool
*/
public function reloadValueFromConf ()
{
return $this -> loadValueFromConf ();
2021-10-30 12:54:13 +02:00
}
2021-11-02 13:55:12 +01:00
/**
* Save const value based on htdocs / core / actions_setmoduleoptions . inc . php
2023-01-06 19:24:57 +01:00
*
* @ return int - 1 if KO , 1 if OK
2021-11-02 13:55:12 +01:00
*/
public function saveConfValue ()
{
2022-05-20 22:34:44 +02:00
global $hookmanager ;
$parameters = array ();
$reshook = $hookmanager -> executeHooks ( 'formSetupBeforeSaveConfValue' , $parameters , $this ); // Note that $action and $object may have been modified by some hooks
if ( $reshook < 0 ) {
$this -> setErrors ( $hookmanager -> errors );
return - 1 ;
}
if ( $reshook > 0 ) {
return $reshook ;
}
2022-05-11 18:05:06 +02:00
if ( ! empty ( $this -> saveCallBack ) && is_callable ( $this -> saveCallBack )) {
2022-05-20 22:05:13 +02:00
return call_user_func ( $this -> saveCallBack , $this );
2022-05-11 18:05:06 +02:00
}
2021-11-02 13:55:12 +01:00
// Modify constant only if key was posted (avoid resetting key to the null value)
if ( $this -> type != 'title' ) {
$result = dolibarr_set_const ( $this -> db , $this -> confKey , $this -> fieldValue , 'chaine' , 0 , '' , $this -> entity );
if ( $result < 0 ) {
return - 1 ;
} else {
return 1 ;
}
}
2023-01-06 19:24:57 +01:00
return 0 ;
2021-11-02 13:55:12 +01:00
}
2022-05-11 18:05:06 +02:00
/**
* Set an override function for saving data
2023-01-06 19:24:57 +01:00
*
2022-05-11 18:05:06 +02:00
* @ param callable $callBack a callable function
* @ return void
*/
public function setSaveCallBack ( callable $callBack )
{
$this -> saveCallBack = $callBack ;
}
/**
* Set an override function for get data from post
2023-10-15 15:32:35 +02:00
*
2022-05-11 18:05:06 +02:00
* @ param callable $callBack a callable function
* @ return void
*/
public function setValueFromPostCallBack ( callable $callBack )
{
$this -> setValueFromPostCallBack = $callBack ;
}
2021-11-02 13:55:12 +01:00
/**
* Save const value based on htdocs / core / actions_setmoduleoptions . inc . php
2023-10-15 15:32:35 +02:00
*
* @ return int - 1 if KO , 0 nothing to do , 1 if OK
2021-11-02 13:55:12 +01:00
*/
public function setValueFromPost ()
{
2022-05-11 18:05:06 +02:00
if ( ! empty ( $this -> setValueFromPostCallBack ) && is_callable ( $this -> setValueFromPostCallBack )) {
return call_user_func ( $this -> setValueFromPostCallBack );
}
2021-11-02 13:55:12 +01:00
// Modify constant only if key was posted (avoid resetting key to the null value)
if ( $this -> type != 'title' ) {
if ( preg_match ( '/category:/' , $this -> type )) {
if ( GETPOST ( $this -> confKey , 'int' ) == '-1' ) {
$val_const = '' ;
} else {
$val_const = GETPOST ( $this -> confKey , 'int' );
}
2022-05-11 18:05:06 +02:00
} elseif ( $this -> type == 'multiselect' ) {
$val = GETPOST ( $this -> confKey , 'array' );
if ( $val && is_array ( $val )) {
$val_const = implode ( ',' , $val );
2022-09-10 16:43:04 +02:00
} else {
$val_const = '' ;
2022-05-11 18:05:06 +02:00
}
} elseif ( $this -> type == 'html' ) {
$val_const = GETPOST ( $this -> confKey , 'restricthtml' );
2021-11-02 13:55:12 +01:00
} else {
$val_const = GETPOST ( $this -> confKey , 'alpha' );
}
// TODO add value check with class validate
$this -> fieldValue = $val_const ;
return 1 ;
}
return 0 ;
}
2021-10-30 12:54:13 +02:00
/**
* Get help text or generate it
2023-10-15 15:32:35 +02:00
*
2021-10-30 12:54:13 +02:00
* @ return int | string
*/
public function getHelpText ()
{
2023-12-04 12:04:36 +01:00
if ( ! empty ( $this -> helpText )) {
return $this -> helpText ;
}
2021-10-24 01:38:13 +02:00
return (( $this -> langs -> trans ( $this -> confKey . 'Tooltip' ) != $this -> confKey . 'Tooltip' ) ? $this -> langs -> trans ( $this -> confKey . 'Tooltip' ) : '' );
}
2021-10-30 12:54:13 +02:00
/**
* Get field name text or generate it
2023-10-15 15:32:35 +02:00
*
2021-10-30 12:54:13 +02:00
* @ return false | int | string
*/
public function getNameText ()
{
2023-12-04 12:04:36 +01:00
if ( ! empty ( $this -> nameText )) {
return $this -> nameText ;
}
2021-10-30 12:54:13 +02:00
return (( $this -> langs -> trans ( $this -> confKey ) != $this -> confKey ) ? $this -> langs -> trans ( $this -> confKey ) : $this -> langs -> trans ( 'MissingTranslationForConfKey' , $this -> confKey ));
2021-10-24 01:38:13 +02:00
}
2021-10-30 12:54:13 +02:00
/**
* generate input field
2023-10-15 15:32:35 +02:00
*
2021-10-30 12:54:13 +02:00
* @ return bool | string
*/
public function generateInputField ()
{
2021-11-28 12:15:31 +01:00
global $conf ;
2021-10-24 01:38:13 +02:00
2021-10-30 12:54:13 +02:00
if ( ! empty ( $this -> fieldOverride )) {
2021-10-24 01:38:13 +02:00
return $this -> fieldOverride ;
}
2021-10-30 12:54:13 +02:00
if ( ! empty ( $this -> fieldInputOverride )) {
return $this -> fieldInputOverride ;
}
2022-05-21 16:35:10 +02:00
// Set default value
if ( is_null ( $this -> fieldValue )) {
$this -> fieldValue = $this -> defaultFieldValue ;
}
2022-01-09 10:24:28 +01:00
$this -> fieldAttr [ 'name' ] = $this -> confKey ;
$this -> fieldAttr [ 'id' ] = 'setup-' . $this -> confKey ;
$this -> fieldAttr [ 'value' ] = $this -> fieldValue ;
2021-10-24 01:38:13 +02:00
$out = '' ;
2021-10-31 09:29:20 +01:00
if ( $this -> type == 'title' ) {
$out .= $this -> generateOutputField (); // title have no input
2022-05-11 18:05:06 +02:00
} elseif ( $this -> type == 'multiselect' ) {
$out .= $this -> generateInputFieldMultiSelect ();
} elseif ( $this -> type == 'select' ) {
$out .= $this -> generateInputFieldSelect ();
2023-03-14 15:04:15 +01:00
} elseif ( $this -> type == 'selectUser' ) {
$out .= $this -> generateInputFieldSelectUser ();
2021-10-31 09:29:20 +01:00
} elseif ( $this -> type == 'textarea' ) {
$out .= $this -> generateInputFieldTextarea ();
2021-10-24 01:38:13 +02:00
} elseif ( $this -> type == 'html' ) {
2021-10-31 09:29:20 +01:00
$out .= $this -> generateInputFieldHtml ();
2022-05-21 16:35:10 +02:00
} elseif ( $this -> type == 'color' ) {
$out .= $this -> generateInputFieldColor ();
2021-10-24 01:38:13 +02:00
} elseif ( $this -> type == 'yesno' ) {
2022-08-05 17:43:33 +02:00
if ( ! empty ( $conf -> use_javascript_ajax )) {
$out .= ajax_constantonoff ( $this -> confKey );
} else {
$out .= $this -> form -> selectyesno ( $this -> confKey , $this -> fieldValue , 1 );
}
2021-10-24 01:38:13 +02:00
} elseif ( preg_match ( '/emailtemplate:/' , $this -> type )) {
2021-11-01 10:32:37 +01:00
$out .= $this -> generateInputFieldEmailTemplate ();
2021-10-24 01:38:13 +02:00
} elseif ( preg_match ( '/category:/' , $this -> type )) {
2021-11-01 10:32:37 +01:00
$out .= $this -> generateInputFieldCategories ();
2021-10-24 01:38:13 +02:00
} elseif ( preg_match ( '/thirdparty_type/' , $this -> type )) {
require_once DOL_DOCUMENT_ROOT . '/core/class/html.formcompany.class.php' ;
$formcompany = new FormCompany ( $this -> db );
2021-10-30 12:54:13 +02:00
$out .= $formcompany -> selectProspectCustomerType ( $this -> fieldValue , $this -> confKey );
2021-10-24 01:38:13 +02:00
} elseif ( $this -> type == 'securekey' ) {
2021-11-01 10:32:37 +01:00
$out .= $this -> generateInputFieldSecureKey ();
2021-10-24 01:38:13 +02:00
} elseif ( $this -> type == 'product' ) {
2022-08-23 20:02:37 +02:00
if ( isModEnabled ( " product " ) || isModEnabled ( " service " )) {
2021-10-30 12:54:13 +02:00
$selected = ( empty ( $this -> fieldValue ) ? '' : $this -> fieldValue );
2021-10-30 16:36:51 +02:00
$out .= $this -> form -> select_produits ( $selected , $this -> confKey , '' , 0 , 0 , 1 , 2 , '' , 0 , array (), 0 , '1' , 0 , $this -> cssClass , 0 , '' , null , 1 );
2021-10-24 01:38:13 +02:00
}
} else {
2022-05-21 16:35:10 +02:00
$out .= $this -> generateInputFieldText ();
2021-10-24 01:38:13 +02:00
}
return $out ;
}
2022-05-21 16:35:10 +02:00
/**
* generatec default input field
2023-10-15 15:32:35 +02:00
*
2022-05-21 16:35:10 +02:00
* @ return string
*/
public function generateInputFieldText ()
{
2023-12-04 12:04:36 +01:00
if ( empty ( $this -> fieldAttr )) {
$this -> fieldAttr [ 'class' ] = 'flat ' . ( empty ( $this -> cssClass ) ? 'minwidth200' : $this -> cssClass );
}
2022-05-21 16:35:10 +02:00
return '<input ' . FormSetup :: generateAttributesStringFromArray ( $this -> fieldAttr ) . ' />' ;
}
2021-10-31 09:29:20 +01:00
/**
* generate input field for textarea
2023-10-15 15:32:35 +02:00
*
2021-10-31 09:29:20 +01:00
* @ return string
*/
public function generateInputFieldTextarea ()
{
$out = '<textarea class="flat" name="' . $this -> confKey . '" id="' . $this -> confKey . '" cols="50" rows="5" wrap="soft">' . " \n " ;
$out .= dol_htmlentities ( $this -> fieldValue );
$out .= " </textarea> \n " ;
return $out ;
}
2021-11-01 10:32:37 +01:00
2021-10-31 09:29:20 +01:00
/**
* generate input field for html
2023-10-15 15:32:35 +02:00
*
2021-10-31 09:29:20 +01:00
* @ return string
*/
public function generateInputFieldHtml ()
{
global $conf ;
require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php' ;
2023-06-09 13:45:19 +02:00
$doleditor = new DolEditor ( $this -> confKey , $this -> fieldValue , '' , 160 , 'dolibarr_notes' , '' , false , false , isModEnabled ( 'fckeditor' ), ROWS_5 , '90%' );
2021-10-31 09:29:20 +01:00
return $doleditor -> Create ( 1 );
}
2021-11-01 10:32:37 +01:00
/**
* generate input field for categories
* @ return string
*/
public function generateInputFieldCategories ()
{
require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php' ;
require_once DOL_DOCUMENT_ROOT . '/core/class/html.formother.class.php' ;
$formother = new FormOther ( $this -> db );
$tmp = explode ( ':' , $this -> type );
2023-10-15 15:32:35 +02:00
$out = img_picto ( '' , 'category' , 'class="pictofixedwidth"' );
2023-12-04 12:04:36 +01:00
$out .= $formother -> select_categories ( $tmp [ 1 ], $this -> fieldValue , $this -> confKey , 0 , $this -> langs -> trans ( 'CustomersProspectsCategoriesShort' ));
2023-10-15 15:32:35 +02:00
2021-11-01 10:32:37 +01:00
return $out ;
}
/**
* generate input field for email template selector
* @ return string
*/
public function generateInputFieldEmailTemplate ()
{
2023-10-15 15:32:35 +02:00
global $user ;
2021-11-01 10:32:37 +01:00
$out = '' ;
if ( preg_match ( '/emailtemplate:/' , $this -> type )) {
include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php' ;
$formmail = new FormMail ( $this -> db );
$tmp = explode ( ':' , $this -> type );
$nboftemplates = $formmail -> fetchAllEMailTemplate ( $tmp [ 1 ], $user , null , 1 ); // We set lang=null to get in priority record with no lang
$arrayOfMessageName = array ();
if ( is_array ( $formmail -> lines_model )) {
foreach ( $formmail -> lines_model as $modelMail ) {
$moreonlabel = '' ;
if ( ! empty ( $arrayOfMessageName [ $modelMail -> label ])) {
$moreonlabel = ' <span class="opacitymedium">(' . $this -> langs -> trans ( " SeveralLangugeVariatFound " ) . ')</span>' ;
}
// The 'label' is the key that is unique if we exclude the language
$arrayOfMessageName [ $modelMail -> id ] = $this -> langs -> trans ( preg_replace ( '/\(|\)/' , '' , $modelMail -> label )) . $moreonlabel ;
}
}
$out .= $this -> form -> selectarray ( $this -> confKey , $arrayOfMessageName , $this -> fieldValue , 'None' , 0 , 0 , '' , 0 , 0 , 0 , '' , '' , 1 );
}
return $out ;
}
/**
* generate input field for secure key
2023-10-15 15:32:35 +02:00
*
2021-11-01 10:32:37 +01:00
* @ return string
*/
public function generateInputFieldSecureKey ()
{
global $conf ;
2023-12-04 12:04:36 +01:00
$out = '<input required="required" type="text" class="flat" id="' . $this -> confKey . '" name="' . $this -> confKey . '" value="' . ( GETPOST ( $this -> confKey , 'alpha' ) ? GETPOST ( $this -> confKey , 'alpha' ) : $this -> fieldValue ) . '" size="40">' ;
2021-11-01 10:32:37 +01:00
if ( ! empty ( $conf -> use_javascript_ajax )) {
$out .= ' ' . img_picto ( $this -> langs -> trans ( 'Generate' ), 'refresh' , 'id="generate_token' . $this -> confKey . '" class="linkobject"' );
}
2022-07-27 13:42:32 +02:00
// Add button to autosuggest a key
include_once DOL_DOCUMENT_ROOT . '/core/lib/security2.lib.php' ;
$out .= dolJSToSetRandomPassword ( $this -> confKey , 'generate_token' . $this -> confKey );
2021-11-01 10:32:37 +01:00
return $out ;
}
2022-05-11 18:05:06 +02:00
/**
2023-10-15 15:32:35 +02:00
* generateInputFieldMultiSelect
*
2022-05-11 18:05:06 +02:00
* @ return string
*/
public function generateInputFieldMultiSelect ()
{
$TSelected = array ();
if ( $this -> fieldValue ) {
$TSelected = explode ( ',' , $this -> fieldValue );
}
return $this -> form -> multiselectarray ( $this -> confKey , $this -> fieldOptions , $TSelected , 0 , 0 , '' , 0 , 0 , 'style="min-width:100px"' );
}
/**
2023-10-15 15:32:35 +02:00
* generateInputFieldSelect
*
2022-05-11 18:05:06 +02:00
* @ return string
*/
public function generateInputFieldSelect ()
{
return $this -> form -> selectarray ( $this -> confKey , $this -> fieldOptions , $this -> fieldValue );
}
2023-03-14 15:04:15 +01:00
/**
* @ return string
*/
public function generateInputFieldSelectUser ()
{
return $this -> form -> select_dolusers ( $this -> fieldValue , $this -> confKey );
}
2021-11-01 10:32:37 +01:00
/**
* get the type : used for old module builder setup conf style conversion and tests
* because this two class will quickly evolve it ' s important to not set or get directly $this -> type ( will be protected ) so this method exist
* to be sure we can manage evolution easily
*
* @ return string
*/
public function getType ()
{
return $this -> type ;
}
2021-10-31 09:29:20 +01:00
/**
* set the type from string : used for old module builder setup conf style conversion and tests
* because this two class will quickly evolve it ' s important to not set directly $this -> type ( will be protected ) so this method exist
* to be sure we can manage evolution easily
2023-01-06 19:24:57 +01:00
*
2021-10-31 09:29:20 +01:00
* @ param string $type possible values based on old module builder setup : 'string' , 'textarea' , 'category:' . Categorie :: TYPE_CUSTOMER ', ' emailtemplate ', ' thirdparty_type '
2021-11-01 10:11:43 +01:00
* @ deprecated yes this setTypeFromTypeString came deprecated because it exists only for manage setup convertion
2021-10-31 09:29:20 +01:00
* @ return bool
*/
public function setTypeFromTypeString ( $type )
{
$this -> type = $type ;
2023-01-06 19:24:57 +01:00
2021-10-31 09:29:20 +01:00
return true ;
}
2021-10-24 01:38:13 +02:00
/**
2021-10-30 12:54:13 +02:00
* Add error
2023-01-06 19:24:57 +01:00
*
2021-10-30 12:54:13 +02:00
* @ param array | string $errors the error text
* @ return null
2021-10-24 01:38:13 +02:00
*/
2021-10-30 12:54:13 +02:00
public function setErrors ( $errors )
{
if ( is_array ( $errors )) {
if ( ! empty ( $errors )) {
foreach ( $errors as $error ) {
2021-10-24 01:38:13 +02:00
$this -> setErrors ( $error );
}
}
2021-10-30 12:54:13 +02:00
} elseif ( ! empty ( $errors )) {
2021-10-24 01:38:13 +02:00
$this -> errors [] = $errors ;
}
}
2021-10-30 12:54:13 +02:00
/**
2023-01-06 19:24:57 +01:00
* generateOutputField
*
* @ return bool | string Generate the output html for this item
2021-10-30 12:54:13 +02:00
*/
public function generateOutputField ()
{
2022-08-05 17:55:39 +02:00
global $conf , $user , $langs ;
2021-10-24 01:38:13 +02:00
2021-10-30 12:54:13 +02:00
if ( ! empty ( $this -> fieldOverride )) {
2021-10-24 01:38:13 +02:00
return $this -> fieldOverride ;
}
2021-10-30 12:54:13 +02:00
if ( ! empty ( $this -> fieldOutputOverride )) {
return $this -> fieldOutputOverride ;
}
2021-10-24 01:38:13 +02:00
$out = '' ;
2021-10-31 09:29:20 +01:00
if ( $this -> type == 'title' ) {
// nothing to do
} elseif ( $this -> type == 'textarea' ) {
2021-10-30 12:54:13 +02:00
$out .= dol_nl2br ( $this -> fieldValue );
2022-05-11 18:05:06 +02:00
} elseif ( $this -> type == 'multiselect' ) {
$out .= $this -> generateOutputFieldMultiSelect ();
} elseif ( $this -> type == 'select' ) {
$out .= $this -> generateOutputFieldSelect ();
2023-03-14 15:04:15 +01:00
} elseif ( $this -> type == 'selectUser' ) {
$out .= $this -> generateOutputFieldSelectUser ();
2023-10-15 15:32:35 +02:00
} elseif ( $this -> type == 'html' ) {
2021-10-30 12:54:13 +02:00
$out .= $this -> fieldValue ;
2023-10-15 15:32:35 +02:00
} elseif ( $this -> type == 'color' ) {
2022-05-21 16:35:10 +02:00
$out .= $this -> generateOutputFieldColor ();
2021-10-24 01:38:13 +02:00
} elseif ( $this -> type == 'yesno' ) {
2022-08-05 17:43:33 +02:00
if ( ! empty ( $conf -> use_javascript_ajax )) {
$out .= ajax_constantonoff ( $this -> confKey );
} else {
2022-08-05 17:55:39 +02:00
if ( $this -> fieldValue == 1 ) {
$out .= $langs -> trans ( 'yes' );
2022-08-05 17:43:33 +02:00
} else {
2022-08-05 17:55:39 +02:00
$out .= $langs -> trans ( 'no' );
2022-08-05 17:43:33 +02:00
}
}
2021-10-24 01:38:13 +02:00
} elseif ( preg_match ( '/emailtemplate:/' , $this -> type )) {
2023-01-25 17:34:57 +01:00
if ( $this -> fieldValue > 0 ) {
2023-01-18 12:10:58 +01:00
include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php' ;
$formmail = new FormMail ( $this -> db );
2021-10-24 01:38:13 +02:00
2023-01-18 12:10:58 +01:00
$tmp = explode ( ':' , $this -> type );
2021-10-24 01:38:13 +02:00
2023-01-18 12:10:58 +01:00
$template = $formmail -> getEMailTemplate ( $this -> db , $tmp [ 1 ], $user , $this -> langs , $this -> fieldValue );
2023-01-26 02:21:27 +01:00
if ( is_numeric ( $template ) && $template < 0 ) {
2023-01-18 12:10:58 +01:00
$this -> setErrors ( $formmail -> errors );
}
$out .= $this -> langs -> trans ( $template -> label );
2021-10-24 01:38:13 +02:00
}
} elseif ( preg_match ( '/category:/' , $this -> type )) {
2022-05-20 22:05:13 +02:00
require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php' ;
2021-10-24 01:38:13 +02:00
$c = new Categorie ( $this -> db );
2021-10-30 12:54:13 +02:00
$result = $c -> fetch ( $this -> fieldValue );
2021-10-24 01:38:13 +02:00
if ( $result < 0 ) {
$this -> setErrors ( $c -> errors );
}
$ways = $c -> print_all_ways ( ' >> ' , 'none' , 0 , 1 ); // $ways[0] = "ccc2 >> ccc2a >> ccc2a1" with html formated text
$toprint = array ();
foreach ( $ways as $way ) {
$toprint [] = '<li class="select2-search-choice-dolibarr noborderoncategories"' . ( $c -> color ? ' style="background: #' . $c -> color . ';"' : ' style="background: #bbb"' ) . '>' . $way . '</li>' ;
}
2021-11-01 10:11:43 +01:00
$out .= '<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">' . implode ( ' ' , $toprint ) . '</ul></div>' ;
2021-10-24 01:38:13 +02:00
} elseif ( preg_match ( '/thirdparty_type/' , $this -> type )) {
2021-10-30 12:54:13 +02:00
if ( $this -> fieldValue == 2 ) {
2021-10-24 02:09:49 +02:00
$out .= $this -> langs -> trans ( " Prospect " );
2021-10-30 12:54:13 +02:00
} elseif ( $this -> fieldValue == 3 ) {
2021-10-24 02:09:49 +02:00
$out .= $this -> langs -> trans ( " ProspectCustomer " );
2021-10-30 12:54:13 +02:00
} elseif ( $this -> fieldValue == 1 ) {
2021-10-24 02:09:49 +02:00
$out .= $this -> langs -> trans ( " Customer " );
2021-10-30 12:54:13 +02:00
} elseif ( $this -> fieldValue == 0 ) {
2021-10-24 02:09:49 +02:00
$out .= $this -> langs -> trans ( " NorProspectNorCustomer " );
2021-10-24 01:38:13 +02:00
}
} elseif ( $this -> type == 'product' ) {
2022-07-27 11:41:31 +02:00
require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php' ;
2023-01-26 02:21:27 +01:00
2021-10-24 01:38:13 +02:00
$product = new Product ( $this -> db );
2021-10-30 12:54:13 +02:00
$resprod = $product -> fetch ( $this -> fieldValue );
2021-10-24 01:38:13 +02:00
if ( $resprod > 0 ) {
2021-10-24 02:09:49 +02:00
$out .= $product -> ref ;
2021-10-24 01:38:13 +02:00
} elseif ( $resprod < 0 ) {
$this -> setErrors ( $product -> errors );
}
} else {
2021-10-30 12:54:13 +02:00
$out .= $this -> fieldValue ;
2021-10-24 01:38:13 +02:00
}
return $out ;
}
2021-11-02 13:55:12 +01:00
2022-05-11 18:05:06 +02:00
/**
2023-03-27 08:54:57 +02:00
* generateOutputFieldMultiSelect
2023-03-27 08:55:42 +02:00
*
2022-05-11 18:05:06 +02:00
* @ return string
*/
public function generateOutputFieldMultiSelect ()
{
$outPut = '' ;
$TSelected = array ();
if ( ! empty ( $this -> fieldValue )) {
$TSelected = explode ( ',' , $this -> fieldValue );
}
if ( ! empty ( $TSelected )) {
foreach ( $TSelected as $selected ) {
if ( ! empty ( $this -> fieldOptions [ $selected ])) {
$outPut .= dolGetBadge ( '' , $this -> fieldOptions [ $selected ], 'info' ) . ' ' ;
}
}
}
return $outPut ;
}
2022-05-21 16:35:10 +02:00
/**
2023-03-27 08:54:57 +02:00
* generateOutputFieldColor
2023-03-27 08:55:42 +02:00
*
2022-05-21 16:35:10 +02:00
* @ return string
*/
public function generateOutputFieldColor ()
{
$this -> fieldAttr [ 'disabled' ] = null ;
return $this -> generateInputField ();
}
/**
2023-03-27 08:54:57 +02:00
* generateInputFieldColor
2023-03-27 08:55:42 +02:00
*
2022-05-21 16:35:10 +02:00
* @ return string
*/
public function generateInputFieldColor ()
{
$this -> fieldAttr [ 'type' ] = 'color' ;
return $this -> generateInputFieldText ();
}
2022-05-11 18:05:06 +02:00
/**
2023-03-27 08:54:57 +02:00
* generateOutputFieldSelect
*
2022-05-11 18:05:06 +02:00
* @ return string
*/
public function generateOutputFieldSelect ()
{
$outPut = '' ;
if ( ! empty ( $this -> fieldOptions [ $this -> fieldValue ])) {
$outPut = $this -> fieldOptions [ $this -> fieldValue ];
}
return $outPut ;
}
2023-03-14 15:04:15 +01:00
/**
2023-03-27 08:54:57 +02:00
* generateOutputFieldSelectUser
*
2023-03-14 15:04:15 +01:00
* @ return string
*/
public function generateOutputFieldSelectUser ()
{
$outPut = '' ;
$user = new User ( $this -> db );
$user -> fetch ( $this -> fieldValue );
$outPut = $user -> firstname . " " . $user -> lastname ;
return $outPut ;
}
2023-03-27 08:55:42 +02:00
2021-10-30 12:54:13 +02:00
/*
* METHODS FOR SETTING DISPLAY TYPE
*/
/**
* Set type of input as string
2023-03-27 08:54:57 +02:00
*
2021-10-30 16:36:51 +02:00
* @ return self
2021-10-30 12:54:13 +02:00
*/
public function setAsString ()
{
$this -> type = 'string' ;
2021-10-30 16:36:51 +02:00
return $this ;
2021-10-30 12:54:13 +02:00
}
2022-05-21 16:35:10 +02:00
/**
* Set type of input as color
2023-03-27 08:54:57 +02:00
*
2022-05-21 16:35:10 +02:00
* @ return self
*/
public function setAsColor ()
{
$this -> type = 'color' ;
return $this ;
}
2021-10-30 12:54:13 +02:00
/**
* Set type of input as textarea
2023-03-27 08:54:57 +02:00
*
2021-10-30 16:36:51 +02:00
* @ return self
2021-10-30 12:54:13 +02:00
*/
public function setAsTextarea ()
{
$this -> type = 'textarea' ;
2021-10-30 16:36:51 +02:00
return $this ;
2021-10-30 12:54:13 +02:00
}
/**
* Set type of input as html editor
2023-03-27 08:54:57 +02:00
*
2021-10-30 16:36:51 +02:00
* @ return self
2021-10-30 12:54:13 +02:00
*/
public function setAsHtml ()
{
$this -> type = 'html' ;
2021-10-30 16:36:51 +02:00
return $this ;
2021-10-30 12:54:13 +02:00
}
/**
* Set type of input as emailtemplate selector
2023-03-27 08:54:57 +02:00
*
2021-10-30 16:36:51 +02:00
* @ param string $templateType email template type
* @ return self
2021-10-30 12:54:13 +02:00
*/
2021-10-30 16:36:51 +02:00
public function setAsEmailTemplate ( $templateType )
2021-10-30 12:54:13 +02:00
{
2021-10-30 16:36:51 +02:00
$this -> type = 'emailtemplate:' . $templateType ;
return $this ;
2021-10-30 12:54:13 +02:00
}
/**
* Set type of input as thirdparty_type selector
2023-03-27 08:54:57 +02:00
*
2021-10-30 16:36:51 +02:00
* @ return self
2021-10-30 12:54:13 +02:00
*/
public function setAsThirdpartyType ()
{
$this -> type = 'thirdparty_type' ;
2021-10-30 16:36:51 +02:00
return $this ;
2021-10-30 12:54:13 +02:00
}
/**
* Set type of input as Yes
2023-03-27 08:54:57 +02:00
*
2021-10-30 16:36:51 +02:00
* @ return self
2021-10-30 12:54:13 +02:00
*/
public function setAsYesNo ()
{
$this -> type = 'yesno' ;
2021-10-30 16:36:51 +02:00
return $this ;
2021-10-30 12:54:13 +02:00
}
/**
* Set type of input as secure key
2023-03-27 08:54:57 +02:00
*
2021-10-30 16:36:51 +02:00
* @ return self
2021-10-30 12:54:13 +02:00
*/
public function setAsSecureKey ()
{
$this -> type = 'securekey' ;
2021-10-30 16:36:51 +02:00
return $this ;
}
/**
* Set type of input as product
2023-03-27 08:54:57 +02:00
*
2021-10-30 16:36:51 +02:00
* @ return self
*/
public function setAsProduct ()
{
$this -> type = 'product' ;
return $this ;
2021-10-30 12:54:13 +02:00
}
/**
* Set type of input as a category selector
* TODO add default value
2023-03-27 08:54:57 +02:00
*
2021-10-30 12:54:13 +02:00
* @ param int $catType Type of category ( 'customer' , 'supplier' , 'contact' , 'product' , 'member' ) . Old mode ( 0 , 1 , 2 , ... ) is deprecated .
2021-10-30 16:36:51 +02:00
* @ return self
2021-10-30 12:54:13 +02:00
*/
public function setAsCategory ( $catType )
{
$this -> type = 'category:' . $catType ;
2021-10-30 16:36:51 +02:00
return $this ;
2021-10-30 12:54:13 +02:00
}
2021-10-31 09:29:20 +01:00
/**
2023-03-27 08:54:57 +02:00
* Set type of input as a simple title . No data to store
*
2021-10-31 09:29:20 +01:00
* @ return self
*/
public function setAsTitle ()
{
$this -> type = 'title' ;
return $this ;
}
2022-05-11 18:05:06 +02:00
/**
2023-03-27 08:54:57 +02:00
* Set type of input as a simple title . No data to store
*
2022-05-11 18:05:06 +02:00
* @ param array $fieldOptions A table of field options
* @ return self
*/
public function setAsMultiSelect ( $fieldOptions )
{
if ( is_array ( $fieldOptions )) {
$this -> fieldOptions = $fieldOptions ;
}
$this -> type = 'multiselect' ;
return $this ;
}
/**
2023-03-27 08:54:57 +02:00
* Set type of input as a simple title . No data to store
*
2022-05-11 18:05:06 +02:00
* @ param array $fieldOptions A table of field options
* @ return self
*/
public function setAsSelect ( $fieldOptions )
{
if ( is_array ( $fieldOptions )) {
$this -> fieldOptions = $fieldOptions ;
}
$this -> type = 'select' ;
return $this ;
}
2023-03-14 15:04:15 +01:00
/**
2023-03-27 08:54:57 +02:00
* Set type of input as a simple title . No data to store
*
2023-03-14 15:04:15 +01:00
* @ return self
*/
public function setAsSelectUser ()
{
$this -> type = 'selectUser' ;
return $this ;
}
2021-10-24 01:38:13 +02:00
}