private function getExtensionsList()
 {
     $e = new AExtensionManager();
     $extensions_list = $e->getExtensionsList();
     $installed_extensions = $this->extensions->getInstalled('');
     if ($extensions_list->num_rows) {
         foreach ($extensions_list->rows as $extension) {
             //skip default
             if (strpos($extension['key'], 'default') !== false) {
                 continue;
             }
             // if extension is installed
             if (in_array($extension['key'], $installed_extensions)) {
                 $status = $extension['status'] ? $this->language->get('text_enabled') : $this->language->get('text_disabled');
                 $extension_name = trim($this->extensions->getExtensionName($extension['key']));
                 $list[$extension['key']] = array('name' => $extension_name, 'type' => $extension['type'], 'category' => $extension['category'], 'status' => $status, 'license_key' => $extension['license_key'], 'version' => $extension['version']);
             }
         }
     }
     return $list;
 }
 /**
  * @param array $data
  * @return bool
  * @throws AException
  */
 public function generateExtension($data = array())
 {
     $project_xml = $config_xml = array();
     //when clone template
     if (has_value($data['clone_method'])) {
         $project_xml['clone_method'] = $data['clone_method'];
         $project_xml['proto_template'] = $data['proto_template'];
     }
     $extension_name = $data['extension_txt_id'] = $this->_prepareData('extension_txt_id', $data['extension_txt_id']);
     if (!$data['extension_txt_id']) {
         $this->error['extension_txt_id'] = 'Extension text Id required.';
         return false;
     }
     $project_xml['extension_txt_id'] = $config_xml['extension_txt_id'] = $extension_name;
     if (file_exists(DIR_EXT . $extension_name)) {
         $this->error[] = 'Extension with text id "' . $extension_name . '" is already exists! Delete it first and refresh page.';
         //return false;
     }
     $data['extension_type'] = $data['extension_type'] == 'other' ? 'extension' : $data['extension_type'];
     $project_xml['extension_type'] = $config_xml['extension_type'] = $data['extension_type'];
     $project_xml['extension_title'] = $data['extension_title'];
     $extension_directory = DIR_EXT . $extension_name;
     $data['header_comment'] = $this->_prepareData('header_comment', $data['header_comment']);
     $project_xml['header_comment'] = $data['header_comment'];
     $data['header_comment'] = "<?php\n" . $data['header_comment'];
     $data['header_comment'] .= "\n\n";
     $data['header_comment'] .= "if (! defined ( 'DIR_CORE' )) {\nheader ( 'Location: static_pages/' );\n}\n\n";
     $project_xml['header_comment'] = $data['header_comment'];
     if ($data['extension_admin_language_files']) {
         $data['extension_admin_language_files'] = $this->_prepareData('extension_admin_language_files', $data['extension_admin_language_files']);
         $project_xml['extension_admin_language_files'] = $data['extension_admin_language_files'];
     }
     if ($data['extension_storefront_language_files']) {
         $data['extension_storefront_language_files'] = $this->_prepareData('extension_storefront_language_files', $data['extension_storefront_language_files']);
         $project_xml['extension_storefront_language_files'] = $data['extension_storefront_language_files'];
     }
     // generating directory and files
     if (!is_dir($extension_directory)) {
         mkdir($extension_directory, 0777);
     }
     if ($data['hook_file']) {
         $project_xml['hook_file'] = $data['hook_file'] = $this->_prepareData('hook_file', $data['hook_file']);
         if (!file_exists($extension_directory . '/core/' . $data['hook_file'])) {
             if (!is_dir($extension_directory . '/core')) {
                 mkdir($extension_directory . '/core', 0777);
             }
             $t = explode('_', $extension_name);
             foreach ($t as &$r) {
                 $r = ucfirst($r);
             }
             unset($r);
             $class_name = implode('', $t);
             $content = "class Extension" . $class_name . " extends Extension {\n\n }\n";
             $hook_class_name = "Extension" . $class_name;
             $project_xml['hook_class_name'] = $hook_class_name;
             file_put_contents($extension_directory . '/core/' . $data['hook_file'], $data['header_comment'] . $content);
         }
     }
     $project_xml['route'] = $data['route'];
     //GENERATING PHP FILES
     // do by letters M.V.C. order
     //MODELS
     $models = array('admin' => array(), 'storefront' => array());
     foreach ($this->sections as $section) {
         if (!isset($data[$section . '_model_routes'])) {
             continue;
         }
         foreach ($data[$section . '_model_routes'] as $k => $route) {
             $file = trim($data[$section . '_model_files'][$k], '\\/ ');
             if ($route && $file) {
                 $route = trim($route, '\\/ ');
                 $file = substr($file, -4) != '.php' ? $file . '.php' : $file;
                 $content = $data['header_comment'];
                 // build class name
                 $class_name = 'Model';
                 $rt = str_replace('/', '_', $route);
                 $rt = explode('_', $rt);
                 foreach ($rt as &$r) {
                     $r = ucfirst($r);
                 }
                 unset($r);
                 $class_name .= implode('', $rt);
                 $rt = str_replace('.php', '', $file);
                 $rt = explode('_', $rt);
                 foreach ($rt as &$r) {
                     $r = ucfirst($r);
                 }
                 unset($r);
                 $class_name .= implode('', $rt);
                 $content .= "class " . $class_name . " extends Model {\n\n\t\t\tpublic \$data = array ();\n\t\t\tprivate \$error = array ();\n }\n";
                 $dir = $extension_directory . '/' . $section . '/model/' . $route;
                 if (!is_dir($dir)) {
                     mkdir($dir, 0777, true);
                 }
                 if (!file_exists($dir . '/' . $file)) {
                     file_put_contents($dir . '/' . $file, $content);
                 }
                 $rt = str_replace('.php', '', $file);
                 $models[$section][] = $route . '/' . $rt;
                 $project_xml['models'][$section][] = array('route' => $route, 'file' => $rt);
             }
         }
     }
     // VIEWS (tpl-files)
     $views = array('admin' => array(), 'storefront' => array());
     foreach ($this->sections as $section) {
         foreach (array('page', 'response') as $ctrl_type) {
             if (!isset($data[$section . '_' . $ctrl_type . '_view_routes'])) {
                 continue;
             }
             foreach ($data[$section . '_' . $ctrl_type . '_view_routes'] as $k => $route) {
                 $file = trim($data[$section . '_' . $ctrl_type . '_view_files'][$k], '\\/ ');
                 if ($route && $file) {
                     $route = trim($route, '\\/ ');
                     $file = substr($file, -4) != '.tpl' ? $file . '.tpl' : $file;
                     $route_prefix = $this->getRtPrefixByControllerType($ctrl_type);
                     $template_name = $data['extension_type'] == 'template' ? $extension_name : 'default';
                     $dir = $extension_directory . '/' . $section . '/view/' . $template_name . '/template/' . $route_prefix . '/' . $route;
                     if (!is_dir($dir)) {
                         mkdir($dir, 0777, true);
                     }
                     if (!file_exists($dir . '/' . $file)) {
                         file_put_contents($dir . '/' . $file, '');
                     }
                     $views[$section][$ctrl_type][] = $route_prefix . '/' . $route . '/' . $file;
                     $project_xml['views'][$section][] = array('route' => $route_prefix . '/' . $route, 'file' => $file);
                 }
             }
         }
     }
     // Controllers
     $controllers = array('admin' => array(), 'storefront' => array());
     foreach ($this->sections as $section) {
         foreach (array('page', 'response', 'block', 'form', 'common', 'api', 'task') as $ctrl_type) {
             if (!isset($data[$section . '_' . $ctrl_type . '_controller_routes'])) {
                 continue;
             }
             foreach ($data[$section . '_' . $ctrl_type . '_controller_routes'] as $k => $route) {
                 $file = trim($data[$section . '_' . $ctrl_type . '_controller_files'][$k], '\\/ ');
                 if ($route && $file) {
                     $route = trim($route, '\\/ ');
                     $file = rtrim($file, '.php');
                     $content = $data['header_comment'];
                     $route_prefix = $this->getRtPrefixByControllerType($ctrl_type);
                     // build class name
                     $class_name = 'Controller' . ucfirst($route_prefix);
                     $rt = str_replace('/', '_', $route);
                     $rt = explode('_', $rt);
                     foreach ($rt as &$r) {
                         $r = ucfirst($r);
                     }
                     unset($r);
                     $class_name .= implode('', $rt);
                     $rt = str_replace('.php', '', $file);
                     $rt = explode('_', $rt);
                     foreach ($rt as &$r) {
                         $r = ucfirst($r);
                     }
                     unset($r);
                     $class_name .= implode('', $rt);
                     $content .= "class " . $class_name . " extends AController {\n\n\t\tpublic \$data = array ();\n\t\tprivate \$error = array ();\n }\n";
                     $dir = $extension_directory . '/' . $section . '/controller/' . $route_prefix . '/' . $route;
                     if (!is_dir($dir)) {
                         mkdir($dir, 0777, true);
                     }
                     if (!file_exists($dir . '/' . $file . '.php')) {
                         file_put_contents($dir . '/' . $file . '.php', $content);
                     }
                     $rt = str_replace('.php', '', $file);
                     $controllers[$section][$ctrl_type][] = $route_prefix . '/' . $route . '/' . $rt;
                     $project_xml['controllers'][$section][] = array('route' => $route_prefix . '/' . $route, 'file' => $file);
                 }
             }
         }
     }
     unset($content);
     // LANGUAGE files for extension translates
     $languages = array('admin' => array(), 'storefront' => array());
     //NOTE! unacceptable extension without at least one admin language file
     if (!$data['extension_admin_language_files']) {
         $data['extension_admin_language_files'] = array('english');
     }
     foreach ($this->sections as $section) {
         if (!isset($data['extension_' . $section . '_language_files'])) {
             continue;
         }
         foreach ($data['extension_' . $section . '_language_files'] as $language_name) {
             if ($language_name) {
                 $language_name = strtolower($language_name);
                 $file = $extension_name . '.xml';
                 $languages[$section][$extension_name . '/' . $extension_name] = $extension_name . '/' . $extension_name;
                 $project_xml['languages'][$section][] = $language_name . '/' . $extension_name . '/' . $extension_name;
                 if (file_exists($extension_directory . '/' . $section . '/language/' . strtolower($language_name) . '/' . $extension_name . '/' . $file)) {
                     continue;
                 }
                 $dir = $extension_directory . '/' . $section . '/language/' . $language_name . '/' . $extension_name;
                 if (!is_dir($dir)) {
                     mkdir($dir, 0777, true);
                 }
                 if ($section == 'admin') {
                     $this->_save_base_language_xml($data, $language_name);
                 } else {
                     if (!file_exists($dir . '/' . $file)) {
                         file_put_contents($dir . '/' . $file, '');
                     }
                 }
             }
         }
     }
     // COMMON PART
     if ($data['install_php']) {
         $content = $data['header_comment'] . "\n\n\n";
         $install_content = '';
         //build layout.xml for template clone
         if ($project_xml['extension_type'] == 'template') {
             $this->load->model('tool/developer_tools_layout_xml');
             $this->model_tool_developer_tools_layout_xml->saveXml($data['extension_txt_id'], 'default');
             $install_content = "\$file = DIR_EXT . '/" . $data['extension_txt_id'] . "/layout.xml';\n" . "\$layout = new ALayoutManager('default');\n" . "\$layout->loadXml(array('file' => \$file));\n";
         }
         if (!is_file($extension_directory . '/install.php')) {
             file_put_contents($extension_directory . '/install.php', $content . $install_content);
         }
         if ($project_xml['extension_type'] == 'template') {
             $uninstall_content = "\$extension_id = '" . $data['extension_txt_id'] . "';\n" . "// delete template layouts\n" . "\$layout = new ALayoutManager(\$extension_id);\n" . "\$layout->deleteTemplateLayouts();";
         }
         if (!is_file($extension_directory . '/uninstall.php')) {
             file_put_contents($extension_directory . '/uninstall.php', $content . $uninstall_content);
         }
         unset($content, $install_content, $uninstall_content);
     }
     $project_xml['install_php'] = $config_xml['install_php'] = (int) $data['install_php'];
     if ($data['install_sql']) {
         if (!is_file($extension_directory . '/install.sql')) {
             file_put_contents($extension_directory . '/install.sql', "");
         }
         if (!is_file($extension_directory . '/uninstall.sql')) {
             file_put_contents($extension_directory . '/uninstall.sql', "");
         }
     }
     $project_xml['install_sql'] = $config_xml['install_sql'] = (int) $data['install_sql'];
     $data['help_note'] = trim($data['help_note']);
     $project_xml['help_note'] = $data['help_note'];
     $config_xml['note'] = $data['help_note'] ? true : false;
     $project_xml['help_url'] = (string) $data['help_url'];
     // extension icon
     $project_xml['icon_default'] = $data['icon_default'] = (int) $data['icon_default'];
     if (!$data['icon_default'] && $this->request->files['icon']) {
         if ($this->request->files['icon']['error']) {
             $this->error[] = getTextUploadError($this->request->files['icon']['error']);
         }
         if ($this->request->files['icon']['type'] == 'image/png' && $this->request->files['icon']['size'] > 0) {
             if (!is_dir($extension_directory . '/image')) {
                 mkdir($extension_directory . '/image', 0777);
             }
             move_uploaded_file($this->request->files['icon']["tmp_name"], $extension_directory . '/image/icon.png');
         }
         $project_xml['icon'] = 'icon.png';
     }
     /*if($this->request->files['preview']){
     
     			foreach($this->request->files['preview']['name'] as $k=>$item){
     				if($this->request->files['preview']['error'][$k]){
     					$this->error[] = getTextUploadError($this->request->files['preview']['error'][$k]);
     				}
     
     				if($this->request->files['preview']['type'][$k]=='image/png' && $this->request->files['preview']['size'][$k]>0){
     					if(!is_dir($extension_directory.'/image')){
     						mkdir($extension_directory.'/image',0777);
     					}
     					move_uploaded_file($this->request->files['preview']["tmp_name"][$k],$extension_directory.'/image/preview'.$k.'.png');
     					$project_xml['preview'][] = 'preview'.$k.'.png';
     					$config_xml['preview'][] = 'preview'.$k.'.png';
     				}
     			}
     		} */
     $project_xml['version'] = $config_xml['version'] = $data['version'];
     $project_xml['category'] = $config_xml['category'] = $data['extension_category'];
     $data['cartversions'] = array_unique((array) $data['cartversions']);
     $project_xml['cartversions'] = $config_xml['cartversions'] = $data['cartversions'];
     $project_xml['priority'] = $config_xml['priority'] = (int) $data['priority'];
     /*if($data['dependency']){
     			$project_xml['dependencies'] = array();
     			foreach($data['dependency']['name'] as $k => $dep_name){
     				if($dep_name){
     					$project_xml['dependencies']['item'][] = array('@attributes' => array(
     							'prior_version' => $data['dependency']['prior_versions'][$k],
     							'version'       => $data['dependency']['versions'][$k]),
     																   '@value'      => $dep_name);
     				}
     			}
     			$config_xml['dependencies'] = $project_xml['dependencies'];
     		}*/
     $config_xml['settings'] = array('item' => array('@attributes' => array('id' => $data['extension_txt_id'] . "_status"), 'type' => 'checkbox', 'default_value' => '0'));
     $config_xml['note'] = $data['help_note'] ? true : false;
     if ($data['help_file']) {
         $data['help_file'] = trim((string) $data['help_file']);
         $project_xml['help_file'] = $data['help_file'];
         if (!is_dir(DIR_EXT . $extension_name . "/help")) {
             mkdir(DIR_EXT . $extension_name . "/help", 0777);
         }
         file_put_contents(DIR_EXT . $extension_name . "/help/" . $extension_name . '.txt', $data['help_file']);
         $data['help_file'] = "help/" . $extension_name . '.txt';
     }
     $config_xml['install_sql'] = $data['install_sql'];
     $config_xml['install_php'] = $data['install_php'];
     $this->saveConfigXml($config_xml);
     // change mode recurcive
     $this->_chmod_R($extension_directory, 0777, 0777);
     $this->_replicate_default_dir_tree_($project_xml);
     // when cloning template check clone_method var
     // save project xml
     $this->saveProjectXml($project_xml);
     $this->saveMainFileByProjectConfig($project_xml);
     $this->session->data['dev_tools_prj_id'] = $project_xml['extension_txt_id'] . '_v' . $project_xml['version'];
     //for cloning of template need to install
     if ($project_xml['clone_method']) {
         //1. refresh extensions list to write new into db, table extensions
         $ex = new ExtensionsApi();
         unset($ex);
         $em = new AExtensionManager();
         $em->install($project_xml['extension_txt_id'], getExtensionConfigXml($project_xml['extension_txt_id']));
         //enable
         $em->editSetting($project_xml['extension_txt_id'], array($project_xml['extension_txt_id'] . '_status' => 1));
     }
     return true;
 }