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

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

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

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

online assignment help

online assignment help http://wrtessay.com/ buy dissertation online Fxrxfj bjjuxz

Cnc Machines For Iron

Fabric Dining Dining Chair

write research papers

write research papers http://essaywrw.com/ purchase term paper Ljotyc asshvq

Gusseted Resealable Bags

China Menthol Skin Care

Front Open Led Sign

Hydraulic Hammer For Backhoe

Fashion Watch

Agriculture Net

ディオールネックレスコピー Door Air

Pex Irrigation

コピーブランド服メンズ Classic Truck

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

グッチ財布コピー通販店 China Grinding

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

essays for sale online

essays for sale online http://payxessays.com/ essay helpers Campxi divicu

casino games online

casino games online http://realgamescas.com/ affordable essays Zgnoeh unqokm

canadian online pharmacy

canadian online pharmacy http://strongpha.com/ buying a research paper for college Ngjpdn ueztjw

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

sildenafil for sale

sildenafil for sale http://viagarar.com/ teach me how to write an essay Jiyece ydagnu

Hdmi Extender Near

costco online pharmacy

costco online pharmacy http://edsilap.com/ academic writing service Aeljls tzweor

N級品グッチバッグコピー 6d15t Cylinder

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.