Prechádzať zdrojové kódy

improved first step of create order form

bach 3 rokov pred
rodič
commit
05b2621bc7

+ 2 - 2
config/sync/core.entity_form_display.commerce_order.materio_order_type.default.yml

@@ -40,13 +40,13 @@ content:
       override_labels: true
       label_singular: 'order item'
       label_plural: 'order items'
+      allow_new: true
       match_operator: CONTAINS
+      revision: false
       collapsible: false
       collapsed: false
-      allow_new: false
       allow_existing: false
       allow_duplicate: false
-      revision: false
     third_party_settings: {  }
     region: content
 hidden:

+ 12 - 0
web/modules/custom/materio_commerce/materio_commerce.module

@@ -8,4 +8,16 @@ function materio_commerce_form_alter(&$form, &$form_state, $form_id) {
         $form['actions']['next']['#value'] = t('Place your order');
       }
   }
+}
+
+function materio_commerce_form_commerce_order_add_form_alter(&$form, &$form_state, $form_id) {
+  $currentUser = \Drupal::currentUser();
+  $roles = $currentUser->getRoles();
+  if (in_array("admin", $roles)){
+    $t="t";
+    $form['type']['#default_value'] = 'materio_order_type';
+    $form['type']['#disabled'] = true;
+
+    $form['customer']['uid']['#selection_handler'] = 'default:user_by_email';
+  }
 }

+ 10 - 1
web/modules/custom/materio_commerce/materio_commerce.services.yml

@@ -2,4 +2,13 @@ services:
   materio_commerce.order_events_subscriber:
     class: Drupal\materio_commerce\EventSubscriber\MaterioCommerceOrderEventsSubscriber
     tags:
-      - { name: 'event_subscriber' }
+      - { name: 'event_subscriber' }
+
+  materio_commerce.route_subscriber:
+    class: Drupal\materio_commerce\Routing\AutocompleteRouteSubscriber
+    tags:
+      - { name: event_subscriber }
+
+  materio_commerce.autocomplete_matcher:
+    class: Drupal\materio_commerce\EntityAutocompleteMatcher
+    arguments: ['@plugin.manager.entity_reference_selection']

+ 34 - 0
web/modules/custom/materio_commerce/src/Controller/EntityAutocompleteController.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace Drupal\materio_commerce\Controller;
+
+use Drupal\Core\KeyValueStore\KeyValueStoreInterface;
+use Drupal\materio_commerce\EntityAutocompleteMatcher;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+class EntityAutocompleteController extends \Drupal\system\Controller\EntityAutocompleteController {
+
+  /**
+   * The autocomplete matcher for entity references.
+   */
+  protected $matcher;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct(EntityAutocompleteMatcher $matcher, KeyValueStoreInterface $key_value) {
+    $this->matcher = $matcher;
+    $this->keyValue = $key_value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('materio_commerce.autocomplete_matcher'),
+      $container->get('keyvalue')->get('entity_autocomplete')
+    );
+  }
+
+}

+ 62 - 0
web/modules/custom/materio_commerce/src/EntityAutocompleteMatcher.php

