gpt4 book ai didi

ajax - 在糖 crm 中使用 ajax 防止重复值

转载 作者:行者123 更新时间:2023-12-04 13:09:28 33 4
gpt4 key购买 nike

我已经使用模块构建器创建了模块,现在我有一个名为书名的字段
现在,如果我给相同的书名 2 次 t 正在接受。

我不想使用和插入来检查重复值,因为我想通过代码学习自定义。

所以我可以调用 ajax 并检查数据库天气 db 中是否存在相同的书名,但我不知道 Controller 如何在 Sugar crm 中工作。以及如何在 Sugar crm 中调用 ajax。

任何人都可以指导我,非常感谢您的帮助。

最佳答案

如果您真的想使用 ajax 完成此操作,那么我建议您使用 entryPoint 作为方法。这种自定义将需要一些简单的事情。首先,您将编写一些 javascript 来执行实际的 ajax 调用。该 ajax 调用将发布到您编写的入口点。 entryPoint 将为您运行查询并在编辑 View 中向您返回响应。因此,让我们首先编写入口点。

首先,打开文件custom/include/MVC/Controller/entry_point_registry.php。如果文件夹结构和文件尚不存在,请继续创建它们。

将以下代码添加到 entry_point_registry.php 文件中:

$entry_point_registry['test'] = array('file' => 'custom/test.php', 'auth' => true);

