Jelenlegi hely

Öntevékeny csoporttársak közös naptára

CSÉCSY László képe

Adott egy vállalat, melynek különböző dolgozói különböző csoportokban dolgoznak: egy csoportban több dolgozó is, egy dolgozó akár több csoportban is. Minden dolgozó rögzíti, mikor milyen eseményen vesz részt. Hogyan tudhatják a dolgozók, hogy a csoporttársaik mikor milyen eseményen vesznek részt? A kérdésre a választ Drupallal, annak is a Date, Calendar, Views és Organic groups moduljaival keressük.

Alapos szemlélő (és gyakorlott sitebuilder) a következőket is megérti a fenti feladatleírásból: az események nem csoporttartalmak, hiszen csak felhasználókhoz, és nem csoportokhoz kötődnek; a nehézséget pedig az adja, hogy csak és kizárólag a csoporttársak eseményeit kell megjeleníteni - azaz ha Aladárnak és Bélának nincsen közös csoportja, akkor egymás eseményeit nem kell megjeleníteni. Egy egyszerű bevezető alapján a legszükségesebb lépések valószínűleg a következők.

  1. Hozzunk létre egy „esemény” tartalomtípust a Date (és a CCK) modulok segítségével, benne egy kötelező „dátum” mezővel.
  2. Klónozzuk a Calendar modul alapértelmezett calendar nevű nézetét (hogy probléma esetén nyugodtan kezdhessük elölről az egészet); ehhez azt először engedélyezni kell, majd a klónozás után célszerű letiltani az útvonalütközések elkerülése végett.
  3. A létrejött nézethez adjunk hozzá egy Tartalom: Típus = esemény szűrőt, hiszen csak azokat akarjuk megjeleníteni.
  4. Adjuk hozzá a Tartalom: Dátum - Kezdő dátum mezőt a listához, ami célszerűen Ne legyen megjelenítve.
  5. A nézetben már szereplő Dátum: Date (node) argumentumot módosítsuk úgy, hogy a Dátummező értéke Tartalom: Dátum (field_datum) - Kezdő dátum legyen (természetesen más néven is felvihetjük a mezőt).
  6. Adjuk hozzá egy Felhasználó: Felhasználó azonosító argumentumot a listához; a Műveletvégzés, ha az argumentum nincs jelen értéke legyen Alapértelmezés szerinti argumentum megadása; majd Az alapértelmezés szerinti argumentum típusa legyen PHP kód; kapcsoljuk be a Több kifejezés elfogadása argumentumonként jelölőnégyzetet; végül a PHP argumentum kód szövegmezőbe a következőt írjuk:
    global $user;
    $groups = array(0);
    foreach ($user->og_groups as $group) {
      $groups[$group['nid']] = $group['nid'];
    }
    $result = db_query('SELECT DISTINCT uid FROM {og_uid} WHERE nid IN (%s)', implode(',', $groups));
    $uids = array();
    while ($uid = db_result($result)) {
      $uids[$uid] = $uid;
    }
    return implode(',', $uids);

Magyarázat: a $groups tömbben összegyűjtjük az éppen bejelentkezett felhasználó (öntevékeny) csoportjainak azonosítóit. Hogy később ne legyen gond az SQL lekérdezésnél, ezt kiegészítjük egy 0 értékkel (ilyen azonosítójú öntevékeny csoport nincs). Az $uids tömbben összegyűjtjük azon felhasználók azonosítóit, akik tagjai az imént előbányászott (öntevékeny) csoportok valamelyikének - azaz akiknek van közös (öntevékeny) csoportjuk az éppen bejelentkezett felhasználóval. Végül a Views által elvárt módon visszaadjuk a felhasználók listáját.

Figyelem! A fenti megoldás nem rejti el azon eseményeket az éppen bejelentkezett felhasználó elől, amelyek szerzőinek nincs közös (öntevékeny) csoportja vele, csupán a naptár megjelenítésű listában nem fognak megjelenni - másszóval a tartalomhozzáférés-szabályozást valamilyen más módon kell megoldanunk!

Technológia: