2

一部のモジュール(連絡先の例)の[編集ビュー]で[保存]をクリックすると、メッセージがポップアップ表示されます(後で、そのポップアップで[OK]と[キャンセル]のオプションが表示されます)。

私の機能

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で[保存]をクリックしても何も起こりませんが、その瞬間にメッセージがポップアップ表示されます(後で[OK]オプションと[キャンセル]オプションを追加します)。

私は何が間違っているのですか?ありがとうございました

いくつかの条件でのみポップアップするためのコードで更新されました:

....
     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ファイルを作成します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この種のカスタムロジックを実行できます。

たとえば、アカウントに対してこれを行うには、次のようにします。

logic_hooksアカウントの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'
                )
        )

AccountsJavaScriptCustomPopJsのファイルに新しいメソッドを追加します。custom_popup_js_include.php

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

私はSugarCRMCE6.5を持っていますが、この方法はうまくいきませんでした(つまり、新しいモジュールを作成することを意味します)。ただし、logic_hookを変更し、ファイルを直接custom / includeフォルダーに配置すると、機能します。

于 2016-05-10T02:09:47.113 に答える