关于该行的一些快速解释:
  • test 的索引值可以随意更改。也许 'unique_book_value' 在你的情况下更有意义。您将在一分钟内看到如何使用此值。
  • 数组中的文件值指向您要放置实际代码的位置。您还应该给它一个更有意义的名称。它不需要匹配上面提到的数组键。
  • 'auth' => true 部分确定浏览器是否需要与 SugarCRM 进行事件登录 session 。在这种情况下(以及几乎所有情况),我建议保持这一点。

  • 现在让我们看一下将在 custom/test.php (或在您的情况下 unique_book_name.php)中的代码:
    /* disclaimer: we are not gonna get all crazy with using PDO and parameterized queries at this point,
    but be aware that there is potential for sql injection here. The auth => true will help
    mitigate that somewhat, but you're never supposed to trust any input, blah blah blah. */

    global $db; // load the global sugarcrm database object for your query

    $book_name = urldecode($_REQUEST['book_name']); // we are gonna start with $_REQUEST to make this easier to test, but consider changing to $_POST when confirmed working as expected
    $book_id = urldecode($_REQUEST['book_id']); // need to make sure this still works as expected when editing an existing record

    // the $db->quote is an alias for mysql_real_escape_string() It still does not protect you completely from sql injection, but is better than not using it...
    $sql = "SELECT id FROM book_module_table_name WHERE deleted = 0 AND name = '".$db->quote($book_name)."' AND id <> '".$db->quote($book_id)."'";

    $res = $db->query($sql);

    if ($db->getRowCount($res) > 0) {
    echo 'exists';
    }
    else {
    echo 'unique';
    }

    关于使用直接数据库查询的说明:您可以使用 api 方法来完成此操作。 (提示:$bean->retrieve_by_string_fields() - 如果你想走这条路线,请查看这篇文章: http://developer.sugarcrm.com/2012/03/23/howto-using-the-bean-instead-of-sql-all-the-time/)但是,我发现 api 相当慢,ajax 应该尽可能快。如果客户要求我提供此功能,我有 99% 的机会使用直接数据库查询。如果那天我感觉很喜欢,可能会使用 PDO 和参数化查询,但这是你的决定。

    使用上面的代码,您应该能够导航到 https://crm.yourdomain.com/index.php?entryPoint=test并运行我们刚刚编写的代码。

    但是,此时您将得到的只是一个白屏。如果您修改 url 以包含 entryPoint 部分并且它加载您的主页或不进入白屏,则有 3 个潜在原因:
  • 您为 $entry_point_registry['test'] 设置了不同的内容。如果是这样,请更改 url 以读取 index.php?entryPoint=whatever_you_put_as_the_array_key
  • 您在文件夹或域中的某些内容中有糖,因此它不是 crm.yourdomain.com,而是位于像 yourdomain.com/sugarcrm/这样丑陋和愚蠢的地方,如果是这种情况,请确保您正在修改 url,以便保留实际域部分。好的,我会为你拼写出来... https://yourdomain.com/sugarcrm/index.php?entryPoint=test
  • 这种情况比较少见,但出于某种原因,我无法弄清楚在添加新入口点时有时需要重新加载 apache。如果您有 shell 访问权限,快速/etc/init.d/apache2 重新加载应该可以解决问题。如果您没有 shell 访问权限,您可能需要向您的托管服务提供商开一张票(或获得一个您可以控制的该死的 vps !!!,伙计!)

  • 还是行不通?你注意到https中的“s”了吗?改用 http 并购买 9 美元的 ssl 证书,天哪!

    好的继续。让我们稍微测试一下 entryPoint。向 book 模块添加一条记录。让我们添加“艺术之战”一书(不,不是 war 艺术,尽管您也应该阅读一下)。

    现在在 url 添加这个: index.php?entryPoint=test&book_name=Art%20of%20War

    哦,天哪,网址编码太可怕了!别担心。

    你应该希望得到一个带有“存在”文本的丑陋的白色屏幕。如果你这样做,让我们确保它也能以另一种方式工作。将 2 添加到 url 中的书名,希望它现在会显示“唯一”。

    快速说明:如果您使用的是 Sugar,那么您可能也在使用 mysql,它在搜索字符串时不区分大小写。如果您真的需要区分大小写,请查看这篇 SO 文章:
    How can I make SQL case sensitive string comparison on MySQL?

    好的,现在我们的 entryPoint 可以工作了,我们可以继续进行有趣的部分,使所有内容都成为 ajaxical。有几种方法可以解决这个问题,但不是走最基本的路线,我将向您展示我发现的最可靠的路线。

    您可能需要创建以下文件:custom/modules/CUSTOM_BOOK_MODULE/views/view.edit.php(我希望现在我不需要指出更改该路径以使用您的模块名称...

    假设这个文件不存在,我们从头开始这里是它需要的样子:
    if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');

    class CUSTOM_BOOK_MODULEViewEdit extends ViewEdit
    {
    public function display()
    {
    // make sure it works in the subpanel too
    $this->useForSubpanel = true;

    // make the name value available in the tpl file
    $this->ss->assign('name_value', $this->bean->name);

    // load the parsed contents of the tpl into this var
    $name_input_code = $this->ss->fetch('custom/modules/CUSTOM_BOOK_MODULE/tpls/unique_book_checker.tpl.js');

    // pass the parsed contents down into the editviewdefs
    $this->ss->assign('custom_name_code', $name_input_code);

    // definitely need to call the parent method
    parent::display();
    }
    }

    事情看起来不错。现在我们必须在这个文件中编写代码:custom/modules/CUSTOM_BOOK_MODULE/tpls/unique_book_checker.tpl.js

    首先有几个假设:
  • 我们预计这是 Sugar 6.5+ 并且 jquery 已经可用。如果您使用的是早期版本,则需要手动包含 jquery。
  • 我们将把事件监听器放在 name 字段上。如果您要检查的书名值实际上是一个不同的字段名称,那么只需在下面的 javascript 中调整它。

  • 这是 custom/modules/CUSTOM_BOOK_MODULE/unique_book_checker.tpl.js 的代码:
    <input type="text" name="name" id="name" maxlength="255" value="{$name_value}" />
    <span id="book_unique_result"></span>

    {literal}
    <script type="text/javascript">

    $(document).ready(function() {

    $('#name').blur(function(){

    $('#book_unique_result').html('<strong> checking name...</strong>');

    $.post('index.php?entryPoint=test', {book_name: $('#name').val(), book_id: $('[name="record"]').val()}, function(data){

    if (data == 'exists') {
    removeFromValidate('EditView', 'name');
    addToValidate('EditView', 'name', 'float', true, 'Book Name Must be Unique.');

    $('#book_unique_result').html('<strong style="color:red;"> &#x2717;</strong>');
    }
    else if (data == 'unique') {
    removeFromValidate('EditView', 'name');
    addToValidate('EditView', 'name', '', true, 'Name Required');

    $('#book_unique_result').html('<strong style="color:green;"> &#x2713;</strong>');
    }
    else {
    // uh oh! maybe you have php display errors on?
    }

    });
    });
    });
    </script>
    {/literal}

    另注:当代码检测到该名称已经存在时,我们会有点笨拙,并使用 Sugar 的内置验证内容来防止保存记录。基本上,我们是说如果名称已经存在,那么名称值必须是浮点数。我认为这是不太可能的,并且会成功。但是,如果您有一本名为 3.14 或类似的书,并且您尝试创建副本,则此代码不会阻止保存。它会告诉您找到了重复项,但不会阻止保存。

    呼!好的,最后两步,它们很容易。
    首先,打开文件:custom/modules/CUSTOM_BOOK_MODULE/metadata/editviewdefs.php。
    接下来,找到为 name 字段提供元数据的部分并添加此 customCode 属性,使其如下所示:
    array (
    'name' => 'name',
    'customCode' => '{$custom_name_code}',
    ),

    最后,您需要进行快速修复和重建以使元数据更改生效。转到管理 > 修复 > 快速修复和重建。

    繁荣!你应该很高兴去!

    checking for unique book name
    uh oh thats a duplicate
    okay safe to save

    关于ajax - 在糖 crm 中使用 ajax 防止重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23340660/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com