結局、ビューがノードで行うのと同じように機能する動作メソッドを見つけることができました。
でhook_views_data()
(またはhook_views_data_alter()
)、追加してくださいaccess query tag
テーブルキーを。Viewsがノードに対しても同様にこれを行うことがわかりnode_views_data()
ます。
$data['example_table']['table']['base'] = array(
'field' => 'nid', // This is the identifier field for the view.
'title' => t('Example table'),
'help' => t('Example table contains example content and can be related to nodes.'),
'weight' => -10,
'access query tag' => 'my_entity_access' // <- Add this.
);
次に、独自のの実装を追加しますhook_query_TAG_alter
。これにより、このタグが追加されているすべてのクエリが変更されます。上記の変更により、これはすべてのビューデータリストに自動的に適用されますが、タグを手動で追加することもできます。
_node_query_node_access_alter()
node_query_node_access_alter()(hook_query_TAG_alterのノードモジュール実装)からの呼び出しには、いくつかの優れたトリックがあります。
function mymodule_query_my_entity_access_alter(QueryAlterableInterface $query) {
global $user;
// Read meta-data from query, if provided.
if (!$account = $query->getMetaData('account')) {
$account = $user;
}
if (!$op = $query->getMetaData('op')) {
$op = 'view';
}
// From here every query will be different depending on your own needs.
// Since my entity has a privacy parameter that is either public or private,
// I chose to implement this as follows:
// Prepare a database OR.
$or = db_or();
// If the user has public view permissions, add it to the OR.
if (user_access('view public my_entities', $account)) {
$or->condition('example_table.privacy', 'public');
}
// If the user has non-public view permissions, add it to the OR.
if (user_access('view private my_entities', $account)) {
$or->condition('example_table.privacy', 'public', '<>');
}
// Add the compiled set of rules to the query.
$query->condition($or);
}