View source
<?php
namespace Drupal\elasticsearch_connector\Form;
use Drupal\Core\Entity\EntityForm;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\elasticsearch_connector\ClusterManager;
use Drupal\elasticsearch_connector\ElasticSearch\ClientManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\elasticsearch_connector\Entity\Cluster;
class IndexForm extends EntityForm {
private $clientManager;
protected $entityTypeManager;
protected $clusterManager;
public function __construct(EntityTypeManagerInterface $entity_manager, ClientManagerInterface $client_manager, ClusterManager $cluster_manager) {
$this->entityTypeManager = $entity_manager;
$this->clientManager = $client_manager;
$this->clusterManager = $cluster_manager;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('entity_type.manager'), $container
->get('elasticsearch_connector.client_manager'), $container
->get('elasticsearch_connector.cluster_manager'));
}
protected function getEntityManager() {
return $this->entityTypeManager;
}
protected function getClusterStorage() {
return $this
->getEntityManager()
->getStorage('elasticsearch_cluster');
}
protected function getIndexStorage() {
return $this
->getEntityManager()
->getStorage('elasticsearch_index');
}
protected function getAllClusters() {
$options = array();
foreach ($this
->getClusterStorage()
->loadMultiple() as $cluster_machine_name) {
$options[$cluster_machine_name->cluster_id] = $cluster_machine_name;
}
return $options;
}
protected function getClusterField($field) {
$clusters = $this
->getAllClusters();
$options = array();
foreach ($clusters as $cluster) {
$options[$cluster->{$field}] = $cluster->{$field};
}
return $options;
}
protected function getSelectedClusterUrl($id) {
$result = NULL;
$clusters = $this
->getAllClusters();
foreach ($clusters as $cluster) {
if ($cluster->cluster_id == $id) {
$result = $cluster->url;
}
}
return $result;
}
public function form(array $form, FormStateInterface $form_state) {
if ($form_state
->isRebuilding()) {
$this->entity = $this
->buildEntity($form, $form_state);
}
$form = parent::form($form, $form_state);
$form['#title'] = $this
->t('Index');
$this
->buildEntityForm($form, $form_state);
return $form;
}
public function buildEntityForm(array &$form, FormStateInterface $form_state) {
$form['index'] = array(
'#type' => 'value',
'#value' => $this->entity,
);
$form['name'] = array(
'#type' => 'textfield',
'#title' => t('Index name'),
'#required' => TRUE,
'#default_value' => '',
'#description' => t('Enter the index name.'),
'#weight' => 1,
);
$form['index_id'] = array(
'#type' => 'machine_name',
'#title' => t('Index id'),
'#default_value' => '',
'#maxlength' => 125,
'#description' => t('Unique, machine-readable identifier for this Index'),
'#machine_name' => array(
'exists' => array(
$this
->getIndexStorage(),
'load',
),
'source' => array(
'name',
),
'replace_pattern' => '[^a-z0-9_]+',
'replace' => '_',
),
'#required' => TRUE,
'#disabled' => !empty($this->entity->index_id),
'#weight' => 2,
);
$form['server'] = array(
'#type' => 'radios',
'#title' => $this
->t('Server'),
'#default_value' => !empty($this->entity->server) ? $this->entity->server : $this->clusterManager
->getDefaultCluster(),
'#description' => $this
->t('Select the server this index should reside on. Index can not be enabled without connection to valid server.'),
'#options' => $this
->getClusterField('cluster_id'),
'#weight' => 9,
'#required' => TRUE,
);
$form['num_of_shards'] = array(
'#type' => 'textfield',
'#title' => t('Number of shards'),
'#required' => TRUE,
'#default_value' => 5,
'#description' => t('Enter the number of shards for the index.'),
'#weight' => 3,
);
$form['num_of_replica'] = array(
'#type' => 'textfield',
'#title' => t('Number of replica'),
'#default_value' => 1,
'#description' => t('Enter the number of shards replicas.'),
'#weight' => 4,
);
$form['codec'] = array(
'#type' => 'select',
'#title' => t('Codec'),
'#default_value' => !empty($this->entity->codec) ? $this->entity->codec : 'default',
'#description' => t('Select compression for stored data. Defaults to: LZ4.'),
'#options' => array(
'default' => 'LZ4',
'best_compression' => 'DEFLATE',
),
'#weight' => 5,
);
}
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
$values = $form_state
->getValues();
if (!preg_match('/^[a-z][a-z0-9_]*$/i', $values['index_id'])) {
$form_state
->setErrorByName('name', t('Enter an index name that begins with a letter and contains only letters, numbers, and underscores.'));
}
if (!is_numeric($values['num_of_shards']) || $values['num_of_shards'] < 1) {
$form_state
->setErrorByName('num_of_shards', t('Invalid number of shards.'));
}
if (!is_numeric($values['num_of_replica'])) {
$form_state
->setErrorByName('num_of_replica', t('Invalid number of replica.'));
}
}
public function save(array $form, FormStateInterface $form_state) {
$cluster = $this->entityTypeManager
->getStorage('elasticsearch_cluster')
->load($this->entity->server);
$client = $this->clientManager
->getClientForCluster($cluster);
$index_params['index'] = $this->entity->index_id;
$index_params['body']['settings']['number_of_shards'] = $form_state
->getValue('num_of_shards');
$index_params['body']['settings']['number_of_replicas'] = $form_state
->getValue('num_of_replica');
$index_params['body']['settings']['codec'] = $form_state
->getValue('codec');
try {
$response = $client
->indices()
->create($index_params);
if ($client
->CheckResponseAck($response)) {
drupal_set_message(t('The index %index having id %index_id has been successfully created.', array(
'%index' => $form_state
->getValue('name'),
'%index_id' => $form_state
->getValue('index_id'),
)));
}
else {
drupal_set_message(t('Fail to create the index %index having id @index_id', array(
'%index' => $form_state
->getValue('name'),
'@index_id' => $form_state
->getValue('index_id'),
)), 'error');
}
parent::save($form, $form_state);
drupal_set_message(t('Index %label has been added.', array(
'%label' => $this->entity
->label(),
)));
$form_state
->setRedirect('elasticsearch_connector.config_entity.list');
} catch (\Exception $e) {
drupal_set_message($e
->getMessage(), 'error');
}
}
}