php / Drupal - перечислить все узлы, которые данный пользователь имеет право редактировать - PullRequest
1 голос
/ 13 марта 2011

У меня есть функция, которая перечисляет все узлы в системе. Я хотел бы уточнить это, чтобы показать только узлы, которые текущий пользователь может редактировать - либо с помощью API, либо с помощью оператора SQL. (Drupal 6)

function fnGetNodeTypes($typeOfNodes) {
    $string = "";
    $types_of_nodes  = array_keys(node_get_types());
    $string .= "<select name='typeOfNodes'>";
    $string .= "<option value=''>Please select</option> ";
    $string .= "<option value='all'>All</option> ";

    foreach($types_of_nodes as $node){      
        if($typeOfNodes == $node ){
            $selected = "selected";
        }
        else{
            $selected = "";
        }       
        $string .= "<option $selected value=\"" . $node . "\">" . $node ;
        $string .= "</option>\n";
    }
    $string .= "</select\n>";
    return $string;
}

Обновление:

Следуя совету @chx, я попытался возиться с пользователями, users_roles и разрешениями. Дайте мне знать, если есть более Drupal способ сделать это.

//----------------------------------------------
// Contruct select/option box of node types
//----------------------------------------------
function fnGetNodeTypes($typeOfNodes) {
    $string = "";
    $types_of_nodes  = array_keys(node_get_types());
    $string .= "<select name='typeOfNodes'>";
    $string .= "<option value=''>Please select</option> ";
    //$string .= "<option value='all'>All</option> ";
    foreach($types_of_nodes as $node_type){         
        if (fnInArray($node_type))
        {
            if($typeOfNodes == $node_type ){
                $selected = "selected";
            }
            else{
                $selected = "";
            }       
            $string .= "<option $selected value=\"" . $node_type . "\">" . $node_type ;
            $string .= "</option>\n";
        }
    }
    $string .= "</select\n>";
    return $string;
}

//---------------------------------------------------------------------
//  function fnInArray - see if user is allowed to edit this node type
//---------------------------------------------------------------------

function fnInArray($node_type)
{
    global $user;

    if ($user->name == 'admin') { return TRUE; }

    // get list of all nodes that user is allowed to access
    // 
    $string =   " SELECT permission.perm as permission_perm "  .
        " from users " .
        " join users_roles  on ( users_roles.uid = users.uid ) " .
        " join permission on (permission.rid = users_roles.rid) " .
        " where  users.name = '" . $user->name . "'";

    $result = db_query($string);
    while ($row = db_fetch_object($result)) {           
        $pieces = explode(", " , $row->permission_perm);        
        $node_name = "edit any " . trim($node_type) . " content";
        if (in_array($node_name, $pieces )) 
        {
            return TRUE;        
        }
        return FALSE;
    }
}

Ответы [ 4 ]

1 голос
/ 13 марта 2011

Это практически невозможно сделать.Доступ к узлу может быть определен с помощью ловушки, поэтому единственный универсальный способ сделать это - получить каждый.не замужем.узел.и запустить node_access($node, 'update') на них.Это не слишком быстро.Вы можете возиться с типами узлов, разрешениями, таблицей доступа к узлам и т. Д. В зависимости от того, как настроен ваш сайт и используются модули.Если мы предполагаем, что единственное, что контролирует ваши узлы, это права доступа и понимаем, пожалуйста, это предположение далеко не всегда верно, то в Drupal 6 и ниже (я подозреваю, что из node_get_types() вы не используете D7) вы действительно перебираете node_get_types() и отметьте user_access("edit own $type content") || user access("edit any $type content"), но это не слишком далеко.

0 голосов
/ 20 июля 2011

Это то, для чего модуль Module Grants Monitor предназначен для http://drupal.org/project/module_grants. На странице проекта: «При нажатии на него открывается сводка всего содержимого, к которому имеет доступ зарегистрированный пользователь (то есть просматривает, редактирует) послеконтроль доступа был применен модулями доступа к контенту, установленными на вашем сайте ".Я установил и проверил это сегодня, и это похоже на работу.У кого-нибудь есть комментарии или опыт работы с этим модулем?

Кажется, что это также должно быть возможно с представлениями или правилами ... но, возможно, это только потому, что все кажется возможным с ними ...

0 голосов
/ 13 марта 2011

db_query + db_rewrite_sql : Возвращает только те строки, которые зарегистрированному пользователю разрешено просматривать.

$results = db_query(db_rewrite_sql($query), $args);
0 голосов
/ 13 марта 2011

Не совсем уверен в правильном методе для Drupal 6 (проверьте db_rewrite_sql ), но для Drupal 7, пока вы создаете свой запрос, добавьте в запрос addTag ('node_access'), и это ограничит его до только узлы, которые пользователь имеет право редактировать. Если вы перейдете по ссылке на db_rewrite_sql выше, обязательно посмотрите комментарии.

...