Koncepcionális kérdés: publikációk szerzői

ipeto képe

Sziasztok!

Most éppen egy olyan feladaton dolgozom, ahol publikációkat rögzítünk és már rögtön a szerzők kezelése kapcsán akadnak gondok. Találtam egy honlapot, amit drupalban fejlesztettek, kérdés, hogy vajon hogyan rakhatták össze a szerzős részét. Lásd pl. itt: http://www.bmj.com/content/350/bmj.h2747
Amit tudni illenék a honlapnak:

  1. Központilag rögzítük az adatokat, tehát nem a szerzők töltik fel magukat.
  2. Szerzők alapadatainak kezelése: név, email, beosztás, munkahely
  3. Szerzői "aliasok" kezelése: pl. ha valaki megházasodik, új nevet vesz fel, akkor összeköthető legyen a régi neve az újjal és a teljes munkássága lekérdezhető legyen. Például úgy, mint a fenti honlapon oldalt az "Author citation" menüben.
  4. Az oldal magyar és angol nyelvű, így jó lenne, ha kezelné a vezeték- és utónév eltérő sorrendjét.
  5. Nem életbe vágó, de érdekelne, a példában hogyan jelenítik meg a szerzők munkahelyeit ("Author affiliations" pont): Gondolom, valamilyen tartalomtípusban szerzőnként rögzítik, viszont a felületen csak a szükséges minimumot mutatják meg. Tehát ha egy munkahelyen többen dolgoznak, az csak egyszer jelenik meg. Létrehozható ez a sztenderd modulokkal vagy valami egyedit írhattak hozzá?

Ezek alapján a következőkre jutottam:

  • Az 1. ponthoz adekvátnak látszik egy külön Szerző tartalomtípus, amit mondjuk egy node reference mezővel kapcsolunk a Publikáció-hoz.
  • Viszont a 2. feltétel miatt ez mégsem elegendő: Vagy az van, hogy mégis a Publikáció tartalomban szerepelnek a szerzők akuális törzsadatai (ez így elég redundáns adatrögzítés) és vagy egy taxonómiaszótárból vagy egy minimáladatokat tartalmazó Szerző tartalomtípusból kapcsolok mindegyik szerzőhöz egy "törzs-szerzőt", ami alapján történik az egyes emberek munkásságának lekérdezése. Tehát a fenti példánál maradva ezek a "törzs-szerzők" szerepelnének oldalt az "Author citation" menüben.
    A másik ötletem, hogy a Szerző tartalomtípusban van az összes törzsadat - így minden emberhez annyi node tartozik, ahányszor csak változnak az adatai (neve, munkahelye...). Itt is kell valamilyen referencia mező, amivel összekötjük az egy emberhez tartozó Szerző-nodeokat. Ebben az esetben gondolom, Page managerrel lehet összelegózni az publikáció lapját az összekapcsolat adatokból.
  • A 4. pontra ötletem sincs.

Szóval ha valakinek lenne javaslata, melyik megoldás tűnik jobbnak, azt örömmel fogadom.

Melyik modulhoz, modulokhoz kapcsolódik a téma?: 
Drupal verzió: 
Fórum: 
aboros képe

jók a kérdések, nem tudok konkrét válaszokat adni, viszont ha nem ismered, esetleg próbáld ki a biblio modult. az direkt ilyen tudományos publikáció tár létrehozására van, szerzőkezeléssel meg egy rakás ebben a világban követelmény dologgal. elég vegyes tapasztalataink vannak vele, de végülis teszi a dolgát. nagyon sok szerzőnél és publikációnál akadhatnak vele teljesítmény gondok azért.

egyel komolyabb megoldás, ha valamilyen direkt erre való szoftvert használsz és azt "csak bekötöd" a drupalba. mi erre fogunk menni valószínűleg és elhagyjuk a bibliot. egyik ilyen nyílt forrású profi publikációkezelő szoftver a dspace (http://www.dspace.org) ez elvileg minden ilyen könyvtáros-akadémista igényt kielégít, direkt erre van. van rá egy drupal modul, amivel feeds segítségével tudod drupalba átemelni a dspaceben tárolt adatokat. (https://www.drupal.org/project/dspace) sajnos még nem volt időm rendesen kipróbálni, de minden jel arra mutat, hogy ez egy jobb irány lesz.

nulláról, egyszerű drupal építőelemekből ilyet összerakni szerintem őrületes horror lesz.

2
0

-
clear: both;

ipeto képe

Köszönöm, ez a dspace-es megoldás mindenképpen érdekes, ki fogom próbálni. De azért még kicsit próbálkozok, ebben az esetben nem kell annyira bonyolult rendszer, mint a mintában.

Viszont lenne egy konkrétabb kérdésem az utolsó problémához (szerzők és munkahelyeik): Viszonylag kézenfekvőnek tűnik, hogy egy nézettel gyűjtsük össze adott cikkhez tartozó szerzőket és munkahelyeket. Ám a kapott eredmény nem jó, ugye ki kell válogatni az egyedi munkahelyeket, ezeket kis lábjegyzetként hozzárendelni a szerzőkhöz stb. Namost azt gondolom, hogy php-ban össze tudom ezt legózni, nade hol? Be lehetne tenni a nézet láblécébe és elrejteni a mezőket, de ez elég gány megoldás.

Aztán lehetne hozzá írni egy kis modult - akár nézet-alapon, akár valahogy máshogy (pl. valahogy így) lekérdezni a reference-mezőt -, ennél viszont az a problémám, hogyan tudom a modul eredményét beilleszteni mondjuk Page Manager segítségével az adott oldalba.

0
0
aboros képe

több ponton is meg tudod variálni egy nézet kimenetét, például ahogy van node.tpl.php, úgyanúgy van a nézeteknek is tpl -je. minden mezőnek is van. ezeket a sminkben implementálva variálhatod, ahogy bármilyen tplt. persze nem itt kéne ezt csinálni az utolsó lépésben, hanem korábban. (csak hogy itt legyen, aminek tpl -je van, annak preprocess -e is, amit a template.php -ban megvalósítva piszkerálhatod a tplnek átadott változókat)

egész véletlenül, szerencsére, ;) a views ad neked hurkokat amikkel módosíthatod a nézetet modulból. legelőször a lekérdezés futtatása előtt a hook_views_query_alter -el tudod módosítani a konkrét sql lekérdezést pont még mielőtt lefutna. én nagyon nem vagyok feketeöves sql ninja, de ha te az vagy, vagy van egy kéznél, akkor érdemes ezt megnézni.

egy másik hurok a hook_views_pre_render. ez akkor hívodik meg, mikor már a nézet teljesen készen áll a renderelésre. a lekérdezés lefutott, és sok más is, ez az utolsó lépés ahol belepiszkálhatsz, mielőtt a "sminkrétegbe kerülne" a végeredmény. ha minden kötél szakad, ebben a hurokban bármit csinálhatsz a nézet eredményével még mielőtt renderelődne. átrendezheted, csoporthosíthatod, bármi, variálod a $view->result és amit "hagysz" benne az renderelődik. (megkapják az első bekezdésben írt preprocessek, melóznak vele és átadják az eredményt a tplnek ami "kiprinteli")

1
0

-
clear: both;

ipeto képe

Köszi szépen, nagy részével készen is vagyok a views_pre_render segítségével. Viszont egy nagy lépés még hibádzik: Hogyan lehetne teljesn átírni a $view->result-ot? Kiindulásként a tömbben ugye vannak elemek, pl.:

  • Kiss Anna
    BME
  • Nagy Attila
    ELTE
  • Kovács Eszter
    BME

Ebből kellene ilyet csinálni:

  • Kiss Anna 1
  • Nagy Attila 2
  • Kovács Eszter 1
  1. BME
  2. ELTE

Az első részről még csak el tudom képzelni, hogy létrejön a $view->result megfelelő elemének az átírásával, nade az intézmények felsorolása? Abban a sorok nem feltételnül feleltethetők meg a nézet sorainak.

0
0
aboros képe

a $view->result egy "szabványos" render array. bármit írhatsz bele, ha rendes render array formában van, lerenderelődik szépen. nézz utána hogy néz ki egy lista render arrayben és pakolj olyat a resultba pluszba.

0
0

-
clear: both;

ipeto képe

A views_pre_render-rel képtelen vagyok megoldani. Egyelőre erre jutottam:

  1. function mymodule_views_pre_render (&$view) {
  2.  
  3. if ($view->name == 'publi_author_views' && $view->current_display == 'panel_pane_1') {
  4.  
  5. $workplaces = array();
  6. $workplaces_clean = array();
  7. $workplace_display = "";
  8. $workplace_count = "1";
  9. $author_display = "";
  10.  
  11. foreach($view->result as $authors) {
  12. $workplace = $authors->field_field_publi_workplace[0]['rendered']['#markup'];
  13. $workplaces[] = $workplace;
  14. }
  15.  
  16. unset($authors);
  17. unset($workplace);
  18.  
  19. $workplaces_clean = array_unique($workplaces);
  20.  
  21. foreach($workplaces_clean as $wp_clean) {
  22. foreach($view->result as $authors) {
  23. $author = $authors->node_title;
  24. $workplace = $authors->field_field_publi_workplace[0]['rendered']['#markup'];
  25.  
  26. if ($wp_clean == $workplace) {
  27.  
  28. $authors->node_title = $author." <sup>".$workplace_count."</sup>";
  29.  
  30. $authors->field_field_fake_title[0]['rendered'] = array(
  31. '#markup' => $author." <sup>".$workplace_count."</sup>",
  32. '#access' => TRUE,
  33. );
  34. }
  35.  
  36. }
  37.  
  38. //$workplace_display .= "<sup>".$workplace_count."</sup> ".$wp_clean;
  39. $workplace_count = $workplace_count+1;
  40. }
  41. }
  42. }

