You are here

function photos_access_form_node_form_alter in Album Photos 8.4

Same name and namespace in other branches
  1. 8.5 photos_access/photos_access.module \photos_access_form_node_form_alter()
  2. 6.0.x photos_access/photos_access.module \photos_access_form_node_form_alter()

Implements hook_form_BASE_FORM_ID_alter() for form_node.

File

photos_access/photos_access.module, line 44
Implementation of photos_access.module.

Code

function photos_access_form_node_form_alter(&$form, FormStateInterface &$form_state, $form_id) {

  // Get form node.
  $node = $form_state
    ->getFormObject()
    ->getEntity();
  if ($node && ($node_type = $node
    ->getType())) {
    if (\Drupal::config('photos.settings')
      ->get('photos_access_' . $node_type)) {
      $nid = $node
        ->id();
      $form['privacy'] = [
        '#type' => 'details',
        '#title' => t('Privacy'),
        '#open' => TRUE,
        '#weight' => 1,
        '#tree' => TRUE,
      ];

      // Access record(s) id.
      $form['privacy']['access_id'] = [
        '#type' => 'value',
        '#value' => isset($node->privacy['access_id']) ? $node->privacy['access_id'] : 0,
      ];
      $form['privacy']['vid'] = [
        '#type' => 'value',
        '#value' => isset($node->privacy['vid']) ? $node->privacy['vid'] : 0,
      ];
      $form['privacy']['eid'] = [
        '#type' => 'value',
        '#value' => isset($node->privacy['eid']) ? $node->privacy['eid'] : 0,
      ];
      $old = [];
      if ($nid) {

        // Check collaborators and designated users.
        if (!isset($node->privacy['access_id']) || !($photos_album_access_id = $node->privacy['access_id'])) {
          $db = \Drupal::database();
          $photos_album_access_id = $db
            ->query("SELECT id FROM {photos_access_album} WHERE nid = :nid", [
            ':nid' => $nid,
          ])
            ->fetchField();
        }
        if ($photos_album_access_id) {
          $old['updateuser'] = _photos_access_userlist($photos_album_access_id, TRUE);
          $old['viewuser'] = _photos_access_userlist($photos_album_access_id, FALSE);
        }
      }
      $default_viewid = isset($node->privacy['viewid']) ? $node->privacy['viewid'] : 0;
      $form['privacy']['viewid'] = [
        '#type' => 'radios',
        '#title' => t('Privacy'),
        '#default_value' => $default_viewid,
        '#options' => [
          t('Open'),
          t('Locked'),
          t('Designated users'),
          t('Password required'),
        ],
        '#prefix' => '<div id="photos_access_privacy">',
        '#suffix' => '</div>',
        '#ajax' => [
          'callback' => 'photos_access_privacy_form_ajax',
          'event' => 'change',
          'progress' => [
            'type' => 'throbber',
            'message' => NULL,
          ],
        ],
      ];

      // Prep password field.
      $classes = ' class="photos-access-password photos_access-hidden-field"';
      if ($default_viewid == 3) {
        $classes = ' class="photos-access-password"';
      }
      $form['privacy']['pass'] = [
        '#type' => 'password',
        '#title' => t('Password'),
        '#default_value' => isset($node->privacy['pass']) ? $node->privacy['pass'] : '',
        '#prefix' => '<div id="photos_access_password"' . $classes . '>',
        '#suffix' => '</div>',
      ];

      // Prep designated users field.
      $classes = ' class="photos-access-view-users photos_access-hidden-field"';
      if ($default_viewid == 2) {
        $classes = ' class="photos-access-view-users"';
      }
      $userhelp = t('Separated by commas. eg: username1,username2,username3.');
      $form['privacy']['viewuser'] = [
        '#type' => 'entity_autocomplete',
        '#title' => t('Designated users'),
        '#description' => t('Add people who will have access to view this node.') . ' ' . (isset($old['viewuser']) ? t('@help The following users have access:', [
          '@help' => $userhelp,
        ]) . ' ' : $userhelp),
        '#target_type' => 'user',
        '#tags' => TRUE,
        '#default_value' => isset($node->privacy['viewuser']) && !is_array($node->privacy['viewuser']) ? $node->privacy['viewuser'] : NULL,
        '#process_default_value' => FALSE,
        '#prefix' => '<div id="photos_access_viewuser"' . $classes . '>',
        '#suffix' => '</div>',
      ];
      if (!empty($old['viewuser'])) {
        foreach ($old['viewuser'] as $u) {
          $form['privacy']['viewremove'][$u->uid] = [
            '#type' => 'checkbox',
            '#default_value' => isset($node->viewremove[$u->uid]) ? $node->viewremove[$u->uid] : '',
            '#title' => t('Delete: @name', [
              '@name' => $u->name,
            ]),
            '#prefix' => '<div id="photos_access_remove"' . $classes . '>',
            '#suffix' => '</div>',
          ];
        }
      }
      $form['privacy']['updateuser'] = [
        '#type' => 'entity_autocomplete',
        '#title' => t('Add collaborators'),
        '#target_type' => 'user',
        '#tags' => TRUE,
        '#default_value' => isset($node->privacy['updateuser']) && !is_array($node->privacy['updateuser']) ? $node->privacy['updateuser'] : NULL,
        '#description' => t('Add people who will have the authority to edit this node.') . ' ' . (isset($old['updateuser']) ? t('@help collaboration users list:', [
          '@help' => $userhelp,
        ]) . ' ' : $userhelp),
      ];
      if (!empty($old['updateuser'])) {

        // @todo add option to delete all collaborators.
        foreach ($old['updateuser'] as $u) {
          $form['privacy']['updateremove'][$u->uid] = [
            '#type' => 'checkbox',
            '#default_value' => isset($node->updateremove[$u->uid]) ? $node->updateremove[$u->uid] : '',
            '#title' => t('Delete: @name', [
              '@name' => $u->name,
            ]),
            '#prefix' => '<div id="photos_access_updateremove" class="photos-access-update-remove">',
            '#suffix' => '</div>',
          ];
        }
      }
      $form['#attached']['library'][] = 'photos_access/photos_access.node.form';

      // Make sure $node->privacy is available in node_insert and node_update.
      $form['#entity_builders'][] = 'photos_access_node_builder';

      // Validate password and users.
      $form['#validate'][] = 'photos_access_node_validate';
    }
    if ($node_type == 'photos') {

      // Move files if needed.
      foreach (array_keys($form['actions']) as $action) {
        if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
          $form['actions'][$action]['#submit'][] = 'photos_access_move_files_form_submit';
        }
      }
    }
  }
}