vTiger自定义字段验证beforesave

时间:2017-03-31 15:41:23

标签: php validation vtiger

我在vTiger 6.5上创建了一个自定义模块。

我为模块制作了一个事件处理程序,但我想知道如何在这个字段上执行某种验证。这么胖我已经做到了但是我无法让它工作,我已经测试了处理程序只是回应了一个刺痛并且它工作正常。

请参阅下面的代码。谢谢!

    <?php
/*+***********************************************************************************
 * The contents of this file are subject to the vtiger CRM Public License Version 1.0
 * ("License"); You may not use this file except in compliance with the License
 * The Original Code is:  vtiger CRM Open Source
 * The Initial Developer of the Original Code is vtiger.
 * Portions created by vtiger are Copyright (C) vtiger.
 * All Rights Reserved.
 *************************************************************************************/
# getModuleName : Returns the module name of the entity.
# getId : Returns id of the entity, this will return null if the id has not been saved yet.
# getData : Returns the fields of the entity as an array where the field name is the key and the fields value is the value.
# isNew : Returns true if new record is being created, false otherwise. 
# 'vtiger.entity.beforesave.modifiable' : Setting values : $data->set('simple_field', 'value'); 

class isaHandler extends VTEventHandler { 
    function handleEvent($eventName, $entityData) {
        global $adb;
        $moduleName = $entityData->getModuleName(); 
        if($moduleName=='isa'){     
            if($eventName == 'vtiger.entity.beforesave.modifiable') {}
            if($eventName == 'vtiger.entity.beforesave') {
                if('currentamount' > 20000){
                    echo "Please go back and enter less than 20000";
                exit;
                }

            }
            if($eventName == 'vtiger.entity.beforesave.final') {}
            if($eventName == 'vtiger.entity.aftersave') {
            }
        }   
    }

}
?>

3 个答案:

答案 0 :(得分:1)

在做了一些搜索并查看其他人事件处理程序之后,我设法通过更改:

