Saját search api mező hozzáadása + 1 kis drupal diagnosztika

The spam filter installed on this site is currently unavailable. Per site policy, we are unable to accept new submissions until that problem is resolved. Please try resubmitting the form in a couple of minutes.
Kategória: 
Gyorstippek

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

Regards for sharing this

Regards for sharing this fantastic web page.

Keep up the incredible work

Keep up the incredible work !! Lovin' it!

Thanks extremely valuable.

Thanks extremely valuable. Will share site with my good friends.

I appreciate the data on your

I appreciate the data on your web sites. Many thanks.

You're a really practical web

You're a really practical web site; couldn't make it without ya!

Wow, attractive portal. Thnx

Wow, attractive portal. Thnx ...

Simply just needed to state

Simply just needed to state I'm just thrilled that i stumbled upon your web site!|

Great looking internet site.

Great looking internet site. Assume you did a great deal of your very own coding.

Many thanks! It is definitely

Many thanks! It is definitely an great site!

Wow because this is excellent

Wow because this is excellent job! Congrats and keep it up.

Regards for sharing this

Regards for sharing this excellent website.

Wow, stunning portal. Thnx

Wow, stunning portal. Thnx ...

Lovely Web-site, Continue the

Lovely Web-site, Continue the excellent work. Thank you so much!|

I adore this site - its so

I adore this site - its so usefull and helpfull.

You've gotten possibly the

You've gotten possibly the best internet sites.

Very good internet site you

Very good internet site you possess right here.

Your posts is rather useful.

Your posts is rather useful.

Extremely individual friendly

Extremely individual friendly site. Great details offered on couple of clicks.

qczmlit fodboldtrøjer

qczmlit fodboldtrøjer krf58j9th 2tg0lrpc fotbollströjor sd6fmghzn8 kbzv65 fotballdrakter barn 0utna8f 7tai6q49o maglie calcio a poco prezzo 6v5bueo9

7qcgnutzk fodboldtrøjer

7qcgnutzk fodboldtrøjer ibmqfn 528sbl billiga fotbollströjor t0gihk7f enyl1owa2 fotballdrakter barn xo46n8m0w3 r28bsmk9 maglie del calcio zu7tx1n

billiga fotbollströjor

l2dragonwind. mireene.

c-way. sdbreast. articles.

nemoadministrativerecord.

Thanks regarding providing

Thanks regarding providing many of these substantial written content.

qf0z3nti maglie calcio a poco

qf0z3nti maglie calcio a poco prezzo wgt0p6hsk9 yf5v1i0 fodboldtrøjer børn jrd3ek10z m6wx9qk8i fotbollströjor barn jsw3v4f0e5 pau2yf5cxo fotballdrakter mwkfu5pcqh

Maintain the good job and

Maintain the good job and bringing in the crowd!

You've got fantastic thing at

You've got fantastic thing at this point.

Great website! It looks

Great website! It looks extremely professional! Maintain the great work!

Sustain the amazing job !!

Sustain the amazing job !! Lovin' it!

Good day, cool online site

Good day, cool online site you've gotten going here.

brainteaser. telechat.

unisotong.

chilekawaii. guru.

ailaosta. orhideeaspa.

stayhere. myy.at.

clevio. vatal.

orientbeach. cresign.

You're a very helpful

You're a very helpful website; could not make it without ya!

Simply wanted to express I'm

Simply wanted to express I'm grateful I stumbled on your webpage.|

Greetings, cool site you've

Greetings, cool site you've right now.

How are you, cool web site

How are you, cool web site you have got going here.

hakodategagome. naimayy.

Great looking web site. Think

Great looking web site. Think you did a great deal of your very own coding.

bizbkk. stayhere.

langroud118. ankorona.

houseyorgrim. raviraj.

Hozzászólás

A mező tartalma nem nyilvános.
  • Internal paths in double quotes, written as "internal:node/99", for example, are replaced with the appropriate absolute URL or relative path.
  • Engedélyezett HTML elemek: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <del> <img>
  • A webcímek és email címek automatikusan linkekké alakulnak.
  • A sorokat és bekezdéseket a rendszer automatikusan felismeri.
  • Engedélyezett HTML elemek: <a> <blockquote> <br> <cite> <code> <dd> <del> <div> <dl> <dt> <em> <li> <ol> <p> <span> <strong> <ul>
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <bash>, <c>, <cpp>, <drupal5>, <drupal6>, <java>, <javascript>, <mysql>, <php>, <python>, <ruby>, <sql>. The supported tag styles are: <foo>, [foo].
  • Minden email cím át lesz alakítva ember által olvasható módon, vagy (ha a JavaScript engedélyezett) ki lesz cserélve kattintható, de biztonságos hivatkozásra.