Keresés

Régiók felhasználása bárhol phptemplate sminkben

Hojtsy Gábor képe

A Drupal fejlesztői listán merült fel nemrég, hogy a 4.7.0-val elérhetővé vált tetszőleges régió támogatás képességeit a fejlesztők nem használják ki. Pedig nem különösebben bonyolult saját régiót definiálni, még akkor sem, ha phptemplate sminket készítünk. Ráadásul ezt a régiót akár a megjelenített tartalmak mellett is prezentálhatjuk, szerzői információt, kapcsolódó linkeket vagy hasonlót megjelenítve. Erről szól Nick Lewis How to create a block region for node.tpl.php című írása.

Kategóriák: 

Melyik nevedet mutassam?

Őry Máté képe

A készülő Drupal alapú magyar Ubuntu közösségi webhely készítése során valósítottam meg azt, ami már a Weblabor kapcsán is többször felmerült bennem. Mostanában ?divattá? vált az interneten a teljes név használata semmitmondó nicknevek mögé zárkózás helyett. Ez a jelenség a Weblabornál, mint szakmai médiumnál megfigyelhető, a warezoldalakon ? érthető okokból ? kevésbé. Ez viszont felvet egy technikai problémát: magyarok vagyunk, és ?gonosz? módon nem csak ASCII neveink vannak. Erre a problémára adhat megoldást a felhasználónév, a nick és a teljes név különválasztása.

A konkrét megoldásom az volt, hogy a felhasználó személyes beállításainál megadhatja teljes- és becenevét illetve azt, hogy melyik jelenjen meg beküldött tartalmai, hozzászólásai beküldőjeként. A megvalósításhoz három változtatást kell eszközölni.

Az első a ?profile? modul engedélyezése.

A második a megfelelő profiladatok felvétele, amit az adminisztrációs rendszerből (admin/settings/profile) a legegyszerűbb elvégezni:

Típus Mezőnév Láthatóság Megjegyzés
egysoros szövegmező profile_nickname publikus Becenév; opcionális
egysoros szövegmező profile_fullname publikus Teljes név; opcionális
választólista profile_whichname személyes Alapértelmezett név; Lehetőségek: Felhasználói név, Teljes név, Becenév

Végül a harmadik lépés PHPTemplate sablonrendszer használata esetén a smink gyökerében egy template.php fájlt létrehozása (ha nem létezik még). Ebbe a következőt írjuk:

/**
* Format a username.
*
* @param $object
* The user object to format, usually returned from user_load().
* @return
* A string containing an HTML link to the user's page if the passed object
* suggests that this is a site user. Otherwise, only the username is returned.
*/
function phptemplate_username($object) {

if ($object->uid && $object->name) {

// Shorten the name when it is too long or it will break many tables.
if (drupal_strlen($object->name) > 20) {
$name = drupal_substr($object->name, 0, 18) .'?';
}
else {
$name = $object->name;
}

if (user_access('access user profiles')) {
//sajnos be kell töltenünk a felhasználói profilt
profile_load_profile($object);
$output = "";
//a lényeg
if ($object->profile_whichname=="Teljes név") {
$_title = t('View user profile.') . ' Felhasználói név: ' . $name;
$output .= l($object->profile_fullname, 'user/'. $object->uid, array('title' => $_title));
}
elseif ($object->profile_whichname=="Becenév") {
$_title = t('View user profile.') . ' Felhasználói név: ' . $name;
$output .= l($object->profile_nickname, 'user/'. $object->uid, array('title' => $_title));
}
else {
//az eredeti
$output .= l($name, 'user/'. $object->uid, array('title' => t("View user profile.")));
}
}
else {
$output = check_plain($name);
}
}
else if ($object->name) {
// Sometimes modules display content composed by people who are
// not registered members of the site (e.g. mailing list or news
// aggregator modules). This clause enables modules to display
// the true author of the content.
if ($object->homepage) {
$output = l($object->name, $object->homepage); $output .= " homepage}\" rel=\"nofollow\" title=\"Személyes weblapja\">" .
theme_image('themes/ubuntuhu/gfx/url.png', 'Honlapja') . '
';
}
else {
$output = check_plain($object->name);
}

$output .= ' ('. t('not verified') .')';
}
else {
$output = variable_get('anonymous', 'Anonymous');
}
return $output;
}
?>

