content_export_yaml-8.x-2.9/src/ContentExport.php

src/ContentExport.php
<?php

namespace Drupal\content_export_yaml;


use Symfony\Component\Yaml\Dumper;
use Symfony\Component\Yaml\Yaml as SymfonyYaml;
use Symfony\Component\Yaml\Parser;
use Symfony\Component\HttpFoundation\RedirectResponse;

/**
 * Created by PhpStorm.
 * User: USER
 * Date: 11/13/18
 * Time: 2:04 PM
 */
class ContentExport
{

    public $logger;
    public $db;

    public function __construct()
    {
        $this->logger = \Drupal::logger('content_export_yaml');
    }

    function content_type_list()
    {
        $node_types = \Drupal\node\Entity\NodeType::loadMultiple();
        $options = [];
        foreach ($node_types as $node_type) {
            $options[$node_type->id()] = $node_type->label();
        }
        return $options;
    }

    /**
     * Get all entity by entity
     */
    function load_entity_list($entity, $bundle, $ranges_nid = [])
    {
        $id_label = \Drupal::entityTypeManager()->getDefinition($entity)->getKey('id');
        // print_r(\Drupal::entityTypeManager()->getDefinition($entity)->getKeys());
        $bundle_label = \Drupal::entityTypeManager()->getDefinition($entity)->getKey('bundle');

        $factory = \Drupal::entityTypeManager()->getStorage($entity)->getQuery();
        if ($bundle_label != "") {
            $factory->condition($bundle_label, $bundle);
        }
        if (!empty($ranges_nid) && isset($ranges_nid[0]) && isset($ranges_nid[1])) {
            if(is_string($ranges_nid[0]) && is_string($ranges_nid[1])
            ){
                if($ranges_nid[0] == $ranges_nid[1]){
                      $factory->condition($id_label, ($ranges_nid[1]) , '=');
                }else{
                    if(is_numeric($ranges_nid[0]) && is_numeric($ranges_nid[1])){
                        $factory->condition($id_label, $ranges_nid, 'BETWEEN');
                    }else{
                        return [];
                    }
                }

            }
        }
        return $factory->execute();
    }
 /**
     * Get all entity by entity
     */
    function load_entity_list_range($entity, $bundle, $ranges_nid = [])
    {
        $id_label = \Drupal::entityTypeManager()->getDefinition($entity)->getKey('id');
        // print_r(\Drupal::entityTypeManager()->getDefinition($entity)->getKeys());
        $bundle_label = \Drupal::entityTypeManager()->getDefinition($entity)->getKey('bundle');

        $factory = \Drupal::entityTypeManager()->getStorage($entity)->getQuery();
        if ($bundle_label != "") {
            $factory->condition($bundle_label, $bundle);
        }
        if (!empty($ranges_nid) && isset($ranges_nid[0]) && isset($ranges_nid[1])) {
            if(is_string($ranges_nid[0]) && is_string($ranges_nid[1])
            ){
                if(is_numeric($ranges_nid[0]) && is_numeric($ranges_nid[1])){
                    $factory->range($ranges_nid[0], $ranges_nid[1]);
                }else{
                    return [];
                }

            }
        }
        return $factory->execute();
    }

    /**
     * Get one Entity  exported
     * @param $entity String node  eg : /taxonomy_term /...
     */
    function load_entity_config_list_with_path($entity, $bundle, $ranges_nid = [], $path = NULL)
    {
        $items = [];
        if ($path) {
            $themes_str = $path;
        } else {
            $config = \Drupal::config('content_export_yaml.contentexportsetting');
            $themes_str = $config->get('path_export_content_folder');
        }

        if ($themes_str) {
            if (empty($ranges_nid)) {
                if ($bundle) {
                    $items = $this->readDirectory($themes_str . "/" . $entity . "/" . $bundle);
                } else {
                    $items = $this->readDirectory($themes_str . "/" . $entity);
                }
                foreach ($items as $key => $file) {
                    if (file_exists($file)) {
                        $items[$key] = file_get_contents($file, FILE_USE_INCLUDE_PATH);
                    } else {
                        $this->logger->error('File  not find exist : ' . $file);
                    }
                }
            } else {
                for ($i = $ranges_nid[0]; $i < $ranges_nid[0] + 1; $i++) {
                    if ($bundle) {
                        $file = DRUPAL_ROOT . '/' . $themes_str . "/" . $entity . "/" . $bundle . "/" . $i . ".yml";
                    } else {
                        $file = DRUPAL_ROOT . '/' . $themes_str . "/" . $entity . "/" . $i . ".yml";
                    }
                    if (file_exists($file)) {
                        $items[$i] = file_get_contents($file, FILE_USE_INCLUDE_PATH);
                    } else {
                        $this->logger->error('File  not find exist : ' . $file);
                    }
                }
            }
        } else {
            $this->logger->error('Path directory empty ');
        }
        return $items;
    }


