Early Bird Registration for DrupalCon Portland 2024 is open! Register by 23:59 PST on 31 March 2024, to get $100 off your ticket.
By netron on
Hello,
I'm currently building an autocomplete text field with a twist - it will be querying an OpenX database in order to retrieve a list of previous advertisers or agencies
i have a "netron.module" and here's the relevant code
// hook_menu implementation
function menu_menu()
{
$items["netron/autocomplete"] = array(
'title' => 'Autocomplete for agencies',
'page_callback' => 'netron_agency_autocomplete',
'access_callback' =>TRUE,
'access arguments' => array('access content'),
'type' => MENU_CALLBACK
);
}
// implement hook_form_alter. turns a text field into an autocomplete text field
function netron_form_alter(&$form, $form_state, $form_id)
{
if ($form_id == "netron_node_form")
{
$form['field_agency']=array(
'#type'=>'textfield',
'#title'=>t('Agency'),
'#size'=>30,
'#maxlength'=>64,
'#autocomplete_path' =>'netron/autocomplete'
);
}
// retrieves an array of agency names from an openx database
function netron_agency_autocomplete()
{
/* openx db connection stuff here... your mileage may vary */
$matches = array();
$result = mysql_query("SELECT name FROM ox_agency where LOWER(name) LIKE LOWER('%s%%')");
while ($row=mysql_fetch_object($result) )
{
$matches[$row->name] = check_plain($row->name);
}
print drupal_to_js($matches);
}
the problem is that the agency field on netron_node_form does turn into an autocomplete - but throws an error ,as it can't find the path
netron/autocomplete
so its not even getting to doing a function callback. is there something that i'm missing from the above code?
Comments
function menu_menu() is a
function menu_menu() is a typo
it's actually
function netron_menu()
new version of hook_menu :
new version of hook_menu : note that there are now no underscores in "page callback" or "access callback"
added return $items;
function netron_menu()
{
$items["netron/autocomplete"] = array(
'title' => 'Autocomplete for agencies',
'page callback' => 'netron_agency_autocomplete',
'access callback' =>TRUE,
'access arguments' => array('access content'),
'type' => MENU_CALLBACK
);
return $items;
}
got this working. had to
got this working.
had to visit
admin/build/modules
then back to my module form - and it worked.
however the autocomplete is returning all agency names, so the SQL query needs something passed into it...
altered autocomplete dbase
altered autocomplete dbase function:
function netron_agency_autocomplete($field_agency='')
{
mysql_pconnect("host","user","pwd");
mysql_query("USE openxbeta");
$matches = array();
if($field_agency) {
$result = mysql_query("SELECT name FROM ox_agency where LOWER(name) LIKE LOWER('%$field_agency%')");
while ($row=mysql_fetch_object($result) )
{
$matches[$row->name] = check_plain($row->name);
}
}
drupal_json($matches);
exit;
}
autocomplete on a text field now works flawlessly.
Special case ?
I finally figure out what went wrong (thanks to your code netron !)
My autocomplete function receive 2 parameters, the first one is "autocomplete" (and stays so, whatever I do!) and the second one is the "textfield" value on which I bound the autocomplete (the $field_agency in netron's case).
I don't really know why it behave like that... maybe because the path is mySearch/autocomplete so the "autocomplete" part is handled by Drupal as a the first "page parameter"... anyways, if it can help someone figure out why it is always searching for the "autocomplete" keyword, this may be your answer :-)
Yea, admin/build/modules
Yea, admin/build/modules worked for me too. Thanks for that tip... I was going out of my mind working on a solution.
__________
Regards,
Chad Hester
<?php
I had to add the 0 index for my Drupal 6.6 with CCK 2.0 install. Maybe you guys are using CCK 1.x?
Final code for Drupal 6 and CCK 2
j0rd, could you paste the final code for autocomplete fields that works in Drupal 6 and CCK2?
Thanks
Thanks netron and every one who posted cmments to this topic
Hi,
I use this in my one project and I am very thankful to all of you for such a nice help....!
plz see my code and help me....
below is my form and the autocomplete function, it is just not working in drupal6...plz teme the error....
function recipe_search_menu() {
$items = array();
$items["recipe_search/autocomplete"] = array(
'title' => 'recipe search category autocomplete',
'page_callback' => 'recipe_search_autocomplete',
'access_callback' =>TRUE,
'access arguments' => array('access content'),
'type' => MENU_CALLBACK
);
return $items;
}
//////////////////////////////
function recipe_search_form(){
$form = array();
$form['recipe_search']['title'] = array(
'#title' => t('recipe title'),
'#type' => 'textfield',
);
$form['recipe_search']['category'] = array(
'#title' => t('Category'),
'#type' => 'textfield',
'#autocomplete_path' => 'recipe_search/autocomplete',
);
$form['recipe_search']['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
return $form;
}
//////////////////////
function recipe_search_autocomplete() {
$matches = array();
$result = mysql_query("SELECT * FROM {term_data} WHERE vid=2");
while ( $row=mysql_fetch_object($result) )
{
$matches[$row->name] = check_plain($row->name);
}
print drupal_to_js($matches);
exit();
}
Its a bit late, but....
Since ashiali posted her query about a year ago, she must most definitely have figured out a solution. I'm still posting here since it might help others who stumble upon this post -
The following lines
should be as follows (notice the removal of underscores in page_callback and access_callback) -
A similar post/query - http://drupal.org/node/740974
Following errors i can see 1>
Following errors i can see
1> Menu name function is not correct it should be netron_menu()
2> In autocomplete function at last use only drupal_jason($matches) nor print drupal_jason($matches)
3> String is not passed to autocomplete function how u will search?
:)