it can be done without large modules such as Panels, in fact depending on how you do it, it can easily be done without any extra modules:
create a content type, 'Dummy Page' for our example - remove the body if you want (or use it to create a page header) and set everything else you want as you want the View Page to encompass
limit permission to only Admin for creating this content
create a node for the View, using the Title you would want the View to use
or
- use a module such as Empty Page to create an empty page
The Empty Page module is a simple empty page solution. It provides an
interface that assists in managing "empty" menu callbacks, mostly used
for pages that only consist of blocks.
either case, set a path alias ('ViewPage' for this example)
build your View as a block - in the block UI limit it the roles you want, and limit it to the ViewPage page
if you go the Empty Page way, you can also create a block limited to that page with the title or header information.
you can also create a block on the same page (with either approach) set to only show for Anonymous that shows information about what the page is and that it is limited to authenticated users, maybe with a link to login (or a login block)
EDIT
If you want to restrict users from accessing the content universally (not being able to manually input the url), then it's even simpler:
- use Node Access to restrict access of the content types to the preferred roles
Nodeaccess is a Drupal access control module which provides view, edit
and delete access to nodes. Users with the 'grant node permissions'
permission will have a grant tab on node pages which allows them to
grant access to that node by user or role. Administrators can set
default access controls per content type, and also define which roles
are available to grant permissions to on the node grants tab.
- set up the View as normal, under Advanced, add a NO RESULTS BEHAVIOUR
Because Views honours the access control, all of the content will be hidden from an anonymous user, so the No Results Behaviour will be shown. However, if there is no content to show to an authenticated user, it will also be show. Therefore, you may want to include a block for the group of content that only shows for anonymous users instead, but the access control would remain the same. Because this acts on the nodes, they can be created however you want and it will still maintain functionality, whether there's 1 node or 10000
EDIT #2
Based on the comments, you would need to override the display hook for the View.
function THEME(OR MODULE)_views_pre_render(&$view)
{
global $user;
if($view->name == 'VIEWS_MACHINE_NAME' && $user->uid == 0)
{
unset($view->result);
$view->empty['area']->options['content'] = 'ENTER NO RESULTS HEADER TEXT HERE!';
}
}
This function runs after the view is ready to go, but before it is displayed. It checks if the current user is anonymous, and then removes all the results, and sets a NO RESULT BEHAVIOUR which displays as a header. You can also create the NO RESULTS BEHAVIOUR in the Views UI, but it would show for authenticated users if no results were found as well - this provides an anonymous only header.
Because you will have many Views and this hook runs on all Views, you need to adapt the IF statement depending on the naming convention you are using for the Views, for example:
if($user == 0)
{
for($i = 0; $i < NUM_VIEWS; $i++)
{
if($view->name == ('VIEWS_BASE_NAME' . $i))
{
...
}
}
}
This could similarly be done at the Field level using hook_views_field_data_alter, but you would still want the above to set the anonymous header information