Saját tartalom szerkesztése mindaddig míg nem közzétett állapotú

asrob képe

Egy kis gondom akadt saját modul fejlesztés közben. Léteznek felhasználók különböző csoportokban. Az egyik ilyen csoport azért felel hogy küldjenek be esemény tartalomtípusokat. Az ő jogaik jelenleg a "tartalmak hozzáférése", esemény beküldése, illetve saját események szerkesztése. A feladat az lenne hogy ezek a felhasználók addig tudják szerkeszteni a saját tartalmukat amíg nem lett közzétéve a tartalom. Alapból úgy kerülnek fel a tartalmak hogy rejtettek, majd a szerkesztők csoportból valaki átállítja közzétettre. Szóval míg nem lettek közzétéve, aborossal, Yorkkal konzultáltam a fejlesztés során mivel nem vagyok még elég jártas a modulfejlesztésben. Az alábbi kóddal próbálkoztam/próbálkoztunk eddig:

function umvpevent2_access($op, $node) {
  if ($op == 'update' || $op == 'delete') {
    if ($node->status == 1  && !user_access('administer nodes')) {
    return FALSE;
    }
  }
}
Drupal verzió: 
Boobaa képe

Ugyanis ez sosem ad vissza TRUE-t (vagy azzal egyenértékűt), hanem mindig csak FALSE-t (vagy azzal egyenértékűt).

0
0
sgabe képe

Node státusz alapján nem tudsz jogosultságokat osztani, mert...

