vtenext/vtlib/Vtecrm/Field.php
2021-04-28 20:10:26 +02:00

529 lines
21 KiB
PHP
Raw Blame History

<?php
/*************************************
* SPDX-FileCopyrightText: 2009-2020 Vtenext S.r.l. <info@vtenext.com>
* SPDX-License-Identifier: AGPL-3.0-only
************************************/
/* crmv@198038 */
include_once('vtlib/Vtecrm/Utils.php');
include_once('vtlib/Vtecrm/FieldBasic.php');
/**
* Provides APIs to control CRM Field
* @package vtlib
*/
class Vtecrm_Field extends Vtecrm_FieldBasic {
/**
* Get unique picklist id to use
* @access private
*/
function __getPicklistUniqueId() {
global $adb,$table_prefix;
return $adb->getUniqueID($table_prefix.'_picklist');
}
/**
* Set values for picklist field (for all the roles)
* @param Array List of values to add.
*
* @internal Creates picklist base if it does not exists
*/
function setPicklistValues($values) {
global $adb,$table_prefix, $metaLogs; // crmv@49398
// Non-Role based picklist values
if($this->uitype == '16') {
$this->setNoRolePicklistValues($values);
return;
}
$picklist_table = $table_prefix.'_'.$this->name;
$picklist_idcol = $this->name.'id';
if(!Vtecrm_Utils::CheckTable($picklist_table)) {
Vtecrm_Utils::CreateTable(
$picklist_table,
"$picklist_idcol I(19) NOTNULL PRIMARY ,
$this->name C(200) NOTNULL,
presence I(1) NOTNULL DEFAULT 1,
picklist_valueid I(19) NOT NULL DEFAULT 0",
true);
$new_picklistid = $this->__getPicklistUniqueId();
$adb->pquery("INSERT INTO ".$table_prefix."_picklist (picklistid,name) VALUES(?,?)",Array($new_picklistid, $this->name));
self::log("Creating table $picklist_table ... DONE");
} else {
$new_picklistid = $adb->query_result(
$adb->pquery("SELECT picklistid FROM ".$table_prefix."_picklist WHERE name=?", Array($this->name)), 0, 'picklistid');
// crmv@44323
// check id column for old stupid tables
$picklist_idcol_alt = $this->name.'_id';
$allcols = $adb->getColumnNames($picklist_table);
if (!in_array($picklist_idcol, $allcols) && in_array($picklist_idcol_alt, $allcols)) $picklist_idcol = $picklist_idcol_alt;
// crmv@44323e
if (!in_array($picklist_idcol, $allcols) && $this->name == 'salutationtype') $picklist_idcol = 'salutationid'; //crmv@55200
}
//crmv@64964
$roles = array();
$result = $adb->query("SELECT roleid FROM {$table_prefix}_role");
while($row=$adb->fetchByAssoc($result)) $roles[] = $row['roleid'];
// Add value to picklist now
foreach($values as $value) {
$new_picklistvalueid = getUniquePicklistID();
$presence = 1; // 0 - readonly, Refer function in include/ComboUtil.php
$new_id = $adb->getUniqueID($picklist_table);
$adb->pquery("INSERT INTO $picklist_table($picklist_idcol, $this->name, presence, picklist_valueid) VALUES(?,?,?,?)",
Array($new_id, $value, $presence, $new_picklistvalueid));
// Associate picklist values to all the role
foreach($roles as $roleid) {
$res = $adb->pquery("select max(sortid)+1 as sortid from {$table_prefix}_role2picklist left join $picklist_table on $picklist_table.picklist_valueid = {$table_prefix}_role2picklist.picklistvalueid where roleid = ? and picklistid = ?", array($roleid, $new_picklistid));
// crmv@69568
$sortid = intval($adb->query_result_no_html($res, 0, 'sortid'));
if ($sortid == 0) $sortid = 1;
// crmv@69568
$adb->pquery("INSERT INTO {$table_prefix}_role2picklist(roleid, picklistvalueid, picklistid, sortid) VALUES (?,?,?,?)",
Array($roleid, $new_picklistvalueid, $new_picklistid, $sortid));
}
}
//crmv@64964e
if ($metaLogs) $metaLogs->log($metaLogs::OPERATION_EDITFIELD, $this->id); // crmv@49398
}
/**
* Set values for picklist field (non-role based)
* @param Array List of values to add
*
* @internal Creates picklist base if it does not exists
* @access private
*/
function setNoRolePicklistValues($values) {
global $adb,$table_prefix, $metaLogs; // crmv@49398
$picklist_table = $table_prefix.'_'.$this->name;
$picklist_idcol = $this->name.'id';
if(!Vtecrm_Utils::CheckTable($picklist_table)) {
// crmv@155585
Vtecrm_Utils::CreateTable(
$picklist_table,
"$picklist_idcol I(19) NOTNULL PRIMARY,
$this->name C(200) NOTNULL,
sortorderid I(11),
presence I(1) NOTNULL DEFAULT 1",
true);
// crmv@155585e
self::log("Creating table $picklist_table ... DONE");
}
// Add value to picklist now
$sortid = 1;
foreach($values as $value) {
$presence = 1; // 0 - readonly, Refer function in include/ComboUtil.php
$new_id = $adb->getUniqueId($picklist_table);
$adb->pquery("INSERT INTO $picklist_table($picklist_idcol, $this->name, sortorderid, presence) VALUES(?,?,?,?)",
Array($new_id, $value, $sortid, $presence));
$sortid = $sortid+1;
}
if ($metaLogs) $metaLogs->log($metaLogs::OPERATION_EDITFIELD, $this->id); // crmv@49398
}
/**
* Set relation between field and modules (UIType 10)
* @param Array List of module names
*
* @internal Creates table vte_fieldmodulerel if it does not exists
*/
function setRelatedModules($moduleNames) {
global $adb,$table_prefix, $metaLogs; // crmv@49398
// We need to create core table to capture the relation between the field and modules.
Vtecrm_Utils::CreateTable(
$table_prefix.'_fieldmodulerel',
'fieldid I(11) NOTNULL,
module C(100) NOTNULL,
relmodule C(100) NOTNULL,
status C(10),
sequence I(11)',
true
);
// END
foreach($moduleNames as $relmodule) {
$checkres = $adb->pquery('SELECT * FROM '.$table_prefix.'_fieldmodulerel WHERE fieldid=? AND module=? AND relmodule=?',
Array($this->id, $this->getModuleName(), $relmodule));
// If relation already exist continue
if($adb->num_rows($checkres)) continue;
$adb->pquery('INSERT INTO '.$table_prefix.'_fieldmodulerel(fieldid, module, relmodule) VALUES(?,?,?)',
Array($this->id, $this->getModuleName(), $relmodule));
self::log("Setting $this->name relation with $relmodule ... DONE");
}
if ($metaLogs) $metaLogs->log($metaLogs::OPERATION_EDITFIELD, $this->id); // crmv@49398
return true;
}
/**
* Remove relation between the field and modules (UIType 10)
* @param Array List of module names
*/
function unsetRelatedModules($moduleNames) {
global $adb,$table_prefix, $metaLogs; // crmv@49398
foreach($moduleNames as $relmodule) {
$adb->pquery('DELETE FROM '.$table_prefix.'_fieldmodulerel WHERE fieldid=? AND module=? AND relmodule = ?',
Array($this->id, $this->getModuleName(), $relmodule));
Vtecrm_Utils::Log("Unsetting $this->name relation with $relmodule ... DONE");
}
if ($metaLogs) $metaLogs->log($metaLogs::OPERATION_EDITFIELD, $this->id); // crmv@49398
return true;
}
//crmv@146434
function getFieldInfo() {
global $adb, $table_prefix;
$info = array();
$fieldinfo = $adb->pquery("select info from {$table_prefix}_fieldinfo where fieldid = ?", array($this->id));
if ($fieldinfo && $adb->num_rows($fieldinfo) > 0) {
$info = Zend_Json::decode($adb->query_result_no_html($fieldinfo,0,'info'));
}
return $info;
}
//crmv@146434e
//crmv@106857
function setFieldInfo($fieldinfo) {
global $adb, $table_prefix;
$result = $adb->pquery("select fieldid from {$table_prefix}_fieldinfo where fieldid = ?", array($this->id));
if ($result && $adb->num_rows($result) > 0) {
if (empty($fieldinfo)) {
$adb->pquery("delete from {$table_prefix}_fieldinfo where fieldid = ?", array($this->id));
} else {
$adb->pquery("update {$table_prefix}_fieldinfo set info = ? where fieldid = ?", array(Zend_Json::encode($fieldinfo), $this->id));
}
} elseif (!empty($fieldinfo)) {
$adb->pquery("insert into {$table_prefix}_fieldinfo(fieldid,info) values(?,?)", array($this->id, Zend_Json::encode($fieldinfo)));
}
}
//crmv@106857e
/**
* Get Vtecrm_Field instance by fieldid or fieldname
* @param mixed fieldid or fieldname
* @param Vtecrm_Module Instance of the module if fieldname is used
*/
static function getInstance($value, $moduleInstance=false) {
global $adb,$table_prefix;
$instance = false;
$query = false;
$queryParams = false;
if(Vtecrm_Utils::isNumber($value)) {
$query = "SELECT * FROM ".$table_prefix."_field WHERE fieldid=?";
$queryParams = Array($value);
} else {
$query = "SELECT * FROM ".$table_prefix."_field WHERE fieldname=? AND tabid=?";
$queryParams = Array($value, $moduleInstance->id);
}
$result = $adb->pquery($query, $queryParams);
if($adb->num_rows($result)) {
$class = get_called_class() ?: get_class();
$instance = new $class();
$instance->initialize($adb->fetch_array($result), $moduleInstance);
}
return $instance;
}
/**
* Get Vtecrm_Field instances related to block
* @param Vtecrm_Block Instnace of block to use
* @param Vtecrm_Module Instance of module to which block is associated
*/
static function getAllForBlock($blockInstance, $moduleInstance=false) {
global $adb,$table_prefix;
$instances = false;
$query = false;
$queryParams = false;
if($moduleInstance) {
$query = "SELECT * FROM ".$table_prefix."_field WHERE block=? AND tabid=?";
$queryParams = Array($blockInstance->id, $moduleInstance->id);
} else {
$query = "SELECT * FROM ".$table_prefix."_field WHERE block=?";
$queryParams = Array($blockInstance->id);
}
$result = $adb->pquery($query, $queryParams);
for($index = 0; $index < $adb->num_rows($result); ++$index) {
$class = get_called_class() ?: get_class();
$instance = new $class();
$instance->initialize($adb->fetch_array($result), $moduleInstance, $blockInstance);
$instances[] = $instance;
}
return $instances;
}
/**
* Get Vtecrm_Field instances related to module
* @param Vtecrm_Module Instance of module to use
*/
static function getAllForModule($moduleInstance) {
global $adb,$table_prefix;
$instances = false;
$query = "SELECT * FROM ".$table_prefix."_field WHERE tabid=?";
$queryParams = Array($moduleInstance->id);
$result = $adb->pquery($query, $queryParams);
for($index = 0; $index < $adb->num_rows($result); ++$index) {
$class = get_called_class() ?: get_class();
$instance = new $class();
$instance->initialize($adb->fetch_array($result), $moduleInstance);
$instances[] = $instance;
}
return $instances;
}
/**
* Delete fields associated with the module
* @param Vtecrm_Module Instance of module
* @access private
*/
static function deleteForModule($moduleInstance) {
global $adb,$table_prefix, $metaLogs; // crmv@49398
$adb->pquery("DELETE FROM ".$table_prefix."_field WHERE tabid=?", Array($moduleInstance->id));
FieldUtils::invalidateCache($moduleInstance->id); // crmv@193294
if ($metaLogs) $metaLogs->log($metaLogs::OPERATION_EDITMODFIELDS, $moduleInstance->id, array('module'=>$moduleInstance->name)); // crmv@49398
self::log("Deleting fields of the module ... DONE");
}
//crmv@18954
function unsetPicklistValues($values) {
global $adb,$table_prefix, $metaLogs; //crmv@49398
$picklist_table = $table_prefix.'_'.$this->name;
// Remove value to picklist now
foreach($values as $value) {
$adb->pquery("DELETE FROM $picklist_table WHERE $this->name = ?",Array($value));
}
if ($metaLogs) $metaLogs->log($metaLogs::OPERATION_EDITFIELD, $this->id); // crmv@49398
}
//crmv@18954e
//crmv@21046
function setPicklistValuesCSV($csv_name,$separator=',',$full_path='') {
global $root_directory;
if($full_path == '')
$path=$root_directory.'cache/vtlib/';
else
$path=$full_path;
if(is_file($path.$csv_name)){
$handle = fopen($path.$csv_name, "r");
while (($data = fgetcsv($handle, 1000, $separator)) !== FALSE) {
$values[]=$data[0];
}
fclose($handle);
if(is_array($values))
$this->setPicklistValues($values);
else
$this->setPicklistValues(array());
}
}
//crmv@21046e
//crmv@20534
function setPicklistValuesDBQuery($query,$column2fetch='') {
global $adb;
if(!$query || $query == ''){
self::log("No Query given for $this->name ... SKIP");
return;
}
$result=$adb->query($query);
if($result){
while ($data=$adb->fetchByAssoc($result,-1,false)) {
//se <20> stato fornito un column_name uso quello per estrarre i valori di picklist
//altrimenti uso il nome del campo
if($column2fetch=='')
$values[]=$data[$this->name];
else
$values[]=$data[$column2fetch];
}
if(is_array($values))
$this->setPicklistValues($values);
else
$this->setPicklistValues(array());
}
else{
self::log("Bad Query given for $this->name ... SKIP");
return;
}
}
//crmv@20534e
//crmv@36557
function setMultiPicklistValues($values) {
$pick_obj = new Picklistmulti(false,$this->getModuleName(),$this->name);
foreach ($values as $code=>$arr){
$edit_arr['code_system'] = 'empty';
$edit_arr['code'] = $code;
foreach ($pick_obj->languages as $language){
$edit_arr[$language['prefix']] = $arr[$language['prefix']];
}
$pick_obj->addline($edit_arr);
}
}
function setMultiPicklistValuesDBQuery($query,$columns2fetch=Array()) {
global $adb;
if(!$query || $query == ''){
self::log("No Query given for $this->name ... SKIP");
return;
}
$result=$adb->query($query);
if($result){
$first = true;
while ($data=$adb->fetchByAssoc($result,-1,false)) {
if ($first){
//se <20> stato fornito un column_name uso quello per estrarre i valori di picklist
if(!empty($columns2fetch)){
if (!isset($columns2fetch['code'])){
$usecode = $columns2fetch['value'];
}
else{
$usecode = $columns2fetch['code'];
}
$usevalue = $columns2fetch['value'];
}
else{
$fieldnames = array_keys($data);
$usecode = $fieldnames[0];
if (!isset($fieldnames[1])){
$usevalue = $fieldnames[0];
}else{
$usevalue = $fieldnames[1];
}
}
$first = false;
}
$values[$data[$usevalue]]=$data[$usevalue];
}
$pick_obj = new Picklistmulti(false,$this->getModuleName(),$this->name);
foreach ($values as $code=>$value){
$edit_arr['code_system'] = 'empty';
$edit_arr['code'] = $code;
foreach ($pick_obj->languages as $language){
$edit_arr[$language['prefix']] = $value;
}
$pick_obj->addline($edit_arr);
}
}
}
function setMultiPicklistValuesCSV($csv_name,$separator=',',$full_path='') {
global $root_directory;
if($full_path == '')
$path=$root_directory.'cache/vtlib/';
else
$path=$full_path;
if(is_file($path.$csv_name)){
$handle = fopen($path.$csv_name, "r");
$values = Array();
while (($data = fgetcsv($handle, 1000, $separator)) !== FALSE) {
$values[$data[0]]=$data[1];
}
fclose($handle);
$pick_obj = new Picklistmulti(false,$this->getModuleName(),$this->name);
foreach ($values as $code=>$value){
$edit_arr['code_system'] = 'empty';
$edit_arr['code'] = $code;
foreach ($pick_obj->languages as $language){
$edit_arr[$language['prefix']] = $value;
}
$pick_obj->addline($edit_arr);
}
}
}
//crmv@36557 e
//crmv@110306
function convertNoRolePicklist2Picklist() {
global $adb,$table_prefix, $metaLogs;
// Non-Role based picklist values
if($this->uitype != '16') {
self::log("{$this->name} is not a non role based picklist... SKIP");
return;
}
$tablename = $table_prefix.'_'.$this->name;
//get picklist values
$values = array();
$query = "SELECT {$this->name} FROM $tablename";
$result=$adb->query($query);
if($result){
while ($data=$adb->fetchByAssoc($result,-1,false)) {
$values[]=$data[$this->name];
}
}
//add picklist_valueid into picklist table
$columnname = 'picklist_valueid';
$cols = $adb->getColumnNames($tablename);
if (!in_array($columnname, $cols)) {
$col = $columnname.' I(19) NOT NULL DEFAULT 0';
$adb->alterTable($tablename, $col, 'Add_Column');
}
$new_picklistid = $this->__getPicklistUniqueId();
$adb->pquery("INSERT INTO ".$table_prefix."_picklist (picklistid,name) VALUES(?,?)",Array($new_picklistid, $this->name));
$roles = array();
$result1 = $adb->query("SELECT roleid FROM {$table_prefix}_role");
while($row=$adb->fetchByAssoc($result1)) $roles[] = $row['roleid'];
// update picklist_valueid to picklist now
foreach($values as $value) {
$new_picklistvalueid = getUniquePicklistID();
$adb->pquery("UPDATE $tablename set picklist_valueid=? WHERE {$this->name} =?",
Array($new_picklistvalueid, $value));
// Associate picklist values to all the role
foreach($roles as $roleid) {
$res = $adb->pquery("select max(sortid)+1 as sortid from {$table_prefix}_role2picklist left join $tablename on $tablename.picklist_valueid = {$table_prefix}_role2picklist.picklistvalueid where roleid = ? and picklistid = ?", array($roleid, $new_picklistid));
// crmv@69568
$sortid = intval($adb->query_result_no_html($res, 0, 'sortid'));
if ($sortid == 0) $sortid = 1;
// crmv@69568
$adb->pquery("INSERT INTO {$table_prefix}_role2picklist(roleid, picklistvalueid, picklistid, sortid) VALUES (?,?,?,?)",
Array($roleid, $new_picklistvalueid, $new_picklistid, $sortid));
}
}
$adb->pquery('UPDATE '.$table_prefix.'_field SET uitype=? WHERE fieldid=?', Array(15, $this->id));
FieldUtils::invalidateCache($moduleInstance->id); // crmv@193294
if ($metaLogs) $metaLogs->log($metaLogs::OPERATION_EDITFIELD, $this->id); // crmv@49398
self::log("Migrating {$this->name} ... DONE");
}
//crmv@110306e
}