Drupal 7 privát fájlok letöltése csak bejelentkezett felhasználóknak

A Google maps-es példákat hamarosan folytatom, de ezt most muszáj kiírnom magamból.

Ma órákon át téptem a hajam egy egyszerűnek tűnő probléma felett: mindössze annyit szerettem volna elérni, hogy egy Drupal 7 weboldalnál a privát tárolóba feltöltött fájlokat csak bejelentkezett felhasználók tölthessék le.

Az első ötlet, hogy erre lesz egy kis pipa a jogosultságok beállítási oldalán. Hát nincs. Némi utánajárás után kiderült, hogy a Drupal nem így működik. A fájlokhoz akkor enged hozzáférni egy felhasználót, ha az adott node-hoz van hozzáférése a felhasználónak.

Nekem nem ez kellett, a node-ot mindenkinek látni kellett, csak a fájl letöltéshez kell bejelentkezni.

Jó, gondoltam, akkor majd mező (Field) szinten kezeljük a jogosultságokat.

Meg is találtam a Field permissions modult, amivel nagyszerűen be lehet állítgani minden egyes mezőre mindenféle jogot (megtekintés, létrehozás, módosítás). Szépen beállítottam amit szerettem volna, és mint aki jól végezte dolgát, léptem is a következő feladatra.

Véletlenül vettem csak észre, hogy a weboldalról a mezőt ugyan elrejti a Field Permissions modul, de a konkrét fájlt továbbra is le lehet tölteni a megfelelő webcím (URL) ismeretében.

Ezután következett egy órákon át tartó, vad és elkeseredett kattintgatás hadjárat, mindenféle tutorial és issue olvasgatás, néhány modul kipróbálása és mindenféle mágikus varázsigék mormolása. Persze minden hiába, csak nem tudtam célt érni.

És akkor itt jön az Open Source ereje.

Nem volt más hátra, meg kellett nézni a forráskódot, hogy mégis mi a fene történik a háttérben. A megoldást, nem több mint 1 perc után megtaláltam:

  • A fájl pathból (/system/files/) sejteni lehetett, hogy a system.module-ban kell keresgéljek.
  • A system_menu függvényben meg is találtam, hogy a file_download függvény szolgálja ki ezeket a kéréseket.
  • A file.inc-ben meg is találtam a függvényt, bőséges dokumentációval. Mint kiderült létezik egy hook_file_downloads hurok, amivel szabályozható a hozzáférés.

Újabb 1 teljes percet vett igénybe a megfelelő kód megírása:

<?php
modulom_file_download
($uri) {
  if (
user_is_anonymous()) {
    return -
1;
  }
}
?>

Hát ennyi volt. Több óra kattintgatás vs. 1+1 perc kódolás. De sokszor hallottam már, hogy amit lehet, saját kód helyett érdemesebb letölthető modulokkal megoldani. Egy jó darabig még nehéz lesz engem meggyőzni erről.

Google Maps API használata – 1. Helló Google Térkép!

Az elmúlt hetekben két honlap elkészítésénél is előkerült a Google térkép beillesztés lehetősége. Egyedi megoldás kellett, nem volt elég a Drupal Gmap és Location modulok használata. Beleástam hát magam az API használatába, és kiderült, hogy rengeteg izgalmas dolgot tud.

Ezért úgy döntöttem írok egy bejegyzés sorozatot, amiben megmutatom az Google Maps Javascript API használatát. Tőlem szokatlan módon, rövid, egyszerű példa kódok használatával mutatom be a lehetőségeket. Vágjunk is bele:

A legegyszerűbb példa

Nézzük meg a létező legegyszerűbb HTML és JavaScript kódot, amivel beépíthetünk egy Google térképet az oldalunkba a Javascript API használatával. Ennél egyszerűbb példa nincs.

HTML

<body onload="initialize()">
  <div id="terkep"></div>
</body>

Egy terkep id-vel rendelkező div-et helyezünk ez al oldalon, ebbe kerül majd a térkép. Az oldal betöltődésekor pedig meghívjuk az initialize() függvényt.

CSS

<style type="text/css">
  #terkep {
    height: 400px;
    width: 600px;
  }
</style>

Semmi izgalmas nem történik itt, DIV#terkep-nek megadjuk a szélességét és a magasságát.

A Google Maps API importálása

<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>

Külső Javascript kódként hivatkozunk az Google Térkép programozói felületére, rendes nevén az API-ra. A sensor=false paraméter jelentése, hogy egy olyan eszközön fogjuk használni a térkép szolgáltatást, aminek nincs hely meghatározó szenzora. Egy webes böngésző ilyen. Egy okostelefon esetében már lehetne igazra állítani a sensor paramétert.

