Taxonomy Autocomplet az elejétől

szt képe

A core taxonomy autocomplet widget views felfedett szűrője alapból "csak" a szabadszavas keresést támogatja, ami jó dolog, de mondjuk ha egy településneveket tartalmazó szótárból választana a user, akkor a begépelt pár karakterrel kezdődő városokat szeretné látni, nem pedig a begépelt karaktereket tartalmazókat.
Lenne egy jó kis modul erre, de egyenlőre sajnos nem működik megfelelően.
Tudnátok erre valami más modult, amiben benne van ez a funkcionalitás?

Drupal verzió: 
eMeLA képe

Nem tudom, hogy saját minimodul is számításba jöhet-e, mert az autocomplete igen egy jószág:

Ha belenézel ebbe:
http://api.drupal.org/api/drupal/modules!taxonomy!taxonomy.pages.inc/fun...

Akkor látod, hogy az adatbázisban így keres a taxonomy autocomplete: ->condition('t.name', '%' . db_like($tag_last) . '%', 'LIKE')

Neked pedig ez kell: ->condition('t.name', db_like($tag_last) . '%', 'LIKE')

Ezt úgy tudod megcsinálni saját minimodulban, hogy bemásolod a modulodba a taxonomy_autocomplete()-et és átnevezed SAJÁTMODUL_autocomplete()-re.
Benne átírod a fent említett sort.

Kell még egy hook_menu() az alábbi menüvel:

$items['AKÁRMI/autocomplete'] = array(
'title' => 'Saját autocomplete taxonomy',
'page callback' => 'SAJÁTMODUL_autocomplete',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
'file' => 'taxonomy.pages.inc',
);

Ezután kell egy hook_form_alter()

Amiben az adott form-nál a taxonomy fieldednél az #autocomplete_path értékét átállítod AKÁRMI/autocomplete -re.

Ezután már a te autocomplete keresésed fog működni.

(Az autocomplet használati igen egyszerű, és akármilyen textfield pár soros saját modullal könnyen átalakítható)

1
0

...mit tudok: http://web.termuves.hu

szt képe

Köszi a segítséget!
Legyártottam a saját modult, de valami nem stimmel így.
A taxonomy.pages.inc fájlt a minimodul könyvtárában keresi:

  1. An AJAX HTTP error occurred.
  2. HTTP Result Code: 200
  3. Debugging information follows.
  4. Path: http://pmek.hu.loc/ta2/autocomplete
  5. StatusText: OK
  6. ResponseText: Fatal error: require_once(): Failed opening required '/media/windows-share/pmekhu/sites/all/modules/custom/taxonomyautocomplete2/taxonomy.pages.inc' (include_path='.:/usr/share/php:/usr/share/pear') in /media/windows-share/pmekhu/includes/menu.inc on line 514
0
0
eMeLA képe

Ööööö. Ez a sor nem kell. Nem tudom miért raktam bele...

'file' => 'taxonomy.pages.inc',
0
0

...mit tudok: http://web.termuves.hu

szt képe

Így eltűnt a hibaüzenet, de semmi találatot nem ad vissza...
Viszont van egy gyanúm: kiderítettem, hogy nem a core taxonomy.pages.inc-ben lévő funkció hívódik meg, hanem a sites\all\modules\views\includes\ajax.inc-ben lévő views_ajax_autocomplete_taxonomy().
(az #autocomplete_path értéke, amit le kellene cserélnem, az ez: admin/views/ajax/autocomplete/taxonomy/5)
Ha ez igaz, akkor hogy épüljek be a viewsba?

0
0
eMeLA képe

Beépülni a hook_form_alter()-ban kell. Ott nézd meg melyik id-jű form kell neked. Ha a neked tetsző form hívódik meg, akkor hozzáadod (vagy felülírod) a #autocomplete_path értéket, a te útvonaladdal 'AKÁRMI/autocomplete'. Ezután a hook_menu()-ben megadott SAJÁTMODUL_autocomplete() függvényhívás fog lefutni autocomplete lekéréskor.

Azt a részt nem tudom, hogy a views_ajax_autocomplete_taxonomy() kell-e neked, de ha az, akkor annak a tartalmát másold a SAJÁTMODUL_autocomplete() függvényedbe és ott módosítsd.

0
0

...mit tudok: http://web.termuves.hu

szt képe

Most itt tartok:
- ha átmenetileg meghekkelem a viewst, akkor működik :)
- viszont saját modulban nem megy (a hook_menu oké, a hook_form_alter is oké, szóval az értékek megváltoznak rendben)

  1. /**
  2.  * Implements hook_menu().
  3.  */
  4. function taxonomyautocomplete2_menu() {
  5. $items['ta2/autocomplete'] = array(
  6. 'title' => 'Custom autocomplete taxonomy',
  7. 'page callback' => 'taxonomyautocomplete2_autocomplete',
  8. 'access arguments' => array('access content'),
  9. 'type' => MENU_CALLBACK,
  10. );
  11. return $items;
  12. }
  13.  
  14. /**
  15.  * Implements hook_form_alter().
  16.  */
  17. function taxonomyautocomplete2_form_alter(&$form, &$form_state, $form_id) {
  18. switch ($form_id) {
  19. case 'views_exposed_form':
  20. $form['field_telepules_tid']['#autocomplete_path'] = 'ta2/autocomplete';
  21. break;
  22. }
  23. }

