No ez megint amolyan nagy tömegeket érintő szösszenet lesz, de miután fél óra debugolás után jöttem rá, hogy miújság, gondoltam megspórolom magamnak (meg hátha azért másnak is..) egy következő fél órát.
A helyzet a kövi: Search Api által hajtott okos keresőt kell csinálni, amelynek az egyik sorrendezési módja: A legtöbbet kapott szavazat. A szavazáshoz a drupal.hu is látott Vote Up/Down modult használom, ami a votingapira épít.
Feladat: Etessük meg az entitásokra adott szavazatértékeket a search apival.
Igazából baromi egyszerű a dolog: Az Entity API a drupal gyári entitás paramétereit ki tudja egészíteni bizonyos adatokkal, jellemzőkkel (magyarul property), amit aztán különböző modulok okosan felhasználhatnak, mint például a rules, vagy a search api.
Tehát az első része, hogy adjunk hozzá egy ilyen jellemzőt:
[geshifilter-drupal6]/** * Implements hook_entity_property_info_alter(). */ function MODULOM_hook_entity_property_info_alter(&$info) { $info['node']['properties']['voting_results'] = array( 'type' => 'integer', 'label' => t('Votes for a node'), 'sanitized' => TRUE, 'getter callback' => 'MODULOM_get_search_api_votes', ); }[/geshifilter-drupal6]
A sokatmondó 'getter callback' jelenti azt a függvényt, amellyel az adott értéket elő kell túrni valahonnan. Esetünkben ez egy szimpla lekérdezés a votingapi_cache táblából:
[geshifilter-drupal6]function MODULOM_get_search_api_votes($item) { $results = db_query('SELECT value FROM {votingapi_cache} WHERE entity_id = :nid AND function = :function', array( ':nid' => $item->nid, ':function' => 'sum' )); $result = $results->fetchField(); return $result; }[/geshifilter-drupal6]
Ezután egy gyorstárürítés, és már látszik is a search api indexbeállító felületén az új mezőnk, csak bepipáljuk, majd újraépítjük az indexet.
Mondhatnánk, hogy készen vagyunk, de itt jön a bibi, ami miatt az a plusz fél óra becsúszott: Az entity apinak ugyan megmondjuk, hogy helló, itt egy property, itt egy getter callback, viszont az már teljes mértékben az entity apit használó modulra van bízva, hogy hogyan, mikor használja fel ezt az adatot.
Miután nálam baromira nem akart összejönni a szavazatok szerinti sorrendezés, elkezdtem nézegetni, hogy ugyan mikor hajlandó az én kici MODULOM_get_search_api_votes függvényem lefutni. Nos, akárhogyan, akármilyen oldalról rugdostam, csak nem akart megállni az xdebug.
Nosza, elkezdtem visszakövetni, hogy egyáltalán hogyan épül fel a search api lekérdezése. Ehhez a search api dokumentációjában kiszúrtam egy hookot, ami feltételezéseim szerint mindenképpen le kell fusson: ez pedig a hook_search_api_query_alter().
El is csíptem, szépen megállt az xdebug. Itt már látszott, hogy a SearchApiQuery->preExecute metódusa hívta meg az alterünket, ott is van benne: drupal_alter('search_api_query', $this); (nem mintha nem lett volna egyszerűbb rákeresni a 'search_api_query' stringre a modul fáljaiban, na mindegy..)
Ebből adódik, hogy kell lennie egy SearchApiQuery->Executenek is, ott is van benne:
[geshifilter-drupal6]// Execute query. $response = $this->index->server()->search($this);[/geshifilter-drupal6]
Itt gyakorlatilag szépen ellépegettem egészen a search metódusig, ahol maga a kereső query felépül. Soronként lépegetve a kóddzsumbujban kezdtek összeállni a változók, mígnem megláttam egy $valamilyen_valtozo['base_table']['search_api_db_default_node_index_voting_results'].
Hopppá! Hát itten kérem minden indexelt mezőnek saját táblája van!
Gyorsan belenéztem a táblába, és láttam, hogy ott vannak rossz értékek. Az már sanszos volt, hogy ezek a táblák index épüléskor frissülnek, úgyhogy újraindexeltem a keresést, és el is akadt az xdebug a MODULOM_get_search_api_votes() függvénynél egyből. Miután az egykarakteres typot már korábban kijavítottam, szépen feltöltődött az index - immár a jó értékekkel, és máris működött a szavazatok szerinti sorrendezés.
Tulajdonképpen baromi jók ezek az xdebugos diagnosztikák. Picit legalább sikerült megérteni a search api logikáját, legközelebb már gyorsabban eltalálom, hogy hová kell nyúlni, ha valami nem ok.
Hozzászólások
Dee Shackle
Dee Shackle
ivermectin lotion 0.5 -
ivermectin lotion 0.5 - http://stromectopl.com/ ivermectin for sale
ivermectin price uk -
ivermectin price uk - http://ivermectipl.com/ ivermectin for sale
Five Way Valve Price
Five Way Valve Price
100 A4 Laminating Pouches
100 A4 Laminating Pouches
provigil generic
provigil generic http://provipls.com/ provigil 100 mg Tijsfm iaqyms
provigil a drug
provigil a drug http://modafinipls.com/ provigil a stimulant Yvqnpc ecpofl
help with essay writing
help with essay writing http://ivermectinpls.com/ top essay writers Mkssbb vappcg
Amorphous Core Reactor Core
Amorphous Core Reactor Core
affordable thesis writing
affordable thesis writing http://geivermectin.com/ how to write an essay about my life Mjoali xnuice
affordable thesis writing
affordable thesis writing http://boessay.com/ online assignment writer Bwdjzz zadipa
gambling casino online
gambling casino online http://cacinobz.com/ play casino online Ztamuj mepktp
real casinos online no
real casinos online no deposit http://cacinowina.com/ empire city casino online Sqfntb wenpvy
New Boot
New Boot
online assignment help
online assignment help http://wrtessay.com/ buy dissertation online Fxrxfj bjjuxz
Cnc Machines For Iron
Cnc Machines For Iron Fittings
Fabric Dining Dining Chair
Fabric Dining Dining Chair
write research papers
write research papers http://essaywrw.com/ purchase term paper Ljotyc asshvq
Gusseted Resealable Bags
Gusseted Resealable Bags
China Menthol Skin Care
China Menthol Skin Care
Front Open Led Sign
Front Open Led Sign
Hydraulic Hammer For Backhoe
Hydraulic Hammer For Backhoe
Fashion Watch
Fashion Watch
Agriculture Net
Agriculture Net
ディオールネックレスコピー Door Air
ディオールネックレスコピー
Door Air Curtain
Pex Irrigation
Pex Irrigation Fittings
コピーブランド
コピーブランド服メンズ Classic Truck
コピーブランド服メンズ
Classic Truck Parts
buy tadalafil
buy tadalafil http://edpll.com/ pay for assignments australia Rwqixc kbstkf
200mg cialis generic
200mg cialis generic http://ciapili.com/ need a paper written Pusnzv bsuumv
ブランドバッグ偽物 Hose Quick
ブランドバッグ偽物
Hose Quick Connector Price
グッチ財布コピー通販店 China Grinding
グッチ財布コピー通販店
China Grinding Disc
クロエサングラススーパーコピー通販店 Ceramic
クロエサングラススーパーコピー通販店
Ceramic Belt Supplier
buy ampicillin
buy ampicillin http://abiotab.com/ writing a paper Xkxcjp oebwzp
buy roxithromycin generic
buy roxithromycin generic http://antibitc.com/ help me write a research paper Uufkxa azlmwl
buying essays
buying essays http://writexessays.com/ college paper help Pvqvmt akqsyr
1000 degrees fire resistant
1000 degrees fire resistant sleeve
ブランドストール/スカーフスーパーコピー通販店
essays for sale online
essays for sale online http://payxessays.com/ essay helpers Campxi divicu
シャネル時計コピー代引き 4k Wireless
シャネル時計コピー代引き
4k Wireless Video Transmission
casino games online
casino games online http://realgamescas.com/ affordable essays Zgnoeh unqokm
13 Years Experience
13 Years Experience Manufacture
セリーヌサングラススーパーコピー
canadian online pharmacy
canadian online pharmacy http://strongpha.com/ buying a research paper for college Ngjpdn ueztjw
Hose For Radiator
Hose For Radiator Price
バレンシアガ財布ブラントコピー代引き
impotence pills
impotence pills http://strongplled.com/ academic writing terms Zfjqhf opnpuy
erectile dysfunction pills
erectile dysfunction pills http://pllsed.com/ help writing papers Naegos ilumcu
Ffp2 Protection サンローラン財布コピー品
Ffp2 Protection
サンローラン財布コピー品
スーパーコピーブランド通販 Cordless Hair
スーパーコピーブランド通販
Cordless Hair Trimmer
sildenafil for sale
sildenafil for sale http://viagarar.com/ teach me how to write an essay Jiyece ydagnu
Hdmi Extender Near
Hdmi Extender Near Me
セリーヌピアススーパーコピー激安
costco online pharmacy
costco online pharmacy http://edsilap.com/ academic writing service Aeljls tzweor
N級品グッチバッグコピー 6d15t Cylinder
N級品グッチバッグコピー
6d15t Cylinder Liner
Hozzászólás