    /***
     *  Get All Entity Exported
     */
    function load_entity_config_list($entity, $bundle = NULL, $ranges_nid = [])
    {
        $items = [];
        if ($bundle == 'all') {
            $bundle = NULL;
        }
        $config = \Drupal::config('content_export_yaml.contentexportsetting');
        $themes_str = $config->get('path_export_content_folder');
        if ($themes_str) {
            if (empty($ranges_nid)) {
                if ($bundle) {
                    $items = $this->readDirectory($themes_str . "/" . $entity . "/" . $bundle);
                } else {
                    $items = $this->readDirectory($themes_str . "/" . $entity);
                }
                foreach ($items as $key => $file) {
                    if (file_exists($file)) {
                        $items[$key] = file_get_contents($file, FILE_USE_INCLUDE_PATH);
                    } else {
                        $this->logger->error('File  not find exist : ' . $file);
                    }
                }
            } else {
                if(is_numeric($ranges_nid[0]) && is_numeric($ranges_nid[1])) {
                    for ($i = $ranges_nid[0]; $i < $ranges_nid[1] + 1 ; $i++) {

                        if ($bundle) {
                            $file = DRUPAL_ROOT . '/' . $themes_str . "/" . $entity . "/" . $bundle . "/" . $i . ".yml";
                        } else {
                            $file = DRUPAL_ROOT . '/' . $themes_str . "/" . $entity . "/" . $i . ".yml";
                        }
                        if (file_exists($file)) {
                            $items[$i] = file_get_contents($file, FILE_USE_INCLUDE_PATH);
                        } else {
                            $this->logger->warning('File  not find exist : ' . $file);
                        }
                    }
                }else{
                    if($ranges_nid[0] == $ranges_nid[1]) {
                        $file = DRUPAL_ROOT . '/' . $themes_str . "/" . $entity . "/" . $ranges_nid[1] . ".yml";
                        if (file_exists($file)) {
                            $items[$ranges_nid[0]] = file_get_contents($file, FILE_USE_INCLUDE_PATH);
                        }
                    }
                }
            }
        } else {
            $this->logger->error('Path directory empty ');
        }
        return $items;
    }

    protected function readDirectory($directory)
    {
        $path_file = [];
        if (is_dir(DRUPAL_ROOT . $directory)) {
            $it = scandir(DRUPAL_ROOT . $directory);
            if (!empty($it)) {
                foreach ($it as $fileinfo) {
                    if ($fileinfo && strpos($fileinfo, '.yml') !== FALSE) {
                        $file = DRUPAL_ROOT . $directory . "/" . $fileinfo;
                        if (file_exists($file)) {
                            $path_file[] = DRUPAL_ROOT . $directory . "/" . $fileinfo;
                        }
                    }
                }
            }
        }
        return $path_file;
    }

    function import($id, $entity)
    {
        return $this->importEntity($id, $entity);
    }

    /**
     * Convert YAML to OBJECT
     */
    function importEntity($yaml_object, $entity)
    {
        $parsed = new Parser();
        $object = $parsed->parse($yaml_object, SymfonyYaml::PARSE_OBJECT);
        if (is_object($object)) {
            return $this->savingEntity($object, $entity);
        } else {
            $this->logger->error('Failed to save item');
        }
        return FALSE;
    }

