Import/Pages.php
authorAlan Knowles <alan@roojs.com>
Thu, 27 Apr 2017 01:42:06 +0000 (09:42 +0800)
committerAlan Knowles <alan@roojs.com>
Thu, 27 Apr 2017 01:42:06 +0000 (09:42 +0800)
Import/Pages.php

index e69de29..4603560 100644 (file)
@@ -0,0 +1,338 @@
+<?php
+
+require_once 'Pman.php';
+
+class Pman_Cms_Import_Pages extends Pman
+{
+    
+    static $cli_desc = "Imports a ZIP file exported from the CMS";
+    static $cli_opts = array(
+        'file' => array(
+            'desc' => 'zip file directory',
+            'short' => 'f',
+            'default' => '',
+            'min' => 1,
+            'max' => 1,
+        ),
+    );
+    
+    var $cli = false;
+    
+    var $opts;
+    
+    var $mapping = array();
+    var $links = array();
+    
+    function getAuth() 
+    {
+        $ff = HTML_FlexyFramework::get();
+        
+        if (empty($ff->cli)) {
+            $this->jerr('cli Only');
+        }
+        
+        if(!$this->getAuthUser()){
+            return false;
+        }
+        
+        return true;
+    }
+    
+    function getAuthUser()
+    {
+        $ff = HTML_FlexyFramework::get();
+        
+        $tbl = empty($ff->Pman['authTable']) ? 'core_person' : $ff->Pman['authTable'];
+        
+        $this->authUser = DB_DataObject::factory($tbl);
+        
+        $this->authUser->orderBy('id DESC');
+        
+        if(!$this->authUser->find(true)){
+            return false;
+        }
+        
+        return true;
+    }
+     
+    function get($tbl, $opts)
+    {
+        PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array($this, 'onPearError'));
+        
+        if(empty($opts['file']) || !file_exists($opts['file'])){
+            $this->jerr('Please assign your zip file path [-f]');
+        }
+        
+//        Pman/Hpasite/DummyPages/cms-page-dummy-page.zip
+        
+        $this->zipFile = $opts['file'];
+        
+        $this->check_environment();
+        
+        $this->check_database();
+        
+        if(!file_exists($this->zipFile)){
+            $this->jerr("Please upload the zip to {$this->zipFile}");
+        }
+        
+        $this->zip = new ZipArchive();
+
+        if ($this->zip->open($this->zipFile) !== true) {
+            $this->jerr('Can not open zip file');
+        }
+        
+        $this->tempDir = ini_get('session.save_path');
+        
+        $this->zip->extractTo($this->tempDir);
+        
+        $this->zip->close();
+        
+        $json = file_get_contents("{$this->tempDir}/data.json");
+        
+        if($json === false){
+            $this->jerr('Can not load the data.json');
+        }
+        
+        $this->data = json_decode($json, true);
+        
+        $this->processCmsPageType();
+        
+        $this->processCmsTemplate();
+        
+        $this->processCmsTemplateElement();
+        
+        $this->processCmsPages();
+        
+        $this->processPageLinks();
+        
+        $this->processCategories();
+        
+        $this->processImages();
+        
+        $this->clean();
+        
+        $this->jok("OK");
+    }
+    
+    function check_environment()
+    {
+        $ui = posix_getpwuid(posix_geteuid());
+        
+        if(empty($ui['name']) || $ui['name'] != 'www-data'){
+            $this->jerr('Please use www-data');
+        }
+        
+        if (!extension_loaded('zip')) { // sudo apt-get install php5.6-zip??
+            $this->jerr('Please install php zip extension');
+        }
+    }
+    
+    function check_database()
+    {
+        $cms_page = DB_DataObject::factory('cms_page');
+        
+        if($cms_page->count()){
+            $this->jerr('Please delete all cms pages before running this');
+        }
+    }
+    
+    function clean()
+    {
+        unlink("{$this->tempDir}/data.json");
+        
+        if(empty($this->data['photos'])){
+            return;
+        }
+        
+        foreach ($this->data['photos'] as $k => $v){
+            unlink("{$this->tempDir}/{$v}");
+        }
+        
+    }
+    
+    function processCmsPageType()
+    {
+        $this->mapping['types'] = array();
+                
+        if(empty($this->data['types'])){
+            $this->jerr('Invalid Json Data [types]');
+        }
+        
+        foreach ($this->data['types'] as $k => $v){
+            
+            $core_enum = DB_DataObject::factory('core_enum');
+            $core_enum->setFrom(array(
+                'etype' => $v['etype'],
+                'active' => 1,
+                'name' => $v['name']
+            ));
+            
+            if(!$core_enum->find(true)){
+                $this->jerr("Can not found type '{$v['name']}', type run UpdateDatabase");
+            }
+            
+            $this->mapping['types'][$v['id']] = $core_enum->id;
+        }
+        
+    }
+    
+    function processCmsTemplate()
+    {
+        $this->mapping['templates'] = array();
+        
+        if(empty($this->data['templates'])){
+            $this->jerr('Invalid Json Data [templates]');
+        }
+        
+        foreach ($this->data['templates'] as $k => $v){
+            
+            $cms_template = DB_DataObject::factory('cms_template');
+            $cms_template->setFrom(array(
+                'template' => $v['template']
+            ));
+            
+            if(!$cms_template->find(true)){
+                $this->jerr("Can not found template '{$v['template']}', type run UpdateDatabase");
+            }
+            
+            $this->mapping['templates'][$v['id']] = $cms_template->id;
+        }
+        
+    }
+    
+    function processCmsTemplateElement()
+    {
+        $this->mapping['elements'] = array();
+        
+        if(empty($this->data['elements'])){
+            $this->jerr('Invalid Json Data [elements]');
+        }
+        
+        foreach ($this->data['elements'] as $k => $v){
+            
+            $cms_template_element = DB_DataObject::factory('cms_template_element');
+            $cms_template_element->setFrom(array(
+                'name' => $v['name'],
+                'template_id' => $this->mapping['templates'][$v['template_id']]
+            ));
+            
+            if(!$cms_template_element->find(true)){
+                $this->jerr("Can not found element'{$v['name']}', type run UpdateDatabase");
+            }
+            
+            $this->mapping['elements'][$v['id']] = $cms_template_element->id;
+        }
+        
+    }
+    
+    function processCmsPages()
+    {
+        if(empty($this->data['pages'])){
+            $this->jerr('Invalid Json Data [pages]');
+        }
+        
+        foreach ($this->data['pages'] as $k => $v){
+            
+            $cms_page = DB_DataObject::factory('cms_page');
+            
+            $cms_page->setFrom($v);
+            
+            $cms_page->setFrom(array(
+                'id' => 0,
+                'author_id' => $this->authUser->id,
+                'template_id' => (empty($v['template_id'])) ? 0 : $this->mapping['templates'][$v['template_id']],
+                'element_id' => (empty($v['element_id'])) ? 0 : $this->mapping['elements'][$v['element_id']],
+                'page_type_id' => (empty($v['page_type_id'])) ? 0 : $this->mapping['types'][$v['page_type_id']],
+                'parent_id' => 0,
+                'menu_page_id' => 0,
+                'translation_of_id' => 0,
+                'to_replace_id' => 0, // not sure the usage, but let's handle it as well
+                'category_page_id' => 0 // not sure the usage, but let's handle it as well
+            ));
+            
+            $cms_page->insert();
+            
+            $this->mapping['pages'][$v['id']] = $cms_page->id;
+            
+            $this->links[$cms_page->id] = array(
+                'parent_id' => (empty($v['parent_id'])) ? 0 : $v['parent_id'],
+                'menu_page_id' => (empty($v['menu_page_id'])) ? 0 : $v['menu_page_id'],
+                'translation_of_id' => (empty($v['translation_of_id'])) ? 0 : $v['translation_of_id'],
+                'to_replace_id' => (empty($v['to_replace_id'])) ? 0 : $v['to_replace_id'],
+                'category_page_id' => (empty($v['category_page_id'])) ? 0 : $v['category_page_id']
+            );
+        }
+        
+    }
+    
+    function processPageLinks()
+    {
+        foreach ($this->links as $k => $v){
+            
+            $cms_page = DB_DataObject::factory('cms_page');
+            
+            if(!$cms_page->get($k)){
+                continue;
+            }
+            
+            $o = clone ($cms_page);
+            
+            $cms_page->setFrom(array(
+                'parent_id' => (empty($v['parent_id'])) ? 0 : $this->mapping['pages'][$v['parent_id']],
+                'menu_page_id' => (empty($v['menu_page_id'])) ? 0 : $this->mapping['pages'][$v['menu_page_id']],
+                'translation_of_id' => (empty($v['translation_of_id'])) ? 0 : $this->mapping['pages'][$v['translation_of_id']],
+                'to_replace_id' => (empty($v['to_replace_id'])) ? 0 : $this->mapping['pages'][$v['to_replace_id']],
+                'category_page_id' => (empty($v['category_page_id'])) ? 0 : $this->mapping['pages'][$v['category_page_id']]
+            ));
+            
+            $cms_page->update($o);
+        }
+    }
+    
+    function processCategories()
+    {
+        if(empty($this->data['categories'])){
+            return;
+        }
+        
+        foreach ($this->data['categories'] as $k => $v){
+            
+            $cms_page_category = DB_DataObject::factory('cms_page_category');
+            $cms_page_category->setFrom(array(
+                'page_id' => $this->mapping['pages'][$v['page_id']],
+                'category_id' => $this->mapping['pages'][$v['category_id']]
+            ));
+            
+            if($cms_page_category->find(true)){
+                return;
+            }
+            
+            $cms_page_category->insert();
+        }
+        
+    }
+    
+    function processImages()
+    {
+        if(empty($this->data['images'])){
+            return;
+        }
+        
+        foreach ($this->data['images'] as $k => $v){
+            
+            $images = DB_DataObject::factory('Images');
+            $images->setFrom($v);
+            
+            $images->setFrom(array(
+                'id' => 0,
+                'onid' => $this->mapping['pages'][$v['onid']]
+            ));
+            
+            $images->createFrom("{$this->tempDir}/{$v['filename']}", $v['filename']);
+            
+        }
+        
+    }
+    
+}