Ez a Drupal 4.7.2 theme_username függvényének megfelelő kiegészítése. A megjegyzésekben látszik, hogy mi nem az eredeti függvény része.

A hook_form_alter() a gyakorlatban

Hojtsy Gábor képe

A Drupal.hu frissítésével merült fel az igény arra, hogy bizonyos a fejlesztői csapat által kevésbé lényegesnek ítélt node szerkesztő mezőknek mégis nagyobb jelentőséget tulajdonsítsunk a felület megjelenítésekor, így a Drupal 4.7.0-val érkezett új tömbökre épülő űrlap építő rendszer egyik előnyös tulajdonságát, a hook_form_alter() űrlap módosító hurok képességeit kellett igénybe vennem. Ráadásul ezt Őry Máté fordítói levlistára beküldött magyar dátumokat támogató megoldásával fűszereztem, így egy kis ismertető alapja éppen összeállt.

A Drupal 4.7.0-ás kiadásának legnagyobb fejlesztői változása a teljesen átalakított űrlap összeállításért és ellenőrzésért felelős rendszer, mely a korábbi Drupal verziókkal összehasonlítva valamelyest bonyolutabb, de ugyanakkor sokkal rugalmasabb programozást tesz lehetővé. Megtehetjük például, hogy meglévő űrlapokba új elemeket veszünk fel, beviteli mezők csoportjait sorrendezünk át, és hasonlók.

Lássuk, hogy ezen írás születésekor mit teszünk a drupalhu.module kódjában:

// A drupalhu modul weight értéke nagyra
// van állítva az adatbázsiban, ezért ez
// hívódik meg legutoljára a form_alter()-ek közül
function drupalhu_form_alter($form_id, &$form) {
// Node form átírása
if (preg_match("!_node_form$!", $form_id)) {
// Node típusok a path és options megnyitásához
$openpath = in_array($form['type']['#value'], array('story', 'book', 'page'));
$openoptions = $openpath || $form['type']['#value'] == 'weblink';

// Opciók megnyitása
if (isset($form['options']) && $openoptions) {
$form['options']['#collapsed'] = FALSE;
}
// Álnév kötelező vagy nem látszik
if (isset($form['path'])) {
if ($openpath) {
$form['path']['#collapsed'] = FALSE;
$form['path']['#weight'] = -2;
$form['path']['path']['#title'] = 'Az útvonal álneve';
$form['path']['path']['#required'] = TRUE;
}
else {
unset($form['path']);
}
}
}
// Magyar dátum megjelenítéshez a beállítás
// űrlap átírása Őry Máté kódja alapján
if ($form_id == 'system_settings_form') {
$hu_formats = array(
'short' => 'Y. m. d. H.i',
'medium' => 'Y. F j. H.i',
'long' => 'Y. F j., l H.i'
);
foreach ($hu_formats as $n => $f) {
$form['dates']['date_format_' . $n]['#options'][$f] = format_date(time(), 'custom', $f) . ' (magyar)';
$form['dates']['date_format_' . $n]['#default_value'] = variable_get('date_format_' . $n, $f);
}
}
}
?>

Mikor fut le a drupalhu_form_alter()?

Mindig lefut egyszer, amikor egy űrlap összeállítása során módosíthatjuk annak tartalmát, szerkezetét. Számunkra azonban nem mindegy, hogy más módosító függvényekhez képest mikor hívódik meg saját függvényünk. Mint a függvény előtti megjegyzés is mutatja, fontos, hogy meggyőződjünk róla, hogy a drupalhu_form_alter() függvényünk eléggé későn hívódik meg. A node szerkesztő űrlap 'path' eleme ugyanis szintén egy form_alter megvalósításon keresztül kerül az űrlapra, és ha alfabetikus sorrendben futnának le a modulok, akkor itt még nem látnánk azt az elemet, így nem is tudnánk befolyásolni. A meghívási sorrendet az adatbázis system táblájának weight értékével szabályozhatjuk. A nagyobb súlyú modulok hurkai később hívódnak meg, mint a kisebb súlyúaké.

