Tartalom hozzáférés "finomabb" módon, mint a Content Access

hszilard képe

Olyan tartalom típust szeretnék, amit a regisztráltak tudnak olvasni, a be nem lépett látogatók (anonymous-ok) pedig csak korlátozottan, pl. csak egy-két bekezdést láthassanak, alatta pedig egy tájékoztatás, hogy ha tovább szeretné olvasni, regisztráljon, vagy lépjen be.
A Content Access modul alkalmas hozzáférhetőségek szabályozására - ezt tudom - de ott egy tartalmat vagy látok, vagy nem. Ilyet, mint amit feljebb leírtam, a Content Accessel csak nagyon kacifántosan lehet megoldani, pl. minden ilyen node-ot duplán veszek fel úgy, hogy egyiket (a rövidítettet) csak anonymous-ok, a másikat pedig az összes többi tudja olvasni.
Van erre valami jó megoldás?

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

Premium content
http://drupal.org/project/premium_content

„Restricts access to premium content by role and provides a general API for other modules to help decide if a user has access to premium content.

This is useful on a news or membership site where teasers are available to the general public but the full body is only available to privileged users. Premium nodes appear in listings with full title and teaser available to anyone. If a user does not have adequate privileges, the default behavior is to show a simple message, but you can use Panels or theme overrides to do more custom things.”

Kapcsolódó témakör:
http://drupal.stackexchange.com/questions/30630/show-teasers-to-anonymou...

0
0
hszilard képe

A premium content erre nem alkalmas. Annyit tud, hogy beállíthatok időzítést, hogy egy adott időpontig, vagy egy adott időponton túl elérhetővé lehet tenni a tartalmat. Továbbá megadható egy konstans "access denied" szöveg, hogy mit írjon ki, ha nem elérhető.
Ez nem tudja azt, amit én szeretnék.

0
0
Sk8erPeter képe

... legalábbis a leírása szerint...
Na ma kipróbálom.

0
0
hszilard képe

Köszi, én is nézegetem még, lehet, hogy elkerülte a figyelmemet.

0
0
Sk8erPeter képe

Egyelőre annyit derítettem ki, hogy a full contentnél megmutatja az üzenetet, ami mondja, hogy csak "előfizetőknek" (aztán ezt a szöveget arra változtatod, amire akarod) megtekinthető csak a teljes tartalom. De teaser módot láthatják, pl. ha Views-zal azt jeleníted meg. Mondjuk amennyire eddig néztem, nem túl szofisztikáltak a beállítási lehetőségei az admin-felületen, de némi kódolásra elvileg kényelmesebb lehetőséget ad. Meg külön permissionöket definiál a premium tartalomra.
Az sem igaz, amit írtál, hogy csak időközökre adható meg ez a korlátozás, mert pont az a default, hogy permanens korlátozás van, aztán annyifélét hozzáadhatsz, amennyit akarsz, és az adott content type-nál azt az adott típust állíthatod be (sima select lista van hozzá, elég egyértelmű...).
Szerintem ezen az úton el lehet indulni.

De ha nem tetszik, akkor válaszd a Panels-es megoldást:
http://drupal.stackexchange.com/a/30631/2368

1
0
hszilard képe

Olvastam én is, hogy ez a Panels modullal együtt valósítható meg, bár ezt szeretném elkerülni. Úgy érzem, ez olyan "ágyúval verébre" megoldás lenne.

Arra gondoltam, talán az Access denied message szövegmezőbe php szűrővel valahogyan meghívom az adott node teaser-ét, de ez nem biztos, hogy járható út.

Másik lehetőség még, hogy egy modulocskát írni rá a hook_node_view_alter() használatával. Talán ez lenne a "legelegánsabb" megoldás, ehhez azonban jobban el kellene mélyülnöm a modulírás rejtelmeibe.

0
0
aruna képe

elég neked az is, ha egy node template fájlt hozol létre.

Ha a sminkedbe beraksz egy ilyen
template-t (node--tartalomtipusazonositod.tpl.php)

// If user is anonymous - not logged in
if (user_is_logged_in() === FALSE) {
  // Hide protected fields.
  hide($content['field_xyz_email']);
  hide($content['field_xyz_homepage']);
  // Change field content - leave only first paragraph in body.
  $body_content = $content['field_xyz_body']['#items']['0']['value'];
  $start = strpos($body_content, '<p>');
  $end = strpos($body_content, '</p>', $start);
  $first_paragraph = substr($body_content, $start, $end-$start+4);
  $content['field_xyz_body']['#items']['0']['value'] = $first_paragraph;
}
print render($content);

