2

我希望在某些模块(例如联系人)的编辑视图中单击“保存”时弹出一些消息(稍后我将在该弹出窗口中获得“确定”和“取消”选项。)。

我的功能

YAHOO.SUGAR.MessageBox.show({msg: 'Foo'} );

当我将它放在 editviewdefs.php (我还必须包含 cache/include/javascript/sugar_grp_yui_widgets.js)文件的顶部时正在工作,并且在打开该视图时我会弹出该视图。但我希望它在保存时弹出,而不是在打开 EditView 时弹出(这只是向我展示该YAHOO功能正在工作的测试)。所以我尝试在以下位置创建单独customJavascript.js的文件custom/modules/Contacts

    //<script type="text/javascript"
 src="cache/include/javascript/sugar_grp_yui_widgets.js"></script>
    function check_custom_data()
    {
    YAHOO.SUGAR.MessageBox.show({msg: 'Foo'} );

    }

我修改了custom/modules/Contacts/metadata/editviewdefs.php

<?php
$module_name = 'Contacts';
$viewdefs ['Contacts'] = 
array (
  'EditView' => 
  array (
    'templateMeta' => 
    array (
      'form' => 
      array (
        'hidden' => 
        array (
          0 => '<input type="hidden" name="opportunity_id" value="{$smarty.request.opportunity_id}">',
          1 => '<input type="hidden" name="case_id" value="{$smarty.request.case_id}">',
          2 => '<input type="hidden" name="bug_id" value="{$smarty.request.bug_id}">',
          3 => '<input type="hidden" name="email_id" value="{$smarty.request.email_id}">',
          4 => '<input type="hidden" name="inbound_email_id" value="{$smarty.request.inbound_email_id}">',
        ),
      ),

      array(
         'buttons' =>
        array (
         0 =>
          array(
           'customCode' =>
            '<input title="Save [Alt+S]" accessKey="S" onclick="this.form.action.value=\'Save\'; return check_custom_data();" type="submit" name="button" value="'.$GLOBALS['app_strings']['LBL_SAVE_BUTTON_LABEL'].'">',
          ),
         1 =>'Cancel'
        )
      ),
        'includes'=> array(
   array('file'=>'custom/modules/Contacts/customJavascript.js'),
      ),
..........
.......

但是当我在 EditView 中单击 Save 时没有任何反应,但我想在那一刻弹出消息(稍后我将添加 OK 和 Cancel 选项)。

我究竟做错了什么?谢谢你

仅在某些条件下更新了弹出代码:

....
     window.formToCheck = formname;

        var contactTypeField = document.getElementById('first_name');
        if (contactTypeField.value == 'Tori')
        {
        if (confirm("This dialog will pop-up whenever the user click on the Save button. "
                + "If you click OK, then you can execute some custom code, and then "
                + "execute the old form check function, which will process and submit "
                + "the form, using SugarCRM's standard behavior.")) {

            var customCodeVariable = 5;
            customCodeVariable = 55 + (customCodeVariable * 5);

            return window.old_check_form(formname);
        }

        return false;
        }
4

2 回答 2

11

SugarCRM 中有多种方式可以做事,这使得它非常强大,有时也很难定制——因为有很多不同的选项可供您使用。

要在单击“保存”按钮时发生某种弹出窗口或任何自定义日志,我建议使用以下解决方案,而不是更改editviewdefs.

以下解决方案不需要您修改任何核心 SugarCRM 文件,因此可以安全升级并且可以轻松安装在另一个实例上。

您需要做的是创建一个自定义的可安装包,并使用模块加载器将其安装到 SugarCRM。

这是您最终需要得到的目录结构的布局:

SugarModuelPopUp
   ->custom
      ->include
         ->customPopUps
            ->custom_popup_js_include.php
            ->customPopUpContacts.js
   ->manifest.php

创建SugarModuelPopUp文件夹,该文件夹将作为此自定义包的根。

在里面SugarModuelPopUp,新建一个名为 .php 的 PHP 文件manifest.php。该文件告诉 SugarCRM 如何安装包。

manifest.php中,粘贴以下代码:

<?php
$manifest = array(
        array(
                'acceptable_sugar_versions' => array()
        ),
        array(
                'acceptable_sugar_flavors' => array()
        ),
        'readme' => 'Please consult the operating manual for detailed installation instructions.',
        'key' => 'customSugarMod1',
        'author' => 'Kyle Lowry',
        'description' => 'Adds pop-up dialog on save on Contacts module.',
        'icon' => '',
        'is_uninstallable' => true,
        'name' => 'Pop-Up Dialog On Save',
        'published_date' => '2013-03-06 12:00:00',
        'type' => 'module',
        'version' => 'v1',
        'remove_tables' => 'prompt'
);

$installdefs = array(
        'id' => 'customSugarMod1',
        'copy' => array(
                array(
                        'from' => '<basepath>/custom/',
                        'to' => 'custom/'
                )
        ),
        'logic_hooks' => array(
                array(
                        'module' => 'Contacts',
                        'hook' => 'after_ui_frame',
                        'order' => 1,
                        'description' => 'Creates pop-up dialog on save action.',
                        'file' => 'custom/include/customPopUps/custom_popup_js_include.php',
                        'class' => 'CustomPopJs',
                        'function' => 'getContactJs'
                )
        )
);

接下来,您将要创建custom文件夹。在其中,创建include文件夹。在其中,创建customPopUps文件夹。

接下来,您将要创建custom_popup_js_include.php文件。此文件控制您的自定义 JavaScript 何时何地被包含在页面中。粘贴以下代码:

<?php
// prevent people from accessing this file directly
if (! defined('sugarEntry') || ! sugarEntry) {
    die('Not a valid entry point.');
}
class CustomPopJs {
    function getContactJs($event, $arguments) {
        // Prevent this script from being injected anywhere but the EditView.
        if ($_REQUEST['action'] != 'EditView') {
            // we are not in the EditView, so simply return without injecting
            // the Javascript
            return;
        }
        echo '<script type="text/javascript" src="custom/include/customPopUps/customPopUpContacts.js"></script>';
    }
}

接下来,您将需要创建customPopUpContacts.js文件,该文件将在单击“联系人”模块中的“保存”按钮时创建自定义弹出窗口EditView。粘贴以下代码:

function override_check_form() {
    // store a reference to the old form checking function
    window.old_check_form = window.check_form;
    // set the form checking function equal to something custom
    window.check_form = function(formname) {
        window.formToCheck = formname;
        // you can create the dialog however you wish, but for simplicity I am
        // just using standard javascript functions
        if (confirm("This dialog will pop-up whenever the user click on the Save button. "
                + "If you click OK, then you can execute some custom code, and then "
                + "execute the old form check function, which will process and submit "
                + "the form, using SugarCRM's standard behavior.")) {
            // you have clicked OK, so do some custom code here,
            // replace this code with whatever you really want to do.
            var customCodeVariable = 5;
            customCodeVariable = 55 + (customCodeVariable * 5);
            // now that your custom code has executed, you can let
            // SugarCRM take control, process the form, and submit
            return window.old_check_form(formname);
        }
        // the user clicked on Cancel, so you can either just return false
        // and leave the person on the form, or you can execute some custom
        // code or do whatever else you want.
        return false;
    }
}

// call the override function, which will replace the old form checker
// with something custom
override_check_form();

创建上述目录结构和正确文件夹中的文件后,您可以创建项目的 ZIP 文件。请务必注意,对于 SugarCRM 可安装包,您的 ZIP 文件必须包含项目目录中的所有内容。也就是说,您不会压缩SugarModuelPopUp文件夹,而是压缩其中的所有内容。

接下来,您将要使用 SugarCRM 的模块加载器安装自定义包。您可以通过以下方式做到这一点:

  1. 转到 SugarCRM 管理页面。
  2. 点击“模块加载器”。
  3. 单击“浏览”并选择 ZIP 包。
  4. 点击“上传”按钮。
  5. 上传包后,在可安装包列表中找到它的条目,然后单击“安装”;继续进行标准的 SugarCRM 安装过程。

安装此自定义包后,每当您单击联系人模块中的“保存”按钮时EditView,都会弹出一个对话框。您可以用您想要的任何内容替换对话框代码,以便在不修改构建它的代码时登录。

此外,您应该能够将此项目用作 SugarCRM 未来功能添加的基础EditViews。任何在单击“保存”按钮时使用该check_form方法的模块都可以执行这种自定义逻辑。

例如,要对 Accounts 执行此操作,您将执行以下操作:

logic_hooks为 Accounts 的 manifest.php 中的数组元素添加一个条目。

'logic_hooks' => array(
                array(
                        'module' => 'Contacts',
                        'hook' => 'after_ui_frame',
                        'order' => 1,
                        'description' => 'Creates pop-up dialog on save action.',
                        'file' => 'custom/include/customPopUps/custom_popup_js_include.php',
                        'class' => 'CustomPopJs',
                        'function' => 'getContactJs'
                ),
                array(
                        'module' => 'Accounts',
                        'hook' => 'after_ui_frame',
                        'order' => 1,
                        'description' => 'Creates pop-up dialog on save action.',
                        'file' => 'custom/include/customPopUps/custom_popup_js_include.php',
                        'class' => 'CustomPopJs',
                        'function' => 'getAccountJs'
                )
        )

CustomPopJscustom_popup_js_include.php文件中为 Accounts JavaScript添加一个新方法。

function getAccountJs($event, $arguments) {
        // Prevent this script from being injected anywhere but the EditView.
        if ($_REQUEST['action'] != 'EditView') {
            // we are not in the EditView, so simply return without injecting
            // the Javascript
            return;
        }
        echo '<script type="text/javascript" src="custom/include/customPopUps/customPopUpAccounts.js"></script>';
    }

创建customPopUpAccounts.js文件,并将customPopUpContacts.js代码用作所需功能的基础。

在 SugarCRM 中实现目标还有其他方法,但这是我个人使用的方法,它的优点是可以安全升级并轻松迁移到其他 SugarCRM 实例。

于 2013-03-06T22:32:39.230 回答
2

我有 SugarCRM CE 6.5,但这种方法对我不起作用(我的意思是创建新模块)。但是,我修改了 logic_hook 并将文件直接放在 custom/include 文件夹中,它可以工作!

于 2016-05-10T02:09:47.113 回答