Bon, je me suis creusé la cervelle à ce sujet (je suis vraiment terrible), mais j'ai essayé de lire tout ce que je pouvais et je ne peux toujours pas le faire fonctionner.
en essayant de faire autocomplete avec jquery ui
mon json ressemble à ça
{"dealers":
{
"1156":"dealer 1",
"1122":"dealer 2",
"1176":"dealer 3",
"1491":"dealer 4",
"1463":"dealer 5",
"269":"dealer 6"
}
}
j'essaie d'utiliser cette information comme source pour la saisie semi-automatique. L'objet de réponse est correct, j'ai du mal à l'obtenir dans le bon format pour pouvoir placer le "###" dans un champ masqué lié à la "valeur", qui doit être affiché en tant que partie de l'élément. menu déroulant.
été essayé un million de façons différentes, mais une tentative récente était inférieure à
function ajaxCall() {
$.getJSON("/example/location/example.json?term=" + $('#dealerName').val(),
function(data) {
$.each(data.dealers, function(k, v) {
alert(k + ' : ' + v);
});
});
}
$('#dealerName').autocomplete({
source: ajaxCall,
minLength: 2,
delay: 100
});
S'il vous plaît et merci beaucoup!
Vous devez transformer l'objet que vous récupérez dans un tableau au format attendu par jQueryUI.
Vous pouvez utiliser $.map
pour transformer l'objet dealers
dans ce tableau.
$('#dealerName').autocomplete({
source: function (request, response) {
$.getJSON("/example/location/example.json?term=" + request.term, function (data) {
response($.map(data.dealers, function (value, key) {
return {
label: value,
value: key
};
}));
});
},
minLength: 2,
delay: 100
});
Notez que lorsque vous sélectionnez un élément, la "clé" sera placée dans la zone de texte. Vous pouvez changer cela en modifiant les propriétés label
et value
que la fonction de rappel de $.map
renvoie.
Sinon, si vous avez accès au code côté serveur qui génère le JSON, vous pouvez changer la façon dont les données sont renvoyées. Tant que les données:
label
, une propriété value
ou les deux, ouEn d'autres termes, si vous pouvez formater les données comme ceci:
[{ value: "1463", label: "dealer 5"}, { value: "269", label: "dealer 6" }]
ou ca:
["dealer 5", "dealer 6"]
Ensuite, votre JavaScript devient beaucoup plus simple:
$('#dealerName').autocomplete({
source: "/example/location/example.json"
});
Je comprends que sa été déjà répondu. mais j'espère que cela aidera quelqu'un à l'avenir et fera économiser beaucoup de temps et de douleur.
le code complet est ci-dessous: Celui que j'ai créé pour une zone de texte afin de le compléter automatiquement dans CiviCRM. J'espère que ça aide quelqu'un
CRM.$( 'input[id^=custom_78]' ).autocomplete({
autoFill: true,
select: function (event, ui) {
var label = ui.item.label;
var value = ui.item.value;
// Update subject field to add book year and book product
var book_year_value = CRM.$('select[id^=custom_77] option:selected').text().replace('Book Year ','');
//book_year_value.replace('Book Year ','');
var subject_value = book_year_value + '/' + ui.item.label;
CRM.$('#subject').val(subject_value);
CRM.$( 'input[name=product_select_id]' ).val(ui.item.value);
CRM.$('input[id^=custom_78]').val(ui.item.label);
return false;
},
source: function(request, response) {
CRM.$.ajax({
url: productUrl,
data: {
'subCategory' : cj('select[id^=custom_77]').val(),
's': request.term,
},
beforeSend: function( xhr ) {
xhr.overrideMimeType( "text/plain; charset=x-user-defined" );
},
success: function(result){
result = jQuery.parseJSON( result);
//console.log(result);
response(CRM.$.map(result, function (val,key) {
//console.log(key);
//console.log(val);
return {
label: val,
value: key
};
}));
}
})
.done(function( data ) {
if ( console && console.log ) {
// console.log( "Sample of dataas:", data.slice( 0, 100 ) );
}
});
}
});
Code PHP sur la façon dont je renvoie des données à cet appel jquery ajax en saisie semi-automatique:
/**
* This class contains all product related functions that are called using AJAX (jQuery)
*/
class CRM_Civicrmactivitiesproductlink_Page_AJAX {
static function getProductList() {
$name = CRM_Utils_Array::value( 's', $_GET );
$name = CRM_Utils_Type::escape( $name, 'String' );
$limit = '10';
$strSearch = "description LIKE '%$name%'";
$subCategory = CRM_Utils_Array::value( 'subCategory', $_GET );
$subCategory = CRM_Utils_Type::escape( $subCategory, 'String' );
if (!empty($subCategory))
{
$strSearch .= " AND sub_category = ".$subCategory;
}
$query = "SELECT id , description as data FROM abc_books WHERE $strSearch";
$resultArray = array();
$dao = CRM_Core_DAO::executeQuery( $query );
while ( $dao->fetch( ) ) {
$resultArray[$dao->id] = $dao->data;//creating the array to send id as key and data as value
}
echo json_encode($resultArray);
CRM_Utils_System::civiExit();
}
}
J'utilise ce script pour l'auto-complétion ...
$('#custmoers_name').autocomplete({
source: function (request, response) {
// $.getJSON("<?php echo base_url('index.php/Json_cr_operation/autosearch_custmoers');?>", function (data) {
$.getJSON("Json_cr_operation/autosearch_custmoers?term=" + request.term, function (data) {
console.log(data);
response($.map(data, function (value, key) {
console.log(value);
return {
label: value.label,
value: value.value
};
}));
});
},
minLength: 1,
delay: 100
});
Mon retour json: - [{"label":"Mahesh Arun Wani","value":"1"}]
après la recherche m
mais il affiche dans la liste déroulante [object object]
...