Drupal 7 / CiviCRM 4.5.8 Working on a site which has several contribution pages. We want to leave the majority of them accessible to anonymous users, but have just one that we want to restrict to "members-only".

In Drupal the $form variable passed in hook_form_alter() will have a '#access' parameter that can be set to false.

What's the best way to accomplish this with a CiviCRM form? Is there something that can be modified in the $form variable using hook_civicrm_buildForm()?

Some better way?

  • How is "members-only" defined here? Is it folks with a current CiviMember record? Apr 7 '15 at 16:16
  • "Members Only" is based on Drupal user role, I want to know more generally how to programmatically deny access to a single contribution page Apr 7 '15 at 16:26

Here's a quick and dirty drupal-ly way of doing it, but I still wonder about a CiviCRM specific methodology.

function civicrm_custom_access_civicrm_buildForm($formName, &$form) {
  global $user;

  $grant_access = 0;
  foreach($user->roles as $key => $role_name) {
    if($key == 3 || $key == 5 || $key == 4 || $key == 6 || $key == 7) {
      $grant_access = 1;

  if($formName == 'CRM_Contribute_Form_Contribution_Main' && $form->_id == 2 && !$grant_access) {

  • +1 for this approach, which since it uses hooks could also be done in a CiviCRM extension. Pretty much what I was going to suggest - intercept in hook_civicrm_buildForm(), deny access if user access conditions aren't met. Apr 8 '15 at 3:41
  • Sorry if this is a really stupid question -- but where would this code snippet be placed? Dec 14 '15 at 21:32
  • this bit of code implements hook_civicrm_buildForm().wiki.civicrm.org/confluence/display/CRMDOC/… this example my module name was civicrm_custom_access ....So place this bit of code in a small module...with the function name YOUR_MODULE_NAME_civicrm_buildForm() Dec 15 '15 at 14:15

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.