A lényeg, az inicializáló függvény

<script type="text/javascript">
  var map;

  function initialize() {
    var latlng = new google.maps.LatLng(47.193445480491455, 19.514465109374996);
    var myOptions = {
      zoom: 7,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };   

    map = new google.maps.Map(document.getElementById("terkep"), myOptions);
  }
</script>

Elérkeztünk a lényeghez.

Először egy latlng nevű objektumot hozunk létre, a google.maps.LatLng nevű függvénnyel. Ez lesz majd a térkép közepe. Két paramétere van, a szélességi és hosszúsági koordináták.

A myOptions objektummal fogjuk felparaméterezni a készülő térképet. A zoom értéke azt hiszem egyértelmű, 1 esetén vagyunk a legtávolabb a földtől, ahogy növekszik, úgy „közeledünk” a földhöz. A center az imént létrehozott középpontot határozza meg. A mapTypeId pedig a térkép típusát határozza meg, jelen esetben a normál térkép nézet, ahol csak utakat látunk. Magyarul, nincsenek szatellit képek.

Végül, az utolsó sorban, felhasználva a fentieket létrehozzuk a térképet a google.maps.Map nevű függvénnyel/objektummal, kinek, hogy tetszik. Első paramétere az a DOM objektum, ahova a térkép kerülni fog, második paramétere pedig a fent létrehozott myOptions beállítások. A DOM objektumot a szokásos document.getElementById függvénnyel szerezhetjük meg.

Demo

Az egész működés közben itt nézhető meg:
http://edgarpe.hu/sites/default/files/gmaps-api-1-hello-terkep.html

Megjegyzések

A Googme Térkép szolgáltatását nem csak JavaScript-el használhatjuk, hanem például Flashben is.

A teljes Google Maps API dokumentációja angolul:
http://code.google.com/apis/maps/index.html

A példa kódok a fenti dokumentáció alapján készültek, az ott található kódok átalakított változatai.

Egy-két példa már be van tárazva, de ha leírjátok mit nézzünk, akkor lesznek olyan példák is. Persze, csak ha meg tudom oldani :)

Munka: Profi webdesignert és sitebuildert keresek

Ügyfelek megbízására készülő weboldalak elkészítéséhez keresek profi webdesignert és Drupal sitebuildert, lehetőleg egy személyben. (Sitebuild = PSD-ből HTML + CSS készítés). Az sem baj, ha még soha nem láttál Drupalt, de ha együtt dolgozunk, akkor fogsz :)

A munkafolyamat a következőképpen néz ki:

  1. Az ügyféllel történt előzetes megbeszélések után elkészítesz egy látványtervet és esetenként logót, lehetőleg Photoshop-ban.
  2. Közben én elkészítem az oldal funkcionalitását Drupal-ban.
  3. A funkcionálisan működő oldalra ráhúzod az ügyfél által jóváhagyott látványtervet. Itt egy működő sitehoz kapsz hozzáférést, kész HTML struktúrával és sablon CSS-ekkel (Drupal Zen smink vagy Fusion, Tao, Genesis, stb...). A munka 95% megoldható a CSS átírásával. Ha a HTML struktúrán kell változtatni, szólsz és én megoldom.

Ha magadra ismertél és a fenti munkafolyamat szerint tudsz dolgozni, kérlek jelentkezz a hello (csiga) edgarpe (pont) hu címen vagy a kapcsolat űrlapon.

Kérlek írj minél több referenciát és alaposan írd le azt is, hogy az egyes projektekben mi volt a feladatod, hogyan készült el a site design része. Azt is írd meg, hogy hozzávetőlegesen milyen árakkal dolgozol, a fenti módszerrel elkészülő webdesign esetén. Számlaképességet is jelezd légyszives.

A munka távolról is végezhető, Skypeon keresztül tartjuk majd a kapcsolatot.

Végül, ha nem Te vagy az én emberem de ismersz olyat akit érdekelhet kérlek juttasd el hozzá ezt a bejegyzést a lenti közösségi megosztók segítségével, vagy a linket közvetlenül:

http://edgarpe.hu/munka-profi-webdesigner-sitebuilder

Mi történt a Facebook Like-al?

Zoli barátom az F1világ.hu-nál szombat délelőtt 10:30-kor írt egy email-t, hogy nem megy az oldalon a Facebook Like gomb, nézzek rá mi lehet a gond. Ha rákattintok felvillan a számláló, de rögtön vissza is áll alapállapotba.