Ezzel ^^^ meg tudod oldani, hogy a milyen mezőket ne lássanak az anonymous user-ek, valamint a mezők tartalmát is felül tudod írni a template-ben.

Ha találsz szebb megoldást, akkor ne ezt válaszd.
Pont ezért jó, hogy bevezették a d7-ben a render() függvényt, így bármit meg lehet változtatni a kimeneten a smink rétegben tömbként is.

1
0
hszilard képe

Köszönöm, lehet, hogy ez nekem jó lesz, megpróbálok ezen az úton elindulni.

0
0
Sk8erPeter képe

Maga az ötlet jó, de a kódban ez elég feltűnő hiba:

  1. $start = strpos($body_content, '<p>');
  2. $end = strpos($body_content, '</p>', $start);
  3. $first_paragraph = substr($body_content, $start, $end-$start+4);

Mi van, ha egy darab <p> nincs benne, csak pl. <div>-ek?

$content['field_xyz_body']['#items']['0']['value'] = $first_paragraph;

úgy tudom, a #markupot kell felülbírálni, hogy jó legyen, pl.:

$content['field_xyz_body']['0']['#markup'] = $first_paragraph;

==========

Az alábbit teszteltem, és ez teljesen az elvártak szerint működik, ha van rendes teaser, tehát van a szövegben <!--break-->, akkor odáig látják a be nem jelentkezett felhasználók, ha nincs, akkor automatikusan levágódik a szöveg 50 karakter környékén; a text_summary() függvényt használtam fel erre.

Az Article content type-nál teszteltem mindezt:
node--article.tpl.php legelejére, a nyitó PHP-tag után:

  1. if(!$logged_in){
  2. $body_format = $content['body']['#items'][0]['format'];
  3. // $body_format = 'filtered_html'
  4. $body_content = isset($content['body']['#items'][0]['safe_value']) ? $content['body']['#items'][0]['safe_value'] : $content['body']['#items'][0]['value'];
  5. $body_truncated_size = 50;
  6.  
  7. $body_summary = text_summary($body_content, $body_format, $body_truncated_size);
  8. $destination = array('destination' => 'node/'.$node->nid);
  9. $body_summary .= '<p>'.t('<a href="@login">Log in</a> or <a href="@register">register</a> to see more', array('@login' => url('user/login', array('query' => $destination)), '@register' => url('user/register', array('query' => $destination)))).'</p>';
  10.  
  11. // $content['body']['#items'][0]['value'] = $body_summary;
  12. $content['body'][0]['#markup'] = $body_summary;
  13. }

Példa az eredményre:

anonimként:

Anonymous  has to login to see more

bejelentkezve:

Anonymous  has to login to see more

2
0
szantog képe

http://drupal.org/project/field_permissions
Csinálsz egy public meg egy protected fieldet, a publicot csak anonim látja, a protectedet meg csak a jogosultak.
Az a baj ezekkel a paneles meg sminkes turkálásokkal, hogy nem valós hozzáférés szabályozás, hanem csak amolyan maszatolás, megjelenítési logikába van építve, nem adatbázisba. Ergo mindenhol felül kell írni, ahol használva van, és nem biztos, hogy észreveszed, hogy hol van még megjelenítve a rendszeren belül. Pl simán becsúszhat egy view resultba, vagy term pagere szűretlenül.

3
0

----
Rájöttem, miért kérdezek olyan ritkán a drupal.hu-n. Amíg szedem össze az infokat a kérdéshez, mindig rájövök a megoldásra.

Sk8erPeter képe

Ez teljesen így van.
A Field Permissions modult még nem használtam, de azt írod, "Csinálsz egy public meg egy protected fieldet, a publicot csak anonim látja, a protectedet meg csak a jogosultak.", de akkor lényegében duplikálni kell a fieldeket? Tehát a body-ból mindig ki kell vágni azt a részt, amit az anonim felhasználó is láthat, bemásolni oda, aztán úgy mehet? Az is elég macerának tűnik. :( De javíts ki, ha valamit félreértek.

0
0
hszilard képe

Lehet hogy kicsit túlvariáltam, nem láttam a fától az erdőt, így eszembe sem jutott, hogy mező szinten is létezhet hozzáférés szabályozás.
Utánanézek ennek field permission-nek, ez máshol is hasznos lehet...

0
0