<?php  
// If the module did not override the access rights, 
// use those set in the node_access table.
if ($op != 'create' && $node->nid && $node->status) {
?>

Nem közzétett tartalomhoz szerintem csak az fog tudni hozzáférni, akinek tartalom adminisztrálási joga van, de más is próbálkozott hasonlóval, mint te. A lehetséges megoldás a Node modul módosítása, majd a megfelelő hozzáférés szabályozás elkészítése újra, különben az egész olyan, mintha az oldalad széttenné a lábát...

0
0
csg képe

...de lehet, hogy részemről (:

Én úgy értelmezem az eredeti kérdést, hogy a beküldő a saját tartalmát szeretné módosítani a későbbiekben, az általad idézett linken viszont két külön szerkesztőről van szó.

Ha én értettem jól, akkor viszont nem egyértelmű számomra, hogy mi a probléma. Az, hogy csak addig kéne tudniuk szerkeszteni a tartalmat, amíg nem közzétett, és utána már nem?

0
0

--
Csonka Gergely
http://cheppers.com

asrob képe

Így van, jól értelmezed, a felhasználó csak addig tudja szerkeszteni a saját maga által beküldött tartalmat amíg nem közzétett utána már ne tudja.

0
0

--
Borsa Péter
https://peterborsa.eu

sgabe képe

Nézd meg a node_access() függvény forráskódját.

Ahogy az előző hozzászólásomban mutattam, ha a tartalom nincs közzétéve a visszatérési érték rögtön FALSE, tehát nem is fut tovább a jogosultság ellenőrzés.

<?php
// Let authors view their own nodes.
if ($op == 'view' && $account->uid == $node->uid && $account->uid != 0) {
  return TRUE;
}
?>

Itt pedig látható, hogy a szerző csak megtekintési jogot kap. Minden további hozzáférés csak a tartalom adminisztrálása jogosultsággal vagy $user->uid = 1 számára lehetséges.

Szerintem...

0
0
aboros képe

hát, ahogy sgabe rámutatott ez úgy néz ki így nem fog menni.

akkor valami máshoz kell kötni az access checket. vegyél fel a típusba egy sima on/off checkboxot, senki nem szerkesztheti. mondjuk hook_nodeapi -ba intézd el, hogy ha op update vagy create akkor ha status == 1 akkor a checkboxod 'pipálódjon ki'.

errefelé lesz a megoldás, a példamodul majdnem pont ezt csinálja úgy nézem.

0
0

-
clear: both;

sgabe képe

Sehogy se fog menni, mert a nem közzétett tartalmat csak a $user->uid = 1 vagy a tartalom adminisztrálása jogosultsággal rendelkezők tudják szerkeszteni.

0
0
aboros képe

próbáld ki, hogy adsz jogot create story -ra meg edit own story -ra. beküldesz egy nem közzétett story -t és simán tudja a tulaj szerkeszteni akkor is, ha nem közzétett.
szóval a node modul is megcsinálja valahogy ezt. belenézek majd.

persze valami mégse stimmel.
próbálom megoldani egy node access modullal, amúgy is érdekelt, hogy működik a node access system. hook_node_grants és hook_node_access_recors hurkokkal bűvészkedek (meg persze hook_perm) és nemigen akar összejönni, pedig asszem egész jól értem már a node access system, máshoz kötött jogokat legalábbis úgy tűnik meg tudok csinálni. (ráment egy fél vasárnapom meg egy komplett hétfő estém, de akkor is megérte, ha ez a konkrét probléma nem is oldható meg sehogyse:)

mutatok egy érdekes szkrínsot, belerakva amit nem bírok felfogni.
http://img.skitch.com/20090916-cdgcnmr4q72cwqtj1akxih1t35.jpg

a modul ami ezt csinálja pedig íme:
myperm.module

<?php
 
/**
 * Implementation of hook_node_grants().
 *
 */
 
function myperm_perm() {
	$perms = array();
	$types = node_get_types();
	foreach ($types as $type => $data) {
		$perms[] = 'edit own published ' . $type . ' content';
		$perms[] = 'edit own unpublished ' . $type . ' content';
	}
	return $perms;
}
 
function myperm_node_grants($account, $op) {	
  $grants = array();
 
  if ($op == 'view' && user_access('access content')) {
    $grants['myperm_view'] = array(TRUE);
	}
 
	if ($op == 'update' || $op == 'delete') {
	  $types = node_get_types();
  	foreach ($types as $type => $data) {
			if (user_access('edit own published ' . $type . ' content', $account)) {
				$grants['myperm_' . $type . '_edit_published'] = array($account->uid);
			}
			if (user_access('edit own unpublished ' . $type . ' content', $account)) {
				$grants['myperm_' . $type . '_edit_unpublished'] = array($account->uid);
			}
		}
	}
 
 
	foreach ($grants as $grant => $gid) {
		drupal_set_message($grant . ' -> gid: ' . $gid[0]);
	}
 
	return $grants;
}
 
/**
 * Implementation of hook_node_access_records().
 *
*/
function myperm_node_access_records($node) {
  $grants = array();
 
  $grants[] = array(
    'realm' => 'myperm_view',
    'gid' => TRUE,
    'grant_view' => TRUE,
    'grant_update' => FALSE,
    'grant_delete' => FALSE,
    'priority' => 0,
  );
  if ($node->status) {
    	$grants[] = array(
	      'realm' => 'myperm_' . $node->type . '_edit_published',
	      'gid' => $node->uid,
	      'grant_view' => TRUE,
	      'grant_update' => TRUE,
	      'grant_delete' => FALSE,
	      'priority' => 0,
	    );
    }
    else {
    	$grants[] = array(
	      'realm' => 'myperm_' . $node->type . '_edit_unpublished',
	      'gid' => $node->uid,
	      'grant_view' => TRUE,
	      'grant_update' => TRUE,
	      'grant_delete' => FALSE,
	      'priority' => 0,
	    );
 
  }
  return $grants;
}
?>

na gyere node modul, mutasd micsinász te pontosan.. ;)

0
0

-
clear: both;

aboros képe

így:

<?php
 
  // If the module did not override the access rights, use those set in the
  // node_access table.
 
  // aboros removed ' && $node->status' from the if statement
 
  if ($op != 'create' && $node->nid) {
    $grants = array();
    foreach (node_access_grants($op, $account) as $realm => $gids) {
      foreach ($gids as $gid) {
        $grants[] = "(gid = $gid AND realm = '$realm')";
      }
    }
?>

és egyből csinálja.
igazad volt.

0
0

-
clear: both;

Bálint képe

Amellett, hogy nagyon érdekel a saját modulból való megoldása a problémának, leírom, hogy ezt a működést a Workflow modullal meg tudod valósítani.
Ott persze nem a közzétett státuszt használva, hanem saját állapotokkal, ahol beállíthatod, hogy az egyes állapotokban lévő node-okkal melyik csoportnak mire legyen jogosultsága, ill. hogy melyik csoport milyen állapotváltoztatásokra jogosult.
Ha végül ezt az utat választod, vagy csak ki akarod próbálni, akkor arra figyelj, hogy ez a modul felülírja a node modul jogosultságait, szóval nagyon össze lehet kavarodni vele.

0
0
asrob képe

Az alábbi kóddal probálkoztam, köszönhetően boobaa útmutatásának, sajnos ez sem működik:

function umvpevent2_access($op, $node) {
  if (user_access('administer nodes')) {
    return TRUE;
  }
  global $user;
  if (user_access('edit own event2 content') && ($user->uid == $node->uid) && ($node->status == 0) && (($op == 'update') || ($op == 'delete'))) {
    return TRUE;
  }
}
0
0

--
Borsa Péter
https://peterborsa.eu

sgabe képe

Már leírtam feljebb, hogy $node->status alapján nem fog működni. Leírom a lényeget még egyszer, mert afölött mindenki átsiklik. Vagy javítsatok ki, de szerintem...

Ha a tartalom nincs közzétéve a jogosultság ellenőrzés FALSE értékkel tér vissza, tehát nem tudsz hozzáférést biztosítani senkinek. Nem közzétett tartalomhoz csak a $user->uid = 1 és a tartalom adminisztrálási jogosultsággal bíró felhasználó fér hozzá, senki más! Ezen nem tudsz változtatni, csak ha módosítod a node modul azon sorát, amire feljebb rámutattam. Attól, hogy helyettesíted a státuszt egy checkboxszal ugyanúgy FALSE lesz a jogosultság ellenőrzés eredménye, mert nincs közzétéve a tartalom!

0
0
asrob képe

Igen igen, köszi az útmutatást, hagyom akkor nem próbálkozok vele, reménykedem hogy ez majd egyszer változik :)

0
0

--
Borsa Péter
https://peterborsa.eu

Den képe

lerásával küzdöttem (Using drupal könyv). Ott is felmerült, hogy a szerkesztő és a beküldő szépen tudja egymásnak pinpongozni a tartalmat, addig, míg nem közölhető.

Utána a szerkesztő közzéteszi és elméletileg kész. Gyakorlatilag nem, mert a tulaj megint szerkesztheti a tartalmat, ami nem nyerő.

Ott az a megoldási javaslat lett, hogy egy + cck mezőt felvenni ami az eredeti tulajra mutat, és a publikálás közben a tulajdonost átírni. Így megmaradna az, hogy a cikket ki szerezte a referencián keresztül, de szerkeszteni már nem tudja.

Meg nem valósítottam, természetesen, addig már/még nem jutottam el. A szál itt: http://drupal.hu/forum/jogrend-kérdés-saját-tartalom-módosítása

0
0
sgabe képe

Ezen téma kapcsán felfigyeltem egy view_unpublished nevű modulra. Letöltöttem és meglestem a kódot, hogy mégis hogyan...

<?php
/**
 * Implementation of hook_menu_alter().
 *
 * Modifies the path node/nid to use our access callback.
 */
function view_unpublished_menu_alter(&$items) { 
  $items['node/%node']['access callback'] = '_view_unpublished_node_access';
  $items['node/%node']['access arguments'] = array(1);
}
?>

Ezzel a hurokkal módosítja a menüt, hogy először a saját modul ellenőrizze a jogosultságokat és ha nem kielégítő az eredmény (FALSE) csak akkor dobja oda a node modulnak.

Ezen az úton elindulva szerintem megoldható amit szeretnél.

0
0