Viszont a json, amit visszaad, az üres.

Ha beírom a böngészőbe az eredeti útvonalat mondjuk "buda" kereséssel:

  1. http://localhost/admin/views/ajax/autocomplete/taxonomy/5/buda

, akkor szépen visszaadja a találatokat:

  1. {"Budajen\u0151":"Budajen\u0151","Budakal\u00e1sz":"Budakal\u00e1sz","Budakeszi":"Budakeszi","Buda\u00f6rs":"Buda\u00f6rs","Budapest":"Budapest"}

De a módosított utvonalam üreset ad:

  1. http://localhost/ta2/autocomplete/buda

Biztos jó az új útvonal így? Az eredeti útvonalban benne van a taxonomy/5, ami a szűrendő szótár. Az új útvonal honnan tudja, hogy miben kell keresni?
Nem kell valahogy beleheggeszteni abba is a szótár útvonalát?

0
0
eMeLA képe

Mi van a taxonomyautocomplete2_autocomplete() függvényben?
Merthogy amikor használod az autocomplet mezőt, akkor ez hívja meg. És ez adja vissza az eredményt.

0
0

...mit tudok: http://web.termuves.hu

szt képe

A lenti függvény van benne, amit a sites\all\modules\views\includes\ajax.inc-ből másoltam ki (ha ebben a fájlban hekkeletem meg, akkor működött a funkció)

  1. function taxonomyautocomplete2_autocomplete($vid, $tags_typed = '') {
  2. // The user enters a comma-separated list of tags. We only autocomplete the last tag.
  3. $tags_typed = drupal_explode_tags($tags_typed);
  4. $tag_last = drupal_strtolower(array_pop($tags_typed));
  5.  
  6. $matches = array();
  7. if ($tag_last != '') {
  8.  
  9. $query = db_select('taxonomy_term_data', 't');
  10. $query->addTag('translatable');
  11. $query->addTag('term_access');
  12.  
  13. // Do not select already entered terms.
  14. if (!empty($tags_typed)) {
  15. $query->condition('t.name', $tags_typed, 'NOT IN');
  16. }
  17. // Select rows that match by term name.
  18. $tags_return = $query
  19. ->fields('t', array('tid', 'name'))
  20. ->condition('t.vid', $vid)
  21. ->condition('t.name', db_like($tag_last) . '%', 'LIKE')
  22. ->range(0, 10)
  23. ->execute()
  24. ->fetchAllKeyed();
  25.  
  26. $prefix = count($tags_typed) ? drupal_implode_tags($tags_typed) . ', ' : '';
  27.  
  28. $term_matches = array();
  29. foreach ($tags_return as $tid => $name) {
  30. $n = $name;
  31. // Term names containing commas or quotes must be wrapped in quotes.
  32. if (strpos($name, ',') !== FALSE || strpos($name, '"') !== FALSE) {
  33. $n = '"' . str_replace('"', '""', $name) . '"';
  34. }
  35. // Add term name to list of matches.
  36. $term_matches[$prefix . $n] = check_plain($name);
  37. }
  38. }
  39.  
  40. drupal_json_output($term_matches);
  41. }
0
0
eMeLA képe

Ennek a függvénynek a saját modulodba kell lennie. És úgy módosítod ahogy akarod, a lényeg, hogy a visszaadott érték olyan legyen amit te szeretnél.

0
0

...mit tudok: http://web.termuves.hu

szt képe

Természetesen már az elejétől fogva a saját modulomban van, a fenti két függvénnyel együtt. A probléma az, hogy nem ad vissza találatot.

0
0