    /**
     * Save all Entity
     */
    function savingEntity($enity_clone, $entity)
    {
        $id_label = \Drupal::entityTypeManager()->getDefinition($entity)->getKey('id');
        $key_label = \Drupal::entityTypeManager()->getDefinition($entity)->getKey('label');
        $bundle_label = \Drupal::entityTypeManager()->getDefinition($entity)->getKey('bundle');
        if ($entity == "user" && $enity_clone->id() == 1) {
            \Drupal::messenger()->addMessage(t($entity . " root user " . $enity_clone->label() . " uid=" . $enity_clone->id() . " can not update "), 'status');
            return FALSE;
        }
        if ($bundle_label == "") {
            $filter = [
                $id_label => $enity_clone->id()
            ];
        } else {
            $filter = [
                $id_label => $enity_clone->id(),
                $bundle_label => $enity_clone->bundle(),
                $key_label => $enity_clone->label(),
            ];
        }
        $entity_list = \Drupal::entityTypeManager()
            ->getStorage($entity)
            ->loadByProperties($filter);
        if (!empty($entity_list)) {

            $status = $enity_clone->save();
            if ($status == 2) {
                if ($bundle_label == "") {
                    $bundle_label = $entity;
                }else{
                    $bundle_label = $enity_clone->bundle();
                }
                \Drupal::messenger()->addMessage(t($bundle_label . " with " . $id_label . "=" . $enity_clone->id() . " update "), 'status');
            }
        } else {
            $enity_clone->{$id_label} = NULL;
            // Also handle modules that attach a UUID to the node.
            $enity_clone->uuid = \Drupal::service('uuid')->generate();
            // Anyonmymous users don't have a name.
            $enity_clone->created = time();
            //$enity_clone->uid = 0;
            $status = $enity_clone->save();
            if ($status == 1) {
                if ($bundle_label == "") {
                    $bundle_label = $entity;
                }else{
                    $bundle_label = $enity_clone->bundle();
                }
                \Drupal::messenger()->addMessage(t($bundle_label . " with " . $id_label . "=" . $enity_clone->id() . " created "), 'status');
            }
        }

        return $status;
    }

    /****
     *  Export All entity
     */
    function export($id, $entity, $type = NULL)
    {
        $config = \Drupal::config('content_export_yaml.contentexportsetting');
        $themes_str = $config->get('path_export_content_folder');
        return $this->exportBase($id, $entity, $themes_str);

    }

    function exportBase($id, $entity, $export_path)
    {
        if (is_object($id)) {
            $item = $id;
        } else {
            $item = \Drupal::entityTypeManager()
                ->getStorage($entity)->load($id);
        }
        if (is_object($item)) {
            $yaml_content = $this->parserYAMLObject($item);
            if ($export_path) {
                $export_path = DRUPAL_ROOT . '/' . $export_path;
                $final_path = $export_path . '/' . $entity . '/' . $item->bundle();
                $status = $this->generateFile($final_path, $item->id(), $yaml_content);
                //@todo move to manager_content_export_yaml
                // if($status){
                //   $dbstatus = $this->db->is_exist($item->id(),$entity,$item->bundle());
                //   if(empty($dbstatus)){
                //     $fields = array(
                //       'entity_id'=> $item->id() ,
                //       'entity_type' => $entity,
                //       'bundle' => $item->bundle(),
                //       'label' => $item->label(),
                //       'file' => $themes_str_path.'/'.$entity.'/'.$item->bundle().'/'.$item->id().'.yml'
                //     );
                //     $this->db->insert($fields);
                //   }
                // }
                return $status;
            } else {
                $this->logger->error('Path directory empty ');
                \Drupal::messenger()->addMessage(t('Path directory empty.'), 'error');

                return FALSE;
            }
        }
        return FALSE;
    }

    function exportWithPath($id, $entity, $options = [])
    {
        $config = \Drupal::config('content_export_yaml.contentexportsetting');
        $path_config = $config->get('path_export_content_folder');
        $themes_str_path = isset($options["path"]) ? $options["path"] : $path_config;
        return $this->exportBase($id, $entity, $themes_str_path);
    }

    /***
     * Convert OBJECT to YAML
     */
    function parserYAMLObject($entity)
    {
        $yaml = new Dumper(2);
        return $yaml->dump($entity, PHP_INT_MAX, 0, SymfonyYaml::DUMP_OBJECT);
    }

    /**
     * @param $directory String
     * location folder of exported entity
     * @param $filename String
     * @param  $content String
     * Yaml content
     * @return bool
     */
    function generateFile($directory, $filename, $content)
    {
        $fileSystem = \Drupal::service('file_system');
        if (!is_dir($directory)) {
            if ($fileSystem->mkdir($directory, 0777, TRUE) === FALSE) {
                $this->logger->error('Failed to create directory ' . $directory);
                \Drupal::messenger()->addMessage(t('Failed to create directory ' . $directory), 'error');
                return FALSE;
            }
        }
        if (file_put_contents($directory . '/' . $filename . '.yml', $content) === FALSE) {
            \Drupal::messenger()->addMessage(t('Failed to write file ' . $filename), 'error');
            $this->logger->error('Failed to write file ' . $filename);
            return FALSE;
        }
        if (@chmod($directory . '/' . $filename . '.html.twig', 0777)) {
            \Drupal::messenger()->addMessage(t('Failed to change permission file ' . $filename), 'error');
            $this->logger->error('Failed to change permission file ' . $filename);
        }
        return TRUE;
    }

