Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 成功检索新创建的标签id时选择2_Php_Jquery_Ajax_Jquery Select2 - Fatal编程技术网

Php 成功检索新创建的标签id时选择2

Php 成功检索新创建的标签id时选择2,php,jquery,ajax,jquery-select2,Php,Jquery,Ajax,Jquery Select2,在select2中,我使用AJAX加载标记,如果在db中找不到该标记,则用户可以选择创建一个新标记。问题在于,新标签在select2框中作为术语而不是id列出(select to想要什么-尤其是当用户想要更新时,当再次加载标签时会出现问题,因为db中只存储了术语而不是id)在成功添加术语后,如何使select2接收ID并提交ID而不是标签名/术语? $(document).ready(function() { var lastResults = []; $("#project_tags").se

在select2中,我使用AJAX加载标记,如果在db中找不到该标记,则用户可以选择创建一个新标记。问题在于,新标签在select2框中作为术语而不是id列出(select to想要什么-尤其是当用户想要更新时,当再次加载标签时会出现问题,因为db中只存储了术语而不是id)在成功添加术语后,如何使select2接收ID并提交ID而不是标签名/术语?

$(document).ready(function() {
var lastResults = [];
$("#project_tags").select2({
    multiple: true,
    placeholder: "Please enter tags",
    tokenSeparators: [","],
    initSelection : function (element, callback) {
        var data = [];
        $(element.val().split(",")).each(function () {
            data.push({id: this, text: this});
        });
        callback(data);
    },
    ajax: {
        multiple: true,
        url: "framework/helpers/tags.php",
        dataType: "json",
        data: function(term) {
            return {
                term: term
            };
        },
        results: function(data) {
            return {
                results: data
            };
        }
    },
    createSearchChoice: function(term) {
        var text = term + (lastResults.some(function(r) {
            return r.text == term
        }) ? "" : " (new)");
        return {
            id: term,
            text: text
        };
    },
});
$('#project_tags').on("change", function(e) {
    if (e.added) {
        if (/ \(new\)$/.test(e.added.text)) {
            var response = confirm("Do you want to add the new tag " + e.added.id + "?");
            if (response == true) {
                alert("Will now send new tag to server: " + e.added.id);
                $.ajax({
                    url: 'framework/helpers/tags.php',
                    data: {
                        action: 'add',
                        term: e.added.id
                    },
                    success: function(data) {

                    },
                    error: function() {
                        alert("error");
                    }
                });
            } else {
                console.log("Removing the tag");
                var selectedTags = $("#project_tags").select2("val");
                var index = selectedTags.indexOf(e.added.id);
                selectedTags.splice(index, 1);
                if (selectedTags.length == 0) {
                    $("#project_tags").select2("val", "");
                } else {
                    $("#project_tags").select2("val", selectedTags);
                }
            }
        }
    }
});
}))

这是执行加法的开关的一部分

case 'add':
    if (isset($_GET['term'])) {
        $new_tag = escape($_GET['term']);
        if (Nemesis::insert('tags', 'tag_id, tag_content', "NULL, '{$new_tag}'")) {
            // we need to send back the ID for the newly created tag
            $search = Nemesis::select('tag_id', 'tags', "tag_content = '{$new_tag}'");
            list($tag_id) = $search->fetch_row();
            echo $tag_id;
        } else {
            echo 'Failure';
        }
        exit();
    }
    break;
更新:我做了一些挖掘,让我困惑的是select2输入似乎没有存储标签/术语的相关ID(见下文)。我知道我可以通过成功回调来更改属性,但我不知道要更改什么


正如您所说,您可以替换该值,这就是我的解决方案所做的。如果您搜索Chrome的Element Inspector,您将在Select2字段下方看到一个id为
project_tags
1
height
的输入

奇怪的是,Chrome的element inspector没有显示输入值,如下所示:

但是,您需要执行一个
console.log($(“#project_tags”).val())
输入值(如图所示)

因此,您只需在
$(“#project_tags”).on(“change”)
函数中放置的ajax调用的
success
函数中用id替换新选项的文本即可。
ajax
调用类似于:

$.ajax({
    url: 'framework/helpers/tags.php',
    data: {
        action: 'add',
        term: e.added.id
    },
    success: function(tag_id) {
        var new_val = $("#project_tags")
                        .val()
                        .replace(e.added.id, tag_id);
        $("#project_tags").val(new_val);
    },
    error: function() {
        alert("error");
    }
});
请注意,此解决方案不是防弹的。例如,如果选择了值为
1
的标记,并且用户插入了文本
1
,这将导致问题

也许更好的选择是替换最后一个逗号右边的所有内容。但是,如果允许用户创建带有逗号的标记,即使这样也可能会导致一些问题


如果您需要更多信息,请告诉我。

您说的“在这里做错事”是什么意思?到底发生了什么?在数据选项中,尝试
data:{term:e.added.id,action:'add'}
,然后删除url选项的
?action=add&term='+e.added.id+'
部分。是的。。我这样做了,但又回到了我现在的方式,因为在chrome的devtools中,你可以清楚地看到没有任何东西被添加到url的末尾,因此db(只是发布到tags.php)。但是,它在上面的部分中起作用。您使用的是
类型:“POST”
,这意味着变量不会添加到URL的末尾。相反,在Chrome开发工具中,在ajax调用的“Headers”选项卡下查看,并展开“Form Data”部分以查看文章中传递的术语和操作变量。如果要查看URL中的变量,请使用
键入:“GET”
。另外,在PHP代码中,您似乎正在测试请求是否为GET类型,因此您希望使AJAX调用与该逻辑匹配。@404这是最后一个类:这是类设置:awesome man让它工作了。我明白你的意思,因为它不是防弹的,但发生这些可能性的情况几乎没有。不过如果你能想出一个方法,我可以颠覆它,可能在后端。我愿意接受建议@米尔兹这个问题很老了,但是,如果你有任何与我正在寻找一些kickstart相同的工作示例的话。@米尔兹如果可能的话,你能给我一些建议吗