Hamar kiderült, hogy nem minden cikket érint, de elég sokat, az F1világnál legalább a cikkek felénél ez van.

Hamar kiderült az is, hogy nem csak minket érint a dolog. Az Index-en sem megy a Like sok helyen, az Origo-n sem, és a SocialTimes.hu oldalon sem. És senki nem szól egy árva szót sem a neten.

Néhány példa, ahol nem megy a Like gomb

Index
Origo
HVG
SocialTimes.hu
F1világ

Aki tud szavazni a „Tetszik” gombbal, írjon hozzászólást, hogy nála megy. Mert én még nem találkoztam senkivel (a szűk baráti körömben) aki tudott volna lájkolni.

Az első észlelés óra eltelt több 48 óra és még mindig nem mennek a gombok. Az internet világában 2 óra leállás már világvége :)

Mi történt?

Két ötletem van, de mindkettő elég X-akta szerű.

A) A napokban vezette be az Index és az Origo az oldalain a Like gombot és ez olyan váratlan terhelést adott egy Magyarországért felelős Facebook szervernek, ami pár nap alatt lebénította a működést (beteltek a merevlemezek)

B) Valami titkos összeesküvés van a háttérben, mert az esemény nagyjából egybeesik azzal, hogy tömegesen lehet regisztrálni a keresőóriás új, közösségi szolgáltatására, a Google+ oldalra.

Szerintetek mi áll a háttérben?

A közösségi média most először tényleg számít a keresőoptimalizálásban

Azt már eddig is tudtuk, hogy a Facebook és Twitter aktivitás közvetett módon, és valószínűleg nagyon kis mértékben, képes befolyásolni a Google találati lista sorrendjét. Miközben a fenti közösségi oldalak szép nagyra megnőttek, a Google folyamatosan próbálta létrehozni a saját közösségi hálózatát, általában kevesebb, mint több sikerrel. Legújabb próbálkozásukról, a Google +1 gombról áprilisban már kifejtettem a véleményemet. Persze lehetett sejteni, hogy komolyan gondolják a Google-nél a +1 gombot, hiszen elég sok saját termékbe azonnal integrálták is, többek között a Youtube-ra is. Először csak néhány kiválasztott partner helyezhete el saját oldalán a gombot, de most már bárki megteheti ezt.

Mindenki látja

Miért a súlyos cím, mi változott most? A SearchEngineLand publikálta a hírt, hogy néhány keresésnél a találati oldalon megjelenik az adott oldalhoz tartozó összes +1 szavazat. Eddig csak bejelentkezve lehetett látni a +1-eket és csak a barátaink szavazatait mutatta a Google. Azt hiszem nem kell nagyon ecsetelni, hogy miért nagyon fontos változás ez a közösségi média és a keresőoptimalizálás kapcsolatában. Népszerűségünk a közösségi oldalakon +1 szavazatokként ölt testet. Ha pedig a szavazatok összege megjelenik a találati oldalon, akkor ez bizony jelentősen átrendezheti a kattintási arányokat az első 10 találat között.

Így jelenik meg

Magyar találati oldalon egyelőre nem sikerült elcsípni az új funkciót, így a SearchEngineLand képeit használom én is illusztrációnak. Kijelentkezett állapotban így nézhet ki a találati lista egy eleme (az utolsó sort érdemes figyelni): Bejelentkezett állapotban pedig azt is láthatjuk, hogy az ismerősök közül kik szavaztak az adott linkre, és persze ilyenkor aktív a +1 gomb is amivel szavazni lehet: Ha valaki meglátja a google.hu oldalain az új funkciót mindenképp jelezze egy hozzászólásban. Elismerem, hogy a mostani megjelenítés nem okot hatalmas változást az eddig megszokott külalakban, de ez egyrészt változhat még, másrészt biztos vagyok benne, hogy ez az egyszerű kis szürke sor is befolyásolja a kattintási arányokat.

+1 gombot mindenhova

Eddig nem sok értelmét láttam elhelyezni a +1 gombot, de most úgy gondolom, egy próbát mindenképpen megér. A +1 gomb hivatalos oldalán bárki gyárthat magának beépítő kódot. 4 különböző formátum érhető el, többek között a Facebook like-hoz illeszkedő 20 pixel magas szavazó gomb is. Ezek után nincs más hátra, mint hogy én is elhelyezzem itt a gombot, és várjam a szavazatokat :)

Oldalak

Feliratkozás Prunk-Éger Edgár RSS csatornájára