Elsőként a nevek utáni kis felsőindexet nem tudom így odarakni. Próbáltam úgy, hogy átírom az $authors->node_title értékét, viszont ezt nem tudom rávenni, hogy elfogadja a html tag-eket. Aztán kipróbáltam, hogy hozzáadok egy ál-mezőt ($authors->field_field_fake_title). Ez szépen megjelenik a $result-ban, viszont renderelődésre nem tudtam rávenni.
Ha esetleg valaki útbaigazítana, megköszönném, épülnék belőle.

De hogy ne legyen teljesen kudarcos a nap, a views_post_render-rel sikerült előrelépnem. Ebben az $output változót lehet szöveges műveletekkel átírni - a fenti példa végét kicsit átírva:

  1. foreach($workplaces_clean as $wp_clean) {
  2. foreach($view->result as $authors) {
  3. $author = $authors->node_title;
  4. $workplace = $authors->field_field_publi_intezmeny[0]['rendered']['#markup'];
  5.  
  6. if ($wp_clean == $workplace) {
  7. $replace[$authors->node_title] = $author." <sup>".$workplace_count."</sup>";
  8. }
  9.  
  10. }
  11.  
  12. //$workplace_display .= "<sup>".$workplace_count."</sup> ".$wp_clean;
  13. $workplace_count = $workplace_count+1;
  14. }
  15. $output = strtr($output, $replace);

Ez nagyon jó, csak hát az azonos nevű szerzőknél sajnos ebben a formában borul az ügy :(
0
0
ipeto képe

Na végülis annyira jutottam, hogy a views_post_render()-rel megoldható a kérdés, bár lehet, hogy ez nem túl drupalos megoldás. De legalább működik.
A views_post_render-ben ugye egyrészt ott $views tömb, aminek tartalmából a fenti ciklusok segítségével összerakható a szükséges kimenet (lényegében egy változó a szerzőkre, egy a munkahelyekre). Másrészt az $output tömb tartalmazza a nézet renderelt eredményét. Ezt újrakonstruáltam és elhelyeztem benne az előzőekben létrehozott tartalmat.

0
0
chosen képe

Szerintem ezt a listát minimális programozással meg lehet oldani View-ban.
Tételezzük fel, hogy a munkahely egy szöveges lista mező, akkor a View-ban a szerző neve mellé megjeleníted a lista kulcsát, amire raksz egy belső linket, a kulcs értékével (pl. Szerző neve 1).
CSS-sel megoldható, hogy felsőindex legyen: (vertical-align: super; font-size: smaller;.

A View láblécébe pedig beraksz egy szövegmezőt, amiben engedélyezed a PHP filtert és kilistázod a szövegmező értékeit (list_allowed_values), html id-nak pedig beállítod a listaelemhez megfelelőt:

  • BME

Én legalábbis így csinálnám.

0
0
ipeto képe

Jelenleg az van, hogy a cikk tartalomhoz kapcsolva jelennek meg a szerző tartalmak és ez utóbbiban tárolódik a szerző neve és munkahelye. Elképzelhető, hogy egy cikk szerzőinek mind különböző munkahelye van, de az is, hogy mindnek ugyanaz. Tehát azt gondolom, hogy adott cikk szerzőinek munkahelyei közül az egyedieket mindenképpen ki kell válogatni és ezek sorszámát megjeleníteni a szerzők mögött.

Egyébként én is gondoltam arra, hogy ezt a nézet láblécében végzem el, de az nem tűnt túl "drupalos" megoldásnak.

0
0
chosen képe

Szerintem megoldható drupalosan láblécben is a dolog. Ha esetleg külön tartalomtípust csinálsz a munkahelyeknek és a szerzőnél csak egy hivatkozás van rá, hogy hol dolgozik (akár több helyen is dolgozhat...), akkor a láblécben elhelyezhetsz egy beágyazott View-t a munkahelyekből, ami szövegkörnyezeti paraméterként megkapja mely érintett munkahelyeket kell listázni. Ez persze csak az egyik lehetséges mód, de programozást biztosan kevesebbet igényel.

0
0