来解决这个问题
if($eventName == 'vtiger.entity.beforesave') {
                if('currentamount' > 20000){
                    echo "Please go back and enter less than 20000";
                exit;
                }

if($eventName == 'vtiger.entity.beforesave') {
                $price = $entityData->get('currentamount');
                if($price > 20000){
                    echo "Please go back and enter less than 20000";
                exit;
                }

现在我想查看是否可以显示该消息,然后提供一个链接以返回实体模块,所有字段仍然已满。

答案 1 :(得分:0)

在我看来,你应该使用recordPreSave函数。 它允许您在将数据保存到数据库之前显示信息/错误消息

以下是一个例子:

在Edit.js中:

donCache : {},
    checkDon : function(details) {
        // alert("checkOverlap");
        var aDeferred = jQuery.Deferred();

        var params = {
            'module' : 'Affectations',
            'action' : "checkAffectAmount",
            'mode': 'CtrlAffectAmount',
            'recordId' : details.don,
            'montant' : details.montant
        }
        AppConnector.request(params).then(
            function(data) {
                if (data.success == true) {
                    // console.log(data.result);
                    var statut = data.result.statut;
                    var reste = data.result.reste;

                    if(statut == "error"){
                        aDeferred.reject(data);
                    }else {
                        aDeferred.resolve(data);
                    }
                }
            },
            function(error,err){
                aDeferred.reject();
            }
        );
        return aDeferred.promise();
    },

    registerRecordPreSaveEvent : function(form) {
        var thisInstance = this;
        if (typeof form == 'undefined') {
            form = this.getForm();
        }
        form.on(Vtiger_Edit_Js.recordPreSave, function(e, data) {
            var check = false;
            var recordId = jQuery('input[name="record"]').val();

            if (!recordId || recordId) {

                var montant_affectation = jQuery("input[name='affectations_montant']").val();
                var don_id = jQuery("input[name='affectations_potentialid']").val();

                var params = {};
                if (!(check in thisInstance.donCache)) {
                    thisInstance.checkDon({
                        'montant' : montant_affectation,
                        'don': don_id
                    }).then(
                        function(data){
                            thisInstance.donCache[check] = data['success'];
                            form.submit();
                        },
                        function(data, err){
                            thisInstance.donCache[check] = data['success'];
                            var reste = data.result.reste;
                            var msg = app.vtranslate("<strong>Attention!</strong> La somme des affectations est supérieure  de ")+ reste +app.vtranslate(" Euros au montant du don");
                            Vtiger_Helper_Js.showPnotify(msg);
                            delete thisInstance.donCache[check];
                        }
                    );
                } else {
                    delete thisInstance.donCache[check];
                    return true;
                }
                e.preventDefault();
            }
        })
    },

modules / isa / actions中的PHP部分:

<?php

/***********************************
** DEBUT ALTAIR - JPR 15/06/2016 ***
***********************************/

class Affectations_checkAffectAmount_Action extends Vtiger_Action_Controller {

    function __construct() {
        $this->exposeMethod('CtrlAffectAmount');
    }

    public function checkPermission(Vtiger_Request $request) {
        $moduleName = $request->getModule();
        $moduleModel = Vtiger_Module_Model::getInstance($moduleName);

        $userPrivilegesModel = Users_Privileges_Model::getCurrentUserPrivilegesModel();
        $permission = $userPrivilegesModel->hasModulePermission($moduleModel->getId());

        if(!$permission) {
            throw new AppException('LBL_PERMISSION_DENIED');
        }
    }

    public function process(Vtiger_Request $request) {
        $mode = $request->getMode();
        if(!empty($mode) && $this->isMethodExposed($mode)) {
            $this->invokeExposedMethod($mode, $request);
            return;
        }
    }

    function CtrlAffectAmount(Vtiger_Request $request){
        global $adb,$log;

        $log->debug("ALTAIR CtrlAffectAmount OK");

        $recordId = $request->get('recordId');
        $montant = $request->get('montant');

        // $query = $adb->pquery("SELECT SUM(unit_price) AS sommeaffectation FROM vtiger_products INNER JOIN vtiger_crmentity ON vtiger_products.productid = vtiger_crmentity.crmid WHERE don_affecte = ? AND vtiger_crmentity.deleted=0",array($recordId));
        $query = $adb->pquery("SELECT SUM(affectations_montant) AS sommeaffectation FROM vtiger_affectations INNER JOIN vtiger_crmentity ON vtiger_affectations.affectationsid = vtiger_crmentity.crmid WHERE vtiger_affectations.affectations_potentialid = ? AND vtiger_crmentity.deleted=0",array($recordId));
        $sommeAffectation = $adb->query_result($query,0,"sommeaffectation");

        $query = $adb->pquery("SELECT amount FROM vtiger_potential INNER JOIN vtiger_crmentity ON vtiger_potential.potentialid = vtiger_crmentity.crmid WHERE potentialid = ? AND vtiger_crmentity.deleted = 0", array($recordId));
        $montantDon = $adb->query_result($query,0,"amount");

        if ( ($sommeAffectation + $montant) == $montantDon) {
            $statut = "ok";
            $reste = "";
        } else if( ($sommeAffectation + $montant) > $montantDon) {
            $statut = "error";
            $reste = ($sommeAffectation + $montant) - $montantDon;

        }

        $value = array('statut'=>$statut, 'reste'=>$reste);

        $response = new Vtiger_Response();
        $response->setEmitType(Vtiger_Response::$EMIT_JSON);
        $response->setResult($value);
        $response->emit();
    }
}

答案 2 :(得分:0)

哦。您这里有1个无效错误。请更改:

if($eventName == 'vtiger.entity.beforesave') {
    $currentAmount = $entityData->get('currentamount');
    if($currentAmount > 20000){
        echo "Please go back and enter less than 20000";
        exit;
    }
}