A módosítandó űrlap kiválasztása

Két űrlapot fogunk módosítani a rendszerben, ezeket a $form_id alapjánt tudjuk azonosítani. A második eset egyszerűbb, hiszen a system_settings_form egyértelműen azonosítja a rendszer beállítások űrlapját. Az első esetben azonban egy story_node_form típusú űrlap azonosítót fogunk kapni, tehát a node típus is szerepel az azonosítóban. Ezért én egy mintaillesztő kifejezést választottam a megfelelő végződés megállapítására. A path_form_alter() egy másik megoldást is mutat ugyanerre a kérdésre.

Node szerkesztő felület testreszabása

Tekintsük az első űrlap módosítást, ahol tehát a node szerkesztő űrlap tulajdonságait változtatjuk meg. Az, hogy adott esetben milyen tömb struktúrán tudunk módosításokat végezni részben a node_form_array(), részben pedig a path_form_alter() függvényből tudjuk kideríteni.

Először is ha a szerkesztőség által jóváhagyandó tartalommal van dolgunk, és már jelen van az adminisztrátorok számára űrlapba tett 'options' mezőcsoport, amelyben a közzétételre, kiemelésre és más általános lehetőségekre vonatkozó beállítások találhatóak, akkor ezt kinyitjuk. Másodszor pedig a webcím álnév beállító csoportját emeljük ki az űrlap elejére, a taxonómia beállítás utánra azoknál a tartalmaknál, melyekhez álnév szokott tartozni. Ráadásul az elemcsoportban kötelezővé tesszük az álnév megadására szolgáló elem kitöltését. Ezzel nem kerülhet álnév nélküli szerkesztett tartalom a rendszerbe. Azért kell címet adnunk az elemnek, mert ezt használja fel a Drupal a hibaüzenet kiírásakor, és emellett jelenhet meg a piros csillag, ami a kötelező kitöltést jelzi. Végül amely típusoknál nem használunk álneveket (weblink és forum a drupal.hu esetében), ott ennek a beállítási lehetőségét el is tüntetjük.

Magyar weblapra magyar dátumokat

Őry Máté küldte be nemrég a fordítói levelezőlistára megoldását, mely szintén a form_alter hurkot használja arra, hogy lehetővé tegye helyes magyar dátum formátumok kiválasztását a rendszer beállításainál. Ennek egy jelentősen rövidített, ám funkcionalitásában többet adó megoldását adtam hozzá a drupalhu.module kódjához.

Tehát ha a system_settings_form űrlappal van dolgunk, akkor ennek dátumokra vonatkozó lehetőségeit szeretnénk kibővíteni a magyar formátum választhatóságával. A módosítható elemek a system_view_general() függvényben azonosíthatóak.

A megoldás elérése érdekében felvesszük a három lehetséges dátum részletezettségnek (short, medium, long) megfelelő magyar formátumokat egy tömbbe. A system_view_general kódjából tudjuk, hogy $form['dates']['date_format_short'] és hasonló nevű űrlap mezők teszik lehetővé a dátum kiválasztását. Ezek választási lehetőségeihez felvesszük a magyar formátumokat, sőt oda is írjuk a minták végére, hogy ezek a helyes magyar dátum formátumok, ugyanis sokan nem tudják például, hogy a magyar idő kijelzésben az óra és perc számait pont választja el egymástól. Végül pedig beállítjuk ezeket a formátumokat alapértelmezésnek, tehát ha még nem állítottak be semmit, akkor a rendszer ezt ajánlja fel.

Fontos megjegyezni, hogy ettől a változtatástól függetlenül a dátumok alapértelmezése nem a magyar formátum lesz a rendszerben, hiszen a máshol használt variable_get() hívásoknak más alapértelmezése van. Ezért vagy az adminisztrációs felületen kell beállítanunk a most már rendelkezésre álló magyar dátum formátumot, vagy az adatbázisban kell átszerkesztenünk. A fenti kódnak köszönhetően a felületen egyszerűbb dolgunk lesz.

