Skip to main content

Install Signature Field

 

During the steps you can replace the names of the classes and the names of the files and/or the relative paths

If during the steps you change the names of the classes or the names of the files and/or the relative paths remember to change them also in the scripts that we are going to create and in the installation script InstallSignatureField.php php (last step)

  • Create new file TouchCustom.php in modules/SDK/src/MyCustomizations/modules/Touch folder. PutCopy&paste the following piece of code in the file:
<?php

require_once('modules/Touch/Touch.php');

class TouchCustom extends Touch { // You can replace "Custom" with whatever you want
	
	public function __construct() {
		parent::__construct();
		$this->webservices['GetRecord'] = array('file' => 'overrides/TouchGetRecordCustom.php', 'class' => 'TouchGetRecordCustom'); // You can replace "Custom" with whatever you want
		$this->webservices['SaveRecord'] = array('file' => 'overrides/TouchSaveRecordCustom.php', 'class' => 'TouchSaveRecordCustom'); // You can replace "Custom" with whatever you want
	}
	
}
  • Create new file TouchGetRecordCustom.php in modules/Touch/vtws2/overrides folder. PutCopy&paste the following piece of code in the file:
<?php

include(require_once('modules/Touch/vtws2/TouchGetRecord.php');

class TouchGetRecordCustom extends TouchGetRecord {
	
	function process(&$request) {
		$module = $request['module'];
		$record = parent::process($request);
		
		if ($record && $record['success'] && $recordid == 0) {
			if (in_array($module, array('ModuleCustom1', 'ModuleCustom2', 'ModuleCustomN'))) {
				$no_image_lbl = getTranslatedString('NO_SIGNATURE_IMAGE', $module);
				if (isset($record['signature']) && $record['signature'] == $no_image_lbl) {
					$record['signature'] = '';
				}
			}
		}
		
		$record['success'] = true;
		return $record;
	}
	
	function retrieveRecord($module, $recordid, $prodblock = 0) {
		$record = parent::retrieveRecord($module, $recordid, $prodblock);
		
		if ($recordid > 0) {
			if (in_array($module, array('ModuleCustom1', 'ModuleCustom2', 'ModuleCustomN'))) {
				$no_image_lbl = getTranslatedString('NO_SIGNATURE_IMAGE', $module);
				if (!empty($record['signature']) && $record['signature'] != $no_image_lbl) {
					$img_path = $record['signature'];
					$type = pathinfo($img_path, PATHINFO_EXTENSION);
					$data = file_get_contents($img_path);
					$base64 = 'data:image/' . $type . ';base64,' . base64_encode($data);
					$record['signature'] = $base64;
				} else {
					$record['signature'] = '';
				}
			}
		}
		
		return $record;
	}
	
}
  • Create new file TouchSaveRecordCustom.php in modules/Touch/vtws2/overrides folder. Copy&paste the following code in the file:
<?php

require_once('modules/Touch/vtws2/TouchSaveRecord.php');

class TouchSaveRecordCustom extends TouchSaveRecord {
	
	public function preSaveRecord($module, $crmid, $mode, &$values) {
		parent::preSaveRecord($module, $crmid, $mode, $values);
		
		if (in_array($module, array('ModuleCustom1', 'ModuleCustom2', 'ModuleCustomN'))) {
			if (isset($values['signature'])) {
				$path = 'storage/signatures/';
				if (!file_exists($path)) {
					mkdir($path);
					chmod($path, 0755);
				}
				$img = $values['signature'];
				$img = str_replace('data:image/png;base64,', '', $img);
				$img = str_replace(' ', '+', $img);
				$data = base64_decode($img);
				$file = $path . 'signature_' . md5($crmid) . '.png';
				$success = file_put_contents($file, $data);
				if ($success) {
					$values['signature'] = $file;
				}
			}
		}
	}
	
}
    Create new file Custom.js in modules/Touch/overrides. The app will automatically download it to extend/overwrite the default behavior. PutCopy&paste the following piece of code in the file:
    (function() {
    	if (Vtecrm && Vtecrm.app) {
    		Ext.define("Vtecrm.view.ShowRecordCustom", { // You can replace "Custom" with whatever you want
    			override: "Vtecrm.view.ShowRecord",
    			signatureModules: ["HelpDesk", "ModuleCustom1", "ModuleCustom2", "ModuleCustomN"], // ModuleCustom* are the modules where you want to enable the signature
    		});
    	}
    })();

    If you already have app customizations in a file, you just need to add the class definition (Vtecrm.view.ShowRecordCustom).

    If you have already extended/overwritten the class Vtecrm.view.ShowRecord you just need to overwrite the variable signatureModules adding the modules where you want to enable the signature

    • Create new file InstallSignatureField.php (or whatever you want) in plugins/script folder and copy&paste the following code:
    <?php
    die(); // Uncomment this to run the script
    
    require('../../config.inc.php');
    chdir($root_directory);
    require_once('include/utils/utils.php');
    require_once('vtlib/Vtecrm/Module.php');
    $Vtiger_Utils_Log = true;
    global $adb, $table_prefix;
    VteSession::start(); // crmv@128133
    
    SDK::setClass('Touch', 'TouchCustom', 'modules/SDK/src/MyCustomizations/modules/Touch/TouchCustom.php'); // You can replace "Custom" with whatever you 
    
    $moduleName = 'ModuleCustom'; // ModuleCustom is the module where you want to enable the signature
    
    $signatureBlock = new Vtiger_Block();
    $signatureBlock->label = 'LBL_SIGNATURE_BLOCK';
    $moduleInstance = Vtiger_Module::getInstance($moduleName);
    $moduleInstance->addBlock($signatureBlock);
    
    $fields = array();
    $fields[] = array(
    	'module' => $moduleName, 
    	'block' => 'LBL_SIGNATURE_BLOCK', 
    	'name' => 'signature', 
    	'label' => 'signature', 
    	'uitype' => '1016', 
    	'columntype' => 'VARCHAR(255)', 
    	'typeofdata' => 'V~O'
    );
    include('modules/SDK/examples/fieldCreate.php');
    
    SDK::setLanguageEntries($moduleName, 'LBL_SIGNATURE_BLOCK', array('it_it' => 'Signature Information', 'en_us' => 'Signature Information'));
    SDK::setLanguageEntries($moduleName, 'signature', array('it_it' => 'Firma', 'en_us' => 'Signature'));
    SDK::setLanguageEntries($moduleName, 'NO_SIGNATURE_IMAGE', array('it_it' => 'Nessuna Firma', 'en_us' => 'No Signature'));
    
    • Execute the file InstallSignatureField.php and logout/login from VTENEXT on both the web and app side

    You can run the script in the browser or through the CLI

    cd plugins/script && php -f InstallSignatureField.php > InstallSignatureField.log