dhis2-8.x-1.x-dev/src/Form/MetadataExtractForm.php

src/Form/MetadataExtractForm.php
<?php

namespace Drupal\dhis\Form;


use Drupal\Core\Config\ConfigFactory;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\dhis\Entity\OrganisationUnit;
use Drupal\dhis\Entity\DataElement;
use Drupal\dhis\Exceptions\DhisEntityExistsException;
use Drupal\dhis\Services\DataElementServiceInterface;
use Drupal\dhis\Services\DhisService;
use Drupal\dhis\Services\OrgUnitServiceInterface;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\taxonomy\Entity\Term;
use Drupal\taxonomy\Entity\Vocabulary;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\File\FileSystem;
use \Drupal\dhis\Util\CsvHandler;
use Drupal\Core\Entity\EntityTypeManager;

class MetadataExtractForm extends FormBase
{
    protected $config_factory;
    protected $orgUnitService;
    protected $dataElementService;
    private $content;
    private $file_system;
    private $entity_manager;
    protected $dhis_service;
    private $deEntityStatus;
    private $orgUnitEntityStatus;

    public function __construct(ConfigFactory $config_factory, FileSystem $file_system, EntityTypeManager $entity_manager,
                                DhisService $dhis_service, OrgUnitServiceInterface $orgUnitService, DataElementServiceInterface $dataElementService)
    {
        $this->config_factory = $config_factory->getEditable('dhis.settings');
        $this->file_system = $file_system;
        $this->entity_manager = $entity_manager;
        $this->dhis_service = $dhis_service;
        $this->orgUnitService = $orgUnitService;
        $this->dataElementService = $dataElementService;
        $this->deEntityStatus = $dhis_service->checkDhisEntities('data_element');
        $this->orgUnitEntityStatus = $dhis_service->checkDhisEntities('organisation_unit');
    }

    /**
     * {@inheritdoc}
     */
    public function getFormId()
    {

        return 'metadata_extract_form';
    }

    /**
     * {@inheritdoc}
     */
    public function buildForm(array $form, FormStateInterface $form_state)
    {
        $form['#attached']['library'][] = 'dhis/dhis_fetch_metadata';
        $form['dhis'] = array(
            '#type' => 'fieldset',
            '#title' => $this->t(''),
        );
        $form['dhis']['description'] = array(
            '#type' => 'item',
            //'#title' => t('Metadata Fetch '),
            '#markup'=> t('Click button below to begin Metadata fetch.'),
        );

        if ($this->config_factory->get('dhis.dataElements') == 1 && $this->config_factory->get('dhis.metadata_delete') == 1){
            $form['dhis']['dataelements']= array(
                '#attributes' => array('class' => array('metadata-warning')),
                '#type' => 'checkbox',
                '#disabled' => TRUE,
                '#title' => $this->t('All existing data elements ('.$this->deEntityStatus['count'].') will be deleted before fetch.'),
                '#default_value' => 1,
            );
        }
        if ($this->config_factory->get('dhis.orgUnits') == 1 && $this->config_factory->get('dhis.metadata_delete') == 1){
            $form['dhis']['orgunits'] = array(
                '#attributes' => array('class' => array('metadata-warning')),
                '#type' => 'checkbox',
                '#disabled' => TRUE,
                '#title' => $this->t('All existing organisations units ('.$this->orgUnitEntityStatus['count'].') will be deleted before fetch.'),
                '#default_value' => 1,
            );
        }
        $form['dhis']['metadata_extract'] = array(
            '#type' => 'submit',
            '#value' => t('Fetch Metadata'),
        );

        if($this->config_factory->get('dhis.dataElements') == 0 && $this->config_factory->get('dhis.orgUnits') == 0){
            $form['dhis']['description']['#markup'] = $this->t('Metadata fetch config settings have been turned off.');
            $form['dhis']['metadata_extract']['#attributes'] = array('class' => array('metadata-fetch'));
        }

        return $form;
    }