Zárszó

A fenti két példa remélhetőleg megmutatta, hogy a Drupal 4.7-es sorozat új űrlap összeállítási rendszere megkönnyíti az életünket, hiszen saját fejlesztéseinket az alap modulok módosítása helyett elkülönített függvényekbe helyezhetjük, megkönnyítve a későbbi hibakeresést és frissítést is.

Felhivas fejlesztesi javaslatokra

George Por képe

Belgiumban elo, magyar szarmazasu tudas-okologiai kutato es konzultans vagyok. Drupalt hasznalok egy-ket eve mert neki van a legjobb taxonomia modulja. Csak az a baj, hogy csak nodokat lehet taxonomia kategoriakkal ellatni es valaszokat nem. Igy aztan egy blogot betehetek egy kategoriaba, de az egyes blog bejegyzeseimet nem pedig eppen az lenne a lenyeg. Azt megoldani csak fejlesztessel lehet. Mi Drupal 4.7 dolgozzunk.

Javasalatodban legy szives emlitsd meg, hogy mennyi ido alatt gondolod, hogy meg tudnad oldani ezt fejlesztesi feladatot, es persze, hogy mennyibe kerulne.

Ha erdekel a munka es vannak tovabbi kerdeseid ezen a cimen tudsz kapcsolatba lepni:

George Pór

George (kukac) Community-Intelligence (pont) com

Drupal 4.7.2 - FAQ modul

blackdog képe

Hi all,

Szeretném használni a FAQ modult, de csak addig működik, hogy létre hozom a node -okat. Utána, ha a FAQs menüből megakarok nézni valami akkor azt már
a faq/show könyvtárban keresi ami nem létezik. Létrehoztam a könyvtárakat ujra a FAQ -kat, de ua. a baj. Pl.: /faq/show/4#q_11 és ugye ilyen nem létezik.

Mi lehet a gond? a 4.7 patch lefutott rajta.

Másik godom vele:

Ha be kapcsolom a Recent FAQs blokkot akkor ezt kapom:

user warning: Unknown column 'n.teaser' in 'field list' query: SELECT n.nid, n.title, n.teaser FROM node n WHERE n.type = "faq" AND n.status = 1 ORDER BY n.created DESC LIMIT 5 in /.../html/drupal/includes/database.mysql.inc on line 120.

Korábban folyton ilyen hibát csinált ezért is patkoltam, de úgy látszik valami még nem jó.

Help Please!

A HUP.hu szociális hálózatának vizsgálata

Anonymous képe

Érdemes elolvasni azt a HUP.hu-n megjelent írást, mely Novák Áron általunk is bejelentett munkájának gyömölcsét mutatja be.

Novák Áron azt a célt tűzte ki maga elé, hogy a Google SoC 2006 keretén belül egy szociális hálózati modult készít a Drupal számára. [...] Nyilván nincs rendes fejlesztés tesztelés nélkül. Tesztelni pedig akkor jó, ha valaki nagyobb mennyiségű, változatos adattal rendelkezik. [...] A HUP azzal járult hozzá a SNA projekthez, hogy a fejlesztő rendelkezésére bocsátotta a meglevő adatbázisának azon részeit, amelyek nem tartalmaznak semmilyen érzékeny információt.

Kategóriák: 

I18n Több nyelvű modul automatikus nyelv választással

atom képe

Sziasztok !

A problémám, hogy 4.7-es hez feltettem az i18n több nyelvet támogató modult, és tökéletesen megy, figyeli, hogy milyen nyelvű böngészővel jönnek és az ahhoz tartozó menüd adja be.
Csak az index oldalt mindig a magyar nyelven adja be.
Hogy tudnék, minden nyelvnek különböző kezdőlapot csinálni ?
Próbáltam, hogy ?q=en legyen az álnévben , de akkor is a magyart adta be.