From d7120556cec8465d3e6f4432ecdccaeb0d491fa2 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Sun, 22 Feb 2015 14:58:36 +0100 Subject: [PATCH] ModuleDesigner 1.0 RC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v1.0 RC Change log: - Icon added for ModuleDesigner - HTML special chars bug fix - It is now possible to modify Vtiger Core’s modules - Templates directories are now called Module 6.x and Extension 6.x - Only translation into default language is mandatory - Select automatically manifest template after loading an existant module - Several tabs are closed for extensions - Trash less on the bottom of the page - Help info field bug fix - Remove of Custom menu - UTF-8 chars bug fix - For an existant module in the class of the module, vtlib_getModuleNameById() it is not replaced anymore - During creation of new modules, it is now possible, for UIType fields, to create automatically a Related List in the destination module - Custom fields are now in manifest.xml - Multiple tables are now in manifest.xml - Field’s name « name » is not allowed anymore - It is now mandatory to define a field as identifier - It is now not possible to define several fields as identifier --- README.md | 22 +- patch/vtlib/Vtiger/Block.php | 233 ++++++++++ patch/vtlib/Vtiger/PackageExport.php | 1 + patch/vtlib/Vtiger/PackageImport.php | 11 +- patch/vtlib_patch.zip | Bin 17039 -> 19218 bytes src/ModuleDesigner.png | Bin 0 -> 1575 bytes .../en_us/Settings/ModuleDesigner.php | 3 +- .../es_es/Settings/ModuleDesigner.php | 400 +++++++++--------- .../fr_fr/Settings/ModuleDesigner.php | 6 +- src/manifest.xml | 2 +- src/modules/ModuleDesigner/ModuleDesigner.png | Bin 2080 -> 0 bytes .../LANGUAGES/en_us/ModuleName.php | 0 .../ModuleName.php | 0 .../{Extension => Extension 6.x}/index.php | 0 .../LANGUAGES/en_us/ModuleName.php | 0 .../{6.1.0 => Module 6.x}/ModuleName.php | 8 +- .../templates/extension.xml.php | 2 +- .../ModuleDesigner/templates/module.xml.php | 68 ++- src/settings/actions/GetManifestStructure.php | 32 +- src/settings/actions/MakePackage.php | 122 +++++- src/settings/templates/EditBlockPopup.tpl | 2 +- .../templates/EditCustomLinkPopup.tpl | 2 +- src/settings/templates/EditFieldPopup.tpl | 52 ++- .../templates/EditRelatedListPopup.tpl | 2 +- src/settings/templates/Index.tpl | 11 +- .../templates/resources/ModuleDesigner.js | 77 +++- src/settings/views/EditField.php | 44 +- src/settings/views/Index.php | 3 + 28 files changed, 829 insertions(+), 274 deletions(-) create mode 100755 patch/vtlib/Vtiger/Block.php create mode 100644 src/ModuleDesigner.png mode change 100755 => 100644 src/languages/fr_fr/Settings/ModuleDesigner.php delete mode 100755 src/modules/ModuleDesigner/ModuleDesigner.png rename src/modules/ModuleDesigner/templates/{6.1.0 => Extension 6.x}/LANGUAGES/en_us/ModuleName.php (100%) rename src/modules/ModuleDesigner/templates/{Extension => Extension 6.x}/ModuleName.php (100%) rename src/modules/ModuleDesigner/templates/{Extension => Extension 6.x}/index.php (100%) rename src/modules/ModuleDesigner/templates/{Extension => Module 6.x}/LANGUAGES/en_us/ModuleName.php (100%) rename src/modules/ModuleDesigner/templates/{6.1.0 => Module 6.x}/ModuleName.php (94%) diff --git a/README.md b/README.md index fe4c476..ab21804 100644 --- a/README.md +++ b/README.md @@ -16,4 +16,24 @@ You can set your own fields and variables. To do this modify these files: - /vlayouts/layout/Settings/ModuleDesigner/resources/CustomScript.js - /modules/ModuleDesigner/CustomManifestStructure.php -You can also create plugins to handle your variables, in the directory /modules/ModuleDesigner/plugins \ No newline at end of file +You can also create plugins to handle your variables, in the directory /modules/ModuleDesigner/plugins + +#v1.0 RC Change log: +- Icon added for ModuleDesigner +- HTML special chars bug fix +- It is now possible to modify Vtiger Core’s modules +- Templates directories are now called Module 6.x and Extension 6.x +- Only translation into default language is mandatory +- Select automatically manifest template after loading an existant module +- Several tabs are closed for extensions +- Trash less on the bottom of the page +- Help info field bug fix +- Remove of Custom menu +- UTF-8 chars bug fix +- For an existant module in the class of the module, vtlib_getModuleNameById() it is not replaced anymore +- During creation of new modules, it is now possible, for UIType fields, to create automatically a Related List in the destination module +- Custom fields are now in manifest.xml +- Multiple tables are now in manifest.xml +- Field’s name « name » is not allowed anymore +- It is now mandatory to define a field as identifier +- It is now not possible to define several fields as identifier \ No newline at end of file diff --git a/patch/vtlib/Vtiger/Block.php b/patch/vtlib/Vtiger/Block.php new file mode 100755 index 0000000..35ad9b1 --- /dev/null +++ b/patch/vtlib/Vtiger/Block.php @@ -0,0 +1,233 @@ +getUniqueID('vtiger_blocks'); + return $maxblockid; + } + + /** + * Get next sequence value to use for this block instance + * @access private + */ + function __getNextSequence() { + global $adb; + $result = $adb->pquery("SELECT MAX(sequence) as max_sequence from vtiger_blocks where tabid = ?", Array($this->module->id)); + $maxseq = 0; + if($adb->num_rows($result)) { + $maxseq = $adb->query_result($result, 0, 'max_sequence'); + } + return ++$maxseq; + } + + /** + * Initialize this block instance + * @param Array Map of column name and value + * @param Vtiger_Module Instance of module to which this block is associated + * @access private + */ + function initialize($valuemap, $moduleInstance=false) { + $this->id = $valuemap[blockid]; + $this->label= $valuemap[blocklabel]; + $this->display_status = $valuemap[display_status]; + $this->sequence = $valuemap[sequence]; + $this->iscustom = $valuemap[iscustom]; + $this->module=$moduleInstance? $moduleInstance: Vtiger_Module::getInstance($valuemap[tabid]); + } + + /** + * Create vtiger CRM block + * @access private + */ + function __create($moduleInstance) { + global $adb; + + $this->module = $moduleInstance; + + $this->id = $this->__getUniqueId(); + if(!$this->sequence) $this->sequence = $this->__getNextSequence(); + + $adb->pquery("INSERT INTO vtiger_blocks(blockid,tabid,blocklabel,sequence,show_title,visible,create_view,edit_view,detail_view,iscustom) + VALUES(?,?,?,?,?,?,?,?,?,?)", Array($this->id, $this->module->id, $this->label,$this->sequence, + $this->showtitle, $this->visible,$this->increateview, $this->ineditview, $this->indetailview, $this->iscustom)); + self::log("Creating Block $this->label ... DONE"); + self::log("Module language entry for $this->label ... CHECK"); + } + + /** + * Update vtiger CRM block + * @access private + * @internal TODO + */ + function __update() { + self::log("Updating Block $this->label ... DONE"); + } + + /** + * Delete this instance + * @access private + */ + function __delete() { + global $adb; + self::log("Deleting Block $this->label ... ", false); + $adb->pquery("DELETE FROM vtiger_blocks WHERE blockid=?", Array($this->id)); + self::log("DONE"); + } + + /** + * Save this block instance + * @param Vtiger_Module Instance of the module to which this block is associated + */ + function save($moduleInstance=false) { + if($this->id) $this->__update(); + else $this->__create($moduleInstance); + return $this->id; + } + + /** + * Delete block instance + * @param Boolean True to delete associated fields, False to avoid it + */ + function delete($recursive=true) { + if($recursive) { + $fields = Vtiger_Field::getAllForBlock($this); + if(!empty($fields)) + { + foreach($fields as $fieldInstance) + { + $fieldInstance->delete($recursive); + } + } + } + $this->__delete(); + } + + /** + * Add field to this block + * @param Vtiger_Field Instance of field to add to this block. + * @return Reference to this block instance + */ + function addField($fieldInstance) { + $fieldInstance->save($this); + return $this; + } + + /** + * Helper function to log messages + * @param String Message to log + * @param Boolean true appends linebreak, false to avoid it + * @access private + */ + static function log($message, $delim=true) { + Vtiger_Utils::Log($message, $delim); + } + + /** + * Get instance of block + * @param mixed block id or block label + * @param Vtiger_Module Instance of the module if block label is passed + */ + static function getInstance($value, $moduleInstance=false) { + global $adb; + $cache = Vtiger_Cache::getInstance(); + if($moduleInstance && $cache->getBlockInstance($value, $moduleInstance->id)){ + return $cache->getBlockInstance($value, $moduleInstance->id); + } else { + $instance = false; + $query = false; + $queryParams = false; + if(Vtiger_Utils::isNumber($value)) { + $query = "SELECT * FROM vtiger_blocks WHERE blockid=?"; + $queryParams = Array($value); + } else { + $query = "SELECT * FROM vtiger_blocks WHERE blocklabel=? AND tabid=?"; + $queryParams = Array($value, $moduleInstance->id); + } + $result = $adb->pquery($query, $queryParams); + if($adb->num_rows($result)) { + $instance = new self(); + $instance->initialize($adb->fetch_array($result), $moduleInstance); + } + $cache->setBlockInstance($value,$instance->module->id, $instance); + return $instance; + } + } + + /** + * Get all block instances associated with the module + * @param Vtiger_Module Instance of the module + */ + static function getAllForModule($moduleInstance) { + global $adb; + $instances = false; + + $query = "SELECT * FROM vtiger_blocks WHERE tabid=? ORDER BY sequence"; + $queryParams = Array($moduleInstance->id); + + $result = $adb->pquery($query, $queryParams); + for($index = 0; $index < $adb->num_rows($result); ++$index) { + $instance = new self(); + $instance->initialize($adb->fetch_array($result), $moduleInstance); + $instances[] = $instance; + } + return $instances; + } + + /** + * Delete all blocks associated with module + * @param Vtiger_Module Instnace of module to use + * @param Boolean true to delete associated fields, false otherwise + * @access private + */ + static function deleteForModule($moduleInstance, $recursive=true) { + global $adb; + if($recursive) Vtiger_Field::deleteForModule($moduleInstance); + $adb->pquery("DELETE FROM vtiger_blocks WHERE tabid=?", Array($moduleInstance->id)); + self::log("Deleting blocks for module ... DONE"); + } +} +?> diff --git a/patch/vtlib/Vtiger/PackageExport.php b/patch/vtlib/Vtiger/PackageExport.php index 3a17fed..b13be4f 100644 --- a/patch/vtlib/Vtiger/PackageExport.php +++ b/patch/vtlib/Vtiger/PackageExport.php @@ -461,6 +461,7 @@ function export_Fields($moduleInstance, $blockid) { // Export Entity Identifier Information if($fieldname == $entity_fieldname) { $this->openNode('entityidentifier'); + $this->outputNode($adb->query_result($entityresult, 0, 'fieldname'), 'fieldname'); $this->outputNode($adb->query_result($entityresult, 0, 'entityidfield'), 'entityidfield'); $this->outputNode($adb->query_result($entityresult, 0, 'entityidcolumn'), 'entityidcolumn'); $this->closeNode('entityidentifier'); diff --git a/patch/vtlib/Vtiger/PackageImport.php b/patch/vtlib/Vtiger/PackageImport.php index e483976..d08c612 100644 --- a/patch/vtlib/Vtiger/PackageImport.php +++ b/patch/vtlib/Vtiger/PackageImport.php @@ -673,10 +673,15 @@ function import_Field($blocknode, $blockInstance, $moduleInstance, $fieldnode) { // Set the field as entity identifier if marked. if(!empty($fieldnode->entityidentifier)) { - $moduleInstance->entityidfield = $fieldnode->entityidentifier->entityidfield; - $moduleInstance->entityidcolumn= $fieldnode->entityidentifier->entityidcolumn; + if(isset($fieldnode->entityidentifier->fieldname) && !empty($fieldnode->entityidentifier->fieldname)) { + $moduleInstance->entityfieldname = strval($fieldnode->entityidentifier->fieldname); + } else { + $moduleInstance->entityfieldname = $fieldInstance->name; + } + $moduleInstance->entityidfield = strval($fieldnode->entityidentifier->entityidfield); + $moduleInstance->entityidcolumn= strval($fieldnode->entityidentifier->entityidcolumn); $moduleInstance->setEntityIdentifier($fieldInstance); - } + } // Check picklist values associated with field if any. if(!empty($fieldnode->picklistvalues) && !empty($fieldnode->picklistvalues->picklistvalue)) { diff --git a/patch/vtlib_patch.zip b/patch/vtlib_patch.zip index 72ce2df77b21afad3b5181de5a8231ab7fa08126..0f4d5c42f26cb75b42b0027b33dfd6c2aeea185d 100644 GIT binary patch delta 10083 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 delta 7914 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 Z{}0D> 'Related module', 'LBL_PICKLIST_OPTIONS' => 'Options', 'LBL_PICKLIST_OPTIONS_TOOLTIP' => '(Separate values with comma)', - 'LBL_MANDATORY' => 'Madatory field', + 'LBL_MANDATORY' => 'Mandatory field', 'LBL_ENTITY_IDENTIFIER' => 'Identifier', 'LBL_ENTITY_IDENTIFIER_FIELD_NAME' => 'Field\'s name:', 'LBL_ENTITY_IDENTIFIER_FIELD_NAME_HELPINFO' => '(separate with comma)', @@ -106,6 +106,7 @@ 'LBL_GENERATED_TYPE_1' => 'Date of day', 'LBL_GENERATED_TYPE_2' => 'Empty', 'LBL_READ_ONLY' => 'Read only', + 'LBL_CREATE_RELATED_LIST' => 'Create a RelatedList', 'LBL_CUSTOM_LINK' => 'Custom Link', 'LBL_CUSTOM_LINK_DESCRIPTION' => 'Description', diff --git a/src/languages/es_es/Settings/ModuleDesigner.php b/src/languages/es_es/Settings/ModuleDesigner.php index 541ef07..5c559f1 100644 --- a/src/languages/es_es/Settings/ModuleDesigner.php +++ b/src/languages/es_es/Settings/ModuleDesigner.php @@ -1,199 +1,203 @@ - 'Diseñador de Módulos', - 'LBL_TEMP_DIRECTORY_NOT_WRITABLE' => 'El directorio "temp" no existe o no tiene permisos de escritura', - - 'LBL_MODULEDESIGNER' => 'Diseñador de Módulos', - 'LBL_MODULEDESIGNER_DESCRIPTION' => 'Crea nuevos módulos para RW CRM', - 'LBL_GENERAL' => 'General', - 'LBL_BLOCKS_FIELDS' => 'Bloques y campos', - 'LBL_CUSTOM_LINKS' => 'Links adicionales', - 'LBL_RELATED_LISTS' => 'Módulos relacionados', - 'LBL_EVENTS' => 'Eventos', - 'LBL_FILTERS' => 'Filtros', - 'LBL_CUSTOM' => 'Adicional', - 'LBL_EXPORT' => 'Exportar', - 'LBL_CREATE_AND_INSTALL_PACKAGE' => 'Crear e instalar el Módulo', - - 'LBL_CUSTOM_PARENT_TAB' => '*Nombre adicional*', - 'LBL_CUSTOM_RELATED_MODULE' => '*Nombre adicional*', - 'LBL_RELATED_LIST_OTHER_MODULE' => 'Otro módulo', - 'LBL_RELATED_LIST_OTHER_MODULE_NAME' => 'Nombre', - - 'LBL_GENERAL_ALT' => 'General', - 'LBL_BLOCKS_FIELDS_ALT' => 'Bloques y campos', - 'LBL_CUSTOM_LINKS_ALT' => 'Links adicionales', - 'LBL_RELATED_LISTS_ALT' => 'Listas relacionadas', - 'LBL_EVENTS_ALT' => 'Eventos', - 'LBL_FILTERS_ALT' => 'Filtros', - 'LBL_CUSTOM_ALT' => 'Adicional', - 'LBL_EXPORT_ALT' => 'Exportar', - - 'LBL_PARENT_TAB' => 'Menú relacionado', - 'LBL_PARENT_TAB_ALT' => 'Menú', - 'LBL_PARENT_TAB_CHOICE' => 'Menú', - 'LBL_SELECT_OPTION' => '- Seleccionar valor -', - 'LBL_TEMPLATE' => 'Plantillas', - 'LBL_TEMPLATE_ALT' => 'Plantillas', - 'LBL_MANIFEST_TEMPLATE' => 'Manifiesto XML', - 'LBL_DIRECTORY_TEMPLATE' => 'Directorio de plantillas', - 'LBL_MODULE' => 'Módulo', - 'LBL_MODULE_ALT' => 'Módulo', - 'LBL_SYSTEM_MODULE_NAME' => 'Nombre de módulos', - 'LBL_VERSION' => 'Versión', - 'LBL_LOAD_MODULE' => 'Cargar un módulo existente', - 'LBL_LOAD_MODULE_ALT' => 'Cargar módulo', - 'LBL_ERROR_PARAM' => 'Parámetros obligatorios no están definidos', - 'LBL_ERROR_DIR_NAME' => 'El directorio relacionado a esta plantilla parece no existir', - 'LBL_ADD_BLOCK' => 'Añadir bloque', - 'LBL_ADD_BLOCK_ALT' => 'Añadir bloque', - 'LBL_UITYPE' => 'Tipo UI', - - 'LBL_BLOCK' => 'Bloque', - 'LBL_BLOCK_DESCRIPTION' => 'Descripción', - 'LBL_BLOCK_LABEL' => 'Etiqueta', - 'LBL_BLOCK_LABEL_TRANSLATION' => 'Traducción etiqueta', - 'LBL_BLOCK_OPTIONS' => 'Opciones', - 'LBL_BLOCK_SHOW_TITLE' => 'Mostrar título', - 'LBL_BLOCK_VISIBLE' => 'Visible', - 'LBL_BLOCK_CREATE_VIEW' => 'Vista de creación', - 'LBL_BLOCK_EDIT_VIEW' => 'Vista de edición', - 'LBL_BLOCK_DETAIL_VIEW' => 'Vista de detalle', - 'LBL_BLOCK_DISPLAY_STATUS' => 'Estado Display', - 'LBL_BLOCK_IS_CUSTOM' => 'Es adicional', - 'LBL_BLOCK_IS_LIST' => 'Es lista', - - 'LBL_FIELD_DESCRIPTION' => 'Descripción', - 'LBL_FIELD_NAME' => 'Nombre del campo', - 'LBL_FIELD_LABEL' => 'Etiqueta', - 'LBL_FIELD_LABEL_TRANSLATION' => 'Traducción etiqueta', - 'LBL_FIELD_TABLE_NAME' => 'Nombre de tabla', - 'LBL_FIELD_COLUMN_NAME' => 'Nombre de columna', - 'LBL_FIELD_COLUMN_TYPE' => 'Tipo de columna', - 'LBL_FIELD_NUMERIC_TYPE' => 'Tipo', - 'LBL_FIELD_INTEGER' => 'Entero', - 'LBL_FIELD_DECIMAL' => 'Decimal', - 'LBL_FIELD_NEGATIVE_NUMBER' => 'Negativo', - 'LBL_FIELD_DEFAULT_VALUE' => 'Definir valor', - 'LBL_FIELD_HELP_INFO_LABEL' => 'Consejo de etiqueta', - 'LBL_FIELD_HELP_INFO_LABEL_TRANSLATION' => 'Traducción de consejo', - 'LBL_RELATED_MODULE' => 'Módulo relacionado', - 'LBL_PICKLIST_OPTIONS' => 'Opciones', - 'LBL_PICKLIST_OPTIONS_TOOLTIP' => '(Separa los valores con coma)', - 'LBL_MANDATORY' => 'Campo obligatorio', - 'LBL_ENTITY_IDENTIFIER' => 'Identifier', - 'LBL_ENTITY_IDENTIFIER_FIELD_NAME' => 'Nombre del campo:', - 'LBL_ENTITY_IDENTIFIER_FIELD_NAME_HELPINFO' => '(separa con coma)', - 'LBL_IN_FILTER_ALL' => 'Vista de Lista', - 'LBL_IN_POPUP' => 'Popup', - 'LBL_IN_RELATED_LIST' => 'Lista relacionada', - 'LBL_QUICK_CREATE' => 'Creación rápida', - 'LBL_MASS_EDITABLE' => 'Edición masiva', - 'LBL_OPTIONS' => 'Opciones', - 'LBL_FIELD_DISPLAY_TYPE' => 'Mostrar en', - 'LBL_DISPLAY_TYPE_1' => 'Vista de detalle y Vista de edición', - 'LBL_DISPLAY_TYPE_2' => 'Vista de detalle', - 'LBL_DISPLAY_TYPE_3' => 'Ni en una ni en otra', - 'LBL_FIELD_DEFAULT_DATE' => 'Fecha por defecto', - 'LBL_GENERATED_TYPE_1' => 'Fecha del día', - 'LBL_GENERATED_TYPE_2' => 'Vacío', - 'LBL_READ_ONLY' => 'Sólo lectura', - - 'LBL_CUSTOM_LINK' => 'Link adicional', - 'LBL_CUSTOM_LINK_DESCRIPTION' => 'Descripción', - 'LBL_CUSTOM_LINK_LABEL' => 'Etiqueta', - 'LBL_CUSTOM_LINK_LABEL_TRANSLATION' => 'Traducción', - 'LBL_CUSTOM_LINK_URL' => 'URL', - 'LBL_CUSTOM_LINK_ICON' => 'Icono', - 'LBL_CUSTOM_LINK_ICON_ALT' => 'Icono', - 'LBL_CUSTOM_LINK_HANDLER_PATH' => 'Ruta del archivo', - 'LBL_CUSTOM_LINK_HANDLER_PATH_ALT' => 'Archivo', - 'LBL_CUSTOM_LINK_HANDLER_CLASS' => 'Nombre de la clase', - 'LBL_CUSTOM_LINK_HANDLER_CLASS_ALT' => 'Clase', - 'LBL_CUSTOM_LINK_HANDLER' => 'Manejador', - - 'LBL_MODULES' => 'Módulos', - 'LBL_RELATED_LIST_LINK_TO_MODULE' => 'Lista Relacionada', - 'LBL_RELATED_LIST_DESCRIPTION' => 'Descripción', - 'LBL_RELATED_LIST_LABEL' => 'Etiqueta', - 'LBL_RELATED_LIST_LABEL_TRANSLATION' => 'Traducción', - 'LBL_RELATED_LIST_NAME' => 'Método', - 'LBL_RELATED_LIST_CUSTOM_NAME' => 'Método adicional', - 'LBL_RELATED_LIST_PRESENCE' => 'Es activo', - 'LBL_RELATED_LIST_PRESENCE_ALT' => 'Activo', - 'LBL_RELATED_LIST_ACTIONS' => 'Acciones', - 'LBL_RELATED_LIST_ACTION_ADD' => 'Añadir', - 'LBL_RELATED_LIST_ACTION_ADD_ALT' => 'Añadir', - 'LBL_RELATED_LIST_ACTION_SELECT' => 'Selecccionar', - 'LBL_RELATED_LIST_ACTION_SELECT_ALT' => 'Seleccionar', - - 'LBL_EVENT' => 'Evento', - 'LBL_EVENT_DESCRIPTION' => 'Descripcion', - 'LBL_EVENT_HANDLER_PATH' => 'Ruta del archivo', - 'LBL_EVENT_HANDLER_PATH_ALT' => 'Archivo', - 'LBL_EVENT_HANDLER_CLASS' => 'Nombre de la clase', - 'LBL_EVENT_HANDLER_CLASS_ALT' => 'Clase', - 'LBL_EVENT_COND' => 'Condiciones', - 'LBL_EVENT_COND_ALT' => 'Condiciones', - 'LBL_EVENT_DEPENDENT_ON' => 'Dependiendo de', - 'LBL_EVENT_DEPENDENT_ON_ALT' => 'Dependiendo de', - 'LBL_EVENT_IS_ACTIVE' => 'Es activo', - 'LBL_EVENT_IS_ACTIVE_ALT' => 'Activo', - - 'LBL_ADD_FILTER' => 'Añadir un filtro', - 'LBL_ADD_FILTER_ALT' => 'Añadir un filtro', - 'LBL_FILTER_FIELDS' => 'Campos', - - 'LBL_FIELD_VALUE_HAS_TO_BE_DEFINED' => 'Debes definir un valor para el campo:', - - 'LBL_MAKE_PACKAGE' => 'Crea y descarga el paquete ZIP del módulo', - 'LBL_TRASH_ALT' => 'Basura', - 'LBL_TRASH_HELP_INFO' => 'Arrastra y suelta entidades aquí para eliminarlas', - - 'LBL_ADD_RELATED_MODULE' => 'Añade un módulo relacionado', - 'LBL_DELETE_RELATED_MODULE' => 'Eliminar', - - 'LBL_UPLOAD' => 'Subir', - 'LBL_UPLOAD_MODULE' => 'Subir un paquete ZIP de módulo', - 'LBL_UPLOAD_MODULE_ALT' => 'Subir ZIP', - - 'LBL_INSTALL_SUCCESS' => 'El módulo ha sido correctamente instalado', - 'LBL_UPDATE_SUCCESS' => 'El módulo ha sido correctamente actualizado', - 'LBL_UPDATE_ERROR_VERSION' => 'La versión del módulo es la misma del módulo que ya hay instalado.', - 'LBL_INSTALL_ERROR' => 'Un error ha ocurrido durante la instalación. Por favor, exporte el paquete ZIP e intente instalarlo manualmente para ver el error', - - 'LBL_CUSTOM_VALUES' => 'Valores adicionales', - 'LBL_MY_VARIABLE' => 'Mi variable', - 'LBL_MY_VALUE' => 'Mi valor', - 'LBL_CUSTOM_VALUES_DESCRIPTION' => 'Puede establecer sus propios campos y variables. Para esto, modifique los siguientes archivos:
  • /vlayouts/layout/Settings/ModuleDesigner/Custom.tpl
  • '. - '
  • /layouts/vlayout/Settings/ModuleDesigner/resources/CustomScript.js
  • '. - '
  • /modules/ModuleDesigner/CustomManifestStructure.php
'. - 'Tambien puede crear plugins para manejar las variables, en el directorio: /modules/ModuleDesigner/plugins' -); - -$jsLanguageStrings = array( - 'LBL_MODULE_NAME_TRANSLATION' => 'Traducción nombre en plural', - 'LBL_MODULE_NAME_SINGLE_TRANSLATION' => 'Traducción nombre en singular', - 'LBL_SELECT_TEMPLATE' => 'Debe seleccionar una plantilla', - 'LBL_SELECT_MANIFEST' => 'Debe seleccionar un manifiesto', - 'LBL_DEFINE_MODULE_NAME' => 'Debe seleccionar un nombre para el Módulo', - 'LBL_CANNOT_DELETE_FILTER_ALL' => 'No puede borrar el filtro "Todos"', - 'LBL_ERROR_TRY_AGAIN' => 'Ha ocurrido un error. Inténtelo de nuevo.', - 'LBL_FILE' => 'El archivo', - 'LBL_DOES_NOT_EXIST' => 'no existe', - 'LBL_MODULE_FOLDER' => 'Directorio de Módulo', - 'LBL_NOT_ALLOWED_TO_EDIT_THE_FIELD' => 'No está permitido editar este campo de sistema.', - 'LBL_EMPTY_FIELD_FILTER' => 'Error, los Filtros no pueden estar vacíos.', - 'LBL_CANNOT_EDIT_REMOVE_FIELD' => 'No puedes editar/borrar un campo con propiedad no-editable', - 'LBL_MANDATORY_ENTITYFIELD' => 'Un campo con valor de Identificador es requerido.', -); - + 'Module Designer', + 'LBL_TEMP_DIRECTORY_NOT_WRITABLE' => 'The "temp" directory does not exist or is unwritable', + + 'LBL_MODULEDESIGNER' => 'Module Designer', + 'LBL_MODULEDESIGNER_DESCRIPTION' => 'Define new entity modules for vTiger', + 'LBL_GENERAL' => 'General', + 'LBL_BLOCKS_FIELDS' => 'Blocks & Fields', + 'LBL_CUSTOM_LINKS' => 'Custom links', + 'LBL_RELATED_LISTS' => 'Related lists', + 'LBL_EVENTS' => 'Events', + 'LBL_FILTERS' => 'Filters', + 'LBL_CUSTOM' => 'Custom', + 'LBL_EXPORT' => 'Export', + 'LBL_CREATE_AND_INSTALL_PACKAGE' => 'Make and install the module', + + 'LBL_CUSTOM_PARENT_TAB' => '*Custom name*', + 'LBL_CUSTOM_RELATED_MODULE' => '*Custom name*', + 'LBL_RELATED_LIST_OTHER_MODULE' => 'Other module', + 'LBL_RELATED_LIST_OTHER_MODULE_NAME' => 'Name', + + 'LBL_GENERAL_ALT' => 'General', + 'LBL_BLOCKS_FIELDS_ALT' => 'Blocks & Fields', + 'LBL_CUSTOM_LINKS_ALT' => 'Custom links', + 'LBL_RELATED_LISTS_ALT' => 'Related lists', + 'LBL_EVENTS_ALT' => 'Events', + 'LBL_FILTERS_ALT' => 'Filters', + 'LBL_CUSTOM_ALT' => 'Custom', + 'LBL_EXPORT_ALT' => 'Export', + + 'LBL_PARENT_TAB' => 'Related menu', + 'LBL_PARENT_TAB_ALT' => 'Menu', + 'LBL_PARENT_TAB_CHOICE' => 'Menu', + 'LBL_SELECT_OPTION' => '- Select a value -', + 'LBL_TEMPLATE' => 'Templates', + 'LBL_TEMPLATE_ALT' => 'Templates', + 'LBL_MANIFEST_TEMPLATE' => 'XML Manifest', + 'LBL_DIRECTORY_TEMPLATE' => 'Directory template', + 'LBL_MODULE' => 'Module', + 'LBL_MODULE_ALT' => 'Module', + 'LBL_SYSTEM_MODULE_NAME' => 'Module\'s name', + 'LBL_VERSION' => 'Version', + 'LBL_LOAD_MODULE' => 'Load an existant module', + 'LBL_LOAD_MODULE_ALT' => 'Load module', + 'LBL_ERROR_PARAM' => 'Mandatory parameters are not defined', + 'LBL_ERROR_DIR_NAME' => 'The directory related to this template seems to not exist', + 'LBL_ADD_BLOCK' => 'Add a block', + 'LBL_ADD_BLOCK_ALT' => 'Add block', + 'LBL_UITYPE' => 'UI Type', + + 'LBL_BLOCK' => 'Block', + 'LBL_BLOCK_DESCRIPTION' => 'Description', + 'LBL_BLOCK_LABEL' => 'Label', + 'LBL_BLOCK_LABEL_TRANSLATION' => 'Label translation', + 'LBL_BLOCK_OPTIONS' => 'Options', + 'LBL_BLOCK_SHOW_TITLE' => 'Show title', + 'LBL_BLOCK_VISIBLE' => 'Visible', + 'LBL_BLOCK_CREATE_VIEW' => 'Create view', + 'LBL_BLOCK_EDIT_VIEW' => 'Edit view', + 'LBL_BLOCK_DETAIL_VIEW' => 'Detail view', + 'LBL_BLOCK_DISPLAY_STATUS' => 'Display status', + 'LBL_BLOCK_IS_CUSTOM' => 'Is custom', + 'LBL_BLOCK_IS_LIST' => 'Is list', + + 'LBL_FIELD_DESCRIPTION' => 'Description', + 'LBL_FIELD_NAME' => 'Field\'s name', + 'LBL_FIELD_LABEL' => 'Label', + 'LBL_FIELD_LABEL_TRANSLATION' => 'Label translation', + 'LBL_FIELD_TABLE_NAME' => 'Table name', + 'LBL_FIELD_COLUMN_NAME' => 'Column name', + 'LBL_FIELD_COLUMN_TYPE' => 'Column type', + 'LBL_FIELD_NUMERIC_TYPE' => 'Type', + 'LBL_FIELD_INTEGER' => 'Integer', + 'LBL_FIELD_DECIMAL' => 'Decimal', + 'LBL_FIELD_NEGATIVE_NUMBER' => 'Negative', + 'LBL_FIELD_DEFAULT_VALUE' => 'Default value', + 'LBL_FIELD_HELP_INFO_LABEL' => 'Tip label', + 'LBL_FIELD_HELP_INFO_LABEL_TRANSLATION' => 'Tip translation', + 'LBL_RELATED_MODULE' => 'Related module', + 'LBL_PICKLIST_OPTIONS' => 'Options', + 'LBL_PICKLIST_OPTIONS_TOOLTIP' => '(Separate values with comma)', + 'LBL_MANDATORY' => 'Mandatory field', + 'LBL_ENTITY_IDENTIFIER' => 'Identifier', + 'LBL_ENTITY_IDENTIFIER_FIELD_NAME' => 'Field\'s name:', + 'LBL_ENTITY_IDENTIFIER_FIELD_NAME_HELPINFO' => '(separate with comma)', + 'LBL_IN_FILTER_ALL' => 'ListView', + 'LBL_IN_POPUP' => 'Popup', + 'LBL_IN_RELATED_LIST' => 'RelatedList', + 'LBL_QUICK_CREATE' => 'Quick create', + 'LBL_MASS_EDITABLE' => 'Mass editable', + 'LBL_OPTIONS' => 'Options', + 'LBL_FIELD_DISPLAY_TYPE' => 'Show on', + 'LBL_DISPLAY_TYPE_1' => 'DetailView and EditView', + 'LBL_DISPLAY_TYPE_2' => 'DetailView', + 'LBL_DISPLAY_TYPE_3' => 'Neither one nor other', + 'LBL_FIELD_DEFAULT_DATE' => 'Default date', + 'LBL_GENERATED_TYPE_1' => 'Date of day', + 'LBL_GENERATED_TYPE_2' => 'Empty', + 'LBL_READ_ONLY' => 'Read only', + 'LBL_CREATE_RELATED_LIST' => 'Create a RelatedList', + + 'LBL_CUSTOM_LINK' => 'Custom Link', + 'LBL_CUSTOM_LINK_DESCRIPTION' => 'Description', + 'LBL_CUSTOM_LINK_LABEL' => 'Label', + 'LBL_CUSTOM_LINK_LABEL_TRANSLATION' => 'Translation', + 'LBL_CUSTOM_LINK_URL' => 'Url', + 'LBL_CUSTOM_LINK_ICON' => 'Icon', + 'LBL_CUSTOM_LINK_ICON_ALT' => 'Icon', + 'LBL_CUSTOM_LINK_HANDLER_PATH' => 'File\'s path', + 'LBL_CUSTOM_LINK_HANDLER_PATH_ALT' => 'File', + 'LBL_CUSTOM_LINK_HANDLER_CLASS' => 'Class\' name', + 'LBL_CUSTOM_LINK_HANDLER_CLASS_ALT' => 'Class', + 'LBL_CUSTOM_LINK_HANDLER' => 'Handler', + + 'LBL_MODULES' => 'Modules', + 'LBL_RELATED_LIST_LINK_TO_MODULE' => 'Related List', + 'LBL_RELATED_LIST_DESCRIPTION' => 'Description', + 'LBL_RELATED_LIST_LABEL' => 'Label', + 'LBL_RELATED_LIST_LABEL_TRANSLATION' => 'Translation', + 'LBL_RELATED_LIST_NAME' => 'Method', + 'LBL_RELATED_LIST_CUSTOM_NAME' => 'Custom method', + 'LBL_RELATED_LIST_PRESENCE' => 'Is active', + 'LBL_RELATED_LIST_PRESENCE_ALT' => 'Active', + 'LBL_RELATED_LIST_ACTIONS' => 'Actions', + 'LBL_RELATED_LIST_ACTION_ADD' => 'Add', + 'LBL_RELATED_LIST_ACTION_ADD_ALT' => 'Add', + 'LBL_RELATED_LIST_ACTION_SELECT' => 'Select', + 'LBL_RELATED_LIST_ACTION_SELECT_ALT' => 'Select', + + 'LBL_EVENT' => 'Event', + 'LBL_EVENT_DESCRIPTION' => 'Description', + 'LBL_EVENT_HANDLER_PATH' => 'File\'s path', + 'LBL_EVENT_HANDLER_PATH_ALT' => 'File', + 'LBL_EVENT_HANDLER_CLASS' => 'Class\' name', + 'LBL_EVENT_HANDLER_CLASS_ALT' => 'Class', + 'LBL_EVENT_COND' => 'Conditions', + 'LBL_EVENT_COND_ALT' => 'Conditions', + 'LBL_EVENT_DEPENDENT_ON' => 'Dependent on', + 'LBL_EVENT_DEPENDENT_ON_ALT' => 'Dependent on', + 'LBL_EVENT_IS_ACTIVE' => 'Is active', + 'LBL_EVENT_IS_ACTIVE_ALT' => 'Active', + + 'LBL_ADD_FILTER' => 'Add a filter', + 'LBL_ADD_FILTER_ALT' => 'Add filter', + 'LBL_FILTER_FIELDS' => 'Fields', + + 'LBL_FIELD_VALUE_HAS_TO_BE_DEFINED' => 'You must define the value of the field:', + + 'LBL_MAKE_PACKAGE' => 'Make and download the module\'s ZIP package', + 'LBL_TRASH_ALT' => 'Trash', + 'LBL_TRASH_HELP_INFO' => 'Drag and Drop entities here for remove them', + + 'LBL_ADD_RELATED_MODULE' => 'Add a related module', + 'LBL_DELETE_RELATED_MODULE' => 'Delete', + + 'LBL_UPLOAD' => 'Upload', + 'LBL_UPLOAD_MODULE' => 'Upload a module\'s ZIP package', + 'LBL_UPLOAD_MODULE_ALT' => 'Upload ZIP', + + 'LBL_INSTALL_SUCCESS' => 'The module has been correctly installed', + 'LBL_UPDATE_SUCCESS' => 'The module has been correctly updated', + 'LBL_UPDATE_ERROR_VERSION' => 'You\'re module\'s version is the same than the version of the module already installed', + 'LBL_INSTALL_ERROR' => 'An error occured during installation. Please export the package and try to install it manually to see the error', + + 'LBL_CUSTOM_VALUES' => 'Custom values', + 'LBL_MY_VARIABLE' => 'My variable', + 'LBL_MY_VALUE' => 'My value', + 'LBL_CUSTOM_VALUES_DESCRIPTION' => 'You can set your own fields and variables. To do this modify these files:
  • /vlayouts/layout/Settings/ModuleDesigner/Custom.tpl
  • '. + '
  • /layouts/vlayout/Settings/ModuleDesigner/resources/CustomScript.js
  • '. + '
  • /modules/ModuleDesigner/CustomManifestStructure.php
'. + 'You can also create plugins to handle your variables, in the directory /modules/ModuleDesigner/plugins' +); + +$jsLanguageStrings = array( + 'LBL_MODULE_NAME_TRANSLATION' => 'Plural, translation', + 'LBL_MODULE_NAME_SINGLE_TRANSLATION' => 'Singular name, translation', + 'LBL_SELECT_TEMPLATE' => 'You must select a template', + 'LBL_SELECT_MANIFEST' => 'You must select a manifest', + 'LBL_DEFINE_MODULE_NAME' => 'You must select a name for the module', + 'LBL_CANNOT_DELETE_FILTER_ALL' => 'You cannot remove the Filter All', + 'LBL_ERROR_TRY_AGAIN' => 'An error occured. Please try again.', + 'LBL_FILE' => 'The file', + 'LBL_DOES_NOT_EXIST' => 'does not exist', + 'LBL_MODULE_FOLDER' => 'Module\'s directory', + 'LBL_NOT_ALLOWED_TO_EDIT_THE_FIELD' => 'You are not allowed to edit this system field', + 'LBL_EMPTY_FIELD_FILTER' => 'Error, Filters cannot have empty fields.', + 'LBL_CANNOT_EDIT_REMOVE_FIELD' => 'You cannot edit/remove a non-editable field', + 'LBL_MANDATORY_ENTITYFIELD' => 'An Identifier field is required.', + 'LBL_VTIGER_DOESNT_LIKE_NAME' => 'Vtiger does not like field called "name". Please choose another field name.', + 'LBL_NOT_POSSIBLE_TO_HAVE_SEVERAL_FIELDS_AS_IDENTIFIER' => 'It is not possible to define several fields as identifier.', + 'LBL_YOU_MUST_DEFINE_A_FIELD_AS_IDENTIFIER' => 'You must define a field as identifier' +); + ?> \ No newline at end of file diff --git a/src/languages/fr_fr/Settings/ModuleDesigner.php b/src/languages/fr_fr/Settings/ModuleDesigner.php old mode 100755 new mode 100644 index a539057..5fb1265 --- a/src/languages/fr_fr/Settings/ModuleDesigner.php +++ b/src/languages/fr_fr/Settings/ModuleDesigner.php @@ -106,6 +106,7 @@ 'LBL_GENERATED_TYPE_1' => 'Date du jour', 'LBL_GENERATED_TYPE_2' => 'Aucune', 'LBL_READ_ONLY' => 'Lecture seule', + 'LBL_CREATE_RELATED_LIST' => 'Créer une RelatedList', 'LBL_CUSTOM_LINK' => 'Custom Link', 'LBL_CUSTOM_LINK_DESCRIPTION' => 'Description du lien', @@ -199,7 +200,10 @@ 'LBL_FILE' => 'Le fichier', 'LBL_DOES_NOT_EXIST' => 'n\'existe pas', 'LBL_MODULE_FOLDER' => 'Dossier du module', - 'LBL_NOT_ALLOWED_TO_EDIT_THE_FIELD' => 'Vous n\'êtes pas autorisé à modifier ce champ système' + 'LBL_NOT_ALLOWED_TO_EDIT_THE_FIELD' => 'Vous n\'êtes pas autorisé à modifier ce champ système', + 'LBL_VTIGER_DOESNT_LIKE_NAME' => 'Vtiger n\'aime pas les champs qui ont pour nom "name". Veuillez choisir un autre nom de champ.', + 'LBL_NOT_POSSIBLE_TO_HAVE_SEVERAL_FIELDS_AS_IDENTIFIER' => 'Il n\'est pas possible de définir plusieurs champs en tant qu\'identifiant.', + 'LBL_YOU_MUST_DEFINE_A_FIELD_AS_IDENTIFIER' => 'Vous devez définir un champ en tant qu\'identifiant.' ); ?> \ No newline at end of file diff --git a/src/manifest.xml b/src/manifest.xml index 6e5d6e1..d7627fb 100755 --- a/src/manifest.xml +++ b/src/manifest.xml @@ -5,7 +5,7 @@ extension -1.0b1.3 +1.0RC 6.1.0 diff --git a/src/modules/ModuleDesigner/ModuleDesigner.png b/src/modules/ModuleDesigner/ModuleDesigner.png deleted file mode 100755 index ca70512f6d4192c9e416c4b5ed00a89638f2d03f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2080 zcmV+*2;cXKP)!O$NLf|F}5L_od(QSf&*%rP$&^=0YQ+W zE|h-o(W@#oXz1I(x zKhDqnyjNHE3U^fdC~07mgeJc!mk9dOQ7cdoMBZL*V4)x(=_TA=mvx;nb#HonVvk~W zCPcHPvdn3erY@KWkCY1 zs8fu_@v2e$hB(c(Z1v6Eb)RWsX|``XHuRI9UVq@O`)~QH#cFL{;mW?RHToD6HbOWH zLJ?d>5OpNc89~kISRAIsAG9~#Hh65lHxkZ#EQqlE7ms2g%jKc{$l9{r?4IIiDI2V> zbJBB#xy4_m;`bXph}Uu{vJ)1?K+o;wmu4<3zA|-TVL!5r)M}6^h$@a`^vz6C-)U{T zrrTU$__*9>!_wJHK{a5M{e)+tQ<$|=zOEIe!puA;$BqV;BA1vQ9oxU>a1DKlCt*kV zQ=aXXZKWg8ZBxfT+00V@GpTIDFF^%N%F$3&#o?&jvNKny{lQXUKuttY@+GP}Zm{L5 zN`;FlA>Xz>;F>%5QCFn=L1LLOhZN(P8HWVPhdZ_hJ0DQ@ZlcPN$DvPMlbT)pOj>T= z1OljvirwOPu3Tnc^h95W)e{`GR`?!ucucz-PDf*1ZrYk!NMO^Q?K?JiJ(Lj~d~$p! zF1c46OREQX;_=PT+~@A+#HB%o63x@8Q0rUhGLozm0FZQ@Qg-Q3#$duM8K1Tq4SGIb z+>*^KkywtA&7{c}RANghlf`E?)z?%}ip_YpTv_}0)oqW2O~K}y=d14K(!M`_`P%+; zHz_w5i-_wt+(0&+Bb&~WOr(kdzjqaav@JA#s>PsZQHmO}$%HIRT$qfI&&s&G7D7|g zoF5q^5b*wR>s=3RqgW7*d@;z83$g9tgcMfdUQqK$&6Os;#Vm`Ya5;J6Nd)qRu-DG<^K1_|lRqle z$%)h4)U$PXQ`wsCPdz6Y6C%unW+-p2!eW$|9hs+gy%&>Eq;ba@4v53N_`82I_}U@f zef90JvEgAHZa1oKz(fw8Lq)QADrsw}#q4lX*R+z6lPCLcYG~T^>$Uf?AND zzx_@WpOff#28%4J3n^v#&w+=8Awj^{#$S3PL?p+bxxgD2+1xsKUhXfc{4qM zb<|i~e0cDk>FcguU+=V;$tpTE_B_8GuHyM;rjQCskzjqp1NF_#FD)&{jrEN!SgckC z`un(k(~b20=`Vz%i|A?zO*N6$lLP}k8XPrDO;2!W;8R>CW9aZel%gmya4JLG(8`&{ zMsQ3Z)zwws=PCEUc4l;#WGt4Ejh6nrlG|u?IP8OCC-C|G)YLcOuc*f5aiHb$%udfS zc6BcyrFZqNT6>PYp^7_WSG9}YCeK-8;HGBrww|73$t1p$%Vn)yLcUPIBC0G!qwM|y5~7Ely>$e8R^D;^-Jz?} zgXhj?lbO?!ZV)JzO5;^k!H1SpN$!5|SLBt#!>|AS>6h1cbu)iC&UamXgR1E`Y!(7W zg=gPOgI_1i+=i;gPbn zovW|fuwfl`mj|oOfy3d#X17sQ;lrR6c;fkw)HjZbi!`pjpyU$K(V^Lpp{4F>Z86@j zrL!T*JxBls!9YP#2uCh|8**VTviQWkk34qnwynJnY`t~Msqnx!HLdg*I}?_n`lP@a8r?+5>UbMFUT zF1xkfY%+>V$y7`!s>gvT0Af)zH1L|Cn2HuIM4rTD1ziJl{yzYlpn2VGh{s0&0000< KMNUMnLSTXzl>vnS diff --git a/src/modules/ModuleDesigner/templates/6.1.0/LANGUAGES/en_us/ModuleName.php b/src/modules/ModuleDesigner/templates/Extension 6.x/LANGUAGES/en_us/ModuleName.php similarity index 100% rename from src/modules/ModuleDesigner/templates/6.1.0/LANGUAGES/en_us/ModuleName.php rename to src/modules/ModuleDesigner/templates/Extension 6.x/LANGUAGES/en_us/ModuleName.php diff --git a/src/modules/ModuleDesigner/templates/Extension/ModuleName.php b/src/modules/ModuleDesigner/templates/Extension 6.x/ModuleName.php similarity index 100% rename from src/modules/ModuleDesigner/templates/Extension/ModuleName.php rename to src/modules/ModuleDesigner/templates/Extension 6.x/ModuleName.php diff --git a/src/modules/ModuleDesigner/templates/Extension/index.php b/src/modules/ModuleDesigner/templates/Extension 6.x/index.php similarity index 100% rename from src/modules/ModuleDesigner/templates/Extension/index.php rename to src/modules/ModuleDesigner/templates/Extension 6.x/index.php diff --git a/src/modules/ModuleDesigner/templates/Extension/LANGUAGES/en_us/ModuleName.php b/src/modules/ModuleDesigner/templates/Module 6.x/LANGUAGES/en_us/ModuleName.php similarity index 100% rename from src/modules/ModuleDesigner/templates/Extension/LANGUAGES/en_us/ModuleName.php rename to src/modules/ModuleDesigner/templates/Module 6.x/LANGUAGES/en_us/ModuleName.php diff --git a/src/modules/ModuleDesigner/templates/6.1.0/ModuleName.php b/src/modules/ModuleDesigner/templates/Module 6.x/ModuleName.php similarity index 94% rename from src/modules/ModuleDesigner/templates/6.1.0/ModuleName.php rename to src/modules/ModuleDesigner/templates/Module 6.x/ModuleName.php index d7925a9..e9ab592 100755 --- a/src/modules/ModuleDesigner/templates/6.1.0/ModuleName.php +++ b/src/modules/ModuleDesigner/templates/Module 6.x/ModuleName.php @@ -10,7 +10,7 @@ include_once 'modules/Vtiger/CRMEntity.php'; -class ModuleName extends Vtiger_CRMEntity { +class extends Vtiger_CRMEntity { var $table_name = 'vtiger_'; var $table_index= 'id'; @@ -69,10 +69,10 @@ class ModuleName extends Vtiger_CRMEntity { var $default_order_by = ''; var $default_sort_order='ASC'; - function ModuleName() { - $this->log =LoggerManager::getLogger('ModuleName'); + function () { + $this->log =LoggerManager::getLogger(''); $this->db = PearDatabase::getInstance(); - $this->column_fields = getColumnFields('ModuleName'); + $this->column_fields = getColumnFields(''); } /** diff --git a/src/modules/ModuleDesigner/templates/extension.xml.php b/src/modules/ModuleDesigner/templates/extension.xml.php index 7cd4553..543ca25 100755 --- a/src/modules/ModuleDesigner/templates/extension.xml.php +++ b/src/modules/ModuleDesigner/templates/extension.xml.php @@ -22,7 +22,7 @@ extension version; ?> -6.1.0 +6.0.0 a_customLinks) > 0): ?> diff --git a/src/modules/ModuleDesigner/templates/module.xml.php b/src/modules/ModuleDesigner/templates/module.xml.php index ffded85..5f96e8a 100755 --- a/src/modules/ModuleDesigner/templates/module.xml.php +++ b/src/modules/ModuleDesigner/templates/module.xml.php @@ -21,9 +21,32 @@ parentTab; ?> version; ?> -6.1.0 +6.0.0 +a_usedTables)): ?> +a_usedTables as $tableName): ?> + + + +` ( + a_tableNameIndexes[$tableName])): ?> + `a_tableNameIndexes[$tableName]; ?>` int(11) NOT NULL DEFAULT '0', + + `lowerName; ?>id` int(11) NOT NULL DEFAULT '0', + + a_fields as $o_field): ?>tableName) || $o_field->tableName == $tableName): ?> + `fieldName; ?>` UITypeDBType; ?> DEFAULT NULL, + + a_tableNameIndexes[$tableName])): ?> + PRIMARY KEY (`a_tableNameIndexes[$tableName]; ?>`) + + PRIMARY KEY (`lowerName; ?>id`) + +) ENGINE=InnoDB DEFAULT CHARSET=utf8]]> +
+ + vtiger_lowerName; ?>lowerName; ?>` ( @@ -34,13 +57,31 @@ PRIMARY KEY (`lowerName; ?>id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8]]>
+ +customFieldTable) ? $o_module->customFieldTable : 'vtiger_'.$o_module->lowerName.'cf'; ?> +customFieldTableIndex)) + { + $cfTableIndex = $o_module->customFieldTableIndex; + } + elseif(!empty($o_module->a_tableNameIndexes[$cfTableName])) + { + $cfTableIndex = $o_module->a_tableNameIndexes[$cfTableName]; + } + else + { + $cfTableIndex = $o_module->lowerName.'id'; + } +?> +a_usedTables)): ?> -vtiger_lowerName; ?>cf -lowerName; ?>cf` ( - `lowerName; ?>id` int(11) NOT NULL, - PRIMARY KEY (`lowerName; ?>id`) + +` ( + `` int(11) NOT NULL, + PRIMARY KEY (``) ) ENGINE=InnoDB DEFAULT CHARSET=utf8]]>
+
a_blocks as $i_block => $o_block): ?> @@ -93,6 +134,7 @@ pickListValues); ?> + @@ -101,9 +143,21 @@ isEntityIdentifier): ?> +a_tableNameIndexes[$o_module->defaultTable])) + { + $entityIdField = $o_module->a_tableNameIndexes[$o_module->defaultTable]; + $entityIdColumn = $entityIdField; + } + else + { + $entityIdField = $o_module->lowerName.'id'; + $entityIdColumn = $entityIdField; + } +?> entityIdentifierFieldName; ?> -lowerName; ?>id -lowerName; ?>id + + diff --git a/src/settings/actions/GetManifestStructure.php b/src/settings/actions/GetManifestStructure.php index e000aac..0c157ce 100755 --- a/src/settings/actions/GetManifestStructure.php +++ b/src/settings/actions/GetManifestStructure.php @@ -130,6 +130,10 @@ protected function getManifestContent($manifestFilePath) protected function getModuleName($xml_manifest) { + $xml_manifest = html_entity_decode($xml_manifest, ENT_QUOTES, "utf-8"); + $xml_manifest = str_replace("&", "&", $xml_manifest); //Because there can be both & and & in XML file + $xml_manifest = str_replace("&", "&", $xml_manifest); + $xml_module = new SimpleXMLElement($xml_manifest); return (String) $xml_module->name; @@ -223,7 +227,11 @@ protected function getTranslations($moduleName) } protected function getModuleObject($moduleName, $xml_manifest) - { + { + $xml_manifest = html_entity_decode($xml_manifest, ENT_QUOTES, "utf-8"); + $xml_manifest = str_replace("&", "&", $xml_manifest); //Because there can be both & and & in XML file + $xml_manifest = str_replace("&", "&", $xml_manifest); + $xml_module = new SimpleXMLElement($xml_manifest); $o_module = new stdClass(); @@ -231,6 +239,7 @@ protected function getModuleObject($moduleName, $xml_manifest) $o_module->label = (String) $xml_module->label; $o_module->parent = (String) $xml_module->parent; $o_module->version = (String) $xml_module->version; + $o_module->type = !empty($xml_module->type) ? (String) $xml_module->type : 'module'; $this->getModuleTranslatedLabel($o_module); @@ -240,6 +249,7 @@ protected function getModuleObject($moduleName, $xml_manifest) $this->getEvents($xml_module, $o_module); //$this->getFilterAll($xml_module, $o_module); + $this->getModuleDefaultTable($moduleName, $o_module); $this->getPopupFieldsSequence($moduleName, $o_module); $this->getRelatedListFieldsSequence($moduleName, $o_module); @@ -380,7 +390,8 @@ protected function getBlockFields($xml_module, $xml_block, $block_index, &$o_mod { $picklistvalues_array = $this->sx_array($xml_field->picklistvalues); } - $o_field->pickListValues = !empty($xml_field->picklistvalues->picklistvalue) ? implode(",", $picklistvalues_array['picklistvalue']) : null;//MODIF by DavidV 2013-01-12 + + $o_field->pickListValues = !empty($picklistvalues_array['picklistvalue']) && is_array($picklistvalues_array['picklistvalue']) ? implode(",", $picklistvalues_array['picklistvalue']) : null;//MODIF by DavidV 2013-01-12 //UIType global $currentModule; @@ -640,6 +651,23 @@ protected function getFilterAll($xml_module, &$o_module) } } + protected function getModuleDefaultTable($moduleName, $o_module) + { + $o_module->defaultTable = "vtiger_".strtolower($moduleName); + + if(file_exists($this->moduleBaseDir."modules/$moduleName/$moduleName.php")) + { + require_once($this->moduleBaseDir."modules/$moduleName/$moduleName.php"); + + $focus = new $moduleName(); + + if(!empty($focus->table_name)) + { + $o_module->defaultTable = $focus->table_name; + } + } + } + protected function getPopupFieldsSequence($moduleName, $o_module) { $popupSequence = 0; diff --git a/src/settings/actions/MakePackage.php b/src/settings/actions/MakePackage.php index 76f698f..dc651d9 100755 --- a/src/settings/actions/MakePackage.php +++ b/src/settings/actions/MakePackage.php @@ -115,6 +115,23 @@ protected function getModule(Vtiger_Request $request) $this->sortModuleData($o_module); + //Store all tables which are used + $o_module->a_usedTables = array(); + + foreach($o_module->a_fields as $i_field => $o_field) + { + if(!in_array($o_field->tableName, $o_module->a_usedTables)) + { + $o_module->a_usedTables[] = $o_field->tableName; + } + } + + //Store all table indexes + $this->getModuleTableNameIndexes($o_module->name, $o_module); + + //Store custom table data + $this->getModuleCustomFieldTable($o_module->name, $o_module); + return $o_module; } @@ -138,13 +155,16 @@ protected function saveXmlManifest($dirname, $moduleName, $module_dir, $o_module ob_start(); include "modules/$moduleName/templates/{$o_module->manifestTemplate}"; $xml_manifest = ob_get_clean(); - + $xml_manifest = str_replace("&", "&", $xml_manifest); //Because there can be both & and & in XML file + $xml_manifest = str_replace("&", "&", $xml_manifest); + $xml_manifest = preg_replace_callback('``', array($this, 'replaceEncodedAndInCDATA'), $xml_manifest); //For Custom links + file_put_contents(DIR_TEMP."{$dirname}/manifest.xml", $xml_manifest); //Also copy manifest in module directory //file_put_contents($module_dir."manifest.xml", $xml_manifest); } - + protected function makeModuleDirectory($dirname, $moduleName, $module_dir, $o_module) { //Make module directory @@ -287,24 +307,26 @@ protected function makeModuleDirectory($dirname, $moduleName, $module_dir, $o_mo array ( 'class '.$o_module->modifiedModule, + 'function '.$o_module->modifiedModule, strtolower($o_module->modifiedModule) ), array ( - 'class ModuleClass', + 'class ', + 'function ', 'payslip' ), $moduleClass_txt ); - if($o_module->directoryTemplate == '6.0.0') - { - $moduleClass_txt = str_replace('class '.$o_module->modifiedModule, 'class ModuleName', $moduleClass_txt); - } - else - { - $moduleClass_txt = str_replace('class '.$o_module->modifiedModule, 'class ModuleClass', $moduleClass_txt); - } + // if($o_module->directoryTemplate == '6.0.0') + // { + // $moduleClass_txt = str_replace('class '.$o_module->modifiedModule, 'class ModuleName', $moduleClass_txt); + // } + // else + // { + // $moduleClass_txt = str_replace('class '.$o_module->modifiedModule, 'class ModuleClass', $moduleClass_txt); + // } $moduleClass_txt = preg_replace ( @@ -383,6 +405,32 @@ protected function makeModuleDirectory($dirname, $moduleName, $module_dir, $o_mo } } + //Add Related List + $a_relatedListToCreate = array(); + foreach($o_module->a_fields as $o_field) + { + if(!empty($o_field->relatedModule) && is_array($o_field->relatedModule)) + { + foreach($o_field->relatedModule as $key => $relatedModule) + { + if($o_field->addRelatedList[$key]) + { + $relatedListStr = "\r\n". + "\t\t\$moduleInstance = Vtiger_Module::getInstance('$relatedModule');\r\n". + "\t\t\$relatedModuleInstance = Vtiger_Module::getInstance('$o_module->name');\r\n". + "\t\t\$relationLabel = 'LBL_".strtoupper($o_module->name)."_LIST';\r\n". + "\t\t\$moduleInstance->setRelatedList(\r\n". + "\t\t\t\$relatedModuleInstance, \$relationLabel, array('ADD'), 'get_dependents_list'\r\n". + "\t\t);\r\n"; + + $a_relatedListToCreate[] = $relatedListStr; + } + } + } + } + $related_lists_to_create = implode("", $a_relatedListToCreate); + + $module_class_content = file_get_contents($module_dir.$o_module->name.'.php'); $module_class_content = str_replace ( @@ -394,14 +442,15 @@ protected function makeModuleDirectory($dirname, $moduleName, $module_dir, $o_mo 'payslip', 'Payslip', //Vtiger 6 - 'ModuleName', + '', '', '', //Generic '%%%RELATED_LIST_FIELDS%%%', '%%%RELATED_LIST_FIELDS_NAME%%%', '%%%POPUP_FIELDS%%%', - '%%%POPUP_FIELDS_NAME%%%' + '%%%POPUP_FIELDS_NAME%%%', + '%%%RELATED_LISTS_TO_CREATE%%%', ), array ( @@ -418,7 +467,8 @@ protected function makeModuleDirectory($dirname, $moduleName, $module_dir, $o_mo $related_list_fields, $related_list_fields_name, $popup_fields, - $popup_fields_name + $popup_fields_name, + $related_lists_to_create ), $module_class_content ); @@ -530,6 +580,44 @@ protected function createZipPackage($dirname, $o_module) return $zipfilename; } + + protected function getModuleTableNameIndexes($moduleName, $o_module) + { + $o_module->a_tableNameIndexes = array(); + + if(file_exists($this->moduleBaseDir."modules/$moduleName/$moduleName.php")) + { + require_once($this->moduleBaseDir."modules/$moduleName/$moduleName.php"); + + $focus = new $moduleName(); + + if(!empty($focus->tab_name_index)) + { + $o_module->a_tableNameIndexes = $focus->tab_name_index; + } + } + } + + protected function getModuleCustomFieldTable($moduleName, $o_module) + { + $o_module->customFieldTable = null; + $o_module->customFieldTableIndex = null; + + if(file_exists($this->moduleBaseDir."modules/$moduleName/$moduleName.php")) + { + require_once($this->moduleBaseDir."modules/$moduleName/$moduleName.php"); + + $focus = new $moduleName(); + + if(!empty($focus->customFieldTable)) + { + $a_tables = array_keys($focus->customFieldTable); + + $o_module->customFieldTable = $a_tables[0]; + $o_module->customFieldTableIndex = $focus->customFieldTable[$a_tables[0]]; + } + } + } protected function copyr($source, $dest, $old_file_name=false, $new_file_name=false) { @@ -595,4 +683,8 @@ protected function cmpRelatedList($a, $b) { return $a->relatedListSequence - $b->relatedListSequence; } -} + + protected function replaceEncodedAndInCDATA($m) { + return ''; + } +} \ No newline at end of file diff --git a/src/settings/templates/EditBlockPopup.tpl b/src/settings/templates/EditBlockPopup.tpl index 55f7e19..ec0f5c2 100755 --- a/src/settings/templates/EditBlockPopup.tpl +++ b/src/settings/templates/EditBlockPopup.tpl @@ -61,7 +61,7 @@ function md_popupSave() if(o_data.label == '') field = '{addslashes(vtranslate("LBL_BLOCK_LABEL", $QUALIFIED_MODULE))}'; {foreach item=language from=$a_languages} - else if(o_data.label_{$language} == '') + else if('{$language}' == window.parent.defaultLanguage && o_data.label_{$language} == '') field = '{addslashes(vtranslate("LBL_BLOCK_LABEL_TRANSLATION", $QUALIFIED_MODULE)|cat:' '|cat:$language)}'; {/foreach} else diff --git a/src/settings/templates/EditCustomLinkPopup.tpl b/src/settings/templates/EditCustomLinkPopup.tpl index ce0c08b..445aaaf 100755 --- a/src/settings/templates/EditCustomLinkPopup.tpl +++ b/src/settings/templates/EditCustomLinkPopup.tpl @@ -80,7 +80,7 @@ function md_popupSave() if(o_data.label == '' || o_data.label == 'LBL_') field = '{addslashes(vtranslate("LBL_CUSTOM_LINK_LABEL", $QUALIFIED_MODULE))}'; {foreach item=language from=$a_languages} - else if(o_data.label_{$language} == '') + else if('{$language}' == window.parent.defaultLanguage && o_data.label_{$language} == '') field = '{addslashes(vtranslate("LBL_CUSTOM_LINK_LABEL_TRANSLATION", $QUALIFIED_MODULE)|cat:' '|cat:$language)}'; {/foreach} else if(o_data.url == '') diff --git a/src/settings/templates/EditFieldPopup.tpl b/src/settings/templates/EditFieldPopup.tpl index dbfc6bc..db3ebd9 100755 --- a/src/settings/templates/EditFieldPopup.tpl +++ b/src/settings/templates/EditFieldPopup.tpl @@ -17,7 +17,7 @@ {vtranslate("LBL_FIELD_NAME", $QUALIFIED_MODULE)} - + {vtranslate("LBL_FIELD_LABEL", $QUALIFIED_MODULE)} @@ -62,6 +62,10 @@   + + {vtranslate("LBL_CREATE_RELATED_LIST", $QUALIFIED_MODULE)} + + {/foreach} {vtranslate("LBL_ADD_RELATED_MODULE", $QUALIFIED_MODULE)} @@ -98,7 +102,7 @@ {/if} {vtranslate("LBL_FIELD_HELP_INFO_LABEL", $QUALIFIED_MODULE)} - + {foreach item=language from=$a_languages} {assign var=label value='helpInfoLabel_'|cat:$language} @@ -169,14 +173,16 @@ function md_addRelatedModule() {ldelim} var row = $(".related_module:first").html(); var row1 = $(".custom_related_module:first").html(); + var row2 = $(".add_related_list:first").html(); - $(".custom_related_module:last").after(''+row+''+row1+''); + $(".add_related_list:last").after(''+row+''+row1+''+row2+''); $(".delete-related-module:gt(0)").show(); {rdelim} function md_deleteRelatedModule(a) {ldelim} + $(a).parent().parent().next().next().remove(); $(a).parent().parent().next().remove(); $(a).parent().parent().remove(); {rdelim} @@ -207,6 +213,7 @@ function deleteCustomValues(array) function md_popupSave() {ldelim} + var o_data = new Object(); o_data.id = {if !empty($a_field.id)}'{$a_field.id}'{else}undefined{/if}; o_data.index = {if !empty($a_field.index)}{$a_field.index}{else}undefined{/if}; @@ -236,10 +243,41 @@ function md_popupSave() o_data.massEditable = $("input[name='mass_editable']").attr("checked") == "checked"; o_data.readOnly = $("input[name='read_only']").attr("checked") == "checked"; o_data.relatedModule = o_data.UITypeNum == 10 ? $("*[name='related_modules\\[\\]']").map(function(){ldelim}return $(this).val();{rdelim}).get() : undefined; + o_data.addRelatedList = o_data.UITypeNum == 10 ? $("*[name='add_related_list\\[\\]']").map(function(){ldelim}return $(this).is(":checked");{rdelim}).get() : undefined; o_data.pickListValues = o_data.UITypeNum == 15 || o_data.UITypeNum == 16 || o_data.UITypeNum == 33 ? $("input[name='picklist_values']").val() : undefined; - + + //Not allow "name" as fieldname + if(o_data.fieldName == 'name') + { + alert(window.parent.md_vtranslate("LBL_VTIGER_DOESNT_LIKE_NAME")); + return false; + } + + //Not allow several fields as identifier + if(o_data.isEntityIdentifier) + { + if(window.parent.md_entityIdentifier != undefined && window.parent.md_entityIdentifier != o_data.oldFieldName) + { + alert(window.parent.md_vtranslate("LBL_NOT_POSSIBLE_TO_HAVE_SEVERAL_FIELDS_AS_IDENTIFIER")); + return false; + } + else + { + window.parent.md_entityIdentifier = o_data.fieldName; + } + } + else + { + if(window.parent.md_entityIdentifier == o_data.oldFieldName) + { + window.parent.md_entityIdentifier = undefined; + } + } + if(o_data.UITypeNum == 10) + { o_data.relatedModule = deleteCustomValues(o_data.relatedModule); + } {foreach item=language from=$a_languages} o_data.label_{$language} = $("input[name='label-{$language}']").val(); @@ -255,17 +293,17 @@ function md_popupSave() if(o_data.label == '' || o_data.label == 'LBL_') field = '{addslashes(vtranslate("LBL_FIELD_LABEL", $QUALIFIED_MODULE))}'; {foreach item=language from=$a_languages} - else if(o_data.label_{$language} == '') + else if('{$language}' == window.parent.defaultLanguage && o_data.label_{$language} == '') field = '{addslashes(vtranslate("LBL_FIELD_LABEL_TRANSLATION", $QUALIFIED_MODULE)|cat:' '|cat:$language)}'; {/foreach} else if(o_data.isEntityIdentifier && o_data.entityIdentifierFieldName == '') field = '{addslashes(vtranslate('LBL_FIELD_ENTITY_IDENTIFIER', $QUALIFIED_MODULE))}'; {foreach item=language from=$a_languages} - else if(o_data.helpInfoLabel != '' && o_data.helpInfoLabel_{$language} == '') + else if('{$language}' == window.parent.defaultLanguage && o_data.helpInfoLabel != '' && o_data.helpInfoLabel_{$language} == '') field = '{addslashes(vtranslate('LBL_FIELD_HELP_INFO_LABEL_TRANSLATION', $QUALIFIED_MODULE))} {$language}'; {/foreach} else if((o_data.UITypeNum == 15 || o_data.UITypeNum == 16 || o_data.UITypeNum == 33) && (o_data.pickListValues == '')) - field = '{addslashes(vtranslate('LBL_OPTIONS', $QUALIFIED_MODULE))}'; + field = '{addslashes(vtranslate('LBL_OPTIONS', $QUALIFIED_MODULE))}'; else valid = true; diff --git a/src/settings/templates/EditRelatedListPopup.tpl b/src/settings/templates/EditRelatedListPopup.tpl index 5409779..5cc80a0 100755 --- a/src/settings/templates/EditRelatedListPopup.tpl +++ b/src/settings/templates/EditRelatedListPopup.tpl @@ -89,7 +89,7 @@ function md_popupSave() if(o_data.label == '' || o_data.label == 'LBL_') field = '{addslashes(vtranslate("LBL_RELATED_LIST_LABEL", $QUALIFIED_MODULE))}'; {foreach item=language from=$a_languages} - else if(o_data.label_{$language} == '') + else if('{$language}' == window.parent.defaultLanguage && o_data.label_{$language} == '') field = '{addslashes(vtranslate("LBL_RELATED_LIST_LABEL_TRANSLATION", $QUALIFIED_MODULE)|cat:' '|cat:$language)}'; {/foreach} else if(o_data.functionName == '') diff --git a/src/settings/templates/Index.tpl b/src/settings/templates/Index.tpl index de1eff3..0c3a16c 100755 --- a/src/settings/templates/Index.tpl +++ b/src/settings/templates/Index.tpl @@ -1,9 +1,10 @@ -
-{vtranslate('LBL_MODULEDESIGNER', $QUALIFIED_MODULE)} -
+ -
{vtranslate('LBL_GENERAL_ALT', $QUALIFIED_MODULE)} {vtranslate('LBL_GENERAL', $QUALIFIED_MODULE)}
@@ -56,5 +57,5 @@
- + Edit popup link \ No newline at end of file diff --git a/src/settings/templates/resources/ModuleDesigner.js b/src/settings/templates/resources/ModuleDesigner.js index f10d034..67bdc84 100755 --- a/src/settings/templates/resources/ModuleDesigner.js +++ b/src/settings/templates/resources/ModuleDesigner.js @@ -62,6 +62,7 @@ var a_filters = []; var stopPopup = false; var filter_fields_ul_droppable = true; +var defaultLanguage; var scrollingFieldsToolbar; var scrollingCustomLinksToolbar; var scrollingRelatedListsToolbar; @@ -69,12 +70,17 @@ var scrollingEventsToolbar; var scrollingFiltersToolbar; var jmd_container; +var md_defaultTable; + +var md_entityIdentifier; + $.fn.fancybox = jQuery.fn.fancybox; $(document).ready ( function() { + defaultLanguage = $('#md-default-language').val(); scrollingFieldsToolbar = $('#md-fields-toolbar'); scrollingCustomLinksToolbar = $('#md-custom-links-toolbar'); scrollingRelatedListsToolbar = $('#md-related-list-toolbar'); @@ -92,7 +98,7 @@ $(document).ready scrollingRelatedListsToolbar.stop().animate({"marginTop": ($(window).scrollTop()) + "px"}, "medium" ); scrollingEventsToolbar.stop().animate({"marginTop": ($(window).scrollTop()) + "px"}, "medium" ); scrollingFiltersToolbar.stop().animate({"marginTop": ($(window).scrollTop()) + "px"}, "medium" ); - scrollingTrash.stop().animate({"top": ($(window).scrollTop() + 420) + "px"}, "medium" ); + scrollingTrash.stop().animate({"top": ($(window).scrollTop() + 120) + "px"}, "medium" ); } ); @@ -892,7 +898,9 @@ function md_addBlock(o_block, isImporting) { var editedModuleName = jmd_container.find("input[name='module_name']").val(); - md_openPopup("index.php?module="+MD_MODULE_NAME+"&view=EditField&mod="+editedModuleName+"&uitype="+uitype_num); + var existantModule = jmd_container.find("select[name='module_directory_template']").val() == 'EXISTANT' ? '1' : '0'; + + md_openPopup("index.php?module="+MD_MODULE_NAME+"&view=EditField&mod="+editedModuleName+"&exist="+existantModule+"&uitype="+uitype_num); } } }); @@ -986,7 +994,7 @@ function md_setFieldNewId(old_field_id, new_field_id) function md_addField(o_field, isImporting) { jblock_edited = $(blockEdited); - + //Edit existing field if(o_field.id != undefined && isImporting != true) { @@ -1023,6 +1031,12 @@ function md_addField(o_field, isImporting) { //Set field index o_field.index = jblock_edited.find("li").length + 1; + + //Save identifier + if(o_field.isEntityIdentifier) + { + md_entityIdentifier = o_field.fieldName; + } //Add field object a_fields.push(o_field); @@ -1116,8 +1130,12 @@ function md_addField(o_field, isImporting) blockEdited = $("#md-block-"+blockNum+" ul"); var editedModuleName = jmd_container.find("input[name='module_name']").val(); + + var existantModule = jmd_container.find("select[name='module_directory_template']").val() == 'EXISTANT' ? '1' : '0'; - md_openPopup("index.php?module="+MD_MODULE_NAME+"&view=EditField&mod="+editedModuleName+"&field="+escape(JSON.stringify(o_field))); + var field_json = encode_utf8(JSON.stringify(o_field)); + + md_openPopup("index.php?module="+MD_MODULE_NAME+"&view=EditField&mod="+editedModuleName+"&exist="+existantModule+"&field="+escape(field_json)); } else { @@ -1129,6 +1147,10 @@ function md_addField(o_field, isImporting) md_addFilterableField(o_field); } +function encode_utf8(s) { + return unescape(encodeURIComponent(s)); +} + function getFieldData(field_id) { for(var i=0; iget("field")) - { + { $a_field = $request->get("field"); //Repair bug with utf8 characters if(!is_array($a_field)) - { + { $oldValue = Zend_Json::$useBuiltinEncoderDecoder; Zend_Json::$useBuiltinEncoderDecoder = true; $a_field = Zend_Json::decode($a_field); @@ -68,7 +68,7 @@ public function process(Vtiger_Request $request) $a_field["fieldName"] = ''; $a_field["oldFieldName"] = ''; $a_field["label"] = ''; - $a_field["tableName"] = 'vtiger_'.strtolower($request->get('mod')); + $a_field["tableName"] = $this->getModuleDefaultTable($request->get('mod')); $a_field["columnName"] = ''; $a_field["helpInfoLabel"] = ''; $a_field["defaultValue"] = ''; @@ -86,6 +86,7 @@ public function process(Vtiger_Request $request) $a_field["readOnly"] = false; $a_field["relatedModule"] = null; $a_field["pickListValues"] = null; + $a_field["addRelatedList"] = null; foreach($a_languages as $language) { @@ -124,6 +125,11 @@ public function process(Vtiger_Request $request) { $a_field["relatedModule"] = array($a_field["relatedModule"]); } + + if(empty($a_field)) + { + $a_field["addRelatedList"] = true; + } } //Get modules @@ -136,7 +142,17 @@ public function process(Vtiger_Request $request) while($row = $db->fetchByAssoc($result)) { $a_modules[] = $row["tablabel"]; - } + } + + //Can show add related list option + if($a_field["UITypeNum"] == 10 && $request->get('exist') == 0) + { + $canAddRelatedList = true; + } + else + { + $canAddRelatedList = false; + } $viewer->assign('MODULE', $moduleName); $viewer->assign('QUALIFIED_MODULE', $qualifiedModuleName); @@ -144,9 +160,29 @@ public function process(Vtiger_Request $request) $viewer->assign('a_modules', $a_modules); $viewer->assign('a_field', $a_field); $viewer->assign('a_languages', $a_languages); + $viewer->assign('CAN_ADD_RELATED_LIST', $canAddRelatedList); echo $viewer->view('EditFieldPopup.tpl', $qualifiedModuleName,true); } } + + protected function getModuleDefaultTable($moduleName) + { + $defaultTable = "vtiger_".strtolower($moduleName); + + if(file_exists($this->moduleBaseDir."modules/$moduleName/$moduleName.php")) + { + require_once($this->moduleBaseDir."modules/$moduleName/$moduleName.php"); + + $focus = new $moduleName(); + + if(!empty($focus->table_name)) + { + $defaultTable = $focus->table_name; + } + } + + return $defaultTable; + } } ?> \ No newline at end of file diff --git a/src/settings/views/Index.php b/src/settings/views/Index.php index 5201b0c..0679dd5 100755 --- a/src/settings/views/Index.php +++ b/src/settings/views/Index.php @@ -16,6 +16,8 @@ class Settings_ModuleDesigner_Index_View extends Settings_Vtiger_Index_View { public function process(Vtiger_Request $request) { + global $default_language; + $viewer = $this->getViewer ($request); $moduleName = $request->getModule(); $qualifiedModuleName = $request->getModule(false); @@ -98,6 +100,7 @@ public function process(Vtiger_Request $request) $viewer->assign('LIST_MODULES', $a_modules); $viewer->assign('LIST_MANIFEST_TEMPLATES', $a_manifest_templates); $viewer->assign('LIST_DIR_TEMPLATES', $a_dir_templates); + $viewer->assign('DEFAULT_LANGUAGE', $default_language); echo $viewer->view('Index.tpl', $qualifiedModuleName,true); }