Hier wird eine Lösung auf Basis eines Logic Hooks beschrieben. Nach dem Speichern eines Accounts wird ein Kundennummer-Feld mit der Nummer belegt, wenn dieses Feld bis zu diesem Zeitpunkt leer ist. Die Kundennummer wird in der Form <Jahreszahl zweistellig>_<vierstellige Nummer> erzeugt, wobei die vierstellige Nummer von 0001 beginnend hochgezählt wird.
Die Lösung nutzt den im SugarForum hier: http://www.sugarcrm.com/forums/showt...683#post234683
von Nutzer JTripleE beschriebenen PHP-Code.
1.) Im Studio für das Modul "Accounts" ein neues Text-Feld einrichten, z.B. "kundennummer".
2.) Dieses neu erzeugte Feld in die DetailView und ggf. ListView mit aufnehmen. Falls das Feld editierbar sein soll (ich würde davon abraten) auch in die EditView.
3.) Erstellen des Logic Hooks
a) custom\modules\Accounts\logic_hooks.php erstellen.
PHP Code:
<?php
// Do not store anything in this file that is not part of the array or the hook version. This file will
// be automatically rebuilt in the future.
$hook_version = 1;
$hook_array = Array();
$hook_array['after_save'] = Array();
$hook_array['after_save'][] = Array(1, 'add_code', 'custom/modules/Accounts/add_code_hook.php','add_code', 'add_code');
?>
Falls die Datei bereits existiert müssen nur die beiden folgenden Zeilen eingebaut werden
PHP Code:
$hook_array['after_save'] = Array();
$hook_array['after_save'][] = Array(1, 'add_code', 'custom/modules/Accounts/add_code_hook.php','add_code', 'add_code');
Wenn bereits ein 'after_save'-Logic Hook enthalten war, dann muss nur die 2. Zeile eingefügt werden, wobei darauf geachtet werden muss, dass der Index (hier: 1) eindeutig gemacht wird.
b) Code für die Ausführung des Logic Hooks bereit stellen:
Es muss die Datei custom\modules\Accounts\add_code_hook.php erzeugt werden mit folgendem Inhalt:
PHP Code:
<?php
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
class add_code {
const CODE_PREFIX = ""; //prefix for the code
const CODE_SUFFIX = ""; //suffix to add after the code
const CODE_SEPARATOR = "-"; //separator to use
const CODE_FIELD = "kundennummer_c"; //custom field to be generated
const IS_CUSTOM_FIELD = "1";
const DB_TABLE = "accounts_cstm"; //table containing custom fields
const ADD_DATE = "1"; //add the date
const DATE_FORMAT = "y"; //format for the year parameter
const ZERO_PADDING = 4; //minimum amount of characters desired for the number. ie 4 = 0001, 3 = 001
const FIRST_NUM = "0000"; //default to start with.
function add_code(&$bean, $event, $arguments)
{
require_once('log4php/LoggerManager.php');
//pattern to detect valid code, designed to detect non padded numbering too.
$pattern = "/^" . self::CODE_PREFIX . (self::ADD_DATE?"[0-9]{2}":"") . self::CODE_SEPARATOR . "([0-9]+)" . self::CODE_SUFFIX . "$/";
$GLOBALS['log']->debug("add_code function fired after save.");
if(!preg_match($pattern, $bean->fetched_row[self::CODE_FIELD])) {
$length_before = strlen(self::CODE_PREFIX) + (self::ADD_DATE?strlen(date(self::DATE_FORMAT)):0) + strlen(self::CODE_SEPARATOR);
$length_rest = $length_before + strlen(self::CODE_SUFFIX);
$db = DBManagerFactory::getInstance();
$query = "SELECT " . self::CODE_FIELD . " FROM " . self::DB_TABLE .
" WHERE (" . self::CODE_FIELD . " <> '' OR " . self::CODE_FIELD . " IS NOT NULL)" .
" ORDER BY".
" ROUND(SUBSTRING(" . self::CODE_FIELD . " FROM " . $length_before . "+1 FOR LENGTH(" . self::CODE_FIELD . ") - " . $length_rest . ")) DESC LIMIT 1";
$result = $db->query($query, true, 'Error selecting most recent ' . self::CODE_FIELD . ' CODE');
if ($row=$db->fetchByAssoc($result)) {
$last_code = $row[self::CODE_FIELD];
} else {
//no codes exist, generate default - PREFIX CURRENT_YEAR SEPARATOR FIRST_NUM
$last_code = self::CODE_PREFIX . (self::ADD_DATE?date(self::DATE_FORMAT):"") . self::CODE_SEPARATOR . self::FIRST_NUM . self::CODE_SUFFIX;
}
$GLOBALS['log']->debug("Last Code: " . $last_code);
preg_match($pattern, $last_code, $matches);
$num=$matches[1];
$num++;
$pads = self::ZERO_PADDING - strlen($num);
$new_code = self::CODE_PREFIX . (self::ADD_DATE?date(self::DATE_FORMAT):"") . self::CODE_SEPARATOR;
//preform the lead padding
for($i=0; $i < $pads; $i++) {
$new_code .= "0";
}
$new_code .= $num . self::CODE_SUFFIX;
$GLOBALS['log']->debug("New Code: " . $last_code);
//write to database
if (self::IS_CUSTOM_FIELD) { // insert into _cstm table for custom fields,
$query = "INSERT INTO " . self::DB_TABLE . " (id_c, " . self::CODE_FIELD . ") VALUES ('$bean->id', '$new_code') ON DUPLICATE KEY UPDATE " . self::CODE_FIELD . "='$new_code'";
} else { // update the existing row in regular table for non-custom fields
$query = "UPDATE " . self::DB_TABLE . " SET " . self::CODE_FIELD . " = '$new_code' WHERE " . self::DB_TABLE . ".id = '$bean->id'";
}
$result = $db->query($query, true, 'Error adding ' . self::CODE_PREFIX . ' code');
} else {
$GLOBALS['log']->debug("Code Exists...Exiting " . $bean->fetched_row[" . self::CODE_FIELD . "]);
}
}
}
?>
Die folgende Zeile muss dabei ggf. angepasst werden:
PHP Code:
const CODE_FIELD = "kundennummer_c"; //custom field to be generated
"kundennummer_c" muss ggf. durch den Namen des im Studio angelegten Feldes (mit angehängtem "_c") ersetzt werden.
Bookmarks