arch-8.x-1.x-dev/modules/order/modules/addressbook/arch_addressbook.module
modules/order/modules/addressbook/arch_addressbook.module
<?php /** * @file * ARCH Addressbook module file. */ use Drupal\arch_addressbook\Entity\AddressbookitemViewBuilder; use Drupal\arch_addressbook\Services\UserAddressesService; use Drupal\Core\Entity\Display\EntityViewDisplayInterface; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Link; use Drupal\Core\Render\Element; use Drupal\Core\Session\AccountInterface; use Drupal\Core\Url; /** * Implements hook_theme(). */ function arch_addressbook_theme($existing, $type, $theme, $path) { return [ 'addressbookitem' => [ 'render element' => 'elements', ], ]; } /** * Prepares variables for addressbookitem templates. * * Default template: addressbookitem.html.twig. * * @param array $variables * An associative array containing: * - elements: An array of elements to display in view mode. * - addressbookitem: The addressbookitem object. * - view_mode: View mode; e.g., 'full', 'teaser', 'address', etc. */ function template_preprocess_addressbookitem(array &$variables) { $variables['view_mode'] = $variables['elements']['#view_mode']; // Provide a distinct $teaser boolean. $variables['teaser'] = $variables['view_mode'] === 'teaser'; $variables['page'] = $variables['view_mode'] === 'full'; $variables['addressbookitem'] = $variables['elements']['#addressbookitem']; /** @var \Drupal\arch_addressbook\AddressbookitemInterface $addressbookitem */ $addressbookitem =& $variables['addressbookitem']; $variables['title'] = $addressbookitem->label(); if (empty($variables['title'])) { $variables['title'] = t('Address', [], ['context' => 'arch_addressbook']); } $variables['date'] = \Drupal::service('renderer')->render($variables['elements']['created']); unset($variables['elements']['created']); $variables['display_edit_link'] = TRUE; $url = $addressbookitem->toUrl('edit-form', [ 'language' => \Drupal::languageManager()->getCurrentLanguage(), ]); $query = $url->getOption('query'); $query['destination'] = \Drupal::destination()->get(); $url->setOption('query', $query); $variables['url'] = $url; // Helpful $content variable for templates. $variables += ['content' => []]; foreach (Element::children($variables['elements']) as $key) { $variables['content'][$key] = $variables['elements'][$key]; if ($key === 'title') { $variables['content'][$key]['#access'] = FALSE; } } // Add article ARIA role. $variables['attributes']['role'] = 'article'; // Default classes for addressbookitem entity. $variables['attributes']['class'][] = $addressbookitem->getEntityTypeId(); $variables['attributes']['class'][] = $addressbookitem->getEntityTypeId() . '-' . $addressbookitem->id(); $variables['attributes']['class'][] = $addressbookitem->getEntityTypeId() . '--' . $variables['view_mode']; $variables['attributes']['class'][] = $addressbookitem->getEntityTypeId() . '--' . $variables['view_mode'] . '-' . $addressbookitem->id(); $variables['attributes']['class'][] = $variables['view_mode']; } /** * Implements hook_theme_suggestions_HOOK(). */ function arch_addressbook_theme_suggestions_addressbookitem(array $variables) { $suggestions = []; $sanitized_view_mode = strtr($variables['elements']['#view_mode'], '.', '_'); $suggestions[] = 'addressbookitem__' . $sanitized_view_mode; $suggestions[] = 'addressbookitem__' . $variables['elements']['#addressbookitem']->bundle(); $suggestions[] = 'addressbookitem__' . $variables['elements']['#addressbookitem']->bundle() . '__' . $sanitized_view_mode; $suggestions[] = 'addressbookitem__' . $variables['elements']['#addressbookitem']->id(); $suggestions[] = 'addressbookitem__' . $variables['elements']['#addressbookitem']->id() . '__' . $sanitized_view_mode; return $suggestions; } /** * Implements hook_preprocess_page(). */ function arch_addressbook_preprocess_page(&$variables) { $routes = [ 'entity.addressbookitem.collection', 'entity.addressbookitem.delete_form', ]; if (!in_array(\Drupal::routeMatch()->getRouteName(), $routes)) { return; } $variables['content_attributes']['class'][] = 'col-sm-12'; $variables['content_attributes']['class'][] = 'addressbookitem-page'; $variables['page']['sidebar_first'] = []; $variables['page']['sidebar_second'] = []; } /** * Implements hook_form_FORM_ID_alter(). */ function arch_addressbook_form_addressbookitem_delete_form_alter(&$form, FormStateInterface $form_state, $form_id) { $form['actions']['submit']['#attributes']['class'][] = 'btn-default'; $form['actions']['submit']['#attributes']['class'][] = 'btn-error'; $form['actions']['cancel']['#attributes']['class'][] = 'btn-default'; } /** * Implements hook_form_FORM_ID_alter(). */ function arch_addressbook_form_addressbookitem_add_form_alter(&$form, FormStateInterface $form_state, $form_id) { _arch_addressbook_form_alter($form, $form_state, $form_id); } /** * Implements hook_form_FORM_ID_alter(). */ function arch_addressbook_form_addressbookitem_edit_form_alter(&$form, FormStateInterface $form_state, $form_id) { _arch_addressbook_form_alter($form, $form_state, $form_id); } /** * Alters addressbook edit form. */ function _arch_addressbook_form_alter(&$form, FormStateInterface $form_state, $form_id) { /** @var \Drupal\Core\Session\AccountProxy $current_user */ $current_user = \Drupal::currentUser(); // Enable revision log message to edit only for Administrators/Editors. $form['user_id']['#access'] = FALSE; if ( in_array('administrator', $current_user->getRoles()) || in_array('editor', $current_user->getRoles()) || $current_user->id() == '1' ) { $form['user_id']['#access'] = TRUE; } // Enable revision log message to edit only for Administrators/Editors. $form['revision']['#access'] = FALSE; $form['revision']['#default_value'] = TRUE; $form['revision_log']['#access'] = FALSE; $form['revision_information']['#access'] = FALSE; if ( in_array('administrator', $current_user->getRoles()) || in_array('editor', $current_user->getRoles()) || $current_user->id() == '1' ) { $form['revision']['#access'] = TRUE; $form['revision_log']['#access'] = TRUE; $form['revision_information']['#access'] = TRUE; $form['revision_log']['widget'][0]['value']['#default_value'] = t('Changes has made by an administrator/editor.', [], ['context' => 'arch_addressbook']); } $form['actions']['delete']['#attributes']['class'][] = 'btn-default'; $form['actions']['delete']['#attributes']['class'][] = 'btn-error'; } /** * Implements hook_commerce_shipping_addresses(). */ function arch_addressbook_commerce_shipping_addresses() { $current_user = \Drupal::currentUser(); // For anonymous users, we do not want to display any existing address. if ($current_user->isAnonymous()) { return []; } /** @var \Drupal\arch_addressbook\Services\UserAddressesServiceInterface $address_service */ $address_service = \Drupal::service('addressbookitem.user_addresses'); try { $addresses = $address_service->getByUser(NULL, TRUE); } catch (\Exception $e) { // @todo log/handle error. return []; } $fields = [ 'organization' => ' | ', 'country_code' => '-', 'postal_code' => ' ', 'locality' => ', ', 'dependent_locality' => ', ', 'address_line1' => ' ', 'address_line2' => ' ', ]; foreach ($addresses as $id => $addressbookitem) { $parts = []; $addressfields = $addressbookitem->get('address')->first()->getValue(); foreach ($fields as $field => $suffix) { if ( isset($addressfields[$field]) && !empty($addressfields[$field]) ) { $parts[] = $addressfields[$field] . $suffix; } } $addresses['addressbookitem:' . $id] = implode('', $parts); } return $addresses; } /** * Implements hook_entity_extra_field_info(). */ function arch_addressbook_entity_extra_field_info() { $extra = []; $extra['user']['user']['display']['addresses'] = [ 'label' => t('Address book: Addresses'), 'visible' => FALSE, ]; return $extra; } /** * Implements hook_ENTITY_TYPE_view(). */ function arch_addressbook_user_view(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display, $view_mode) { /** @var \Drupal\user\UserInterface $entity */ /** @var \Drupal\arch_addressbook\Services\UserAddressesService $service */ $addressbook_service = \Drupal::service('addressbookitem.user_addresses'); /** @var \Drupal\arch_addressbook\Entity\AddressbookitemViewBuilder $view_builder */ $view_builder = \Drupal::entityTypeManager()->getViewBuilder('addressbookitem'); if ($display->getComponent('addresses')) { $build['addresses'] = arch_addressbook_render_addresses($addressbook_service, $view_builder, $entity, $view_mode); if ( isset($build['addresses']['addresses']['#items']) && !count($build['addresses']['addresses']['#items']) ) { $build['addresses']['addnew'] = [ '#type' => 'container', '#attributes' => [ 'class' => [ 'add-new', ], ], 'actions' => [ '#type' => 'actions', 'new' => Link::createFromRoute( t('Add new address', [], ['context' => 'arch_addressbook']), 'addressbookitem.add_to_user', ['user' => $entity->id()] ), ], ]; } } } /** * Render addressbookitem entities with the given address type & view mode. * * @param \Drupal\arch_addressbook\Services\UserAddressesService $addressbook_service * Addressbook service. * @param \Drupal\arch_addressbook\Entity\AddressbookitemViewBuilder $view_builder * Addressbookitem entity view builder. * @param \Drupal\Core\Session\AccountInterface $account * Specify account to render addresses for. * @param string $view_mode * View mode for the 'addressbookitem' entity. * * @return array|null * Item list with addresses, or NULL if no address found. * * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException */ function arch_addressbook_render_addresses(UserAddressesService $addressbook_service, AddressbookitemViewBuilder $view_builder, AccountInterface $account, $view_mode = 'address') { $items = []; /** @var \Drupal\arch_addressbook\Entity\Addressbookitem[] $address_ids */ $addresses = $addressbook_service->getByUser($account, TRUE); if (empty($addresses)) { return NULL; } foreach ($addresses as $address) { $items[] = $view_builder->view($address, $view_mode); } return [ '#type' => 'container', '#attributes' => [ 'class' => [ 'addressbook', ], ], 'addresses' => [ '#theme' => 'item_list', '#items' => $items, '#attributes' => [ 'class' => [ 'addressbookitem', ], ], ], ]; } /** * Allowed value function: Values of Addressbookitem country_code field. * * @return array * List of available countries in the address book. */ function arch_addressbook_allowed_values_country_code() { $countries = [ 'HU' => t('Hungary'), ]; /** @var \Drupal\Core\Extension\ModuleHandlerInterface $module_handler */ $module_handler = \Drupal::moduleHandler(); $countries += $module_handler->invokeAll('addressbook_countries'); $module_handler->alter('addressbook_countries', $countries); return $countries; } /** * Implements hook_preprocess_menu_local_action(). */ function arch_addressbook_preprocess_menu_local_action(array &$variables) { if ( !empty($variables['link']['#url']) && $variables['link']['#url'] instanceof Url && in_array( $variables['link']['#url']->getRouteName(), ['addressbookitem.add', 'addressbookitem.add_to_user'] ) ) { $variables['#cache']['contexts'][] = 'url'; $variables['link']['#cache']['contexts'][] = 'url'; $variables['element']['#cache']['contexts'][] = 'url'; /** @var \Drupal\Core\Url $url */ $url = $variables['link']['#url']; $query = $url->getOption('query'); $query['destination'] = \Drupal::destination()->get(); $url->setOption('query', $query); } }