@@ -0,0 +1,62 @@
+<?php
+
+namespace Drupal\materio_commerce;
+
+use Drupal\Component\Utility\Html;
+use Drupal\Component\Utility\Tags;
+
+class EntityAutocompleteMatcher extends \Drupal\Core\Entity\EntityAutocompleteMatcher {
+
+  /**
+   * Gets matched labels based on a given search string.
+   */
+  public function getMatches($target_type, $selection_handler, $selection_settings, $string = '') {
+
+    $matches = [];
+
+    $options = [
+      'target_type'      => $target_type,
+      'handler'          => $selection_handler,
+      'handler_settings' => $selection_settings,
+    ];
+
+    $handler = $this->selectionManager->getInstance($options);
+
+    if (isset($string)) {
+      // Get an array of matching entities.
+      $match_operator = !empty($selection_settings['match_operator']) ? $selection_settings['match_operator'] : 'CONTAINS';
+      $entity_labels = $handler->getReferenceableEntities($string, $match_operator, 10);
+
+      // Loop through the entities and convert them into autocomplete output.
+      foreach ($entity_labels as $values) {
+        foreach ($values as $entity_id => $label) {
+
+          $entity = \Drupal::entityTypeManager()->getStorage($target_type)->load($entity_id);
+          $entity = \Drupal::entityManager()->getTranslationFromContext($entity);
+
+          $key = $label . ' (' . $entity_id . ')';
+          // Strip things like starting/trailing white spaces, line breaks and tags.
+          $key = preg_replace('/\s\s+/', ' ', str_replace("\n", '', trim(Html::decodeEntities(strip_tags($key)))));
+          // Names containing commas or quotes must be wrapped in quotes.
+          $key = Tags::encode($key);
+          switch ($entity->getEntityType()->id()) {
+            case 'node':
+              $type = !empty($entity->type->entity) ? $entity->type->entity->label() : $entity->bundle();
+              $status = ($entity->isPublished()) ? ", Published" : ", Unpublished";
+              
+              break;
+            case 'user':
+              $email = $entity->getEmail();
+              $label = $label . ' (' . $entity_id . ') [' . $email . ']';
+              break;
+          }
+          
+          $matches[] = ['value' => $key, 'label' => $label];
+        }
+      }
+    }
+
+    return $matches;
+  }
+
+}

+ 55 - 0
web/modules/custom/materio_commerce/src/Plugin/EntityReferenceSelection/UserByEmailSelection.php

@@ -0,0 +1,55 @@
+<?php
+
+namespace Drupal\materio_commerce\Plugin\EntityReferenceSelection;
+
+use Drupal\Core\Database\Connection;
+use Drupal\Core\Database\Query\Condition;
+use Drupal\Core\Database\Query\SelectInterface;
+use Drupal\Core\Entity\EntityFieldManagerInterface;
+use Drupal\Core\Entity\EntityRepositoryInterface;
+use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Entity\Plugin\EntityReferenceSelection\DefaultSelection;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\user\RoleInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+use Drupal\user\Plugin\EntityReferenceSelection\UserSelection;
+
+/**
+ * Provides specific access control for the user entity type.
+ *
+ * @EntityReferenceSelection(
+ *   id = "default:user_by_email",
+ *   label = @Translation("User selection By Email"),
+ *   entity_types = {"user"},
+ *   group = "default",
+ *   weight = 3
+ * )
+ */
+class UserByEmailSelection extends UserSelection {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function entityQueryAlter(SelectInterface $query) {
+    parent::entityQueryAlter($query);
+
+    $conditions = &$query->conditions();
+    foreach ($conditions as $key => $condition) {
+      if ($key !== '#conjunction' && is_string($condition['field']) && $condition['field'] === 'users_field_data.name') {
+        unset($conditions[$key]);
+        
+        $or = new Condition('OR');
+        $or->condition('users_field_data.name', $condition['value'], $condition['operator']);
+        $or->condition('mail', $condition['value'], $condition['operator']);
+        $query->condition($or);
+        $t="t";
+
+      }
+    }
+  }
+
+}

+ 16 - 0
web/modules/custom/materio_commerce/src/Routing/AutocompleteRouteSubscriber.php

@@ -0,0 +1,16 @@
+<?php
+
+namespace Drupal\materio_commerce\Routing;
+
+use Drupal\Core\Routing\RouteSubscriberBase;
+use Symfony\Component\Routing\RouteCollection;
+
+class AutocompleteRouteSubscriber extends RouteSubscriberBase {
+
+  public function alterRoutes(RouteCollection $collection) {
+    if ($route = $collection->get('system.entity_autocomplete')) {
+      $route->setDefault('_controller', '\Drupal\materio_commerce\Controller\EntityAutocompleteController::handleAutocomplete');
+    }
+  }
+
+}