    /**
     * {@inheritdoc}
     */
    public function submitForm(array &$form, FormStateInterface $form_state)
    {
        $config = $this->config_factory;
        $orgUnits = $config->get('dhis.orgUnits');
        $dataElements = $config->get('dhis.dataElements');
        /*$indicators = $config->get('dhis.indicators');
        $orgUnitGrp = $config->get('dhis.orgUnitGrp');*/
        $csvHandler = new CsvHandler($this->file_system);


        if ($orgUnits == 1) {
            if ($this->config_factory->get('dhis.metadata_delete') == 1){
                $this->dhis_service->removeDhisEntities('organisation_unit');
                //proceed to fetch
                $this->content = $this->orgUnitService->getOrgUnits(FALSE);
                $this->content = $this->content['organisationUnits'];
                $this->dhis_service->createDhisEntities($this->content, 'organisationunit', $csvHandler->readCsv('ou.csv'));
                $this->messenger()->addStatus('Sucessfully pulled organisation units from DHIS2');
            }
            else{
                if ($this->orgUnitEntityStatus['hasEntities']){
                    //throw organisation units exist exception
                    try{
                        throw new DhisEntityExistsException("Organisation units exist");
                    }
                    catch (DhisEntityExistsException $e){
                        $this->messenger()->addError(t($e->errorMessage()));
                    }
                }
                else {
                    //proceed to fetch
                    $this->content = $this->orgUnitService->getOrgUnits(FALSE);
                    $this->content = $this->content['organisationUnits'];
                    $this->dhis_service->createDhisEntities($this->content, 'organisationunit', $csvHandler->readCsv('ou.csv'));
                    $this->messenger()->addStatus('Sucessfully pulled organisation units from DHIS2');

                }
            }
        }

        if ($dataElements == 1) {
            if($this->config_factory->get('dhis.metadata_delete') == 1){
                $this->dhis_service->removeDhisEntities('data_element');
                $this->content = $this->dataElementService->getDataElements(FALSE);
                $this->content = $this->content['dataElements'];
                $this->dhis_service->createDhisEntities($this->content, 'dataelement', $csvHandler->readCsv('dx.csv'));
                $this->messenger()->addStatus('Sucessfully pulled Data Elements units from DHIS2');
            }
            else{
                if ($this->deEntityStatus['hasEntities']){
                    //throw organisation units exist exception
                    try{
                        throw new DhisEntityExistsException("Data elements exist.");
                    }
                    catch (DhisEntityExistsException $e){
                        $this->messenger()->addError(t($e->errorMessage()));
                    }
                }
                else{
                    $this->content = $this->dataElementService->getDataElements(FALSE);
                    $this->content = $this->content['dataElements'];
                    $this->dhis_service->createDhisEntities($this->content, 'dataelement', $csvHandler->readCsv('dx.csv'));
                    $this->messenger()->addStatus('Sucessfully pulled Data Elements units from DHIS2');
                }
            }
        }
    }

    public static function create(ContainerInterface $container)
    {
        return new static(
            $container->get('config.factory'),
            $container->get('file_system'),
            $container->get('entity_type.manager'),
            $container->get('dhis_service'),
            $container->get('dhis.orgunit'),
            $container->get('dhis.dataelement')
        );
    }

    private function createVocabulary($metadata, $vocabularyName)
    {
        $vid = str_replace(' ', '_', 'dhis_' . strtolower($vocabularyName));
        $vocabulary = Vocabulary::create(['name' => $vocabularyName, 'vid' => $vid,])->save();
        $field_name = str_replace(' ', '_', 'dhis2_uid' . strtolower($vocabularyName));
        FieldStorageConfig::create(
            array(
                'field_name' => $field_name,
                'entity_type' => 'taxonomy_term',
                'type' => 'text',
                'settings' => [
                    'max_length' => '12',
                ],
                'cardinality' => 1,
            )
        )->save();
        FieldConfig::create([
            'field_name' => $field_name,
            'entity_type' => 'taxonomy_term',
            'bundle' => $vid,
            'label' => $vocabularyName . ' uid',
            'field_type' => 'text',
            'required' => TRUE,
            'settings' => [

            ]
        ])->save();
        foreach ($metadata as $item) {
            Term::create([
                'name' => $item['displayName'],
                'vid' => $vid,
                //'dhis2_uid'.strtolower($vocabularyName) => $item['id']
                'description' => $item['id']
            ])->save();
        }
    }

    private function createEntities($metadata, $entity_type, $list = [])
    {
        if ($entity_type == 'organisationunit') {
            foreach ($metadata as $item) {
                if (count($list) == 0) {
                    $this->createOrganisationUnitEntity($item);
                } else {
                    if (in_array($item['id'], $list)) {
                        $this->createOrganisationUnitEntity($item);
                    }
                }
            }
        } elseif ($entity_type == 'dataelement') {
            //drupal_set_message(json_encode($metadata, 1));
            foreach ($metadata as $item) {
                if (count($list) == 0) {
                    $this->createDataElementEntity($item);
                } else {
                    if (in_array($item['id'], $list)) {
                        $this->createDataElementEntity($item);
                    }
                }
            }
        } else {
            //add indicators
        }
    }

    private function createDataElementEntity($item)
    {
        DataElement::create(['name' => $item['displayName'],
            'deuid' => $item['id']])->save();
    }

    private function createOrganisationUnitEntity($item)
    {
        OrganisationUnit::create(['name' => $item['displayName'],
            'orgunituid' => $item['id']])->save();
    }

    private function removeEntities($entity_id)
    {
        $vids = [];
        if ($entity_id == 'data_element') {
            $vids = DataElement::loadMultiple();
        }
        if ($entity_id == 'organisation_unit') {
            $vids = OrganisationUnit::loadMultiple();
        }
        $this->entity_manager->getStorage($entity_id)->delete($vids);
    }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc