Editar: eu perdi a parte sobre a permissão "editar nó próprio", porque você deve não apenas verificar a permissão, mas também se esse nó pertence ao usuário atual. Atualizei meu exemplo abaixo, mas estou deixando a explicação acima como estava.
A sua entrada de menu está abaixo de node / nid (por exemplo, node / 1234 / alguma coisa)? Então você provavelmente nem precisa de um retorno de chamada de acesso personalizado.
Se você definir o caminho do menu como no exemplo a seguir, ele chamará apenas o retorno de chamada de acesso (e, portanto, o retorno de chamada da sua página), se estiver visualizando um nó válido.
'node/%node/something'
Isso significa que ele chamará node_load (1234) para o exemplo acima e só continuará se um objeto de nó válido for retornado. Assim, você pode definir sua permissão com argumentos de acesso, como de costume.
Dito isto, escrever um retorno de chamada de acesso é realmente simples. É apenas uma função que receberá os argumentos que você definiu nos argumentos de acesso. Por exemplo, o retorno de chamada de acesso padrão é user_access () e, quando você define seus argumentos de acesso 'access arguments' => array('a permission string')
, resultará na seguinte chamada:user_access('a permission string')
.
Se você tiver vários argumentos, eles serão passados como segundo, terceiro e assim por diante à sua função. Para acessar o nó ativo no momento, você pode usar menu_get_object () .
Assim, você pode escrever seu retorno de chamada de acesso dessa maneira, mas, novamente, talvez nem seja necessário criar um.
function yourmodule_access_check() {
global $user;
$node = menu_get_object();
return $node && $node->uid == $user->uid && user_access('edit own ' . $node->type . ' content');
}
Em vez de codificar a string de permissão, você pode passá-la como argumento para a função ou o que você deseja fazer.
$items['node/%node/edit']['access callback'] = 'admin_access_only';
e$node = menu_get_object();
no retorno de chamada fn,$node
nunca retornou nada. Eu costumava vez$node = node_load(arg(1));
que trabalhou ... Mais explicações seriam muito bem-vindosO próprio Drupal é um exemplo de como escrever código.
O exemplo mais fácil é o agregator_menu () , que contém o seguinte código.
Nesse caso, o retorno de chamada de acesso é o padrão ( user_access () ) e os argumentos de acesso são uma matriz que contém a cadeia de caracteres da permissão. O código não pode verificar mais do que uma permissão; se as permissões para verificar forem duas ou as condições para verificar não forem apenas permissões, o retorno de chamada de acesso deverá ser diferente, incluindo um personalizado.
node_menu () define alguns menus que usam um retorno de chamada de acesso diferente do padrão. A função contém o seguinte código.
A função definida como retorno de chamada de acesso ( node_access () ) é a seguinte:
Há três pontos a serem observados:
TRUE
se o usuário tiver acesso ao menu eFALSE
se o usuário não tiver acesso ao menu.fonte
access callback
função personalizada , parece que ela deve estar no seu.module
arquivo, porque o Drupal parece não encontrá-la nafile
declaração (pelo menos para mim).