    /**
     * download_yml
     */
    public function download_yml($yml)
    {
        $path_file = \Drupal::service('file_system')->realpath("public://temp_yml");
        $file_name = "download";
        $this->delete($path_file . "/" . $file_name . ".yml");
        $status = $this->yml_copy($file_name, $yml, $path_file);
        if ($status) {
            $file_temp = "/sites/default/files/temp_yml/" . $file_name . ".yml";
            @chmod($file_temp, 0777);
            return $file_temp;
        } else {
            \Drupal::messenger()->addMessage(t("failed to download"), 'error');
        }
    }

    /**
     * Copy yaml to another folder
     */
    function yml_copy($file_name, $file_with_path, $path_export)
    {
        $file_full_path = DRUPAL_ROOT . $file_with_path;
        $fileSystem = \Drupal::service('file_system');
        if (!is_dir($path_export)) {
            if ($fileSystem->mkdir($path_export, 0777, TRUE) === FALSE) {
                $this->logger->error('Failed to create directory ' . $path_export);
                return FALSE;
            }
        }
        if (!copy($file_full_path, $path_export . "/" . $file_name . ".yml")) {
            \Drupal::messenger()->addMessage(t("failed to copy $file_with_path"), 'error');
            return FALSE;
        } else {
            \Drupal::messenger()->addMessage(t("Upload Success"), 'error');
            @chmod($path_export . "/" . $file_name . ".yml", 0777);
            return TRUE;
        }
    }

    /**
     * delete file in folder
     * @param $file  String
     * path of file for eg : /sites/default/files/export/node/10.yml
     */
    function delete($file)
    {
        $file = DRUPAL_ROOT . $file;
        if (file_exists($file)) {
            if (is_writable($file) && @unlink($file)) {
                return TRUE;
            } else {
                $this->logger->error('File  not write : ' . $file);
                \Drupal::messenger()->addMessage(t('File  not write : ' . $file), 'error');

                return FALSE;
            }
        }
        return FALSE;
    }

    /***
     * get all entity expoted in folder
     */
    function listFolderFiles($dir)
    {
        $fileInfo = scandir($dir);
        $allFileLists = [];
        $parsed = new Parser();

        foreach ($fileInfo as $folder) {


            if ($folder !== '.' && $folder !== '..') {
                if (is_dir($dir . DIRECTORY_SEPARATOR . $folder) === TRUE) {

                    $allFileLists[$folder] = $this->listFolderFiles($dir . DIRECTORY_SEPARATOR . $folder);
                } else {
                    $path_file = $dir . DIRECTORY_SEPARATOR . $folder;
                    $ext = pathinfo($path_file, PATHINFO_EXTENSION);
                    if (file_exists($path_file) && $ext == 'yml') {
                        $item_yaml = file_get_contents($path_file, FILE_USE_INCLUDE_PATH);
                        if ($item_yaml) {
                            try {
                                $item_object = \Symfony\Component\Yaml\Yaml::parse($item_yaml, SymfonyYaml::PARSE_OBJECT);
                            } catch (Exception $e) {
                                \Drupal::messenger()->addMessage(t('Message: ' . $e->getMessage()), 'error');
                            }
                            if ($item_object && is_object($item_object)) {
                                $path = str_replace(DRUPAL_ROOT, "", $path_file);
                                $allFileLists[$folder] = [
                                    "file" => $folder,
                                    "path" => $path,
                                    "entity" => $item_object,
                                ];
                            }
                        }
                    }
                }
            }
        }

        return $allFileLists;
    }

    /***
     * get path root of exported entity
     * @param $entity Object
     * @return string
     */
    function get_export_path($entity)
    {
        if (is_object($entity)) {
            $entity_type = $entity->getEntityTypeId();
            $type = $entity->bundle();
            $config = \Drupal::config('content_export_yaml.contentexportsetting');
            $themes_str = $config->get('path_export_content_folder');
            if ($themes_str) {
                $themes_str = DRUPAL_ROOT . $themes_str;
                if ($type) {
                    $final_path = $themes_str . '/' . $entity_type . '/' . $type;
                } else {
                    $final_path = $themes_str . '/' . $entity_type;
                }
                return $final_path;
            } else {
                $this->logger->error('Path directory empty ');
                return FALSE;
            }
        }
    }

    /**
     * redirect to url
     */
    public function redirectTo($url, $lang = NULL)
    {
        global $base_url;
        $path = $base_url . '/' . $url;
        $response = new RedirectResponse($path, 302);
        $response->send();
        return;
    }
}

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

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