init
This commit is contained in:
786
modules/ModuleBuilder/MB/MBPackage.php
Executable file
786
modules/ModuleBuilder/MB/MBPackage.php
Executable file
@@ -0,0 +1,786 @@
|
||||
<?php
|
||||
/*********************************************************************************
|
||||
* SugarCRM is a customer relationship management program developed by
|
||||
* SugarCRM, Inc. Copyright (C) 2004-2010 SugarCRM Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Affero General Public License version 3 as published by the
|
||||
* Free Software Foundation with the addition of the following permission added
|
||||
* to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
|
||||
* IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
|
||||
* OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
||||
* details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License along with
|
||||
* this program; if not, see http://www.gnu.org/licenses or write to the Free
|
||||
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA.
|
||||
*
|
||||
* You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
|
||||
* SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
|
||||
*
|
||||
* The interactive user interfaces in modified source and object code versions
|
||||
* of this program must display Appropriate Legal Notices, as required under
|
||||
* Section 5 of the GNU Affero General Public License version 3.
|
||||
*
|
||||
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
|
||||
* these Appropriate Legal Notices must retain the display of the "Powered by
|
||||
* SugarCRM" logo. If the display of the logo is not reasonably feasible for
|
||||
* technical reasons, the Appropriate Legal Notices must display the words
|
||||
* "Powered by SugarCRM".
|
||||
********************************************************************************/
|
||||
require_once('modules/ModuleBuilder/MB/MBModule.php');
|
||||
|
||||
class MBPackage{
|
||||
var $name;
|
||||
var $is_uninstallable = true;
|
||||
var $description = '';
|
||||
var $has_images = true;
|
||||
var $modules = array();
|
||||
var $date_modified = '';
|
||||
var $author = '';
|
||||
var $key = '';
|
||||
var $readme='';
|
||||
function MBPackage($name){
|
||||
$this->name = $name;
|
||||
$this->load();
|
||||
|
||||
}
|
||||
function loadModules($force=false){
|
||||
if(!file_exists(MB_PACKAGE_PATH . '/' . $this->name .'/modules'))return;
|
||||
$d = dir(MB_PACKAGE_PATH . '/' . $this->name .'/modules');
|
||||
while($e = $d->read()){
|
||||
if(substr($e, 0, 1) != '.' && is_dir(MB_PACKAGE_PATH . '/'. $this->name. '/modules/' . $e)){
|
||||
$this->getModule($e, $force);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the translated module titles from the selected language into.
|
||||
* Will override currently loaded string to reflect undeployed label changes.
|
||||
* $app_list_strings
|
||||
* @return
|
||||
* @param $languge String language identifyer
|
||||
*/
|
||||
function loadModuleTitles($languge = '')
|
||||
{
|
||||
if (empty($language))
|
||||
{
|
||||
$language = $GLOBALS['current_language'];
|
||||
}
|
||||
global $app_list_strings;
|
||||
$packLangFilePath = $this->getPackageDir() . "/language/application/" . $language . ".lang.php";
|
||||
if (file_exists($packLangFilePath))
|
||||
{
|
||||
|
||||
require($packLangFilePath);
|
||||
}
|
||||
}
|
||||
|
||||
function getModule($name, $force=true){
|
||||
if(!$force && !empty($this->modules[$name]))return;
|
||||
$path = $this->getPackageDir();
|
||||
|
||||
$this->modules[$name] = new MBModule($name, $path, $this->name, $this->key);
|
||||
}
|
||||
|
||||
function deleteModule($name){
|
||||
$this->modules[$name]->delete();
|
||||
unset($this->modules[$name]);
|
||||
}
|
||||
|
||||
function getManifest($version_specific = false, $for_export = false){
|
||||
//If we are exporting the package, we must ensure a different install key
|
||||
$pre = $for_export ? MB_EXPORTPREPEND : "";
|
||||
$date = gmdate($GLOBALS['timedate']->get_db_date_time_format());
|
||||
$time = time();
|
||||
$this->description = to_html($this->description);
|
||||
$is_uninstallable = ($this->is_uninstallable ? 'true' : 'false');
|
||||
$flavor = "'" . $GLOBALS['sugar_flavor'] . "'";
|
||||
if($GLOBALS['sugar_flavor'] == 'CE')$flavor = "'CE', 'PRO','ENT'";
|
||||
$version = (!empty($version_specific))?"'" . $GLOBALS['sugar_version'] . "'" : '';
|
||||
$header = file_get_contents('modules/ModuleBuilder/MB/header.php');
|
||||
return <<<EOQ
|
||||
$header
|
||||
\$manifest = array (
|
||||
'acceptable_sugar_versions' =>
|
||||
array (
|
||||
$version
|
||||
),
|
||||
'acceptable_sugar_flavors' =>
|
||||
array(
|
||||
$flavor
|
||||
),
|
||||
'readme'=>'$this->readme',
|
||||
'key'=>'$this->key',
|
||||
'author' => '$this->author',
|
||||
'description' => '$this->description',
|
||||
'icon' => '',
|
||||
'is_uninstallable' => $is_uninstallable,
|
||||
'name' => '$pre$this->name',
|
||||
'published_date' => '$date',
|
||||
'type' => 'module',
|
||||
'version' => '$time',
|
||||
'remove_tables' => 'prompt',
|
||||
);
|
||||
EOQ;
|
||||
}
|
||||
|
||||
function buildInstall($path){
|
||||
$installdefs = array ('id' => $this->name,
|
||||
'beans'=>array(),
|
||||
'layoutdefs'=>array(),
|
||||
'relationships'=>array(),
|
||||
);
|
||||
if($this->has_images){
|
||||
$installdefs['image_dir'] = '<basepath>/icons';
|
||||
}
|
||||
foreach(array_keys($this->modules) as $module){
|
||||
$this->modules[$module]->build($path);
|
||||
$this->modules[$module]->addInstallDefs($installdefs);
|
||||
}
|
||||
$this->path = $this->getPackageDir();
|
||||
if(file_exists($this->path . '/language')){
|
||||
$d= dir($this->path . '/language');
|
||||
while($e = $d->read()){
|
||||
$lang_path = $this->path .'/language/' . $e;
|
||||
if(substr($e, 0, 1) != '.' && is_dir($lang_path)){
|
||||
$f = dir($lang_path);
|
||||
while($g = $f->read()){
|
||||
if(substr($g, 0, 1) != '.' && is_file($lang_path.'/'. $g)){
|
||||
$lang = substr($g, 0, strpos($g, '.'));
|
||||
$installdefs['language'][] = array(
|
||||
'from'=> '<basepath>/SugarModules/language/'.$e . '/'. $g,
|
||||
'to_module'=> $e,
|
||||
'language'=> $lang
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
copy_recursive( $this->path . '/language/', $path . '/language/');
|
||||
$icon_path = $path . '/../icons/default/images/';
|
||||
mkdir_recursive($icon_path);
|
||||
copy_recursive($this->path . '/icons/', $icon_path);
|
||||
}
|
||||
return "\n".'$installdefs = ' . var_export_helper($installdefs). ';';
|
||||
|
||||
}
|
||||
|
||||
function getPackageDir(){
|
||||
return MB_PACKAGE_PATH . '/' . $this->name;
|
||||
}
|
||||
|
||||
function getBuildDir(){
|
||||
return MB_PACKAGE_BUILD . '/' . $this->name;
|
||||
}
|
||||
|
||||
function getZipDir(){
|
||||
return $this->getPackageDir() . '/zips';
|
||||
}
|
||||
|
||||
|
||||
function load(){
|
||||
$path = $this->getPackageDir();
|
||||
if(file_exists($path .'/manifest.php')){
|
||||
require($path . '/manifest.php');
|
||||
if(!empty($manifest)){
|
||||
$this->date_modified = $manifest['published_date'];
|
||||
$this->is_uninstallable = $manifest['is_uninstallable'];
|
||||
$this->author = $manifest['author'];
|
||||
$this->key = $manifest['key'];
|
||||
$this->description = $manifest['description'];
|
||||
if(!empty($manifest['readme']))
|
||||
$this->readme = $manifest['readme'];
|
||||
}
|
||||
}
|
||||
$this->loadModules(true);
|
||||
}
|
||||
|
||||
function save(){
|
||||
$path = $this->getPackageDir();
|
||||
if(mkdir_recursive($path)){
|
||||
$fp = sugar_fopen($path .'/manifest.php', 'w');
|
||||
|
||||
|
||||
//Save all the modules when we save a package
|
||||
$this->updateModulesMetaData(true);
|
||||
fwrite($fp, $this->getManifest() );
|
||||
fclose($fp);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
function build($export=true, $clean = false){
|
||||
$this->loadModules();
|
||||
require_once('include/utils/zip_utils.php');
|
||||
$package_path = $this->getPackageDir();
|
||||
$path = $this->getBuildDir() . '/SugarModules';
|
||||
if($clean && file_exists($path))rmdir_recursive($path);
|
||||
if(mkdir_recursive($path)){
|
||||
|
||||
$manifest = $this->getManifest().$this->buildInstall($path);
|
||||
$fp = sugar_fopen($this->getBuildDir() .'/manifest.php', 'w');
|
||||
fwrite($fp, $manifest);
|
||||
fclose($fp);
|
||||
|
||||
}
|
||||
if(file_exists('modules/ModuleBuilder/MB/LICENSE.txt')){
|
||||
copy('modules/ModuleBuilder/MB/LICENSE.txt', $this->getBuildDir() . '/LICENSE.txt');
|
||||
}else if(file_exists('LICENSE.txt')){
|
||||
copy('LICENSE.txt', $this->getBuildDir() . '/LICENSE.txt');
|
||||
}
|
||||
$package_dir = $this->getPackageDir();
|
||||
$date = date('Y_m_d_His');
|
||||
$zipDir = $this->getZipDir();
|
||||
if(!file_exists($zipDir))mkdir_recursive($zipDir);
|
||||
$cwd = getcwd();
|
||||
chdir($this->getBuildDir());
|
||||
zip_dir('.',$cwd . '/'. $zipDir. '/'. $this->name. $date. '.zip');
|
||||
chdir($cwd);
|
||||
if($export){
|
||||
header('Location:' . $zipDir. '/'. $this->name. $date. '.zip');
|
||||
}
|
||||
return array(
|
||||
'zip'=>$zipDir. '/'. $this->name. $date. '.zip',
|
||||
'manifest'=>$this->getBuildDir(). '/manifest.php',
|
||||
'name'=>$this->name. $date,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
function getNodes(){
|
||||
$this->loadModules();
|
||||
$node = array('name'=>$this->name, 'action'=>'module=ModuleBuilder&action=package&package=' . $this->name, 'children'=>array());
|
||||
foreach(array_keys($this->modules) as $module){
|
||||
$node['children'][] = $this->modules[$module]->getNodes();
|
||||
}
|
||||
return $node;
|
||||
}
|
||||
|
||||
function populateFromPost(){
|
||||
$this->description = $_REQUEST['description'];
|
||||
$this->author = $_REQUEST['author'];
|
||||
$this->key = $_REQUEST['key'];
|
||||
$this->readme = $_REQUEST['readme'];
|
||||
}
|
||||
|
||||
function rename($new_name){
|
||||
$old= $this->getPackageDir();
|
||||
$this->name = $new_name;
|
||||
$new = $this->getPackageDir();
|
||||
if(file_exists($new)){
|
||||
return false;
|
||||
}
|
||||
if(rename($old, $new)){
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function updateModulesMetaData($save=false){
|
||||
foreach(array_keys($this->modules) as $module){
|
||||
$old_name = $this->modules[$module]->key_name;
|
||||
$this->modules[$module]->key_name = $this->key . '_' . $this->modules[$module]->name;
|
||||
$this->modules[$module]->renameMetaData($this->modules[$module]->getModuleDir(), $old_name);
|
||||
$this->modules[$module]->renameLanguageFiles($this->modules[$module]->getModuleDir());
|
||||
if($save)$this->modules[$module]->save();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function copy($new_name){
|
||||
$old= $this->getPackageDir();
|
||||
|
||||
$count = 0;
|
||||
$this->name = $new_name;
|
||||
$new= $this->getPackageDir();
|
||||
while(file_exists($new)){
|
||||
$count++;
|
||||
$this->name = $new_name . $count;
|
||||
$new= $this->getPackageDir();
|
||||
}
|
||||
|
||||
$new = $this->getPackageDir();
|
||||
if(copy_recursive($old, $new)){
|
||||
$this->updateModulesMetaData();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
function delete(){
|
||||
return rmdir_recursive($this->getPackageDir());
|
||||
}
|
||||
|
||||
|
||||
//creation of the installdefs[] array for the manifest when exporting customizations
|
||||
function customBuildInstall($modules, $path, $extensions = array()){
|
||||
$columns=$this->getColumnsName();
|
||||
$installdefs = array ('id' => $this->name);
|
||||
$include_path="$path/SugarModules/include/language";
|
||||
if(file_exists($include_path) && is_dir($include_path)){
|
||||
$dd= dir($include_path);
|
||||
while($gg = $dd->read()){
|
||||
if(substr($gg, 0, 1) != '.' && is_file($include_path . '/' . $gg)){
|
||||
$lang = substr($gg, 0, strpos($gg, '.'));
|
||||
$installdefs['language'][] = array(
|
||||
'from'=> '<basepath>/SugarModules/include/language/'. $gg,
|
||||
'to_module'=> 'application',
|
||||
'language'=>$lang
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach($modules as $value){
|
||||
$custom_module = $this->getCustomModules($value);
|
||||
foreach($custom_module as $va){
|
||||
if ($va == 'language'){
|
||||
$this->getLanguageManifestForModule($value, $installdefs);
|
||||
$this->getCustomFieldsManifestForModule($value, $installdefs);
|
||||
}//fi
|
||||
if($va == 'metadata'){
|
||||
$this->getCustomMetadataManifestForModule($value, $installdefs);
|
||||
}//fi
|
||||
}//foreach
|
||||
}//foreach
|
||||
if (is_dir("$path/Extension"))
|
||||
{
|
||||
$this->getExtensionsManifestForPackage($path, $installdefs);
|
||||
}
|
||||
return "\n".'$installdefs = ' . var_export_helper($installdefs). ';';
|
||||
}
|
||||
|
||||
private function getLanguageManifestForModule($module, &$installdefs)
|
||||
{
|
||||
$lang_path = 'custom/modules/' . $module . '/language';
|
||||
foreach(scandir($lang_path) as $langFile)
|
||||
{
|
||||
if(substr($langFile, 0, 1) != '.' && is_file($lang_path . '/' . $langFile)){
|
||||
$lang = substr($langFile, 0, strpos($langFile, '.'));
|
||||
$installdefs['language'][] = array(
|
||||
'from'=> '<basepath>/SugarModules/modules/' . $module . '/language/'. $langFile,
|
||||
'to_module'=> $module,
|
||||
'language'=>$lang
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function getCustomFieldsManifestForModule($module, &$installdefs)
|
||||
{
|
||||
$db = DBManagerFactory::getInstance();
|
||||
$result=$db->query("SELECT * FROM fields_meta_data where custom_module='$module'");
|
||||
while($row = $db->fetchByAssoc($result)){
|
||||
$name = $row['id'];
|
||||
foreach($row as $col=>$res){
|
||||
switch ($col) {
|
||||
case 'custom_module':
|
||||
$installdefs['custom_fields'][$name]['module'] = $res;
|
||||
break;
|
||||
case 'required':
|
||||
$installdefs['custom_fields'][$name]['require_option'] = $res;
|
||||
break;
|
||||
case 'vname':
|
||||
$installdefs['custom_fields'][$name]['label'] = $res;
|
||||
break;
|
||||
case 'required':
|
||||
$installdefs['custom_fields'][$name]['require_option'] = $res;
|
||||
break;
|
||||
case 'massupdate':
|
||||
$installdefs['custom_fields'][$name]['mass_update'] = $res;
|
||||
break;
|
||||
case 'comments':
|
||||
$installdefs['custom_fields'][$name]['comments'] = $res;
|
||||
break;
|
||||
case 'help':
|
||||
$installdefs['custom_fields'][$name]['help'] = $res;
|
||||
break;
|
||||
case 'len':
|
||||
$installdefs['custom_fields'][$name]['max_size'] = $res;
|
||||
break;
|
||||
default:
|
||||
$installdefs['custom_fields'][$name][$col] = $res;
|
||||
}//switch
|
||||
}//foreach
|
||||
}//while
|
||||
}
|
||||
|
||||
private function getCustomMetadataManifestForModule($module, &$installdefs)
|
||||
{
|
||||
$meta_path = 'custom/modules/' . $module . '/metadata';
|
||||
foreach(scandir($meta_path) as $meta_file)
|
||||
{
|
||||
if(substr($meta_file, 0, 1) != '.' && is_file($meta_path . '/' . $meta_file)){
|
||||
if($meta_file == 'listviewdefs.php'){
|
||||
$installdefs['copy'][] = array(
|
||||
'from'=> '<basepath>/SugarModules/modules/'. $module . '/metadata/'. $meta_file,
|
||||
'to'=> 'custom/modules/'. $module . '/metadata/' . $meta_file,
|
||||
);
|
||||
}
|
||||
else{
|
||||
$installdefs['copy'][] = array(
|
||||
'from'=> '<basepath>/SugarModules/modules/'. $module . '/metadata/'. $meta_file,
|
||||
'to'=> 'custom/modules/'. $module . '/metadata/' . $meta_file,
|
||||
);
|
||||
$installdefs['copy'][] = array(
|
||||
'from'=> '<basepath>/SugarModules/modules/'. $module . '/metadata/'. $meta_file,
|
||||
'to'=> 'custom/working/modules/'. $module . '/metadata/' . $meta_file,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function getExtensionsManifestForPackage($path, &$installdefs)
|
||||
{
|
||||
$extPath = "$path/Extension/modules";
|
||||
foreach(scandir($extPath) as $moduleDir)
|
||||
{
|
||||
if(substr($moduleDir, 0, 1) != '.' && is_dir("$extPath/$moduleDir/Ext")){
|
||||
foreach(scandir("$extPath/$moduleDir/Ext") as $type)
|
||||
{
|
||||
if(substr($type, 0, 1) != '.' && is_dir("$extPath/$moduleDir/Ext/$type")){
|
||||
foreach(scandir("$extPath/$moduleDir/Ext/$type") as $file)
|
||||
{
|
||||
if(substr($file, 0, 1) != '.' && strtolower(substr($file, -4)) == ".php")
|
||||
{
|
||||
$installdefs['copy'][] = array(
|
||||
'from'=> "<basepath>/Extension/modules/$moduleDir/Ext/$type/$file",
|
||||
'to'=> "custom/Extension/modules/$moduleDir/Ext/$type/$file",
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//return an array which contain the name of fields_meta_data table's columns
|
||||
function getColumnsName(){
|
||||
|
||||
$meta = new FieldsMetaData();
|
||||
$arr = array();
|
||||
foreach($meta->getFieldDefinitions() as $key=>$value) {
|
||||
$arr[] = $key;
|
||||
}
|
||||
return $arr;
|
||||
}
|
||||
|
||||
|
||||
//creation of the custom fields ZIP file (use getmanifest() and customBuildInstall() )
|
||||
function exportCustom($modules, $export=true, $clean = true){
|
||||
$path=$this->getBuildDir();
|
||||
if($clean && file_exists($path))rmdir_recursive($path);
|
||||
//Copy the custom files to the build dir
|
||||
foreach($modules as $mod){
|
||||
$extensions = $this->getExtensionsList($mod);
|
||||
$pathmod="$path/SugarModules/modules/$mod";
|
||||
if(mkdir_recursive($pathmod)){
|
||||
if(file_exists("custom/modules/$mod")){
|
||||
copy_recursive("custom/modules/$mod", "$pathmod");
|
||||
//Don't include cached extension files
|
||||
if (is_dir("$pathmod/Ext"))
|
||||
rmdir_recursive("$pathmod/Ext");
|
||||
}
|
||||
//Convert modstring files to extension compatible arrays
|
||||
$this->convertLangFilesToExtensions("$pathmod/language");
|
||||
}
|
||||
$pathext="$path/Extension/modules/$mod/Ext";
|
||||
if (!empty($extensions) && mkdir_recursive($pathext))
|
||||
{
|
||||
foreach($extensions as $type => $files)
|
||||
{
|
||||
sugar_mkdir("$pathext/$type");
|
||||
foreach($files as $file => $filePath)
|
||||
{
|
||||
copy ($filePath, "$pathext/$type/$file");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->copyCustomDropdownValuesForModules($modules,$path);
|
||||
if(file_exists($path)){
|
||||
$manifest = $this->getManifest(true).$this->customBuildInstall($modules,$path);
|
||||
sugar_file_put_contents($path .'/manifest.php', $manifest);;
|
||||
}
|
||||
if(file_exists('modules/ModuleBuilder/MB/LICENSE.txt')){
|
||||
copy('modules/ModuleBuilder/MB/LICENSE.txt', $path . '/LICENSE.txt');
|
||||
}
|
||||
else if(file_exists('LICENSE.txt')){
|
||||
copy('LICENSE.txt', $path . '/LICENSE.txt');
|
||||
}
|
||||
require_once('include/utils/zip_utils.php');
|
||||
$date = date('Y_m_d_His');
|
||||
$zipDir = $this->getZipDir();
|
||||
if(!file_exists($zipDir))mkdir_recursive($zipDir);
|
||||
$cwd = getcwd();
|
||||
chdir($this->getBuildDir());
|
||||
zip_dir('.',$cwd . '/'. $zipDir. '/'. $this->name. $date. '.zip');
|
||||
chdir($cwd);
|
||||
if($clean && file_exists($this->getBuildDir()))rmdir_recursive($this->getBuildDir());
|
||||
if($export){
|
||||
header('Location:' . $zipDir. '/'. $this->name. $date. '.zip');
|
||||
}
|
||||
return $zipDir. '/'. $this->name. $date. '.zip';
|
||||
}
|
||||
|
||||
private function convertLangFilesToExtensions($langDir)
|
||||
{
|
||||
if (is_dir($langDir))
|
||||
{
|
||||
foreach(scandir($langDir) as $langFile)
|
||||
{
|
||||
$mod_strings = array();
|
||||
if (strcasecmp(substr($langFile, -4), ".php") != 0)
|
||||
continue;
|
||||
include("$langDir/$langFile");
|
||||
$out = "<?php \n // created: " . date('Y-m-d H:i:s') . "\n";
|
||||
foreach($mod_strings as $lbl_key => $lbl_val )
|
||||
{
|
||||
$out .= override_value_to_string("mod_strings", $lbl_key, $lbl_val) . "\n";
|
||||
}
|
||||
$out .= "\n?>\n";
|
||||
sugar_file_put_contents("$langDir/$langFile", $out);
|
||||
}
|
||||
}
|
||||
}
|
||||
private function copyCustomDropdownValuesForModules($modules, $path)
|
||||
{
|
||||
if(file_exists("custom/include/language")){
|
||||
if(mkdir_recursive("$path/SugarModules/include")){
|
||||
global $app_list_strings;
|
||||
$backStrings = $app_list_strings;
|
||||
foreach(scandir("custom/include/language") as $langFile)
|
||||
{
|
||||
$app_list_strings = array();
|
||||
if (strcasecmp(substr($langFile, -4), ".php") != 0)
|
||||
continue;
|
||||
include("custom/include/language/$langFile");
|
||||
$out = "<?php \n";
|
||||
$lang = substr($langFile, 0, -9);
|
||||
$options = $this->getCustomDropDownStringsForModules($modules, $app_list_strings);
|
||||
foreach($options as $name => $arr) {
|
||||
$out .= override_value_to_string('app_list_strings', $name, $arr);
|
||||
}
|
||||
mkdir_recursive("$path/SugarModules/include/language/");
|
||||
sugar_file_put_contents("$path/SugarModules/include/language/$lang.$this->name.php", $out);
|
||||
}
|
||||
$app_list_strings = $backStrings;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getCustomDropDownStringsForModules($modules, $list_strings) {
|
||||
global $beanList, $beanFiles;
|
||||
$options = array();
|
||||
foreach($modules as $module)
|
||||
{
|
||||
if (!empty($beanList[$module]))
|
||||
{
|
||||
require_once($beanFiles[$beanList[$module]]);
|
||||
$bean = new $beanList[$module]();
|
||||
foreach($bean->field_defs as $field => $def)
|
||||
{
|
||||
if (isset($def['options']) && isset($list_strings[$def['options']]))
|
||||
{
|
||||
$options[$def['options']] = $list_strings[$def['options']];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return $options;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//if $module=false : return an array with custom module and there customizations.
|
||||
//if $module=!false : return an array with the directories of custom/module/$module.
|
||||
function getCustomModules($module=false){
|
||||
global $mod_strings;
|
||||
$path='custom/modules/';
|
||||
$extPath = 'custom/Extension/modules/';
|
||||
if(!file_exists($path) || !is_dir($path)){
|
||||
return array($mod_strings['LBL_EC_NOCUSTOM'] => "");
|
||||
}
|
||||
else{
|
||||
if ($module != false ){
|
||||
$path=$path . $module . '/';
|
||||
}
|
||||
$scanlisting = scandir($path);
|
||||
$dirlisting = array();
|
||||
foreach ($scanlisting as $value){
|
||||
if(is_dir($path . $value) == true && $value != '.' && $value != '..') {
|
||||
$dirlisting[] = $value;
|
||||
}
|
||||
}
|
||||
if(empty($dirlisting)){
|
||||
return array($mod_strings['LBL_EC_NOCUSTOM'] => "");
|
||||
}
|
||||
if ($module == false ){
|
||||
foreach ($dirlisting as $value){
|
||||
if(!file_exists('modules/' . $value . '/metadata/studio.php'))
|
||||
continue;
|
||||
$custommodules[$value]=$this->getCustomModules($value);
|
||||
foreach ($custommodules[$value] as $va){
|
||||
switch ($va) {
|
||||
case 'language':
|
||||
$return[$value][$va] = $mod_strings['LBL_EC_CUSTOMFIELD'];
|
||||
break;
|
||||
case 'metadata':
|
||||
$return[$value][$va] = $mod_strings['LBL_EC_CUSTOMLAYOUT'];
|
||||
break;
|
||||
case 'Ext':
|
||||
|
||||
$return[$value][$va] = $mod_strings['LBL_EC_CUSTOMFIELD'];
|
||||
break;
|
||||
case '':
|
||||
$return[$value . " " . $mod_strings['LBL_EC_EMPTYCUSTOM']] = "";
|
||||
break;
|
||||
default:
|
||||
$return[$value][$va] = $mod_strings['LBL_UNDEFINED'];
|
||||
}
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
else{
|
||||
return $dirlisting;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function getExtensionsList($module, $excludeRelationships = true)
|
||||
{
|
||||
require_once 'modules/ModuleBuilder/parsers/relationships/DeployedRelationships.php' ;
|
||||
$extPath = 'custom/Extension/modules/';
|
||||
$modExtPath = $extPath . $module . '/Ext';
|
||||
$rels = new DeployedRelationships($module);
|
||||
$relList = $rels->getRelationshipList ();
|
||||
|
||||
$ret = array();
|
||||
if (is_dir($modExtPath))
|
||||
{
|
||||
$extFolders = scandir($modExtPath);
|
||||
foreach($extFolders as $extFolder)
|
||||
{
|
||||
if (!is_dir("$modExtPath/$extFolder") || substr($extFolder, 0, 1) == ".")
|
||||
continue;
|
||||
|
||||
foreach( scandir("$modExtPath/$extFolder") as $extFile)
|
||||
{
|
||||
|
||||
if (substr($extFile, 0, 1) == "." || strtolower(substr($extFile, -4)) != ".php")
|
||||
continue;
|
||||
//Exclude relattionship extension files
|
||||
if ($excludeRelationships && (
|
||||
(substr($extFile, 0, 6) == "custom" && isset($relList[substr($extFile, 6, strlen($extFile) - 10)])) ||
|
||||
(substr($extFile, 6, 6) == "custom" && isset($relList[substr($extFile, 12, strlen($extFile) - 16)]))
|
||||
)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isset($ret[$extFolder]))
|
||||
$ret[$extFolder] = array();
|
||||
|
||||
$ret[$extFolder][$extFile ] = "$modExtPath/$extFolder/$extFile";
|
||||
}
|
||||
}
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a set of field defs for fields that will exist when this package is deployed
|
||||
* based on the relationships in all of its modules.
|
||||
*
|
||||
* @param $moduleName (module must be from whithin this package)
|
||||
* @return array Field defs
|
||||
*/
|
||||
function getRelationshipsForModule($moduleName) {
|
||||
$ret = array();
|
||||
if (isset($this->modules[$moduleName])) {
|
||||
$keyName = $this->modules[$moduleName]->key_name;
|
||||
foreach($this->modules as $mName => $module) {
|
||||
$rels = $module->getRelationships();
|
||||
$relList = $rels->getRelationshipList();
|
||||
foreach($relList as $rName ) {
|
||||
$rel = $rels->get ( $rName ) ;
|
||||
if ($rel->lhs_module == $keyName || $rel->rhs_module == $keyName) {
|
||||
$ret[$rName] = $rel;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
function exportProjectInstall($package, $for_export){
|
||||
$pre = $for_export ? MB_EXPORTPREPEND : "";
|
||||
$installdefs = array ('id' => $pre . $this->name);
|
||||
$installdefs['copy'][] = array(
|
||||
'from'=> '<basepath>/' . $this->name,
|
||||
'to'=> 'custom/modulebuilder/packages/'. $this->name,
|
||||
);
|
||||
return "\n".'$installdefs = ' . var_export_helper($installdefs). ';';
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function exportProject($package, $export=true, $clean = true){
|
||||
$tmppath="custom/modulebuilder/projectTMP/";
|
||||
if(file_exists($this->getPackageDir())){
|
||||
if(mkdir_recursive($tmppath)){
|
||||
copy_recursive($this->getPackageDir(), $tmppath ."/". $this->name);
|
||||
$manifest = $this->getManifest(true, $export).$this->exportProjectInstall($package, $export);
|
||||
$fp = sugar_fopen($tmppath .'/manifest.php', 'w');
|
||||
fwrite($fp, $manifest);
|
||||
fclose($fp);
|
||||
if(file_exists('modules/ModuleBuilder/MB/LICENSE.txt')){
|
||||
copy('modules/ModuleBuilder/MB/LICENSE.txt', $tmppath . '/LICENSE.txt');
|
||||
}
|
||||
else if(file_exists('LICENSE.txt')){
|
||||
copy('LICENSE.txt', $tmppath . '/LICENSE.txt');
|
||||
}
|
||||
$readme_contents = $this->readme;
|
||||
$readmefp = sugar_fopen($tmppath.'/README.txt','w');
|
||||
fwrite($readmefp, $readme_contents);
|
||||
fclose($readmefp);
|
||||
}
|
||||
}
|
||||
require_once('include/utils/zip_utils.php');
|
||||
$date = date('Y_m_d_His');
|
||||
$zipDir = "custom/modulebuilder/packages/ExportProjectZips";
|
||||
if(!file_exists($zipDir))mkdir_recursive($zipDir);
|
||||
$cwd = getcwd();
|
||||
chdir($tmppath);
|
||||
zip_dir('.',$cwd . '/'. $zipDir. '/project_'. $this->name. $date. '.zip');
|
||||
chdir($cwd);
|
||||
if($clean && file_exists($tmppath))rmdir_recursive($tmppath);
|
||||
if($export){
|
||||
header('Location:' . $zipDir. '/project_'. $this->name. $date. '.zip');
|
||||
}
|
||||
return $zipDir. '/project_'. $this->name. $date. '.zip';
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user