diff --git a/.htmltest.yml b/.htmltest.yml index 73a3e66b5..bffd90afc 100644 --- a/.htmltest.yml +++ b/.htmltest.yml @@ -7,6 +7,7 @@ IgnoreDirs: CacheExpires: "1m" IgnoreDirectoryMissingTrailingSlash: true +IgnoreInternalEmptyHash: true CheckExternal: false LogLevel: 3 diff --git a/Gemfile b/Gemfile index 7c11dfeb9..50dd5e1e7 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,4 @@ # frozen_string_literal: true source "https://rubygems.org" -# gem "rails" -gem 'asciidoctor' +gem 'asciidoctor', '~> 2.0', '>= 2.0.10' diff --git a/Gemfile.lock b/Gemfile.lock index 2df4f4608..7e3c604d0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,13 +1,13 @@ GEM remote: https://rubygems.org/ specs: - asciidoctor (1.5.6.1) + asciidoctor (2.0.10) PLATFORMS ruby DEPENDENCIES - asciidoctor + asciidoctor (~> 2.0, >= 2.0.10) BUNDLED WITH - 1.15.1 + 1.17.2 \ No newline at end of file diff --git a/README.md b/README.md index bffecbfcb..c9fee6d11 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Netlify Status](https://api.netlify.com/api/v1/badges/2cb9437a-4da2-47de-9dc7-11477d85c3ae/deploy-status)](https://app.netlify.com/sites/suitedocs/deploys) + # SuiteDocs This is the Project for the SuiteCRM Documentation Site which you can browse at [https://docs.suitecrm.com](https://docs.suitecrm.com). diff --git a/_source/1. Asciidoc Stylesheet.adoc b/_source/1. Asciidoc Stylesheet.adoc deleted file mode 100644 index f91d09012..000000000 --- a/_source/1. Asciidoc Stylesheet.adoc +++ /dev/null @@ -1,142 +0,0 @@ ---- -Title: "Asciidoc Stylesheet" -Weight: 10 ---- - -= Heading 1 style - -And this is just some normal text. We're not fancy enough to do the Latin, _lorem ipsum_ stuff, so this will have to do. - -== Heading 2 style - -And this is just some normal text. We're not fancy enough to do the Latin, _lorem ipsum_ stuff, so this will have to do. - -=== Heading 3 style - -And this is just some normal text. We're not fancy enough to do the Latin, _lorem ipsum_ stuff, so this will have to do. - -==== Heading 4 style - -And this is just some normal text. We're not fancy enough to do the Latin, _lorem ipsum_ stuff, so this will have to do. - -===== Heading 5 style - -And this is just some normal text. We're not fancy enough to do the Latin, _lorem ipsum_ stuff, so this will have to do. - ---- - -{{% notice note %}} -Below is some extra text from another site, it showcases a bunch of Asciidoc elements: -{{% /notice %}} - -Welcome to AsciiDocLIVE! ------------------------- - -AsciiDocLIVE is a *free online http://www.methods.co.nz/asciidoc/[AsciiDoc^] -editor*. - -* Just type AsciiDoc source text into the *left* pane, -* ...and the live preview appears in the *right* pane! - -What's AsciiDoc? -~~~~~~~~~~~~~~~~~ - -=== What's AsciiDoc? - -AsciiDoc is a human-readable text document format for writing notes, -documentation, articles, books, ebooks, slideshows, web pages, man pages and -blogs, and more. AsciiDoc files can be translated to many formats including -HTML, PDF, EPUB, and man page. - -To learn more, visit the AsciiDoc home page at -http://www.methods.co.nz/asciidoc/[^]. - -About AsciiDocLIVE -~~~~~~~~~~~~~~~~~~ -AsciiDocLIVE is currently in *beta* stage. This means there are likely a _lot_ -of bugs, and even more ways to make it better. - -If you have any questions, suggestions or other feedback, please -feel free to -https://github.com/jichu4n/asciidoclive/issues/new[create an issue on pass:[] GitHub^]. -Hope -to hear from you soon! - - -[[cheat-sheet]] -AsciiDoc Mini Cheat Sheet -~~~~~~~~~~~~~~~~~~~~~~~~~ - -To help you get started, here're some snippets from the -http://powerman.name/doc/asciidoc[AsciiDoc Cheet Sheet^]. Feel free to poke -around :) - -Text Styles -^^^^^^^^^^^ -* normal, _italic_, *bold*, +mono+. -* ``double quoted'', `single quoted'. -* normal, ^super^, ~sub~. -* `passthru *bold*` - -Tables -^^^^^^ -.An example table -[options="header,footer"] -|======================= -|Col 1|Col 2 |Col 3 -|1 |Item 1 |a -|2 |Item 2 |b -|3 |Item 3 |c -|6 |Three items|d -|======================= - -Lists -^^^^^ - -* Q: How did the programmer die in the shower? - A: He read the shampoo instructions: - - . Lather, rinse. - . Repeat. - -* There are only 10 kinds of people in this world: - - Those who understand binary. - - Those who don't. - -Misc -^^^^ - -* Code listings: -+ -[source,python] ------------------ -#!/usr/bin/env python -import antigravity -try: - antigravity.fly() -except FlytimeError as e: - # um...not sure what to do now. - pass ------------------ - -* Quotes: -+ -[quote,"Charles Dickens","A Tale of Two Cities"] -It was the best of times, it was the worst of times, it was the age of wisdom, -it was the age of foolishness... - -* Links: -** http://asciidoclive.com/[AsciiDocLIVE^] is awesome! - -* Images: -+ -image:https://i.imgur.com/AEkqoRn.jpg[alt="not bad.",width=128,height=128] - -* Videos: -+ -video::th_H1gixMEE[youtube] - -* Pass-through: pass:[
pass through content
] - - - diff --git a/_source/developer-old/_index.en.md b/_source/developer-old/_index.en.md deleted file mode 100644 index 9de719d61..000000000 --- a/_source/developer-old/_index.en.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: "Developer Guide" -weight: 20 -chapter: true -pre: "2. " ---- - -### Developer guide - -# SuiteCRM diff --git a/_source/developer-old/_index.fr.md b/_source/developer-old/_index.fr.md deleted file mode 100644 index 9ff9b288a..000000000 --- a/_source/developer-old/_index.fr.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: "Guide Développeur" -chapter: true -weight: 20 -pre: "2. " ---- - -### Guide Développeur - -# SuiteCRM diff --git a/_source/developer-old/appendix.md b/_source/developer-old/appendix.md deleted file mode 100644 index fde417308..000000000 --- a/_source/developer-old/appendix.md +++ /dev/null @@ -1,206 +0,0 @@ ---- -title: Appendix -weight: 20 ---- - -## Appendix A - Code Examples - - -### Metadata - -This is an example of setting up a function subpanel (see the -\[\[\#chap05.xhtml\#metadata-chapter|Metadata\]\] chapter for more -information). - -In this example the cases module has a custom field -incident\_code\_c which is used to track cases with the -same root cause. We’ll add a subpanel to show all cases that have the -same incident\_code\_c. - -Initially we add to the subpanel\_setup section of Cases by -creating the following file in -custom/Extension/modules/Cases/Ext/Layoutdefs/IncidentLayoutdefs.php - -
- -Example A.1: IncidentLayoutdefs.php - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2 $layout_defs["Cases"]["subpanel_setup"]['incident_cases'] = array(
- 3   'module' => 'Cases',
- 4   'title_key' => 'LBL_INCIDENT_CASES',
- 5   'subpanel_name' => 'default',
- 6   'get_subpanel_data' => 'function:get_cases_by_incident',
- 7   'function_parameters' =>
- 8           array('import_function_file' => 'custom/modules/Cases/IncidentUtils.ph\
- 9 p',),
-10 );
- -
- ------------------------------------------------------------------------- - -
- -Next we create the file which will define our -get\_cases\_by\_incident function -custom/modules/Cases/IncidentUtils.php. - -
- -Example A.2: IncidentUtils.php - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2 function get_cases_by_incident(){
- 3         global $db;
- 4         //Get the current bean
- 5         $bean = $GLOBALS['app']->controller->bean;
- 6         $incidentCode = $db->quote($bean->incident_code_c);
- 7         //Create the SQL array
- 8         $ret = array();
- 9         $ret['select'] = ' SELECT id FROM cases ';
-10         $ret['from'] = ' FROM cases ';
-11         $ret['join'] = "";
-12         //Get all cases where the incident code matches but exclude the current \
-13 case.
-14         $ret['where']="WHERE cases.deleted = 0 AND cases_cstm.incident_code_c = \
-15 '{$incidentCode}' AND cases.id != '{$bean->id}'";
-16         return $ret;
-17 }
- -
- ------------------------------------------------------------------------- - -
- -### Module Installer - -The following is a basic example manifest file. See the -\[\[\#chap14.xhtml\#module-installer-chapter|Module Installer\]\] -chapter. - -
- -Example A.3: Example manifest file - ------------------------------------------------------------------------- - -
- -
  1 $manifest = array(
-  2   'name' => 'Example manifest',
-  3   'description' => 'A basic manifest example',
-  4   'version' => '1.2.3',
-  5   'author' => 'Jim Mackin',
-  6   'readme' => 'This is a manifest example for the SuiteCRM for Developers book',
-  7   'acceptable_sugar_flavors' => array('CE'),
-  8   'acceptable_sugar_versions' => array(
-  9       'exact_matches' => array('6.5.20',),
- 10   ),
- 11   'dependencies' => array(
- 12     array(
- 13       'id_name' => 'hello_world',
- 14       'version' => '3.2.1'
- 15     ),
- 16   ),
- 17   'icon' => 'ManifestExample.png',
- 18   'is_uninstallable' => true,
- 19   'published_date' => '2015-05-05',
- 20   'type' => 'module',
- 21   'remove_tables' => 'prompt',
- 22 );
- 23 $installdefs = array(
- 24   'id' => 'suitecrmfordevelopers_example_manifest',
- 25   'image_dir' => '/images/',
- 26   'copy' => array(
- 27     array(
- 28       'from' => '/modules/ExampleModule',
- 29       'to' => 'modules/ExampleModule',
- 30     ),
- 31   ),
- 32   'dashlets' => array(
- 33     array(
- 34       'from' => '/modules/ExampleModule/Dashlets/',
- 35       'name' => 'ExampleModuleDashlet'
- 36     )
- 37   ),
- 38   'language' => array(
- 39     array(
- 40       'from' => 'application/language/en_us.examplemoduleadmin.php',
- 41       'to_module' => 'application',
- 42       'language' => 'en_us'
- 43     ),
- 44     array(
- 45       'from' => '/modules/Accounts/language/en_us.examplemodule.php',
- 46       'to_module' => 'Accounts',
- 47       'language' => 'en_us'
- 48     ),
- 49     array(
- 50       'from' => '/application/language/es_es.examplemoduleadmin.php',
- 51       'to_module' => 'application',
- 52       'language' => 'es_es'
- 53     ),
- 54     array(
- 55       'from' => '/modules/Accounts/language/es_es.examplemodule.php',
- 56       'to_module' => 'Accounts',
- 57       'language' => 'es_es'
- 58     ),
- 59   ),
- 60   'custom_fields' => array(
- 61     array(
- 62       'name' => 'example_field',
- 63       'label' => 'Example Field',
- 64       'type' => 'varchar',
- 65       'max_size' =>  100,
- 66       'module' => 'Accounts',
- 67     ),
- 68   ),
- 69   'vardefs' => array(
- 70     array(
- 71       'from' => 'modules/Accounts/vardefs/examplemodule_vardefs.php',
- 72       'to_module' => 'Accounts',
- 73     ),
- 74   ),
- 75   'beans' => array(
- 76     array(
- 77       'module' => 'ExampleModule',
- 78       'class' => 'ExampleModule',
- 79       'path' => 'modules/ExampleModule/ExampleModule.php',
- 80     ),
- 81   ),
- 82   'logic_hooks' => array(
- 83     array(
- 84       'module' => 'Accounts',
- 85       'hook' => 'before_save',
- 86       'order' => 100,
- 87       'description'  => 'Example module before save hook',
- 88       'file' => 'modules/ExampleModule/ExampleModuleHook.php',
- 89       'class' => 'ExampleModuleLogicHooks',
- 90       'function' => 'accounts_before_save',
- 91     ),
- 92   ),
- 93   'administration' => array(
- 94     array(
- 95       'from' => 'modules/administration/examplemodule_admin.php',
- 96     ),
- 97   ),
- 98 );
- 99 $upgrade_manifest = array(
-100 );
- -
- ------------------------------------------------------------------------- - -
- - diff --git a/_source/developer-old/chap01.md b/_source/developer-old/chap01.md deleted file mode 100644 index 9742600de..000000000 --- a/_source/developer-old/chap01.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: Introduction -weight: 1 ---- - -### What is SuiteCRM - -The story of [SuiteCRM](https://www.suitecrm.com) starts with SugarCRM. -SugarCRM was founded in 2004 and consisted of an open source version -(called Community Edition) and various paid for versions. However -trouble started brewing when it appeared that SugarCRM would not be -releasing a Community Edition of SugarCRM 7 and would be providing -limited, if any, updates to the Community Edition. - -Enter SuiteCRM. SalesAgility forked Community Edition to create SuiteCRM -and also added various open source plugins to add improved -functionality. - -### This book - -This book is intended for developers who are familiar (or at least -acquainted) with using SuiteCRM but want to perform their own -customisations. SuiteCRM is a large and mature piece of software so it -is impractical for a book to cover all aspects of the software. I’ve -tried to add the most important parts which should allow you to make the -changes you need in 99% of situations. There is a further resources -chapter at the end of this book to help out in those 1% of cases. With -that being said if you feel there is anything important I have left out -(or worse, anything incorrect in the book) please let me know. I can be -contacted at [JSMackin.co.uk](http://www.jsmackin.co.uk). - -### Reading this book - -Each chapter in this book is intended to be self contained so the reader -can jump to interesting chapters. Where there is some overlap this is -usually indicated with links to the relevant chapters. - -Some parts of this book may refer to file paths or other parts of code -that can have a variable value, for example controller names contain the -module name or a file with an arbitrary name. In this case these will be -marked in the form <TheModuleName>, -<TheFileName> or something else suitable. In these -cases you can substitute something appropriate (such as -Accounts or MyNewFile). - -### Setting up SuiteCRM - -In this book we’ll be using SuiteCRM v7.1.5 which is the latest at time -of writing. For up to date versions of the installation instructions see -the SuiteCRM wiki at [https://suitecrm.com/wiki/index.php/Installation](https://suitecrm.com/wiki/index.php/Installation) - -#### Website - -The SuiteCRM installer can be found at [SuitCRM](https://suitecrm.com/). I would recommend SuiteCRM MAX as I prefer to start with a full interface and customise it as needed. - -#### GitHub - -SuiteCRM is also available on [GitHub](http://github.com) at -[https://github.com/salesagility/SuiteCRM](https://github.com/salesagility/SuiteCRM). -Each SuiteCRM version is tagged so you can easily grab the version you need. - -### Initial Tweaks - -After the initial install there are a few tweaks you may want to make on -an instance you are developing on. These changes should improve your -development flow and productivity as well as help identify issues if -they occur. - -#### Developer Mode - -SuiteCRM will cache various files that it processes, such as Smarty -templates. Developer mode will turn off some of the caching so that -changes to files will be seen immediately (though this isn’t always the -case - as is the case with -[extensions](../chap13/). This can be -enabled either through the config file or via the General settings page -inside admin. - -#### Log Level - -The default log level of SuiteCRM is fatal. This is a good -default for production instances but you may want to increase the log -level to info or debug. This will make the log -output more verbose so, should anything go wrong, you’ll have something -to refer to. See the [../chap10/](chapter on logging) for more information. - -#### Display errors - -You’ll also want to turn off display errors. Unfortunately at the moment -SuiteCRM has various notices and warnings out of the box. With -display\_errors on this can sometimes cause AJAX pages and -the link to break. - -With this being said you should be checking the PHP error logs or -selectively enabling
display\_errors to ensure that -the code you are creating is not creating additional notices, warnings -or errors. - -#### XDebug - -[http://xdebug.org XDebug] is a PHP extension which provides profiling -and debugging capabilities to PHP. This can massively improve developer -productivity by simplifying development and, particularly, tracking down -any issues. See the XDebug site for information on XDebug. diff --git a/_source/developer-old/chap02.md b/_source/developer-old/chap02.md deleted file mode 100644 index 8a0a22916..000000000 --- a/_source/developer-old/chap02.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: Directory Structure -weight: 2 ---- - -; cache -: Contains cache files used by SuiteCRM including compiled smarty - templates, grouped vardefs, minified and grouped JavaScript. Some - modules and custom modules may also store (temporary) module - specific info here. ; custom -: Contains user and developer customisations to SuiteCRM. Also - contains some SuiteCRM code to maintain compatibility with SugarCRM. - However this is likely to change in the future. ; data -: Stores the classes and files used to deal with SugarBeans and their - relationships. ; examples -: Contains a few basic examples of lead capture and API usage. However - these are very outdated. ; include -: Contains the bulk of non module and non data SuiteCRM code. ; - install -: Code used by the SuiteCRM installer. ; jssource -: The jssource folder contains the unminified source of - some of the JavaScript files used within SuiteCRM. ; - metadata -: Stores relationship metadata for the various stock SuiteCRM modules. - This should not be confused with module metadata which contains - information on view, dashlet and search definitions. ; - mobile -: Stores code for the \[http://www.quickcrm.fr QuickCRM\] mobile app. - ; ModuleInstall -: Code for the module installer. ; modules -: Contains the code for any stock or custom SuiteCRM modules. ; - service -: Code for the SuiteCRM Soap and REST APIs. ; themes -: Code, data and images for the bundled SuiteCRM theme. ; - upload -: The upload folder contains documents that have been - uploaded to SuiteCRM. The names of the files comes from the ID of - the matching Document Revision/Note. - upload/upgrades will also contain various - upgrade files and the packages of installed modules. ; - log4php, soap, XTemplate, - Zend -: Source code for various libraries used by SuiteCRM some of which are - deprecated. - - diff --git a/_source/developer-old/chap03.md b/_source/developer-old/chap03.md deleted file mode 100644 index f0e4ee5d0..000000000 --- a/_source/developer-old/chap03.md +++ /dev/null @@ -1,658 +0,0 @@ ---- -title: Working with Beans -weight: 3 ---- - -Beans are the Model in SuiteCRM’s MVC (Model View Controller) -architecture. They allow retrieving data from the database as objects -and allow persisting and editing records. This section will go over the -various ways of working with beans. - -### BeanFactory - -The BeanFactory allows dynamically loading bean instances or creating -new records. For example to create a new bean you can use: - -
- -Example 3.1: Creating a new Bean using the BeanFactory - ------------------------------------------------------------------------- - -
- -
1 $bean = BeanFactory::newBean('<TheModule>');
-2 //For example a new account bean:
-3 $accountBean = BeanFactory::newBean('Accounts');
- -
- ------------------------------------------------------------------------- - -
- -Retrieving an existing bean can be achieved in a similar manner: - -
- -Example 3.2: Retrieving a bean with the BeanFactory - ------------------------------------------------------------------------- - -
- -
1 $bean = BeanFactory::getBean('<TheModule>', $beanId);
-2 //For example to retrieve an account id
-3 $bean = BeanFactory::getBean('Accounts', $beanId);
- -
- ------------------------------------------------------------------------- - -
- -getBean will return an unpopulated bean object if -\$beanId is not supplied or if there’s no such record. -Retrieving an unpopulated bean can be useful if you wish to use the -static methods of the bean (for example see the Searching for Beans -section). To deliberately retrieve an unpopulated bean you can omit the -second argument of the getBean call. I.e. - -
- -Example 3.3: Retrieving an unpopulated bean - ------------------------------------------------------------------------- - -
- -
1 $bean = BeanFactory::getBean('<TheModule>');
- -
- ------------------------------------------------------------------------- - -
- -{| |width="50%"| -\[\[File:images/leanpub\_warning.png|50px|class=sidebar-image|warning\]\] -|width="50%"| BeanFactory::getBean caches ten results. This -can cause odd behaviour if you call getBean again and get a -cached copy. Any calls that return a cached copy will return the same -instance. This means changes to one of the beans will be reflected in -all the results. |} - -Using BeanFactory ensures that the bean is correctly set up and the -necessary files are included etc. - -### SugarBean - -The SugarBean is the parent bean class and all beans in SuiteCRM extend -this class. It provides various ways of retrieving and interacting with -records. - -### Searching for beans - -The following examples show how to search for beans using a bean class. -The examples provided assume that an account bean is available names -\$accountBean. This may have been retrieved using the getBean call -mentioned in the BeanFactory section e.g. - -
- -Example 3.4: Retrieving an unpopulated account bean - ------------------------------------------------------------------------- - -
- -
$accountBean = BeanFactory::getBean('Accounts');
- -
- ------------------------------------------------------------------------- - -
- -#### get\_list - -The get\_list method allows getting a list of matching beans and allows -paginating the results. - -
- -Example 3.5: get\_list method signature - ------------------------------------------------------------------------- - -
- -
1 get_list(
-2     $order_by = "",
-3     $where = "",
-4     $row_offset = 0,
-5     $limit=-1,
-6     $max=-1,
-7     $show_deleted = 0)
- -
- ------------------------------------------------------------------------- - -
- -; \$order\_by -: Controls the ordering of the returned list. \$order\_by - is specified as a string that will be used in the SQL ORDER BY - clause e.g. to sort by name you can simply pass name, - to sort by date\_entered descending use date\_entered - DESC. You can also sort by multiple fields. For example - sorting by date\_modified and id descending date\_modified, id - DESC. ; \$where -: Allows filtering the results using an SQL WHERE clause. - \$where should be a string containing the SQL - conditions. For example in the contacts module searching for - contacts with specific first names we might use - contacts.first\_name='Jim'. Note that we specify the - table, the query may end up joining onto other tables so we want to - ensure that there is no ambiguity in which field we target. ; - \$row\_offset -: The row to start from. Can be used to paginate the results. ; - \$limit -: The maximum number of records to be returned by the query. -1 means - no limit. ; \$max -: The maximum number of entries to be returned per page. -1 means the - default max (usually 20). ; \$show\_deleted -: Whether to include deleted results. - -#### = Results \#\#\#\#= - -get\_list will return an array. This will contain the paging information -and will also contain the list of beans. This array will contain the -following keys: - -; list -: An array of the beans returned by the list query ; row\_count -: The total number of rows in the result ; next\_offset -: The offset to be used for the next page or -1 if there are no - further pages. ; previous\_offset -: The offset to be used for the previous page or -1 if this is the - first page. ; current\_offset -: The offset used for the current results. - -#### = Example \#\#\#\#= - -Let’s look at a concrete example. We will return the third page of all -accounts with the industry Media using 10 as a page size -and ordered by name. - -
- -Example 3.6: Example get\_list call - ------------------------------------------------------------------------- - -
- -
 1 $beanList = $accountBean->get_list(
- 2                                 //Order by the accounts name
- 3                                 'name',
- 4                                 //Only accounts with industry 'Media'
- 5                                 "accounts.industry = 'Media'",
- 6                                 //Start with the 30th record (third page)
- 7                                 30,
- 8                                 //No limit - will default to max page size
- 9                                 -1,
-10                                 //10 items per page
-11                                 10);
- -
- ------------------------------------------------------------------------- - -
- -This will return: - -
- -Example 3.7: Example get\_list results - ------------------------------------------------------------------------- - -
- -
 1 Array
- 2 (
- 3     //Snipped for brevity - the list of Account SugarBeans
- 4     [list] => Array()
- 5     //The total number of results
- 6     [row_count] => 36
- 7     //This is the last page so the next offset is -1
- 8     [next_offset] => -1
- 9     //Previous page offset
-10     [previous_offset] => 20
-11     //The offset used for these results
-12     [current_offset] => 30
-13 )
- -
- ------------------------------------------------------------------------- - -
- -#### get\_full\_list - -get\_list is useful when you need paginated results. -However if you are just interested in getting a list of all matching -beans you can use get\_full\_list. The -get\_full\_list method signature looks like this: - -
- -Example 3.8: get\_full\_list method signature - ------------------------------------------------------------------------- - -
- -
1 get_full_list(
-2             $order_by = "",
-3             $where = "",
-4             $check_dates=false,
-5             $show_deleted = 0
- -
- ------------------------------------------------------------------------- - -
- -These arguments are identical to their usage in get\_list -the only difference is the \$check\_dates argument. This is -used to indicate whether the date fields should be converted to their -display values (i.e. converted to the users date format). - -#### = Results \#\#\#\#= - -The get\_full\_list call simply returns an array of the matching beans - -#### = Example \#\#\#\#= - -Let’s rework our get\_list example to get the full list of -matching accounts: - -
- -Example 3.9: Example get\_full\_list call - ------------------------------------------------------------------------- - -
- -
1 $beanList = $accountBean->get_full_list(
-2                                 //Order by the accounts name
-3                                 'name',
-4                                 //Only accounts with industry 'Media'
-5                                 "accounts.industry = 'Media'"
-6                                 );
- -
- ------------------------------------------------------------------------- - -
- -#### retrieve\_by\_string\_fields - -Sometimes you only want to retrieve one row but may not have the id of -the record. retrieve\_by\_string\_fields allows retrieving -a single record based on matching string fields. - -
- -Example 3.10: retrieve\_by\_string\_fields method signature - ------------------------------------------------------------------------- - -
- -
1 retrieve_by_string_fields(
-2                           $fields_array,
-3                           $encode=true,
-4                           $deleted=true)
- -
- ------------------------------------------------------------------------- - -
- -; \$fields\_array -: An array of field names to the desired value. ; \$encode -: Whether or not the results should be HTML encoded. ; \$deleted -: Whether or not to add the deleted filter. - -{| |width="50%"| -\[\[File:images/leanpub\_warning.png|50px|class=sidebar-image|warning\]\] -|width="50%"| Note here that, confusingly, the deleted flag works -differently to the other methods we have looked at. It flags whether or -not we should filter out deleted results. So if true is passed then the -deleted results will ''not'' be included. |} - -#### = Results \#\#\#\#= - -retrieve\_by\_string\_fields returns a single bean as it’s result or -null if there was no matching bean. - -#### = Example \#\#\#\#= - -For example to retrieve the account with name Tortoise Corp -and account\_type Customer we could use the following: - -
- -Example 3.11: Example retrieve\_by\_string\_fields call - ------------------------------------------------------------------------- - -
- -
1 $beanList = $accountBean->retrieve_by_string_fields(
-2                                 array(
-3                                   'name' => 'Tortoise Corp',
-4                                   'account_type' => 'Customer'
-5                                 )
-6                               );
- -
- ------------------------------------------------------------------------- - -
- -### Accessing fields - -If you have used one of the above methods we now have a bean record. -This bean represents the record that we have retrieved. We can access -the fields of that record by simply accessing properties on the bean -just like any other PHP object. Similarly we can use property access to -set the values of beans. Some examples are as follows: - -
- -Example 3.12: Accessing fields examples - ------------------------------------------------------------------------- - -
- -
 1 //Get the Name field on account bean
- 2 $accountBean->name;
- 3
- 4 //Get the Meeting start date
- 5 $meetingBean->date_start;
- 6
- 7 //Get a custom field on a case
- 8 $caseBean->third_party_code_c;
- 9
-10 //Set the name of a case
-11 $caseBean->name = 'New Case name';
-12
-13 //Set the billing address post code of an account
-14 $accountBean->billing_address_postalcode = '12345';
- -
- ------------------------------------------------------------------------- - -
- -When changes are made to a bean instance they are not immediately -persisted. We can save the changes to the database with a call to the -beans save method. Likewise a call to save on -a brand new bean will add that record to the database: - -
- -Example 3.13: Persisting bean changes - ------------------------------------------------------------------------- - -
- -
 1 //Get the Name field on account bean
- 2 $accountBean->name = 'New account name';
- 3 //Set the billing address post code of an account
- 4 $accountBean->billing_address_postalcode = '12345';
- 5 //Save both changes.
- 6 $accountBean->save();
- 7
- 8 //Create a new case (see the BeanFactory section)
- 9 $caseBean = BeanFactory::newBean('Cases');
-10 //Give it a name and save
-11 $caseBean->name = 'New Case name';
-12 $caseBean->save();
- -
- ------------------------------------------------------------------------- - -
- -{| |width="50%"| -\[\[File:images/leanpub\_info-circle.png|50px|class=sidebar-image|information\]\] -|width="50%"| Whether to save or update a bean is decided by checking -the id field of the bean. If id is set then -SuiteCRM will attempt to perform an update. If there is no -id then one will be generated and a new record will be -inserted into the database. If for some reason you have supplied an -id but the record is new (perhaps in a custom import -script) then you can set new\_with\_id to true on the bean -to let SuiteCRM know that this record is new. |} - -### Related beans - -We have seen how to save single records but, in a CRM system, -relationships between records are as important as the records -themselves. For example an account may have a list of cases associated -with it, a contact will have an account that it falls under etc. We can -get and set relationships between beans using several methods. - -#### get\_linked\_beans - -The get\_linked\_beans method allows retrieving a list of -related beans for a given record. - -
- -Example 3.14: get\_linked\_beans method signature - ------------------------------------------------------------------------- - -
- -
1 get_linked_beans(
-2                 $field_name,
-3                 $bean_name,
-4                 $sort_array = array(),
-5                 $begin_index = 0,
-6                 $end_index = -1,
-7                 $deleted=0,
-8                 $optional_where="");
- -
- ------------------------------------------------------------------------- - -
- -; \$field\_name -: The link field name for this link. Note that this is not the same as - the name of the relationship. If you are unsure of what this should - be you can take a look into the cached vardefs of a module in - cache/modules/<TheModule>/<TheModule>Vardefs.php - for the link definition. ; \$bean\_name -: The name of the bean that we wish to retrieve. ; \$sort\_array -: This is a legacy parameter and is unused. ; \$begin\_index -: Skips the initial \$begin\_index results. Can be used - to paginate. ; \$end\_index -: Return up to the \$end\_index result. Can be used to - paginate. ; \$deleted -: Controls whether deleted or non deleted records are shown. If true - only deleted records will be returned. If false only non deleted - records will be returned. ; \$optional\_where -: Allows filtering the results using an SQL WHERE clause. See the - get\_list method for more details. - -#### = Results \#\#\#\#= - -get\_linked\_beans returns an array of the linked beans. - -#### = Example \#\#\#\#= - -
- -Example 3.15: Example get\_linked\_beans call - ------------------------------------------------------------------------- - -
- -
1 $accountBean->get_linked_beans(
-2                 'contacts',
-3                 'Contacts',
-4                 array(),
-5                 0,
-6                 10,
-7                 0,
-8                 "contacts.primary_address_country = 'USA'");
- -
- ------------------------------------------------------------------------- - -
- -#### relationships - -In addition to the get\_linked\_beans call you can also -load and access the relationships more directly. - -#### = Loading \#\#\#\#= - -Before accessing a relationship you must use the -load\_relationship call to ensure it is available. This -call takes the link name of the relationship (not the name of the -relationship). As mentioned previously you can find the name of the link -in -cache/modules/<TheModule>/<TheModule>Vardefs.php -if you’re not sure. - -
- -Example 3.16: Loading a relationship - ------------------------------------------------------------------------- - -
- -
1 //Load the relationship
-2 $accountBean->load_relationship('contacts');
-3 //Can now call methods on the relationship object:
-4 $contactIds = $accountBean->contacts->get();
- -
- ------------------------------------------------------------------------- - -
- -#### = Methods \#\#\#\#= - -###### get - -Returns the ids of the related records in this relationship e.g for the -account - contacts relationship in the example above it will return the -list of ids for contacts associated with the account. - -###### getBeans - -Similar to get but returns an array of beans instead of -just ids. - -{| |width="50%"| -\[\[File:images/leanpub\_warning.png|50px|class=sidebar-image|warning\]\] -|width="50%"| getBeans will load the full bean for each -related record. This may cause poor performance for relationships with a -large number of beans. |} - -###### add - -Allows relating records to the current bean. add takes a -single id or bean or an array of ids or beans. If the bean is available -this should be used since it prevents reloading the bean. For example to -add a contact to the relationship in our example we can do the -following: - -
- -Example 3.18: Adding a new contact to a relationship - ------------------------------------------------------------------------- - -
- -
 1 //Load the relationship
- 2 $accountBean->load_relationship('contacts');
- 3
- 4 //Create a new demo contact
- 5 $contactBean = BeanFactory::newBean();
- 6 $contactBean->first_name = 'Jim';
- 7 $contactBean->last_name = 'Mackin';
- 8 $contactBean->save();
- 9
-10 //Link the bean to $accountBean
-11 $accountBean->contacts->add($contactBean);
- -
- ------------------------------------------------------------------------- - -
- -###### delete - -delete allows unrelating beans. Counter-intuitively it -accepts the ids of both the bean and the related bean. For the related -bean you should pass the bean if it is available e.g when unrelating an -account and contact: - -
- -Example 3.19: Removing a new contact from a relationship - ------------------------------------------------------------------------- - -
- -
1 //Load the relationship
-2 $accountBean->load_relationship('contacts');
-3
-4 //Unlink the contact from the account - assumes $contactBean is a Contact SugarB\
-5 ean
-6 $accountBean->contacts->delete($accountBean->id, $contactBean);
- -
- ------------------------------------------------------------------------- - -
- -{| |width="50%"| -\[\[File:images/leanpub\_warning.png|50px|class=sidebar-image|warning\]\] -|width="50%"| Be careful with the delete method. Omitting the second -argument will cause all relationships for this link to be removed. |} - - diff --git a/_source/developer-old/chap04.md b/_source/developer-old/chap04.md deleted file mode 100644 index 6cd44010a..000000000 --- a/_source/developer-old/chap04.md +++ /dev/null @@ -1,342 +0,0 @@ ---- -title: Vardefs -weight: 4 ---- - -### What are Vardefs - -The Vardefs are used to supply information to SuiteCRM about a -particular bean. These generally specify the fields, relationships and -indexes in a given module as well as additional information such as -whether it is audited, the table name etc. - -### Defining Vardefs - -#### Module - -Vardefs are initially defined in their respective modules folder. For -the Accounts module this will be in modules/Accounts/vardefs.php. The -information is stored in an array named -$dictionary using the module name as the key. For Accounts this will be $dictionary\['Account'\]. -Let’s look at the Account vardefs (which have been edited for brevity): - -
- -Example 4.1: Account Vardefs - ------------------------------------------------------------------------- - -
- -
 1 $dictionary['Account'] =
- 2 array(
- 3  'table' => 'accounts',
- 4  'audited'=>true,
- 5  'unified_search' => true,
- 6  'unified_search_default_enabled' => true,
- 7  'duplicate_merge'=>true,
- 8  'comment' => 'Accounts are organizations or entities that ...',
- 9  'fields' => array (
-10    //Snipped for brevity. See the fields section.
-11  ),
-12  'indices' => array (
-13    //Snipped for brevity. See the indices section.
-14  ),
-15  'relationships' => array (
-16    //Snipped for brevity. See the relationship section.
-17  ),
-18  //This enables optimistic locking for Saves From EditView
-19  'optimistic_locking'=>true,
-20 );
-21
-22 VardefManager::createVardef(
-23  'Accounts',
-24  'Account',
-25  array('default', 'assignable','company',)
-26 );
- -
- ------------------------------------------------------------------------- - -
- -#### = Keys \#\#\#\#= - -The following are some of the keys that can be specified for the -vardefs. Fields, indices and relationships are covered in their own -sections. - -; table -: The database table name for this module. ; audited -: Whether or not this module should be audited. Note that - audited must also be set at the fields level for a - field to be audited. ; unified\_search -: Whether this module can be searchable via the global search. ; - unified\_search\_default\_enabled -: Whether this module is searchable via the global search by default. - ; duplicate\_merge -: Whether or not duplicate merging functionality is enabled for this - module. ; comment -: A description of this module. ; optimistic\_locking -: Whether optimistic should be enabled for this module. Optimistic - locking locks concurrent edits on a record by assuming that there - will be no conflict. On save the last modified timestamp on the - record will be checked. If it is different then an edit has occurred - since this record was loaded. If this is the case then the user will - be prompted with a page showing the differences in the two edits and - asked to choose which edits are to be used. - -#### = Fields \#\#\#\#= - -The field defines the behaviour and attributes of each field in the -module. - -; name -: The name of the field. ; vname -: The name of the language label to be used for this field. ; - type -: The type of the field. See the field types section. ; - isnull -: Whether null values are allowed ; len -: If the field is a string type, the max number of characters allowed. - ; options -: For enum fields the language label for the dropdown values for this - field ; dbtype -: The type to be used by the database to store this field. This is not - required as the appropriate type is usually chosen. ; - default -: The default value of this field. ; massupdate -: Whether or not this field should be mass updatable. Note that some - field types are always restricted from mass updates. ; - rname -: For related fields only. The name of the field to be taken from the - related module. ; id\_name -: For related fields only. The field in this bean which contains the - related id. ; source -: The source of this field. Can be set to ‘non-db’ if the field is not - stored in the database - for example for link fields, fields - populated by logic hooks or by other means. ; sort\_on -: For concatenated fields (i.e. name fields) the field which should be - used to sort. ; fields -: For concatenated fields (i.e. name fields) an array of the fields - which should be concatenated. ; db\_concat\_fields -: For concatenated fields (i.e. name fields) an array of the fields - which should be concatenated in the database. Usually this is the - same as fields. ; unified\_search -: True if this field should be searchable via the global search. ; - enable\_range\_search -: Whether the list view search should allow a range search of this - field. This is used for date and numeric fields. ; - studio -: Whether the field should display in studio. ; audited -: Whether or not changes to this field should be audited. - -#### = Field types \#\#\#\#= - -The following are common field types used: - -; id -: An id field. ; name -: A name field. This is usually a concatenation of other fields. ; - bool -: A boolean field. ; varchar -: A variable length string field. ; char -: A character field. ; text -: A text area field. ; decimal -: A decimal field. ; date -: A date field. ; datetime -: A date and time field. ; enum -: A dropdown field. ; phone -: A phone number field. ; link -: A link to another module via a relationship. ; relate -: A related bean field. - -#### = Indices \#\#\#\#= - -The indices array allows defining any database indexes that should be in -place on the database table for this module. Let’s look at an example: - -
- -Example 4.2: Example indices definition - ------------------------------------------------------------------------- - -
- -
 1 'indices' => array (
- 2  array(
- 3      'name' =>'idx_mymod_id_del',
- 4      'type' =>'index',
- 5      'fields'=>array('id', 'deleted')),
- 6  array(
- 7      'name' =>'idx_mymod_parent_id',
- 8      'type' =>'index',
- 9      'fields'=>array( 'parent_id')),
-10  array(
-11      'name' =>'idx_mymod_parent_id',
-12      'type' =>'unique',
-13      'fields'=>array( 'third_party_id')),
-14  ),
- -
- ------------------------------------------------------------------------- - -
- -Each array entry should have, at least, the following entries: - -; name -: The name of the index. This is usually used by the database to - reference the index. Most databases require that these are unique. ; - type -: The type of the index to create. index will simply add - an index on the fields, unique will add a unique - constraint on the fields, primary will add the fields - as a primary key. ; fields -: An array of the fields to be indexed. The order of this array will - be used as the order of the fields in the index. - -#### = Relationships \#\#\#\#= - -The Vardefs also specify the relationships within this module. Here’s an -edited example from the Accounts module: - -
- -Example 4.3: Example relationships definition - ------------------------------------------------------------------------- - -
- -
 1 'relationships' => array (
- 2  'account_cases' => array(
- 3      'lhs_module'=> 'Accounts',
- 4      'lhs_table'=> 'accounts',
- 5      'lhs_key' => 'id',
- 6      'rhs_module'=> 'Cases',
- 7      'rhs_table'=> 'cases',
- 8      'rhs_key' => 'account_id',
- 9      'relationship_type' => 'one-to-many'),
-10 ),
- -
- ------------------------------------------------------------------------- - -
- -Here we see the link between accounts and cases. This is specified with -the following keys: - -; lhs\_module -: The module on the left hand side of this relationship. For a one to - many relationship this will be the “One” side. ; - lhs\_table -: The table for the left hand side module. If you are unsure the table - for a module can be found in it’s vardefs. ; lhs\_key -: The field to use for the left hand side of this link. In this case - it is the id of the account. ; rhs\_module -: The right hand side module. In this case the “many” side of the - relationship. ; rhs\_table -: The table for the right hand side module. As stated previously you - can find the table for a module can be found in it’s vardefs. ; - rhs\_key -: The field to use on the right hand side. In this case the - account\_id field on cases. ; - relationship\_type -: The type of relationship - “one-to-many” or “many-to-many”. Since - this is a one to many relationship it means a case is related to a - single account but a single account can have multiple cases. - -For many to many relationship fields the following keys are also -available: - -; join\_table -: The name of the join table for this relationship. ; - join\_key\_lhs -: The name of the field on the join table for the left hand side. ; - join\_key\_rhs -: The name of the field on the join table for the right hand side. - -#### Vardef templates - -Vardef templates provide a shortcut for defining common vardefs. This is -done by calling VardefManager::createVardef and passing the -module name, object name and an array of templates to be assigned. The -following is an example from the accounts vardefs: - -
- -Example 4.4: Example vardef template - ------------------------------------------------------------------------- - -
- -
22 VardefManager::createVardef(
-23      'Accounts',
-24      'Account',
-25      array('default', 'assignable','company',)
-26      );
- -
- ------------------------------------------------------------------------- - -
- -In this example the default, assignable and -company templates are used. The following are some of the -available templates: - -; basic
default : Adds the common base -fields such as id, name, -date\_entered, etc. ; assignable : Adds the -fields and relationships necessary to assign a record to a user. ; -person : Adds fields common to people records such as -first\_name, last\_name, address, etc. ; -company : Adds fields common to companies such as an -industry dropdown, address, etc. - -#### Customising vardefs - -Vardefs can be customised by adding a file into - -
- -Example 4.5: Custom vardef location - ------------------------------------------------------------------------- - -
- -
custom/Extension/modules/<TheModule>/Ext/SomeFile.php
- -
- ------------------------------------------------------------------------- - -
- -This file can then be used to add a new field definition or customise an -existing one e.g changing a field type: - -
- -Example 4.6: Example overriding an existing vardef - ------------------------------------------------------------------------- - -
- -
$dictionary["TheModule"]["fields"]["some_field"]['type'] = 'int';
- -
- ------------------------------------------------------------------------- - -
diff --git a/_source/developer-old/chap05.md b/_source/developer-old/chap05.md deleted file mode 100644 index 367eb6a48..000000000 --- a/_source/developer-old/chap05.md +++ /dev/null @@ -1,204 +0,0 @@ ---- -title: Views -weight: 5 ---- - -SuiteCRM follows the MVC (Model-View-Controller) pattern and as such has -the concept of views. Views are responsible for gathering and displaying -data . There are a number of default views in SuiteCRM. These include - -; ListView -: Displays a list of records and provides links to the EditViews and - DetailViews of those records. The ListView also allows some - operations such as deleting and mass updating records. This is - (usually) the default view for a module. ; DetailView -: Displays the details of a single record and also displays subpanels - of related records. ; EditView -: The EditView allows editing the various fields of a record and - provides validation on these values. - -### Location - -Views can be found in modules/<TheModule>/views/ or, -for custom views,
-custom/modules/<TheModule>/views/, and are named in -the following format: view.<viewname>.php. For -example, the Accounts DetailView can be found in -modules/Accounts/views/view.detail.php with a customised -version in custom/modules/Accounts/views/view.detail.php. -The custom version is used if it exists. If it doesn’t then the module -version is used. Finally, if neither of these exist then the SuiteCRM -default is used in include/MVC/View/views/. - -### Customising - -In order to customise a View we first need to create the appropriate -view file. This will vary depending on the module we wish to target. - -#### Custom module - -In this case we can place the file directly into our module. Create a -new file (if it doesn’t exist) at -modules/<TheModule>/views/view.<viewname>.php. -The contents will look similar to: - -
- -Example 5.1: View for a custom module - ------------------------------------------------------------------------- - -
- -
1 <?php
-2
-3 require_once 'include/MVC/View/views/view.<viewname>.php';
-4
-5 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-6 class <TheModule>View<ViewName> extends View<ViewName>
-7 {
-8
-9 }
- -
- ------------------------------------------------------------------------- - -
- -A more concrete example would be for the detail view for a custom module -called ABC\_Vehicles: - -
- -Example 5.2: Detail view for a custom module, ABC\_Vehicles - ------------------------------------------------------------------------- - -
- -
1 <?php
-2
-3 require_once 'include/MVC/View/views/view.detail.php';
-4
-5 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-6 class ABC_VehiclesViewDetail extends ViewDetail
-7 {
-8
-9 }
- -
- ------------------------------------------------------------------------- - -
- -#### Preexisting modules - -For preexisting modules you will want to add the view to
-custom/modules/<TheModule>/views/view.<viewname>.php. - -The contents of this file will vary depending on whether you wish to -extend the existing view (if it exists) or create your own version -completely. It is usually best to extend the existing view, since this -will retain important logic. Note the naming convention here. We name -the class
Custom<TheModule>View<ViewName> -(for example CustomAccountsViewDetail). - -Here we don’t extend the existing view or no such view exists: - -
- -Example 5.3: Custom view for an existing module - ------------------------------------------------------------------------- - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3
-4 require_once 'include/MVC/View/views/view.<viewname>.php';
-5
-6 class Custom<TheModule>View<ViewName> extends ViewDetail
-7 {
-8
-9 }
- -
- ------------------------------------------------------------------------- - -
- -Otherwise we extend the existing view. Note that we are requiring the -existing view: - -
- -Example 5.4: Overriding a view for an existing module - ------------------------------------------------------------------------- - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3
-4 require_once 'modules/<TheModule>/views/view.<viewname>.php';
-5
-6 class Custom<TheModule>View<ViewName> extends <TheModule>View<ViewName>
-7 {
-8
-9 }
- -
- ------------------------------------------------------------------------- - -
- -For example, overriding the List View of Accounts: - -
- -Example 5.5: Overriding the Accounts List View - ------------------------------------------------------------------------- - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3
-4 require_once 'modules/Accounts/views/view.list.php';
-5
-6 class CustomAccountsViewList extends AccountsViewList
-7 {
-8
-9 }
- -
- ------------------------------------------------------------------------- - -
- -#### Making changes - -Now that we have a custom view what can we actually do? The views have -various methods which we can now override to change/add behaviour. The -most common ones to override are: - -; preDisplay -: Explicitly intended to allow logic to be called before display() is - called. This can be used to alter arguments to the list view or to - output anything to appear before the main display code (such as, for - example, adding JavaScript). ; display -: Does the actual work of displaying the view. Can be overridden to - alter this behaviour or to output anything after the main display. - You usually want to call parent::display(); to ensure that the - display code is run (unless, of course, you are adding your own - display logic). - - diff --git a/_source/developer-old/chap06.md b/_source/developer-old/chap06.md deleted file mode 100644 index de1a51a29..000000000 --- a/_source/developer-old/chap06.md +++ /dev/null @@ -1,869 +0,0 @@ ---- -title: Metadata -weight: 6 ---- - -### Intro - -Module metadata are used to describe how various views behave in the -module. The main use of this is providing field and layout information -but this can also be used to filter subpanels and to describe what -fields are used in the search. - -### Location - -Module metadata can be found in: - -
- -Example 6.1: Module metadata location - ------------------------------------------------------------------------- - -
- -
modules/<TheModule>/metadata/
- -
- ------------------------------------------------------------------------- - -
- -### Customising - -Usually studio is the best way of customising metadata. Even when you do -wish to make customisations that are not possible through studio it can -be simpler to set everything up in studio first. This is particularly -true for layout based metadata. However if you are customising metadata -it is as simple as placing, or editing, the file in the custom -directory. For example to override the Accounts detailviewdefs (found in -modules/Accounts/metadata/detailviewdefs.php) we would -place (or edit) the file in -custom/modules/Accounts/metadata/detailviewdefs.php. One -exception to this rule is the studio.php file. The modules metadata -folder is the only location checked - any version in -custom/<TheModule>/metadata/studio.php is ignored. - -### Different metadata - -#### detailviewdefs.php - -detailviewdefs.php provides information on the layout and fields of the -detail view for this module. This file uses the same structure as -editviewdefs.php. Let’s look at an example for a fictional module -ABC\_Vehicles: - -
- -Example 6.2: DetailView metadata definition - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2 $viewdefs ['ABC_Vehicles'] ['DetailView'] = array (
- 3  'templateMeta' => array (
- 4      'form' => array (
- 5          'buttons' => array (
- 6              'EDIT',
- 7              'DUPLICATE',
- 8              'DELETE',
- 9              'FIND_DUPLICATES'
-10          )
-11      ),
-12      'maxColumns' => '2',
-13      'widths' => array (
-14          array (
-15              'label' => '10',
-16              'field' => '30'
-17          ),
-18          array (
-19              'label' => '10',
-20              'field' => '30'
-21          )
-22      ),
-23      'includes' => array (
-24          array (
-25              'file' => 'modules/ABC_Vehicles/ABC_VehiclesDetail.js'
-26          )
-27      )
-28  ),
-29  'panels' => array (
-30      'LBL_ABC_VEHICLES_INFO' => array (
-31          array (
-32              array (
-33                  'name' => 'name',
-34                  'comment' => 'The Name of the Vehicle',
-35                  'label' => 'LBL_NAME',
-36              ),
-37              'reg_number'
-38          ),
-39          array (
-40              array (
-41                  'name' => 'type',
-42                  'label' => 'LBL_TYPE',
-43              ),
-44              array (
-45                  'name' => 'phone_fax',
-46                  'comment' => 'The fax phone number of this company',
-47                  'label' => 'LBL_FAX'
-48              )
-49          ),
-50          array (
-51              array (
-52                  'name' => 'registered_address_street',
-53                  'label' => 'LBL_REGISTERED_ADDRESS',
-54                  'type' => 'address',
-55                  'displayParams' => array (
-56                      'key' => 'registered'
-57                  )
-58              ),
-59          ),
-60      ),
-61      'LBL_PANEL_ADVANCED' => array (
-62       array (
-63              array (
-64                  'name' => 'assigned_user_name',
-65                  'label' => 'LBL_ASSIGNED_TO'
-66              ),
-67              array (
-68                  'name' => 'date_modified',
-69                  'label' => 'LBL_DATE_MODIFIED',
-70                  'customCode' => '{$fields.date_modified.value} '
-71                          + '{$APP.LBL_BY} '
-72                          + '{$fields.modified_by_name.value}',
-73              )
-74          ),
-75      ),
-76  )
-77 );
-78 ?>
- -
- ------------------------------------------------------------------------- - -
- -We see that line 2 defines an array -$viewdefs['ABC_Vehicles']['DetailView'] which places a DetailView entry for the module ABC_Vehicles into $viewdefs -(DetailView will be EditView or QuickCreateView as appropriate). This -array has two main keys defined here: - -#### = templateMeta \#\#\#\#= - -The templateMeta key provides information about the view in general. The -\['form'\]\['buttons'\] entries define the buttons that -should appear in this view. - -; maxColumns -: Defines the number of columns to use for this view. It is unusual - for this to be more than 2. ; widths -: An array defining the width of the label and field for each column. - ; includes -: An array of additional JavaScript files to include. This is useful - for adding custom JavaScript behaviour to the page. - -#### = panels \#\#\#\#= - -The panels entry defines the actual layout of the Detail (or Edit) view. -Each entry is a new panel in the view with the key being the label for -that panel. We can see in our example that we have 2 panels. One uses -the label defined by the language string -LBL\_ABC\_VEHICLES\_INFO, the other uses -LBL\_PANEL\_ADVANCED. - -Each panel has an array entry for each row, with each array containing -an entry for each column. For example we can see that the first row has -the following definition: - -
- -Example 6.3: DetailView metadata row definition - ------------------------------------------------------------------------- - -
- -
31 array(
-32  array (
-33      'name' => 'name',
-34      'comment' => 'The Name of the Vehicle',
-35      'label' => 'LBL_NAME',
-36  ),
-37  'reg_number',
-38 ),
- -
- ------------------------------------------------------------------------- - -
- -This has an array definition for the first row, first column and a -string definition for the first row, second column. The string -definition is very straightforward and simply displays the detail (or -edit, as appropriate) view for that field. It will use the default -label, type, etc. In our example we are displaying the field named -reg\_number. - -The array definition for the first row, first column is a little more -complex. Each array definition must have a name value. In -our example we are displaying the name field. However we -also supply some other values. Values most commonly used are: - -; comment -: Used to note the purpose of the field. ; label -: The language key for this label. If the language key is not - recognised then this value will be used instead (see the - \[\[\#chap08.xhtml\#language-chapter|chapter on language\]\]). ; - displayParams -: An array used to pass extra arguments for the field display. For the - options and how they are used you can have a look into the - appropriate field type in include/SugarFields/Fields or - custom/include/SugarFields/Fields. An example is - setting the size of a textarea: - -
- -Example 6.4: DetailView metadata displayParams - ------------------------------------------------------------------------- - -
- -
1 'displayParams' => array(
-2     'rows' => 2,
-3     'cols' => 30,
-4 ),
- -
- ------------------------------------------------------------------------- - -
- -; customCode -: Allows supplying custom smarty code to be used for the display. The - code here can include any valid smarty code and this will also have - access to the current fields in this view via - $fields. An example of outputing the ID field would be {$fields.id.value}. - Additionally the module labels and app labels can be accessed via - $MOD and $APP respectively. Finally you - can use @@FIELD@@ to output the value of the field that - would have been used. For example {if - \$someCondition}@@FIELD@@{/if} will conditionally show the - field. - -#### editviewdefs.php - -editviewdefs.php provides information on the layout and -fields of the edit view for this module. This file uses the same -structure as detailviewdefs.php. Please see the information on -detailviewdefs.php. - -#### listviewdefs.php - -The listviewdefs.php file for a module defines what fields -the list view for that module will display. Let’s take a look at an -example: - -
- -Example 6.5: ListView metadata definition - ------------------------------------------------------------------------- - -
- -
 1 $listViewDefs ['AOR_Reports'] =
- 2 array (
- 3   'NAME' =>
- 4   array (
- 5     'width' => '15%',
- 6     'label' => 'LBL_NAME',
- 7     'default' => true,
- 8     'link' => true,
- 9   ),
-10   'REPORT_MODULE' =>
-11   array (
-12     'type' => 'enum',
-13     'default' => true,
-14     'studio' => 'visible',
-15     'label' => 'LBL_REPORT_MODULE',
-16     'width' => '15%',
-17   ),
-18   'ASSIGNED_USER_NAME' =>
-19   array (
-20     'width' => '15%',
-21     'label' => 'LBL_ASSIGNED_TO_NAME',
-22     'module' => 'Employees',
-23     'id' => 'ASSIGNED_USER_ID',
-24     'default' => true,
-25   ),
-26   'DATE_ENTERED' =>
-27   array (
-28     'type' => 'datetime',
-29     'label' => 'LBL_DATE_ENTERED',
-30     'width' => '15%',
-31     'default' => true,
-32   ),
-33   'DATE_MODIFIED' =>
-34   array (
-35     'type' => 'datetime',
-36     'label' => 'LBL_DATE_MODIFIED',
-37     'width' => '15%',
-38     'default' => true,
-39   ),
-40 );
- -
- ------------------------------------------------------------------------- - -
- -To define the list view defs we simply add a key to the -\$listViewDefs array. In this case we add an entry for -AOR\_Reports This array contains an entry for each field -that we wish to show in the list view and is keyed by the upper case -name of the field. For example, the REPORT\_MODULE key -refers to the report\_module field of AOR\_Reports. - -; type -: The type of the field. This can be used to override how a field is - displayed. ; default -: Whether this field should be shown in the list view by default. If - false then the field will appear in the available columns list in - studio. ; studio -: Whether or not this field should be displayed in studio. This can be - useful to ensure that a critical field is not removed. ; label -: The label to be used for this field. If this is not supplied then - the default label for that field will be used. ; width -: The width of the field in the list view. Note that, although this is - usually given as a percentage it is treated as a proportion. The - example above has five columns with a width of 15% but - these will actually be 20% since this is a ratio. - -#### popupdefs.php - -popupdefs.php provides information on the layout, fields and search -options of the module popup that is usually used when selecting a -related record. - -Let’s look at the default popupdefs.php for the Accounts module: - -
- -Example 6.6: PopupView metadata definition - ------------------------------------------------------------------------- - -
- -
 1 $popupMeta = array(
- 2  'moduleMain' => 'Case',
- 3  'varName' => 'CASE',
- 4  'className' => 'aCase',
- 5  'orderBy' => 'name',
- 6  'whereClauses' =>
- 7      array('name' => 'cases.name',
- 8              'case_number' => 'cases.case_number',
- 9              'account_name' => 'accounts.name'),
-10  'listviewdefs' => array(
-11      'CASE_NUMBER' => array(
-12          'width' => '5',
-13          'label' => 'LBL_LIST_NUMBER',
-14          'default' => true),
-15      'NAME' => array(
-16          'width' => '35',
-17          'label' => 'LBL_LIST_SUBJECT',
-18          'link' => true,
-19          'default' => true),
-20      'ACCOUNT_NAME' => array(
-21          'width' => '25',
-22          'label' => 'LBL_LIST_ACCOUNT_NAME',
-23          'module' => 'Accounts',
-24          'id' => 'ACCOUNT_ID',
-25          'link' => true,
-26          'default' => true,
-27          'ACLTag' => 'ACCOUNT',
-28          'related_fields' => array('account_id')),
-29      'PRIORITY' => array(
-30          'width' => '8',
-31          'label' => 'LBL_LIST_PRIORITY',
-32          'default' => true),
-33      'STATUS' => array(
-34          'width' => '8',
-35          'label' => 'LBL_LIST_STATUS',
-36          'default' => true),
-37      'ASSIGNED_USER_NAME' => array(
-38          'width' => '2',
-39          'label' => 'LBL_LIST_ASSIGNED_USER',
-40          'default' => true,
-41         ),
-42      ),
-43  'searchdefs'   => array(
-44      'case_number',
-45      'name',
-46      array(
-47          'name' => 'account_name',
-48          'displayParams' => array(
-49              'hideButtons'=>'true',
-50              'size'=>30,
-51              'class'=>'sqsEnabled sqsNoAutofill'
-52          )
-53      ),
-54      'priority',
-55      'status',
-56      array(
-57          'name' => 'assigned_user_id',
-58          'type' => 'enum',
-59          'label' => 'LBL_ASSIGNED_TO',
-60          'function' => array(
-61              'name' => 'get_user_array',
-62              'params' => array(false))
-63          ),
-64    )
-65 );
- -
- ------------------------------------------------------------------------- - -
- -The popupdefs.php specifies a \$popupMeta array with the -following keys: - -; moduleMain -: The module that will be displayed by this popup. ; - varName -: The variable name used to store the search preferences etc. This - will usually simply the upper case module name. ; - className -: The class name of the SugarBean for this module. If this is not - supplied then moduleMain will be used. This is only - really required for classes where the class name and module name - differ (such as Cases). ; orderBy -: The default field the list of records will be sorted by. ; - whereClauses -: Legacy option. This is only used as a fallback when there are no - searchdefs. Defines the names of fields to allow searching for and - their database representation. ; listviewdefs -: The list of fields displayed in the popup list view. See - listviewdefs.php. ; searchdefs -: An array of the fields that should be available for searching in the - popup. See the individual search defs in the searchdefs.php section - (for example the basic\_search array). - -#### quickcreatedefs.php - -quickcreatedefs.php provides information on the layout and -fields of the quick create view for this module (this is the view that -appears when creating a record from a subpanel). This file uses the same -structure as detailviewdefs.php. Please see the information -on detailviewdefs.php. - -#### searchdefs.php - -The search defs of a module define how searching in that module looks -and behaves. - -Let’s look at an example. - -
- -Example 6.7: Search View metadata definition - ------------------------------------------------------------------------- - -
- -
  1 $searchdefs ['Accounts'] = array (
-  2     'templateMeta' => array (
-  3         'maxColumns' => '3',
-  4         'maxColumnsBasic' => '4',
-  5         'widths' => array (
-  6             'label' => '10',
-  7             'field' => '30'
-  8         )
-  9     ),
- 10     'layout' => array (
- 11         'basic_search' => array (
- 12             'name' => array (
- 13                 'name' => 'name',
- 14                 'default' => true,
- 15                 'width' => '10%'
- 16             ),
- 17             'current_user_only' => array (
- 18                 'name' => 'current_user_only',
- 19                 'label' => 'LBL_CURRENT_USER_FILTER',
- 20                 'type' => 'bool',
- 21                 'default' => true,
- 22                 'width' => '10%'
- 23             )
- 24         )
- 25         ,
- 26         'advanced_search' => array (
- 27             'name' => array (
- 28                 'name' => 'name',
- 29                 'default' => true,
- 30                 'width' => '10%'
- 31             ),
- 32             'website' => array (
- 33                 'name' => 'website',
- 34                 'default' => true,
- 35                 'width' => '10%'
- 36             ),
- 37             'phone' => array (
- 38                 'name' => 'phone',
- 39                 'label' => 'LBL_ANY_PHONE',
- 40                 'type' => 'name',
- 41                 'default' => true,
- 42                 'width' => '10%'
- 43             ),
- 44             'email' => array (
- 45                 'name' => 'email',
- 46                 'label' => 'LBL_ANY_EMAIL',
- 47                 'type' => 'name',
- 48                 'default' => true,
- 49                 'width' => '10%'
- 50             ),
- 51             'address_street' => array (
- 52                 'name' => 'address_street',
- 53                 'label' => 'LBL_ANY_ADDRESS',
- 54                 'type' => 'name',
- 55                 'default' => true,
- 56                 'width' => '10%'
- 57             ),
- 58             'address_city' => array (
- 59                 'name' => 'address_city',
- 60                 'label' => 'LBL_CITY',
- 61                 'type' => 'name',
- 62                 'default' => true,
- 63                 'width' => '10%'
- 64             ),
- 65             'address_state' => array (
- 66                 'name' => 'address_state',
- 67                 'label' => 'LBL_STATE',
- 68                 'type' => 'name',
- 69                 'default' => true,
- 70                 'width' => '10%'
- 71             ),
- 72             'address_postalcode' => array (
- 73                 'name' => 'address_postalcode',
- 74                 'label' => 'LBL_POSTAL_CODE',
- 75                 'type' => 'name',
- 76                 'default' => true,
- 77                 'width' => '10%'
- 78             ),
- 79             'billing_address_country' => array (
- 80                 'name' => 'billing_address_country',
- 81                 'label' => 'LBL_COUNTRY',
- 82                 'type' => 'name',
- 83                 'options' => 'countries_dom',
- 84                 'default' => true,
- 85                 'width' => '10%'
- 86             ),
- 87             'account_type' => array (
- 88                 'name' => 'account_type',
- 89                 'default' => true,
- 90                 'width' => '10%'
- 91             ),
- 92             'industry' => array (
- 93                 'name' => 'industry',
- 94                 'default' => true,
- 95                 'width' => '10%'
- 96             ),
- 97             'assigned_user_id' => array (
- 98                 'name' => 'assigned_user_id',
- 99                 'type' => 'enum',
-100                 'label' => 'LBL_ASSIGNED_TO',
-101                 'function' => array (
-102                     'name' => 'get_user_array',
-103                     'params' => array (
-104                             0 => false
-105                     )
-106                 ),
-107                 'default' => true,
-108                 'width' => '10%'
-109             )
-110         )
-111     )
-112 );
- -
- ------------------------------------------------------------------------- - -
- -Here we setup a new array for Accounts in the -\$searchdefs array. This has two keys: - -#### = templateMeta \#\#\#\#= - -The templateMeta key controls the basic look of the search -forms. Here we define some overall layout info such as the maximum -columns (3) and the maximum number of columns for the basic search (4). -Finally we set the widths for the search fields and their labels. - -#### = layout \#\#\#\#= - -The layout key contains the layout definitions for the -basic search and advanced search. This is simply a list of array -definition of the fields. See the section on listviewdefs.php for a -description of some of the options. - -#### subpaneldefs.php - -The subpaneldefs.php file provides definitions for the subpanels that -appear in the detail view of a module. Let’s look at an example: - -
- -Example 6.8: Subpanel metadata definition - ------------------------------------------------------------------------- - -
- -
 1 $layout_defs['AOS_Quotes'] = array (
- 2  'subpanel_setup' => array (
- 3      'aos_quotes_aos_contracts' => array (
- 4          'order' => 100,
- 5          'module' => 'AOS_Contracts',
- 6          'subpanel_name' => 'default',
- 7          'sort_order' => 'asc',
- 8          'sort_by' => 'id',
- 9          'title_key' => 'AOS_Contracts',
-10          'get_subpanel_data' => 'aos_quotes_aos_contracts',
-11          'top_buttons' => array (
-12              0 => array (
-13                  'widget_class' => 'SubPanelTopCreateButton'
-14              ),
-15              1 => array (
-16                  'widget_class' => 'SubPanelTopSelectButton',
-17                  'popup_module' => 'AOS_Contracts',
-18                  'mode' => 'MultiSelect'
-19              )
-20          )
-21      ),
-22      'aos_quotes_aos_invoices' => array (
-23          'order' => 100,
-24          'module' => 'AOS_Invoices',
-25          'subpanel_name' => 'default',
-26          'sort_order' => 'asc',
-27          'sort_by' => 'id',
-28          'title_key' => 'AOS_Invoices',
-29          'get_subpanel_data' => 'aos_quotes_aos_invoices',
-30          'top_buttons' => array (
-31              0 => array (
-32                  'widget_class' => 'SubPanelTopCreateButton'
-33              ),
-34              1 => array (
-35                  'widget_class' => 'SubPanelTopSelectButton',
-36                  'popup_module' => 'AOS_Invoices',
-37                  'mode' => 'MultiSelect'
-38              )
-39          )
-40      ),
-41      'aos_quotes_project' => array (
-42          'order' => 100,
-43          'module' => 'Project',
-44          'subpanel_name' => 'default',
-45          'sort_order' => 'asc',
-46          'sort_by' => 'id',
-47          'title_key' => 'Project',
-48          'get_subpanel_data' => 'aos_quotes_project',
-49          'top_buttons' => array (
-50              0 => array (
-51                  'widget_class' => 'SubPanelTopCreateButton'
-52              ),
-53              1 => array (
-54                  'widget_class' => 'SubPanelTopSelectButton',
-55                  'popup_module' => 'Accounts',
-56                  'mode' => 'MultiSelect'
-57              )
-58          )
-59      )
-60  )
-61 );
- -
- ------------------------------------------------------------------------- - -
- -In the example above we set up a definition for a module (in this case -AOS\_Quotes) in the \$layout\_defs array. This -has a single key subpanel\_setup which is an array of each -of the subpanel definitions keyed by a name. This name should be -something recognisable. In the case above it is the name of the link -field displayed by the subpanel. The entry for each subpanel usually has -the following defined: - -; order -: A number used for sorting the subpanels. The values themselves are - arbitrary and are only used relative to other subpanels. ; module -: The module which will be displayed by this subpanel. For example the - aos\_quotes\_project def in the example above will - display a list of Project records. ; subpanel\_name -: The subpanel from the displayed module which will be used. See the - subpanels section of this chapter. ; sort\_by -: The field to sort the records on. ; sort\_order -: The order in which to sort the sort\_by field. - asc for ascending desc for descending. ; - title\_key -: The language key to be used for the label of this subpanel. ; - get\_subpanel\_data -: Used to specify where to retrieve the subpanel records. Usually this - is just a link name for the current module. In this case the related - records will be displayed in the subpanel. However, for more complex - links, it is possible to specify a function to call. When specifying - a function you should ensure that the - get\_subpanel\_data entry is in the form - function:theFunctionName. Additionally you can specify - the location of the function and any additional parameters that are - needed by using the function\_parameters key. An - example of a subpanel which uses a function can be found in - \[\[\#chap19.xhtml\#appendix-a|Appendix A\]\]. ; - function\_parameters -: Specifies the parameters for a subpanel which gets it’s information - from a function (see
get\_subpanel\_data). This - is an array which allows specifying where the function is by using - the import\_function\_file key (if this is absent but - get\_subpanel\_data defines a function then the - function will be called on the bean for the parent of the subpanel). - Additionally this array will be passed as an argument to the - function defined in get\_subpanel\_data which allows - passing in arguments to the function. ; generate\_select -: For function subpanels (see get\_subpanel\_data) - whether or not the function will return an array representing the - query to be used (for generate\_select = true) or - whether it will simply return the query to be used as a string. ; - get\_distinct\_data -: Whether or not to only return distinct rows. Relationships do not - allow linking two records more than once therefore this only really - applies if the subpanel source is a function. See
- get\_subpanel\_data for information on function - subpanel sources. ; top\_buttons -: Allows defining the buttons to appear on the subpanel. This is - simply an array of the button definitions. These definitions have, - at least, the widget\_class defined which decides the - button class to use in include/generic/SugarWidgets. - Depending on the button this array may also be used to pass in extra - arguments to the widget class. - -#### subpanels - -Inside the metadata folder is the subpanels folder. This -allows creating different subpanel layouts for different parent modules. -For example, the Contacts module will display differently in the -subpanel on an account than it will in the subpanel of a case. The files -inside the subpanels folder can be named anything. All that -matters is that it can be referenced in the subpanel\_name -of the subpaneldefs.php of the parent module. The usual -subpanel file is simply called default.php. Let’s look at -the modules/Accounts/metadata/subpanels/default.php file: - -
- -Example 6.8: Module Subpanels definition - ------------------------------------------------------------------------- - -
- -
 1 $subpanel_layout = array(
- 2  'top_buttons' => array(
- 3      array(
- 4          'widget_class' => 'SubPanelTopCreateButton'
- 5      ),
- 6      array(
- 7          'widget_class' => 'SubPanelTopSelectButton',
- 8          'popup_module' => 'Accounts'
- 9      ),
-10  ),
-11  'where' => '',
-12  'list_fields' => array (
-13    'name' =>
-14    array (
-15     'vname' => 'LBL_LIST_ACCOUNT_NAME',
-16     'widget_class' => 'SubPanelDetailViewLink',
-17     'width' => '45%',
-18     'default' => true,
-19    ),
-20    'billing_address_city' =>
-21    array (
-22      'vname' => 'LBL_LIST_CITY',
-23      'width' => '20%',
-24      'default' => true,
-25    ),
-26    'billing_address_country' =>
-27    array (
-28      'type' => 'varchar',
-29      'vname' => 'LBL_BILLING_ADDRESS_COUNTRY',
-30      'width' => '7%',
-31      'default' => true,
-32    ),
-33    'phone_office' =>
-34    array (
-35      'vname' => 'LBL_LIST_PHONE',
-36      'width' => '20%',
-37      'default' => true,
-38    ),
-39    'edit_button' =>
-40    array (
-41      'vname' => 'LBL_EDIT_BUTTON',
-42      'widget_class' => 'SubPanelEditButton',
-43      'width' => '4%',
-44      'default' => true,
-45    ),
-46    'remove_button' =>
-47    array (
-48      'vname' => 'LBL_REMOVE',
-49      'widget_class' => 'SubPanelRemoveButtonAccount',
-50      'width' => '4%',
-51      'default' => true,
-52    ),
-53    )
-54 );
- -
- ------------------------------------------------------------------------- - -
- -There are three keys in the \$subpanel\_layout variable for -this subpanel. These are: - -; top\_buttons -: Defines the buttons that will appear at the top of the subpanel. See - the top\_buttons key in subpaneldefs.php. - ; where -: Allows the addition of conditions to the where clause. - For example this could be used to exclude Cases that are closed - (cases.state != "Closed") or only include Accounts of a - specific industry (accounts.industry = "Media"). Note - that in these examples we specify the table to remove any ambiguity - in the query. ; list\_fields -: Defines the list of fields to be displayed in this subpanel. See the - section on listviewdefs.php for more information. - -#### studio.php - -studio.php is the simplest file in metadata and it’s existence is simply -used to confirm if a module should be shown in studio for user tweaking. -Note that, unlike other metadata files, the file in -modules/<TheModule>/metadata/studio.php will be the -only one checked. A file in -custom/modules/<TheModule>/metadata/studio.php will -have no effect. - - diff --git a/_source/developer-old/chap07.md b/_source/developer-old/chap07.md deleted file mode 100644 index aa643de61..000000000 --- a/_source/developer-old/chap07.md +++ /dev/null @@ -1,177 +0,0 @@ ---- -title: Controllers -weight: 7 ---- - -SuiteCRM follows the MVC (Model-View-Controller) pattern and as such has -the concept of controllers. The controller is responsible for making -changes to the Model as well as passing control to the view as -appropriate. SuiteCRM has the concept of actions which are actions that -will be taken by the controller. Let’s take a look at a SuiteCRM URL: - -
- -Example 7.1: Example SuiteCRM URL - ------------------------------------------------------------------------- - -
- -
example.com/index.php?module=Accounts&action=index
- -
- ------------------------------------------------------------------------- - -
- -In this (rather boring) example we see that the module is Accounts. This -will determine which controller to use and then call the index action on -that controller. - -SuiteCRM will first look for the controller in -custom/module/<TheModule>/controller.php. If this is -not found then next module/<TheModule>/controller.php -will be checked. Finally if neither of these controllers exist then the -default controller will be used. The default controller can be found in -include/MVC/Controller/SugarController.php. - -### Customising controllers - -Ordinarily the default controller handles the request and delegates to -the appropriate views etc. However custom controllers can be used to add -or alter functionality. Let’s look at adding a new action. - -In the first instance we will have to add our custom controller. This -will vary slightly depending on the nature of the module. - -#### Custom module - -In this case we can place the file directly into our module. You should -create a new file (if it doesn’t exist) at -modules/<TheModule>/controller.php. The contents will -look similar to: - -
- -Example 7.2: Creating a custom controller for a custom module - ------------------------------------------------------------------------- - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 class <TheModule>Controller extends SugarController
-4 {
-5
-6 }
- -
- ------------------------------------------------------------------------- - -
- -#### Pre-existing modules - -For pre-existing modules you should add the controller to
-custom/modules/<TheModule>/controller.php. - -The contents of this file will vary depending on whether you wish to -extend the existing controller (if it exists) or create your own version -completely. It is usually best to extend the existing controller since -this will retain important logic. You should note the naming convention -here. We name the class
-Custom<TheModule>Controller. - -Here we don’t extend the existing controller or no such controller -exists: - -
- -Example 7.3: Creating a custom controller for an existing module - ------------------------------------------------------------------------- - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 class Custom<TheModule>Controller extends SugarController
-4 {
-5
-6 }
- -
- ------------------------------------------------------------------------- - -
- -Alternatively we extend the existing controller. Note that we are -requiring the existing controller: - -
- -Example 7.4: Creating a custom controller for an existing module with an -existing controller - ------------------------------------------------------------------------- - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3
-4 require_once 'modules/<TheModule>/controller.php';
-5
-6 class Custom<TheModule>Controller extends <TheModule>Controller
-7 {
-8
-9 }
- -
- ------------------------------------------------------------------------- - -
- -#### Adding the action - -Now we can add a new action to our controller. Actions are created as -methods on the controller with the name -action\_<actionName>. For example, to create a new -action called ‘echo’ we could create the following method in one of the -controllers we have created above. This can then perform whatever logic -that is needed. In our example we will log the REQUEST and simply -redirect: - -
- -Example 7.5: Adding a custom controller action method - ------------------------------------------------------------------------- - -
- -
1 public function action_echo(){
-2   $GLOBALS['log']->debug("Echo called with request: ".print_r($_REQUEST,1));
-3   SugarApplication::redirect('index.php');
-4 }
- -
- ------------------------------------------------------------------------- - -
- -#### Legacy Style - -In previous versions of SugarCRM a new action was added by creating a -file in either -modules/<TheModule>/<actionname>.php or -custom/modules/<TheModule>/<actionname>.php. -Although this still works it is not recommended. - - diff --git a/_source/developer-old/chap08.md b/_source/developer-old/chap08.md deleted file mode 100644 index dfba73312..000000000 --- a/_source/developer-old/chap08.md +++ /dev/null @@ -1,143 +0,0 @@ ---- -title: Entry Points -weight: 8 ---- - -Entry points are simply a page which provides access to SuiteCRM. These -can be used for a variety of purposes such as allowing an external form -simple access to SuiteCRM or, as is the case with the stock Events -module, allowing an event invite to be responded to by clicking a link -in an email. - -### Creating an entry point - -Let’s create a simple entry point to display the time. First we define -this entry point in a new file in: - -
- -Example 8.1: Entry point registry location - ------------------------------------------------------------------------- - -
- -
custom/Extension/application/Ext/EntryPointRegistry/
- -
- ------------------------------------------------------------------------- - -
- -For our example we’ll call our new file MyTimeEntryPoint.php - -
- -Example 8.2: Example entry point location - ------------------------------------------------------------------------- - -
- -
custom/Extension/application/Ext/EntryPointRegistry/MyTimeEntryPoint.php
- -
- ------------------------------------------------------------------------- - -
- -In this file we will add a new entry to the -\$entry\_point\_registry. We supply the file that should be -called. Here we are simply placing the file in custom if the entry point -is related to a specific module it is usually a good idea to place this -somewhere inside custom/<TheModule>/. - -In addition we supply an “auth” parameter. If “auth” is true then anyone -accessing the entry point will need to be logged into SuiteCRM. - -
- -Example 8.3: Adding an entry point entry - ------------------------------------------------------------------------- - -
- -
1 <?php
-2   $entry_point_registry['MyTimeEntryPoint'] = array(
-3       'file' => 'custom/MyTimeEntryPoint.php',
-4       'auth' => true,
-5   );
- -
- ------------------------------------------------------------------------- - -
- -Finally we add the actual logic itself inside -custom/MyTimeEntryPoint.php: - -
- -Example 8.4: Example entry point that outputs the current time - ------------------------------------------------------------------------- - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 $date = new DateTime();
-4 echo $date->format('r');
- -
- ------------------------------------------------------------------------- - -
- -After a Quick Repair and Rebuild we can access our entry point: - -
- -Example 8.5: Custom entry point URL - ------------------------------------------------------------------------- - -
- -
example.com/index.php?entryPoint=MyTimeEntryPoint
- -
- ------------------------------------------------------------------------- - -
- -and we should see something similar to: - -
- -Example 8.6: MyTimeEntryPoint - ------------------------------------------------------------------------- - -
- -
Sun, 15 Mar 2015 13:03:03 +0000
- -
- ------------------------------------------------------------------------- - -
- -Obviously this is a contrived example but any logic that can be -performed elsewhere in SuiteCRM can be performed in an entry poiny (for -example creating or editing -\[\[\#chap02.xhtml\#working-with-beans-chapter|SugarBeans\]\]). - - diff --git a/_source/developer-old/chap09.md b/_source/developer-old/chap09.md deleted file mode 100644 index cd6233745..000000000 --- a/_source/developer-old/chap09.md +++ /dev/null @@ -1,348 +0,0 @@ ---- -title: Language Strings -weight: 9 ---- - -Language strings provide an element of internationalisation to SuiteCRM. -It allows specifying different strings to be used in different languages -making it much easier to provide translations for modules and -customisations. Even if you are only targeting a single language it is -still worth using the language string functionality in SuiteCRM because -it allows the simple changing of strings within SuiteCRM and it also -allows users to customise the labels used in your customisations. There -are three main types of language strings that we will cover here. - -At the core, the language strings are a key value store. The keys are -used throughout SuiteCRM and the values are loaded based on the current -language. - -Languages are handled in SuiteCRM by prefixing the file name with the -IETF language code for the language that this file contains. Here are -some examples of different language file names: - -
- -Example 9.1: Example language file names - ------------------------------------------------------------------------- - -
- -
# Core Accounts language file for en_us (United States English)
-modules/Accounts/language/en_us.lang.php
-
-# Core Cases language file for es_es (Spanish as spoken in Spain)
-modules/Cases/language/es_es.lang.php
-
-# Custom language file for de_de (German)
-custom/Extension/application/Ext/Language/de_de.SomeCustomPackage.php
- -
- ------------------------------------------------------------------------- - -
- -SuiteCRM will choose the language prefix to be used based on the -language the user selected when logging in or the default language if -none was selected. Generally when a language file is loaded the default -language files and the en\_us files will also be loaded. -These files are then merged. This ensures that there will still be a -definition if there are language keys in either en\_us or -the default language that don’t have definitions in the current -language. In essence the language “falls back” to the default language -and en\_us if there are missing keys. - -### Module Strings - -#### Use - -Module strings are strings associated with a particular module. These -are usually, for example, field labels and panel name labels, but they -may be used for anything that is specific to a single module. - -#### Definition location - -Module strings are defined in the \$mod\_strings array. -This is initially defined in
-modules/<TheModule>/language/<LanguageTag>.lang.php, -for example
-modules/Accounts/language/en\_us.lang.php. - -#### Customisation location - -Customisations can be made to the module strings by adding a new file -in
-custom/Extension/modules/<TheModule>/Ext/Language/<LanguageTag>.<Name>.php -(<Name> in this case should be used to give it a -descriptive name). An example is -custom/Extension/modules/Accounts/Ext/Language/en\_us.MyLanguageFile.php. -See the Extensions section for more information on the Extensions -folder. - -### Application Strings - -#### Use - -Application strings are used for language strings and labels that are -not specific to a single module. Examples of these may include labels -that will appear in the headers or footers, labels that appear on search -buttons throughout SuiteCRM or labels for pagination controls. - -#### Definition location - -The application strings are defined in the \$app\_strings -array. This is initially defined in
-include/language/<LanguageTag>.lang.php. - -#### Customisation location - -Customisations can be made to the application strings in two ways. -Firstly you can edit the file
-custom/include/language/<LanguageTag>.lang.php. -However to promote modularity it is recommended that you add a new file -in the location
-custom/Extension/application/Ext/Language/<LanguageTag>.<Name>.php. -For example
-custom/Extension/application/Ext/Language/es\_es.MyAppLanguageFile.php. -<Name> should be used to give the file a descriptive -name. See the Extensions section for more information on the Extensions -folder. - -### Application List Strings - -#### Use - -Application list strings are used to store the various dropdowns and -lists used in SuiteCRM. Most of these are used as options for the -various enum fields in SuiteCRM e.g the account type or the opportunity -sales stage. - -#### Definition location - -The application list strings are defined in the -$app_list_strings array. Similar to the $app\_strings -array this is initially defined in -include/language/en\_us.lang.php. - -#### Customisation location - -Customisations can be made to the application list strings in two ways. -Firstly you can edit the file
-custom/include/language/<LanguageTag>.lang.php. -However to promote modularity it is recommended that you add a new file -in the location
-custom/Extension/application/Ext/Language/<LanguageTag>.<Name>.php -(<Name> should be used to give the file a descriptive -name). For example
-custom/Extension/application/Ext/Language/es\_es.MyAppListLanguageFile.php. -See the Extensions section for more information on the Extensions -folder. - -### Why and when to customise - -Generally language strings should be changed from within SuiteCRM using -the studio tool. However there are times when it can be simpler to add -or modify language strings as described in the previous section. If you -are importing a large number of language strings or dropdown options it -can be simpler to create a new file to add these values. Similarly if -you are adding entirely new functionality, it is usually best to simply -add these language strings as new values. - -### Usage - -Language strings are used automatically throughout SuiteCRM. For example -in metadata you can specify the language strings to display for fields. -However in some cases you will want to access and use the language -strings in custom code. There are several ways to do this. - -#### Globals - -The $mod_strings, $app\_strings and -$app_list_strings variables are all global and can be accessed as such. $app\_strings -and -$app_list_strings will always be available. However $mod\_strings -will only contain the strings for the current module (see the next -section for other ways of accessing \$mod\_strings). - -
- -Example 9.2: Accessing language strings globally - ------------------------------------------------------------------------- - -
- -
 1 function someFunction(){
- 2     global $mod_strings, $app_strings, $app_list_strings;
- 3     /*
- 4      * Grab the label LBL_NAME for the current module
- 5      * In most modules this will be the label for the
- 6      * name field of the module.
- 7      */
- 8     $modLabel = $mod_strings['LBL_NAME'];
- 9
-10     $appLabel = $app_strings['LBL_GENERATE_LETTER'];
-11
-12     /*
-13      * Unlike the previous two examples $appListLabel will be an
-14      * array of the dropdowns keys to it's display labels.
-15      */
-16     $appListLabel = $app_list_strings['aos_quotes_type_dom'];
-17
-18     //Here we just log out the strings
-19     $GLOBALS['log']->debug("The module label is $modLabel");
-20     $GLOBALS['log']->debug("The app label is $appLabel");
-21     $GLOBALS['log']->debug("The app list label is ".print_r($appListLabel,1));
-22 }
- -
- ------------------------------------------------------------------------- - -
- -#### Translate - -As an alternative to using globals or, if you are in a different module -than the language string you wish to retrieve you can use the -translate method. - -
- -Example 9.3: translate method signature - ------------------------------------------------------------------------- - -
- -
1 translate(
-2         $string,
-3         $mod='',
-4         $selectedValue='')
- -
- ------------------------------------------------------------------------- - -
- -; \$string -: The language string to be translated. ; \$mod -: The module this string should come from. Defaults to the current - module if empty. ; \$selectedValue -: For dropdown strings. This will return the label for the key - \$selectedValue - -Here is an example of the above in action. Note that we do not have to -worry about whether the label is a Module string, an Application string -or an Application list string, as all of these will be checked (in that -order - the first matching value will be returned). - -
- -Example 9.4: Example translate method calls - ------------------------------------------------------------------------- - -
- -
 1 function someFunction(){
- 2   //Grab the label LBL_NAME for the current module
- 3   $modLabel = translate('LBL_NAME');
- 4
- 5   //Grab the label LBL_NAME for the AOS_Products module
- 6   $productModLabel = translate('LBL_NAME','AOS_Products');
- 7
- 8   $appLabel = translate('LBL_GENERATE_LETTER');
- 9
-10   /*
-11    * Return the label for the `Other` option of the `aos_quotes_type_dom`
-12    * We don't care about the module so this is left blank.
-13    */
-14   $appListLabel = translate('aos_quotes_type_dom','','Other');
-15
-16   //Here we just log out the strings
-17   $GLOBALS['log']->debug("The module label is $modLabel");
-18   $GLOBALS['log']->debug("The module label for Products is $productModLabel");
-19   $GLOBALS['log']->debug("The app label is $appLabel");
-20   $GLOBALS['log']->debug("The app list label is ".print_r($appListLabel,1));
-21 }
- -
- ------------------------------------------------------------------------- - -
- -#### JavaScript - -Finally, you may be using JavaScript (for example in a view), and wish -to display a language string. For this you can use the -SUGAR.language.get method, which is similar to the -translate method in example 9.3. - -
- -Example 9.5: SUGAR.language.get method signature - ------------------------------------------------------------------------- - -
- -
1 SUGAR.language.get(
-2               module,
-3               str
-4 );
- -
- ------------------------------------------------------------------------- - -
- -; module -: The module a language string will be returned for. You should supply - app\_strings or
app\_list\_strings - if the label you wish to retrieve is not a module string. ; str -: The key you want to retrieve a label for. - -
- -Example 9.6: Example SUGAR.language.get method calls - ------------------------------------------------------------------------- - -
- -
 1 function someFunction(){
- 2
- 3   /*
- 4    * Grab the label LBL_NAME for AOS_Products
- 5    * Note that, unlike the translate function in example 9.3
- 6    * the module name is required.
- 7    */
- 8
- 9   var modLabel = SUGAR.language.get('AOS_Products', 'LBL_NAME');
-10
-11   /*
-12    * As mentioned above we explicitly need to pass if we are retrieving
-13    * an app_string or app_list_string
-14    */
-15   var appLabel = SUGAR.language.get('app_strings', 'LBL_GENERATE_LETTER');
-16   var appListLabel = SUGAR.language.get('app_list_strings',
-17                                         'aos_quotes_type_dom');
-18
-19   //Here we just log out the strings
-20   console.log("The module label is "+modLabel);
-21   console.log("The app label is "+appLabel);
-22   console.log("The app list label is "+appListLabel);
-23 }
- -
- ------------------------------------------------------------------------- - -
- - diff --git a/_source/developer-old/chap10.md b/_source/developer-old/chap10.md deleted file mode 100644 index e30dfbbf3..000000000 --- a/_source/developer-old/chap10.md +++ /dev/null @@ -1,158 +0,0 @@ ---- -title: Config -weight: 10 ---- - -### The config files - -There are two main config files in SuiteCRM, both of which are in the -root SuiteCRM folder. These are config.php and -config\_override.php. The definitions in here provide -various configuration options for SuiteCRM. All the way from the details -used to access the database to how many entries to show per page in the -list view. Most of these options are accessible from the SuiteCRM -administration page. However some are only definable in the config -files. - -#### config.php - -This is the main SuiteCRM config file and includes important information -like the database settings and the current SuiteCRM version. - -Generally settings in this file wont be changed by hand. An exception to -this is if SuiteCRM has been moved or migrated. In which case you may -need to change the database settings and the site\_url. Let’s look at -the database settings first: - -
- -Example 10.1: Database config definition - ------------------------------------------------------------------------- - -
- -
 1 'dbconfig' =>
- 2 array (
- 3   'db_host_name' => 'localhost',
- 4   'db_host_instance' => 'SQLEXPRESS',
- 5   'db_user_name' => 'dbuser',
- 6   'db_password' => 'dbpass',
- 7   'db_name' => 'dbname',
- 8   'db_type' => 'mysql',
- 9   'db_port' => '',
-10   'db_manager' => 'MysqliManager',
-11 ),
- -
- ------------------------------------------------------------------------- - -
- -Here we can see this instance is setup to access a local MySQL instance -using the username/password dbuser/dbpass and accessing the database -named ‘dbname’. - -The site url settings are even simpler: - -
- -Example 10.2: Setting the site URL - ------------------------------------------------------------------------- - -
- -
  'site_url' => 'http://example.com/suitecrm',
- -
- ------------------------------------------------------------------------- - -
- -The site url for the above is simply ‘http://example.com/suitecrm’ if we -were moving this instance to, for example, suite.example.org, then we -can simply place that value in the file. - -These are generally the only two instances where you would directly -change config.php. For other changes you would either make -the change through SuiteCRM itself or you would use the
-config\_override.php file. - -#### config\_override.php - -config\_override.php allows you to make config changes -without risking breaking the main config file. This is achieved quite -simply by adding, editing or removing items from the \$sugar\_config -variable. The config\_override.php file will be merged with -the existing config allowing, as the name suggests, overriding the -config. For example in config\_override.php we can add our own, new, -config item: - -
- -Example 10.3: Adding a custom config value - ------------------------------------------------------------------------- - -
- -
$sugar_config['enable_the_awesome'] = true;
- -
- ------------------------------------------------------------------------- - -
- -or we can edit an existing config option in a very similar manner by -simply overwriting it: - -
- -Example 10.4: Overwriting an existing config value - ------------------------------------------------------------------------- - -
- -
$sugar_config['logger']['level'] = 'debug';
- -
- ------------------------------------------------------------------------- - -
- -### Using config options - -We may want to access config options in custom code (or as detailed -above if we have created our own config setting we may want to use -that). We can easily get the config using the php global keyword: - -
- -Example 10.5: Accessing a config setting within SuiteCRM - ------------------------------------------------------------------------- - -
- -
1 function myCustomLogic(){
-2   //Get access to config
-3   global $sugar_config;
-4   //use the config values
-5   if(!empty($sugar_config['enable_the_awesome'])){
-6     doTheAwesome();
-7   }
-8 }
- -
- ------------------------------------------------------------------------- - -
- - diff --git a/_source/developer-old/chap11.md b/_source/developer-old/chap11.md deleted file mode 100644 index 1ccec2469..000000000 --- a/_source/developer-old/chap11.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: Logging -weight: 11 ---- - - -### Logging messages - -Logging in SuiteCRM is achieved by accessing the log global. Accessing -an instance of the logger is as simple as - -
- -Example 11.1: Accessing the log - ------------------------------------------------------------------------- - -
- -
$GLOBALS['log']
- -
- ------------------------------------------------------------------------- - -
- -This can then be used to log a message. Each log level is available as a -method. For example: - -
- -Example 11.2: Logging messages - ------------------------------------------------------------------------- - -
- -
1 $GLOBALS['log']->debug('This is a debug message');
-2 $GLOBALS['log']->error('This is an error message');
- -
- ------------------------------------------------------------------------- - -
- -This will produce the following output: - -
- -Example 11.3: Logging messages example output - ------------------------------------------------------------------------- - -
- -
1 Tue Apr 28 16:52:21 2015 [15006][1][DEBUG] This is a debug message
-2 Tue Apr 28 16:52:21 2015 [15006][1][ERROR] This is an error message
- -
- ------------------------------------------------------------------------- - -
- -### Logging output - -The logging output displays the following information by default: - -
- -Example 11.4: Logging messages example output - ------------------------------------------------------------------------- - -
- -
<Date> [<ProcessId>][<UserId>][<LogLevel>] <LogMessage>
- -
- ------------------------------------------------------------------------- - -
- -; <Date> -: The date and time that the message was logged. ; - <ProcessId> -: The PHP process id. ; <UserId> -: The ID of the user that is logged into SuiteCRM. ; - <LogLevel> -: The log level for this log message. ; - <LogMessage> -: The contents of the log message. - -### Log levels - -Depending on the level setting in admin some messages will not be added -to the log e.g if your logger is set to error then you will -only see log levels of error or higher (error, -fatal and security). - -The default log levels (in order of verbosity) are: - -- debug -- info -- warn -- deprecated -- error -- fatal -- security - -Generally on a production instance you will use the less verbose levels -(probably error or fatal). However whilst you -are developing you can use whatever level you prefer. I prefer the most -verbose level - debug. - - diff --git a/_source/developer-old/chap12.md b/_source/developer-old/chap12.md deleted file mode 100644 index e1abed6d9..000000000 --- a/_source/developer-old/chap12.md +++ /dev/null @@ -1,398 +0,0 @@ ---- -title: Logic Hooks -weight: 12 ---- - -Logic hooks allow you to hook into various events in SuiteCRM to fire -custom code. This can allow you to, for example, make a call to an -external API, or to create a new record if certain events occur. - -### Types - -Logic hooks can occur in three contexts. These contexts are Application -Hooks, Module Hooks and User Hooks. These are detailed below. - -### Application Hooks - -Application hooks are hooks which are fired in the application context -(that is, they are not fired against a particular module). These hooks -must be defined in the top level logic hook (i.e. -custom/modules/logic\_hooks.php). - -; after\_entry\_point -: Called after SuiteCRM has initialised but before any other - processing is carried out. ; after\_ui\_footer -: Called after the UI footer. ; after\_ui\_frame -: Fired after the UI has been displayed but before the footer has been - displayed. ; server\_round\_trip -: Fired at the end of every page request. - -### User Hooks - -User hooks are fired for certain login/logout actions. Similar to -Application Hooks, these hooks must be defined in the top level logic -hook (i.e. custom/modules/logic\_hooks.php). - -; after\_login -: Fired after a user logs in to SuiteCRM . ; after\_logout -: Fired when a user logs out of SuiteCRM. ; before\_logout -: Fired before a user logs out of SuiteCRM. ; login\_failed -: Fired when a user attempts to login to SuiteCRM but the login fails. - -### Module Hooks - -Module Hooks are called on various record actions for a specific module. - -; after\_delete -: Fired when a record is deleted. ; after\_relationship\_add -: Fired after a relationship is added between two records. Note that - this may be called twice, once for each side of the relationship. ; - after\_relationship\_delete -: Fired after a relationship between two records is deleted. ; - after\_restore -: Fired after a record is undeleted. ; after\_retrieve -: Fired after a record is retrieved from the DB. ; after\_save -: Fired after a record is saved. Note that due to some peculiarities - some related modules may not be persisted to the database. The logic - hook is fired within the SugarBean classes save method. Some - implementing classes may save related beans after this method - returns. A notable example of this is the saving of email addresses - in Company modules. ; before\_delete -: Fired before a record is deleted. ; before\_relationship\_add -: Fired before a relationship is added between two records. Note that - this may be called twice, once for each side of the relationship. ; - before\_relationship\_delete -: Fired before a relationship between two records is deleted. Note - that this may be called twice, once for each side of the - relationship. ; before\_restore -: Fired before a record is undeleted. ; before\_save -: Fired before a record is saved. ; handle\_exception -: Fired when an exception occurs in a record. ; process\_record -: Fired when a record is processed ready to be displayed in list views - or dashlets. - -### Job Queue Hooks - -Job queue hooks are fired for scheduler jobs. Similar to application -hooks these hooks must be defined in the top level logic hook (i.e. -custom/modules/logic\_hooks.php). - -; job\_failure -: Fired when a scheduled job either returns false to signify failure - or throws an exception and it will not be retried. See the section - on \[\[\#chap12.xhtml\#scheduled-tasks-chapter|Scheduled Tasks\]\]. - ; job\_failure\_retry -: Fired when a scheduled job either returns false to signify failure - or throws an exception but it will be retried. See the section on - \[\[\#chap12.xhtml\#scheduled-tasks-chapter|Scheduled Tasks\]\]. - -### Implementing - -Depending on the Logic Hook type logic hooks are either placed -into
custom/modules/Logic\_Hooks.php or -custom/modules/<TargetModule>/Logic\_Hooks.php. - -#### Logic\_Hooks.php - -The logic hook file itself specifies which logic hooks to fire on this -event. It looks something like this: - -
- -Example 12.1: Logic hook file - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2 // Do not store anything in this file that is not part of the array or the hook
- 3 //version.  This file will be automatically rebuilt in the future.
- 4  $hook_version = 1;
- 5 $hook_array = Array();
- 6 // position, file, function
- 7 $hook_array['before_save'] = Array();
- 8 $hook_array['before_save'][] = Array(
- 9                               77,
-10                               'updateGeocodeInfo',
-11                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-12                               'CasesJjwg_MapsLogicHook',
-13                               'updateGeocodeInfo');
-14 $hook_array['before_save'][] = Array(
-15                               10,
-16                               'Save case updates',
-17                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-18                               'CaseUpdatesHook',
-19                               'saveUpdate');
-20 $hook_array['before_save'][] = Array(
-21                               11,
-22                               'Save case events',
-23                               'modules/AOP_Case_Events/CaseEventsHook.php',
-24                               'CaseEventsHook',
-25                               'saveUpdate');
-26 $hook_array['before_save'][] = Array(
-27                               12,
-28                               'Case closure prep',
-29                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-30                               'CaseUpdatesHook',
-31                               'closureNotifyPrep');
-32 $hook_array['before_save'][] = Array(
-33                               1,
-34                               'Cases push feed',
-35                               'custom/modules/Cases/SugarFeeds/CaseFeed.php',
-36                               'CaseFeed',
-37                               'pushFeed');
-38 $hook_array['after_save'] = Array();
-39 $hook_array['after_save'][] = Array(
-40                               77,
-41                               'updateRelatedMeetingsGeocodeInfo',
-42                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-43                               'CasesJjwg_MapsLogicHook',
-44                               'updateRelatedMeetingsGeocodeInfo');
-45 $hook_array['after_save'][] = Array(
-46                               10,
-47                               'Send contact case closure email',
-48                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-49                               'CaseUpdatesHook',
-50                               'closureNotify');
-51 $hook_array['after_relationship_add'] = Array();
-52 $hook_array['after_relationship_add'][] = Array(
-53                               77,
-54                               'addRelationship',
-55                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-56                               'CasesJjwg_MapsLogicHook',
-57                               'addRelationship');
-58 $hook_array['after_relationship_add'][] = Array(
-59                               9,
-60                               'Assign account',
-61                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-62                               'CaseUpdatesHook',
-63                               'assignAccount');
-64 $hook_array['after_relationship_add'][] = Array(
-65                               10,
-66                               'Send contact case email',
-67                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-68                               'CaseUpdatesHook',
-69                               'creationNotify');
-70 $hook_array['after_relationship_delete'] = Array();
-71 $hook_array['after_relationship_delete'][] = Array(
-72                               77,
-73                               'deleteRelationship',
-74                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-75                               'CasesJjwg_MapsLogicHook',
-76                               'deleteRelationship');
- -
- ------------------------------------------------------------------------- - -
- -Let’s go through each part of the file. - -
- -
- -
4 $hook_version = 1;
- -
- -
- -This sets the hook version that we are using. Currently there is only -one version so this line is unused. - -
- -
- -
5 $hook_array = Array();
- -
- -
- -Here we set up an empty array for our Logic Hooks. This should always be -called \$hook\_array. - -
- -
- -
7 $hook_array['before_save'] = Array();
- -
- -
- -Here we are going to be adding some before\_save hooks so we add an -empty array for that key. - -
- -
- -
 8 $hook_array['before_save'][] = Array(
- 9                               77,
-10                               'updateGeocodeInfo',
-11                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-12                               'CasesJjwg_MapsLogicHook',
-13                               'updateGeocodeInfo');
- -
- -
- -Finally we reach an interesting line. This adds a new logic hook to the -before\_save hooks. This array contains 5 entries which define this -hook. These are: - -#### = Sort order \#\#\#\#= - -The first argument (77) is the sort order for this hook. The logic hook -array is sorted by this value. If you wish for a hook to fire earlier -you should use a lower number. If you wish for a hook to be fired later -you should use a higher number. The numbers themselves are arbitrary. - -#### = Hook label \#\#\#\#= - -The second argument (‘updateGeocodeInfo’) is simply a label for the -logic hook. This should be something short but descriptive. - -#### = Hook file \#\#\#\#= - -The third argument is where the actual class for this hook is. In this -case it is in a file called -custom/modules/Cases/CasesJjwg\_MapsLogicHook.php. -Generally you will want the files to be somewhere in custom and it is -usual to have them in -custom/modules/<TheModule>/<SomeDescriptiveName>.php -or custom/modules/<SomeDescriptiveName>.php for Logic -Hooks not targeting a specific module. However the files can be placed -anywhere. - -#### = Hook class \#\#\#\#= - -The fourth argument is the class name for the Logic Hook class. In this -case
CasesJjwg\_MapsLogicHook. It is usual for the -class name to match the file name but this is not required. - -#### = Hook method \#\#\#\#= - -The fifth, and final, argument is the method that will be called on the -class. In this case updateGeocodeInfo. - -#### Adding your own logic hooks - -When adding logic hooks you should make full use of the Extensions -framework (see the section on Extensions). This involves creating a file -in
custom/Extension/application/Ext/LogicHooks/ for -application hooks and
-custom/Extension/modules/<TheModule>/Ext/LogicHooks/ -for module specific hooks. These files can then add to/alter the -\$hook\_array as appropriate. - -{| |width="50%"| -\[\[File:images/leanpub\_info-circle.png|50px|class=sidebar-image|information\]\] -|width="50%"| After adding a new logic hook it is necessary to perform a -quick repair and rebuild in the admin menu for this to be picked up. |} - -#### Logic Hook function - -The logic hook function itself will vary slightly based on the logic -hook type. For module hooks it will appear similar to: - -
- -Example 12.2: Example logic hook method - ------------------------------------------------------------------------- - -
- -
1     class SomeClass
-2     {
-3         function someMethod($bean, $event, $arguments)
-4         {
-5           //Custom Logic
-6         }
-7     }
- -
- ------------------------------------------------------------------------- - -
- -Application logic hooks omit the \$bean argument: - -
- -Example 12.3: Example logic hook method for application hooks - ------------------------------------------------------------------------- - -
- -
1     class SomeClass
-2     {
-3         function someMethod($event, $arguments)
-4         {
-5           //Custom Logic
-6         }
-7     }
- -
- ------------------------------------------------------------------------- - -
- -#### = \$bean (SugarBean) \#\#\#\#= - -The \$bean argument passed to your logic hook is usually the bean that -the logic hook is being performed on. For User Logic Hooks this will be -the current User object. For module logic hooks (such as -before\_save) this will be the record that is being saved. -For job queue logic hooks this will be the SchedulersJob bean. Note that -for Application Logic Hook this argument is not present. - -#### = \$event (string) \#\#\#\#= - -The \$event argument contains the logic hook event e.g -process\_record, before\_save,
-after\_delete etc. - -#### = \$arguments (array) \#\#\#\#= - -The \$arguments argument contains any additional details of the logic -hook event. I.e. in the case of before\_relationship\_add this will -contain details of the related modules. - -### Tips - -{| |width="50%"| -\[\[File:images/leanpub\_info-circle.png|50px|class=sidebar-image|information\]\] -|width="50%"| \#\#\#\# Triggering extra logic hooks \#\#\#\# - -If you are performing certain actions that may trigger another logic -hook (such as saving a bean) then you need to be aware that this will -trigger the logic hooks associated with that bean and action. This can -be troublesome if this causes a logic hook loop of saves causing further -saves. One way around this is to simply be careful of the hooks that you -may trigger. If doing so is unavoidable you can usually set an -appropriate flag on the bean and then check for that flag in subsequent -hooks. |} - -{| |width="50%"| -\[\[File:images/leanpub\_info-circle.png|50px|class=sidebar-image|information\]\] -|width="50%"| \#\#\#\# Think of the user \#\#\#\# - -Most logic hooks will cause additional code which can degrade the users -experience. If you have long running code in the after\_save the user -will need to wait for that code to run. This can be avoided by either -ensuring the code runs quickly or by using the Job Queue (see the Job -Queue chapter for more information). |} - - diff --git a/_source/developer-old/chap13.md b/_source/developer-old/chap13.md deleted file mode 100644 index b73dcf51a..000000000 --- a/_source/developer-old/chap13.md +++ /dev/null @@ -1,472 +0,0 @@ ---- -title: Scheduled Tasks -weight: 13 ---- - -### Intro - -Scheduled tasks are performed in SuiteCRM by the scheduler module. Jobs -are placed into the queue either through the defined scheduled tasks or, -for one off tasks, by code creating job objects. Note that both -scheduled tasks and using the job queue requires that you have the -schedulers set up. This will vary depending on your system but usually -requires adding an entry either to Cron (for Linux systems) or to the -windows scheduled tasks (for windows). Opening the scheduled tasks page -within SuiteCRM will let you know the format for the entry. - -### Scheduler - -Scheduled tasks allow SuiteCRM to perform recurring tasks. Examples of -these which ship with SuiteCRM include checking for incoming mail, -sending email reminder notifications and indexing the full text search. -What if you want to create your own tasks? - -SuiteCRM lets you define your own Scheduler. We do this by creating a -file in
-custom/Extension/modules/Schedulers/Ext/ScheduledTasks/. -You can give this file a name of your choice but it is more helpful to -give it a descriptive name. Let’s create a simple file named
-custom/Extension/modules/Schedulers/Ext/ScheduledTasks/CleanMeetingsScheduler.php. -This will add a new job to the job strings and a new method that the -scheduler will call: - -
- -Example 13.1: Example Clean Meetings Scheduler - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2 /*
- 3  * We add the method name to the $job_strings array.
- 4  * This is the method that jobs for this scheduler will call.
- 5  */
- 6 $job_strings[] = 'cleanMeetingsScheduler';
- 7
- 8 /**
- 9  * Example scheduled job to change any 'Planned' meetings older than a month
-10  * to 'Not Held'.
-11  * @return bool
-12  */
-13 function cleanMeetingsScheduler(){
-14   //Get the cutoff date for which meetings will be considered
-15  $cutOff = new DateTime('now - 1 month');
-16  $cutOff = $cutOff->format('Y-m-d H:i:s');
-17
-18  //Get an instance of the meetings bean for querying
-19   //see the Working With Beans chapter.
-20   $bean = BeanFactory::getBean('Meetings');
-21
-22   //Get the list of meetings older than the cutoff that are marked as Planned
-23   $query = "meetings.date_start < '$cutOff' AND meetings.status = 'Planned'";
-24   $meetings = $bean->get_full_list('',$query);
-25
-26   foreach($meetings as $meeting){
-27     //Mark each meeting as Not Held
-28     $meeting->status = 'Not Held';
-29     //Save the meeting changes
-30     $meeting->save();
-31   }
-32   //Signify we have successfully ran
-33   return true;
-34 }
- -
- ------------------------------------------------------------------------- - -
- -We also make sure that we add a language file in
-custom/Extension/modules/Schedulers/Ext/Language/en\_us.cleanMeetingsScheduler.php -again, the name of the file doesn’t matter but it is helpful to use -something descriptive. This will define the language string for our job -so the user sees a nice label. See the section on language strings for -more information. The key for the mod strings will be -LBL\_UPPERMETHODNAME. In our case our method name is -cleanMeetingsScheduler so our language label key will be -LBL\_CLEANMEETINGSSCHEDULER. - -
- -Example 13.2: Example Language string for Clean Meetings Scheduler - ------------------------------------------------------------------------- - -
- -
1 <?php
-2 //We add the mod string for our method here.
-3 $mod_strings['LBL_CLEANMEETINGSSCHEDULER'] = 'Mark old, planned meetings as Not \
-4 Held';
- -
- ------------------------------------------------------------------------- - -
- -If we perform a repair and rebuild our method will now be packaged up -into the scheduler ext file (see the Extensions section for more -information on this process) and will be available in the schedulers -page. Note that for any changes to the scheduler method you will need to -perform another quick repair and rebuild - even in developer mode. We -can now create a new scheduler to call our new method: - -
- -\[\[File:images/CreateMeetingsScheduler.png|Creating a scheduler that -uses our new method\]\] Creating a scheduler that uses our new method - -
- -This will now behave just like any other scheduler and we can have this -run as often (or as rarely) as we would like. Take care here. The -default frequency is every one minute. If your task is heavy duty or -long running this may not be what you would prefer. Here we settle for -once a day. - -### Job Queue - -Sometimes you will require code to perform a long running task but you -do not need the user to wait for this to be completed. A good example of -this is sending an email in a logic hook (see the Logic Hooks chapter -for information on these). Assuming we have the following logic hook: - -
- -Example 13.3: Example Email sending Logic Hook - ------------------------------------------------------------------------- - -
- -
 1 class SomeClass
- 2 {
- 3     function SomeMethod($bean, $event, $arguments)
- 4     {
- 5
- 6         //Perform some setup of the email class
- 7         require_once "include/SugarPHPMailer.php";
- 8         $mailer=new SugarPHPMailer();
- 9         $admin = new Administration();
-10         $admin->retrieveSettings();
-11         $mailer->prepForOutbound();
-12         $mailer->setMailerForSystem();
-13         $admin = new Administration();
-14         $admin->retrieveSettings();
-15         $admin->settings['notify_fromname']
-16         $mailer->From     = $admin->settings['notify_fromaddress']
-17         $mailer->FromName = $emailSettings['from_name'];
-18         $mailer->IsHTML(true);
-19
-20         //Add message and recipient.
-21         //We could go all out here and load and populate an email template
-22         //or get the email address from the bean
-23         $mailer->Subject = 'My Email Notification! '.$bean->name;
-24         $mailer->Body = $event. ' fired for bean '.$bean->name;
-25         $mailer->AddAddress('Jim@example.com');
-26         return $mailer->Send();
-27     }
-28 }
- -
- ------------------------------------------------------------------------- - -
- -This will work fine. However you do not want the user to have to wait -for the email to be sent out as this can cause the UI to feel sluggish. -Instead you can create a Job and place it into the job queue and this -will be picked by the scheduler. Let’s look at an example of how you -would do this. - -First we want our Logic Hook class to create the scheduled job: - -
- -Example 13.4: Example Scheduled Job Creation - ------------------------------------------------------------------------- - -
- -
 1 class SomeClass
- 2 {
- 3     function SomeMethod($bean, $event, $arguments)
- 4     {
- 5       require_once 'include/SugarQueue/SugarJobQueue.php';
- 6       $scheduledJob = new SchedulersJob();
- 7
- 8       //Give it a useful name
- 9       $scheduledJob->name = "Email job for {$bean->module_name} {$bean->id}";
-10
-11       //Jobs need an assigned user in order to run. You can use the id
-12       //of the current user if you wish, grab the assigned user from the
-13       //current bean or anything you like.
-14       //Here we use the default admin user id for simplicity
-15       $scheduledJob->assigned_user_id = '1';
-16
-17       //Pass the information that our Email job will need
-18       $scheduledJob->data = json_encode(array(
-19                                             'id' => $bean->id,
-20                                             'module' => $bean->module_name)
-21                                         );
-22
-23       //Tell the scheduler what class to use
-24       $scheduledJob->target = "class::BeanEmailJob";
-25
-26       $queue = new SugarJobQueue();
-27       $queue->submitJob($scheduledJob);
-28     }
-29 }
- -
- ------------------------------------------------------------------------- - -
- -Next we create the BeanEmailJob class. This is placed into the
-custom/Extensions/modules/Schedulers/Ext/ScheduledTasks/ -directory with the same name as the class. So in our example we will -have:
-custom/Extensions/modules/Schedulers/Ext/ScheduledTasks/BeanEmailJob.php - -
- -Example 13.5: Example Scheduler job - ------------------------------------------------------------------------- - -
- -
 1 class BeanEmailJob implements RunnableSchedulerJob
- 2 {
- 3   public function run($arguments)
- 4   {
- 5
- 6     //Only different part of the email code.
- 7     //We grab the bean using the supplied arguments.
- 8     $arguments = json_decode($arguments,1);
- 9     $bean = BeanFactory::getBean($arguments['module'],$arguments['id']);
-10
-11     //Perform some setup of the email class
-12     require_once "include/SugarPHPMailer.php";
-13     $mailer=new SugarPHPMailer();
-14     $admin = new Administration();
-15     $admin->retrieveSettings();
-16     $mailer->prepForOutbound();
-17     $mailer->setMailerForSystem();
-18     $admin = new Administration();
-19     $admin->retrieveSettings();
-20     $mailer->From     = $admin->settings['notify_fromaddress'];
-21     $mailer->FromName = $emailSettings['from_name'];
-22     $mailer->IsHTML(true);
-23
-24     //Add message and recipient.
-25     //We could go all out here and load and populate an email template
-26     //or get the email address from the bean
-27     $mailer->Subject = 'My Email Notification! '.$bean->name;
-28     $mailer->Body = $event. ' fired for bean '.$bean->name;
-29     $mailer->AddAddress('Jim@example.com');
-30     return $mailer->Send();
-31   }
-32   public function setJob(SchedulersJob $job)
-33   {
-34     $this->job = $job;
-35   }
-36 }
- -
- ------------------------------------------------------------------------- - -
- -Now whenever a user triggers the hook it will be much quicker since we -are simply persisting a little info to the database. The scheduler will -run this in the background. - -#### Retries - -Occasionally you may have scheduled jobs which could fail -intermittently. Perhaps you have a job which calls an external API. If -the API is unavailable it would be unfortunate if the job failed and was -never retried. Fortunately the SchedulersJob class has two properties -which govern how retries are handled. These are requeue and -retry\_count. - -; requeue -: Signifies that this job is eligible for retries. ; - retry\_count -: Signifies how many retries remain for this job. If the job fails - this value will be decremented. - -We can revisit our previous example and add two retries: - -
- -Example 13.6: Setting the retry count on a scheduled job - ------------------------------------------------------------------------- - -
- -
 6       $scheduledJob = new SchedulersJob();
- 7
- 8       //Give it a useful name
- 9       $scheduledJob->name = "Email job for {$bean->module_name} {$bean->id}";
-10
-11       //Jobs need an assigned user in order to run. You can use the id
-12       //of the current user if you wish, grab the assigned user from the
-13       //current bean or anything you like.
-14       //Here we use the default admin user id for simplicity
-15       $scheduledJob->assigned_user_id = '1';
-16
-17       //Pass the information that our Email job will need
-18       $scheduledJob->data = json_encode(array(
-19                                             'id' => $bean->id,
-20                                             'module' => $bean->module_name)
-21                                         );
-22
-23       //Tell the scheduler what class to use
-24       $scheduledJob->target = "class::BeanEmailJob";
-25
-26       //Mark this job for 2 retries.
-27       $scheduledJob->requeue = true;
-28       $scheduledJob->retry = 2;
- -
- ------------------------------------------------------------------------- - -
- -See the section on \[\[\#chap11.xhtml\#logic-hooks-chapter|logic -hooks\]\] for more information on how job failures can be handled. - -### Debugging - -With Scheduled tasks and jobs running in the background it can sometimes -be difficult to determine what is going on when things go wrong. If you -are debugging a scheduled task the the scheduled task page is a good -place to start. For both scheduled tasks and job queue tasks you can -also check the job\_queue table. For example, in MySQL we can check the -last five scheduled jobs: - -
- -Example 13.7: Example MySQL query for listing jobs - ------------------------------------------------------------------------- - -
- -
SELECT * FROM job_queue ORDER BY date_entered DESC LIMIT 5
- -
- ------------------------------------------------------------------------- - -
- -This will give us information on the last five jobs. Alternatively we -can check on specific jobs: - -
- -Example 13.8: Example MySQL query for listing BeanEmailJobs - ------------------------------------------------------------------------- - -
- -
SELECT * FROM job_queue WHERE target = 'class::BeanEmailJob'
- -
- ------------------------------------------------------------------------- - -
- -In either case this will give details for the job(s): - -
- -Example 13.9: Example MySQL list of jobs - ------------------------------------------------------------------------- - -
- -
*************************** 1. row ***************************
-assigned_user_id: 1
-              id: 6cdf13d5-55e9-946e-9c98-55044c5cecee
-            name: Email job for Accounts 103c4c9b-336f-0e87-782e-5501defb5900
-         deleted: 0
-    date_entered: 2015-03-14 14:58:15
-   date_modified: 2015-03-14 14:58:25
-    scheduler_id:
-    execute_time: 2015-03-14 14:58:00
-          status: done
-      resolution: success
-         message: NULL
-          target: class::BeanEmailJob
-            data: {"id":"103c4c9b-336f-0e87-782e-5501defb5900","module":"Account\
-s"}
-         requeue: 0
-     retry_count: NULL
-   failure_count: NULL
-       job_delay: 0
-          client: CRON3b06401793b3975cd00c0447c071ef9a:7781
-percent_complete: NULL
-1 row in set (0.00 sec)
- -
- ------------------------------------------------------------------------- - -
- -Here we can check the status, resolution and message fields. If the -status is queued then either the scheduler has not yet run -or it isn’t running. Double check your Cron settings if this is the -case. - -It may be the case that the job has ran but failed for some reason. In -this case you will receive a message telling you to check the logs. -Checking the logs usually provides enough information, particularly if -you have made judicious use of logging (see the chapter on logging) in -your job. - -It is possible that the job is failing outright, in which case your -logging may not receive output before the scheduler exits. In this case -you can usually check your PHP logs. - -As a last resort you can manually run the scheduler from the SuiteCRM -directory using: - -
- -Example 13.10: Running the scheduler manually - ------------------------------------------------------------------------- - -
- -
php -f cron.php
- -
- ------------------------------------------------------------------------- - -
- -Using this in addition to outputting any useful information should track -down even the oddest of bugs. - - diff --git a/_source/developer-old/chap14.md b/_source/developer-old/chap14.md deleted file mode 100644 index 41a689538..000000000 --- a/_source/developer-old/chap14.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: Extension Framework -weight: 14 ---- - -The extension framework provides a means to modify various application -data inside SuiteCRM. For example it provides a way to add or modify -vardefs, scheduled tasks, language strings and more. In general a folder -is provided in custom/Extension (the exact path depends on -the extension). This folder is then scanned for files which will be -consolidated into a single ext file which SuiteCRM will then read and -use. In this way it is possible for developers to add a new file to -affect the behaviour of SuiteCRM rather than altering existing files. -This makes the changes more modular and allows the easy addition or -removal of changes. Additionally, because these files are all -consolidated it means that there is no affect on performance of checking -a (possibly large) number of files. This is only done when performing a -repair and rebuild in the admin menu. - -### Standard Extensions - -List of standard SuiteCRM extensions - -{| ! Extension Directory ! Compiled file ! Module ! Description |- | -ActionViewMap | action\_view\_map.ext.php |   | Used to map actions for -a module to a specified view. |- | ActionFileMap | -action\_file\_map.ext.php |   | Used to map actions for a module to a -specified file. |- | ActionReMap | action\_remap.ext.php |   | Used to -map actions for a module to existing actions. |- | Administration | -administration.ext.php | Administration | Used to add new sections to -the administration panel. |- | EntryPointRegistry | -entry\_point\_registry.ext.php | application | Used to add new entry -points to SuiteCRM. See the chapter on -\[\[\#chap07.xhtml\#entry-point-chapter|Entry Points\]\]. |- | -Extensions | extensions.ext.php | application | Used to add new -extension types. |- | FileAccessControlMap | -file\_access\_control\_map.ext.php |   | Used to add, update or delete -entries in the access control lists for files. |- | Language | -N/A\[\[\#chap13.xhtml\#fn-langNote|1\]\] |   | Used to add, -update or delete language strings for both modules and app strings. See -the chapter on \[\[\#chap08.xhtml\#language-chapter|Language -Strings\]\]. |- | Layoutdefs | layoutdefs.ext.php |   | Used to add, -update or delete subpanel definitions for a module. |- | GlobalLinks | -links.ext.php | application | Used to add, update or delete global links -(the list of links that appear in the top right of the SuiteCRM UI). |- -| LogicHooks | logichooks.ext.php |   | Used to add, update or delete -logic hooks. See the chapter on -\[\[\#chap11.xhtml\#logic-hooks-chapter|Logic Hooks\]\]. |- | Include | -modules.ext.php | application | Used to register new beans and modules. -|- | Menus | menu.ext.php |   | Used to add, update or delete the menu -links for each module. |- | ScheduledTasks | scheduledtasks.ext.php | -Schedulers | Used to add new scheduled tasks. See the chapter on -\[\[\#chap12.xhtml\#scheduled-tasks-chapter|Scheduled Tasks\]\]. |- | -UserPage | userpage.ext.php | Users | Unused |- | Utils | -custom\_utils.ext.php | application | Used to add new utility methods. -|- | Vardefs | vardefs.ext.php |   | Used to add, update or delete -vardefs for a module. See the section on -\[\[\#chap03.xhtml\#vardefs-chapter|Vardefs\]\]. |- | JSGroupings | -jsgroups.ext.php |   | Used to add, update or delete JavaScript -groupings. |- | Actions | actions.ext.php | AOW\_Actions | Used to add -new WorkFlow actions. |} - -### Custom Extensions - -Interestingly the extension framework can be used to add new extensions. -This allows you to create customisations that are easily customised by -others (in a similar manner to, for example, how vardefs can be added - -see the chapter on \[\[\#chap03.xhtml\#vardefs-chapter|Vardefs\]\]). - -To create a custom extension you simply add a new file in
-custom/Extension/application/Ext/Extensions. This can be -given a name of your choosing. Our example will use
-custom/Extension/application/Ext/Extensions/SportsList.php -and will look like: - -
- -Example 14.1: Adding an entry point entry - ------------------------------------------------------------------------- - -
- -
1 <?php
-2 $extensions["sports_list"] =  array(
-3                 "section" => "sports_list",
-4                 "extdir" => "SportsList",
-5                 "file" => 'sportslist.ext.php',
-6                 "module" => "");
- -
- ------------------------------------------------------------------------- - -
- -Now when a Quick Repair and rebuild is run any files in
-custom/Extension/application/Ext/SportsList/ will be -consolidated into
-custom/application/Ext/SportsList/sportslist.ext.php. On -it’s own this file will not do anything but you are now able to write -custom code that checks the consolidated file rather than having to -worry about searching for customisations. - -
- -
    diff --git a/_source/developer-old/chap15.md b/_source/developer-old/chap15.md deleted file mode 100644 index 46e4b8ce1..000000000 --- a/_source/developer-old/chap15.md +++ /dev/null @@ -1,371 +0,0 @@ ---- -title: Module Installer -weight: 15 ---- - -As detailed in the other chapters of this book there are many ways to -customise SuiteCRM. The module installer allows you to package these -changes and install them onto other SuiteCRM instances. This is achieved -by creating a package. - -At the minimum a package is a zip file that contains a -manifest.php file in it’s root. The manifest file is -responsible for providing information about the installer as well as -providing information on how to install the package. - -### manifest.php - -The manifest.php file contains the definition of three -arrays. Let’s look at each of these arrays in turn. See -\[\[\#chap19.xhtml\#appendix-a|Appendix A\]\] for the full sample -manifest.php file. - -{| |width="50%"| -\[\[File:images/leanpub\_info-circle.png|50px|class=sidebar-image|information\]\] -|width="50%"| Within path in the manifest file you can use -<basepath> to refer to the base directory of the -installer. For example <basepath>/Foo.txt will refer -to the Foo.txt file in the root of the installer package. -|} - -#### \$manifest - -The \$manifest array provides information on the package -itself such as it’s name, readme etc. (it also defines the -copy array for patch packages). A sample -definition of the manifest array will appear something like this: - -
    - -Example 15.1: Example \$manifest array definition - ------------------------------------------------------------------------- - -
    - -
     1 $manifest = array(
    - 2   'name' => 'My First Package',
    - 3   'description' => 'This is a simple package example manifest file',
    - 4   'version' => '1.5',
    - 5   'author' => 'Jim Mackin',
    - 6   'readme' => 'readme.txt',
    - 7   'acceptable_sugar_flavors' => array('CE'),
    - 8   'acceptable_sugar_versions' => array(
    - 9     'exact_matches' => array(),
    -10     'regex_matches' => array('6\\.5\\.[0-9]$'),
    -11   ),
    -12   'copy_files' => array (
    -13     'from_dir' => '<basepath>/custom/',
    -14     'to_dir' => 'custom',
    -15     'force_copy' => array (),
    -16   ),
    -17   'dependencies' => array(
    -18     array(
    -19       'id_name' => 'example_dependency_package',
    -20       'version' => '2.4',
    -21     ),
    -22   ),
    -23 );
    - -
    - ------------------------------------------------------------------------- - -
    - -; name -: The name of the package. This is how the package will appear to the - user during installation and in the Module Loader package list. The - package name is required. ; description -: A brief description of the package. ; version -: The version of this package. This can be any string but is usually a - traditional version number (such as 3.1.4). ; - author -: The author of the package. ; readme -: A brief readme string. Note that if a README.txt is - found in the root of the package this will be used instead. ; - acceptable\_sugar\_flavors -: A remnant of the SugarCRM packages. This should always be an array - with (at least) a CE entry. If you would like the - installer to target both SuiteCRM and SugarCRM editions then this - can contain one of the other SugarCRM flavours (PRO, - CORP , ULT or ENT). ; - acceptable\_sugar\_versions -: An array detailing the matching SugarCRM versions. Note that the - SugarCRM version is distinct from the SuiteCRM version. This array - has two keys. exact\_matches is simply an array of the - allowed versions. regex\_matches allows specifying - regexes to match versions. For SuiteCRM you only need to worry about - supporting the 6.5.\* versions which can be matched - with the regex 6\\.5\\.\[0-9\]\$. At the time of - writing the current SugarCRM version for SuiteCRM is - 6.5.20. ; copy\_files -: This is only used for patch installers and will copy - files in the from\_dir key to those in the - to\_dir key. Finally the force\_copy key - can be used to specify files that should be forcibly copied over. ; - dependencies -: An array of other packages that are relied on by this package. Each - entry is an array with id\_name - the id of the package - and version - the required version of the package. ; - icon -: The path (within the installer) to an icon to be displayed during - installation. ; is\_uninstallable -: Whether or not uninstalls should be allowed. ; - published\_date -: The date that the package was published. There is no fixed format - for the date, it is simply a string. ; key -: Specifies a key to ensure that modules do not clash. This will - prefix the installed modules and tables with key. This - is used by the module builder when creating packages but can be - specified if you wish. ; remove\_tables -: A string specifying whether module tables should be removed when - uninstalling this package. Accepted values are true, - false and prompt. The default is - true. ; type -: The type of the installer, one of langpack, - module, patch or theme. See - the types section. - -#### \$install\_defs - -Provides information on how the package is to be installed, which files -go where and any additional information such as logic hooks, custom -fields etc. - -#### = id \#\#\#\#= - -A unique identifier for the module. - -#### = connectors \#\#\#\#= - -An array of connectors to be installed. Each entry is an array with the -following keys: - -{| ! Key ! Description |- | name | The name of the -connector. |- | connector | The directory to copy the -connector files from. |- | formatter | The directory to -copy the connector formatter files from. |} - -#### = copy \#\#\#\#= - -An array of files and directories to be copied on install. Each entry is -an array with the following keys: - -{| ! Key ! Description |- | from | The source -file/directory in the package. |- | to | The destination -file/directory. |} - -{| |width="50%"| -\[\[File:images/leanpub\_info-circle.png|50px|class=sidebar-image|information\]\] -|width="50%"| In general if a file can be handled by one of the other -keys then that key should be used. For example new admin entries should -be copied using the administration key rather than using -the copy key. |} - -#### = dashlets \#\#\#\#= - -An array of dashlets to be installed. Each entry is an array with the -following keys: - -{| ! Key ! Description |- | name | The name of the new -dashlet. |- | from | The path in the install package from -which the dashlet files will be copied. |} - -#### = language \#\#\#\#= - -An array of language files to be installed. Each entry is an array with -the following keys: - -{| ! Key ! Description |- | from | The location of the -language file inside the package. |- | to\_module | The -module this language file is intended for (or ‘application’ for -application language strings). |- | language | The language -that this file is for (i.e. en\_us or es\_es). |} - -See the chapter on \[\[\#chap08.xhtml\#language-chapter|Language -Strings\]\] for more information. - -#### = layoutdefs \#\#\#\#= - -An array of layoutdef files which are used to add, remove or edit -subpanels. Each entry is an array with the following keys: - -{| ! Key ! Description |- | from | The path in the package -to the file to be installed. |- | to\_module | The module -that this file will be installed to. |} - -#### = vardefs \#\#\#\#= - -An array of the vardefs to be added to specific modules. Each entry is -an array with the following keys: - -{| ! Key ! Description |- | from | The location of the -vardef file in the package. |- | to\_module | The -destination module. |} - -{| |width="50%"| -\[\[File:images/leanpub\_info-circle.png|50px|class=sidebar-image|information\]\] -|width="50%"| Generally you should install custom fields using the -custom\_fields key. However this key can be used to alter -existing fields or add more complex fields. |} - -#### = menu \#\#\#\#= - -An array of menus to be installed. Each entry is an array with the -following keys: - -{| ! Key ! Description |- | from | The location of the menu -file in the package. |- | to\_module | The destination -module for this menu. |} - -#### = beans \#\#\#\#= - -An array of beans to be installed. Each entry is an array with the -following keys: - -{| ! Key ! Description |- | module | The name of the -module. |- | class | The name of the bean class. |- | -path | The path (within the package) to the bean file. |- | -tab | Whether or not a tab should be added for this module. -|} - -#### = relationships \#\#\#\#= - -An array detailing any new relationships added (in particular -relationships where one side is an existing module). Each entry is an -array with the following keys: - -{| ! Key ! Description |- | module | The module that this -relationship will be attached to. |- | meta\_data | The -location of the metadata file for this relationship. |} - -#### = custom\_fields \#\#\#\#= - -An array of new custom fields to be installed (See the -\[\[\#chap03.xhtml\#vardefs-chapter|Vardefs\]\] chapter for more -information on this). Each entry is an array with the following keys: - -{| ! Key ! Description |- | name | The name of the new -custom field. |- | label | The key for the language string -which will act as the label for this custom field. |- | -type | The type of this custom field. |- | -max\_size | For string field types, the maximum number of -characters. |- | require\_option | Whether or not the field -is required. |- | default\_value | The default value of -this field. |- | ext1 | Extended field information. -Different field types will use this value differently. For example Enum -fields will store the key for the options in this field, decimal and -float fields will store the precision. |- | ext2 | Extended -field information. Different field types will use this value -differently. For example, dynamic dropdowns will store the parent -dropdown, text areas will store the number of rows. |- | -ext3 | Extended field information. Different field types -will use this value differently. For example, text areas will store the -number of columns. |- | ext4 | Extended field information. -Different field types will use this value differently. For HTML field -types this will store the HTML. |- | audited | Whether or -not changes to this field should be audited. |- | module | -Used to specify the module where the custom field will be added. |} - -#### = logic\_hooks \#\#\#\#= - -An array of logic hooks to be installed. See the -\[\[\#chap11.xhtml\#logic-hooks-chapter|Logic Hooks\]\] chapter for more -information. Each entry is an array with the following keys: - -{| ! Key ! Description |- | module | The module to where -this logic hook should be installed. Leaving this empty will install -into the top level logic hook. |- | hook | The logic hook -type (i.e. after\_save, after\_login, etc.). -|- | order | The sort order for this logic hook. |- | -description | A description of the hook. |- | -file | The file containing the class for this logic hook, -relative to the SuiteCRM root. |- | class | The class that -contains the logic hook function that should be called by this hook. |- -| function | The function to be invoked when this hook is -triggered. |} - -#### = image\_dir \#\#\#\#= - -A path to a directory of images to be included in the install. - -#### = schedulers \#\#\#\#= - -An array of schedulers to be installed. Each entry is an array with a -single key: - -{| ! Key ! Description |- | from | The file containing the -new scheduled task. |} - -#### = administration \#\#\#\#= - -An array of admin panels to be installed. Each entry is an array with a -single key: - -{| ! Key ! Description |- | from | The file containing the -new admin panel definition. |} - -#### = pre\_execute \#\#\#\#= - -Defines an array of files to be executed before the package is -installed. Each entry is a path to a file within the package. Any output -will be displayed to the user in the install log. - -#### = post\_execute \#\#\#\#= - -Defines an array of files to be executed after the package is installed. -Each entry is a path to a file within the package. Any output will be -displayed to the user in the install log. - -#### = pre\_uninstall \#\#\#\#= - -Defines an array of files to be executed before the package is -uninstalled. Each entry is a path to a file within the package. Any -output will be displayed to the user in the uninstall log. - -#### = post\_uninstall \#\#\#\#= - -Defines an array of files to be executed after the package is -uninstalled. Each entry is a path to a file within the package. Any -output will be displayed to the user in the uninstall log. - -#### \$upgrade\_manifest - -Provides a means of upgrading an already installed package by providing -different install\_defs. - -
    - -
    - -### Types - -{| ! Type ! Description |- | langpack | A language installer. This will -add an entry to the language dropdown. |- | module | A module installer. -Will install new modules and/or functionality. |- | patch | A patch -installer. This is used to upgrade SuiteCRM. |- | theme | A theme -installer. This will add a new option to the themes. |} - -#### Other files - -; README.txt -: Contains the readme for this package. If README.txt and - a readme entry in the manifest.php is defined then this - file will be used. ; LICENSE.txt -: Provides information on the license for this package. ; - scripts/pre\_install.php -: A PHP script which defines a method pre\_install(). - This method will be called before the package is installed. Any - output will be displayed to the user in the install log. ; - scripts/post\_install.php -: A PHP script which defines a method post\_install(). - This method will be called after the package is installed. ; - scripts/pre\_uninstall.php -: A PHP script which defines a method pre\_uninstall(). - This method will be called before the package is uninstalled. ; - scripts/post\_uninstall.php -: A PHP script which defines a method post\_uninstall(). - This method will be called after the package is uninstalled. - -
diff --git a/_source/developer-old/chap16.md b/_source/developer-old/chap16.md deleted file mode 100644 index e359d5639..000000000 --- a/_source/developer-old/chap16.md +++ /dev/null @@ -1,426 +0,0 @@ ---- -title: API -weight: 16 ---- - -The SuiteCRM API allows third party code to access and edit SuiteCRM -data and functionality. - -### Using the API - -SuiteCRM has both a REST and a SOAP API. Which API you want to use will -largely come down to personal preference and the support for SOAP/REST -libraries in whichever language you will be using. - -Both APIs will require a username and password. It is usual to create a -user specifically for the API. - -#### SOAP - -The WSDL for the SOAP API can be found at: - -
- -Example 16.1: SOAP API WSDL Location - ------------------------------------------------------------------------- - -
- -
example.com/suitecrm/service/v4_1/soap.php?wsdl
- -
- ------------------------------------------------------------------------- - -
- -Where example.com/suitecrm is the address of your SuiteCRM -instance. v4\_1 is the version of the API and can be -changed, v4\_1 is the latest version at the time of -writing. - -#### = SOAP Example \#\#\#\#= - -The following PHP example uses the built in SoapClient class. - -
- -Example 16.2: Accessing the SOAP API - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2 //Create a new SoapClient
- 3 $wsdlURL = "http://example.com/suitecrm/service/v4_1/soap.php?wsdl";
- 4 $client = new SoapClient($wsdlURL);
- 5
- 6 //Login to the API and get the session id
- 7 $userAuth = array(
- 8         'user_name' => '<suitecrmuser>',
- 9         'password' => md5('<suitecrmpassword>'),
-10 );
-11 $appName = 'My SuiteCRM SOAP Client';
-12 $nameValueList = array();
-13 $loginResults = $client->login($userAuth, $appName, $nameValueList);
-14
-15 //Get a list of at most 10 accounts with a billing address in Ohio. Along with
-16 //The first and last names of any contacts in that Account.
-17 $results = $client->get_entry_list(
-18         //Session id - retrieved from login call
-19         $loginResults->id,
-20         //Module to get_entry_list for
-21         'Accounts',
-22         //Filter query - Added to the SQL where clause
-23         "accounts.billing_address_city = 'Ohio'",
-24         //Order by - unused
-25         '',
-26         //Start with the first record
-27         0,
-28         //Return the id and name fields
-29         array('id','name'),
-30         //Link to the "contacts" relationship and retrieve the
-31         //First and last names.
-32         array(
-33                 array(
-34                         'name' => 'contacts',
-35                         'value' => array(
-36                                 'first_name',
-37                                 'last_name',
-38                         ),
-39                 ),
-40         ),
-41         //Show 10 max results
-42         10,
-43         //Do not show deleted
-44         0
-45 );
-46 print_r($results);
- -
- ------------------------------------------------------------------------- - -
- -
- -
- -#### REST - -The SuiteCRM REST API can be found at: - -
- -Example 16.3: REST API Endpoint Location - ------------------------------------------------------------------------- - -
- -
example.com/suitecrm/service/v4_1/rest.php
- -
- ------------------------------------------------------------------------- - -
- -Where example.com/suitecrm is the address of your SuiteCRM instance. -v4\_1 is the version of the API and can be changed, v4\_1 is the latest -version at the time of writing. - -The SuiteCRM REST API is not a true REST API - all calls are performed -as POSTs and all calls are to the base URL with the method passed in as -a post argument. - -; The arguments to the REST API calls are:
method : The method -which will be called, i.e. login or -get\_entry\_list. See -\[\[\#chap20.xhtml\#appendix-b|Appendix B\]\] for a list of API methods. -; input\_type : The input type of the rest\_data. This is usually -JSON but can also be Serialize. ; -response\_type : How the response will be encoded. This is usually -JSON but can also be Serialize. ; rest\_data : -Any other arguments that are required by this method. This is passed as -an encoded array. The encoding is determined by input\_type. - -{| |width="50%"| -\[\[File:images/leanpub\_warning.png|50px|class=sidebar-image|warning\]\] -|width="50%"| Note that, for REST requests it is the order of the -arguments that matter in rest\_data and not the name. |} - -
- -
- -#### = Examples \#\#\#\#= - -
- -Example 16.4: Accessing the REST API - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2
- 3 $url = "http://example.com/suitecrm/service/v4_1/rest.php";
- 4
- 5 function restRequest($method, $arguments){
- 6  global $url;
- 7  $curl = curl_init($url);
- 8  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
- 9  $post = array(
-10          "method" => $method,
-11          "input_type" => "JSON",
-12          "response_type" => "JSON",
-13          "rest_data" => json_encode($arguments),
-14  );
-15
-16  curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
-17
-18  $result = curl_exec($curl);
-19  curl_close($curl);
-20  return json_decode($result,1);
-21 }
-22
-23
-24 $userAuth = array(
-25         'user_name' => 'suitecrmuser',
-26         'password' => md5('suitecrmpassword'),
-27 );
-28 $appName = 'My SuiteCRM REST Client';
-29 $nameValueList = array();
-30
-31 $args = array(
-32             'user_auth' => $userAuth,
-33             'application_name' => $appName,
-34             'name_value_list' => $nameValueList);
-35
-36 $result = restRequest('login',$args);
-37 $sessId = $result['id'];
-38
-39 $entryArgs = array(
-40   //Session id - retrieved from login call
-41  'session' => $sessId,
-42   //Module to get_entry_list for
-43  'module_name' => 'Accounts',
-44   //Filter query - Added to the SQL where clause,
-45  'query' => "accounts.billing_address_city = 'Ohio'",
-46   //Order by - unused
-47  'order_by' => '',
-48   //Start with the first record
-49  'offset' => 0,
-50   //Return the id and name fields
-51  'select_fields' => array('id','name',),
-52  //Link to the "contacts" relationship and retrieve the
-53  //First and last names.
-54  'link_name_to_fields_array' => array(
-55          array(
-56                  'name' => 'contacts',
-57                  'value' => array(
-58                          'first_name',
-59                          'last_name',
-60                  ),
-61          ),
-62  ),
-63   //Show 10 max results
-64  'max_results' => 10,
-65   //Do not show deleted
-66  'deleted' => 0,
-67 );
-68 $result = restRequest('get_entry_list',$entryArgs);
-69
-70 print_r($result);
- -
- ------------------------------------------------------------------------- - -
- -For a full list of API methods and their arguments see -\[\[\#chap20.xhtml\#appendix-b|Appendix B\]\]. - -### Adding custom API methods - -Sometimes the existing API methods are not sufficient or using them for -a task would be overly complex. SuiteCRM allows the web services to be -extended with additional methods or overriding existing methods. - -The recommended path for custom entry points is the following
-custom/service/<version>\_custom/. At the time of -writing the latest web service version is v4\_1 so this -would be custom/service/v4\_1\_custom/. - -Next we create the implementing class. This will create our new method. -In our example we will simply create a new method which writes to the -SuiteCRM log We will call this method
-write\_log\_message. - -
- -Example 16.5: Custom v4\_1 Web Service Implementation - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2 if(!defined('sugarEntry')){
- 3   define('sugarEntry', true);
- 4 }
- 5 require_once 'service/v4_1/SugarWebServiceImplv4_1.php';
- 6 class SugarWebServiceImplv4_1_custom extends SugarWebServiceImplv4_1
- 7 {
- 8
- 9   function write_log_message($session, $message)
-10   {
-11     $GLOBALS['log']->info('Begin: write_log_message');
-12
-13     //Here we check that $session represents a valid session
-14     if (!self::$helperObject->checkSessionAndModuleAccess(
-15                                                     $session,
-16                                                     'invalid_session',
-17                                                     '',
-18                                                     '',
-19                                                     '',
-20                                                     new SoapError()))
-21     {
-22       $GLOBALS['log']->info('End: write_log_message.');
-23       return false;
-24     }
-25     $GLOBALS['log']->info($message);
-26     return true;
-27   }
-28 }
- -
- ------------------------------------------------------------------------- - -
- -Next we create the registry file which will register our new method. - -
- -Example 16.6: Custom v4\_1 web service registry - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2     require_once 'service/v4_1/registry.php';
- 3     class registry_v4_1_custom extends registry_v4_1
- 4     {
- 5         protected function registerFunction()
- 6         {
- 7             parent::registerFunction();
- 8             $this->serviceClass->registerFunction('write_log_message',
- 9                                                   array(
-10                                                     'session'=>'xsd:string',
-11                                                     'message'=>'xsd:string'),
-12                                                   array(
-13                                                     'return'=>'xsd:boolean')
-14                                                   );
-15         }
-16     }
- -
- ------------------------------------------------------------------------- - -
- -Finally we create the entry point. This is the actual file that will be -called by our API clients. This will reference the two files which we -have created and will call the webservice implementation with our files. - -
- -Example 16.7: Custom v4\_1 REST Entry point - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2 chdir('../../..');
- 3
- 4 require_once 'SugarWebServiceImplv4_1_custom.php';
- 5
- 6 $webservice_path = 'service/core/SugarRestService.php';
- 7 $webservice_class = 'SugarRestService';
- 8 $webservice_impl_class = 'SugarWebServiceImplv4_1_custom';
- 9 $registry_path = 'custom/service/v4_1_custom/registry.php';
-10 $registry_class = 'registry_v4_1_custom';
-11 $location = 'custom/service/v4_1_custom/rest.php';
-12
-13 require_once 'service/core/webservice.php';
- -
- ------------------------------------------------------------------------- - -
- -
- -Example 16.8: Custom v4\_1 SOAP Entry point - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2 chdir('../../..');
- 3 require_once('SugarWebServiceImplv4_1_custom.php');
- 4 $webservice_class = 'SugarSoapService2';
- 5 $webservice_path = 'service/v2/SugarSoapService2.php';
- 6 $webservice_impl_class = 'SugarWebServiceImplv4_1_custom';
- 7 $registry_class = 'registry_v4_1_custom';
- 8 $registry_path = 'custom/service/v4_1_custom/registry.php';
- 9 $location = 'custom/service/v4_1_custom/soap.php';
-10 require_once('service/core/webservice.php');
- -
- ------------------------------------------------------------------------- - -
- -#### Usage - -We can now use our custom endpoint. This is identical to using the API -as detailed above, except that we use our custom entry point for either -the SOAP WSDL or REST URL. For example using the same SuiteCRM location -(example.com/suitecrm) as the above examples and using -v4\_1, we would use the following - -
- -Example 16.9: Custom v4\_1 URLS - ------------------------------------------------------------------------- - -
- -
1 //SOAP WSDL
-2 example.com/suitecrm/custom/service/v4_1_custom/soap.php?wsdl
-3 //REST URL
-4 example.com/suitecrm/custom/service/v4_1_custom/rest.php
- -
- ------------------------------------------------------------------------- - -
- - diff --git a/_source/developer-old/chap17.md b/_source/developer-old/chap17.md deleted file mode 100644 index 144cf6b80..000000000 --- a/_source/developer-old/chap17.md +++ /dev/null @@ -1,213 +0,0 @@ ---- -title: Best Practices -weight: 17 ---- - -### Development instances - -When making changes you should always use a development or test instance -first. This allows you to fully and safely test any changes. - -### Version control - -When developing customisations it is prudent to use some form of version -control. Version control allows tracking changes to your codebase in -addition to rolling back changes. There are many version control systems -available. SuiteCRM uses \[http://git-scm.com/ Git\] although I also -like \[http://mercurial.selenic.com/ Mercurial\]. - -If you are using a development instance (as mentioned above) then -Version Control usually allows you to push changes to other versions or -to tag releases. This provides a way of pushing changes to live or test -instances safely. Crucially it also means that, should there be major -problems with a version then this can be easily rolled back. - -### Backup - -SuiteCRM has been developed to be customisable. However, mistakes, bugs -and other unpleasantness can (and thanks to Murphy’s law, will) happen. -You should always ensure, before making any changes, that you have a -backup of all files and of the database. - -In order to back up files you can simply create a zip of the SuiteCRM -directory and copy it to a safe place. On Linux systems this can be -performed using the following: - -
- -Example 17.1: File backup - ------------------------------------------------------------------------- - -
- -
tar -czvf suitecrmfilebackup.tar.gz /path/to/suitecrm
- -
- ------------------------------------------------------------------------- - -
- -Backing up the SuiteCRM database will vary depending on which database -you are using. However MySQL backups can be performed using the -mysqldump command on Linux as seen here: - -
- -Example 17.2: MySQL Database backup - ------------------------------------------------------------------------- - -
- -
mysqldump suitecrmdatabase -u databaseuser -p | gzip -c | cat > suitecrm.sql.gz
- -
- ------------------------------------------------------------------------- - -
- -### Be upgrade safe - -Unless you are making changes to a custom module you should strive in -all cases to use the custom framework and make changes in the custom -folder. This ensures that, should you make a mistake, rectifying the -mistake is as simple as removing the customisation. - -However the main advantage to using custom is that, when -you upgrade SuiteCRM in the future you will not have your changes -overwritten by the updated SuiteCRM files. See the -\[\[\#chap13.xhtml\#extensions-chapter|Extensions\]\] chapter for more -information. - -### Use appropriate log levels - -Using appropriate log levels (See the chapter on -\[\[\#chap10.xhtml\#logging-chapter|Logging\]\]) makes it easier to -track down issues. You do not want very important messages to be logged -as debug since this will make them difficult to find. -Likewise you don’t want unimportant log messages cluttering up the -fatal log output. - -### Long running logic hooks - -If a logic hook task is long running then you should place it into the -job queue (see the \[\[\#chap11.xhtml\#logic-hooks-chapter|Logic -Hook\]\] and \[\[\#chap12.xhtml\#scheduled-tasks-chapter|Scheduled -Tasks\]\] chapters). - -### Minimise SQL - -Where possible you should strive to use the SuiteCRM supplied methods of -accessing data. This includes using beans and the BeanFactory where -possible (see the chapter on -\[\[\#chap02.xhtml\#working-with-beans-chapter|Working with beans\]\]). -There are a few reasons for this. The first is that SQL is usually -either hardcoded or has to be dynamically built. In the case where the -SQL is hardcoded this means that changes to fields will not be reflected -thereby making your code more brittle. - -Dynamic SQL is better because it can react to field changes and -generally be tailored to fit the situation. However this requires adding -extra, often complex, code. It can be hard to account for all situations -(this can be especially problematic when attempting to traverse -relationships dynamically). - -Another issue is that, usually SQL will end up being Database specific -(see the next point for mitigating this however). - -Finally any custom logic (such as Logic Hooks) which would usually be -fired for saving beans or relationships will not be fired for SQL -queries. - -### SQL Use - -In some cases using raw SQL is unavoidable. If that is the case then you -should strive to use standard compliant SQL. If database engine specific -features need to be used, and you wish to target other database engines, -you can check for the DB type. For example: - -
- -Example 17.1: Checking for the database engine - ------------------------------------------------------------------------- - -
- -
 1 function getSomeSQLQuery(){
- 2     global $sugar_config;
- 3     switch($sugar_config['dbconfig']['db_type']){
- 4         case 'mssql':
- 5             $sql = 'MSSQL specific SQL';
- 6             break;
- 7         case 'mysql':
- 8         default:
- 9             $sql = 'MySQL specific SQL';
-10             break;
-11     }
-12     return $sql;
-13 }
- -
- ------------------------------------------------------------------------- - -
- -### Entry check - -The majority of SuiteCRM files will start with some variation of the -following line: - -
- -Example 17.2: Entry check - ------------------------------------------------------------------------- - -
- -
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
- -
- ------------------------------------------------------------------------- - -
- -This prevents direct access to the file by ensuring that SuiteCRM has -been loaded through a valid entry point (i.e. it has been loaded through -index.php, cron.php or a custom entry point). - -### Redirect after post - -Sometimes you may have custom controller actions (see the controller -section) or custom entry points (see the -\[\[\#chap07.xhtml\#entry-point-chapter|Entry Points\]\] chapter). These -actions and entry points or other pages are usually accessed using POST. -After a POST request it is a web best practice to redirect to a -different page, especially if your page makes any changes. This prevents -the user from refreshing the page and causing a duplicate action. Within -SuiteCRM it is best to use the SugarApplication::redirect -method to redirect. This simply accepts a URL. As follows: - -
- -Example 17.3: Redirecting within SuiteCRM - ------------------------------------------------------------------------- - -
- -
SugarApplication::redirect('index.php?module=<TheModule>');
- -
- ------------------------------------------------------------------------- - -
- - diff --git a/_source/developer-old/chap18.md b/_source/developer-old/chap18.md deleted file mode 100644 index adfe32554..000000000 --- a/_source/developer-old/chap18.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -title: Performance Tweaks -weight: 18 ---- - -In most cases the performance of SuiteCRM should not be an issue. -However in the case of large datasets or systems with many users you may -notice some performance degradation. These changes can help improve -performance. - -### Server - -The server that SuiteCRM runs on is, of course, very important when it -comes to the kind of performance you can expect. A full guide on server -setup is outside the scope of this book. However there are some things -you can do to ensure that you get the best performance out of SuiteCRM. - -#### PHP - -Installing a PHP opcode cache will increase the performance of all PHP -files. These work by caching the compilation of PHP files resulting in -less work on each request. Furthermore SuiteCRM will use the caching API -of some PHP accelerators which will further increase performance. If you -are using Linux then \[http://php.net/manual/en/book.apc.php APC\] is -the usual choice. Windows users should check out -\[http://php.net/manual/en/book.wincache.php WinCache\]. - -#### MySQL - -MySQL is notorious for having small default settings. Fully optimising -MySQL is outside the scope of this book (however checkout -\[http://mysqltuner.pl mysqltuner.pl\] for a helpful Perl script which -will provide setting recommendations - note that you should be careful -when running files from an unknown source). One small change that can -make a big difference is increasing the -innodb\_buffer\_pool\_size. - -If you have migrated or imported a significant amount of data it is -possible that some tables will be fragmented. Running OPTIMIZE -TABLE tablename can increase performance. - -### Indexes - -Adding indexes on the fields of modules can improve database -performance. The core modules usually have important fields indexed. -However if you have created a new module or added new, often searched -fields to a module then these fields may benefit from being indexed. See -the \[\[\#chap03.xhtml\#vardefs-chapter|Vardef\]\] chapter for adding -indexes. - -### Config Changes - -The following are some config settings that can be used to improve -performance. Please note that in most cases you will have better -performance gains by first following the steps in previous sections. -These settings should be set in the config\_override.php file. See the -chapter on the \[\[\#chap09.xhtml\#config-chapter|Config\]\] files for -more information. - -
- -
- -
$sugar_config['developerMode'] = false;
- -
- -
- -Unless you are actively developing on an instance developerMode should -be off. Otherwise each page request will cause cached files to be -reloaded. - -
- -
- -
$sugar_config['disable_count_query'] = true;
- -
- -
- -For systems with large amounts of data the count queries on subpanels -used for the pagination controls can become slow thereby causing the -page to be sluggish or outright slow to load. Disabling these queries -can improve performance dramatically on some pages. - -
- -
- -
$sugar_config['disable_vcr'] = true;
- -
- -
- -By default opening the detail view of a record from the list view will -also load the other records in the list to allow for easy moving through -records. If you do not use this feature, or, if loading the detail view -for some records has become slow, you can disable this feature. - -
- -
- -
$sugar_config['list_max_entries_per_page'] = '10';
- -
- -
- -The number of records shown in each page of the list view can be -decreased. This will result in a slight increase in performance on list -view pages. - -
- -
- -
$sugar_config['logger']['level'] = 'fatal';
- -
- -
- -Lowering the log level means that there will be less log messages to -write to disk on each request. This will slightly (very slightly) -increase performance. - - diff --git a/_source/developer-old/chap19.md b/_source/developer-old/chap19.md deleted file mode 100644 index 83f381442..000000000 --- a/_source/developer-old/chap19.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: Further Resources -weight: 19 ---- - -Although this book has aimed to be a thorough resource, SuiteCRM is -large and feature rich. Therefore it is not possible to include all the -information you may require. Here are some extra resources for -developing with SuiteCRM. - -### SuiteCRM Website - -The SuiteCRM website (\[http://suitecrm.com SuiteCRM.com\] has many -excellent resources including: - -- \[https://suitecrm.com/forum/index SuiteCRM forums\] - come and say - hi! -- \[https://suitecrm.com/suitecrm/blog SuiteCRM Blog\] -- \[https://suitecrm.com/wiki/index.php/Main\_Page SuiteCRM Wiki\] - -### External SuiteCRM Resources - -; \[https://github.com/salesagility/SuiteCRM SuiteCRM GitHub\] -: The SuiteCRM source code is hosted on GitHub. Here you can get - bleeding edge code changes and even contribute code. - -### SugarCRM Resources - -SuiteCRM has strived to remain compatible with the SugarCRM community -edition and much of the documentation is still valid. The appropriate -version for SuiteCRM information is 6.5. Versions of documentation -higher than this (i.e. 7) will probably not be relevant. - -- \[http://support.sugarcrm.com/02\_Documentation/04\_Sugar\_Developer/ - SugarCRM Developer docs\] -- \[http://developer.sugarcrm.com/ SugarCRM Developer Blog\] - -### Technical Links - -- \[http://php.net/ PHP\] - The main language used by SuiteCRM -- \[http://www.smarty.net/ Smarty\] - The templating language used - throughout SuiteCRM. -- \[http://xdebug.org XDebug\] - Debugging/profiling extension for PHP -- \[http://git-scm.com/ Git\] - Distributed version control system -- \[http://yuilibrary.com/ YUI\] - Legacy Javascript library used in - SuiteCRM -- \[https://jquery.com/ JQuery\] - Javascript library used in - SuiteCRM - to be preferred over YUI. -- \[https://github.com/PHPMailer/PHPMailer PHPMailer\] Email library - used in SuiteCRM -- \[http://php.net/manual/en/book.apc.php APC\] - Alternative PHP - Cache. PHP Opcode cache supported by SuiteCRM -- \[http://php.net/manual/en/book.wincache.php WinCache\] - Windows - PHP cache. PHP Opcode cache supported by SuiteCRM -- \[https://www.jetbrains.com/phpstorm/ PHPStorm\] - PHP IDE (Paid) -- \[https://eclipse.org/pdt/ Eclipse PHP Development Tools\] - PHP IDE - (Free and Open Source) - -### Other Links - -- \[https://salesagility.com/ SalesAgility\] - The company behind - SuiteCRM. -- \[http://www.jsmackin.co.uk Jim Mackin\] - Me :) - - diff --git a/_source/ebooks/chap01.ml b/_source/ebooks/chap01.ml deleted file mode 100644 index 781072202..000000000 --- a/_source/ebooks/chap01.ml +++ /dev/null @@ -1,64 +0,0 @@ ---- -permalink: "/chap01.html" -layout: page -title: "Chapter 01" ---- - - -
- -## 1. Introduction ## - -### What is SuiteCRM ### - -The story of [https://www.suitecrm.com SuiteCRM] starts with SugarCRM. SugarCRM was founded in 2004 and consisted of an open source version (called Community Edition) and various paid for versions. However trouble started brewing when it appeared that SugarCRM would not be releasing a Community Edition of SugarCRM 7 and would be providing limited, if any, updates to the Community Edition. - -Enter SuiteCRM. SalesAgility forked Community Edition to create SuiteCRM and also added various open source plugins to add improved functionality. - -### This book ### - -This book is intended for developers who are familiar (or at least acquainted) with using SuiteCRM but want to perform their own customisations. SuiteCRM is a large and mature piece of software so it is impractical for a book to cover all aspects of the software. I’ve tried to add the most important parts which should allow you to make the changes you need in 99% of situations. There is a further resources chapter at the end of this book to help out in those 1% of cases. With that being said if you feel there is anything important I have left out (or worse, anything incorrect in the book) please let me know. I can be contacted at [http://www.jsmackin.co.uk JSMackin.co.uk]. - -### Reading this book ### - -Each chapter in this book is intended to be self contained so the reader can jump to interesting chapters. Where there is some overlap this is usually indicated with links to the relevant chapters. - -Some parts of this book may refer to file paths or other parts of code that can have a variable value, for example controller names contain the module name or a file with an arbitrary name. In this case these will be marked in the form <TheModuleName>, <TheFileName> or something else suitable. In these cases you can substitute something appropriate (such as Accounts or MyNewFile). - -### Setting up SuiteCRM ### - -In this book we’ll be using SuiteCRM v7.1.5 which is the latest at time of writing. For up to date versions of the installation instructions see the SuiteCRM wiki at [https://suitecrm.com/wiki/index.php/Installation suitecrm.com/wiki/index.php/Installation]. - -#### Website #### - -The SuiteCRM installer can be found at [https://suitecrm.com/ SuiteCRM.com]. I would recommend SuiteCRM MAX as I prefer to start with a full interface and customise it as needed. - -#### GitHub #### - -SuiteCRM is also available on [http://github.com GitHub] at [https://github.com/salesagility/SuiteCRM github.com/salesagility/SuiteCRM]. Each SuiteCRM version is tagged so you can easily grab the version you need. - -### Initial Tweaks ### - -After the initial install there are a few tweaks you may want to make on an instance you are developing on. These changes should improve your development flow and productivity as well as help identify issues if they occur. - -#### Developer Mode #### - -SuiteCRM will cache various files that it processes, such as Smarty templates. Developer mode will turn off some of the caching so that changes to files will be seen immediately (though this isn’t always the case - as is the case with [[#chap13.xhtml#extensions-chapter|extensions]]). This can be enabled either through the config file or via the General settings page inside admin. - -#### Log Level #### - -The default log level of SuiteCRM is fatal. This is a good default for production instances but you may want to increase the log level to info or debug. This will make the log output more verbose so, should anything go wrong, you’ll have something to refer to. See the [[#chap10.xhtml#logging-chapter|chapter on logging]] for more information. - -#### Display errors #### - -You’ll also want to turn off display errors. Unfortunately at the moment SuiteCRM has various notices and warnings out of the box. With display_errors on this can sometimes cause AJAX pages and the link to break. - -With this being said you should be checking the PHP error logs or selectively enabling
-display_errors to ensure that the code you are creating is not creating additional notices, warnings or errors. - -#### XDebug #### - -[http://xdebug.org XDebug] is a PHP extension which provides profiling and debugging capabilities to PHP. This can massively improve developer productivity by simplifying development and, particularly, tracking down any issues. See the XDebug site for information on XDebug. - - -
diff --git a/_source/ebooks/chap02.ml b/_source/ebooks/chap02.ml deleted file mode 100644 index a105b4ccd..000000000 --- a/_source/ebooks/chap02.ml +++ /dev/null @@ -1,44 +0,0 @@ ---- -permalink: "/chap02.html" -layout: page -title: "Chapter 02" ---- - - -
- -## 2. SuiteCRM Directory Structure ## - -; cache -: Contains cache files used by SuiteCRM including compiled smarty templates, grouped vardefs, minified and grouped JavaScript. Some modules and custom modules may also store (temporary) module specific info here. -; custom -: Contains user and developer customisations to SuiteCRM. Also contains some SuiteCRM code to maintain compatibility with SugarCRM. However this is likely to change in the future. -; data -: Stores the classes and files used to deal with SugarBeans and their relationships. -; examples -: Contains a few basic examples of lead capture and API usage. However these are very outdated. -; include -: Contains the bulk of non module and non data SuiteCRM code. -; install -: Code used by the SuiteCRM installer. -; jssource -: The jssource folder contains the unminified source of some of the JavaScript files used within SuiteCRM. -; metadata -: Stores relationship metadata for the various stock SuiteCRM modules. This should not be confused with module metadata which contains information on view, dashlet and search definitions. -; mobile -: Stores code for the [http://www.quickcrm.fr QuickCRM] mobile app. -; ModuleInstall -: Code for the module installer. -; modules -: Contains the code for any stock or custom SuiteCRM modules. -; service -: Code for the SuiteCRM Soap and REST APIs. -; themes -: Code, data and images for the bundled SuiteCRM theme. -; upload -: The upload folder contains documents that have been uploaded to SuiteCRM. The names of the files comes from the ID of the matching Document Revision/Note. upload/upgrades will also contain various upgrade files and the packages of installed modules. -; log4php, soap, XTemplate, Zend -: Source code for various libraries used by SuiteCRM some of which are deprecated. - - -
diff --git a/_source/ebooks/chap03.ml b/_source/ebooks/chap03.ml deleted file mode 100644 index 586b6a72c..000000000 --- a/_source/ebooks/chap03.ml +++ /dev/null @@ -1,601 +0,0 @@ ---- -permalink: "/chap03.html" -layout: page -title: "Chapter 03" ---- - - -
- -## 3. Working with Beans ## - -Beans are the Model in SuiteCRM’s MVC (Model View Controller) architecture. They allow retrieving data from the database as objects and allow persisting and editing records. This section will go over the various ways of working with beans. - -### BeanFactory ### - -The BeanFactory allows dynamically loading bean instances or creating new records. For example to create a new bean you can use: - -
- -Example 3.1: Creating a new Bean using the BeanFactory - - ------ - -
- -
1 $bean = BeanFactory::newBean('<TheModule>');
-2 //For example a new account bean:
-3 $accountBean = BeanFactory::newBean('Accounts');
- -
- ------ - - -
-Retrieving an existing bean can be achieved in a similar manner: - -
- -Example 3.2: Retrieving a bean with the BeanFactory - - ------ - -
- -
1 $bean = BeanFactory::getBean('<TheModule>', $beanId);
-2 //For example to retrieve an account id
-3 $bean = BeanFactory::getBean('Accounts', $beanId);
- -
- ------ - - -
-getBean will return an unpopulated bean object if $beanId is not supplied or if there’s no such record. Retrieving an unpopulated bean can be useful if you wish to use the static methods of the bean (for example see the Searching for Beans section). To deliberately retrieve an unpopulated bean you can omit the second argument of the getBean call. I.e. - -
- -Example 3.3: Retrieving an unpopulated bean - - ------ - -
- -
1 $bean = BeanFactory::getBean('<TheModule>');
- -
- ------ - - -
-{| -|width="50%"| [[File:images/leanpub_warning.png|50px|class=sidebar-image|warning]] -|width="50%"| BeanFactory::getBean caches ten results. This can cause odd behaviour if you call getBean again and get a cached copy. Any calls that return a cached copy will return the same instance. This means changes to one of the beans will be reflected in all the results. -|} - -Using BeanFactory ensures that the bean is correctly set up and the necessary files are included etc. - -### SugarBean ### - -The SugarBean is the parent bean class and all beans in SuiteCRM extend this class. It provides various ways of retrieving and interacting with records. - -### Searching for beans ### - -The following examples show how to search for beans using a bean class. The examples provided assume that an account bean is available names $accountBean. This may have been retrieved using the getBean call mentioned in the BeanFactory section e.g. - -
- -Example 3.4: Retrieving an unpopulated account bean - - ------ - -
- -
$accountBean = BeanFactory::getBean('Accounts');
- -
- ------ - - -
-#### get_list #### - -The get_list method allows getting a list of matching beans and allows paginating the results. - -
- -Example 3.5: get_list method signature - - ------ - -
- -
1 get_list(
-2     $order_by = "",
-3     $where = "",
-4     $row_offset = 0,
-5     $limit=-1,
-6     $max=-1,
-7     $show_deleted = 0)
- -
- ------ - - -
-; $order_by -: Controls the ordering of the returned list. $order_by is specified as a string that will be used in the SQL ORDER BY clause e.g. to sort by name you can simply pass name, to sort by date_entered descending use date_entered DESC. You can also sort by multiple fields. For example sorting by date_modified and id descending date_modified, id DESC. -; $where -: Allows filtering the results using an SQL WHERE clause. $where should be a string containing the SQL conditions. For example in the contacts module searching for contacts with specific first names we might use contacts.first_name='Jim'. Note that we specify the table, the query may end up joining onto other tables so we want to ensure that there is no ambiguity in which field we target. -; $row_offset -: The row to start from. Can be used to paginate the results. -; $limit -: The maximum number of records to be returned by the query. -1 means no limit. -; $max -: The maximum number of entries to be returned per page. -1 means the default max (usually 20). -; $show_deleted -: Whether to include deleted results. - -####= Results ####= - -get_list will return an array. This will contain the paging information and will also contain the list of beans. This array will contain the following keys: - -; list -: An array of the beans returned by the list query -; row_count -: The total number of rows in the result -; next_offset -: The offset to be used for the next page or -1 if there are no further pages. -; previous_offset -: The offset to be used for the previous page or -1 if this is the first page. -; current_offset -: The offset used for the current results. - -####= Example ####= - -Let’s look at a concrete example. We will return the third page of all accounts with the industry Media using 10 as a page size and ordered by name. - -
- -Example 3.6: Example get_list call - - ------ - -
- -
 1 $beanList = $accountBean->get_list(
- 2                                 //Order by the accounts name
- 3                                 'name',
- 4                                 //Only accounts with industry 'Media'
- 5                                 "accounts.industry = 'Media'",
- 6                                 //Start with the 30th record (third page)
- 7                                 30,
- 8                                 //No limit - will default to max page size
- 9                                 -1,
-10                                 //10 items per page
-11                                 10);
- -
- ------ - - -
-This will return: - -
- -Example 3.7: Example get_list results - - ------ - -
- -
 1 Array
- 2 (
- 3     //Snipped for brevity - the list of Account SugarBeans
- 4     [list] => Array()
- 5     //The total number of results
- 6     [row_count] => 36
- 7     //This is the last page so the next offset is -1
- 8     [next_offset] => -1
- 9     //Previous page offset
-10     [previous_offset] => 20
-11     //The offset used for these results
-12     [current_offset] => 30
-13 )
- -
- ------ - - -
-#### get_full_list #### - -get_list is useful when you need paginated results. However if you are just interested in getting a list of all matching beans you can use get_full_list. The get_full_list method signature looks like this: - -
- -Example 3.8: get_full_list method signature - - ------ - -
- -
1 get_full_list(
-2             $order_by = "",
-3             $where = "",
-4             $check_dates=false,
-5             $show_deleted = 0
- -
- ------ - - -
-These arguments are identical to their usage in get_list the only difference is the $check_dates argument. This is used to indicate whether the date fields should be converted to their display values (i.e. converted to the users date format). - -####= Results ####= - -The get_full_list call simply returns an array of the matching beans - -####= Example ####= - -Let’s rework our get_list example to get the full list of matching accounts: - -
- -Example 3.9: Example get_full_list call - - ------ - -
- -
1 $beanList = $accountBean->get_full_list(
-2                                 //Order by the accounts name
-3                                 'name',
-4                                 //Only accounts with industry 'Media'
-5                                 "accounts.industry = 'Media'"
-6                                 );
- -
- ------ - - -
-#### retrieve_by_string_fields #### - -Sometimes you only want to retrieve one row but may not have the id of the record. retrieve_by_string_fields allows retrieving a single record based on matching string fields. - -
- -Example 3.10: retrieve_by_string_fields method signature - - ------ - -
- -
1 retrieve_by_string_fields(
-2                           $fields_array,
-3                           $encode=true,
-4                           $deleted=true)
- -
- ------ - - -
-; $fields_array -: An array of field names to the desired value. -; $encode -: Whether or not the results should be HTML encoded. -; $deleted -: Whether or not to add the deleted filter. - -{| -|width="50%"| [[File:images/leanpub_warning.png|50px|class=sidebar-image|warning]] -|width="50%"| Note here that, confusingly, the deleted flag works differently to the other methods we have looked at. It flags whether or not we should filter out deleted results. So if true is passed then the deleted results will ''not'' be included. -|} - -####= Results ####= - -retrieve_by_string_fields returns a single bean as it’s result or null if there was no matching bean. - -####= Example ####= - -For example to retrieve the account with name Tortoise Corp and account_type Customer we could use the following: - -
- -Example 3.11: Example retrieve_by_string_fields call - - ------ - -
- -
1 $beanList = $accountBean->retrieve_by_string_fields(
-2                                 array(
-3                                   'name' => 'Tortoise Corp',
-4                                   'account_type' => 'Customer'
-5                                 )
-6                               );
- -
- ------ - - -
-### Accessing fields ### - -If you have used one of the above methods we now have a bean record. This bean represents the record that we have retrieved. We can access the fields of that record by simply accessing properties on the bean just like any other PHP object. Similarly we can use property access to set the values of beans. Some examples are as follows: - -
- -Example 3.12: Accessing fields examples - - ------ - -
- -
 1 //Get the Name field on account bean
- 2 $accountBean->name;
- 3 
- 4 //Get the Meeting start date
- 5 $meetingBean->date_start;
- 6 
- 7 //Get a custom field on a case
- 8 $caseBean->third_party_code_c;
- 9 
-10 //Set the name of a case
-11 $caseBean->name = 'New Case name';
-12 
-13 //Set the billing address post code of an account
-14 $accountBean->billing_address_postalcode = '12345';
- -
- ------ - - -
-When changes are made to a bean instance they are not immediately persisted. We can save the changes to the database with a call to the beans save method. Likewise a call to save on a brand new bean will add that record to the database: - -
- -Example 3.13: Persisting bean changes - - ------ - -
- -
 1 //Get the Name field on account bean
- 2 $accountBean->name = 'New account name';
- 3 //Set the billing address post code of an account
- 4 $accountBean->billing_address_postalcode = '12345';
- 5 //Save both changes.
- 6 $accountBean->save();
- 7 
- 8 //Create a new case (see the BeanFactory section)
- 9 $caseBean = BeanFactory::newBean('Cases');
-10 //Give it a name and save
-11 $caseBean->name = 'New Case name';
-12 $caseBean->save();
- -
- ------ - - -
-{| -|width="50%"| [[File:images/leanpub_info-circle.png|50px|class=sidebar-image|information]] -|width="50%"| Whether to save or update a bean is decided by checking the id field of the bean. If id is set then SuiteCRM will attempt to perform an update. If there is no id then one will be generated and a new record will be inserted into the database. If for some reason you have supplied an id but the record is new (perhaps in a custom import script) then you can set new_with_id to true on the bean to let SuiteCRM know that this record is new. -|} - -### Related beans ### - -We have seen how to save single records but, in a CRM system, relationships between records are as important as the records themselves. For example an account may have a list of cases associated with it, a contact will have an account that it falls under etc. We can get and set relationships between beans using several methods. - -#### get_linked_beans #### - -The get_linked_beans method allows retrieving a list of related beans for a given record. - -
- -Example 3.14: get_linked_beans method signature - - ------ - -
- -
1 get_linked_beans(
-2                 $field_name,
-3                 $bean_name,
-4                 $sort_array = array(),
-5                 $begin_index = 0,
-6                 $end_index = -1,
-7                 $deleted=0,
-8                 $optional_where="");
- -
- ------ - - -
-; $field_name -: The link field name for this link. Note that this is not the same as the name of the relationship. If you are unsure of what this should be you can take a look into the cached vardefs of a module in cache/modules/<TheModule>/<TheModule>Vardefs.php for the link definition. -; $bean_name -: The name of the bean that we wish to retrieve. -; $sort_array -: This is a legacy parameter and is unused. -; $begin_index -: Skips the initial $begin_index results. Can be used to paginate. -; $end_index -: Return up to the $end_index result. Can be used to paginate. -; $deleted -: Controls whether deleted or non deleted records are shown. If true only deleted records will be returned. If false only non deleted records will be returned. -; $optional_where -: Allows filtering the results using an SQL WHERE clause. See the get_list method for more details. - -####= Results ####= - -get_linked_beans returns an array of the linked beans. - -####= Example ####= - -
- -Example 3.15: Example get_linked_beans call - - ------ - -
- -
1 $accountBean->get_linked_beans(
-2                 'contacts',
-3                 'Contacts',
-4                 array(),
-5                 0,
-6                 10,
-7                 0,
-8                 "contacts.primary_address_country = 'USA'");
- -
- ------ - - -
-#### relationships #### - -In addition to the get_linked_beans call you can also load and access the relationships more directly. - -####= Loading ####= - -Before accessing a relationship you must use the load_relationship call to ensure it is available. This call takes the link name of the relationship (not the name of the relationship). As mentioned previously you can find the name of the link in cache/modules/<TheModule>/<TheModule>Vardefs.php if you’re not sure. - -
- -Example 3.16: Loading a relationship - - ------ - -
- -
1 //Load the relationship
-2 $accountBean->load_relationship('contacts');
-3 //Can now call methods on the relationship object:
-4 $contactIds = $accountBean->contacts->get();
- -
- ------ - - -
-####= Methods ####= - -###### get ###### - -Returns the ids of the related records in this relationship e.g for the account - contacts relationship in the example above it will return the list of ids for contacts associated with the account. - -###### getBeans ###### - -Similar to get but returns an array of beans instead of just ids. - -{| -|width="50%"| [[File:images/leanpub_warning.png|50px|class=sidebar-image|warning]] -|width="50%"| getBeans will load the full bean for each related record. This may cause poor performance for relationships with a large number of beans. -|} - -###### add ###### - -Allows relating records to the current bean. add takes a single id or bean or an array of ids or beans. If the bean is available this should be used since it prevents reloading the bean. For example to add a contact to the relationship in our example we can do the following: - -
- -Example 3.18: Adding a new contact to a relationship - - ------ - -
- -
 1 //Load the relationship
- 2 $accountBean->load_relationship('contacts');
- 3 
- 4 //Create a new demo contact
- 5 $contactBean = BeanFactory::newBean();
- 6 $contactBean->first_name = 'Jim';
- 7 $contactBean->last_name = 'Mackin';
- 8 $contactBean->save();
- 9 
-10 //Link the bean to $accountBean
-11 $accountBean->contacts->add($contactBean);
- -
- ------ - - -
-###### delete ###### - -delete allows unrelating beans. Counter-intuitively it accepts the ids of both the bean and the related bean. For the related bean you should pass the bean if it is available e.g when unrelating an account and contact: - -
- -Example 3.19: Removing a new contact from a relationship - - ------ - -
- -
1 //Load the relationship
-2 $accountBean->load_relationship('contacts');
-3 
-4 //Unlink the contact from the account - assumes $contactBean is a Contact SugarB\
-5 ean
-6 $accountBean->contacts->delete($accountBean->id, $contactBean);
- -
- ------ - - -
-{| -|width="50%"| [[File:images/leanpub_warning.png|50px|class=sidebar-image|warning]] -|width="50%"| Be careful with the delete method. Omitting the second argument will cause all relationships for this link to be removed. -|} - - -
diff --git a/_source/ebooks/chap04.ml b/_source/ebooks/chap04.ml deleted file mode 100644 index 5bb30cec5..000000000 --- a/_source/ebooks/chap04.ml +++ /dev/null @@ -1,334 +0,0 @@ ---- -permalink: "/chap04.html" -layout: page -title: "Chapter 04" ---- - - -
- -## 4. Vardefs ## - -### What are Vardefs ### - -The Vardefs are used to supply information to SuiteCRM about a particular bean. These generally specify the fields, relationships and indexes in a given module as well as additional information such as whether it is audited, the table name etc. - -### Defining Vardefs ### - -#### Module #### - -Vardefs are initially defined in their respective modules folder. For the Accounts module this will be in modules/Accounts/vardefs.php. The information is stored in an array named $dictionary using the module name as the key. For Accounts this will be $dictionary['Account']. Let’s look at the Account vardefs (which have been edited for brevity): - -
- -Example 4.1: Account Vardefs - - ------ - -
- -
 1 $dictionary['Account'] =
- 2 array(
- 3 	'table' => 'accounts',
- 4 	'audited'=>true,
- 5 	'unified_search' => true,
- 6 	'unified_search_default_enabled' => true,
- 7 	'duplicate_merge'=>true,
- 8 	'comment' => 'Accounts are organizations or entities that ...',
- 9 	'fields' => array (
-10 	  //Snipped for brevity. See the fields section.
-11 	),
-12 	'indices' => array (
-13 	  //Snipped for brevity. See the indices section.
-14 	),
-15 	'relationships' => array (
-16 	  //Snipped for brevity. See the relationship section.
-17 	),
-18 	//This enables optimistic locking for Saves From EditView
-19 	'optimistic_locking'=>true,
-20 );
-21 
-22 VardefManager::createVardef(
-23 	'Accounts',
-24 	'Account',
-25 	array('default', 'assignable','company',)
-26 );
- -
- ------ - - -
-####= Keys ####= - -The following are some of the keys that can be specified for the vardefs. Fields, indices and relationships are covered in their own sections. - -; table -: The database table name for this module. -; audited -: Whether or not this module should be audited. Note that audited must also be set at the fields level for a field to be audited. -; unified_search -: Whether this module can be searchable via the global search. -; unified_search_default_enabled -: Whether this module is searchable via the global search by default. -; duplicate_merge -: Whether or not duplicate merging functionality is enabled for this module. -; comment -: A description of this module. -; optimistic_locking -: Whether optimistic should be enabled for this module. Optimistic locking locks concurrent edits on a record by assuming that there will be no conflict. On save the last modified timestamp on the record will be checked. If it is different then an edit has occurred since this record was loaded. If this is the case then the user will be prompted with a page showing the differences in the two edits and asked to choose which edits are to be used. - -####= Fields ####= - -The field defines the behaviour and attributes of each field in the module. - -; name -: The name of the field. -; vname -: The name of the language label to be used for this field. -; type -: The type of the field. See the field types section. -; isnull -: Whether null values are allowed -; len -: If the field is a string type, the max number of characters allowed. -; options -: For enum fields the language label for the dropdown values for this field -; dbtype -: The type to be used by the database to store this field. This is not required as the appropriate type is usually chosen. -; default -: The default value of this field. -; massupdate -: Whether or not this field should be mass updatable. Note that some field types are always restricted from mass updates. -; rname -: For related fields only. The name of the field to be taken from the related module. -; id_name -: For related fields only. The field in this bean which contains the related id. -; source -: The source of this field. Can be set to ‘non-db’ if the field is not stored in the database - for example for link fields, fields populated by logic hooks or by other means. -; sort_on -: For concatenated fields (i.e. name fields) the field which should be used to sort. -; fields -: For concatenated fields (i.e. name fields) an array of the fields which should be concatenated. -; db_concat_fields -: For concatenated fields (i.e. name fields) an array of the fields which should be concatenated in the database. Usually this is the same as fields. -; unified_search -: True if this field should be searchable via the global search. -; enable_range_search -: Whether the list view search should allow a range search of this field. This is used for date and numeric fields. -; studio -: Whether the field should display in studio. -; audited -: Whether or not changes to this field should be audited. - -####= Field types ####= - -The following are common field types used: - -; id -: An id field. -; name -: A name field. This is usually a concatenation of other fields. -; bool -: A boolean field. -; varchar -: A variable length string field. -; char -: A character field. -; text -: A text area field. -; decimal -: A decimal field. -; date -: A date field. -; datetime -: A date and time field. -; enum -: A dropdown field. -; phone -: A phone number field. -; link -: A link to another module via a relationship. -; relate -: A related bean field. - -####= Indices ####= - -The indices array allows defining any database indexes that should be in place on the database table for this module. Let’s look at an example: - -
- -Example 4.2: Example indices definition - - ------ - -
- -
 1 'indices' => array (
- 2 	array(
- 3 		'name' =>'idx_mymod_id_del',
- 4 		'type' =>'index',
- 5 		'fields'=>array('id', 'deleted')),
- 6 	array(
- 7 		'name' =>'idx_mymod_parent_id',
- 8 		'type' =>'index',
- 9 		'fields'=>array( 'parent_id')),
-10 	array(
-11 		'name' =>'idx_mymod_parent_id',
-12 		'type' =>'unique',
-13 		'fields'=>array( 'third_party_id')),
-14 	),
- -
- ------ - - -
-Each array entry should have, at least, the following entries: - -; name -: The name of the index. This is usually used by the database to reference the index. Most databases require that these are unique. -; type -: The type of the index to create. index will simply add an index on the fields, unique will add a unique constraint on the fields, primary will add the fields as a primary key. -; fields -: An array of the fields to be indexed. The order of this array will be used as the order of the fields in the index. - -####= Relationships ####= - -The Vardefs also specify the relationships within this module. Here’s an edited example from the Accounts module: - -
- -Example 4.3: Example relationships definition - - ------ - -
- -
 1 'relationships' => array (
- 2 	'account_cases' => array(
- 3 		'lhs_module'=> 'Accounts',
- 4 		'lhs_table'=> 'accounts',
- 5 		'lhs_key' => 'id',
- 6 		'rhs_module'=> 'Cases',
- 7 		'rhs_table'=> 'cases',
- 8 		'rhs_key' => 'account_id',
- 9 		'relationship_type' => 'one-to-many'),
-10 ),
- -
- ------ - - -
-Here we see the link between accounts and cases. This is specified with the following keys: - -; lhs_module -: The module on the left hand side of this relationship. For a one to many relationship this will be the “One” side. -; lhs_table -: The table for the left hand side module. If you are unsure the table for a module can be found in it’s vardefs. -; lhs_key -: The field to use for the left hand side of this link. In this case it is the id of the account. -; rhs_module -: The right hand side module. In this case the “many” side of the relationship. -; rhs_table -: The table for the right hand side module. As stated previously you can find the table for a module can be found in it’s vardefs. -; rhs_key -: The field to use on the right hand side. In this case the account_id field on cases. -; relationship_type -: The type of relationship - “one-to-many” or “many-to-many”. Since this is a one to many relationship it means a case is related to a single account but a single account can have multiple cases. - -For many to many relationship fields the following keys are also available: - -; join_table -: The name of the join table for this relationship. -; join_key_lhs -: The name of the field on the join table for the left hand side. -; join_key_rhs -: The name of the field on the join table for the right hand side. - -#### Vardef templates #### - -Vardef templates provide a shortcut for defining common vardefs. This is done by calling VardefManager::createVardef and passing the module name, object name and an array of templates to be assigned. The following is an example from the accounts vardefs: - -
- -Example 4.4: Example vardef template - - ------ - -
- -
22 VardefManager::createVardef(
-23 		'Accounts',
-24 		'Account',
-25 		array('default', 'assignable','company',)
-26 		);
- -
- ------ - - -
-In this example the default, assignable and company templates are used. The following are some of the available templates: - -; basic
-default -: Adds the common base fields such as id, name, date_entered, etc. -; assignable -: Adds the fields and relationships necessary to assign a record to a user. -; person -: Adds fields common to people records such as first_name, last_name, address, etc. -; company -: Adds fields common to companies such as an industry dropdown, address, etc. - -#### Customising vardefs #### - -Vardefs can be customised by adding a file into - -
- -Example 4.5: Custom vardef location - - ------ - -
- -
custom/Extension/modules/<TheModule>/Ext/SomeFile.php
- -
- ------ - - -
-This file can then be used to add a new field definition or customise an existing one e.g changing a field type: - -
- -Example 4.6: Example overriding an existing vardef - - ------ - -
- -
$dictionary["TheModule"]["fields"]["some_field"]['type'] = 'int';
- -
- ------ - - -
- -
diff --git a/_source/ebooks/chap05.ml b/_source/ebooks/chap05.ml deleted file mode 100644 index e5e01a2ae..000000000 --- a/_source/ebooks/chap05.ml +++ /dev/null @@ -1,185 +0,0 @@ ---- -permalink: "/chap05.html" -layout: page -title: "Chapter 05" ---- - - -
- -## 5. Views ## - -SuiteCRM follows the MVC (Model-View-Controller) pattern and as such has the concept of views. Views are responsible for gathering and displaying data . There are a number of default views in SuiteCRM. These include - -; ListView -: Displays a list of records and provides links to the EditViews and DetailViews of those records. The ListView also allows some operations such as deleting and mass updating records. This is (usually) the default view for a module. -; DetailView -: Displays the details of a single record and also displays subpanels of related records. -; EditView -: The EditView allows editing the various fields of a record and provides validation on these values. - -### Location ### - -Views can be found in modules/<TheModule>/views/ or, for custom views,
-custom/modules/<TheModule>/views/, and are named in the following format: view.<viewname>.php. For example, the Accounts DetailView can be found in modules/Accounts/views/view.detail.php with a customised version in custom/modules/Accounts/views/view.detail.php. The custom version is used if it exists. If it doesn’t then the module version is used. Finally, if neither of these exist then the SuiteCRM default is used in include/MVC/View/views/. - -### Customising ### - -In order to customise a View we first need to create the appropriate view file. This will vary depending on the module we wish to target. - -#### Custom module #### - -In this case we can place the file directly into our module. Create a new file (if it doesn’t exist) at modules/<TheModule>/views/view.<viewname>.php. The contents will look similar to: - -
- -Example 5.1: View for a custom module - - ------ - -
- -
1 <?php
-2 
-3 require_once 'include/MVC/View/views/view.<viewname>.php';
-4 
-5 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-6 class <TheModule>View<ViewName> extends View<ViewName>
-7 {
-8 
-9 }
- -
- ------ - - -
-A more concrete example would be for the detail view for a custom module called ABC_Vehicles: - -
- -Example 5.2: Detail view for a custom module, ABC_Vehicles - - ------ - -
- -
1 <?php
-2 
-3 require_once 'include/MVC/View/views/view.detail.php';
-4 
-5 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-6 class ABC_VehiclesViewDetail extends ViewDetail
-7 {
-8 
-9 }
- -
- ------ - - -
-#### Preexisting modules #### - -For preexisting modules you will want to add the view to
-custom/modules/<TheModule>/views/view.<viewname>.php. - -The contents of this file will vary depending on whether you wish to extend the existing view (if it exists) or create your own version completely. It is usually best to extend the existing view, since this will retain important logic. Note the naming convention here. We name the class
-Custom<TheModule>View<ViewName> (for example CustomAccountsViewDetail). - -Here we don’t extend the existing view or no such view exists: - -
- -Example 5.3: Custom view for an existing module - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 
-4 require_once 'include/MVC/View/views/view.<viewname>.php';
-5 
-6 class Custom<TheModule>View<ViewName> extends ViewDetail
-7 {
-8 
-9 }
- -
- ------ - - -
-Otherwise we extend the existing view. Note that we are requiring the existing view: - -
- -Example 5.4: Overriding a view for an existing module - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 
-4 require_once 'modules/<TheModule>/views/view.<viewname>.php';
-5 
-6 class Custom<TheModule>View<ViewName> extends <TheModule>View<ViewName>
-7 {
-8 
-9 }
- -
- ------ - - -
-For example, overriding the List View of Accounts: - -
- -Example 5.5: Overriding the Accounts List View - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 
-4 require_once 'modules/Accounts/views/view.list.php';
-5 
-6 class CustomAccountsViewList extends AccountsViewList
-7 {
-8 
-9 }
- -
- ------ - - -
-#### Making changes #### - -Now that we have a custom view what can we actually do? The views have various methods which we can now override to change/add behaviour. The most common ones to override are: - -; preDisplay -: Explicitly intended to allow logic to be called before display() is called. This can be used to alter arguments to the list view or to output anything to appear before the main display code (such as, for example, adding JavaScript). -; display -: Does the actual work of displaying the view. Can be overridden to alter this behaviour or to output anything after the main display. You usually want to call parent::display(); to ensure that the display code is run (unless, of course, you are adding your own display logic). - - -
diff --git a/_source/ebooks/chap06.ml b/_source/ebooks/chap06.ml deleted file mode 100644 index 25e9c5542..000000000 --- a/_source/ebooks/chap06.ml +++ /dev/null @@ -1,743 +0,0 @@ ---- -permalink: "/chap06.html" -layout: page -title: "Chapter 06" ---- - - -
- -## 6. Metadata ## - -### Intro ### - -Module metadata are used to describe how various views behave in the module. The main use of this is providing field and layout information but this can also be used to filter subpanels and to describe what fields are used in the search. - -### Location ### - -Module metadata can be found in: - -
- -Example 6.1: Module metadata location - - ------ - -
- -
modules/<TheModule>/metadata/
- -
- ------ - - -
-### Customising ### - -Usually studio is the best way of customising metadata. Even when you do wish to make customisations that are not possible through studio it can be simpler to set everything up in studio first. This is particularly true for layout based metadata. However if you are customising metadata it is as simple as placing, or editing, the file in the custom directory. For example to override the Accounts detailviewdefs (found in modules/Accounts/metadata/detailviewdefs.php) we would place (or edit) the file in custom/modules/Accounts/metadata/detailviewdefs.php. One exception to this rule is the studio.php file. The modules metadata folder is the only location checked - any version in custom/<TheModule>/metadata/studio.php is ignored. - -### Different metadata ### - -#### detailviewdefs.php #### - -detailviewdefs.php provides information on the layout and fields of the detail view for this module. This file uses the same structure as editviewdefs.php. Let’s look at an example for a fictional module ABC_Vehicles: - -
- -Example 6.2: DetailView metadata definition - - ------ - -
- -
 1 <?php
- 2 $viewdefs ['ABC_Vehicles'] ['DetailView'] = array (
- 3 	'templateMeta' => array (
- 4 		'form' => array (
- 5 			'buttons' => array (
- 6 				'EDIT',
- 7 				'DUPLICATE',
- 8 				'DELETE',
- 9 				'FIND_DUPLICATES'
-10 			)
-11 		),
-12 		'maxColumns' => '2',
-13 		'widths' => array (
-14 			array (
-15 				'label' => '10',
-16 				'field' => '30'
-17 			),
-18 			array (
-19 				'label' => '10',
-20 				'field' => '30'
-21 			)
-22 		),
-23 		'includes' => array (
-24 			array (
-25 				'file' => 'modules/ABC_Vehicles/ABC_VehiclesDetail.js'
-26 			)
-27 		)
-28 	),
-29 	'panels' => array (
-30 		'LBL_ABC_VEHICLES_INFO' => array (
-31 			array (
-32 				array (
-33 					'name' => 'name',
-34 					'comment' => 'The Name of the Vehicle',
-35 					'label' => 'LBL_NAME',
-36 				),
-37 				'reg_number'
-38 			),
-39 			array (
-40 				array (
-41 					'name' => 'type',
-42 					'label' => 'LBL_TYPE',
-43 				),
-44 				array (
-45 					'name' => 'phone_fax',
-46 					'comment' => 'The fax phone number of this company',
-47 					'label' => 'LBL_FAX'
-48 				)
-49 			),
-50 			array (
-51 				array (
-52 					'name' => 'registered_address_street',
-53 					'label' => 'LBL_REGISTERED_ADDRESS',
-54 					'type' => 'address',
-55 					'displayParams' => array (
-56 						'key' => 'registered'
-57 					)
-58 				),
-59 			),
-60 		),
-61 		'LBL_PANEL_ADVANCED' => array (
-62       array (
-63 				array (
-64 					'name' => 'assigned_user_name',
-65 					'label' => 'LBL_ASSIGNED_TO'
-66 				),
-67 				array (
-68 					'name' => 'date_modified',
-69 					'label' => 'LBL_DATE_MODIFIED',
-70 					'customCode' => '{$fields.date_modified.value} '
-71 							+ '{$APP.LBL_BY} '
-72 							+ '{$fields.modified_by_name.value}',
-73 				)
-74 			),
-75 		),
-76 	)
-77 );
-78 ?>
- -
- ------ - - -
-We see that line 2 defines an array $viewdefs['ABC_Vehicles']['DetailView'] which places a DetailView entry for the module ABC_Vehicles into $viewdefs (DetailView will be EditView or QuickCreateView as appropriate). This array has two main keys defined here: - -####= templateMeta ####= - -The templateMeta key provides information about the view in general. The ['form']['buttons'] entries define the buttons that should appear in this view. - -; maxColumns -: Defines the number of columns to use for this view. It is unusual for this to be more than 2. -; widths -: An array defining the width of the label and field for each column. -; includes -: An array of additional JavaScript files to include. This is useful for adding custom JavaScript behaviour to the page. - -####= panels ####= - -The panels entry defines the actual layout of the Detail (or Edit) view. Each entry is a new panel in the view with the key being the label for that panel. We can see in our example that we have 2 panels. One uses the label defined by the language string LBL_ABC_VEHICLES_INFO, the other uses LBL_PANEL_ADVANCED. - -Each panel has an array entry for each row, with each array containing an entry for each column. For example we can see that the first row has the following definition: - -
- -Example 6.3: DetailView metadata row definition - - ------ - -
- -
31 array(
-32 	array (
-33 		'name' => 'name',
-34 		'comment' => 'The Name of the Vehicle',
-35 		'label' => 'LBL_NAME',
-36 	),
-37 	'reg_number',
-38 ),
- -
- ------ - - -
-This has an array definition for the first row, first column and a string definition for the first row, second column. The string definition is very straightforward and simply displays the detail (or edit, as appropriate) view for that field. It will use the default label, type, etc. In our example we are displaying the field named reg_number. - -The array definition for the first row, first column is a little more complex. Each array definition must have a name value. In our example we are displaying the name field. However we also supply some other values. Values most commonly used are: - -; comment -: Used to note the purpose of the field. -; label -: The language key for this label. If the language key is not recognised then this value will be used instead (see the [[#chap08.xhtml#language-chapter|chapter on language]]). -; displayParams -: An array used to pass extra arguments for the field display. For the options and how they are used you can have a look into the appropriate field type in include/SugarFields/Fields or custom/include/SugarFields/Fields. An example is setting the size of a textarea: - -
- -Example 6.4: DetailView metadata displayParams - - ------ - -
- -
1 'displayParams' => array(
-2     'rows' => 2,
-3     'cols' => 30,
-4 ),
- -
- ------ - - -
-; customCode -: Allows supplying custom smarty code to be used for the display. The code here can include any valid smarty code and this will also have access to the current fields in this view via $fields. An example of outputing the ID field would be {$fields.id.value}. Additionally the module labels and app labels can be accessed via $MOD and $APP respectively. Finally you can use @@FIELD@@ to output the value of the field that would have been used. For example {if $someCondition}@@FIELD@@{/if} will conditionally show the field. - -#### editviewdefs.php #### - -editviewdefs.php provides information on the layout and fields of the edit view for this module. This file uses the same structure as detailviewdefs.php. Please see the information on detailviewdefs.php. - -#### listviewdefs.php #### - -The listviewdefs.php file for a module defines what fields the list view for that module will display. Let’s take a look at an example: - -
- -Example 6.5: ListView metadata definition - - ------ - -
- -
 1 $listViewDefs ['AOR_Reports'] =
- 2 array (
- 3   'NAME' =>
- 4   array (
- 5     'width' => '15%',
- 6     'label' => 'LBL_NAME',
- 7     'default' => true,
- 8     'link' => true,
- 9   ),
-10   'REPORT_MODULE' =>
-11   array (
-12     'type' => 'enum',
-13     'default' => true,
-14     'studio' => 'visible',
-15     'label' => 'LBL_REPORT_MODULE',
-16     'width' => '15%',
-17   ),
-18   'ASSIGNED_USER_NAME' =>
-19   array (
-20     'width' => '15%',
-21     'label' => 'LBL_ASSIGNED_TO_NAME',
-22     'module' => 'Employees',
-23     'id' => 'ASSIGNED_USER_ID',
-24     'default' => true,
-25   ),
-26   'DATE_ENTERED' =>
-27   array (
-28     'type' => 'datetime',
-29     'label' => 'LBL_DATE_ENTERED',
-30     'width' => '15%',
-31     'default' => true,
-32   ),
-33   'DATE_MODIFIED' =>
-34   array (
-35     'type' => 'datetime',
-36     'label' => 'LBL_DATE_MODIFIED',
-37     'width' => '15%',
-38     'default' => true,
-39   ),
-40 );
- -
- ------ - - -
-To define the list view defs we simply add a key to the $listViewDefs array. In this case we add an entry for AOR_Reports This array contains an entry for each field that we wish to show in the list view and is keyed by the upper case name of the field. For example, the REPORT_MODULE key refers to the report_module field of AOR_Reports. - -; type -: The type of the field. This can be used to override how a field is displayed. -; default -: Whether this field should be shown in the list view by default. If false then the field will appear in the available columns list in studio. -; studio -: Whether or not this field should be displayed in studio. This can be useful to ensure that a critical field is not removed. -; label -: The label to be used for this field. If this is not supplied then the default label for that field will be used. -; width -: The width of the field in the list view. Note that, although this is usually given as a percentage it is treated as a proportion. The example above has five columns with a width of 15% but these will actually be 20% since this is a ratio. - -#### popupdefs.php #### - -popupdefs.php provides information on the layout, fields and search options of the module popup that is usually used when selecting a related record. - -Let’s look at the default popupdefs.php for the Accounts module: - -
- -Example 6.6: PopupView metadata definition - - ------ - -
- -
 1 $popupMeta = array(
- 2 	'moduleMain' => 'Case',
- 3 	'varName' => 'CASE',
- 4 	'className' => 'aCase',
- 5 	'orderBy' => 'name',
- 6 	'whereClauses' =>
- 7 		array('name' => 'cases.name',
- 8 				'case_number' => 'cases.case_number',
- 9 				'account_name' => 'accounts.name'),
-10 	'listviewdefs' => array(
-11 		'CASE_NUMBER' => array(
-12 			'width' => '5',
-13 			'label' => 'LBL_LIST_NUMBER',
-14 	        'default' => true),
-15 		'NAME' => array(
-16 			'width' => '35',
-17 			'label' => 'LBL_LIST_SUBJECT',
-18 			'link' => true,
-19 	        'default' => true),
-20 		'ACCOUNT_NAME' => array(
-21 			'width' => '25',
-22 			'label' => 'LBL_LIST_ACCOUNT_NAME',
-23 			'module' => 'Accounts',
-24 			'id' => 'ACCOUNT_ID',
-25 			'link' => true,
-26 	        'default' => true,
-27 	        'ACLTag' => 'ACCOUNT',
-28 	        'related_fields' => array('account_id')),
-29 		'PRIORITY' => array(
-30 			'width' => '8',
-31 			'label' => 'LBL_LIST_PRIORITY',
-32 	        'default' => true),
-33 		'STATUS' => array(
-34 			'width' => '8',
-35 			'label' => 'LBL_LIST_STATUS',
-36 	        'default' => true),
-37 	    'ASSIGNED_USER_NAME' => array(
-38 	        'width' => '2',
-39 	        'label' => 'LBL_LIST_ASSIGNED_USER',
-40 	        'default' => true,
-41 	       ),
-42 		),
-43 	'searchdefs'   => array(
-44 	 	'case_number',
-45 		'name',
-46 		array(
-47 			'name' => 'account_name',
-48 			'displayParams' => array(
-49 				'hideButtons'=>'true',
-50 				'size'=>30,
-51 				'class'=>'sqsEnabled sqsNoAutofill'
-52 			)
-53 		),
-54 		'priority',
-55 		'status',
-56 		array(
-57 			'name' => 'assigned_user_id',
-58 			'type' => 'enum',
-59 			'label' => 'LBL_ASSIGNED_TO',
-60 			'function' => array(
-61 				'name' => 'get_user_array',
-62 				'params' => array(false))
-63 			),
-64 	  )
-65 );
- -
- ------ - - -
-The popupdefs.php specifies a $popupMeta array with the following keys: - -; moduleMain -: The module that will be displayed by this popup. -; varName -: The variable name used to store the search preferences etc. This will usually simply the upper case module name. -; className -: The class name of the SugarBean for this module. If this is not supplied then moduleMain will be used. This is only really required for classes where the class name and module name differ (such as Cases). -; orderBy -: The default field the list of records will be sorted by. -; whereClauses -: Legacy option. This is only used as a fallback when there are no searchdefs. Defines the names of fields to allow searching for and their database representation. -; listviewdefs -: The list of fields displayed in the popup list view. See listviewdefs.php. -; searchdefs -: An array of the fields that should be available for searching in the popup. See the individual search defs in the searchdefs.php section (for example the basic_search array). - -#### quickcreatedefs.php #### - -quickcreatedefs.php provides information on the layout and fields of the quick create view for this module (this is the view that appears when creating a record from a subpanel). This file uses the same structure as detailviewdefs.php. Please see the information on detailviewdefs.php. - -#### searchdefs.php #### - -The search defs of a module define how searching in that module looks and behaves. - -Let’s look at an example. - -
- -Example 6.7: Search View metadata definition - - ------ - -
- -
  1 $searchdefs ['Accounts'] = array (
-  2 	'templateMeta' => array (
-  3 		'maxColumns' => '3',
-  4 		'maxColumnsBasic' => '4',
-  5 		'widths' => array (
-  6 			'label' => '10',
-  7 			'field' => '30'
-  8 		)
-  9 	),
- 10 	'layout' => array (
- 11 		'basic_search' => array (
- 12 			'name' => array (
- 13 				'name' => 'name',
- 14 				'default' => true,
- 15 				'width' => '10%'
- 16 			),
- 17 			'current_user_only' => array (
- 18 				'name' => 'current_user_only',
- 19 				'label' => 'LBL_CURRENT_USER_FILTER',
- 20 				'type' => 'bool',
- 21 				'default' => true,
- 22 				'width' => '10%'
- 23 			)
- 24 		)
- 25 		,
- 26 		'advanced_search' => array (
- 27 			'name' => array (
- 28 				'name' => 'name',
- 29 				'default' => true,
- 30 				'width' => '10%'
- 31 			),
- 32 			'website' => array (
- 33 				'name' => 'website',
- 34 				'default' => true,
- 35 				'width' => '10%'
- 36 			),
- 37 			'phone' => array (
- 38 				'name' => 'phone',
- 39 				'label' => 'LBL_ANY_PHONE',
- 40 				'type' => 'name',
- 41 				'default' => true,
- 42 				'width' => '10%'
- 43 			),
- 44 			'email' => array (
- 45 				'name' => 'email',
- 46 				'label' => 'LBL_ANY_EMAIL',
- 47 				'type' => 'name',
- 48 				'default' => true,
- 49 				'width' => '10%'
- 50 			),
- 51 			'address_street' => array (
- 52 				'name' => 'address_street',
- 53 				'label' => 'LBL_ANY_ADDRESS',
- 54 				'type' => 'name',
- 55 				'default' => true,
- 56 				'width' => '10%'
- 57 			),
- 58 			'address_city' => array (
- 59 				'name' => 'address_city',
- 60 				'label' => 'LBL_CITY',
- 61 				'type' => 'name',
- 62 				'default' => true,
- 63 				'width' => '10%'
- 64 			),
- 65 			'address_state' => array (
- 66 				'name' => 'address_state',
- 67 				'label' => 'LBL_STATE',
- 68 				'type' => 'name',
- 69 				'default' => true,
- 70 				'width' => '10%'
- 71 			),
- 72 			'address_postalcode' => array (
- 73 				'name' => 'address_postalcode',
- 74 				'label' => 'LBL_POSTAL_CODE',
- 75 				'type' => 'name',
- 76 				'default' => true,
- 77 				'width' => '10%'
- 78 			),
- 79 			'billing_address_country' => array (
- 80 				'name' => 'billing_address_country',
- 81 				'label' => 'LBL_COUNTRY',
- 82 				'type' => 'name',
- 83 				'options' => 'countries_dom',
- 84 				'default' => true,
- 85 				'width' => '10%'
- 86 			),
- 87 			'account_type' => array (
- 88 				'name' => 'account_type',
- 89 				'default' => true,
- 90 				'width' => '10%'
- 91 			),
- 92 			'industry' => array (
- 93 				'name' => 'industry',
- 94 				'default' => true,
- 95 				'width' => '10%'
- 96 			),
- 97 			'assigned_user_id' => array (
- 98 				'name' => 'assigned_user_id',
- 99 				'type' => 'enum',
-100 				'label' => 'LBL_ASSIGNED_TO',
-101 				'function' => array (
-102 					'name' => 'get_user_array',
-103 					'params' => array (
-104 							0 => false
-105 					)
-106 				),
-107 				'default' => true,
-108 				'width' => '10%'
-109 			)
-110 		)
-111 	)
-112 );
- -
- ------ - - -
-Here we setup a new array for Accounts in the $searchdefs array. This has two keys: - -####= templateMeta ####= - -The templateMeta key controls the basic look of the search forms. Here we define some overall layout info such as the maximum columns (3) and the maximum number of columns for the basic search (4). Finally we set the widths for the search fields and their labels. - -####= layout ####= - -The layout key contains the layout definitions for the basic search and advanced search. This is simply a list of array definition of the fields. See the section on listviewdefs.php for a description of some of the options. - -#### subpaneldefs.php #### - -The subpaneldefs.php file provides definitions for the subpanels that appear in the detail view of a module. Let’s look at an example: - -
- -Example 6.8: Subpanel metadata definition - - ------ - -
- -
 1 $layout_defs['AOS_Quotes'] = array (
- 2 	'subpanel_setup' => array (
- 3 		'aos_quotes_aos_contracts' => array (
- 4 			'order' => 100,
- 5 			'module' => 'AOS_Contracts',
- 6 			'subpanel_name' => 'default',
- 7 			'sort_order' => 'asc',
- 8 			'sort_by' => 'id',
- 9 			'title_key' => 'AOS_Contracts',
-10 			'get_subpanel_data' => 'aos_quotes_aos_contracts',
-11 			'top_buttons' => array (
-12 				0 => array (
-13 					'widget_class' => 'SubPanelTopCreateButton'
-14 				),
-15 				1 => array (
-16 					'widget_class' => 'SubPanelTopSelectButton',
-17 					'popup_module' => 'AOS_Contracts',
-18 					'mode' => 'MultiSelect'
-19 				)
-20 			)
-21 		),
-22 		'aos_quotes_aos_invoices' => array (
-23 			'order' => 100,
-24 			'module' => 'AOS_Invoices',
-25 			'subpanel_name' => 'default',
-26 			'sort_order' => 'asc',
-27 			'sort_by' => 'id',
-28 			'title_key' => 'AOS_Invoices',
-29 			'get_subpanel_data' => 'aos_quotes_aos_invoices',
-30 			'top_buttons' => array (
-31 				0 => array (
-32 					'widget_class' => 'SubPanelTopCreateButton'
-33 				),
-34 				1 => array (
-35 					'widget_class' => 'SubPanelTopSelectButton',
-36 					'popup_module' => 'AOS_Invoices',
-37 					'mode' => 'MultiSelect'
-38 				)
-39 			)
-40 		),
-41 		'aos_quotes_project' => array (
-42 			'order' => 100,
-43 			'module' => 'Project',
-44 			'subpanel_name' => 'default',
-45 			'sort_order' => 'asc',
-46 			'sort_by' => 'id',
-47 			'title_key' => 'Project',
-48 			'get_subpanel_data' => 'aos_quotes_project',
-49 			'top_buttons' => array (
-50 				0 => array (
-51 					'widget_class' => 'SubPanelTopCreateButton'
-52 				),
-53 				1 => array (
-54 					'widget_class' => 'SubPanelTopSelectButton',
-55 					'popup_module' => 'Accounts',
-56 					'mode' => 'MultiSelect'
-57 				)
-58 			)
-59 		)
-60 	)
-61 );
- -
- ------ - - -
-In the example above we set up a definition for a module (in this case AOS_Quotes) in the $layout_defs array. This has a single key subpanel_setup which is an array of each of the subpanel definitions keyed by a name. This name should be something recognisable. In the case above it is the name of the link field displayed by the subpanel. The entry for each subpanel usually has the following defined: - -; order -: A number used for sorting the subpanels. The values themselves are arbitrary and are only used relative to other subpanels. -; module -: The module which will be displayed by this subpanel. For example the aos_quotes_project def in the example above will display a list of Project records. -; subpanel_name -: The subpanel from the displayed module which will be used. See the subpanels section of this chapter. -; sort_by -: The field to sort the records on. -; sort_order -: The order in which to sort the sort_by field. asc for ascending desc for descending. -; title_key -: The language key to be used for the label of this subpanel. -; get_subpanel_data -: Used to specify where to retrieve the subpanel records. Usually this is just a link name for the current module. In this case the related records will be displayed in the subpanel. However, for more complex links, it is possible to specify a function to call. When specifying a function you should ensure that the get_subpanel_data entry is in the form function:theFunctionName. Additionally you can specify the location of the function and any additional parameters that are needed by using the function_parameters key. An example of a subpanel which uses a function can be found in [[#chap19.xhtml#appendix-a|Appendix A]]. -; function_parameters -: Specifies the parameters for a subpanel which gets it’s information from a function (see
-get_subpanel_data). This is an array which allows specifying where the function is by using the import_function_file key (if this is absent but get_subpanel_data defines a function then the function will be called on the bean for the parent of the subpanel). Additionally this array will be passed as an argument to the function defined in get_subpanel_data which allows passing in arguments to the function. -; generate_select -: For function subpanels (see get_subpanel_data) whether or not the function will return an array representing the query to be used (for generate_select = true) or whether it will simply return the query to be used as a string. -; get_distinct_data -: Whether or not to only return distinct rows. Relationships do not allow linking two records more than once therefore this only really applies if the subpanel source is a function. See
-get_subpanel_data for information on function subpanel sources. -; top_buttons -: Allows defining the buttons to appear on the subpanel. This is simply an array of the button definitions. These definitions have, at least, the widget_class defined which decides the button class to use in include/generic/SugarWidgets. Depending on the button this array may also be used to pass in extra arguments to the widget class. - -#### subpanels #### - -Inside the metadata folder is the subpanels folder. This allows creating different subpanel layouts for different parent modules. For example, the Contacts module will display differently in the subpanel on an account than it will in the subpanel of a case. The files inside the subpanels folder can be named anything. All that matters is that it can be referenced in the subpanel_name of the subpaneldefs.php of the parent module. The usual subpanel file is simply called default.php. Let’s look at the modules/Accounts/metadata/subpanels/default.php file: - -
- -Example 6.8: Module Subpanels definition - - ------ - -
- -
 1 $subpanel_layout = array(
- 2 	'top_buttons' => array(
- 3 		array(
- 4 			'widget_class' => 'SubPanelTopCreateButton'
- 5 		),
- 6 		array(
- 7 			'widget_class' => 'SubPanelTopSelectButton', 
- 8 			'popup_module' => 'Accounts'
- 9 		),
-10 	),
-11 	'where' => '',
-12 	'list_fields' => array (
-13 	  'name' =>
-14 	  array (
-15 	   'vname' => 'LBL_LIST_ACCOUNT_NAME',
-16 	   'widget_class' => 'SubPanelDetailViewLink',
-17 	   'width' => '45%',
-18 	   'default' => true,
-19 	  ),
-20 	  'billing_address_city' =>
-21 	  array (
-22     	'vname' => 'LBL_LIST_CITY',
-23     	'width' => '20%',
-24     	'default' => true,
-25 	  ),
-26 	  'billing_address_country' =>
-27 	  array (
-28 	  	'type' => 'varchar',
-29     	'vname' => 'LBL_BILLING_ADDRESS_COUNTRY',
-30     	'width' => '7%',
-31     	'default' => true,
-32 	  ),
-33 	  'phone_office' =>
-34 	  array (
-35 	  	'vname' => 'LBL_LIST_PHONE',
-36 	  	'width' => '20%',
-37 	  	'default' => true,
-38 	  ),
-39 	  'edit_button' =>
-40 	  array (
-41 	  	'vname' => 'LBL_EDIT_BUTTON',
-42 	  	'widget_class' => 'SubPanelEditButton',
-43 	  	'width' => '4%',
-44 	  	'default' => true,
-45 	  ),
-46 	  'remove_button' =>
-47 	  array (
-48 	    'vname' => 'LBL_REMOVE',
-49 	    'widget_class' => 'SubPanelRemoveButtonAccount',
-50 	    'width' => '4%',
-51 	    'default' => true,
-52 	  ),
-53    )
-54 );
- -
- ------ - - -
-There are three keys in the $subpanel_layout variable for this subpanel. These are: - -; top_buttons -: Defines the buttons that will appear at the top of the subpanel. See the top_buttons key in subpaneldefs.php. -; where -: Allows the addition of conditions to the where clause. For example this could be used to exclude Cases that are closed (cases.state != "Closed") or only include Accounts of a specific industry (accounts.industry = "Media"). Note that in these examples we specify the table to remove any ambiguity in the query. -; list_fields -: Defines the list of fields to be displayed in this subpanel. See the section on listviewdefs.php for more information. - -#### studio.php #### - -studio.php is the simplest file in metadata and it’s existence is simply used to confirm if a module should be shown in studio for user tweaking. Note that, unlike other metadata files, the file in modules/<TheModule>/metadata/studio.php will be the only one checked. A file in custom/modules/<TheModule>/metadata/studio.php will have no effect. - - -
diff --git a/_source/ebooks/chap07.ml b/_source/ebooks/chap07.ml deleted file mode 100644 index fb897f6a0..000000000 --- a/_source/ebooks/chap07.ml +++ /dev/null @@ -1,155 +0,0 @@ ---- -permalink: "/chap07.html" -layout: page -title: "Chapter 07" ---- - - -
- -## 7. Controllers ## - -SuiteCRM follows the MVC (Model-View-Controller) pattern and as such has the concept of controllers. The controller is responsible for making changes to the Model as well as passing control to the view as appropriate. SuiteCRM has the concept of actions which are actions that will be taken by the controller. Let’s take a look at a SuiteCRM URL: - -
- -Example 7.1: Example SuiteCRM URL - - ------ - -
- -
example.com/index.php?module=Accounts&action=index
- -
- ------ - - -
-In this (rather boring) example we see that the module is Accounts. This will determine which controller to use and then call the index action on that controller. - -SuiteCRM will first look for the controller in custom/module/<TheModule>/controller.php. If this is not found then next module/<TheModule>/controller.php will be checked. Finally if neither of these controllers exist then the default controller will be used. The default controller can be found in include/MVC/Controller/SugarController.php. - -### Customising controllers ### - -Ordinarily the default controller handles the request and delegates to the appropriate views etc. However custom controllers can be used to add or alter functionality. Let’s look at adding a new action. - -In the first instance we will have to add our custom controller. This will vary slightly depending on the nature of the module. - -#### Custom module #### - -In this case we can place the file directly into our module. You should create a new file (if it doesn’t exist) at modules/<TheModule>/controller.php. The contents will look similar to: - -
- -Example 7.2: Creating a custom controller for a custom module - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 class <TheModule>Controller extends SugarController
-4 {
-5 
-6 }
- -
- ------ - - -
-#### Pre-existing modules #### - -For pre-existing modules you should add the controller to
-custom/modules/<TheModule>/controller.php. - -The contents of this file will vary depending on whether you wish to extend the existing controller (if it exists) or create your own version completely. It is usually best to extend the existing controller since this will retain important logic. You should note the naming convention here. We name the class
-Custom<TheModule>Controller. - -Here we don’t extend the existing controller or no such controller exists: - -
- -Example 7.3: Creating a custom controller for an existing module - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 class Custom<TheModule>Controller extends SugarController
-4 {
-5 
-6 }
- -
- ------ - - -
-Alternatively we extend the existing controller. Note that we are requiring the existing controller: - -
- -Example 7.4: Creating a custom controller for an existing module with an existing controller - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 
-4 require_once 'modules/<TheModule>/controller.php';
-5 
-6 class Custom<TheModule>Controller extends <TheModule>Controller
-7 {
-8 
-9 }
- -
- ------ - - -
-#### Adding the action #### - -Now we can add a new action to our controller. Actions are created as methods on the controller with the name action_<actionName>. For example, to create a new action called ‘echo’ we could create the following method in one of the controllers we have created above. This can then perform whatever logic that is needed. In our example we will log the REQUEST and simply redirect: - -
- -Example 7.5: Adding a custom controller action method - - ------ - -
- -
1 public function action_echo(){
-2   $GLOBALS['log']->debug("Echo called with request: ".print_r($_REQUEST,1));
-3   SugarApplication::redirect('index.php');
-4 }
- -
- ------ - - -
-#### Legacy Style #### - -In previous versions of SugarCRM a new action was added by creating a file in either modules/<TheModule>/<actionname>.php or custom/modules/<TheModule>/<actionname>.php. Although this still works it is not recommended. - - -
diff --git a/_source/ebooks/chap08.ml b/_source/ebooks/chap08.ml deleted file mode 100644 index 718784c9b..000000000 --- a/_source/ebooks/chap08.ml +++ /dev/null @@ -1,142 +0,0 @@ ---- -permalink: "/chap08.html" -layout: page -title: "Chapter 08" ---- - - -
- -## 8. Entry Points ## - -Entry points are simply a page which provides access to SuiteCRM. These can be used for a variety of purposes such as allowing an external form simple access to SuiteCRM or, as is the case with the stock Events module, allowing an event invite to be responded to by clicking a link in an email. - -### Creating an entry point ### - -Let’s create a simple entry point to display the time. First we define this entry point in a new file in: - -
- -Example 8.1: Entry point registry location - - ------ - -
- -
custom/Extension/application/Ext/EntryPointRegistry/
- -
- ------ - - -
-For our example we’ll call our new file MyTimeEntryPoint.php - -
- -Example 8.2: Example entry point location - - ------ - -
- -
custom/Extension/application/Ext/EntryPointRegistry/MyTimeEntryPoint.php
- -
- ------ - - -
-In this file we will add a new entry to the $entry_point_registry. We supply the file that should be called. Here we are simply placing the file in custom if the entry point is related to a specific module it is usually a good idea to place this somewhere inside custom/<TheModule>/. - -In addition we supply an “auth” parameter. If “auth” is true then anyone accessing the entry point will need to be logged into SuiteCRM. - -
- -Example 8.3: Adding an entry point entry - - ------ - -
- -
1 <?php
-2 	$entry_point_registry['MyTimeEntryPoint'] = array(
-3 	    'file' => 'custom/MyTimeEntryPoint.php',
-4 	    'auth' => true,
-5 	);
- -
- ------ - - -
-Finally we add the actual logic itself inside custom/MyTimeEntryPoint.php: - -
- -Example 8.4: Example entry point that outputs the current time - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 $date = new DateTime();
-4 echo $date->format('r');
- -
- ------ - - -
-After a Quick Repair and Rebuild we can access our entry point: - -
- -Example 8.5: Custom entry point URL - - ------ - -
- -
example.com/index.php?entryPoint=MyTimeEntryPoint
- -
- ------ - - -
-and we should see something similar to: - -
- -Example 8.6: MyTimeEntryPoint - - ------ - -
- -
Sun, 15 Mar 2015 13:03:03 +0000
- -
- ------ - - -
-Obviously this is a contrived example but any logic that can be performed elsewhere in SuiteCRM can be performed in an entry poiny (for example creating or editing [[#chap02.xhtml#working-with-beans-chapter|SugarBeans]]). - - -
diff --git a/_source/ebooks/chap09.ml b/_source/ebooks/chap09.ml deleted file mode 100644 index 4e41b7f06..000000000 --- a/_source/ebooks/chap09.ml +++ /dev/null @@ -1,286 +0,0 @@ ---- -permalink: "/chap09.html" -layout: page -title: "Chapter 09" ---- - - -
- -## 9. Language Strings ## - -Language strings provide an element of internationalisation to SuiteCRM. It allows specifying different strings to be used in different languages making it much easier to provide translations for modules and customisations. Even if you are only targeting a single language it is still worth using the language string functionality in SuiteCRM because it allows the simple changing of strings within SuiteCRM and it also allows users to customise the labels used in your customisations. There are three main types of language strings that we will cover here. - -At the core, the language strings are a key value store. The keys are used throughout SuiteCRM and the values are loaded based on the current language. - -Languages are handled in SuiteCRM by prefixing the file name with the IETF language code for the language that this file contains. Here are some examples of different language file names: - -
- -Example 9.1: Example language file names - - ------ - -
- -
# Core Accounts language file for en_us (United States English)
-modules/Accounts/language/en_us.lang.php
-
-# Core Cases language file for es_es (Spanish as spoken in Spain)
-modules/Cases/language/es_es.lang.php
-
-# Custom language file for de_de (German)
-custom/Extension/application/Ext/Language/de_de.SomeCustomPackage.php
- -
- ------ - - -
-SuiteCRM will choose the language prefix to be used based on the language the user selected when logging in or the default language if none was selected. Generally when a language file is loaded the default language files and the en_us files will also be loaded. These files are then merged. This ensures that there will still be a definition if there are language keys in either en_us or the default language that don’t have definitions in the current language. In essence the language “falls back” to the default language and en_us if there are missing keys. - -### Module Strings ### - -#### Use #### - -Module strings are strings associated with a particular module. These are usually, for example, field labels and panel name labels, but they may be used for anything that is specific to a single module. - -#### Definition location #### - -Module strings are defined in the $mod_strings array. This is initially defined in
-modules/<TheModule>/language/<LanguageTag>.lang.php, for example
-modules/Accounts/language/en_us.lang.php. - -#### Customisation location #### - -Customisations can be made to the module strings by adding a new file in
-custom/Extension/modules/<TheModule>/Ext/Language/<LanguageTag>.<Name>.php (<Name> in this case should be used to give it a descriptive name). An example is custom/Extension/modules/Accounts/Ext/Language/en_us.MyLanguageFile.php. See the Extensions section for more information on the Extensions folder. - -### Application Strings ### - -#### Use #### - -Application strings are used for language strings and labels that are not specific to a single module. Examples of these may include labels that will appear in the headers or footers, labels that appear on search buttons throughout SuiteCRM or labels for pagination controls. - -#### Definition location #### - -The application strings are defined in the $app_strings array. This is initially defined in
-include/language/<LanguageTag>.lang.php. - -#### Customisation location #### - -Customisations can be made to the application strings in two ways. Firstly you can edit the file
-custom/include/language/<LanguageTag>.lang.php. However to promote modularity it is recommended that you add a new file in the location
-custom/Extension/application/Ext/Language/<LanguageTag>.<Name>.php. For example
-custom/Extension/application/Ext/Language/es_es.MyAppLanguageFile.php. <Name> should be used to give the file a descriptive name. See the Extensions section for more information on the Extensions folder. - -### Application List Strings ### - -#### Use #### - -Application list strings are used to store the various dropdowns and lists used in SuiteCRM. Most of these are used as options for the various enum fields in SuiteCRM e.g the account type or the opportunity sales stage. - -#### Definition location #### - -The application list strings are defined in the $app_list_strings array. Similar to the $app_strings array this is initially defined in include/language/en_us.lang.php. - -#### Customisation location #### - -Customisations can be made to the application list strings in two ways. Firstly you can edit the file
-custom/include/language/<LanguageTag>.lang.php. However to promote modularity it is recommended that you add a new file in the location
-custom/Extension/application/Ext/Language/<LanguageTag>.<Name>.php (<Name> should be used to give the file a descriptive name). For example
-custom/Extension/application/Ext/Language/es_es.MyAppListLanguageFile.php. See the Extensions section for more information on the Extensions folder. - -### Why and when to customise ### - -Generally language strings should be changed from within SuiteCRM using the studio tool. However there are times when it can be simpler to add or modify language strings as described in the previous section. If you are importing a large number of language strings or dropdown options it can be simpler to create a new file to add these values. Similarly if you are adding entirely new functionality, it is usually best to simply add these language strings as new values. - -### Usage ### - -Language strings are used automatically throughout SuiteCRM. For example in metadata you can specify the language strings to display for fields. However in some cases you will want to access and use the language strings in custom code. There are several ways to do this. - -#### Globals #### - -The $mod_strings, $app_strings and $app_list_strings variables are all global and can be accessed as such. $app_strings and $app_list_strings will always be available. However $mod_strings will only contain the strings for the current module (see the next section for other ways of accessing $mod_strings). - -
- -Example 9.2: Accessing language strings globally - - ------ - -
- -
 1 function someFunction(){
- 2     global $mod_strings, $app_strings, $app_list_strings;
- 3     /*
- 4      * Grab the label LBL_NAME for the current module
- 5      * In most modules this will be the label for the
- 6      * name field of the module.
- 7      */
- 8     $modLabel = $mod_strings['LBL_NAME'];
- 9 
-10     $appLabel = $app_strings['LBL_GENERATE_LETTER'];
-11 
-12     /*
-13      * Unlike the previous two examples $appListLabel will be an
-14      * array of the dropdowns keys to it's display labels.
-15      */
-16     $appListLabel = $app_list_strings['aos_quotes_type_dom'];
-17 
-18     //Here we just log out the strings
-19     $GLOBALS['log']->debug("The module label is $modLabel");
-20     $GLOBALS['log']->debug("The app label is $appLabel");
-21     $GLOBALS['log']->debug("The app list label is ".print_r($appListLabel,1));
-22 }
- -
- ------ - - -
-#### Translate #### - -As an alternative to using globals or, if you are in a different module than the language string you wish to retrieve you can use the translate method. - -
- -Example 9.3: translate method signature - - ------ - -
- -
1 translate(
-2         $string,
-3         $mod='',
-4         $selectedValue='')
- -
- ------ - - -
-; $string -: The language string to be translated. -; $mod -: The module this string should come from. Defaults to the current module if empty. -; $selectedValue -: For dropdown strings. This will return the label for the key $selectedValue - -Here is an example of the above in action. Note that we do not have to worry about whether the label is a Module string, an Application string or an Application list string, as all of these will be checked (in that order - the first matching value will be returned). - -
- -Example 9.4: Example translate method calls - - ------ - -
- -
 1 function someFunction(){
- 2   //Grab the label LBL_NAME for the current module
- 3   $modLabel = translate('LBL_NAME');
- 4 
- 5   //Grab the label LBL_NAME for the AOS_Products module
- 6   $productModLabel = translate('LBL_NAME','AOS_Products');
- 7 
- 8   $appLabel = translate('LBL_GENERATE_LETTER');
- 9 
-10   /*
-11    * Return the label for the `Other` option of the `aos_quotes_type_dom`
-12    * We don't care about the module so this is left blank.
-13    */
-14   $appListLabel = translate('aos_quotes_type_dom','','Other');
-15 
-16   //Here we just log out the strings
-17   $GLOBALS['log']->debug("The module label is $modLabel");
-18   $GLOBALS['log']->debug("The module label for Products is $productModLabel");
-19   $GLOBALS['log']->debug("The app label is $appLabel");
-20   $GLOBALS['log']->debug("The app list label is ".print_r($appListLabel,1));
-21 }
- -
- ------ - - -
-#### JavaScript #### - -Finally, you may be using JavaScript (for example in a view), and wish to display a language string. For this you can use the SUGAR.language.get method, which is similar to the translate method in example 9.3. - -
- -Example 9.5: SUGAR.language.get method signature - - ------ - -
- -
1 SUGAR.language.get(
-2               module,
-3               str
-4 );
- -
- ------ - - -
-; module -: The module a language string will be returned for. You should supply app_strings or
-app_list_strings if the label you wish to retrieve is not a module string. -; str -: The key you want to retrieve a label for. - -
- -Example 9.6: Example SUGAR.language.get method calls - - ------ - -
- -
 1 function someFunction(){
- 2 
- 3   /*
- 4    * Grab the label LBL_NAME for AOS_Products
- 5    * Note that, unlike the translate function in example 9.3
- 6    * the module name is required.
- 7    */
- 8 
- 9   var modLabel = SUGAR.language.get('AOS_Products', 'LBL_NAME');
-10 
-11   /*
-12    * As mentioned above we explicitly need to pass if we are retrieving
-13    * an app_string or app_list_string
-14    */
-15   var appLabel = SUGAR.language.get('app_strings', 'LBL_GENERATE_LETTER');
-16   var appListLabel = SUGAR.language.get('app_list_strings',
-17                                         'aos_quotes_type_dom');
-18 
-19   //Here we just log out the strings
-20   console.log("The module label is "+modLabel);
-21   console.log("The app label is "+appLabel);
-22   console.log("The app list label is "+appListLabel);
-23 }
- -
- ------ - - -
- -
diff --git a/_source/ebooks/chap10.ml b/_source/ebooks/chap10.ml deleted file mode 100644 index 9774b255e..000000000 --- a/_source/ebooks/chap10.ml +++ /dev/null @@ -1,144 +0,0 @@ ---- -permalink: "/chap10.html" -layout: page -title: "Chapter 10" ---- - - -
- -## 10. Config ## - -### The config files ### - -There are two main config files in SuiteCRM, both of which are in the root SuiteCRM folder. These are config.php and config_override.php. The definitions in here provide various configuration options for SuiteCRM. All the way from the details used to access the database to how many entries to show per page in the list view. Most of these options are accessible from the SuiteCRM administration page. However some are only definable in the config files. - -#### config.php #### - -This is the main SuiteCRM config file and includes important information like the database settings and the current SuiteCRM version. - -Generally settings in this file wont be changed by hand. An exception to this is if SuiteCRM has been moved or migrated. In which case you may need to change the database settings and the site_url. Let’s look at the database settings first: - -
- -Example 10.1: Database config definition - - ------ - -
- -
 1 'dbconfig' =>
- 2 array (
- 3   'db_host_name' => 'localhost',
- 4   'db_host_instance' => 'SQLEXPRESS',
- 5   'db_user_name' => 'dbuser',
- 6   'db_password' => 'dbpass',
- 7   'db_name' => 'dbname',
- 8   'db_type' => 'mysql',
- 9   'db_port' => '',
-10   'db_manager' => 'MysqliManager',
-11 ),
- -
- ------ - - -
-Here we can see this instance is setup to access a local MySQL instance using the username/password dbuser/dbpass and accessing the database named ‘dbname’. - -The site url settings are even simpler: - -
- -Example 10.2: Setting the site URL - - ------ - -
- -
  'site_url' => 'http://example.com/suitecrm',
- -
- ------ - - -
-The site url for the above is simply ‘http://example.com/suitecrm’ if we were moving this instance to, for example, suite.example.org, then we can simply place that value in the file. - -These are generally the only two instances where you would directly change config.php. For other changes you would either make the change through SuiteCRM itself or you would use the
-config_override.php file. - -#### config_override.php #### - -config_override.php allows you to make config changes without risking breaking the main config file. This is achieved quite simply by adding, editing or removing items from the $sugar_config variable. The config_override.php file will be merged with the existing config allowing, as the name suggests, overriding the config. For example in config_override.php we can add our own, new, config item: - -
- -Example 10.3: Adding a custom config value - - ------ - -
- -
$sugar_config['enable_the_awesome'] = true;
- -
- ------ - - -
-or we can edit an existing config option in a very similar manner by simply overwriting it: - -
- -Example 10.4: Overwriting an existing config value - - ------ - -
- -
$sugar_config['logger']['level'] = 'debug';
- -
- ------ - - -
-### Using config options ### - -We may want to access config options in custom code (or as detailed above if we have created our own config setting we may want to use that). We can easily get the config using the php global keyword: - -
- -Example 10.5: Accessing a config setting within SuiteCRM - - ------ - -
- -
1 function myCustomLogic(){
-2   //Get access to config
-3   global $sugar_config;
-4   //use the config values
-5   if(!empty($sugar_config['enable_the_awesome'])){
-6     doTheAwesome();
-7   }
-8 }
- -
- ------ - - -
- -
diff --git a/_source/ebooks/chap11.ml b/_source/ebooks/chap11.ml deleted file mode 100644 index ecbedeca3..000000000 --- a/_source/ebooks/chap11.ml +++ /dev/null @@ -1,122 +0,0 @@ ---- -permalink: "/chap11.html" -layout: page -title: "Chapter 11" ---- - - -
- -## 11. Logging ## - -### Logging messages ### - -Logging in SuiteCRM is achieved by accessing the log global. Accessing an instance of the logger is as simple as - -
- -Example 11.1: Accessing the log - - ------ - -
- -
$GLOBALS['log']
- -
- ------ - - -
-This can then be used to log a message. Each log level is available as a method. For example: - -
- -Example 11.2: Logging messages - - ------ - -
- -
1 $GLOBALS['log']->debug('This is a debug message');
-2 $GLOBALS['log']->error('This is an error message');
- -
- ------ - - -
-This will produce the following output: - -
- -Example 11.3: Logging messages example output - - ------ - -
- -
1 Tue Apr 28 16:52:21 2015 [15006][1][DEBUG] This is a debug message
-2 Tue Apr 28 16:52:21 2015 [15006][1][ERROR] This is an error message
- -
- ------ - - -
-### Logging output ### - -The logging output displays the following information by default: - -
- -Example 11.4: Logging messages example output - - ------ - -
- -
<Date> [<ProcessId>][<UserId>][<LogLevel>] <LogMessage>
- -
- ------ - - -
-; <Date> -: The date and time that the message was logged. -; <ProcessId> -: The PHP process id. -; <UserId> -: The ID of the user that is logged into SuiteCRM. -; <LogLevel> -: The log level for this log message. -; <LogMessage> -: The contents of the log message. - -### Log levels ### - -Depending on the level setting in admin some messages will not be added to the log e.g if your logger is set to error then you will only see log levels of error or higher (error, fatal and security). - -The default log levels (in order of verbosity) are: - -* debug -* info -* warn -* deprecated -* error -* fatal -* security - -Generally on a production instance you will use the less verbose levels (probably error or fatal). However whilst you are developing you can use whatever level you prefer. I prefer the most verbose level - debug. - - -
diff --git a/_source/ebooks/chap12.ml b/_source/ebooks/chap12.ml deleted file mode 100644 index 8809c72cd..000000000 --- a/_source/ebooks/chap12.ml +++ /dev/null @@ -1,354 +0,0 @@ ---- -permalink: "/chap12.html" -layout: page -title: "Chapter 12" ---- - - -
- -## 12. Logic Hooks ## - -### Intro ### - -Logic hooks allow you to hook into various events in SuiteCRM to fire custom code. This can allow you to, for example, make a call to an external API, or to create a new record if certain events occur. - -### Types ### - -Logic hooks can occur in three contexts. These contexts are Application Hooks, Module Hooks and User Hooks. These are detailed below. - -### Application Hooks ### - -Application hooks are hooks which are fired in the application context (that is, they are not fired against a particular module). These hooks must be defined in the top level logic hook (i.e. custom/modules/logic_hooks.php). - -; after_entry_point -: Called after SuiteCRM has initialised but before any other processing is carried out. -; after_ui_footer -: Called after the UI footer. -; after_ui_frame -: Fired after the UI has been displayed but before the footer has been displayed. -; server_round_trip -: Fired at the end of every page request. - -### User Hooks ### - -User hooks are fired for certain login/logout actions. Similar to Application Hooks, these hooks must be defined in the top level logic hook (i.e. custom/modules/logic_hooks.php). - -; after_login -: Fired after a user logs in to SuiteCRM . -; after_logout -: Fired when a user logs out of SuiteCRM. -; before_logout -: Fired before a user logs out of SuiteCRM. -; login_failed -: Fired when a user attempts to login to SuiteCRM but the login fails. - -### Module Hooks ### - -Module Hooks are called on various record actions for a specific module. - -; after_delete -: Fired when a record is deleted. -; after_relationship_add -: Fired after a relationship is added between two records. Note that this may be called twice, once for each side of the relationship. -; after_relationship_delete -: Fired after a relationship between two records is deleted. -; after_restore -: Fired after a record is undeleted. -; after_retrieve -: Fired after a record is retrieved from the DB. -; after_save -: Fired after a record is saved. Note that due to some peculiarities some related modules may not be persisted to the database. The logic hook is fired within the SugarBean classes save method. Some implementing classes may save related beans after this method returns. A notable example of this is the saving of email addresses in Company modules. -; before_delete -: Fired before a record is deleted. -; before_relationship_add -: Fired before a relationship is added between two records. Note that this may be called twice, once for each side of the relationship. -; before_relationship_delete -: Fired before a relationship between two records is deleted. Note that this may be called twice, once for each side of the relationship. -; before_restore -: Fired before a record is undeleted. -; before_save -: Fired before a record is saved. -; handle_exception -: Fired when an exception occurs in a record. -; process_record -: Fired when a record is processed ready to be displayed in list views or dashlets. - -### Job Queue Hooks ### - -Job queue hooks are fired for scheduler jobs. Similar to application hooks these hooks must be defined in the top level logic hook (i.e. custom/modules/logic_hooks.php). - -; job_failure -: Fired when a scheduled job either returns false to signify failure or throws an exception and it will not be retried. See the section on [[#chap12.xhtml#scheduled-tasks-chapter|Scheduled Tasks]]. -; job_failure_retry -: Fired when a scheduled job either returns false to signify failure or throws an exception but it will be retried. See the section on [[#chap12.xhtml#scheduled-tasks-chapter|Scheduled Tasks]]. - -### Implementing ### - -Depending on the Logic Hook type logic hooks are either placed into
-custom/modules/Logic_Hooks.php or custom/modules/<TargetModule>/Logic_Hooks.php. - -#### Logic_Hooks.php #### - -The logic hook file itself specifies which logic hooks to fire on this event. It looks something like this: - -
- -Example 12.1: Logic hook file - - ------ - -
- -
 1 <?php
- 2 // Do not store anything in this file that is not part of the array or the hook
- 3 //version.  This file will be automatically rebuilt in the future.
- 4  $hook_version = 1;
- 5 $hook_array = Array();
- 6 // position, file, function
- 7 $hook_array['before_save'] = Array();
- 8 $hook_array['before_save'][] = Array(
- 9                               77,
-10                               'updateGeocodeInfo',
-11                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-12                               'CasesJjwg_MapsLogicHook',
-13                               'updateGeocodeInfo');
-14 $hook_array['before_save'][] = Array(
-15                               10,
-16                               'Save case updates',
-17                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-18                               'CaseUpdatesHook',
-19                               'saveUpdate');
-20 $hook_array['before_save'][] = Array(
-21                               11,
-22                               'Save case events',
-23                               'modules/AOP_Case_Events/CaseEventsHook.php',
-24                               'CaseEventsHook',
-25                               'saveUpdate');
-26 $hook_array['before_save'][] = Array(
-27                               12,
-28                               'Case closure prep',
-29                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-30                               'CaseUpdatesHook',
-31                               'closureNotifyPrep');
-32 $hook_array['before_save'][] = Array(
-33                               1,
-34                               'Cases push feed',
-35                               'custom/modules/Cases/SugarFeeds/CaseFeed.php',
-36                               'CaseFeed',
-37                               'pushFeed');
-38 $hook_array['after_save'] = Array();
-39 $hook_array['after_save'][] = Array(
-40                               77,
-41                               'updateRelatedMeetingsGeocodeInfo',
-42                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-43                               'CasesJjwg_MapsLogicHook',
-44                               'updateRelatedMeetingsGeocodeInfo');
-45 $hook_array['after_save'][] = Array(
-46                               10,
-47                               'Send contact case closure email',
-48                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-49                               'CaseUpdatesHook',
-50                               'closureNotify');
-51 $hook_array['after_relationship_add'] = Array();
-52 $hook_array['after_relationship_add'][] = Array(
-53                               77,
-54                               'addRelationship',
-55                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-56                               'CasesJjwg_MapsLogicHook',
-57                               'addRelationship');
-58 $hook_array['after_relationship_add'][] = Array(
-59                               9,
-60                               'Assign account',
-61                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-62                               'CaseUpdatesHook',
-63                               'assignAccount');
-64 $hook_array['after_relationship_add'][] = Array(
-65                               10,
-66                               'Send contact case email',
-67                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-68                               'CaseUpdatesHook',
-69                               'creationNotify');
-70 $hook_array['after_relationship_delete'] = Array();
-71 $hook_array['after_relationship_delete'][] = Array(
-72                               77,
-73                               'deleteRelationship',
-74                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-75                               'CasesJjwg_MapsLogicHook',
-76                               'deleteRelationship');
- -
- ------ - - -
-Let’s go through each part of the file. - -
- -
- -
4 $hook_version = 1;
- -
- -
-This sets the hook version that we are using. Currently there is only one version so this line is unused. - -
- -
- -
5 $hook_array = Array();
- -
- -
-Here we set up an empty array for our Logic Hooks. This should always be called $hook_array. - -
- -
- -
7 $hook_array['before_save'] = Array();
- -
- -
-Here we are going to be adding some before_save hooks so we add an empty array for that key. - -
- -
- -
 8 $hook_array['before_save'][] = Array(
- 9                               77,
-10                               'updateGeocodeInfo',
-11                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-12                               'CasesJjwg_MapsLogicHook',
-13                               'updateGeocodeInfo');
- -
- -
-Finally we reach an interesting line. This adds a new logic hook to the before_save hooks. This array contains 5 entries which define this hook. These are: - -####= Sort order ####= - -The first argument (77) is the sort order for this hook. The logic hook array is sorted by this value. If you wish for a hook to fire earlier you should use a lower number. If you wish for a hook to be fired later you should use a higher number. The numbers themselves are arbitrary. - -####= Hook label ####= - -The second argument (‘updateGeocodeInfo’) is simply a label for the logic hook. This should be something short but descriptive. - -####= Hook file ####= - -The third argument is where the actual class for this hook is. In this case it is in a file called custom/modules/Cases/CasesJjwg_MapsLogicHook.php. Generally you will want the files to be somewhere in custom and it is usual to have them in custom/modules/<TheModule>/<SomeDescriptiveName>.php or custom/modules/<SomeDescriptiveName>.php for Logic Hooks not targeting a specific module. However the files can be placed anywhere. - -####= Hook class ####= - -The fourth argument is the class name for the Logic Hook class. In this case
-CasesJjwg_MapsLogicHook. It is usual for the class name to match the file name but this is not required. - -####= Hook method ####= - -The fifth, and final, argument is the method that will be called on the class. In this case updateGeocodeInfo. - -#### Adding your own logic hooks #### - -When adding logic hooks you should make full use of the Extensions framework (see the section on Extensions). This involves creating a file in
-custom/Extension/application/Ext/LogicHooks/ for application hooks and
-custom/Extension/modules/<TheModule>/Ext/LogicHooks/ for module specific hooks. These files can then add to/alter the $hook_array as appropriate. - -{| -|width="50%"| [[File:images/leanpub_info-circle.png|50px|class=sidebar-image|information]] -|width="50%"| After adding a new logic hook it is necessary to perform a quick repair and rebuild in the admin menu for this to be picked up. -|} - -#### Logic Hook function #### - -The logic hook function itself will vary slightly based on the logic hook type. For module hooks it will appear similar to: - -
- -Example 12.2: Example logic hook method - - ------ - -
- -
1     class SomeClass
-2     {
-3         function someMethod($bean, $event, $arguments)
-4         {
-5           //Custom Logic
-6         }
-7     }
- -
- ------ - - -
-Application logic hooks omit the $bean argument: - -
- -Example 12.3: Example logic hook method for application hooks - - ------ - -
- -
1     class SomeClass
-2     {
-3         function someMethod($event, $arguments)
-4         {
-5           //Custom Logic
-6         }
-7     }
- -
- ------ - - -
-####= $bean (SugarBean) ####= - -The $bean argument passed to your logic hook is usually the bean that the logic hook is being performed on. For User Logic Hooks this will be the current User object. For module logic hooks (such as before_save) this will be the record that is being saved. For job queue logic hooks this will be the SchedulersJob bean. Note that for Application Logic Hook this argument is not present. - -####= $event (string) ####= - -The $event argument contains the logic hook event e.g process_record, before_save,
-after_delete etc. - -####= $arguments (array) ####= - -The $arguments argument contains any additional details of the logic hook event. I.e. in the case of before_relationship_add this will contain details of the related modules. - -### Tips ### - -{| -|width="50%"| [[File:images/leanpub_info-circle.png|50px|class=sidebar-image|information]] -|width="50%"| -#### Triggering extra logic hooks #### - -If you are performing certain actions that may trigger another logic hook (such as saving a bean) then you need to be aware that this will trigger the logic hooks associated with that bean and action. This can be troublesome if this causes a logic hook loop of saves causing further saves. One way around this is to simply be careful of the hooks that you may trigger. If doing so is unavoidable you can usually set an appropriate flag on the bean and then check for that flag in subsequent hooks. -|} - -{| -|width="50%"| [[File:images/leanpub_info-circle.png|50px|class=sidebar-image|information]] -|width="50%"| -#### Think of the user #### - -Most logic hooks will cause additional code which can degrade the users experience. If you have long running code in the after_save the user will need to wait for that code to run. This can be avoided by either ensuring the code runs quickly or by using the Job Queue (see the Job Queue chapter for more information). -|} - - -
diff --git a/_source/ebooks/chap13.ml b/_source/ebooks/chap13.ml deleted file mode 100644 index 4d54819a7..000000000 --- a/_source/ebooks/chap13.ml +++ /dev/null @@ -1,423 +0,0 @@ ---- -permalink: "/chap13.html" -layout: page -title: "Chapter 13" ---- - - -
- -## 13. Scheduled Tasks ## - -### Intro ### - -Scheduled tasks are performed in SuiteCRM by the scheduler module. Jobs are placed into the queue either through the defined scheduled tasks or, for one off tasks, by code creating job objects. Note that both scheduled tasks and using the job queue requires that you have the schedulers set up. This will vary depending on your system but usually requires adding an entry either to Cron (for Linux systems) or to the windows scheduled tasks (for windows). Opening the scheduled tasks page within SuiteCRM will let you know the format for the entry. - -### Scheduler ### - -Scheduled tasks allow SuiteCRM to perform recurring tasks. Examples of these which ship with SuiteCRM include checking for incoming mail, sending email reminder notifications and indexing the full text search. What if you want to create your own tasks? - -SuiteCRM lets you define your own Scheduler. We do this by creating a file in
-custom/Extension/modules/Schedulers/Ext/ScheduledTasks/. You can give this file a name of your choice but it is more helpful to give it a descriptive name. Let’s create a simple file named
-custom/Extension/modules/Schedulers/Ext/ScheduledTasks/CleanMeetingsScheduler.php. This will add a new job to the job strings and a new method that the scheduler will call: - -
- -Example 13.1: Example Clean Meetings Scheduler - - ------ - -
- -
 1 <?php
- 2 /*
- 3  * We add the method name to the $job_strings array.
- 4  * This is the method that jobs for this scheduler will call.
- 5  */
- 6 $job_strings[] = 'cleanMeetingsScheduler';
- 7 
- 8 /**
- 9  * Example scheduled job to change any 'Planned' meetings older than a month
-10  * to 'Not Held'.
-11  * @return bool
-12  */
-13 function cleanMeetingsScheduler(){
-14   //Get the cutoff date for which meetings will be considered
-15 	$cutOff = new DateTime('now - 1 month');
-16 	$cutOff = $cutOff->format('Y-m-d H:i:s');
-17 
-18 	//Get an instance of the meetings bean for querying
-19   //see the Working With Beans chapter.
-20   $bean = BeanFactory::getBean('Meetings');
-21 
-22   //Get the list of meetings older than the cutoff that are marked as Planned
-23   $query = "meetings.date_start < '$cutOff' AND meetings.status = 'Planned'";
-24   $meetings = $bean->get_full_list('',$query);
-25 
-26   foreach($meetings as $meeting){
-27     //Mark each meeting as Not Held
-28     $meeting->status = 'Not Held';
-29     //Save the meeting changes
-30     $meeting->save();
-31   }
-32   //Signify we have successfully ran
-33   return true;
-34 }
- -
- ------ - - -
-We also make sure that we add a language file in
-custom/Extension/modules/Schedulers/Ext/Language/en_us.cleanMeetingsScheduler.php again, the name of the file doesn’t matter but it is helpful to use something descriptive. This will define the language string for our job so the user sees a nice label. See the section on language strings for more information. The key for the mod strings will be LBL_UPPERMETHODNAME. In our case our method name is cleanMeetingsScheduler so our language label key will be LBL_CLEANMEETINGSSCHEDULER. - -
- -Example 13.2: Example Language string for Clean Meetings Scheduler - - ------ - -
- -
1 <?php
-2 //We add the mod string for our method here.
-3 $mod_strings['LBL_CLEANMEETINGSSCHEDULER'] = 'Mark old, planned meetings as Not \
-4 Held';
- -
- ------ - - -
-If we perform a repair and rebuild our method will now be packaged up into the scheduler ext file (see the Extensions section for more information on this process) and will be available in the schedulers page. Note that for any changes to the scheduler method you will need to perform another quick repair and rebuild - even in developer mode. We can now create a new scheduler to call our new method: - -
- -[[File:images/CreateMeetingsScheduler.png|Creating a scheduler that uses our new method]] -Creating a scheduler that uses our new method - - -
-This will now behave just like any other scheduler and we can have this run as often (or as rarely) as we would like. Take care here. The default frequency is every one minute. If your task is heavy duty or long running this may not be what you would prefer. Here we settle for once a day. - -### Job Queue ### - -Sometimes you will require code to perform a long running task but you do not need the user to wait for this to be completed. A good example of this is sending an email in a logic hook (see the Logic Hooks chapter for information on these). Assuming we have the following logic hook: - -
- -Example 13.3: Example Email sending Logic Hook - - ------ - -
- -
 1 class SomeClass
- 2 {
- 3     function SomeMethod($bean, $event, $arguments)
- 4     {
- 5 
- 6         //Perform some setup of the email class
- 7         require_once "include/SugarPHPMailer.php";
- 8         $mailer=new SugarPHPMailer();
- 9         $admin = new Administration();
-10         $admin->retrieveSettings();
-11         $mailer->prepForOutbound();
-12         $mailer->setMailerForSystem();
-13         $admin = new Administration();
-14         $admin->retrieveSettings();
-15         $admin->settings['notify_fromname']
-16         $mailer->From     = $admin->settings['notify_fromaddress']
-17         $mailer->FromName = $emailSettings['from_name'];
-18         $mailer->IsHTML(true);
-19 
-20         //Add message and recipient.
-21         //We could go all out here and load and populate an email template
-22         //or get the email address from the bean
-23         $mailer->Subject = 'My Email Notification! '.$bean->name;
-24         $mailer->Body = $event. ' fired for bean '.$bean->name;
-25         $mailer->AddAddress('Jim@example.com');
-26         return $mailer->Send();
-27     }
-28 }
- -
- ------ - - -
-This will work fine. However you do not want the user to have to wait for the email to be sent out as this can cause the UI to feel sluggish. Instead you can create a Job and place it into the job queue and this will be picked by the scheduler. Let’s look at an example of how you would do this. - -First we want our Logic Hook class to create the scheduled job: - -
- -Example 13.4: Example Scheduled Job Creation - - ------ - -
- -
 1 class SomeClass
- 2 {
- 3     function SomeMethod($bean, $event, $arguments)
- 4     {
- 5       require_once 'include/SugarQueue/SugarJobQueue.php';
- 6       $scheduledJob = new SchedulersJob();
- 7 
- 8       //Give it a useful name
- 9       $scheduledJob->name = "Email job for {$bean->module_name} {$bean->id}";
-10 
-11       //Jobs need an assigned user in order to run. You can use the id
-12       //of the current user if you wish, grab the assigned user from the
-13       //current bean or anything you like.
-14       //Here we use the default admin user id for simplicity
-15       $scheduledJob->assigned_user_id = '1';
-16 
-17       //Pass the information that our Email job will need
-18       $scheduledJob->data = json_encode(array(
-19                                             'id' => $bean->id,
-20                                             'module' => $bean->module_name)
-21                                         );
-22 
-23       //Tell the scheduler what class to use
-24       $scheduledJob->target = "class::BeanEmailJob";
-25 
-26       $queue = new SugarJobQueue();
-27       $queue->submitJob($scheduledJob);
-28     }
-29 }
- -
- ------ - - -
-Next we create the BeanEmailJob class. This is placed into the
-custom/Extensions/modules/Schedulers/Ext/ScheduledTasks/ directory with the same name as the class. So in our example we will have:
-custom/Extensions/modules/Schedulers/Ext/ScheduledTasks/BeanEmailJob.php - -
- -Example 13.5: Example Scheduler job - - ------ - -
- -
 1 class BeanEmailJob implements RunnableSchedulerJob
- 2 {
- 3   public function run($arguments)
- 4   {
- 5 
- 6     //Only different part of the email code.
- 7     //We grab the bean using the supplied arguments.
- 8     $arguments = json_decode($arguments,1);
- 9     $bean = BeanFactory::getBean($arguments['module'],$arguments['id']);
-10 
-11     //Perform some setup of the email class
-12     require_once "include/SugarPHPMailer.php";
-13     $mailer=new SugarPHPMailer();
-14     $admin = new Administration();
-15     $admin->retrieveSettings();
-16     $mailer->prepForOutbound();
-17     $mailer->setMailerForSystem();
-18     $admin = new Administration();
-19     $admin->retrieveSettings();
-20     $mailer->From     = $admin->settings['notify_fromaddress'];
-21     $mailer->FromName = $emailSettings['from_name'];
-22     $mailer->IsHTML(true);
-23 
-24     //Add message and recipient.
-25     //We could go all out here and load and populate an email template
-26     //or get the email address from the bean
-27     $mailer->Subject = 'My Email Notification! '.$bean->name;
-28     $mailer->Body = $event. ' fired for bean '.$bean->name;
-29     $mailer->AddAddress('Jim@example.com');
-30     return $mailer->Send();
-31   }
-32   public function setJob(SchedulersJob $job)
-33   {
-34     $this->job = $job;
-35   }
-36 }
- -
- ------ - - -
-Now whenever a user triggers the hook it will be much quicker since we are simply persisting a little info to the database. The scheduler will run this in the background. - -#### Retries #### - -Occasionally you may have scheduled jobs which could fail intermittently. Perhaps you have a job which calls an external API. If the API is unavailable it would be unfortunate if the job failed and was never retried. Fortunately the SchedulersJob class has two properties which govern how retries are handled. These are requeue and retry_count. - -; requeue -: Signifies that this job is eligible for retries. -; retry_count -: Signifies how many retries remain for this job. If the job fails this value will be decremented. - -We can revisit our previous example and add two retries: - -
- -Example 13.6: Setting the retry count on a scheduled job - - ------ - -
- -
 6       $scheduledJob = new SchedulersJob();
- 7 
- 8       //Give it a useful name
- 9       $scheduledJob->name = "Email job for {$bean->module_name} {$bean->id}";
-10 
-11       //Jobs need an assigned user in order to run. You can use the id
-12       //of the current user if you wish, grab the assigned user from the
-13       //current bean or anything you like.
-14       //Here we use the default admin user id for simplicity
-15       $scheduledJob->assigned_user_id = '1';
-16 
-17       //Pass the information that our Email job will need
-18       $scheduledJob->data = json_encode(array(
-19                                             'id' => $bean->id,
-20                                             'module' => $bean->module_name)
-21                                         );
-22 
-23       //Tell the scheduler what class to use
-24       $scheduledJob->target = "class::BeanEmailJob";
-25 
-26       //Mark this job for 2 retries.
-27       $scheduledJob->requeue = true;
-28       $scheduledJob->retry = 2;
- -
- ------ - - -
-See the section on [[#chap11.xhtml#logic-hooks-chapter|logic hooks]] for more information on how job failures can be handled. - -### Debugging ### - -With Scheduled tasks and jobs running in the background it can sometimes be difficult to determine what is going on when things go wrong. If you are debugging a scheduled task the the scheduled task page is a good place to start. For both scheduled tasks and job queue tasks you can also check the job_queue table. For example, in MySQL we can check the last five scheduled jobs: - -
- -Example 13.7: Example MySQL query for listing jobs - - ------ - -
- -
SELECT * FROM job_queue ORDER BY date_entered DESC LIMIT 5
- -
- ------ - - -
-This will give us information on the last five jobs. Alternatively we can check on specific jobs: - -
- -Example 13.8: Example MySQL query for listing BeanEmailJobs - - ------ - -
- -
SELECT * FROM job_queue WHERE target = 'class::BeanEmailJob'
- -
- ------ - - -
-In either case this will give details for the job(s): - -
- -Example 13.9: Example MySQL list of jobs - - ------ - -
- -
*************************** 1. row ***************************
-assigned_user_id: 1
-              id: 6cdf13d5-55e9-946e-9c98-55044c5cecee
-            name: Email job for Accounts 103c4c9b-336f-0e87-782e-5501defb5900
-         deleted: 0
-    date_entered: 2015-03-14 14:58:15
-   date_modified: 2015-03-14 14:58:25
-    scheduler_id:
-    execute_time: 2015-03-14 14:58:00
-          status: done
-      resolution: success
-         message: NULL
-          target: class::BeanEmailJob
-            data: {"id":"103c4c9b-336f-0e87-782e-5501defb5900","module":"Account\
-s"}
-         requeue: 0
-     retry_count: NULL
-   failure_count: NULL
-       job_delay: 0
-          client: CRON3b06401793b3975cd00c0447c071ef9a:7781
-percent_complete: NULL
-1 row in set (0.00 sec)
- -
- ------ - - -
-Here we can check the status, resolution and message fields. If the status is queued then either the scheduler has not yet run or it isn’t running. Double check your Cron settings if this is the case. - -It may be the case that the job has ran but failed for some reason. In this case you will receive a message telling you to check the logs. Checking the logs usually provides enough information, particularly if you have made judicious use of logging (see the chapter on logging) in your job. - -It is possible that the job is failing outright, in which case your logging may not receive output before the scheduler exits. In this case you can usually check your PHP logs. - -As a last resort you can manually run the scheduler from the SuiteCRM directory using: - -
- -Example 13.10: Running the scheduler manually - - ------ - -
- -
php -f cron.php
- -
- ------ - - -
-Using this in addition to outputting any useful information should track down even the oddest of bugs. - - -
diff --git a/_source/ebooks/chap14.ml b/_source/ebooks/chap14.ml deleted file mode 100644 index fee8adf17..000000000 --- a/_source/ebooks/chap14.ml +++ /dev/null @@ -1,158 +0,0 @@ ---- -permalink: "/chap14.html" -layout: page -title: "Chapter 14" ---- - - -
- -## 14. Extension Framework ## - -### Introduction ### - -The extension framework provides a means to modify various application data inside SuiteCRM. For example it provides a way to add or modify vardefs, scheduled tasks, language strings and more. In general a folder is provided in custom/Extension (the exact path depends on the extension). This folder is then scanned for files which will be consolidated into a single ext file which SuiteCRM will then read and use. In this way it is possible for developers to add a new file to affect the behaviour of SuiteCRM rather than altering existing files. This makes the changes more modular and allows the easy addition or removal of changes. Additionally, because these files are all consolidated it means that there is no affect on performance of checking a (possibly large) number of files. This is only done when performing a repair and rebuild in the admin menu. - -### Standard Extensions ### - -List of standard SuiteCRM extensions - -{| -! Extension Directory -! Compiled file -! Module -! Description -|- -| ActionViewMap -| action_view_map.ext.php -|   -| Used to map actions for a module to a specified view. -|- -| ActionFileMap -| action_file_map.ext.php -|   -| Used to map actions for a module to a specified file. -|- -| ActionReMap -| action_remap.ext.php -|   -| Used to map actions for a module to existing actions. -|- -| Administration -| administration.ext.php -| Administration -| Used to add new sections to the administration panel. -|- -| EntryPointRegistry -| entry_point_registry.ext.php -| application -| Used to add new entry points to SuiteCRM. See the chapter on [[#chap07.xhtml#entry-point-chapter|Entry Points]]. -|- -| Extensions -| extensions.ext.php -| application -| Used to add new extension types. -|- -| FileAccessControlMap -| file_access_control_map.ext.php -|   -| Used to add, update or delete entries in the access control lists for files. -|- -| Language -| N/A[[#chap13.xhtml#fn-langNote|1]] -|   -| Used to add, update or delete language strings for both modules and app strings. See the chapter on [[#chap08.xhtml#language-chapter|Language Strings]]. -|- -| Layoutdefs -| layoutdefs.ext.php -|   -| Used to add, update or delete subpanel definitions for a module. -|- -| GlobalLinks -| links.ext.php -| application -| Used to add, update or delete global links (the list of links that appear in the top right of the SuiteCRM UI). -|- -| LogicHooks -| logichooks.ext.php -|   -| Used to add, update or delete logic hooks. See the chapter on [[#chap11.xhtml#logic-hooks-chapter|Logic Hooks]]. -|- -| Include -| modules.ext.php -| application -| Used to register new beans and modules. -|- -| Menus -| menu.ext.php -|   -| Used to add, update or delete the menu links for each module. -|- -| ScheduledTasks -| scheduledtasks.ext.php -| Schedulers -| Used to add new scheduled tasks. See the chapter on [[#chap12.xhtml#scheduled-tasks-chapter|Scheduled Tasks]]. -|- -| UserPage -| userpage.ext.php -| Users -| Unused -|- -| Utils -| custom_utils.ext.php -| application -| Used to add new utility methods. -|- -| Vardefs -| vardefs.ext.php -|   -| Used to add, update or delete vardefs for a module. See the section on [[#chap03.xhtml#vardefs-chapter|Vardefs]]. -|- -| JSGroupings -| jsgroups.ext.php -|   -| Used to add, update or delete JavaScript groupings. -|- -| Actions -| actions.ext.php -| AOW_Actions -| Used to add new WorkFlow actions. -|} - -### Custom Extensions ### - -Interestingly the extension framework can be used to add new extensions. This allows you to create customisations that are easily customised by others (in a similar manner to, for example, how vardefs can be added - see the chapter on [[#chap03.xhtml#vardefs-chapter|Vardefs]]). - -To create a custom extension you simply add a new file in
-custom/Extension/application/Ext/Extensions. This can be given a name of your choosing. Our example will use
-custom/Extension/application/Ext/Extensions/SportsList.php and will look like: - -
- -Example 14.1: Adding an entry point entry - - ------ - -
- -
1 <?php
-2 $extensions["sports_list"] =  array(
-3                 "section" => "sports_list",
-4                 "extdir" => "SportsList",
-5                 "file" => 'sportslist.ext.php',
-6                 "module" => "");
- -
- ------ - - -
-Now when a Quick Repair and rebuild is run any files in
-custom/Extension/application/Ext/SportsList/ will be consolidated into
-custom/application/Ext/SportsList/sportslist.ext.php. On it’s own this file will not do anything but you are now able to write custom code that checks the consolidated file rather than having to worry about searching for customisations. - -
- -
    diff --git a/_source/ebooks/chap15.ml b/_source/ebooks/chap15.ml deleted file mode 100644 index db898a6c5..000000000 --- a/_source/ebooks/chap15.ml +++ /dev/null @@ -1,16 +0,0 @@ ---- -permalink: "/chap15.html" -layout: page -title: "Chapter 15" ---- -
  1. - - - -
    -The language extensions are treated specially and, as such, aren’t compiled to a single file.[[#chap13.xhtml#fnref-langNote|↩]]
- - -
- -
diff --git a/_source/ebooks/chap16.ml b/_source/ebooks/chap16.ml deleted file mode 100644 index 9a5e9753c..000000000 --- a/_source/ebooks/chap16.ml +++ /dev/null @@ -1,429 +0,0 @@ ---- -permalink: "/chap16.html" -layout: page -title: "Chapter 16" ---- - - -
- -## 15. Module Installer ## - -As detailed in the other chapters of this book there are many ways to customise SuiteCRM. The module installer allows you to package these changes and install them onto other SuiteCRM instances. This is achieved by creating a package. - -At the minimum a package is a zip file that contains a manifest.php file in it’s root. The manifest file is responsible for providing information about the installer as well as providing information on how to install the package. - -### manifest.php ### - -The manifest.php file contains the definition of three arrays. Let’s look at each of these arrays in turn. See [[#chap19.xhtml#appendix-a|Appendix A]] for the full sample manifest.php file. - -{| -|width="50%"| [[File:images/leanpub_info-circle.png|50px|class=sidebar-image|information]] -|width="50%"| Within path in the manifest file you can use <basepath> to refer to the base directory of the installer. For example <basepath>/Foo.txt will refer to the Foo.txt file in the root of the installer package. -|} - -#### $manifest #### - -The $manifest array provides information on the package itself such as it’s name, readme etc. (it also defines the copy array for patch packages). A sample definition of the manifest array will appear something like this: - -
- -Example 15.1: Example $manifest array definition - - ------ - -
- -
 1 $manifest = array(
- 2   'name' => 'My First Package',
- 3   'description' => 'This is a simple package example manifest file',
- 4   'version' => '1.5',
- 5   'author' => 'Jim Mackin',
- 6   'readme' => 'readme.txt',
- 7   'acceptable_sugar_flavors' => array('CE'),
- 8   'acceptable_sugar_versions' => array(
- 9     'exact_matches' => array(),
-10     'regex_matches' => array('6\\.5\\.[0-9]$'),
-11   ),
-12   'copy_files' => array (
-13     'from_dir' => '<basepath>/custom/',    
-14     'to_dir' => 'custom',     
-15     'force_copy' => array (),
-16   ),
-17   'dependencies' => array(
-18     array(
-19       'id_name' => 'example_dependency_package',
-20       'version' => '2.4',
-21     ),
-22   ),
-23 );
- -
- ------ - - -
-; name -: The name of the package. This is how the package will appear to the user during installation and in the Module Loader package list. The package name is required. -; description -: A brief description of the package. -; version -: The version of this package. This can be any string but is usually a traditional version number (such as 3.1.4). -; author -: The author of the package. -; readme -: A brief readme string. Note that if a README.txt is found in the root of the package this will be used instead. -; acceptable_sugar_flavors -: A remnant of the SugarCRM packages. This should always be an array with (at least) a CE entry. If you would like the installer to target both SuiteCRM and SugarCRM editions then this can contain one of the other SugarCRM flavours (PRO, CORP , ULT or ENT). -; acceptable_sugar_versions -: An array detailing the matching SugarCRM versions. Note that the SugarCRM version is distinct from the SuiteCRM version. This array has two keys. exact_matches is simply an array of the allowed versions. regex_matches allows specifying regexes to match versions. For SuiteCRM you only need to worry about supporting the 6.5.* versions which can be matched with the regex 6\\.5\\.[0-9]$. At the time of writing the current SugarCRM version for SuiteCRM is 6.5.20. -; copy_files -: This is only used for patch installers and will copy files in the from_dir key to those in the to_dir key. Finally the force_copy key can be used to specify files that should be forcibly copied over. -; dependencies -: An array of other packages that are relied on by this package. Each entry is an array with id_name - the id of the package and version - the required version of the package. -; icon -: The path (within the installer) to an icon to be displayed during installation. -; is_uninstallable -: Whether or not uninstalls should be allowed. -; published_date -: The date that the package was published. There is no fixed format for the date, it is simply a string. -; key -: Specifies a key to ensure that modules do not clash. This will prefix the installed modules and tables with key. This is used by the module builder when creating packages but can be specified if you wish. -; remove_tables -: A string specifying whether module tables should be removed when uninstalling this package. Accepted values are true, false and prompt. The default is true. -; type -: The type of the installer, one of langpack, module, patch or theme. See the types section. - -#### $install_defs #### - -Provides information on how the package is to be installed, which files go where and any additional information such as logic hooks, custom fields etc. - -####= id ####= - -A unique identifier for the module. - -####= connectors ####= - -An array of connectors to be installed. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| name -| The name of the connector. -|- -| connector -| The directory to copy the connector files from. -|- -| formatter -| The directory to copy the connector formatter files from. -|} - -####= copy ####= - -An array of files and directories to be copied on install. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| from -| The source file/directory in the package. -|- -| to -| The destination file/directory. -|} - -{| -|width="50%"| [[File:images/leanpub_info-circle.png|50px|class=sidebar-image|information]] -|width="50%"| In general if a file can be handled by one of the other keys then that key should be used. For example new admin entries should be copied using the administration key rather than using the copy key. -|} - -####= dashlets ####= - -An array of dashlets to be installed. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| name -| The name of the new dashlet. -|- -| from -| The path in the install package from which the dashlet files will be copied. -|} - -####= language ####= - -An array of language files to be installed. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| from -| The location of the language file inside the package. -|- -| to_module -| The module this language file is intended for (or ‘application’ for application language strings). -|- -| language -| The language that this file is for (i.e. en_us or es_es). -|} - -See the chapter on [[#chap08.xhtml#language-chapter|Language Strings]] for more information. - -####= layoutdefs ####= - -An array of layoutdef files which are used to add, remove or edit subpanels. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| from -| The path in the package to the file to be installed. -|- -| to_module -| The module that this file will be installed to. -|} - -####= vardefs ####= - -An array of the vardefs to be added to specific modules. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| from -| The location of the vardef file in the package. -|- -| to_module -| The destination module. -|} - -{| -|width="50%"| [[File:images/leanpub_info-circle.png|50px|class=sidebar-image|information]] -|width="50%"| Generally you should install custom fields using the custom_fields key. However this key can be used to alter existing fields or add more complex fields. -|} - -####= menu ####= - -An array of menus to be installed. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| from -| The location of the menu file in the package. -|- -| to_module -| The destination module for this menu. -|} - -####= beans ####= - -An array of beans to be installed. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| module -| The name of the module. -|- -| class -| The name of the bean class. -|- -| path -| The path (within the package) to the bean file. -|- -| tab -| Whether or not a tab should be added for this module. -|} - -####= relationships ####= - -An array detailing any new relationships added (in particular relationships where one side is an existing module). Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| module -| The module that this relationship will be attached to. -|- -| meta_data -| The location of the metadata file for this relationship. -|} - -####= custom_fields ####= - -An array of new custom fields to be installed (See the [[#chap03.xhtml#vardefs-chapter|Vardefs]] chapter for more information on this). Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| name -| The name of the new custom field. -|- -| label -| The key for the language string which will act as the label for this custom field. -|- -| type -| The type of this custom field. -|- -| max_size -| For string field types, the maximum number of characters. -|- -| require_option -| Whether or not the field is required. -|- -| default_value -| The default value of this field. -|- -| ext1 -| Extended field information. Different field types will use this value differently. For example Enum fields will store the key for the options in this field, decimal and float fields will store the precision. -|- -| ext2 -| Extended field information. Different field types will use this value differently. For example, dynamic dropdowns will store the parent dropdown, text areas will store the number of rows. -|- -| ext3 -| Extended field information. Different field types will use this value differently. For example, text areas will store the number of columns. -|- -| ext4 -| Extended field information. Different field types will use this value differently. For HTML field types this will store the HTML. -|- -| audited -| Whether or not changes to this field should be audited. -|- -| module -| Used to specify the module where the custom field will be added. -|} - -####= logic_hooks ####= - -An array of logic hooks to be installed. See the [[#chap11.xhtml#logic-hooks-chapter|Logic Hooks]] chapter for more information. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| module -| The module to where this logic hook should be installed. Leaving this empty will install into the top level logic hook. -|- -| hook -| The logic hook type (i.e. after_save, after_login, etc.). -|- -| order -| The sort order for this logic hook. -|- -| description -| A description of the hook. -|- -| file -| The file containing the class for this logic hook, relative to the SuiteCRM root. -|- -| class -| The class that contains the logic hook function that should be called by this hook. -|- -| function -| The function to be invoked when this hook is triggered. -|} - -####= image_dir ####= - -A path to a directory of images to be included in the install. - -####= schedulers ####= - -An array of schedulers to be installed. Each entry is an array with a single key: - -{| -! Key -! Description -|- -| from -| The file containing the new scheduled task. -|} - -####= administration ####= - -An array of admin panels to be installed. Each entry is an array with a single key: - -{| -! Key -! Description -|- -| from -| The file containing the new admin panel definition. -|} - -####= pre_execute ####= - -Defines an array of files to be executed before the package is installed. Each entry is a path to a file within the package. Any output will be displayed to the user in the install log. - -####= post_execute ####= - -Defines an array of files to be executed after the package is installed. Each entry is a path to a file within the package. Any output will be displayed to the user in the install log. - -####= pre_uninstall ####= - -Defines an array of files to be executed before the package is uninstalled. Each entry is a path to a file within the package. Any output will be displayed to the user in the uninstall log. - -####= post_uninstall ####= - -Defines an array of files to be executed after the package is uninstalled. Each entry is a path to a file within the package. Any output will be displayed to the user in the uninstall log. - -#### $upgrade_manifest #### - -Provides a means of upgrading an already installed package by providing different install_defs. - -
- - - -
-### Types ### - -{| -! Type -! Description -|- -| langpack -| A language installer. This will add an entry to the language dropdown. -|- -| module -| A module installer. Will install new modules and/or functionality. -|- -| patch -| A patch installer. This is used to upgrade SuiteCRM. -|- -| theme -| A theme installer. This will add a new option to the themes. -|} - -#### Other files #### - -; README.txt -: Contains the readme for this package. If README.txt and a readme entry in the manifest.php is defined then this file will be used. -; LICENSE.txt -: Provides information on the license for this package. -; scripts/pre_install.php -: A PHP script which defines a method pre_install(). This method will be called before the package is installed. Any output will be displayed to the user in the install log. -; scripts/post_install.php -: A PHP script which defines a method post_install(). This method will be called after the package is installed. -; scripts/pre_uninstall.php -: A PHP script which defines a method pre_uninstall(). This method will be called before the package is uninstalled. -; scripts/post_uninstall.php -: A PHP script which defines a method post_uninstall(). This method will be called after the package is uninstalled. - - -
diff --git a/_source/ebooks/chap17.ml b/_source/ebooks/chap17.ml deleted file mode 100644 index 3dd019829..000000000 --- a/_source/ebooks/chap17.ml +++ /dev/null @@ -1,419 +0,0 @@ ---- -permalink: "/chap17.html" -layout: page -title: "Chapter 17" ---- - - -
- -## 16. API ## - -The SuiteCRM API allows third party code to access and edit SuiteCRM data and functionality. - -### Using the API ### - -SuiteCRM has both a REST and a SOAP API. Which API you want to use will largely come down to personal preference and the support for SOAP/REST libraries in whichever language you will be using. - -Both APIs will require a username and password. It is usual to create a user specifically for the API. - -#### SOAP #### - -The WSDL for the SOAP API can be found at: - -
- -Example 16.1: SOAP API WSDL Location - - ------ - -
- -
example.com/suitecrm/service/v4_1/soap.php?wsdl
- -
- ------ - - -
-Where example.com/suitecrm is the address of your SuiteCRM instance. v4_1 is the version of the API and can be changed, v4_1 is the latest version at the time of writing. - -####= SOAP Example ####= - -The following PHP example uses the built in SoapClient class. - -
- -Example 16.2: Accessing the SOAP API - - ------ - -
- -
 1 <?php
- 2 //Create a new SoapClient
- 3 $wsdlURL = "http://example.com/suitecrm/service/v4_1/soap.php?wsdl";
- 4 $client = new SoapClient($wsdlURL);
- 5 
- 6 //Login to the API and get the session id
- 7 $userAuth = array(
- 8         'user_name' => '<suitecrmuser>',
- 9         'password' => md5('<suitecrmpassword>'),
-10 );
-11 $appName = 'My SuiteCRM SOAP Client';
-12 $nameValueList = array();
-13 $loginResults = $client->login($userAuth, $appName, $nameValueList);
-14 
-15 //Get a list of at most 10 accounts with a billing address in Ohio. Along with
-16 //The first and last names of any contacts in that Account.
-17 $results = $client->get_entry_list(
-18         //Session id - retrieved from login call
-19         $loginResults->id,
-20         //Module to get_entry_list for
-21         'Accounts',
-22         //Filter query - Added to the SQL where clause
-23         "accounts.billing_address_city = 'Ohio'",
-24         //Order by - unused
-25         '',
-26         //Start with the first record
-27         0,
-28         //Return the id and name fields
-29         array('id','name'),
-30         //Link to the "contacts" relationship and retrieve the
-31         //First and last names.
-32         array(
-33                 array(
-34                         'name' => 'contacts',
-35                         'value' => array(
-36                                 'first_name',
-37                                 'last_name',
-38                         ),
-39                 ),
-40         ),
-41         //Show 10 max results
-42         10,
-43         //Do not show deleted
-44         0
-45 );
-46 print_r($results);
- -
- ------ - - -
-
- - - -
-#### REST #### - -The SuiteCRM REST API can be found at: - -
- -Example 16.3: REST API Endpoint Location - - ------ - -
- -
example.com/suitecrm/service/v4_1/rest.php
- -
- ------ - - -
-Where example.com/suitecrm is the address of your SuiteCRM instance. v4_1 is the version of the API and can be changed, v4_1 is the latest version at the time of writing. - -The SuiteCRM REST API is not a true REST API - all calls are performed as POSTs and all calls are to the base URL with the method passed in as a post argument. - -; The arguments to the REST API calls are:
-method -: The method which will be called, i.e. login or get_entry_list. See [[#chap20.xhtml#appendix-b|Appendix B]] for a list of API methods. -; input_type -: The input type of the rest_data. This is usually JSON but can also be Serialize. -; response_type -: How the response will be encoded. This is usually JSON but can also be Serialize. -; rest_data -: Any other arguments that are required by this method. This is passed as an encoded array. The encoding is determined by input_type. - -{| -|width="50%"| [[File:images/leanpub_warning.png|50px|class=sidebar-image|warning]] -|width="50%"| Note that, for REST requests it is the order of the arguments that matter in rest_data and not the name. -|} - -
- - - -
-####= Examples ####= - -
- -Example 16.4: Accessing the REST API - - ------ - -
- -
 1 <?php
- 2 
- 3 $url = "http://example.com/suitecrm/service/v4_1/rest.php";
- 4 
- 5 function restRequest($method, $arguments){
- 6 	global $url;
- 7 	$curl = curl_init($url);
- 8 	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
- 9 	$post = array(
-10 			"method" => $method,
-11 			"input_type" => "JSON",
-12 			"response_type" => "JSON",
-13 			"rest_data" => json_encode($arguments),
-14 	);
-15 
-16 	curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
-17 
-18 	$result = curl_exec($curl);
-19 	curl_close($curl);
-20 	return json_decode($result,1);
-21 }
-22 
-23 
-24 $userAuth = array(
-25         'user_name' => 'suitecrmuser',
-26         'password' => md5('suitecrmpassword'),
-27 );
-28 $appName = 'My SuiteCRM REST Client';
-29 $nameValueList = array();
-30 
-31 $args = array(
-32             'user_auth' => $userAuth,
-33             'application_name' => $appName,
-34             'name_value_list' => $nameValueList);
-35 
-36 $result = restRequest('login',$args);
-37 $sessId = $result['id'];
-38 
-39 $entryArgs = array(
-40   //Session id - retrieved from login call
-41 	'session' => $sessId,
-42   //Module to get_entry_list for
-43 	'module_name' => 'Accounts',
-44   //Filter query - Added to the SQL where clause,
-45 	'query' => "accounts.billing_address_city = 'Ohio'",
-46   //Order by - unused
-47 	'order_by' => '',
-48   //Start with the first record
-49 	'offset' => 0,
-50   //Return the id and name fields
-51 	'select_fields' => array('id','name',),
-52 	//Link to the "contacts" relationship and retrieve the
-53 	//First and last names.
-54 	'link_name_to_fields_array' => array(
-55 			array(
-56 					'name' => 'contacts',
-57 					'value' => array(
-58 							'first_name',
-59 							'last_name',
-60 					),
-61 			),
-62 	),
-63   //Show 10 max results
-64 	'max_results' => 10,
-65   //Do not show deleted
-66 	'deleted' => 0,
-67 );
-68 $result = restRequest('get_entry_list',$entryArgs);
-69 
-70 print_r($result);
- -
- ------ - - -
-For a full list of API methods and their arguments see [[#chap20.xhtml#appendix-b|Appendix B]]. - -### Adding custom API methods ### - -Sometimes the existing API methods are not sufficient or using them for a task would be overly complex. SuiteCRM allows the web services to be extended with additional methods or overriding existing methods. - -The recommended path for custom entry points is the following
-custom/service/<version>_custom/. At the time of writing the latest web service version is v4_1 so this would be custom/service/v4_1_custom/. - -Next we create the implementing class. This will create our new method. In our example we will simply create a new method which writes to the SuiteCRM log We will call this method
-write_log_message. - -
- -Example 16.5: Custom v4_1 Web Service Implementation - - ------ - -
- -
 1 <?php
- 2 if(!defined('sugarEntry')){
- 3   define('sugarEntry', true);
- 4 }
- 5 require_once 'service/v4_1/SugarWebServiceImplv4_1.php';
- 6 class SugarWebServiceImplv4_1_custom extends SugarWebServiceImplv4_1
- 7 {
- 8 
- 9   function write_log_message($session, $message)
-10   {
-11     $GLOBALS['log']->info('Begin: write_log_message');
-12 
-13     //Here we check that $session represents a valid session
-14     if (!self::$helperObject->checkSessionAndModuleAccess(
-15                                                     $session, 
-16                                                     'invalid_session', 
-17                                                     '', 
-18                                                     '', 
-19                                                     '',  
-20                                                     new SoapError()))
-21     {
-22       $GLOBALS['log']->info('End: write_log_message.');
-23       return false;
-24     }
-25     $GLOBALS['log']->info($message);
-26     return true;
-27   }
-28 }
- -
- ------ - - -
-Next we create the registry file which will register our new method. - -
- -Example 16.6: Custom v4_1 web service registry - - ------ - -
- -
 1 <?php
- 2     require_once 'service/v4_1/registry.php';
- 3     class registry_v4_1_custom extends registry_v4_1
- 4     {
- 5         protected function registerFunction()
- 6         {
- 7             parent::registerFunction();
- 8             $this->serviceClass->registerFunction('write_log_message', 
- 9                                                   array(
-10                                                     'session'=>'xsd:string',
-11                                                     'message'=>'xsd:string'), 
-12                                                   array(
-13                                                     'return'=>'xsd:boolean')
-14                                                   );
-15         }
-16     }
- -
- ------ - - -
-Finally we create the entry point. This is the actual file that will be called by our API clients. This will reference the two files which we have created and will call the webservice implementation with our files. - -
- -Example 16.7: Custom v4_1 REST Entry point - - ------ - -
- -
 1 <?php
- 2 chdir('../../..');
- 3 
- 4 require_once 'SugarWebServiceImplv4_1_custom.php';
- 5 
- 6 $webservice_path = 'service/core/SugarRestService.php';
- 7 $webservice_class = 'SugarRestService';
- 8 $webservice_impl_class = 'SugarWebServiceImplv4_1_custom';
- 9 $registry_path = 'custom/service/v4_1_custom/registry.php';
-10 $registry_class = 'registry_v4_1_custom';
-11 $location = 'custom/service/v4_1_custom/rest.php';
-12 
-13 require_once 'service/core/webservice.php';
- -
- ------ - - -
-
- -Example 16.8: Custom v4_1 SOAP Entry point - - ------ - -
- -
 1 <?php
- 2 chdir('../../..');
- 3 require_once('SugarWebServiceImplv4_1_custom.php');
- 4 $webservice_class = 'SugarSoapService2';
- 5 $webservice_path = 'service/v2/SugarSoapService2.php';
- 6 $webservice_impl_class = 'SugarWebServiceImplv4_1_custom';
- 7 $registry_class = 'registry_v4_1_custom';
- 8 $registry_path = 'custom/service/v4_1_custom/registry.php';
- 9 $location = 'custom/service/v4_1_custom/soap.php';
-10 require_once('service/core/webservice.php');
- -
- ------ - - -
-#### Usage #### - -We can now use our custom endpoint. This is identical to using the API as detailed above, except that we use our custom entry point for either the SOAP WSDL or REST URL. For example using the same SuiteCRM location (example.com/suitecrm) as the above examples and using v4_1, we would use the following - -
- -Example 16.9: Custom v4_1 URLS - - ------ - -
- -
1 //SOAP WSDL
-2 example.com/suitecrm/custom/service/v4_1_custom/soap.php?wsdl
-3 //REST URL
-4 example.com/suitecrm/custom/service/v4_1_custom/rest.php
- -
- ------ - - -
- -
diff --git a/_source/ebooks/chap18.ml b/_source/ebooks/chap18.ml deleted file mode 100644 index 5770763f6..000000000 --- a/_source/ebooks/chap18.ml +++ /dev/null @@ -1,166 +0,0 @@ ---- -permalink: "/chap18.html" -layout: page -title: "Chapter 18" ---- - - -
- -## 17. Best Practices ## - -### Development instances ### - -When making changes you should always use a development or test instance first. This allows you to fully and safely test any changes. - -### Version control ### - -When developing customisations it is prudent to use some form of version control. Version control allows tracking changes to your codebase in addition to rolling back changes. There are many version control systems available. SuiteCRM uses [http://git-scm.com/ Git] although I also like [http://mercurial.selenic.com/ Mercurial]. - -If you are using a development instance (as mentioned above) then Version Control usually allows you to push changes to other versions or to tag releases. This provides a way of pushing changes to live or test instances safely. Crucially it also means that, should there be major problems with a version then this can be easily rolled back. - -### Backup ### - -SuiteCRM has been developed to be customisable. However, mistakes, bugs and other unpleasantness can (and thanks to Murphy’s law, will) happen. You should always ensure, before making any changes, that you have a backup of all files and of the database. - -In order to back up files you can simply create a zip of the SuiteCRM directory and copy it to a safe place. On Linux systems this can be performed using the following: - -
- -Example 17.1: File backup - - ------ - -
- -
tar -czvf suitecrmfilebackup.tar.gz /path/to/suitecrm
- -
- ------ - - -
-Backing up the SuiteCRM database will vary depending on which database you are using. However MySQL backups can be performed using the mysqldump command on Linux as seen here: - -
- -Example 17.2: MySQL Database backup - - ------ - -
- -
mysqldump suitecrmdatabase -u databaseuser -p | gzip -c | cat > suitecrm.sql.gz
- -
- ------ - - -
-### Be upgrade safe ### - -Unless you are making changes to a custom module you should strive in all cases to use the custom framework and make changes in the custom folder. This ensures that, should you make a mistake, rectifying the mistake is as simple as removing the customisation. - -However the main advantage to using custom is that, when you upgrade SuiteCRM in the future you will not have your changes overwritten by the updated SuiteCRM files. See the [[#chap13.xhtml#extensions-chapter|Extensions]] chapter for more information. - -### Use appropriate log levels ### - -Using appropriate log levels (See the chapter on [[#chap10.xhtml#logging-chapter|Logging]]) makes it easier to track down issues. You do not want very important messages to be logged as debug since this will make them difficult to find. Likewise you don’t want unimportant log messages cluttering up the fatal log output. - -### Long running logic hooks ### - -If a logic hook task is long running then you should place it into the job queue (see the [[#chap11.xhtml#logic-hooks-chapter|Logic Hook]] and [[#chap12.xhtml#scheduled-tasks-chapter|Scheduled Tasks]] chapters). - -### Minimise SQL ### - -Where possible you should strive to use the SuiteCRM supplied methods of accessing data. This includes using beans and the BeanFactory where possible (see the chapter on [[#chap02.xhtml#working-with-beans-chapter|Working with beans]]). There are a few reasons for this. The first is that SQL is usually either hardcoded or has to be dynamically built. In the case where the SQL is hardcoded this means that changes to fields will not be reflected thereby making your code more brittle. - -Dynamic SQL is better because it can react to field changes and generally be tailored to fit the situation. However this requires adding extra, often complex, code. It can be hard to account for all situations (this can be especially problematic when attempting to traverse relationships dynamically). - -Another issue is that, usually SQL will end up being Database specific (see the next point for mitigating this however). - -Finally any custom logic (such as Logic Hooks) which would usually be fired for saving beans or relationships will not be fired for SQL queries. - -### SQL Use ### - -In some cases using raw SQL is unavoidable. If that is the case then you should strive to use standard compliant SQL. If database engine specific features need to be used, and you wish to target other database engines, you can check for the DB type. For example: - -
- -Example 17.1: Checking for the database engine - - ------ - -
- -
 1 function getSomeSQLQuery(){
- 2     global $sugar_config;
- 3     switch($sugar_config['dbconfig']['db_type']){
- 4         case 'mssql':
- 5             $sql = 'MSSQL specific SQL';
- 6             break;
- 7         case 'mysql':
- 8         default:
- 9             $sql = 'MySQL specific SQL';
-10             break;
-11     }
-12     return $sql;
-13 }
- -
- ------ - - -
-### Entry check ### - -The majority of SuiteCRM files will start with some variation of the following line: - -
- -Example 17.2: Entry check - - ------ - -
- -
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
- -
- ------ - - -
-This prevents direct access to the file by ensuring that SuiteCRM has been loaded through a valid entry point (i.e. it has been loaded through index.php, cron.php or a custom entry point). - -### Redirect after post ### - -Sometimes you may have custom controller actions (see the controller section) or custom entry points (see the [[#chap07.xhtml#entry-point-chapter|Entry Points]] chapter). These actions and entry points or other pages are usually accessed using POST. After a POST request it is a web best practice to redirect to a different page, especially if your page makes any changes. This prevents the user from refreshing the page and causing a duplicate action. Within SuiteCRM it is best to use the SugarApplication::redirect method to redirect. This simply accepts a URL. As follows: - -
- -Example 17.3: Redirecting within SuiteCRM - - ------ - -
- -
SugarApplication::redirect('index.php?module=<TheModule>');
- -
- ------ - - -
- -
diff --git a/_source/ebooks/chap19.ml b/_source/ebooks/chap19.ml deleted file mode 100644 index afcf5e3f7..000000000 --- a/_source/ebooks/chap19.ml +++ /dev/null @@ -1,92 +0,0 @@ ---- -permalink: "/chap19.html" -layout: page -title: "Chapter 19" ---- - - -
- -## 18. Performance Tweaks ## - -In most cases the performance of SuiteCRM should not be an issue. However in the case of large datasets or systems with many users you may notice some performance degradation. These changes can help improve performance. - -### Server ### - -The server that SuiteCRM runs on is, of course, very important when it comes to the kind of performance you can expect. A full guide on server setup is outside the scope of this book. However there are some things you can do to ensure that you get the best performance out of SuiteCRM. - -#### PHP #### - -Installing a PHP opcode cache will increase the performance of all PHP files. These work by caching the compilation of PHP files resulting in less work on each request. Furthermore SuiteCRM will use the caching API of some PHP accelerators which will further increase performance. If you are using Linux then [http://php.net/manual/en/book.apc.php APC] is the usual choice. Windows users should check out [http://php.net/manual/en/book.wincache.php WinCache]. - -#### MySQL #### - -MySQL is notorious for having small default settings. Fully optimising MySQL is outside the scope of this book (however checkout [http://mysqltuner.pl mysqltuner.pl] for a helpful Perl script which will provide setting recommendations - note that you should be careful when running files from an unknown source). One small change that can make a big difference is increasing the innodb_buffer_pool_size. - -If you have migrated or imported a significant amount of data it is possible that some tables will be fragmented. Running OPTIMIZE TABLE tablename can increase performance. - -### Indexes ### - -Adding indexes on the fields of modules can improve database performance. The core modules usually have important fields indexed. However if you have created a new module or added new, often searched fields to a module then these fields may benefit from being indexed. See the [[#chap03.xhtml#vardefs-chapter|Vardef]] chapter for adding indexes. - -### Config Changes ### - -The following are some config settings that can be used to improve performance. Please note that in most cases you will have better performance gains by first following the steps in previous sections. These settings should be set in the config_override.php file. See the chapter on the [[#chap09.xhtml#config-chapter|Config]] files for more information. - -
- -
- -
$sugar_config['developerMode'] = false;
- -
- -
-Unless you are actively developing on an instance developerMode should be off. Otherwise each page request will cause cached files to be reloaded. - -
- -
- -
$sugar_config['disable_count_query'] = true;
- -
- -
-For systems with large amounts of data the count queries on subpanels used for the pagination controls can become slow thereby causing the page to be sluggish or outright slow to load. Disabling these queries can improve performance dramatically on some pages. - -
- -
- -
$sugar_config['disable_vcr'] = true;
- -
- -
-By default opening the detail view of a record from the list view will also load the other records in the list to allow for easy moving through records. If you do not use this feature, or, if loading the detail view for some records has become slow, you can disable this feature. - -
- -
- -
$sugar_config['list_max_entries_per_page'] = '10';
- -
- -
-The number of records shown in each page of the list view can be decreased. This will result in a slight increase in performance on list view pages. - -
- -
- -
$sugar_config['logger']['level'] = 'fatal';
- -
- -
-Lowering the log level means that there will be less log messages to write to disk on each request. This will slightly (very slightly) increase performance. - - -
diff --git a/_source/ebooks/chap20.ml b/_source/ebooks/chap20.ml deleted file mode 100644 index d5dccb2e0..000000000 --- a/_source/ebooks/chap20.ml +++ /dev/null @@ -1,54 +0,0 @@ ---- -permalink: "/chap20.html" -layout: page -title: "Chapter 20" ---- - - -
- -## 19. Further Resources ## - -Although this book has aimed to be a thorough resource, SuiteCRM is large and feature rich. Therefore it is not possible to include all the information you may require. Here are some extra resources for developing with SuiteCRM. - -### SuiteCRM Website ### - -The SuiteCRM website ([http://suitecrm.com SuiteCRM.com] has many excellent resources including: - -* [https://suitecrm.com/forum/index SuiteCRM forums] - come and say hi! -* [https://suitecrm.com/suitecrm/blog SuiteCRM Blog] -* [https://suitecrm.com/wiki/index.php/Main_Page SuiteCRM Wiki] - -### External SuiteCRM Resources ### - -; [https://github.com/salesagility/SuiteCRM SuiteCRM GitHub] -: The SuiteCRM source code is hosted on GitHub. Here you can get bleeding edge code changes and even contribute code. - -### SugarCRM Resources ### - -SuiteCRM has strived to remain compatible with the SugarCRM community edition and much of the documentation is still valid. The appropriate version for SuiteCRM information is 6.5. Versions of documentation higher than this (i.e. 7) will probably not be relevant. - -* [http://support.sugarcrm.com/02_Documentation/04_Sugar_Developer/ SugarCRM Developer docs] -* [http://developer.sugarcrm.com/ SugarCRM Developer Blog] - -### Technical Links ### - -* [http://php.net/ PHP] - The main language used by SuiteCRM -* [http://www.smarty.net/ Smarty] - The templating language used throughout SuiteCRM. -* [http://xdebug.org XDebug] - Debugging/profiling extension for PHP -* [http://git-scm.com/ Git] - Distributed version control system -* [http://yuilibrary.com/ YUI] - Legacy Javascript library used in SuiteCRM -* [https://jquery.com/ JQuery] - Javascript library used in SuiteCRM - to be preferred over YUI. -* [https://github.com/PHPMailer/PHPMailer PHPMailer] Email library used in SuiteCRM -* [http://php.net/manual/en/book.apc.php APC] - Alternative PHP Cache. PHP Opcode cache supported by SuiteCRM -* [http://php.net/manual/en/book.wincache.php WinCache] - Windows PHP cache. PHP Opcode cache supported by SuiteCRM -* [https://www.jetbrains.com/phpstorm/ PHPStorm] - PHP IDE (Paid) -* [https://eclipse.org/pdt/ Eclipse PHP Development Tools] - PHP IDE (Free and Open Source) - -### Other Links ### - -* [https://salesagility.com/ SalesAgility] - The company behind SuiteCRM. -* [http://www.jsmackin.co.uk Jim Mackin] - Me :) - - -
diff --git a/_source/ebooks/chap21.ml b/_source/ebooks/chap21.ml deleted file mode 100644 index 645945d3b..000000000 --- a/_source/ebooks/chap21.ml +++ /dev/null @@ -1,202 +0,0 @@ ---- -permalink: "/chap21.html" -layout: page -title: "Chapter 21" ---- - - -
- -## 20. Appendix A - Code Examples ## - -### Metadata ### - -This is an example of setting up a function subpanel (see the [[#chap05.xhtml#metadata-chapter|Metadata]] chapter for more information). - -In this example the cases module has a custom field incident_code_c which is used to track cases with the same root cause. We’ll add a subpanel to show all cases that have the same incident_code_c. - -Initially we add to the subpanel_setup section of Cases by creating the following file in custom/Extension/modules/Cases/Ext/Layoutdefs/IncidentLayoutdefs.php - -
- -Example A.1: IncidentLayoutdefs.php - - ------ - -
- -
 1 <?php
- 2 $layout_defs["Cases"]["subpanel_setup"]['incident_cases'] = array(
- 3   'module' => 'Cases',
- 4   'title_key' => 'LBL_INCIDENT_CASES',
- 5   'subpanel_name' => 'default',
- 6   'get_subpanel_data' => 'function:get_cases_by_incident',
- 7   'function_parameters' => 
- 8           array('import_function_file' => 'custom/modules/Cases/IncidentUtils.ph\
- 9 p',),
-10 );
- -
- ------ - - -
-Next we create the file which will define our get_cases_by_incident function custom/modules/Cases/IncidentUtils.php. - -
- -Example A.2: IncidentUtils.php - - ------ - -
- -
 1 <?php
- 2 function get_cases_by_incident(){
- 3         global $db;
- 4         //Get the current bean
- 5         $bean = $GLOBALS['app']->controller->bean;
- 6         $incidentCode = $db->quote($bean->incident_code_c);
- 7         //Create the SQL array
- 8         $ret = array();
- 9         $ret['select'] = ' SELECT id FROM cases ';
-10         $ret['from'] = ' FROM cases ';
-11         $ret['join'] = "";
-12         //Get all cases where the incident code matches but exclude the current \
-13 case.
-14         $ret['where']="WHERE cases.deleted = 0 AND cases_cstm.incident_code_c = \
-15 '{$incidentCode}' AND cases.id != '{$bean->id}'";
-16         return $ret;
-17 }
- -
- ------ - - -
-### Module Installer ### - -The following is a basic example manifest file. See the [[#chap14.xhtml#module-installer-chapter|Module Installer]] chapter. - -
- -Example A.3: Example manifest file - - ------ - -
- -
  1 $manifest = array(
-  2   'name' => 'Example manifest',
-  3   'description' => 'A basic manifest example',
-  4   'version' => '1.2.3',
-  5   'author' => 'Jim Mackin',
-  6   'readme' => 'This is a manifest example for the SuiteCRM for Developers book',
-  7   'acceptable_sugar_flavors' => array('CE'),
-  8   'acceptable_sugar_versions' => array(
-  9       'exact_matches' => array('6.5.20',),
- 10   ),
- 11   'dependencies' => array(
- 12     array(
- 13       'id_name' => 'hello_world',
- 14       'version' => '3.2.1'
- 15     ),
- 16   ),
- 17   'icon' => 'ManifestExample.png',
- 18   'is_uninstallable' => true,
- 19   'published_date' => '2015-05-05',
- 20   'type' => 'module',
- 21   'remove_tables' => 'prompt',
- 22 );
- 23 $installdefs = array(
- 24   'id' => 'suitecrmfordevelopers_example_manifest',
- 25   'image_dir' => '/images/',
- 26   'copy' => array(
- 27     array(
- 28       'from' => '/modules/ExampleModule',
- 29       'to' => 'modules/ExampleModule',
- 30     ),
- 31   ),
- 32   'dashlets' => array(  
- 33     array(
- 34       'from' => '/modules/ExampleModule/Dashlets/',  
- 35       'name' => 'ExampleModuleDashlet'  
- 36     )
- 37   ),
- 38   'language' => array(
- 39     array(
- 40       'from' => 'application/language/en_us.examplemoduleadmin.php',  
- 41       'to_module' => 'application',  
- 42       'language' => 'en_us'
- 43     ),
- 44     array(    
- 45       'from' => '/modules/Accounts/language/en_us.examplemodule.php',
- 46       'to_module' => 'Accounts',
- 47       'language' => 'en_us'
- 48     ),
- 49     array(
- 50       'from' => '/application/language/es_es.examplemoduleadmin.php',  
- 51       'to_module' => 'application',
- 52       'language' => 'es_es'
- 53     ),  
- 54     array(    
- 55       'from' => '/modules/Accounts/language/es_es.examplemodule.php',  
- 56       'to_module' => 'Accounts',
- 57       'language' => 'es_es'
- 58     ),  
- 59   ),
- 60   'custom_fields' => array(  
- 61     array(
- 62       'name' => 'example_field',
- 63       'label' => 'Example Field',
- 64       'type' => 'varchar',
- 65       'max_size' =>  100,
- 66       'module' => 'Accounts',  
- 67     ),
- 68   ),
- 69   'vardefs' => array(  
- 70     array(  
- 71       'from' => 'modules/Accounts/vardefs/examplemodule_vardefs.php',  
- 72       'to_module' => 'Accounts',  
- 73     ),
- 74   ),
- 75   'beans' => array(
- 76     array(
- 77       'module' => 'ExampleModule',  
- 78       'class' => 'ExampleModule',
- 79       'path' => 'modules/ExampleModule/ExampleModule.php',  
- 80     ),
- 81   ),
- 82   'logic_hooks' => array(
- 83     array(  
- 84       'module' => 'Accounts',
- 85       'hook' => 'before_save',  
- 86       'order' => 100,  
- 87       'description'  => 'Example module before save hook',  
- 88       'file' => 'modules/ExampleModule/ExampleModuleHook.php',
- 89       'class' => 'ExampleModuleLogicHooks',
- 90       'function' => 'accounts_before_save',  
- 91     ),
- 92   ),  
- 93   'administration' => array(  
- 94     array(  
- 95       'from' => 'modules/administration/examplemodule_admin.php',  
- 96     ),
- 97   ),
- 98 );
- 99 $upgrade_manifest = array(
-100 );
- -
- ------ - - -
- -
diff --git a/_source/ebooks/convert.sh b/_source/ebooks/convert.sh deleted file mode 100644 index e69de29bb..000000000 diff --git a/_source/html/chap00.xhtml b/_source/html/chap00.xhtml deleted file mode 100644 index f69e63f48..000000000 --- a/_source/html/chap00.xhtml +++ /dev/null @@ -1,92 +0,0 @@ - - - - -1. Introduction - - - -
-

-1. Introduction

- -

What is SuiteCRM

-

The story of SuiteCRM starts with SugarCRM. SugarCRM was founded in 2004 and -consisted of an open source version (called Community Edition) and various paid -for versions. However trouble started brewing when it appeared that SugarCRM would -not be releasing a Community Edition of SugarCRM 7 and would be providing limited, -if any, updates to the Community Edition.

- -

Enter SuiteCRM. SalesAgility forked Community Edition to create SuiteCRM and also -added various open source plugins to add improved functionality.

- -

This book

-

This book is intended for developers who are familiar (or at least acquainted) -with using SuiteCRM but want to perform their own customisations. SuiteCRM -is a large and mature piece of software so it is impractical for a book to cover all -aspects of the software. I’ve tried to add the most important parts which should allow you -to make the changes you need in 99% of situations. There is a further resources chapter -at the end of this book to help out in those 1% of cases. With that being said -if you feel there is anything important I have left out (or worse, anything -incorrect in the book) please let me know. I can be contacted at -JSMackin.co.uk.

- -

Reading this book

-

Each chapter in this book is intended to be self contained so the reader can -jump to interesting chapters. Where there is some overlap this is usually indicated -with links to the relevant chapters.

- -

Some parts of this book may refer to file paths or other parts of code that can -have a variable value, for example controller names contain the module name -or a file with an arbitrary name. In this case these will be marked in the form -<TheModuleName>, <TheFileName> or something else suitable. In these cases -you can substitute something appropriate (such as Accounts or MyNewFile).

- -

Setting up SuiteCRM

-

In this book we’ll be using SuiteCRM v7.1.5 which is the latest at time of writing. -For up to date versions of the installation instructions see the SuiteCRM wiki at -suitecrm.com/wiki/index.php/Installation.

- -

Website

-

The SuiteCRM installer can be found at SuiteCRM.com. -I would recommend SuiteCRM MAX as I prefer to start with a full interface and -customise it as needed.

- -

GitHub

-

SuiteCRM is also available on GitHub at github.com/salesagility/SuiteCRM. -Each SuiteCRM version is tagged so you can easily grab the version you need.

- -

Initial Tweaks

-

After the initial install there are a few tweaks you may want to make on an -instance you are developing on. These changes should improve your development -flow and productivity as well as help identify issues if they occur.

- -

Developer Mode

-

SuiteCRM will cache various files that it processes, such as Smarty templates. -Developer mode will turn off some of the caching so that changes to files will be -seen immediately (though this isn’t always the case - as is the case with extensions). This can be enabled either through the -config file or via the General settings page inside admin.

- -

Log Level

-

The default log level of SuiteCRM is fatal. This is a good default for -production instances but you may want to increase the log level to info or -debug. This will make the log output more verbose so, should anything go wrong, -you’ll have something to refer to. See the chapter on logging for more information.

- -

Display errors

-

You’ll also want to turn off display errors. Unfortunately at the moment -SuiteCRM has various notices and warnings out of the box. With display_errors on this can -sometimes cause AJAX pages and the link to break.

- -

With this being said you should be checking the PHP error logs or selectively -enabling
display_errors to ensure that the code you are creating is not creating -additional notices, warnings or errors.

- -

XDebug

-

XDebug is a PHP extension which provides profiling and -debugging capabilities to PHP. This can massively improve developer productivity -by simplifying development and, particularly, tracking down any issues. See the -XDebug site for information on XDebug.

-
- - diff --git a/_source/html/chap01.xhtml b/_source/html/chap01.xhtml deleted file mode 100644 index 9c24c162c..000000000 --- a/_source/html/chap01.xhtml +++ /dev/null @@ -1,58 +0,0 @@ - - - - -2. SuiteCRM Directory Structure - - - -
-

-2. SuiteCRM Directory Structure

- -
cache
-
Contains cache files used by SuiteCRM including compiled smarty templates, -grouped vardefs, minified and grouped JavaScript. Some modules and custom modules -may also store (temporary) module specific info here.
-
custom
-
Contains user and developer customisations to SuiteCRM. Also contains some -SuiteCRM code to maintain compatibility with SugarCRM. However this is likely to change -in the future.
-
data
-
Stores the classes and files used to deal with SugarBeans and their relationships.
-
examples
-
Contains a few basic examples of lead capture and API usage. However these are very outdated.
-
include
-
Contains the bulk of non module and non data SuiteCRM code.
-
install
-
Code used by the SuiteCRM installer.
-
jssource
-
The jssource folder contains the unminified source of some of the JavaScript files -used within SuiteCRM.
-
metadata
-
Stores relationship metadata for the various stock SuiteCRM modules. This should not -be confused with module metadata which contains information on view, dashlet and search -definitions.
-
mobile
-
Stores code for the QuickCRM mobile app.
-
ModuleInstall
-
Code for the module installer.
-
modules
-
Contains the code for any stock or custom SuiteCRM modules.
-
service
-
Code for the SuiteCRM Soap and REST APIs.
-
themes
-
Code, data and images for the bundled SuiteCRM theme.
-
upload
-
The upload folder contains documents that have been uploaded to SuiteCRM. -The names of the files comes from the ID of the matching Document Revision/Note. -upload/upgrades will also contain various upgrade files and the packages of installed -modules.
-
-log4php, soap, XTemplate, Zend -
-
Source code for various libraries used by SuiteCRM some of which are deprecated.
-
-
- - diff --git a/_source/html/chap02.xhtml b/_source/html/chap02.xhtml deleted file mode 100644 index 87167b3c6..000000000 --- a/_source/html/chap02.xhtml +++ /dev/null @@ -1,520 +0,0 @@ - - - - -3. Working with Beans - - - -
-

-3. Working with Beans

-

Beans are the Model in SuiteCRM’s MVC (Model View Controller) architecture. They -allow retrieving data from the database as objects and allow persisting and -editing records. This section will go over the various ways of working with beans.

- -

BeanFactory

-

The BeanFactory allows dynamically loading bean instances or creating new records. -For example to create a new bean you can use:

- -
-

Example 3.1: Creating a new Bean using the BeanFactory

- -
1 $bean = BeanFactory::newBean('<TheModule>');
-2 //For example a new account bean:
-3 $accountBean = BeanFactory::newBean('Accounts');
-
- -
- -

Retrieving an existing bean can be achieved in a similar manner:

- -
-

Example 3.2: Retrieving a bean with the BeanFactory

- -
1 $bean = BeanFactory::getBean('<TheModule>', $beanId);
-2 //For example to retrieve an account id
-3 $bean = BeanFactory::getBean('Accounts', $beanId);
-
- -
- -

getBean will return an unpopulated bean object if $beanId is not supplied or -if there’s no such record. Retrieving an unpopulated bean can be useful -if you wish to use the static methods of the bean (for example see the Searching -for Beans section). To deliberately retrieve an unpopulated bean you can omit -the second argument of the getBean call. I.e.

- -
-

Example 3.3: Retrieving an unpopulated bean

- -
1 $bean = BeanFactory::getBean('<TheModule>');
-
- -
- - - - - - - -
-

BeanFactory::getBean caches ten results. This can cause odd behaviour if you -call getBean again and get a cached copy. Any calls that return a cached copy -will return the same instance. This means changes to one of the beans will be reflected -in all the results.

- -

Using BeanFactory ensures that the bean is correctly set up and the necessary files -are included etc.

- -

SugarBean

-

The SugarBean is the parent bean class and all beans in SuiteCRM extend this class. -It provides various ways of retrieving and interacting with records.

- -

Searching for beans

-

The following examples show how to search for beans using a bean class. The examples -provided assume that an account bean is available names $accountBean. This -may have been retrieved using the getBean call mentioned in the BeanFactory section -e.g.

- -
-

Example 3.4: Retrieving an unpopulated account bean

- -
$accountBean = BeanFactory::getBean('Accounts');
-
- -
- -

get_list

-

The get_list method allows getting a list of matching beans and allows paginating -the results.

- -
-

Example 3.5: get_list method signature

- -
1 get_list(
-2     $order_by = "",
-3     $where = "",
-4     $row_offset = 0,
-5     $limit=-1,
-6     $max=-1,
-7     $show_deleted = 0)
-
- -
- -
$order_by
-
Controls the ordering of the returned list. $order_by is specified as a string that will be -used in the SQL ORDER BY clause e.g. to sort by name you can simply pass -name, to sort by date_entered descending use date_entered DESC. You can also -sort by multiple fields. For example sorting by date_modified and id descending -date_modified, id DESC.
-
$where
-
Allows filtering the results using an SQL WHERE clause. $where should be a string -containing the SQL -conditions. For example in the contacts module searching for contacts with specific -first names we might use contacts.first_name='Jim'. Note that we specify the -table, the query may end up joining onto other tables so we want to ensure that -there is no ambiguity in which field we target.
-
$row_offset
-
The row to start from. Can be used to paginate the results.
-
$limit
-
The maximum number of records to be returned by the query. -1 means no limit.
-
$max
-
The maximum number of entries to be returned per page. -1 means the default max (usually -20).
-
$show_deleted
-
Whether to include deleted results.
-
Results
-

get_list will return an array. This will contain the paging information and -will also contain the list of beans. This array will contain the following keys:

- -
list
-
An array of the beans returned by the list query
-
row_count
-
The total number of rows in the result
-
next_offset
-
The offset to be used for the next page or -1 if there are no further pages.
-
previous_offset
-
The offset to be used for the previous page or -1 if this is the first page.
-
current_offset
-
The offset used for the current results.
-
Example
-

Let’s look at a concrete example. We will return the third page of all accounts -with the industry Media using 10 as a page size and ordered by name.

- -
-

Example 3.6: Example get_list call

- -
 1 $beanList = $accountBean->get_list(
- 2                                 //Order by the accounts name
- 3                                 'name',
- 4                                 //Only accounts with industry 'Media'
- 5                                 "accounts.industry = 'Media'",
- 6                                 //Start with the 30th record (third page)
- 7                                 30,
- 8                                 //No limit - will default to max page size
- 9                                 -1,
-10                                 //10 items per page
-11                                 10);
-
- -
- -

This will return:

- -
-

Example 3.7: Example get_list results

- -
 1 Array
- 2 (
- 3     //Snipped for brevity - the list of Account SugarBeans
- 4     [list] => Array()
- 5     //The total number of results
- 6     [row_count] => 36
- 7     //This is the last page so the next offset is -1
- 8     [next_offset] => -1
- 9     //Previous page offset
-10     [previous_offset] => 20
-11     //The offset used for these results
-12     [current_offset] => 30
-13 )
-
- -
- -

get_full_list

-

get_list is useful when you need paginated results. However if you are just -interested in getting a list of all matching beans you can use -get_full_list. The get_full_list method signature looks like this:

- -
-

Example 3.8: get_full_list method signature

- -
1 get_full_list(
-2             $order_by = "",
-3             $where = "",
-4             $check_dates=false,
-5             $show_deleted = 0
-
- -
-

These arguments are identical to their usage in get_list the only difference -is the $check_dates argument. This is used to indicate whether the date fields -should be converted to their display values (i.e. converted to the users date -format).

- -
Results
-

The get_full_list call simply returns an array of the matching beans

- -
Example
- -

Let’s rework our get_list example to get the full list of matching accounts:

- -
-

Example 3.9: Example get_full_list call

- -
1 $beanList = $accountBean->get_full_list(
-2                                 //Order by the accounts name
-3                                 'name',
-4                                 //Only accounts with industry 'Media'
-5                                 "accounts.industry = 'Media'"
-6                                 );
-
- -
- -

retrieve_by_string_fields

-

Sometimes you only want to retrieve one row but may not have the id of the record. -retrieve_by_string_fields allows retrieving a single record based on matching -string fields.

- -
-

Example 3.10: retrieve_by_string_fields method signature

- -
1 retrieve_by_string_fields(
-2                           $fields_array,
-3                           $encode=true,
-4                           $deleted=true)
-
- -
- -
$fields_array
-
An array of field names to the desired value.
-
$encode
-
Whether or not the results should be HTML encoded.
-
$deleted
-
Whether or not to add the deleted filter.
-
- - - - - -
-

Note here that, confusingly, the deleted flag works differently to the other -methods we have looked at. It flags whether or not we should filter out deleted -results. So if true is passed then the deleted results will not be included.

- -
Results
-

retrieve_by_string_fields returns a single bean as it’s result or null if there -was no matching bean.

- -
Example
-

For example to retrieve the account with name Tortoise Corp and account_type -Customer we could use the following:

- -
-

Example 3.11: Example retrieve_by_string_fields call

- -
1 $beanList = $accountBean->retrieve_by_string_fields(
-2                                 array(
-3                                   'name' => 'Tortoise Corp',
-4                                   'account_type' => 'Customer'
-5                                 )
-6                               );
-
- -
- -

Accessing fields

-

If you have used one of the above methods we now have a bean record. This bean represents -the record that we have retrieved. We can access the fields of that record by simply -accessing properties on the bean just like any other PHP object. Similarly we can use property - access to set the values of beans. Some examples are as follows:

- -
-

Example 3.12: Accessing fields examples

- -
 1 //Get the Name field on account bean
- 2 $accountBean->name;
- 3 
- 4 //Get the Meeting start date
- 5 $meetingBean->date_start;
- 6 
- 7 //Get a custom field on a case
- 8 $caseBean->third_party_code_c;
- 9 
-10 //Set the name of a case
-11 $caseBean->name = 'New Case name';
-12 
-13 //Set the billing address post code of an account
-14 $accountBean->billing_address_postalcode = '12345';
-
- -
- -

When changes are made to a bean instance they are not immediately persisted. -We can save the changes to the database with a call to the beans save method. -Likewise a call to save on a brand new bean will add that record to the database:

- -
-

Example 3.13: Persisting bean changes

- -
 1 //Get the Name field on account bean
- 2 $accountBean->name = 'New account name';
- 3 //Set the billing address post code of an account
- 4 $accountBean->billing_address_postalcode = '12345';
- 5 //Save both changes.
- 6 $accountBean->save();
- 7 
- 8 //Create a new case (see the BeanFactory section)
- 9 $caseBean = BeanFactory::newBean('Cases');
-10 //Give it a name and save
-11 $caseBean->name = 'New Case name';
-12 $caseBean->save();
-
- -
- - - - - - - -
-

Whether to save or update a bean is decided by checking the id field of the -bean. If id is set then SuiteCRM will attempt to perform an update. If there -is no id then one will be generated and a new record will be inserted into -the database. If for some reason you have supplied an id but the record is new -(perhaps in a custom import script) then you can set new_with_id to true on -the bean to let SuiteCRM know that this record is new.

- -
-

We have seen how to save single records but, in a CRM system, relationships between - records are as important as the records themselves. For example an account may have a list of -cases associated with it, a contact will have an account that it falls under -etc. We can get and set relationships between beans using several methods.

- -

get_linked_beans

-

The get_linked_beans method allows retrieving a list of related beans for -a given record.

- -
-

Example 3.14: get_linked_beans method signature

- -
1 get_linked_beans(
-2                 $field_name,
-3                 $bean_name,
-4                 $sort_array = array(),
-5                 $begin_index = 0,
-6                 $end_index = -1,
-7                 $deleted=0,
-8                 $optional_where="");
-
- -
- -
$field_name
-
The link field name for this link. Note that this is not the same as the name -of the relationship. If you are unsure of what this should be you can take a look into the cached -vardefs of a module in cache/modules/<TheModule>/<TheModule>Vardefs.php for -the link definition.
-
$bean_name
-
The name of the bean that we wish to retrieve.
-
$sort_array
-
This is a legacy parameter and is unused.
-
$begin_index
-
Skips the initial $begin_index results. Can be used to paginate.
-
$end_index
-
Return up to the $end_index result. Can be used to paginate.
-
$deleted
-
Controls whether deleted or non deleted records are shown. If true only deleted -records will be returned. If false only non deleted records will be returned.
-
$optional_where
-
Allows filtering the results using an SQL WHERE clause. See the get_list method -for more details.
-
Results
-

get_linked_beans returns an array of the linked beans.

- -
Example
- -
-

Example 3.15: Example get_linked_beans call

- -
1 $accountBean->get_linked_beans(
-2                 'contacts',
-3                 'Contacts',
-4                 array(),
-5                 0,
-6                 10,
-7                 0,
-8                 "contacts.primary_address_country = 'USA'");
-
- -
- -

relationships

-

In addition to the get_linked_beans call you can also load and access the -relationships more directly.

- -
Loading
- -

Before accessing a relationship you must use the load_relationship call to -ensure it is available. This call takes the link name of the relationship (not -the name of the relationship). As mentioned previously you can find the name of the -link in cache/modules/<TheModule>/<TheModule>Vardefs.php if you’re not sure.

- -
-

Example 3.16: Loading a relationship

- -
1 //Load the relationship
-2 $accountBean->load_relationship('contacts');
-3 //Can now call methods on the relationship object:
-4 $contactIds = $accountBean->contacts->get();
-
- -
- -
Methods
- -
- get -
-

Returns the ids of the related records in this relationship e.g for the -account - contacts relationship in the example above it will return the list -of ids for contacts associated with the account.

- -
- getBeans -
-

Similar to get but returns an array of beans instead of just ids.

- - - - - - - -
-

getBeans will load the full bean for each related record. This may cause -poor performance for relationships with a large number of beans.

- -
- add -
-

Allows relating records to the current bean. add takes a single id or bean or -an array of ids or beans. If the bean is available this should be used since it -prevents reloading the bean. For example to add a contact to the relationship in -our example we can do the following:

- -
-

Example 3.18: Adding a new contact to a relationship

- -
 1 //Load the relationship
- 2 $accountBean->load_relationship('contacts');
- 3 
- 4 //Create a new demo contact
- 5 $contactBean = BeanFactory::newBean();
- 6 $contactBean->first_name = 'Jim';
- 7 $contactBean->last_name = 'Mackin';
- 8 $contactBean->save();
- 9 
-10 //Link the bean to $accountBean
-11 $accountBean->contacts->add($contactBean);
-
- -
- -
- delete -
-

delete allows unrelating beans. Counter-intuitively it accepts the ids of both -the bean and the related bean. For the related bean you should pass the bean -if it is available e.g when unrelating an account and contact:

- -
-

Example 3.19: Removing a new contact from a relationship

- -
1 //Load the relationship
-2 $accountBean->load_relationship('contacts');
-3 
-4 //Unlink the contact from the account - assumes $contactBean is a Contact SugarB\
-5 ean
-6 $accountBean->contacts->delete($accountBean->id, $contactBean);
-
- -
- - - - - - - -
-

Be careful with the delete method. Omitting the second argument will cause -all relationships for this link to be removed.

- -
-
- - diff --git a/_source/html/chap03.xhtml b/_source/html/chap03.xhtml deleted file mode 100644 index ffeff972c..000000000 --- a/_source/html/chap03.xhtml +++ /dev/null @@ -1,302 +0,0 @@ - - - - -4. Vardefs - - - -
-

-4. Vardefs

- -

What are Vardefs

-

The Vardefs are used to supply information to SuiteCRM about a particular bean. -These generally specify the fields, relationships and indexes in a given module as -well as additional information such as whether it is audited, the table name etc.

- -

Defining Vardefs

- -

Module

-

Vardefs are initially defined in their respective modules folder. For the Accounts -module this will be in modules/Accounts/vardefs.php. The information is stored -in an array named $dictionary using the module name as the key. For Accounts this -will be $dictionary['Account']. Let’s look at the Account vardefs (which have been edited -for brevity):

- -
-

Example 4.1: Account Vardefs

- -
 1 $dictionary['Account'] =
- 2 array(
- 3 	'table' => 'accounts',
- 4 	'audited'=>true,
- 5 	'unified_search' => true,
- 6 	'unified_search_default_enabled' => true,
- 7 	'duplicate_merge'=>true,
- 8 	'comment' => 'Accounts are organizations or entities that ...',
- 9 	'fields' => array (
-10 	  //Snipped for brevity. See the fields section.
-11 	),
-12 	'indices' => array (
-13 	  //Snipped for brevity. See the indices section.
-14 	),
-15 	'relationships' => array (
-16 	  //Snipped for brevity. See the relationship section.
-17 	),
-18 	//This enables optimistic locking for Saves From EditView
-19 	'optimistic_locking'=>true,
-20 );
-21 
-22 VardefManager::createVardef(
-23 	'Accounts',
-24 	'Account',
-25 	array('default', 'assignable','company',)
-26 );
-
- -
- -
Keys
-

The following are some of the keys that can be specified for the vardefs. -Fields, indices and relationships are covered in their own sections.

- -
table
-
The database table name for this module.
-
audited
-
Whether or not this module should be audited. Note that audited must also be -set at the fields level for a field to be audited.
-
unified_search
-
Whether this module can be searchable via the global search.
-
unified_search_default_enabled
-
Whether this module is searchable via the global search by default.
-
duplicate_merge
-
Whether or not duplicate merging functionality is enabled for this module.
-
comment
-
A description of this module.
-
optimistic_locking
-
Whether optimistic should be enabled for this module. Optimistic locking locks -concurrent edits on a record by assuming that there will be no conflict. On save -the last modified timestamp on the record will be checked. If it is different -then an edit has occurred since this record was loaded. If this is the case then -the user will be prompted with a page showing the differences in the two edits -and asked to choose which edits are to be used.
-
Fields
-

The field defines the behaviour and attributes of each field in the module.

- -
name
-
The name of the field.
-
vname
-
The name of the language label to be used for this field.
-
type
-
The type of the field. See the field types section.
-
isnull
-
Whether null values are allowed
-
len
-
If the field is a string type, the max number of characters allowed.
-
options
-
For enum fields the language label for the dropdown values for this field
-
dbtype
-
The type to be used by the database to store this field. This is not required as the -appropriate type is usually chosen.
-
default
-
The default value of this field.
-
massupdate
-
Whether or not this field should be mass updatable. Note that some field types are -always restricted from mass updates.
-
rname
-
For related fields only. The name of the field to be taken from the related module.
-
id_name
-
For related fields only. The field in this bean which contains the related id.
-
source
-
The source of this field. Can be set to ‘non-db’ if the field is not stored in -the database - for example for link fields, fields populated by logic hooks or by other means.
-
sort_on
-
For concatenated fields (i.e. name fields) the field which should be used to sort.
-
fields
-
For concatenated fields (i.e. name fields) an array of the fields which should be concatenated.
-
db_concat_fields
-
For concatenated fields (i.e. name fields) an array of the fields which should be concatenated in the database. -Usually this is the same as fields.
-
unified_search
-
True if this field should be searchable via the global search.
-
enable_range_search
-
Whether the list view search should allow a range search of this field. -This is used for date and numeric fields.
-
studio
-
Whether the field should display in studio.
-
audited
-
Whether or not changes to this field should be audited.
-
Field types
-

The following are common field types used:

- -
id
-
An id field.
-
name
-
A name field. This is usually a concatenation of other fields.
-
bool
-
A boolean field.
-
varchar
-
A variable length string field.
-
char
-
A character field.
-
text
-
A text area field.
-
decimal
-
A decimal field.
-
date
-
A date field.
-
datetime
-
A date and time field.
-
enum
-
A dropdown field.
-
phone
-
A phone number field.
-
link
-
A link to another module via a relationship.
-
relate
-
A related bean field.
-
Indices
-

The indices array allows defining any database indexes that should be in place -on the database table for this module. Let’s look at an example:

- -
-

Example 4.2: Example indices definition

- -
 1 'indices' => array (
- 2 	array(
- 3 		'name' =>'idx_mymod_id_del',
- 4 		'type' =>'index',
- 5 		'fields'=>array('id', 'deleted')),
- 6 	array(
- 7 		'name' =>'idx_mymod_parent_id',
- 8 		'type' =>'index',
- 9 		'fields'=>array( 'parent_id')),
-10 	array(
-11 		'name' =>'idx_mymod_parent_id',
-12 		'type' =>'unique',
-13 		'fields'=>array( 'third_party_id')),
-14 	),
-
- -
- -

Each array entry should have, at least, the following entries:

- -
name
-
The name of the index. This is usually used by the database to reference the index. Most -databases require that these are unique.
-
type
-
The type of the index to create. index will simply add an index on the fields, -unique will add a unique constraint on the fields, primary will add the fields -as a primary key.
-
fields
-
An array of the fields to be indexed. The order of this array will be used as the -order of the fields in the index.
-
Relationships
-

The Vardefs also specify the relationships within this module. Here’s an -edited example from the Accounts module:

- -
-

Example 4.3: Example relationships definition

- -
 1 'relationships' => array (
- 2 	'account_cases' => array(
- 3 		'lhs_module'=> 'Accounts',
- 4 		'lhs_table'=> 'accounts',
- 5 		'lhs_key' => 'id',
- 6 		'rhs_module'=> 'Cases',
- 7 		'rhs_table'=> 'cases',
- 8 		'rhs_key' => 'account_id',
- 9 		'relationship_type' => 'one-to-many'),
-10 ),
-
- -
- -

Here we see the link between accounts and cases. This is specified with the following -keys:

- -
lhs_module
-
The module on the left hand side of this relationship. For a one to many relationship -this will be the “One” side.
-
lhs_table
-
The table for the left hand side module. If you are unsure the table for a module -can be found in it’s vardefs.
-
lhs_key
-
The field to use for the left hand side of this link. In this case it is the -id of the account.
-
rhs_module
-
The right hand side module. In this case the “many” side of the relationship.
-
rhs_table
-
The table for the right hand side module. As stated previously you can find the -table for a module can be found in it’s vardefs.
-
rhs_key
-
The field to use on the right hand side. In this case the account_id field on cases.
-
relationship_type
-
The type of relationship - “one-to-many” or “many-to-many”. Since this is a -one to many relationship it means a case is related to a single account but a -single account can have multiple cases.
-

For many to many relationship fields the following keys are also available:

- -
join_table
-
The name of the join table for this relationship.
-
join_key_lhs
-
The name of the field on the join table for the left hand side.
-
join_key_rhs
-
The name of the field on the join table for the right hand side.
-

Vardef templates

- -

Vardef templates provide a shortcut for defining common vardefs. This is done by -calling VardefManager::createVardef and passing the module name, object name -and an array of templates to be assigned. The following is an example from the accounts -vardefs:

- -
-

Example 4.4: Example vardef template

- -
22 VardefManager::createVardef(
-23 		'Accounts',
-24 		'Account',
-25 		array('default', 'assignable','company',)
-26 		);
-
- -
- -

In this example the default, assignable and company templates are used. The following -are some of the available templates:

- -
basic
-
default
-
Adds the common base fields such as id, name, date_entered, etc.
-
assignable
-
Adds the fields and relationships necessary to assign a record to a user.
-
person
-
Adds fields common to people records such as first_name, last_name, address, etc.
-
company
-
Adds fields common to companies such as an industry dropdown, address, etc.
-

Customising vardefs

-

Vardefs can be customised by adding a file into

- -
-

Example 4.5: Custom vardef location

- -
custom/Extension/modules/<TheModule>/Ext/SomeFile.php
-
- -
- -

This file can then be used to add a new field definition or customise an existing -one e.g changing a field type:

- -
-

Example 4.6: Example overriding an existing vardef

- -
$dictionary["TheModule"]["fields"]["some_field"]['type'] = 'int';
-
- -
-
- - diff --git a/_source/html/chap04.xhtml b/_source/html/chap04.xhtml deleted file mode 100644 index ad41beb6e..000000000 --- a/_source/html/chap04.xhtml +++ /dev/null @@ -1,159 +0,0 @@ - - - - -5. Views - - - -
-

-5. Views

- -

SuiteCRM follows the MVC (Model-View-Controller) pattern and as such has the concept -of views. Views are responsible for gathering and displaying data . There -are a number of default views in SuiteCRM. These include

- -
ListView
-
Displays a list of records and provides links to the EditViews and DetailViews -of those records. The ListView also allows some operations such as deleting and mass updating records. -This is (usually) the default view for a module.
-
DetailView
-
Displays the details of a single record and also displays subpanels of related records.
-
EditView
-
The EditView allows editing the various fields of a record and provides validation -on these values.
-

Location

-

Views can be found in modules/<TheModule>/views/ or, for custom views,
custom/modules/<TheModule>/views/, and are named in the following -format: view.<viewname>.php. For example, the Accounts DetailView can be found -in modules/Accounts/views/view.detail.php with a customised version in -custom/modules/Accounts/views/view.detail.php. The custom version is used if -it exists. If it doesn’t then the module version is used. Finally, if neither -of these exist then the SuiteCRM default is used in include/MVC/View/views/.

- -

Customising

-

In order to customise a View we first need to create the appropriate view file. -This will vary depending on the module we wish to target.

- -

Custom module

-

In this case we can place the file directly into our module. Create a new file -(if it doesn’t exist) at modules/<TheModule>/views/view.<viewname>.php. -The contents will look similar to:

- -
-

Example 5.1: View for a custom module

- -
1 <?php
-2 
-3 require_once 'include/MVC/View/views/view.<viewname>.php';
-4 
-5 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-6 class <TheModule>View<ViewName> extends View<ViewName>
-7 {
-8 
-9 }
-
- -
- -

A more concrete example would be for the detail view for a custom module called -ABC_Vehicles:

- -
-

Example 5.2: Detail view for a custom module, ABC_Vehicles

- -
1 <?php
-2 
-3 require_once 'include/MVC/View/views/view.detail.php';
-4 
-5 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-6 class ABC_VehiclesViewDetail extends ViewDetail
-7 {
-8 
-9 }
-
- -
- -

Preexisting modules

-

For preexisting modules you will want to add the view to
custom/modules/<TheModule>/views/view.<viewname>.php.

- -

The contents of this file will vary depending on whether you wish to extend the -existing view (if it exists) or create your own version completely. It is usually -best to extend the existing view, since this will retain important logic. -Note the naming convention here. We name the class
Custom<TheModule>View<ViewName> (for example CustomAccountsViewDetail).

- -

Here we don’t extend the existing view or no such view exists:

- -
-

Example 5.3: Custom view for an existing module

- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 
-4 require_once 'include/MVC/View/views/view.<viewname>.php';
-5 
-6 class Custom<TheModule>View<ViewName> extends ViewDetail
-7 {
-8 
-9 }
-
- -
- -

Otherwise we extend the existing view. Note that we are requiring the -existing view:

- -
-

Example 5.4: Overriding a view for an existing module

- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 
-4 require_once 'modules/<TheModule>/views/view.<viewname>.php';
-5 
-6 class Custom<TheModule>View<ViewName> extends <TheModule>View<ViewName>
-7 {
-8 
-9 }
-
- -
- -

For example, overriding the List View of Accounts:

- -
-

Example 5.5: Overriding the Accounts List View

- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 
-4 require_once 'modules/Accounts/views/view.list.php';
-5 
-6 class CustomAccountsViewList extends AccountsViewList
-7 {
-8 
-9 }
-
- -
- -

Making changes

- -

Now that we have a custom view what can we actually do? The views have various methods -which we can now override to change/add behaviour. The most common ones to override -are:

- -
preDisplay
-
Explicitly intended to allow logic to be called before display() is called. This -can be used to alter arguments to the list view or to output anything to appear before -the main display code (such as, for example, adding JavaScript).
-
display
-
Does the actual work of displaying the view. Can be overridden to alter this behaviour -or to output anything after the main display. You usually want to call parent::display(); -to ensure that the display code is run (unless, of course, you are adding your -own display logic).
-
-
- - diff --git a/_source/html/chap05.xhtml b/_source/html/chap05.xhtml deleted file mode 100644 index 0d743e4e2..000000000 --- a/_source/html/chap05.xhtml +++ /dev/null @@ -1,751 +0,0 @@ - - - - -6. Metadata - - - -
-

-6. Metadata

- -

Intro

-

Module metadata are used to describe how various views behave in the module. -The main use of this is providing field and layout information but this can also -be used to filter subpanels and to describe what fields are used in the search.

- -

Location

-

Module metadata can be found in:

- -
-

Example 6.1: Module metadata location

- -
modules/<TheModule>/metadata/
-
- -
- -

Customising

-

Usually studio is the best way of customising metadata. Even when you do wish -to make customisations that are not possible through studio it can be simpler to -set everything up in studio first. This is particularly true for layout based -metadata. However if you are customising metadata it is as simple as placing, -or editing, the file in the custom directory. For example to override the Accounts -detailviewdefs (found in modules/Accounts/metadata/detailviewdefs.php) we would -place (or edit) the file in custom/modules/Accounts/metadata/detailviewdefs.php. -One exception to this rule is the studio.php file. The modules metadata folder is -the only location checked - any version in custom/<TheModule>/metadata/studio.php is ignored.

- -

Different metadata

- -

detailviewdefs.php

-

detailviewdefs.php provides information on the layout and fields of the detail view -for this module. This file uses the same structure as editviewdefs.php. Let’s look -at an example for a fictional module ABC_Vehicles:

- -
-

Example 6.2: DetailView metadata definition

- -
 1 <?php
- 2 $viewdefs ['ABC_Vehicles'] ['DetailView'] = array (
- 3 	'templateMeta' => array (
- 4 		'form' => array (
- 5 			'buttons' => array (
- 6 				'EDIT',
- 7 				'DUPLICATE',
- 8 				'DELETE',
- 9 				'FIND_DUPLICATES'
-10 			)
-11 		),
-12 		'maxColumns' => '2',
-13 		'widths' => array (
-14 			array (
-15 				'label' => '10',
-16 				'field' => '30'
-17 			),
-18 			array (
-19 				'label' => '10',
-20 				'field' => '30'
-21 			)
-22 		),
-23 		'includes' => array (
-24 			array (
-25 				'file' => 'modules/ABC_Vehicles/ABC_VehiclesDetail.js'
-26 			)
-27 		)
-28 	),
-29 	'panels' => array (
-30 		'LBL_ABC_VEHICLES_INFO' => array (
-31 			array (
-32 				array (
-33 					'name' => 'name',
-34 					'comment' => 'The Name of the Vehicle',
-35 					'label' => 'LBL_NAME',
-36 				),
-37 				'reg_number'
-38 			),
-39 			array (
-40 				array (
-41 					'name' => 'type',
-42 					'label' => 'LBL_TYPE',
-43 				),
-44 				array (
-45 					'name' => 'phone_fax',
-46 					'comment' => 'The fax phone number of this company',
-47 					'label' => 'LBL_FAX'
-48 				)
-49 			),
-50 			array (
-51 				array (
-52 					'name' => 'registered_address_street',
-53 					'label' => 'LBL_REGISTERED_ADDRESS',
-54 					'type' => 'address',
-55 					'displayParams' => array (
-56 						'key' => 'registered'
-57 					)
-58 				),
-59 			),
-60 		),
-61 		'LBL_PANEL_ADVANCED' => array (
-62       array (
-63 				array (
-64 					'name' => 'assigned_user_name',
-65 					'label' => 'LBL_ASSIGNED_TO'
-66 				),
-67 				array (
-68 					'name' => 'date_modified',
-69 					'label' => 'LBL_DATE_MODIFIED',
-70 					'customCode' => '{$fields.date_modified.value} '
-71 							+ '{$APP.LBL_BY} '
-72 							+ '{$fields.modified_by_name.value}',
-73 				)
-74 			),
-75 		),
-76 	)
-77 );
-78 ?>
-
- -
-

We see that line 2 defines an array $viewdefs['ABC_Vehicles']['DetailView'] which -places a DetailView entry for the module ABC_Vehicles into $viewdefs (DetailView -will be EditView or QuickCreateView as appropriate). This array has two main -keys defined here:

- -
templateMeta
-

The templateMeta key provides information about the view in general. The -['form']['buttons'] entries define the buttons that should appear in this view.

- -
maxColumns
-
Defines the number of columns to use for this view. It is unusual for this to be more -than 2.
-
widths
-
An array defining the width of the label and field for each column.
-
includes
-
An array of additional JavaScript files to include. This is useful for adding custom -JavaScript behaviour to the page.
-
panels
-

The panels entry defines the actual layout of the Detail (or Edit) view. Each -entry is a new panel in the view with the key being the label for that panel. -We can see in our example that we have 2 panels. One uses the label defined by -the language string LBL_ABC_VEHICLES_INFO, the other uses LBL_PANEL_ADVANCED.

- -

Each panel has an array entry for each row, with each array containing an entry -for each column. For example we can see that the first row has the following definition:

- -
-

Example 6.3: DetailView metadata row definition

- -
31 array(
-32 	array (
-33 		'name' => 'name',
-34 		'comment' => 'The Name of the Vehicle',
-35 		'label' => 'LBL_NAME',
-36 	),
-37 	'reg_number',
-38 ),
-
- -
- -

This has an array definition for the first row, first column and a string definition -for the first row, second column. The string definition is very straightforward -and simply displays the detail (or edit, as appropriate) view for that field. It will use the default -label, type, etc. In our example we are displaying the field named reg_number.

- -

The array definition for the first row, first column is a little more complex. Each array -definition must have a name value. In our example we are displaying the name field. -However we also supply some other values. Values most commonly used are:

- -
comment
-
Used to note the purpose of the field.
-
label
-
The language key for this label. If the language key is not recognised then this -value will be used instead (see the chapter on language).
-
displayParams
-
An array used to pass extra arguments for the field display. For the options -and how they are used you can have a look into the appropriate field type in -include/SugarFields/Fields or custom/include/SugarFields/Fields. An example -is setting the size of a textarea:
-
-

Example 6.4: DetailView metadata displayParams

- -
1 'displayParams' => array(
-2     'rows' => 2,
-3     'cols' => 30,
-4 ),
-
- -
- -
customCode
-
Allows supplying custom smarty code to be used for the display. The code here can -include any valid smarty code and this will also have access to the current -fields in this view via $fields. An example of outputing the ID field would be -{$fields.id.value}. -Additionally the module labels and app labels can be accessed via $MOD and $APP -respectively. -Finally you can use @@FIELD@@ to output the value of the field that would have been -used. For example {if $someCondition}@@FIELD@@{/if} will conditionally show the field.
-

editviewdefs.php

-

editviewdefs.php provides information on the layout and fields of the edit view -for this module. This file uses the same structure as detailviewdefs.php. Please -see the information on detailviewdefs.php.

- -

listviewdefs.php

-

The listviewdefs.php file for a module defines what fields the list view for -that module will display. Let’s take a look at an example:

- -
-

Example 6.5: ListView metadata definition

- -
 1 $listViewDefs ['AOR_Reports'] =
- 2 array (
- 3   'NAME' =>
- 4   array (
- 5     'width' => '15%',
- 6     'label' => 'LBL_NAME',
- 7     'default' => true,
- 8     'link' => true,
- 9   ),
-10   'REPORT_MODULE' =>
-11   array (
-12     'type' => 'enum',
-13     'default' => true,
-14     'studio' => 'visible',
-15     'label' => 'LBL_REPORT_MODULE',
-16     'width' => '15%',
-17   ),
-18   'ASSIGNED_USER_NAME' =>
-19   array (
-20     'width' => '15%',
-21     'label' => 'LBL_ASSIGNED_TO_NAME',
-22     'module' => 'Employees',
-23     'id' => 'ASSIGNED_USER_ID',
-24     'default' => true,
-25   ),
-26   'DATE_ENTERED' =>
-27   array (
-28     'type' => 'datetime',
-29     'label' => 'LBL_DATE_ENTERED',
-30     'width' => '15%',
-31     'default' => true,
-32   ),
-33   'DATE_MODIFIED' =>
-34   array (
-35     'type' => 'datetime',
-36     'label' => 'LBL_DATE_MODIFIED',
-37     'width' => '15%',
-38     'default' => true,
-39   ),
-40 );
-
- -
-

To define the list view defs we simply add a key to the $listViewDefs array. -In this case we add an entry for AOR_Reports This array contains an entry for -each field that we wish to show in the list view and is keyed by the upper case -name of the field. For example, the REPORT_MODULE key refers to the report_module -field of AOR_Reports.

- -
type
-
The type of the field. This can be used to override how a field is displayed.
-
default
-
Whether this field should be shown in the list view by default. If false then the -field will appear in the available columns list in studio.
-
studio
-
Whether or not this field should be displayed in studio. This can be useful to ensure -that a critical field is not removed.
-
label
-
The label to be used for this field. If this is not supplied then the default -label for that field will be used.
-
width
-
The width of the field in the list view. Note that, although this is usually given -as a percentage it is treated as a proportion. The example above has five columns -with a width of 15% but these will actually be 20% since this is a ratio.
-

popupdefs.php

- -

popupdefs.php provides information on the layout, fields and search options -of the module popup that is usually used when selecting a related record.

- -

Let’s look at the default popupdefs.php for the Accounts module:

- -
-

Example 6.6: PopupView metadata definition

- -
 1 $popupMeta = array(
- 2 	'moduleMain' => 'Case',
- 3 	'varName' => 'CASE',
- 4 	'className' => 'aCase',
- 5 	'orderBy' => 'name',
- 6 	'whereClauses' =>
- 7 		array('name' => 'cases.name',
- 8 				'case_number' => 'cases.case_number',
- 9 				'account_name' => 'accounts.name'),
-10 	'listviewdefs' => array(
-11 		'CASE_NUMBER' => array(
-12 			'width' => '5',
-13 			'label' => 'LBL_LIST_NUMBER',
-14 	        'default' => true),
-15 		'NAME' => array(
-16 			'width' => '35',
-17 			'label' => 'LBL_LIST_SUBJECT',
-18 			'link' => true,
-19 	        'default' => true),
-20 		'ACCOUNT_NAME' => array(
-21 			'width' => '25',
-22 			'label' => 'LBL_LIST_ACCOUNT_NAME',
-23 			'module' => 'Accounts',
-24 			'id' => 'ACCOUNT_ID',
-25 			'link' => true,
-26 	        'default' => true,
-27 	        'ACLTag' => 'ACCOUNT',
-28 	        'related_fields' => array('account_id')),
-29 		'PRIORITY' => array(
-30 			'width' => '8',
-31 			'label' => 'LBL_LIST_PRIORITY',
-32 	        'default' => true),
-33 		'STATUS' => array(
-34 			'width' => '8',
-35 			'label' => 'LBL_LIST_STATUS',
-36 	        'default' => true),
-37 	    'ASSIGNED_USER_NAME' => array(
-38 	        'width' => '2',
-39 	        'label' => 'LBL_LIST_ASSIGNED_USER',
-40 	        'default' => true,
-41 	       ),
-42 		),
-43 	'searchdefs'   => array(
-44 	 	'case_number',
-45 		'name',
-46 		array(
-47 			'name' => 'account_name',
-48 			'displayParams' => array(
-49 				'hideButtons'=>'true',
-50 				'size'=>30,
-51 				'class'=>'sqsEnabled sqsNoAutofill'
-52 			)
-53 		),
-54 		'priority',
-55 		'status',
-56 		array(
-57 			'name' => 'assigned_user_id',
-58 			'type' => 'enum',
-59 			'label' => 'LBL_ASSIGNED_TO',
-60 			'function' => array(
-61 				'name' => 'get_user_array',
-62 				'params' => array(false))
-63 			),
-64 	  )
-65 );
-
- -
- -

The popupdefs.php specifies a $popupMeta array with the following keys:

- -
moduleMain
-
The module that will be displayed by this popup.
-
varName
-
The variable name used to store the search preferences etc. This will usually simply -the upper case module name.
-
className
-
The class name of the SugarBean for this module. If this is not supplied then -moduleMain will be used. This is only really required for classes where the class -name and module name differ (such as Cases).
-
orderBy
-
The default field the list of records will be sorted by.
-
whereClauses
-
Legacy option. This is only used as a fallback when there are no searchdefs. Defines -the names of fields to allow searching for and their database representation.
-
listviewdefs
-
The list of fields displayed in the popup list view. See listviewdefs.php.
-
searchdefs
-
An array of the fields that should be available for searching in the popup. -See the individual search defs in the searchdefs.php section (for example the -basic_search array).
-

quickcreatedefs.php

-

quickcreatedefs.php provides information on the layout and fields of the quick -create view for this module (this is the view that appears when creating a record -from a subpanel). This file uses the same structure as detailviewdefs.php. Please -see the information on detailviewdefs.php.

- -

searchdefs.php

-

The search defs of a module define how searching in that module looks and behaves.

- -

Let’s look at an example.

- -
-

Example 6.7: Search View metadata definition

- -
  1 $searchdefs ['Accounts'] = array (
-  2 	'templateMeta' => array (
-  3 		'maxColumns' => '3',
-  4 		'maxColumnsBasic' => '4',
-  5 		'widths' => array (
-  6 			'label' => '10',
-  7 			'field' => '30'
-  8 		)
-  9 	),
- 10 	'layout' => array (
- 11 		'basic_search' => array (
- 12 			'name' => array (
- 13 				'name' => 'name',
- 14 				'default' => true,
- 15 				'width' => '10%'
- 16 			),
- 17 			'current_user_only' => array (
- 18 				'name' => 'current_user_only',
- 19 				'label' => 'LBL_CURRENT_USER_FILTER',
- 20 				'type' => 'bool',
- 21 				'default' => true,
- 22 				'width' => '10%'
- 23 			)
- 24 		)
- 25 		,
- 26 		'advanced_search' => array (
- 27 			'name' => array (
- 28 				'name' => 'name',
- 29 				'default' => true,
- 30 				'width' => '10%'
- 31 			),
- 32 			'website' => array (
- 33 				'name' => 'website',
- 34 				'default' => true,
- 35 				'width' => '10%'
- 36 			),
- 37 			'phone' => array (
- 38 				'name' => 'phone',
- 39 				'label' => 'LBL_ANY_PHONE',
- 40 				'type' => 'name',
- 41 				'default' => true,
- 42 				'width' => '10%'
- 43 			),
- 44 			'email' => array (
- 45 				'name' => 'email',
- 46 				'label' => 'LBL_ANY_EMAIL',
- 47 				'type' => 'name',
- 48 				'default' => true,
- 49 				'width' => '10%'
- 50 			),
- 51 			'address_street' => array (
- 52 				'name' => 'address_street',
- 53 				'label' => 'LBL_ANY_ADDRESS',
- 54 				'type' => 'name',
- 55 				'default' => true,
- 56 				'width' => '10%'
- 57 			),
- 58 			'address_city' => array (
- 59 				'name' => 'address_city',
- 60 				'label' => 'LBL_CITY',
- 61 				'type' => 'name',
- 62 				'default' => true,
- 63 				'width' => '10%'
- 64 			),
- 65 			'address_state' => array (
- 66 				'name' => 'address_state',
- 67 				'label' => 'LBL_STATE',
- 68 				'type' => 'name',
- 69 				'default' => true,
- 70 				'width' => '10%'
- 71 			),
- 72 			'address_postalcode' => array (
- 73 				'name' => 'address_postalcode',
- 74 				'label' => 'LBL_POSTAL_CODE',
- 75 				'type' => 'name',
- 76 				'default' => true,
- 77 				'width' => '10%'
- 78 			),
- 79 			'billing_address_country' => array (
- 80 				'name' => 'billing_address_country',
- 81 				'label' => 'LBL_COUNTRY',
- 82 				'type' => 'name',
- 83 				'options' => 'countries_dom',
- 84 				'default' => true,
- 85 				'width' => '10%'
- 86 			),
- 87 			'account_type' => array (
- 88 				'name' => 'account_type',
- 89 				'default' => true,
- 90 				'width' => '10%'
- 91 			),
- 92 			'industry' => array (
- 93 				'name' => 'industry',
- 94 				'default' => true,
- 95 				'width' => '10%'
- 96 			),
- 97 			'assigned_user_id' => array (
- 98 				'name' => 'assigned_user_id',
- 99 				'type' => 'enum',
-100 				'label' => 'LBL_ASSIGNED_TO',
-101 				'function' => array (
-102 					'name' => 'get_user_array',
-103 					'params' => array (
-104 							0 => false
-105 					)
-106 				),
-107 				'default' => true,
-108 				'width' => '10%'
-109 			)
-110 		)
-111 	)
-112 );
-
- -
-

Here we setup a new array for Accounts in the $searchdefs array. This has two keys:

- -
templateMeta
-

The templateMeta key controls the basic look of the search forms. Here we define -some overall layout info such as the maximum columns (3) and the maximum number -of columns for the basic search (4). Finally we set the widths for the search fields -and their labels.

- -
layout
-

The layout key contains the layout definitions for the basic search and advanced -search. This is simply a list of array definition of the fields. See the section -on listviewdefs.php for a description of some of the options.

- -

- subpaneldefs.php -

-

The subpaneldefs.php file provides definitions for the subpanels that appear in -the detail view of a module. Let’s look at an example:

- -
-

Example 6.8: Subpanel metadata definition

- -
 1 $layout_defs['AOS_Quotes'] = array (
- 2 	'subpanel_setup' => array (
- 3 		'aos_quotes_aos_contracts' => array (
- 4 			'order' => 100,
- 5 			'module' => 'AOS_Contracts',
- 6 			'subpanel_name' => 'default',
- 7 			'sort_order' => 'asc',
- 8 			'sort_by' => 'id',
- 9 			'title_key' => 'AOS_Contracts',
-10 			'get_subpanel_data' => 'aos_quotes_aos_contracts',
-11 			'top_buttons' => array (
-12 				0 => array (
-13 					'widget_class' => 'SubPanelTopCreateButton'
-14 				),
-15 				1 => array (
-16 					'widget_class' => 'SubPanelTopSelectButton',
-17 					'popup_module' => 'AOS_Contracts',
-18 					'mode' => 'MultiSelect'
-19 				)
-20 			)
-21 		),
-22 		'aos_quotes_aos_invoices' => array (
-23 			'order' => 100,
-24 			'module' => 'AOS_Invoices',
-25 			'subpanel_name' => 'default',
-26 			'sort_order' => 'asc',
-27 			'sort_by' => 'id',
-28 			'title_key' => 'AOS_Invoices',
-29 			'get_subpanel_data' => 'aos_quotes_aos_invoices',
-30 			'top_buttons' => array (
-31 				0 => array (
-32 					'widget_class' => 'SubPanelTopCreateButton'
-33 				),
-34 				1 => array (
-35 					'widget_class' => 'SubPanelTopSelectButton',
-36 					'popup_module' => 'AOS_Invoices',
-37 					'mode' => 'MultiSelect'
-38 				)
-39 			)
-40 		),
-41 		'aos_quotes_project' => array (
-42 			'order' => 100,
-43 			'module' => 'Project',
-44 			'subpanel_name' => 'default',
-45 			'sort_order' => 'asc',
-46 			'sort_by' => 'id',
-47 			'title_key' => 'Project',
-48 			'get_subpanel_data' => 'aos_quotes_project',
-49 			'top_buttons' => array (
-50 				0 => array (
-51 					'widget_class' => 'SubPanelTopCreateButton'
-52 				),
-53 				1 => array (
-54 					'widget_class' => 'SubPanelTopSelectButton',
-55 					'popup_module' => 'Accounts',
-56 					'mode' => 'MultiSelect'
-57 				)
-58 			)
-59 		)
-60 	)
-61 );
-
- -
- -

In the example above we set up a definition for a module (in this case AOS_Quotes) -in the $layout_defs array. This has a single key subpanel_setup which is an -array of each of the subpanel definitions keyed by a name. This name should be something -recognisable. In the case above it is the name of the link field displayed by the -subpanel. The entry for each subpanel usually has the following defined:

- -
order
-
A number used for sorting the subpanels. The values themselves are arbitrary -and are only used relative to other subpanels.
-
module
-
The module which will be displayed by this subpanel. For example the -aos_quotes_project def in the example above will display a list of Project -records.
-
subpanel_name
-
The subpanel from the displayed module which will be used. See the subpanels -section of this chapter.
-
sort_by
-
The field to sort the records on.
-
sort_order
-
The order in which to sort the sort_by field. asc for ascending desc for -descending.
-
title_key
-
The language key to be used for the label of this subpanel.
-
get_subpanel_data
-
Used to specify where to retrieve the subpanel records. Usually this is just a -link name for the current module. In this case the related records will be -displayed in the subpanel. However, for more complex links, it is possible -to specify a function to call. When specifying a function you should ensure -that the get_subpanel_data entry is in the form function:theFunctionName. -Additionally you can specify the location of the function and any additional -parameters that are needed by using the function_parameters key. An example of -a subpanel which uses a function can be found in Appendix A.
-
function_parameters
-
Specifies the parameters for a subpanel which gets it’s information from -a function (see
get_subpanel_data). This is an array which allows specifying -where the function is by using the import_function_file key (if this is absent -but get_subpanel_data defines a function then the function will be called -on the bean for the parent of the subpanel). Additionally -this array will be passed as an argument to the function defined in -get_subpanel_data which allows passing in arguments to the function.
-
generate_select
-
For function subpanels (see get_subpanel_data) whether or not the function -will return an array representing the query to be used -(for generate_select = true) or whether it will simply return the query -to be used as a string.
-
get_distinct_data
-
Whether or not to only return distinct rows. Relationships do not allow linking -two records more than once therefore this only really applies if the subpanel source -is a function. See
get_subpanel_data for information on function subpanel sources.
-
top_buttons
-
Allows defining the buttons to appear on the subpanel. This is simply an array -of the button definitions. These definitions have, at least, the widget_class -defined which decides the button class to use in include/generic/SugarWidgets. -Depending on the button this array may also be used to pass in extra arguments -to the widget class.
-

subpanels

-

Inside the metadata folder is the subpanels folder. This allows creating different -subpanel layouts for different parent modules. For example, the Contacts module -will display differently in the subpanel on an account than it will in the subpanel -of a case. The files inside the subpanels folder can be named anything. All -that matters is that it can be referenced in the subpanel_name of the -subpaneldefs.php of the parent module. The usual subpanel file is simply called -default.php. Let’s look at the modules/Accounts/metadata/subpanels/default.php -file:

- -
-

Example 6.8: Module Subpanels definition

- -
 1 $subpanel_layout = array(
- 2 	'top_buttons' => array(
- 3 		array(
- 4 			'widget_class' => 'SubPanelTopCreateButton'
- 5 		),
- 6 		array(
- 7 			'widget_class' => 'SubPanelTopSelectButton', 
- 8 			'popup_module' => 'Accounts'
- 9 		),
-10 	),
-11 	'where' => '',
-12 	'list_fields' => array (
-13 	  'name' =>
-14 	  array (
-15 	   'vname' => 'LBL_LIST_ACCOUNT_NAME',
-16 	   'widget_class' => 'SubPanelDetailViewLink',
-17 	   'width' => '45%',
-18 	   'default' => true,
-19 	  ),
-20 	  'billing_address_city' =>
-21 	  array (
-22     	'vname' => 'LBL_LIST_CITY',
-23     	'width' => '20%',
-24     	'default' => true,
-25 	  ),
-26 	  'billing_address_country' =>
-27 	  array (
-28 	  	'type' => 'varchar',
-29     	'vname' => 'LBL_BILLING_ADDRESS_COUNTRY',
-30     	'width' => '7%',
-31     	'default' => true,
-32 	  ),
-33 	  'phone_office' =>
-34 	  array (
-35 	  	'vname' => 'LBL_LIST_PHONE',
-36 	  	'width' => '20%',
-37 	  	'default' => true,
-38 	  ),
-39 	  'edit_button' =>
-40 	  array (
-41 	  	'vname' => 'LBL_EDIT_BUTTON',
-42 	  	'widget_class' => 'SubPanelEditButton',
-43 	  	'width' => '4%',
-44 	  	'default' => true,
-45 	  ),
-46 	  'remove_button' =>
-47 	  array (
-48 	    'vname' => 'LBL_REMOVE',
-49 	    'widget_class' => 'SubPanelRemoveButtonAccount',
-50 	    'width' => '4%',
-51 	    'default' => true,
-52 	  ),
-53    )
-54 );
-
- -
-

There are three keys in the $subpanel_layout variable for this subpanel. -These are:

- -
top_buttons
-
Defines the buttons that will appear at the top of the subpanel. See the -top_buttons key in subpaneldefs.php.
-
where
-
Allows the addition of conditions to the where clause. For example this could -be used to exclude Cases that are closed (cases.state != "Closed") or only -include Accounts of a specific industry (accounts.industry = "Media"). Note that -in these examples we specify the table to remove any ambiguity in the query.
-
list_fields
-
Defines the list of fields to be displayed in this subpanel. See the section on -listviewdefs.php for more information.
-

studio.php

-

studio.php is the simplest file in metadata and it’s existence is simply used to -confirm if a module should be shown in studio for user tweaking. Note that, -unlike other metadata files, the file in modules/<TheModule>/metadata/studio.php -will be the only one checked. A file in custom/modules/<TheModule>/metadata/studio.php -will have no effect.

-
- - diff --git a/_source/html/chap06.xhtml b/_source/html/chap06.xhtml deleted file mode 100644 index a0111eda2..000000000 --- a/_source/html/chap06.xhtml +++ /dev/null @@ -1,128 +0,0 @@ - - - - -7. Controllers - - - -
-

-7. Controllers

- -

SuiteCRM follows the MVC (Model-View-Controller) pattern and as such has the concept -of controllers. The controller is responsible for making changes to the Model -as well as passing control to the view as appropriate. SuiteCRM has the concept -of actions which are actions that will be taken by the controller. Let’s take a look at -a SuiteCRM URL:

- -
-

Example 7.1: Example SuiteCRM URL

- -
example.com/index.php?module=Accounts&action=index
-
- -
- -

In this (rather boring) example we see that the module is Accounts. This will -determine which controller to use and then call the index action on that controller.

- -

SuiteCRM will first look for the controller in custom/module/<TheModule>/controller.php. -If this is not found then next module/<TheModule>/controller.php will be checked. -Finally if neither of these controllers exist then the default controller will be used. -The default controller can be found in include/MVC/Controller/SugarController.php.

- -

Customising controllers

-

Ordinarily the default controller handles the request and delegates -to the appropriate views etc. However custom controllers can be used to add or alter -functionality. Let’s look at adding a new action.

- -

In the first instance we will have to add our custom controller. This will vary slightly depending -on the nature of the module.

- -

Custom module

-

In this case we can place the file directly into our module. You should create a new file -(if it doesn’t exist) at modules/<TheModule>/controller.php. The contents will look -similar to:

- -
-

Example 7.2: Creating a custom controller for a custom module

- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 class <TheModule>Controller extends SugarController
-4 {
-5 
-6 }
-
- -
- -

Pre-existing modules

-

For pre-existing modules you should add the controller to
custom/modules/<TheModule>/controller.php.

- -

The contents of this file will vary depending on whether you wish to extend the -existing controller (if it exists) or create your own version completely. It is usually -best to extend the existing controller since this will retain important logic. -You should note the naming convention here. We name the class
Custom<TheModule>Controller.

- -

Here we don’t extend the existing controller or no such controller exists:

- -
-

Example 7.3: Creating a custom controller for an existing module

- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 class Custom<TheModule>Controller extends SugarController
-4 {
-5 
-6 }
-
- -
- -

Alternatively we extend the existing controller. Note that we are requiring the -existing controller:

- -
-

Example 7.4: Creating a custom controller for an existing module with an existing controller

- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 
-4 require_once 'modules/<TheModule>/controller.php';
-5 
-6 class Custom<TheModule>Controller extends <TheModule>Controller
-7 {
-8 
-9 }
-
- -
- -

Adding the action

- -

Now we can add a new action to our controller. Actions are created as methods -on the controller with the name action_<actionName>. For example, to create a new -action called ‘echo’ we could create the following method in one of the -controllers we have created above. This can then perform whatever logic that is needed. -In our example we will log the REQUEST and simply redirect:

- -
-

Example 7.5: Adding a custom controller action method

- -
1 public function action_echo(){
-2   $GLOBALS['log']->debug("Echo called with request: ".print_r($_REQUEST,1));
-3   SugarApplication::redirect('index.php');
-4 }
-
- -
- -

Legacy Style

-

In previous versions of SugarCRM a new action was added by creating -a file in either modules/<TheModule>/<actionname>.php or -custom/modules/<TheModule>/<actionname>.php. Although this still works it is not recommended.

-
- - diff --git a/_source/html/chap07.xhtml b/_source/html/chap07.xhtml deleted file mode 100644 index 9caded614..000000000 --- a/_source/html/chap07.xhtml +++ /dev/null @@ -1,98 +0,0 @@ - - - - -8. Entry Points - - - -
-

-8. Entry Points

- -

Entry points are simply a page which provides access to SuiteCRM. These can be -used for a variety of purposes such as allowing an external form simple access -to SuiteCRM or, as is the case with the stock Events module, allowing -an event invite to be responded to by clicking a link in an email.

- -

Creating an entry point

- -

Let’s create a simple entry point to display the time. First we define this entry -point in a new file in:

- -
-

Example 8.1: Entry point registry location

- -
custom/Extension/application/Ext/EntryPointRegistry/
-
- -
-

For our example we’ll call our new file MyTimeEntryPoint.php

- -
-

Example 8.2: Example entry point location

- -
custom/Extension/application/Ext/EntryPointRegistry/MyTimeEntryPoint.php
-
- -
- -

In this file we will add a new entry to the $entry_point_registry. We supply -the file that should be called. Here we are simply placing the file in custom -if the entry point is related to a specific module it is usually a good idea to place -this somewhere inside custom/<TheModule>/.

- -

In addition we supply an “auth” parameter. If “auth” is true -then anyone accessing the entry point will need to be logged into SuiteCRM.

- -
-

Example 8.3: Adding an entry point entry

- -
1 <?php
-2 	$entry_point_registry['MyTimeEntryPoint'] = array(
-3 	    'file' => 'custom/MyTimeEntryPoint.php',
-4 	    'auth' => true,
-5 	);
-
- -
- -

Finally we add the actual logic itself inside custom/MyTimeEntryPoint.php:

- -
-

Example 8.4: Example entry point that outputs the current time

- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 $date = new DateTime();
-4 echo $date->format('r');
-
- -
- -

After a Quick Repair and Rebuild we can access our entry point:

- -
-

Example 8.5: Custom entry point URL

- -
example.com/index.php?entryPoint=MyTimeEntryPoint
-
- -
- -

and we should see something similar to:

- -
-

Example 8.6: MyTimeEntryPoint

- -
Sun, 15 Mar 2015 13:03:03 +0000
-
- -
- -

Obviously this is a contrived example but any logic that can be performed -elsewhere in SuiteCRM can be performed in an entry poiny (for example creating -or editing SugarBeans).

-
- - diff --git a/_source/html/chap08.xhtml b/_source/html/chap08.xhtml deleted file mode 100644 index 1362668a1..000000000 --- a/_source/html/chap08.xhtml +++ /dev/null @@ -1,266 +0,0 @@ - - - - -9. Language Strings - - - -
-

-9. Language Strings

-

Language strings provide an element of internationalisation to SuiteCRM. It allows -specifying different strings to be used in different languages making it much -easier to provide translations for modules and customisations. Even if you are -only targeting a single language it is still worth using the language string -functionality in SuiteCRM because it allows the simple changing of strings -within SuiteCRM and it also allows users to customise the labels used in your -customisations. There are three main types of language strings that we will cover -here.

- -

At the core, the language strings are a key value store. The keys are used throughout -SuiteCRM and the values are loaded based on the current language.

- -

Languages are handled in SuiteCRM by prefixing the file name with the IETF language -code for the language that this file contains. Here are some examples -of different language file names:

- -
-

Example 9.1: Example language file names

- -
• Core Accounts language file for en_us (United States English)
-modules/Accounts/language/en_us.lang.php
-
-• Core Cases language file for es_es (Spanish as spoken in Spain)
-modules/Cases/language/es_es.lang.php
-
-• Custom language file for de_de (German)
-custom/Extension/application/Ext/Language/de_de.SomeCustomPackage.php
-
- -
- -

SuiteCRM will choose the language prefix to be used based on the language the user -selected when logging in or the default language if none was selected. -Generally when a language file is loaded the default language files and the -en_us files will also be loaded. These files are then merged. This ensures that -there will still be a definition if -there are language keys in either en_us or the default language that don’t have -definitions in the current language. In -essence the language “falls back” to the default language and en_us if there -are missing keys.

- -

Module Strings

- -

Use

-

Module strings are strings associated with a particular module. These are usually, -for example, field labels and panel name labels, but they may be used for anything -that is specific to a single module.

- -

Definition location

-

Module strings are defined in the $mod_strings array. This is initially defined -in
modules/<TheModule>/language/<LanguageTag>.lang.php, for example
modules/Accounts/language/en_us.lang.php.

- -

Customisation location

-

Customisations can be made to the module strings by adding a new file in
custom/Extension/modules/<TheModule>/Ext/Language/<LanguageTag>.<Name>.php (<Name> -in this case should be used to give it a descriptive name). An example is -custom/Extension/modules/Accounts/Ext/Language/en_us.MyLanguageFile.php. See the Extensions -section for more information on the Extensions folder.

- -

Application Strings

- -

Use

-

Application strings are used for language strings and labels that are not specific -to a single module. Examples of these may include labels that will appear -in the headers or footers, labels that appear on search buttons throughout SuiteCRM -or labels for pagination controls.

- -

Definition location

-

The application strings are defined in the $app_strings array. This is -initially defined in
include/language/<LanguageTag>.lang.php.

- -

Customisation location

-

Customisations can be made to the application strings in two ways. Firstly you -can edit the file
custom/include/language/<LanguageTag>.lang.php. However -to promote modularity it is recommended that you add a new file in the location
custom/Extension/application/Ext/Language/<LanguageTag>.<Name>.php. For example
custom/Extension/application/Ext/Language/es_es.MyAppLanguageFile.php. -<Name> should be used to give the file a descriptive name. See the Extensions -section for more information on the Extensions folder.

- -

Application List Strings

- -

Use

-

Application list strings are used to store the various dropdowns and lists -used in SuiteCRM. Most of these are used as options for the various enum fields -in SuiteCRM e.g the account type or the opportunity sales stage.

- -

Definition location

-

The application list strings are defined in the $app_list_strings array. Similar to -the $app_strings array this is initially defined in -include/language/en_us.lang.php.

- -

Customisation location

-

Customisations can be made to the application list strings in two ways. Firstly you -can edit the file
custom/include/language/<LanguageTag>.lang.php. However -to promote modularity it is recommended that you add a new file in the location
custom/Extension/application/Ext/Language/<LanguageTag>.<Name>.php (<Name> -should be used to give the file a descriptive name). For example
custom/Extension/application/Ext/Language/es_es.MyAppListLanguageFile.php. - See the Extensions -section for more information on the Extensions folder.

- -

Why and when to customise

-

Generally language strings should be changed from within SuiteCRM using the -studio tool. However there are times when it can be simpler to add or modify -language strings as described in the previous section. If you are importing -a large number of language strings or dropdown options it can be simpler to -create a new file to add these values. Similarly if you are adding entirely new -functionality, it is usually best to simply add these language strings as new values.

- -

Usage

-

Language strings are used automatically throughout SuiteCRM. For example in -metadata you can specify the language strings to display for fields. However -in some cases you will want to access and use the language strings in custom -code. There are several ways to do this.

- -

Globals

- -

The $mod_strings, $app_strings and $app_list_strings variables are all -global and can be accessed as such. $app_strings and $app_list_strings will -always be available. However $mod_strings will only contain the -strings for the current module (see the next section -for other ways of accessing $mod_strings).

- -
-

Example 9.2: Accessing language strings globally

- -
 1 function someFunction(){
- 2     global $mod_strings, $app_strings, $app_list_strings;
- 3     /*
- 4      * Grab the label LBL_NAME for the current module
- 5      * In most modules this will be the label for the
- 6      * name field of the module.
- 7      */
- 8     $modLabel = $mod_strings['LBL_NAME'];
- 9 
-10     $appLabel = $app_strings['LBL_GENERATE_LETTER'];
-11 
-12     /*
-13      * Unlike the previous two examples $appListLabel will be an
-14      * array of the dropdowns keys to it's display labels.
-15      */
-16     $appListLabel = $app_list_strings['aos_quotes_type_dom'];
-17 
-18     //Here we just log out the strings
-19     $GLOBALS['log']->debug("The module label is $modLabel");
-20     $GLOBALS['log']->debug("The app label is $appLabel");
-21     $GLOBALS['log']->debug("The app list label is ".print_r($appListLabel,1));
-22 }
-
- -
- -

Translate

-

As an alternative to using globals or, if you are in a different module than the -language string you wish to retrieve you can use the translate method.

- -
-

Example 9.3: translate method signature

- -
1 translate(
-2         $string,
-3         $mod='',
-4         $selectedValue='')
-
- -
- -
$string
-
The language string to be translated.
-
$mod
-
The module this string should come from. Defaults to the current module if empty.
-
$selectedValue
-
For dropdown strings. This will return the label for the key $selectedValue -
-

Here is an example of the above in action. Note that we do not have to worry about -whether the label is a Module string, an Application string or an Application list -string, as all of these will be checked (in that order - the first matching value -will be returned).

- -
-

Example 9.4: Example translate method calls

- -
 1 function someFunction(){
- 2   //Grab the label LBL_NAME for the current module
- 3   $modLabel = translate('LBL_NAME');
- 4 
- 5   //Grab the label LBL_NAME for the AOS_Products module
- 6   $productModLabel = translate('LBL_NAME','AOS_Products');
- 7 
- 8   $appLabel = translate('LBL_GENERATE_LETTER');
- 9 
-10   /*
-11    * Return the label for the `Other` option of the `aos_quotes_type_dom`
-12    * We don't care about the module so this is left blank.
-13    */
-14   $appListLabel = translate('aos_quotes_type_dom','','Other');
-15 
-16   //Here we just log out the strings
-17   $GLOBALS['log']->debug("The module label is $modLabel");
-18   $GLOBALS['log']->debug("The module label for Products is $productModLabel");
-19   $GLOBALS['log']->debug("The app label is $appLabel");
-20   $GLOBALS['log']->debug("The app list label is ".print_r($appListLabel,1));
-21 }
-
- -
- -

JavaScript

-

Finally, you may be using JavaScript (for example in a view), and wish to display -a language string. For this you can use the SUGAR.language.get method, which -is similar to the translate method in example 9.3.

- -
-

Example 9.5: SUGAR.language.get method signature

- -
1 SUGAR.language.get(
-2               module,
-3               str
-4 );
-
- -
- -
module
-
The module a language string will be returned for. You should supply app_strings or
app_list_strings if the label you wish to retrieve is not a module string.
-
str
-
The key you want to retrieve a label for.
-
-

Example 9.6: Example SUGAR.language.get method calls

- -
 1 function someFunction(){
- 2 
- 3   /*
- 4    * Grab the label LBL_NAME for AOS_Products
- 5    * Note that, unlike the translate function in example 9.3
- 6    * the module name is required.
- 7    */
- 8 
- 9   var modLabel = SUGAR.language.get('AOS_Products', 'LBL_NAME');
-10 
-11   /*
-12    * As mentioned above we explicitly need to pass if we are retrieving
-13    * an app_string or app_list_string
-14    */
-15   var appLabel = SUGAR.language.get('app_strings', 'LBL_GENERATE_LETTER');
-16   var appListLabel = SUGAR.language.get('app_list_strings',
-17                                         'aos_quotes_type_dom');
-18 
-19   //Here we just log out the strings
-20   console.log("The module label is "+modLabel);
-21   console.log("The app label is "+appLabel);
-22   console.log("The app list label is "+appListLabel);
-23 }
-
- -
-
- - diff --git a/_source/html/chap09.xhtml b/_source/html/chap09.xhtml deleted file mode 100644 index 68a6f41b3..000000000 --- a/_source/html/chap09.xhtml +++ /dev/null @@ -1,114 +0,0 @@ - - - - -10. Config - - - -
-

-10. Config

- -

The config files

-

There are two main config files in SuiteCRM, both of which are in the root SuiteCRM folder. -These are config.php and config_override.php. The definitions in here provide -various configuration options for SuiteCRM. All the way from the details used -to access the database to how many entries to show per page in the list view. -Most of these options are accessible from the SuiteCRM administration page. However -some are only definable in the config files.

- -

config.php

-

This is the main SuiteCRM config file and includes important information like -the database settings and the current SuiteCRM version.

- -

Generally settings in this file wont be changed by hand. An exception to this is -if SuiteCRM has been moved or migrated. In which case you may need -to change the database settings and the site_url. Let’s look at the database settings -first:

- -
-

Example 10.1: Database config definition

- -
 1 'dbconfig' =>
- 2 array (
- 3   'db_host_name' => 'localhost',
- 4   'db_host_instance' => 'SQLEXPRESS',
- 5   'db_user_name' => 'dbuser',
- 6   'db_password' => 'dbpass',
- 7   'db_name' => 'dbname',
- 8   'db_type' => 'mysql',
- 9   'db_port' => '',
-10   'db_manager' => 'MysqliManager',
-11 ),
-
- -
- -

Here we can see this instance is setup to access a local MySQL instance using -the username/password dbuser/dbpass and accessing the database named ‘dbname’.

- -

The site url settings are even simpler:

- -
-

Example 10.2: Setting the site URL

- -
  'site_url' => 'http://example.com/suitecrm',
-
- -
-

The site url for the above is simply ‘http://example.com/suitecrm’ if we were moving -this instance to, for example, suite.example.org, then we can simply place that value in -the file.

- -

These are generally the only two instances where you would directly change config.php. -For other changes you would either make the change through SuiteCRM itself or you would use -the
config_override.php file.

- -

config_override.php

-

config_override.php allows you to make config changes without risking breaking the -main config file. This is achieved quite simply by adding, editing or removing items -from the $sugar_config variable. The config_override.php file will be merged - with the existing config allowing, as the name suggests, overriding the config. -For example in config_override.php we can add our own, new, config item:

- -
-

Example 10.3: Adding a custom config value

- -
$sugar_config['enable_the_awesome'] = true;
-
- -
-

or we can edit an existing config option in a very similar manner by simply overwriting -it:

- -
-

Example 10.4: Overwriting an existing config value

- -
$sugar_config['logger']['level'] = 'debug';
-
- -
- -

Using config options

-

We may want to access config options in custom code (or as detailed above if we have -created our own config setting we may want to use that). We can easily get the -config using the php global keyword:

- -
-

Example 10.5: Accessing a config setting within SuiteCRM

- -
1 function myCustomLogic(){
-2   //Get access to config
-3   global $sugar_config;
-4   //use the config values
-5   if(!empty($sugar_config['enable_the_awesome'])){
-6     doTheAwesome();
-7   }
-8 }
-
- -
-
- - diff --git a/_source/html/chap10.xhtml b/_source/html/chap10.xhtml deleted file mode 100644 index 618caecd7..000000000 --- a/_source/html/chap10.xhtml +++ /dev/null @@ -1,91 +0,0 @@ - - - - -11. Logging - - - -
-

-11. Logging

- -

Logging messages

- -

Logging in SuiteCRM is achieved by accessing the log global. Accessing an instance of -the logger is as simple as

- -
-

Example 11.1: Accessing the log

- -
$GLOBALS['log']
-
- -
- -

This can then be used to log a message. Each log level is available as a method. -For example:

- -
-

Example 11.2: Logging messages

- -
1 $GLOBALS['log']->debug('This is a debug message');
-2 $GLOBALS['log']->error('This is an error message');
-
- -
- -

This will produce the following output:

- -
-

Example 11.3: Logging messages example output

- -
1 Tue Apr 28 16:52:21 2015 [15006][1][DEBUG] This is a debug message
-2 Tue Apr 28 16:52:21 2015 [15006][1][ERROR] This is an error message
-
- -
- -

Logging output

- -

The logging output displays the following information by default:

- -
-

Example 11.4: Logging messages example output

- -
<Date> [<ProcessId>][<UserId>][<LogLevel>] <LogMessage>
-
- -
- -
<Date>
-
The date and time that the message was logged.
-
<ProcessId>
-
The PHP process id.
-
<UserId>
-
The ID of the user that is logged into SuiteCRM.
-
<LogLevel>
-
The log level for this log message.
-
<LogMessage>
-
The contents of the log message.
-

Log levels

- -

Depending on the level setting in admin some messages will not be added to the log e.g -if your logger is set to error then you will only see log levels of error or -higher (error, fatal and security).

- -

The default log levels (in order of verbosity) are:

- -

Generally on a production instance you will use the less verbose levels (probably -error or fatal). However whilst you are developing you can use whatever level you prefer. -I prefer the most verbose level - debug.

-
- - diff --git a/_source/html/chap11.xhtml b/_source/html/chap11.xhtml deleted file mode 100644 index 3efe63c6f..000000000 --- a/_source/html/chap11.xhtml +++ /dev/null @@ -1,349 +0,0 @@ - - - - -12. Logic Hooks - - - -
-

-12. Logic Hooks

- -

Intro

-

Logic hooks allow you to hook into various events in SuiteCRM to fire custom -code. This can allow you to, for example, make a call to an external API, or to create a -new record if certain events occur.

- -

Types

-

Logic hooks can occur in three contexts. These contexts are Application Hooks, -Module Hooks and User Hooks. These are detailed below.

- -

Application Hooks

-

Application hooks are hooks which are fired in the application context (that is, -they are not fired against a particular module). These -hooks must be defined in the top level logic hook (i.e. -custom/modules/logic_hooks.php).

- -
after_entry_point
-
Called after SuiteCRM has initialised but before any other processing is carried out.
-
after_ui_footer
-
Called after the UI footer.
-
after_ui_frame
-
Fired after the UI has been displayed but before the footer has been displayed.
-
server_round_trip
-
Fired at the end of every page request.
-

User Hooks

-

User hooks are fired for certain login/logout actions. -Similar to Application Hooks, these hooks must be defined in the top level logic hook -(i.e. custom/modules/logic_hooks.php).

- -
after_login
-
Fired after a user logs in to SuiteCRM .
-
after_logout
-
Fired when a user logs out of SuiteCRM.
-
before_logout
-
Fired before a user logs out of SuiteCRM.
-
login_failed
-
Fired when a user attempts to login to SuiteCRM but the login fails.
-

Module Hooks

-

Module Hooks are called on various record actions for a specific module.

- -
after_delete
-
Fired when a record is deleted.
-
after_relationship_add
-
Fired after a relationship is added between two records. Note that this may be called twice, once for each side of the relationship.
-
after_relationship_delete
-
Fired after a relationship between two records is deleted.
-
after_restore
-
Fired after a record is undeleted.
-
after_retrieve
-
Fired after a record is retrieved from the DB.
-
after_save
-
Fired after a record is saved. Note that due to some peculiarities some related -modules may not be persisted to the database. The logic hook is fired within the -SugarBean classes save method. Some implementing classes may save related beans -after this method returns. A notable example of this is the saving of email addresses in Company modules.
-
before_delete
-
Fired before a record is deleted.
-
before_relationship_add
-
Fired before a relationship is added between two records. Note that this may be called twice, once for each side of the relationship.
-
before_relationship_delete
-
Fired before a relationship between two records is deleted. Note that this may be called twice, once for each side of the relationship.
-
before_restore
-
Fired before a record is undeleted.
-
before_save
-
Fired before a record is saved.
-
handle_exception
-
Fired when an exception occurs in a record.
-
process_record
-
Fired when a record is processed ready to be displayed in list views or dashlets.
-

Job Queue Hooks

-

Job queue hooks are fired for scheduler jobs. Similar to application hooks these -hooks must be defined in the top level logic hook (i.e. -custom/modules/logic_hooks.php).

- -
job_failure
-
Fired when a scheduled job either returns false to signify failure or throws -an exception and it will not be retried. See the section on Scheduled Tasks.
-
job_failure_retry
-
Fired when a scheduled job either returns false to signify failure or throws -an exception but it will be retried. See the section on Scheduled Tasks.
-

Implementing

-

Depending on the Logic Hook type logic hooks are either placed into
custom/modules/Logic_Hooks.php or custom/modules/<TargetModule>/Logic_Hooks.php.

- -

Logic_Hooks.php

-

The logic hook file itself specifies which logic hooks to fire on this event. It looks something like this:

- -
-

Example 12.1: Logic hook file

- -
 1 <?php
- 2 // Do not store anything in this file that is not part of the array or the hook
- 3 //version.  This file will be automatically rebuilt in the future.
- 4  $hook_version = 1;
- 5 $hook_array = Array();
- 6 // position, file, function
- 7 $hook_array['before_save'] = Array();
- 8 $hook_array['before_save'][] = Array(
- 9                               77,
-10                               'updateGeocodeInfo',
-11                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-12                               'CasesJjwg_MapsLogicHook',
-13                               'updateGeocodeInfo');
-14 $hook_array['before_save'][] = Array(
-15                               10,
-16                               'Save case updates',
-17                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-18                               'CaseUpdatesHook',
-19                               'saveUpdate');
-20 $hook_array['before_save'][] = Array(
-21                               11,
-22                               'Save case events',
-23                               'modules/AOP_Case_Events/CaseEventsHook.php',
-24                               'CaseEventsHook',
-25                               'saveUpdate');
-26 $hook_array['before_save'][] = Array(
-27                               12,
-28                               'Case closure prep',
-29                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-30                               'CaseUpdatesHook',
-31                               'closureNotifyPrep');
-32 $hook_array['before_save'][] = Array(
-33                               1,
-34                               'Cases push feed',
-35                               'custom/modules/Cases/SugarFeeds/CaseFeed.php',
-36                               'CaseFeed',
-37                               'pushFeed');
-38 $hook_array['after_save'] = Array();
-39 $hook_array['after_save'][] = Array(
-40                               77,
-41                               'updateRelatedMeetingsGeocodeInfo',
-42                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-43                               'CasesJjwg_MapsLogicHook',
-44                               'updateRelatedMeetingsGeocodeInfo');
-45 $hook_array['after_save'][] = Array(
-46                               10,
-47                               'Send contact case closure email',
-48                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-49                               'CaseUpdatesHook',
-50                               'closureNotify');
-51 $hook_array['after_relationship_add'] = Array();
-52 $hook_array['after_relationship_add'][] = Array(
-53                               77,
-54                               'addRelationship',
-55                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-56                               'CasesJjwg_MapsLogicHook',
-57                               'addRelationship');
-58 $hook_array['after_relationship_add'][] = Array(
-59                               9,
-60                               'Assign account',
-61                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-62                               'CaseUpdatesHook',
-63                               'assignAccount');
-64 $hook_array['after_relationship_add'][] = Array(
-65                               10,
-66                               'Send contact case email',
-67                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-68                               'CaseUpdatesHook',
-69                               'creationNotify');
-70 $hook_array['after_relationship_delete'] = Array();
-71 $hook_array['after_relationship_delete'][] = Array(
-72                               77,
-73                               'deleteRelationship',
-74                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-75                               'CasesJjwg_MapsLogicHook',
-76                               'deleteRelationship');
-
- -
- -

Let’s go through each part of the file.

- -
-
4 $hook_version = 1;
-
- -
- -

This sets the hook version that we are using. Currently there is only one -version so this line is unused.

- -
-
5 $hook_array = Array();
-
- -
- -

Here we set up an empty array for our Logic Hooks. This should always be -called $hook_array.

- -
-
7 $hook_array['before_save'] = Array();
-
- -
- -

Here we are going to be adding some before_save hooks so we add an empty array for that -key.

- -
-
 8 $hook_array['before_save'][] = Array(
- 9                               77,
-10                               'updateGeocodeInfo',
-11                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-12                               'CasesJjwg_MapsLogicHook',
-13                               'updateGeocodeInfo');
-
- -
- -

Finally we reach an interesting line. This adds a new logic hook to the before_save -hooks. This array contains 5 entries which define this hook. These are:

- -
Sort order
-

The first argument (77) is the sort order for this hook. The logic hook -array is sorted by this value. If you wish for a hook to fire earlier you should use a -lower number. If you wish for a hook to be fired later you should use a higher number. -The numbers themselves are arbitrary.

- -
Hook label
-

The second argument (‘updateGeocodeInfo’) is simply a label for the logic hook. -This should be something short but descriptive.

- -
Hook file
-

The third argument is where the actual class for this hook is. In this case -it is in a file called custom/modules/Cases/CasesJjwg_MapsLogicHook.php. -Generally you will want the files to be somewhere in custom and it is usual to have them -in custom/modules/<TheModule>/<SomeDescriptiveName>.php or custom/modules/<SomeDescriptiveName>.php -for Logic Hooks not targeting a specific module. However the files can be placed anywhere.

- -
Hook class
-

The fourth argument is the class name for the Logic Hook class. In this case
CasesJjwg_MapsLogicHook. It is usual for the class name to match the file name but this is -not required.

- -
Hook method
-

The fifth, and final, argument is the method that will be called on the class. -In this case updateGeocodeInfo.

- -

Adding your own logic hooks

-

When adding logic hooks you should make full use of the Extensions framework -(see the section on Extensions). This involves creating a file in
custom/Extension/application/Ext/LogicHooks/ for application hooks and
custom/Extension/modules/<TheModule>/Ext/LogicHooks/ for module specific -hooks. These files can then add to/alter the $hook_array as appropriate.

- - - - - - - -
-

After adding a new logic hook it is necessary to perform a quick repair and rebuild in the -admin menu for this to be picked up.

- -

Logic Hook function

-

The logic hook function itself will vary slightly based on the logic hook type. -For module hooks it will appear similar to:

- -
-

Example 12.2: Example logic hook method

- -
1     class SomeClass
-2     {
-3         function someMethod($bean, $event, $arguments)
-4         {
-5           //Custom Logic
-6         }
-7     }
-
- -
- -

Application logic hooks omit the $bean argument:

- -
-

Example 12.3: Example logic hook method for application hooks

- -
1     class SomeClass
-2     {
-3         function someMethod($event, $arguments)
-4         {
-5           //Custom Logic
-6         }
-7     }
-
- -
- -
$bean (SugarBean)
-

The $bean argument passed to your logic hook is usually the bean that the logic -hook is being performed on. For User Logic Hooks this will be the current User -object. For module logic hooks (such as before_save) this will be the record that is being saved. -For job queue logic hooks this will be the SchedulersJob bean. -Note that for Application Logic Hook this argument is not present.

- -
$event (string)
-

The $event argument contains the logic hook event e.g process_record, before_save,
after_delete etc.

- -
$arguments (array)
-

The $arguments argument contains any additional details of the logic hook event. -I.e. in the case of before_relationship_add this will contain details of the related modules.

- -

Tips

- - - - - - - -
-

Triggering extra logic hooks

-

If you are performing certain actions that may trigger another logic hook (such as -saving a bean) then you need to be aware that this will trigger the logic hooks -associated with that bean and action. This can be troublesome if this causes -a logic hook loop of saves causing further saves. One way around this is -to simply be careful of the hooks that you may trigger. If doing -so is unavoidable you can usually set an appropriate flag on the bean and then -check for that flag in subsequent hooks.

- -
- - - - - -
-

Think of the user

-

Most logic hooks will cause additional code which can degrade the users experience. -If you have long running code in the after_save the user will need to wait for -that code to run. This can be avoided by either ensuring the code runs quickly or -by using the Job Queue (see the Job Queue chapter for more information).

- -
-
- - diff --git a/_source/html/chap12.xhtml b/_source/html/chap12.xhtml deleted file mode 100644 index 837bc976d..000000000 --- a/_source/html/chap12.xhtml +++ /dev/null @@ -1,369 +0,0 @@ - - - - -13. Scheduled Tasks - - - -
-

-13. Scheduled Tasks

- -

Intro

-

Scheduled tasks are performed in SuiteCRM by the scheduler module. Jobs are placed into -the queue either through the defined scheduled tasks or, for one off tasks, by code -creating job objects. Note that both scheduled tasks and using the job queue requires -that you have the schedulers set up. This will vary depending on your system but -usually requires adding an entry either to Cron (for Linux systems) or to the windows -scheduled tasks (for windows). Opening the scheduled tasks page within SuiteCRM -will let you know the format for the entry.

- -

Scheduler

-

Scheduled tasks allow SuiteCRM to perform recurring tasks. Examples of these which -ship with SuiteCRM include checking for incoming mail, sending email reminder notifications -and indexing the full text search. What if you want to create your own tasks?

- -

SuiteCRM lets you define your own Scheduler. We do this by creating a file in
custom/Extension/modules/Schedulers/Ext/ScheduledTasks/. You can give this file -a name of your choice but it is more helpful to give it a descriptive name. Let’s create a simple file -named
custom/Extension/modules/Schedulers/Ext/ScheduledTasks/CleanMeetingsScheduler.php. -This will add a new job to the job strings and a new method that the scheduler will -call:

- -
-

Example 13.1: Example Clean Meetings Scheduler

- -
 1 <?php
- 2 /*
- 3  * We add the method name to the $job_strings array.
- 4  * This is the method that jobs for this scheduler will call.
- 5  */
- 6 $job_strings[] = 'cleanMeetingsScheduler';
- 7 
- 8 /**
- 9  * Example scheduled job to change any 'Planned' meetings older than a month
-10  * to 'Not Held'.
-11  * @return bool
-12  */
-13 function cleanMeetingsScheduler(){
-14   //Get the cutoff date for which meetings will be considered
-15 	$cutOff = new DateTime('now - 1 month');
-16 	$cutOff = $cutOff->format('Y-m-d H:i:s');
-17 
-18 	//Get an instance of the meetings bean for querying
-19   //see the Working With Beans chapter.
-20   $bean = BeanFactory::getBean('Meetings');
-21 
-22   //Get the list of meetings older than the cutoff that are marked as Planned
-23   $query = "meetings.date_start < '$cutOff' AND meetings.status = 'Planned'";
-24   $meetings = $bean->get_full_list('',$query);
-25 
-26   foreach($meetings as $meeting){
-27     //Mark each meeting as Not Held
-28     $meeting->status = 'Not Held';
-29     //Save the meeting changes
-30     $meeting->save();
-31   }
-32   //Signify we have successfully ran
-33   return true;
-34 }
-
- -
- -

We also make sure that we add a language file in
custom/Extension/modules/Schedulers/Ext/Language/en_us.cleanMeetingsScheduler.php -again, the name of the file doesn’t matter but it is helpful to use something descriptive. -This will define the language string for our job so the user sees a nice label. -See the section on language strings for more information. -The key for the mod strings will be LBL_UPPERMETHODNAME. In our case our method -name is cleanMeetingsScheduler so our language label key will be LBL_CLEANMEETINGSSCHEDULER.

- -
-

Example 13.2: Example Language string for Clean Meetings Scheduler

- -
1 <?php
-2 //We add the mod string for our method here.
-3 $mod_strings['LBL_CLEANMEETINGSSCHEDULER'] = 'Mark old, planned meetings as Not \
-4 Held';
-
- -
- -

If we perform a repair and rebuild our method will now be packaged up into the scheduler -ext file (see the Extensions section for more information on this process) and -will be available in the schedulers page. Note that for any changes to the scheduler -method you will need to perform another quick repair and rebuild - even in developer mode. -We can now create a new scheduler to call our new method:

- -
- Creating a scheduler that uses our new method

Creating a scheduler that uses our new method

-
- -

This will now behave just like any other scheduler and we can have this run as often -(or as rarely) as we would like. Take care here. The default frequency is every one minute. -If your task is heavy duty or long running this may not be what you would prefer. Here we -settle for once a day.

- -

Job Queue

-

Sometimes you will require code to perform a long running task but you do not need -the user to wait for this to be completed. A good example of this is sending an email -in a logic hook (see the Logic Hooks chapter for information on these). Assuming we have -the following logic hook:

- -
-

Example 13.3: Example Email sending Logic Hook

- -
 1 class SomeClass
- 2 {
- 3     function SomeMethod($bean, $event, $arguments)
- 4     {
- 5 
- 6         //Perform some setup of the email class
- 7         require_once "include/SugarPHPMailer.php";
- 8         $mailer=new SugarPHPMailer();
- 9         $admin = new Administration();
-10         $admin->retrieveSettings();
-11         $mailer->prepForOutbound();
-12         $mailer->setMailerForSystem();
-13         $admin = new Administration();
-14         $admin->retrieveSettings();
-15         $admin->settings['notify_fromname']
-16         $mailer->From     = $admin->settings['notify_fromaddress']
-17         $mailer->FromName = $emailSettings['from_name'];
-18         $mailer->IsHTML(true);
-19 
-20         //Add message and recipient.
-21         //We could go all out here and load and populate an email template
-22         //or get the email address from the bean
-23         $mailer->Subject = 'My Email Notification! '.$bean->name;
-24         $mailer->Body = $event. ' fired for bean '.$bean->name;
-25         $mailer->AddAddress('Jim@example.com');
-26         return $mailer->Send();
-27     }
-28 }
-
- -
- -

This will work fine. However you do not want the user to have to wait for the email -to be sent out as this can cause the UI to feel sluggish. Instead -you can create a Job and place it into the job queue and this will be picked by the -scheduler. Let’s look at an example of how you would do this.

- -

First we want our Logic Hook class to create the scheduled job:

- -
-

Example 13.4: Example Scheduled Job Creation

- -
 1 class SomeClass
- 2 {
- 3     function SomeMethod($bean, $event, $arguments)
- 4     {
- 5       require_once 'include/SugarQueue/SugarJobQueue.php';
- 6       $scheduledJob = new SchedulersJob();
- 7 
- 8       //Give it a useful name
- 9       $scheduledJob->name = "Email job for {$bean->module_name} {$bean->id}";
-10 
-11       //Jobs need an assigned user in order to run. You can use the id
-12       //of the current user if you wish, grab the assigned user from the
-13       //current bean or anything you like.
-14       //Here we use the default admin user id for simplicity
-15       $scheduledJob->assigned_user_id = '1';
-16 
-17       //Pass the information that our Email job will need
-18       $scheduledJob->data = json_encode(array(
-19                                             'id' => $bean->id,
-20                                             'module' => $bean->module_name)
-21                                         );
-22 
-23       //Tell the scheduler what class to use
-24       $scheduledJob->target = "class::BeanEmailJob";
-25 
-26       $queue = new SugarJobQueue();
-27       $queue->submitJob($scheduledJob);
-28     }
-29 }
-
- -
- -

Next we create the BeanEmailJob class. This is placed into the
custom/Extensions/modules/Schedulers/Ext/ScheduledTasks/ directory with the same -name as the class. So in our example we will have:
custom/Extensions/modules/Schedulers/Ext/ScheduledTasks/BeanEmailJob.php

- -
-

Example 13.5: Example Scheduler job

- -
 1 class BeanEmailJob implements RunnableSchedulerJob
- 2 {
- 3   public function run($arguments)
- 4   {
- 5 
- 6     //Only different part of the email code.
- 7     //We grab the bean using the supplied arguments.
- 8     $arguments = json_decode($arguments,1);
- 9     $bean = BeanFactory::getBean($arguments['module'],$arguments['id']);
-10 
-11     //Perform some setup of the email class
-12     require_once "include/SugarPHPMailer.php";
-13     $mailer=new SugarPHPMailer();
-14     $admin = new Administration();
-15     $admin->retrieveSettings();
-16     $mailer->prepForOutbound();
-17     $mailer->setMailerForSystem();
-18     $admin = new Administration();
-19     $admin->retrieveSettings();
-20     $mailer->From     = $admin->settings['notify_fromaddress'];
-21     $mailer->FromName = $emailSettings['from_name'];
-22     $mailer->IsHTML(true);
-23 
-24     //Add message and recipient.
-25     //We could go all out here and load and populate an email template
-26     //or get the email address from the bean
-27     $mailer->Subject = 'My Email Notification! '.$bean->name;
-28     $mailer->Body = $event. ' fired for bean '.$bean->name;
-29     $mailer->AddAddress('Jim@example.com');
-30     return $mailer->Send();
-31   }
-32   public function setJob(SchedulersJob $job)
-33   {
-34     $this->job = $job;
-35   }
-36 }
-
- -
- -

Now whenever a user triggers the hook it will be much quicker since we are simply persisting -a little info to the database. The scheduler will run this in the background.

- -

Retries

-

Occasionally you may have scheduled jobs which could fail intermittently. Perhaps -you have a job which calls an external API. If the API is unavailable it would be -unfortunate if the job failed and was never retried. Fortunately the -SchedulersJob class has two properties which govern how retries are handled. -These are requeue and retry_count.

- -
requeue
-
Signifies that this job is eligible for retries.
-
retry_count
-
Signifies how many retries remain for this job. If the job fails this value will -be decremented.
-

We can revisit our previous example and add two retries:

- -
-

Example 13.6: Setting the retry count on a scheduled job

- -
 6       $scheduledJob = new SchedulersJob();
- 7 
- 8       //Give it a useful name
- 9       $scheduledJob->name = "Email job for {$bean->module_name} {$bean->id}";
-10 
-11       //Jobs need an assigned user in order to run. You can use the id
-12       //of the current user if you wish, grab the assigned user from the
-13       //current bean or anything you like.
-14       //Here we use the default admin user id for simplicity
-15       $scheduledJob->assigned_user_id = '1';
-16 
-17       //Pass the information that our Email job will need
-18       $scheduledJob->data = json_encode(array(
-19                                             'id' => $bean->id,
-20                                             'module' => $bean->module_name)
-21                                         );
-22 
-23       //Tell the scheduler what class to use
-24       $scheduledJob->target = "class::BeanEmailJob";
-25 
-26       //Mark this job for 2 retries.
-27       $scheduledJob->requeue = true;
-28       $scheduledJob->retry = 2;
-
- -
- -

See the section on logic hooks for more information on how job failures can be handled.

- -

Debugging

-

With Scheduled tasks and jobs running in the background it can sometimes be difficult to -determine what is going on when things go wrong. If you are debugging a scheduled -task the the scheduled task page is a good place to start. For both scheduled tasks -and job queue tasks you can also check the job_queue table. For example, in MySQL -we can check the last five scheduled jobs:

- -
-

Example 13.7: Example MySQL query for listing jobs

- -
SELECT * FROM job_queue ORDER BY date_entered DESC LIMIT 5
-
- -
- -

This will give us information on the last five jobs. -Alternatively we can check on specific jobs:

- -
-

Example 13.8: Example MySQL query for listing BeanEmailJobs

- -
SELECT * FROM job_queue WHERE target = 'class::BeanEmailJob'
-
- -
- -

In either case this will give details for the job(s):

- -
-

Example 13.9: Example MySQL list of jobs

- -
*************************** 1. row ***************************
-assigned_user_id: 1
-              id: 6cdf13d5-55e9-946e-9c98-55044c5cecee
-            name: Email job for Accounts 103c4c9b-336f-0e87-782e-5501defb5900
-         deleted: 0
-    date_entered: 2015-03-14 14:58:15
-   date_modified: 2015-03-14 14:58:25
-    scheduler_id:
-    execute_time: 2015-03-14 14:58:00
-          status: done
-      resolution: success
-         message: NULL
-          target: class::BeanEmailJob
-            data: {"id":"103c4c9b-336f-0e87-782e-5501defb5900","module":"Account\
-s"}
-         requeue: 0
-     retry_count: NULL
-   failure_count: NULL
-       job_delay: 0
-          client: CRON3b06401793b3975cd00c0447c071ef9a:7781
-percent_complete: NULL
-1 row in set (0.00 sec)
-
- -
- -

Here we can check the status, resolution and message fields. If the status is -queued then either the scheduler has not yet run or it isn’t running. -Double check your Cron settings if this is the case.

- -

It may be the case that the job has ran but failed for some reason. In this case -you will receive a message telling you to check the logs. Checking the logs usually -provides enough information, particularly if you have made judicious use of logging -(see the chapter on logging) in your job.

- -

It is possible that the job is failing outright, in which case your logging may not receive -output before the scheduler exits. In this case you can usually check your PHP logs.

- -

As a last resort you can manually run the scheduler from the SuiteCRM directory using:

- -
-

Example 13.10: Running the scheduler manually

- -
php -f cron.php
-
- -
- -

Using this in addition to outputting any useful information -should track down even the oddest of bugs.

-
- - diff --git a/_source/html/chap13.xhtml b/_source/html/chap13.xhtml deleted file mode 100644 index 63ebe81d4..000000000 --- a/_source/html/chap13.xhtml +++ /dev/null @@ -1,172 +0,0 @@ - - - - -14. Extension Framework - - - -
-

-14. Extension Framework

- -

Introduction

-

The extension framework provides a means to modify various application data -inside SuiteCRM. For example it provides a way to add or modify vardefs, scheduled -tasks, language strings and more. In general a folder is provided in -custom/Extension (the exact path depends on the extension). This folder is then -scanned for files which will be consolidated into a single ext file which SuiteCRM -will then read and use. In this way it is possible for developers to add a new file -to affect the behaviour of SuiteCRM rather than altering existing files. This makes -the changes more modular and allows the easy addition or removal of changes. -Additionally, because these files are all consolidated it means that there is no -affect on performance of checking a (possibly large) number of files. This is only done -when performing a repair and rebuild in the admin menu.

- -

Standard Extensions

- - -

List of standard SuiteCRM extensions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Extension DirectoryCompiled fileModuleDescription
ActionViewMapaction_view_map.ext.php Used to map actions for a module to a specified view.
ActionFileMapaction_file_map.ext.php Used to map actions for a module to a specified file.
ActionReMapaction_remap.ext.php Used to map actions for a module to existing actions.
Administrationadministration.ext.phpAdministrationUsed to add new sections to the administration panel.
EntryPointRegistryentry_point_registry.ext.phpapplicationUsed to add new entry points to SuiteCRM. See the chapter on Entry Points.
Extensionsextensions.ext.phpapplicationUsed to add new extension types.
FileAccessControlMapfile_access_control_map.ext.php Used to add, update or delete entries in the access control lists for files.
LanguageN/A1 Used to add, update or delete language strings for both modules and app strings. See the chapter on Language Strings.
Layoutdefslayoutdefs.ext.php Used to add, update or delete subpanel definitions for a module.
GlobalLinkslinks.ext.phpapplicationUsed to add, update or delete global links (the list of links that appear in the top right of the SuiteCRM UI).
LogicHookslogichooks.ext.php Used to add, update or delete logic hooks. See the chapter on Logic Hooks.
Includemodules.ext.phpapplicationUsed to register new beans and modules.
Menusmenu.ext.php Used to add, update or delete the menu links for each module.
ScheduledTasksscheduledtasks.ext.phpSchedulersUsed to add new scheduled tasks. See the chapter on Scheduled Tasks.
UserPageuserpage.ext.phpUsersUnused
Utilscustom_utils.ext.phpapplicationUsed to add new utility methods.
Vardefsvardefs.ext.php Used to add, update or delete vardefs for a module. See the section on Vardefs.
JSGroupingsjsgroups.ext.php Used to add, update or delete JavaScript groupings.
Actionsactions.ext.phpAOW_ActionsUsed to add new WorkFlow actions.

Custom Extensions

-

Interestingly the extension framework can be used to add new extensions. This -allows you to create customisations that are easily customised by others -(in a similar manner to, for example, how vardefs can be added - see the chapter on Vardefs).

- -

To create a custom extension you simply add a new file in
custom/Extension/application/Ext/Extensions. This can be given a name of your choosing. -Our example will use
custom/Extension/application/Ext/Extensions/SportsList.php -and will look like:

- -
-

Example 14.1: Adding an entry point entry

- -
1 <?php
-2 $extensions["sports_list"] =  array(
-3                 "section" => "sports_list",
-4                 "extdir" => "SportsList",
-5                 "file" => 'sportslist.ext.php',
-6                 "module" => "");
-
- -
- -

Now when a Quick Repair and rebuild is run any files in
custom/Extension/application/Ext/SportsList/ will be consolidated into
custom/application/Ext/SportsList/sportslist.ext.php. On it’s own this file -will not do anything but you are now able to write custom code that checks the consolidated -file rather than having to worry about searching for customisations.

- - - - - -
-
  1. The language extensions are treated specially and, as such, aren’t compiled to a single file. -
  2. -
-
- - diff --git a/_source/html/chap14.xhtml b/_source/html/chap14.xhtml deleted file mode 100644 index 3caaf6520..000000000 --- a/_source/html/chap14.xhtml +++ /dev/null @@ -1,552 +0,0 @@ - - - - -15. Module Installer - - - -
-

-15. Module Installer

- -

As detailed in the other chapters of this book there are many ways to customise -SuiteCRM. The module installer allows you to package these changes and install -them onto other SuiteCRM instances. This is achieved by creating a package.

- -

At the minimum a package is a zip file that contains a manifest.php file in -it’s root. The manifest file is responsible for providing information about the -installer as well as providing information on how to install the package.

- -

manifest.php

-

The manifest.php file contains the definition of three arrays. -Let’s look at each of these arrays in turn. See Appendix A for the full sample -manifest.php file.

- - - - - - - -
- -

Within path in the manifest file you can use <basepath> to refer to the base -directory of the installer. For example <basepath>/Foo.txt will refer to the -Foo.txt file in the root of the installer package.

- -

- $manifest -

-

The $manifest array provides information on the package itself such as it’s name, -readme etc. (it also defines the copy array for patch packages). A sample -definition of the manifest array will appear something like this:

- -
-

Example 15.1: Example $manifest array definition

- -
 1 $manifest = array(
- 2   'name' => 'My First Package',
- 3   'description' => 'This is a simple package example manifest file',
- 4   'version' => '1.5',
- 5   'author' => 'Jim Mackin',
- 6   'readme' => 'readme.txt',
- 7   'acceptable_sugar_flavors' => array('CE'),
- 8   'acceptable_sugar_versions' => array(
- 9     'exact_matches' => array(),
-10     'regex_matches' => array('6\\.5\\.[0-9]$'),
-11   ),
-12   'copy_files' => array (
-13     'from_dir' => '<basepath>/custom/',    
-14     'to_dir' => 'custom',     
-15     'force_copy' => array (),
-16   ),
-17   'dependencies' => array(
-18     array(
-19       'id_name' => 'example_dependency_package',
-20       'version' => '2.4',
-21     ),
-22   ),
-23 );
-
- -
- -
name
-
The name of the package. This is how the package will appear to the user during installation -and in the Module Loader package list. The package name is required.
-
description
-
A brief description of the package.
-
version
-
The version of this package. This can be any string but is usually -a traditional version number (such as 3.1.4).
-
author
-
The author of the package.
-
readme
-
A brief readme string. Note that if a README.txt is found in the root of the -package this will be used instead.
-
acceptable_sugar_flavors
-
A remnant of the SugarCRM packages. This should always be an array with (at least) -a CE entry. If you would like the installer to target both SuiteCRM and SugarCRM editions -then this can contain one of the other SugarCRM flavours (PRO, CORP , ULT or ENT).
-
acceptable_sugar_versions
-
An array detailing the matching SugarCRM versions. Note that the SugarCRM version -is distinct from the SuiteCRM version. This array has two keys. exact_matches is -simply an array of the allowed versions. regex_matches allows specifying regexes -to match versions. For SuiteCRM you only need to worry about supporting the -6.5.* versions which can be matched with the regex 6\\.5\\.[0-9]$. At the time of -writing the current SugarCRM version for SuiteCRM is 6.5.20.
-
copy_files
-
This is only used for patch installers and will copy files in the from_dir - key to those in the to_dir key. Finally the force_copy key can be used to - specify files that should be forcibly copied over.
-
dependencies
-
An array of other packages that are relied on by this package. Each entry is an array -with id_name - the id of the package and version - the required version of -the package.
-
icon
-
The path (within the installer) to an icon to be displayed during installation.
-
is_uninstallable
-
Whether or not uninstalls should be allowed.
-
published_date
-
The date that the package was published. There is no fixed format for the date, -it is simply a string.
-
key
-
Specifies a key to ensure that modules do not clash. This will prefix the installed -modules and tables with key. This is used by the module builder when creating -packages but can be specified if you wish.
-
remove_tables
-
A string specifying whether module tables should be removed when uninstalling this package. -Accepted values are true, false and prompt. The default is true.
-
type
-
The type of the installer, one of langpack, module, patch or theme. See -the types section.
-

- $install_defs -

-

Provides information on how the package is to be installed, which files go where -and any additional information such as logic hooks, custom fields etc.

- -
- id -
-

A unique identifier for the module.

- -
- connectors -
-

An array of connectors to be installed. Each entry is an array with the following keys:

- - - - - - - - - - - - - - - - - - -
KeyDescription
nameThe name of the connector.
connectorThe directory to copy the connector files from.
formatterThe directory to copy the connector formatter files from.
- copy -
-

An array of files and directories to be copied on install. Each entry is an -array with the following keys:

- - - - - - - - - - - - - - - -
KeyDescription
fromThe source file/directory in the package.
toThe destination file/directory.
- - - - - -
-

In general if a file can -be handled by one of the other keys then that key should be used. For example -new admin entries should be copied using the administration key rather than -using the copy key.

- -
- dashlets -
-

An array of dashlets to be installed. Each entry is an array with the following keys:

- - - - - - - - - - - - - - - -
KeyDescription
nameThe name of the new dashlet.
fromThe path in the install package from which the dashlet files will be copied.
- language -
-

An array of language files to be installed. Each entry is an array with the following keys:

- - - - - - - - - - - - - - - - - - -
KeyDescription
fromThe location of the language file inside the package.
to_moduleThe module this language file is intended for (or ‘application’ for application language strings).
languageThe language that this file is for (i.e. en_us or es_es).

See the chapter on Language Strings for more information.

- -
- layoutdefs -
-

An array of layoutdef files which are used to add, remove or edit subpanels. -Each entry is an array with the following keys:

- - - - - - - - - - - - - - - -
KeyDescription
fromThe path in the package to the file to be installed.
to_moduleThe module that this file will be installed to.
- vardefs -
-

An array of the vardefs to be added to specific modules. Each entry is an array -with the following keys:

- - - - - - - - - - - - - - - -
KeyDescription
fromThe location of the vardef file in the package.
to_moduleThe destination module.
- - - - - -
-

Generally you should install custom fields using the custom_fields key. However -this key can be used to alter existing fields or add more complex fields.

- -
- menu -
-

An array of menus to be installed. Each entry is an array with the following keys:

- - - - - - - - - - - - - - - -
KeyDescription
fromThe location of the menu file in the package.
to_moduleThe destination module for this menu.
- beans -
-

An array of beans to be installed. Each entry is an array with the following keys:

- - - - - - - - - - - - - - - - - - - - - -
KeyDescription
moduleThe name of the module.
classThe name of the bean class.
pathThe path (within the package) to the bean file.
tabWhether or not a tab should be added for this module.
- relationships -
-

An array detailing any new relationships added (in particular relationships where -one side is an existing module). Each entry is an array with the following keys:

- - - - - - - - - - - - - - - -
KeyDescription
moduleThe module that this relationship will be attached to.
meta_dataThe location of the metadata file for this relationship.
- custom_fields -
-

An array of new custom fields to be installed (See the -Vardefs chapter for more information on this). Each entry is an array with the -following keys:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeyDescription
nameThe name of the new custom field.
labelThe key for the language string which will act as the label for this custom field.
typeThe type of this custom field.
max_sizeFor string field types, the maximum number of characters.
require_optionWhether or not the field is required.
default_valueThe default value of this field.
ext1Extended field information. Different field types will use this value differently. For example Enum fields will store the key for the options in this field, decimal and float fields will store the precision.
ext2Extended field information. Different field types will use this value differently. For example, dynamic dropdowns will store the parent dropdown, text areas will store the number of rows.
ext3Extended field information. Different field types will use this value differently. For example, text areas will store the number of columns.
ext4Extended field information. Different field types will use this value differently. For HTML field types this will store the HTML.
auditedWhether or not changes to this field should be audited.
moduleUsed to specify the module where the custom field will be added.
- logic_hooks -
-

An array of logic hooks to be installed. See the Logic Hooks chapter for more -information. Each entry is an array with the following keys:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeyDescription
moduleThe module to where this logic hook should be installed. Leaving this empty will install into the top level logic hook.
hookThe logic hook type (i.e. after_save, after_login, etc.).
orderThe sort order for this logic hook.
descriptionA description of the hook.
fileThe file containing the class for this logic hook, relative to the SuiteCRM root.
classThe class that contains the logic hook function that should be called by this hook.
functionThe function to be invoked when this hook is triggered.
- image_dir -
-

A path to a directory of images to be included in the install.

- -
- schedulers -
-

An array of schedulers to be installed. Each entry is an array with a single key:

- - - - - - - - - - - - -
KeyDescription
fromThe file containing the new scheduled task.
- administration -
-

An array of admin panels to be installed. Each entry is an array with a single key:

- - - - - - - - - - - - -
KeyDescription
fromThe file containing the new admin panel definition.
- pre_execute -
-

Defines an array of files to be executed before the package is installed. Each -entry is a path to a file within the package. Any output will be displayed to the user in -the install log.

- -
- post_execute -
-

Defines an array of files to be executed after the package is installed. Each -entry is a path to a file within the package. Any output will be displayed to the user in -the install log.

- -
- pre_uninstall -
-

Defines an array of files to be executed before the package is uninstalled. Each -entry is a path to a file within the package. Any output will be displayed to the user in -the uninstall log.

- -
- post_uninstall -
-

Defines an array of files to be executed after the package is uninstalled. Each -entry is a path to a file within the package. Any output will be displayed to the user in -the uninstall log.

- -

- $upgrade_manifest -

-

Provides a means of upgrading an already installed package by providing different -install_defs.

- -
-

Types

- - - - - - - - - - - - - - - - - - - - - -
TypeDescription
langpackA language installer. This will add an entry to the language dropdown.
moduleA module installer. Will install new modules and/or functionality.
patchA patch installer. This is used to upgrade SuiteCRM.
themeA theme installer. This will add a new option to the themes.

Other files

- -
README.txt
-
Contains the readme for this package. If README.txt and a readme entry in -the manifest.php is defined then this file will be used.
-
LICENSE.txt
-
Provides information on the license for this package.
-
scripts/pre_install.php
-
A PHP script which defines a method pre_install(). This method will be called -before the package is installed. Any output will be displayed to the user in -the install log.
-
scripts/post_install.php
-
A PHP script which defines a method post_install(). This method will be called -after the package is installed.
-
scripts/pre_uninstall.php
-
A PHP script which defines a method pre_uninstall(). This method will be called -before the package is uninstalled.
-
scripts/post_uninstall.php
-
A PHP script which defines a method post_uninstall(). This method will be called -after the package is uninstalled.
-
-
- - diff --git a/_source/html/chap15.xhtml b/_source/html/chap15.xhtml deleted file mode 100644 index b7122f668..000000000 --- a/_source/html/chap15.xhtml +++ /dev/null @@ -1,350 +0,0 @@ - - - - -16. API - - - -
-

-16. API

- -

The SuiteCRM API allows third party code to access and edit SuiteCRM data and -functionality.

- -

Using the API

-

SuiteCRM has both a REST and a SOAP API. Which API you want to use will largely come down to personal -preference and the support for SOAP/REST libraries in whichever language you will -be using.

- -

Both APIs will require a username and password. It is usual to create a user -specifically for the API.

- -

SOAP

-

The WSDL for the SOAP API can be found at:

- -
-

Example 16.1: SOAP API WSDL Location

- -
example.com/suitecrm/service/v4_1/soap.php?wsdl
-
- -
-

Where example.com/suitecrm is the address of your SuiteCRM instance. -v4_1 is the version of the API and can be changed, v4_1 is the latest version at the -time of writing.

- -
SOAP Example
-

The following PHP example uses the built in SoapClient class.

- -
-

Example 16.2: Accessing the SOAP API

- -
 1 <?php
- 2 //Create a new SoapClient
- 3 $wsdlURL = "http://example.com/suitecrm/service/v4_1/soap.php?wsdl";
- 4 $client = new SoapClient($wsdlURL);
- 5 
- 6 //Login to the API and get the session id
- 7 $userAuth = array(
- 8         'user_name' => '<suitecrmuser>',
- 9         'password' => md5('<suitecrmpassword>'),
-10 );
-11 $appName = 'My SuiteCRM SOAP Client';
-12 $nameValueList = array();
-13 $loginResults = $client->login($userAuth, $appName, $nameValueList);
-14 
-15 //Get a list of at most 10 accounts with a billing address in Ohio. Along with
-16 //The first and last names of any contacts in that Account.
-17 $results = $client->get_entry_list(
-18         //Session id - retrieved from login call
-19         $loginResults->id,
-20         //Module to get_entry_list for
-21         'Accounts',
-22         //Filter query - Added to the SQL where clause
-23         "accounts.billing_address_city = 'Ohio'",
-24         //Order by - unused
-25         '',
-26         //Start with the first record
-27         0,
-28         //Return the id and name fields
-29         array('id','name'),
-30         //Link to the "contacts" relationship and retrieve the
-31         //First and last names.
-32         array(
-33                 array(
-34                         'name' => 'contacts',
-35                         'value' => array(
-36                                 'first_name',
-37                                 'last_name',
-38                         ),
-39                 ),
-40         ),
-41         //Show 10 max results
-42         10,
-43         //Do not show deleted
-44         0
-45 );
-46 print_r($results);
-
- -
- -
-

REST

- -

The SuiteCRM REST API can be found at:

- -
-

Example 16.3: REST API Endpoint Location

- -
example.com/suitecrm/service/v4_1/rest.php
-
- -
- -

Where example.com/suitecrm is the address of your SuiteCRM instance. -v4_1 is the version of the API and can be changed, v4_1 is the latest version at the -time of writing.

- -

The SuiteCRM REST API is not a true REST API - all calls are performed as POSTs -and all calls are to the base URL with the method passed in as a post argument.

- -
The arguments to the REST API calls are:
-
method
-
The method which will be called, i.e. login or get_entry_list. See Appendix B for -a list of API methods.
-
input_type
-
The input type of the rest_data. This is usually JSON but can also be Serialize.
-
response_type
-
How the response will be encoded. This is usually JSON but can also be Serialize.
-
rest_data
-
Any other arguments that are required by this method. This is passed as an encoded array. The encoding -is determined by input_type.
-
- - - - - -
-

Note that, for REST requests it is the order of the arguments that matter in rest_data -and not the name.

- -
-
Examples
- -
-

Example 16.4: Accessing the REST API

- -
 1 <?php
- 2 
- 3 $url = "http://example.com/suitecrm/service/v4_1/rest.php";
- 4 
- 5 function restRequest($method, $arguments){
- 6 	global $url;
- 7 	$curl = curl_init($url);
- 8 	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
- 9 	$post = array(
-10 			"method" => $method,
-11 			"input_type" => "JSON",
-12 			"response_type" => "JSON",
-13 			"rest_data" => json_encode($arguments),
-14 	);
-15 
-16 	curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
-17 
-18 	$result = curl_exec($curl);
-19 	curl_close($curl);
-20 	return json_decode($result,1);
-21 }
-22 
-23 
-24 $userAuth = array(
-25         'user_name' => 'suitecrmuser',
-26         'password' => md5('suitecrmpassword'),
-27 );
-28 $appName = 'My SuiteCRM REST Client';
-29 $nameValueList = array();
-30 
-31 $args = array(
-32             'user_auth' => $userAuth,
-33             'application_name' => $appName,
-34             'name_value_list' => $nameValueList);
-35 
-36 $result = restRequest('login',$args);
-37 $sessId = $result['id'];
-38 
-39 $entryArgs = array(
-40   //Session id - retrieved from login call
-41 	'session' => $sessId,
-42   //Module to get_entry_list for
-43 	'module_name' => 'Accounts',
-44   //Filter query - Added to the SQL where clause,
-45 	'query' => "accounts.billing_address_city = 'Ohio'",
-46   //Order by - unused
-47 	'order_by' => '',
-48   //Start with the first record
-49 	'offset' => 0,
-50   //Return the id and name fields
-51 	'select_fields' => array('id','name',),
-52 	//Link to the "contacts" relationship and retrieve the
-53 	//First and last names.
-54 	'link_name_to_fields_array' => array(
-55 			array(
-56 					'name' => 'contacts',
-57 					'value' => array(
-58 							'first_name',
-59 							'last_name',
-60 					),
-61 			),
-62 	),
-63   //Show 10 max results
-64 	'max_results' => 10,
-65   //Do not show deleted
-66 	'deleted' => 0,
-67 );
-68 $result = restRequest('get_entry_list',$entryArgs);
-69 
-70 print_r($result);
-
- -
- -

For a full list of API methods and their arguments see Appendix B.

- -

Adding custom API methods

- -

Sometimes the existing API methods are not sufficient or using them for a task -would be overly complex. SuiteCRM allows the web services to be extended with -additional methods or overriding existing methods.

- -

The recommended path for custom entry points is the following
custom/service/<version>_custom/. At the time of writing the latest -web service version is v4_1 so this would be custom/service/v4_1_custom/.

- -

Next we create the implementing class. This will create our new method. -In our example we will simply create a new method which writes to the SuiteCRM -log We will call this method
write_log_message.

- -
-

Example 16.5: Custom v4_1 Web Service Implementation

- -
 1 <?php
- 2 if(!defined('sugarEntry')){
- 3   define('sugarEntry', true);
- 4 }
- 5 require_once 'service/v4_1/SugarWebServiceImplv4_1.php';
- 6 class SugarWebServiceImplv4_1_custom extends SugarWebServiceImplv4_1
- 7 {
- 8 
- 9   function write_log_message($session, $message)
-10   {
-11     $GLOBALS['log']->info('Begin: write_log_message');
-12 
-13     //Here we check that $session represents a valid session
-14     if (!self::$helperObject->checkSessionAndModuleAccess(
-15                                                     $session, 
-16                                                     'invalid_session', 
-17                                                     '', 
-18                                                     '', 
-19                                                     '',  
-20                                                     new SoapError()))
-21     {
-22       $GLOBALS['log']->info('End: write_log_message.');
-23       return false;
-24     }
-25     $GLOBALS['log']->info($message);
-26     return true;
-27   }
-28 }
-
- -
- -

Next we create the registry file which will register our new method.

- -
-

Example 16.6: Custom v4_1 web service registry

- -
 1 <?php
- 2     require_once 'service/v4_1/registry.php';
- 3     class registry_v4_1_custom extends registry_v4_1
- 4     {
- 5         protected function registerFunction()
- 6         {
- 7             parent::registerFunction();
- 8             $this->serviceClass->registerFunction('write_log_message', 
- 9                                                   array(
-10                                                     'session'=>'xsd:string',
-11                                                     'message'=>'xsd:string'), 
-12                                                   array(
-13                                                     'return'=>'xsd:boolean')
-14                                                   );
-15         }
-16     }
-
- -
- -

Finally we create the entry point. This is the actual file that will be called -by our API clients. This will reference the two files which we have created and will call -the webservice implementation with our files.

- -
-

Example 16.7: Custom v4_1 REST Entry point

- -
 1 <?php
- 2 chdir('../../..');
- 3 
- 4 require_once 'SugarWebServiceImplv4_1_custom.php';
- 5 
- 6 $webservice_path = 'service/core/SugarRestService.php';
- 7 $webservice_class = 'SugarRestService';
- 8 $webservice_impl_class = 'SugarWebServiceImplv4_1_custom';
- 9 $registry_path = 'custom/service/v4_1_custom/registry.php';
-10 $registry_class = 'registry_v4_1_custom';
-11 $location = 'custom/service/v4_1_custom/rest.php';
-12 
-13 require_once 'service/core/webservice.php';
-
- -
- -
-

Example 16.8: Custom v4_1 SOAP Entry point

- -
 1 <?php
- 2 chdir('../../..');
- 3 require_once('SugarWebServiceImplv4_1_custom.php');
- 4 $webservice_class = 'SugarSoapService2';
- 5 $webservice_path = 'service/v2/SugarSoapService2.php';
- 6 $webservice_impl_class = 'SugarWebServiceImplv4_1_custom';
- 7 $registry_class = 'registry_v4_1_custom';
- 8 $registry_path = 'custom/service/v4_1_custom/registry.php';
- 9 $location = 'custom/service/v4_1_custom/soap.php';
-10 require_once('service/core/webservice.php');
-
- -
- -

Usage

-

We can now use our custom endpoint. This is identical to using the API as detailed -above, except that we use our custom entry point for either the SOAP WSDL or REST -URL. For example using the same SuiteCRM location (example.com/suitecrm) as -the above examples and using v4_1, we would use the following

- -
-

Example 16.9: Custom v4_1 URLS

- -
1 //SOAP WSDL
-2 example.com/suitecrm/custom/service/v4_1_custom/soap.php?wsdl
-3 //REST URL
-4 example.com/suitecrm/custom/service/v4_1_custom/rest.php
-
- -
-
- - diff --git a/_source/html/chap16.xhtml b/_source/html/chap16.xhtml deleted file mode 100644 index f4caa6069..000000000 --- a/_source/html/chap16.xhtml +++ /dev/null @@ -1,160 +0,0 @@ - - - - -17. Best Practices - - - -
-

-17. Best Practices

- -

Development instances

-

When making changes you should always use a development or test instance first. -This allows you to fully and safely test any changes.

- -

Version control

-

When developing customisations it is prudent to use some form of version control. -Version control allows tracking changes to your codebase in addition to rolling back changes. -There are many version control systems available. SuiteCRM uses -Git although I also like Mercurial.

- -

If you are using a development instance (as mentioned above) then Version Control -usually allows you to push changes to other versions or to tag releases. This provides -a way of pushing changes to live or test instances safely. Crucially it also means -that, should there be major problems with a version then this can be easily rolled -back.

- -

Backup

-

SuiteCRM has been developed to be customisable. However, mistakes, bugs and other unpleasantness -can (and thanks to Murphy’s law, will) happen. You should always ensure, before -making any changes, that you have a backup of all files and of the database.

- -

In order to back up files you can simply create a zip of the SuiteCRM directory and -copy it to a safe place. On Linux systems this can be performed using the following:

- -
-

Example 17.1: File backup

- -
tar -czvf suitecrmfilebackup.tar.gz /path/to/suitecrm
-
- -
- -

Backing up the SuiteCRM database will vary depending on which database you are -using. However MySQL backups can be performed using the mysqldump command on Linux -as seen here:

- -
-

Example 17.2: MySQL Database backup

- -
mysqldump suitecrmdatabase -u databaseuser -p | gzip -c | cat > suitecrm.sql.gz
-
- -
- -

Be upgrade safe

-

Unless you are making changes to a custom module you should strive in all cases to use -the custom framework and make changes in the custom folder. This ensures that, -should you make a mistake, rectifying the mistake is as simple as removing the customisation.

- -

However the main advantage to using custom is that, when you upgrade SuiteCRM -in the future you will not have your changes overwritten by the updated SuiteCRM -files. See the Extensions chapter for more information.

- -

Use appropriate log levels

-

Using appropriate log levels (See the chapter on Logging) -makes it easier to track down issues. You do not want very important messages -to be logged as debug since this will make them difficult to find. Likewise -you don’t want unimportant log messages cluttering up the fatal log output.

- -

Long running logic hooks

-

If a logic hook task is long running then you should place it into the job queue (see the -Logic Hook and Scheduled Tasks -chapters).

- -

Minimise SQL

-

Where possible you should strive to use the SuiteCRM supplied methods of accessing -data. This includes using beans and the BeanFactory where possible (see the -chapter on Working with beans). -There are a few reasons for this. The first is that SQL is usually either hardcoded -or has to be dynamically built. In the case -where the SQL is hardcoded this means that changes to fields will not be -reflected thereby making your code more brittle.

- -

Dynamic SQL is better because it can react to field changes and generally be tailored -to fit the situation. However this requires adding extra, often complex, code. -It can be hard to account for all situations (this can be especially problematic -when attempting to traverse relationships dynamically).

- -

Another issue is that, usually SQL will end up being Database specific (see the -next point for mitigating this however).

- -

Finally any custom logic (such as Logic Hooks) which would usually be fired for saving - beans or relationships will not be fired for SQL -queries.

- -

SQL Use

-

In some cases using raw SQL is unavoidable. If that is the case then you should -strive to use standard compliant SQL. If database engine specific features need -to be used, and you wish to target other database engines, you can check for the -DB type. For example:

- -
-

Example 17.1: Checking for the database engine

- -
 1 function getSomeSQLQuery(){
- 2     global $sugar_config;
- 3     switch($sugar_config['dbconfig']['db_type']){
- 4         case 'mssql':
- 5             $sql = 'MSSQL specific SQL';
- 6             break;
- 7         case 'mysql':
- 8         default:
- 9             $sql = 'MySQL specific SQL';
-10             break;
-11     }
-12     return $sql;
-13 }
-
- -
- -

Entry check

-

The majority of SuiteCRM files will start with some variation of the -following line:

- -
-

Example 17.2: Entry check

- -
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-
- -
- -

This prevents direct access to the file by ensuring that SuiteCRM has been loaded -through a valid entry point (i.e. it has been loaded through index.php, cron.php -or a custom entry point).

- -

Redirect after post

-

Sometimes you may have custom controller actions (see the controller section) or -custom entry points (see the Entry Points chapter). -These actions and entry points -or other pages are usually accessed using POST. After a POST request it is -a web best practice to redirect to a different page, especially if your page makes -any changes. This prevents the user from refreshing the page and causing a duplicate -action. Within SuiteCRM it is best to use the SugarApplication::redirect method -to redirect. -This simply accepts a URL. As follows:

- -
-

Example 17.3: Redirecting within SuiteCRM

- -
SugarApplication::redirect('index.php?module=<TheModule>');
-
- -
-
- - diff --git a/_source/html/chap17.xhtml b/_source/html/chap17.xhtml deleted file mode 100644 index f3bb12c8b..000000000 --- a/_source/html/chap17.xhtml +++ /dev/null @@ -1,103 +0,0 @@ - - - - -18. Performance Tweaks - - - -
-

-18. Performance Tweaks

- -

In most cases the performance of SuiteCRM should not be an issue. However in the -case of large datasets or systems with many users you may notice some performance degradation. -These changes can help improve performance.

- -

Server

-

The server that SuiteCRM runs on is, of course, very important when it comes to -the kind of performance you can expect. A full guide on server setup is outside -the scope of this book. However there are some things you can do to ensure -that you get the best performance out of SuiteCRM.

- -

PHP

- -

Installing a PHP opcode cache will increase the performance of all -PHP files. These work by caching the compilation of PHP files resulting in less -work on each request. Furthermore SuiteCRM will use the caching API of some PHP accelerators -which will further increase performance. If you are using Linux then APC -is the usual choice. Windows users should check out WinCache.

- -

MySQL

-

MySQL is notorious for having small default settings. Fully optimising MySQL is outside -the scope of this book (however checkout mysqltuner.pl for a -helpful Perl script which will provide setting recommendations - note that you should be careful when -running files from an unknown source). One small change -that can make a big difference is increasing the innodb_buffer_pool_size.

- -

If you have migrated or imported a significant amount of data it is possible that some tables will -be fragmented. Running OPTIMIZE TABLE tablename can increase performance.

- -

Indexes

-

Adding indexes on the fields of modules can improve database performance. The -core modules usually have important fields indexed. However if you have created -a new module or added new, often searched fields to a module then these fields may benefit -from being indexed. See the Vardef chapter for adding indexes.

- -

Config Changes

-

The following are some config settings that can be used to improve performance. -Please note that in most cases you will have better performance gains by first -following the steps in previous sections. These settings should be set in the -config_override.php file. See the chapter on the Config files -for more information.

- -
-
$sugar_config['developerMode'] = false;
-
- -
-

Unless you are actively developing on an instance developerMode should be off. -Otherwise each page request will cause cached files to be reloaded.

- -
-
$sugar_config['disable_count_query'] = true;
-
- -
- -

For systems with large amounts of data the count queries on subpanels used for -the pagination controls can become slow thereby causing the page to be sluggish or -outright slow to load. Disabling these queries can improve performance dramatically -on some pages.

- -
-
$sugar_config['disable_vcr'] = true;
-
- -
- -

By default opening the detail view of a record from the list view will also load -the other records in the list to allow for easy moving through records. If you -do not use this feature, or, if loading the detail view for some records has become -slow, you can disable this feature.

- -
-
$sugar_config['list_max_entries_per_page'] = '10';
-
- -
- -

The number of records shown in each page of the list view can be decreased. This -will result in a slight increase in performance on list view pages.

- -
-
$sugar_config['logger']['level'] = 'fatal';
-
- -
- -

Lowering the log level means that there will be less log messages to write to disk -on each request. This will slightly (very slightly) increase performance.

-
- - diff --git a/_source/html/chap18.xhtml b/_source/html/chap18.xhtml deleted file mode 100644 index 3e5dc6cc7..000000000 --- a/_source/html/chap18.xhtml +++ /dev/null @@ -1,68 +0,0 @@ - - - - -19. Further Resources - - - -
-

-19. Further Resources

-

Although this book has aimed to be a thorough resource, SuiteCRM is large and feature rich. -Therefore it is not possible to include all the information you may require. Here are -some extra resources for developing with SuiteCRM.

- -

SuiteCRM Website

-

The SuiteCRM website (SuiteCRM.com has many excellent resources -including:

- -

External SuiteCRM Resources

- -
SuiteCRM GitHub
-
The SuiteCRM source code is hosted on GitHub. Here you can get bleeding edge -code changes and even contribute code.
-

SugarCRM Resources

-

SuiteCRM has strived to remain compatible with the SugarCRM community edition -and much of the documentation is still valid. The appropriate version for SuiteCRM -information is 6.5. Versions of documentation higher than this (i.e. 7) will probably -not be relevant.

- - - - -
- - diff --git a/_source/html/chap19.xhtml b/_source/html/chap19.xhtml deleted file mode 100644 index 539fd3f73..000000000 --- a/_source/html/chap19.xhtml +++ /dev/null @@ -1,182 +0,0 @@ - - - - -20. Appendix A - Code Examples - - - -
-

-20. Appendix A - Code Examples

- -

Metadata

- -

This is an example of setting up a function subpanel (see the -Metadata chapter for more information).

- -

In this example the cases module has a custom field incident_code_c which is used -to track cases with the same root cause. We’ll add a subpanel to show all cases -that have the same incident_code_c.

- -

Initially we add to the subpanel_setup section of Cases by creating the following -file in custom/Extension/modules/Cases/Ext/Layoutdefs/IncidentLayoutdefs.php

- -
-

Example A.1: IncidentLayoutdefs.php

- -
 1 <?php
- 2 $layout_defs["Cases"]["subpanel_setup"]['incident_cases'] = array(
- 3   'module' => 'Cases',
- 4   'title_key' => 'LBL_INCIDENT_CASES',
- 5   'subpanel_name' => 'default',
- 6   'get_subpanel_data' => 'function:get_cases_by_incident',
- 7   'function_parameters' => 
- 8           array('import_function_file' => 'custom/modules/Cases/IncidentUtils.ph\
- 9 p',),
-10 );
-
- -
- -

Next we create the file which will define our get_cases_by_incident function -custom/modules/Cases/IncidentUtils.php.

- -
-

Example A.2: IncidentUtils.php

- -
 1 <?php
- 2 function get_cases_by_incident(){
- 3         global $db;
- 4         //Get the current bean
- 5         $bean = $GLOBALS['app']->controller->bean;
- 6         $incidentCode = $db->quote($bean->incident_code_c);
- 7         //Create the SQL array
- 8         $ret = array();
- 9         $ret['select'] = ' SELECT id FROM cases ';
-10         $ret['from'] = ' FROM cases ';
-11         $ret['join'] = "";
-12         //Get all cases where the incident code matches but exclude the current \
-13 case.
-14         $ret['where']="WHERE cases.deleted = 0 AND cases_cstm.incident_code_c = \
-15 '{$incidentCode}' AND cases.id != '{$bean->id}'";
-16         return $ret;
-17 }
-
- -
- -

Module Installer

- -

The following is a basic example manifest file. See the -Module Installer chapter.

- -
-

Example A.3: Example manifest file

- -
  1 $manifest = array(
-  2   'name' => 'Example manifest',
-  3   'description' => 'A basic manifest example',
-  4   'version' => '1.2.3',
-  5   'author' => 'Jim Mackin',
-  6   'readme' => 'This is a manifest example for the SuiteCRM for Developers book',
-  7   'acceptable_sugar_flavors' => array('CE'),
-  8   'acceptable_sugar_versions' => array(
-  9       'exact_matches' => array('6.5.20',),
- 10   ),
- 11   'dependencies' => array(
- 12     array(
- 13       'id_name' => 'hello_world',
- 14       'version' => '3.2.1'
- 15     ),
- 16   ),
- 17   'icon' => 'ManifestExample.png',
- 18   'is_uninstallable' => true,
- 19   'published_date' => '2015-05-05',
- 20   'type' => 'module',
- 21   'remove_tables' => 'prompt',
- 22 );
- 23 $installdefs = array(
- 24   'id' => 'suitecrmfordevelopers_example_manifest',
- 25   'image_dir' => '/images/',
- 26   'copy' => array(
- 27     array(
- 28       'from' => '/modules/ExampleModule',
- 29       'to' => 'modules/ExampleModule',
- 30     ),
- 31   ),
- 32   'dashlets' => array(  
- 33     array(
- 34       'from' => '/modules/ExampleModule/Dashlets/',  
- 35       'name' => 'ExampleModuleDashlet'  
- 36     )
- 37   ),
- 38   'language' => array(
- 39     array(
- 40       'from' => 'application/language/en_us.examplemoduleadmin.php',  
- 41       'to_module' => 'application',  
- 42       'language' => 'en_us'
- 43     ),
- 44     array(    
- 45       'from' => '/modules/Accounts/language/en_us.examplemodule.php',
- 46       'to_module' => 'Accounts',
- 47       'language' => 'en_us'
- 48     ),
- 49     array(
- 50       'from' => '/application/language/es_es.examplemoduleadmin.php',  
- 51       'to_module' => 'application',
- 52       'language' => 'es_es'
- 53     ),  
- 54     array(    
- 55       'from' => '/modules/Accounts/language/es_es.examplemodule.php',  
- 56       'to_module' => 'Accounts',
- 57       'language' => 'es_es'
- 58     ),  
- 59   ),
- 60   'custom_fields' => array(  
- 61     array(
- 62       'name' => 'example_field',
- 63       'label' => 'Example Field',
- 64       'type' => 'varchar',
- 65       'max_size' =>  100,
- 66       'module' => 'Accounts',  
- 67     ),
- 68   ),
- 69   'vardefs' => array(  
- 70     array(  
- 71       'from' => 'modules/Accounts/vardefs/examplemodule_vardefs.php',  
- 72       'to_module' => 'Accounts',  
- 73     ),
- 74   ),
- 75   'beans' => array(
- 76     array(
- 77       'module' => 'ExampleModule',  
- 78       'class' => 'ExampleModule',
- 79       'path' => 'modules/ExampleModule/ExampleModule.php',  
- 80     ),
- 81   ),
- 82   'logic_hooks' => array(
- 83     array(  
- 84       'module' => 'Accounts',
- 85       'hook' => 'before_save',  
- 86       'order' => 100,  
- 87       'description'  => 'Example module before save hook',  
- 88       'file' => 'modules/ExampleModule/ExampleModuleHook.php',
- 89       'class' => 'ExampleModuleLogicHooks',
- 90       'function' => 'accounts_before_save',  
- 91     ),
- 92   ),  
- 93   'administration' => array(  
- 94     array(  
- 95       'from' => 'modules/administration/examplemodule_admin.php',  
- 96     ),
- 97   ),
- 98 );
- 99 $upgrade_manifest = array(
-100 );
-
- -
-
- - diff --git a/_source/html/chap20.xhtml b/_source/html/chap20.xhtml deleted file mode 100644 index 3124e09fd..000000000 --- a/_source/html/chap20.xhtml +++ /dev/null @@ -1,2277 +0,0 @@ - - - - -21. Appendix B - API Methods - - - -
-

-21. Appendix B - API Methods

- -

Methods

- -

login

-

Logs into SuiteCRM and returns a session id used for subsequent API calls.

- -
Arguments
- - -

login arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
user_autharrayAuthentication details for the API User
user_auth[user_name]stringThe user name of the SuiteCRM user. Required.
user_auth[password]stringThe MD5 hash of the password for user_name. Required.
application_namestringAn identifier for the application accessing the API
name_value_listname_value_listAn array of login options
name_value_list[language]stringThe language for this user
name_value_list[notifyonsave]boolSend email notifications when a new record is saved and assigned to a user
Response
- -

login response

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
idstringThe session id for this login. Required for all other API calls.
name_value_listname_value_listAn array containing information about this user.
name_value_list[user_id]stringThe id of the logged in user.
name_value_list[user_name]stringThe user_name of the logged in user
name_value_list[user_language]stringThe language setting of the logged in user
name_value_list[user_currency_id]stringThe id of the currency of the logged in user. -99 is the default currency.
name_value_list[user_currency_name]stringThe name of the currency of the logged in user.
name_value_list[user_is_admin]boolWhether the logged in user is an admin
name_value_list[user_default_team_id]stringThe default team of the logged in user. This value comes from before the fork of SuiteCRM and isn’t used.
name_value_list[user_default_dateformat]stringThe default date format of the logged in user.
name_value_list[user_default_timeformat]stringThe default time format of the logged in user
name_value_list[user_number_seperator]stringThe number separator of the logged in user. (I.e. comma for numbers in the 1,000.00 format)
name_value_list[user_decimal_seperator]stringThe decimal separator of the logged in user. (I.e. period for numbers in the 1,000.00 format)
name_value_list[mobile_max_list_entries]intMax list entries for the logged in user (simply grabs the wl_list_max_entries_per_subpanel config key)
name_value_list[mobile_max_subpanel_entries]intMax subpanel entries for the logged in user(simply grabs the wl_list_max_entries_per_subpanel config key)

logout

-

Logs the web user out of SuiteCRM and destroys the session.

- -
Arguments
- -

logout arguments

- - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
Response
-

No response.

- -

get_available_modules

-

Returns a list of the modules available for use. Also returns the ACL (Access -Control List) for each module.

- -
Arguments
- -

get_available_modules arguments

- - - - - - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
filterstringFilter the modules returned. Either ‘default’, ‘mobile’ or ‘all’.
Response
- -

get_available_modules response

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
modulesarrayAn array containing the module details.
modules[][module_key]stringThe key for this module
modules[][module_label]stringThe label for this module
modules[][favorite_enabled]boolFavorites were SugarCRM Professional functionality. This is always empty.
modules[][acls]arrayAn array containing the ACL list - that is what actions are allowed.
modules[][acls][][action]stringThe action i.e. edit, delete, list etc.
modules[][acls][][access]boolWhether or not access is allowed.

get_document_revision

-

Returns the details for a specific document revision.

- -
Arguments
- -

get_document_revision arguments

- - - - - - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
istringThe id of the document revision to retrieve
Response
- -

get_document_revision response

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
document_revisionarrayAn array containing the document revision details
document_revision[id]stringThe id of the document revision.
document_revision[document_name]stringThe name of the document revision
document_revision[revision]intThe revision number of the document revision.
document_revision[filename]stringThe filename of the file
document_revision[file]binary stringThe full contents of the file

get_entries

-

Gets a list of entries for a specific module and list of module ids. -Optionally allows returning related records.

- -
Arguments
- -

get_entries arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
module_namestringThe name of the module to display entries for.
idsarrayAn array of record ids to fetch
ids[]stringAn individual id
select_fieldsarrayAn array of fields to return. An empty array will return all fields.
select_fields[]stringThe name of a field to return
link_name_to_fields_arrayname_value_listAn array of relationships to retrieved.
link_name_to_fields_array[][name]stringThe name of the link to follow (as defined in module_name).
link_name_to_fields_array[][value]arrayAn array of the fields to return for this related module.
link_name_to_fields_array[][value][]stringThe field name
track_viewboolWhether to mark these records as recently viewed.
Response
- -

get_entries response

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
entry_listarrayAn array of records.
entry_list[]arrayDetails for an individual record.
entry_list[][id]stringThe id of this record.
entry_list[][module_name]stringThe name of the module this record belongs to.
entry_list[][name_value_list]name_value_listAn array containing each returned field.
entry_list[][name_value_list][]arrayDetails for an individual field.
entry_list[][name_value_list][][name]stringThe name of the field.
entry_list[][name_value_list][][value]stringThe value of the field.
relationship_listarrayAn array of arrays containing the relationships for the corresponding record.
relationship_list[]arrayThe relationships for the corresponding record.
relationship_list[link_list]arrayThe list of relationships for this record.
relationship_list[link_list][]arrayDetails of a single relationship.
relationship_list[link_list][][name]stringThe name of this relationship.
relationship_list[link_list][][records]arrayThe related records for this relationship.
relationship_list[link_list][][records][]arrayDetails of a single related record.
relationship_list[link_list][][records][][link_value]name_value_listAn array of the requested fields for this relationship.
relationship_list[link_list][][records][][link_value][]arrayA name value pair for this particular field.
relationship_list[link_list][][records][][link_value][name]stringThe name of the field.
relationship_list[link_list][][records][][link_value][value]stringThe value of the field.

get_entries_count

-

Returns a count of entries matching the given query.

- -
Arguments
- -

get_entries_count arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
module_namestringThe name of the module to display entries for.
querystringAn SQL WHERE clause to apply to the query.
deletedboolWhether to include deleted records
Response
- - -

get_entries_count response

- - - - - - - - - - - - - - -
NameTypeDesc
result_countintThe count of matching entries.

get_entry

-

Returns the details for a single record. Optionally allows returning related records.

- -
Arguments
- - -

get_entry arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
module_namestringThe name of the module to fetch the entry for.
idstringThe id of the record to fetch
select_fieldsarrayAn array of fields to return. An empty array will return all fields.
select_fields[]stringThe name of a field to return
link_name_to_fields_arrayname_value_listAn array of relationships to retrieved.
link_name_to_fields_array[][name]stringThe name of the link to follow (as defined in module_name).
link_name_to_fields_array[][value]arrayAn array of the fields to return for this related module.
link_name_to_fields_array[][value][]stringThe field name
track_viewboolWhether to mark these records as recently viewed.
Response
-

Identical to the response by get_entries except only one record will be returned.

- -

- get_entry_list -

- -
Arguments
- - -

get_entry_list arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
module_namestringThe name of the module to fetch the entry for.
querystringAn SQL WHERE clause to apply to the query.
order_bystringIn theory for ordering results but this is unused.
offsetintThe result offset. Useful for pagination.
select_fieldsarrayAn array of fields to return. An empty array will return all fields.
select_fields[]stringThe name of a field to return
link_name_to_fields_arrayname_value_listAn array of relationships to retrieved.
link_name_to_fields_array[][name]stringThe name of the link to follow (as defined in module_name).
link_name_to_fields_array[][value]arrayAn array of the fields to return for this related module.
link_name_to_fields_array[][value][]stringThe field name
max_resultsintThe maximum number of results to return. Useful for pagination.
deletedboolWhether to include deleted records.
favoritesboolFavorites were SugarCRM Professional functionality. This is unused.
Response
- - -

get_entry_list response

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
result_countintThe number of returned records.
total_countintThe total number of records matching the query.
next_offsetintThe offset of the next set of records.
entry_listarrayAn array of records.
entry_list[]arrayDetails for an individual record.
entry_list[][id]stringThe id of this record.
entry_list[][module_name]stringThe name of the module this record belongs to.
entry_list[][name_value_list]name_value_listAn array containing each returned field.
entry_list[][name_value_list][]arrayDetails for an individual field.
entry_list[][name_value_list][][name]stringThe name of the field.
entry_list[][name_value_list][][value]stringThe value of the field.
relationship_listarrayAn array of arrays containing the relationships for the corresponding record.
relationship_list[]arrayThe relationships for the corresponding record.
relationship_list[link_list]arrayThe list of relationships for this record.
relationship_list[link_list][]arrayDetails of a single relationship.
relationship_list[link_list][][name]stringThe name of this relationship.
relationship_list[link_list][][records]arrayThe related records for this relationship.
relationship_list[link_list][][records][]arrayDetails of a single related record.
relationship_list[link_list][][records][][link_value]name_value_listAn array of the requested fields for this relationship.
relationship_list[link_list][][records][][link_value][]arrayA name value pair for this particular field.
relationship_list[link_list][][records][][link_value][name]stringThe name of the field.
relationship_list[link_list][][records][][link_value][value]stringThe value of the field.

get_language_definition

-

Returns

- -
Arguments
- - -

get_language_definition arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
modulesarrayAn array of the modules to return language labels for
modules[]stringThe modules name.
md5boolWhether to return the md5 for each module. Can be useful for caching responses.
Response
- -

get_language_definition response

- - - - - - - - - - - - - - -
NameTypeDesc
result[<modulename>]</modulename>string/arrayAn array of the labels or an md5 string for <modulename />

- get_last_viewed -

-

Returns a list of the most recently viewed modules for the current user.

- -
Arguments
- -

get_last_viewed arguments

- - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
module_namesarrayAn array of the modules to return the last viewed records for.
module_names[]stringThe modules name.
Response
- - -

get_last_viewed response

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
result[]arrayAn array of the details of recently viewed records
result[][id]intThe id of the tracker row for this viewing
result[][item_id]stringThe id of the viewed record.
result[][item_summary]stringThe summary of the record. This is usually it’s name.
result[][module_name]stringThe module for this record.
result[][monitor_id]stringThe monitor id for this viewing. Legacy and unused.
result[][date_modified]stringThe date that this record was viewed.

- get_modified_relationships -

-

Returns a list of the modified relationships for the current user between one -of the Calls, Meetings or Contacts modules.

- -
Arguments
- - -

get_modified_relationships arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
module_namestringThe name of the module to retrieve relationships for. Always Users.
related_modulestringThe related module to retrieve records for. One of Meetings, Calls or Contacts.
from_datestringThe start date of the range to search. In the format Y-m-d H:i:s.
to_datestringThe end date of the range to search. In the format Y-m-d H:i:s.
offsetintThe record offset to start with.
max_resultsintThe maximum number of results to return.
deletedboolWhether to include deleted records.
module_user_idstringIn theory the id of the user to return relationships for. However the current user is always used.
select_fieldsarrayAn array of the fields to return for the relationship record. An empty array will return all fields.
select_fields[]stringThe name of the field to return.
relationship_namestringThe name of the relationship between module_name and related_module.
deletion_datestringA start date for the range in which to return deleted records. In the format Y-m-d H:i:s.
Response
- - -

get_modified_relationships response

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
result_countintThe number of returned records.
next_offsetintThe offset of the next set of records.
entry_listarrayAn array of the returned records.
entry_list[]arrayDetails for an individual record.
entry_list[][id]stringThe id of this record.
entry_list[][module_name]stringThe name of the module this record belongs to.
entry_list[][name_value_list]name_value_listAn array containing each returned field.
entry_list[][name_value_list][]arrayA name value pair of the field information.
entry_list[][name_value_list][][name]stringThe name of the field.
entry_list[][name_value_list][][value]stringThe value of the field.
errorarrayAn array containing the error details.
error[number]intThe error number of the error that occurred.
error[name]stringThe name of the error that occurred.
error[description]stringA description of the error that occurred.

- get_module_fields -

-

Returns the field definitions for a given module.

- -
Arguments
- - -

get_module_fields arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
module_namestringThe name of the module to return field definitions for.
fieldsarrayAn array of fields to return definitions for. An empty array will return all fields.
fields[]stringThe name of the field.
Response
- - -

get_module_fields response

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
module_namestringThe name of the module.
table_namestringThe name of the database table for this module.
module_fieldsarrayAn array of the requested fields for this module.
module_fields[]arrayThe details of a specific field.
module_fields[name]stringThe name of the field.
module_fields[type]stringThe type of the field.
module_fields[group]stringThe group of fields that this field belongs to. Used for addresses or link definitions.
module_fields[id_name]stringThe name of the id field on this module for this link if appropriate.
module_fields[label]stringThe display label for this field.
module_fields[required]boolWhether this field is required or not.
module_fields[options]name_value_listAn array of possible options for this field. An empty array if options are not appropriate for this field type.
module_fields[options][]arrayA name value pair of a single option.
module_fields[options][][name]stringThe options key.
module_fields[options][][value]stringThe options display value.
module_fields[related_module]stringThe related module for this field if it is a related type. Empty otherwise.
module_fields[calculated]stringCalculated fields were a SugarCRM professional feature. Will be empty.
module_fields[len]intThe length of this field or an empty string if this is not appropriate for this field type.
link_fieldsarrayAn array of the requested link fields for this module.
link_fields[]arrayThe details of a specific field.
link_fields[name]stringThe name of the field.
link_fields[type]stringThe type of the field. Will always be link.
link_fields[group]stringThe group of fields that this field belongs to. Will be empty for links.
link_fields[id_name]stringThe name of the id field on this module for this link if appropriate.
link_fields[relationship]stringThe relationship name for this link.
link_fields[module]stringThe module this field links to.
link_fields[bean_name]stringThe bean that this field links to.

- get_module_fields_md5 -

-

Returns an md5 of the a modules field definitions. Useful for caching.

- -
Arguments
- -

get_module_fields_md5 arguments

- - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
module_namesarrayAn array of modules to return the md5 for.
module_names[]stringThe name of the module to return the field definitions md5 for.
Response
- - -

get_module_fields_md5 response

- - - - - - - - - - - - - - - - - - -
NameTypeDesc
result[]arrayAn array of the md5’s keyed by the module name.
result[<modulename>]</modulename>stringThe md5 string for <modulename />

- get_module_layout -

-

Returns the layout for specified modules and views. Optionally returns an md5 -of the layouts.

- -
Arguments
- - -

get_module_layout arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
modulesarrayAn array of the modules to return layouts for.
modules[]stringThe name of the module.
typesarrayAn array of the types of views to return. Only default is supported.
types[]stringThe type of the views.
viewsarrayAn array of the views to return. One of edit, detail, list and subpanel.
views[]stringThe name of the view.
acl_checkboolWhether or not to check that the current user has access to this module and view.
md5boolWhether or not to return the view as an md5 string. Useful for caching.
Response
- - -

get_module_layout response

- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
resultarrayThe array of results keyed by module name.
result[<modulename>]</modulename>arrayAn array of layouts for <modulename>.</modulename>
result[<modulename>][default]</modulename>arrayAn array of the layouts keyed by the view name.
result[<modulename>][default][<viewname>]</viewname></modulename>array/stringThe layout of the view <viewname> for the module <modulename> or an md5 of the layout. See the section on metadata for the layout format.</modulename></viewname>

- get_module_layout_md5 -

-

Returns the md5 of the specified views for the specified modules. Behaves identically -to get_module_layout with the md5 parameter set to true.

- -
Arguments
- -

get_module_layout arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
modulesarrayAn array of the modules to return layouts for.
modules[]stringThe name of the module.
typesarrayAn array of the types of views to return. Only default is supported.
types[]stringThe type of the views.
viewsarrayAn array of the views to return. One of edit, detail, list and subpanel.
views[]stringThe name of the view.
acl_checkboolWhether or not to check that the current user has access to this module and view.
Response
- -

get_module_layout_md5 response

- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
md5arrayThe array of results keyed by module name.
md5[<modulename>]</modulename>arrayAn array of layouts for <modulename>.</modulename>
md5[<modulename>][default]</modulename>arrayAn array of the layouts keyed by the view name.
md5[<modulename>][default][<viewname>]</viewname></modulename>stringThe md5 of the layout layout of the view <viewname> for the module <modulename>.</modulename></viewname>

- get_relationships -

-

Returns related records given a specific module, record and list of links. -####Arguments

- - -

get_relationships arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc 
sessionstringThe session id. See login. 
module_namestringThe module to return relationships for. 
module_idstringThe record to return relationships for. 
link_field_namestringThe link field to follow for this record. 
related_module_querystringA WHERE clause to use to filter the related modules by. 
related_fieldsarrayAn array of the fields to return for matching records. 
related_fields[]stringThe name of the field. 
related_module_link_name_to_fields_arrayname_value_listAn array of related fields to return for matching records. 
related_module_link_name_to_fields_array[]arrayDetails for a specific link. 
related_module_link_name_to_fields_array[][name]stringThe name of the link to follow for matching records. 
related_module_link_name_to_fields_array[][value]arrayAn array of fields to return for this link. 
related_module_link_name_to_fields_array[][value][]stringThe field name. 
deletedboolWhether to include deleted records. 
order_bystringIn theory for ordering results but this is unused. 
offsetintThe record offset to start with. 
limitintThe maximum number of results to return. 
Response
-

Identical to the response by get_entries.

- -

- get_server_info -

-

Returns information about the SuiteCRM server. Currently still returns information -about the SugarCRM flavor and versions.

- -
Arguments
-

No arguments.

- -
Response
- - -

get_server_info response

- - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
flavorstringThe SugarCRM flavor. For SuiteCRM will always be ‘CE’.
versionstringThe SugarCRM version. Note this this is distinct from the SuiteCRM version
gmt_timestringThe server time in UTC.

- get_upcoming_activities -

-

Returns a list of the 10 upcoming activities (Meetings, Calls and Tasks - also includes -Opportunities) for the currently logged in user.

- -
Arguments
- - -

get_upcoming_activities arguments

- - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
Response
- - -

get_upcoming_activities response

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
resultarrayAn array of the upcoming activities.
result[]arrayThe details of a single activity.
result[][id]stringThe id of this activity.
result[][module]stringThe module for this activity.
result[][date_due]stringThe due date for this activity.
result[][summary]stringThe summary of this activity. Usually simply it’s name.

- get_user_id -

-

Returns the id of the currently logged in user.

- -
Arguments
- - -

get_user_id arguments

- - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
Response
- - -

get_user_id response

- - - - - - - - - - - - - - -
NameTypeDesc
idstringThe id of the current user.

- seamless_login -

-

Marks a session as allowing a seamless login. If successful then the session id -(see the login call) can be used in a URL (as MSID) to log the user into SuiteCRM in -the browser seamlessly. For example if you have the session id 1234 then accessing -the URL example.com/index.php?MSID=1234. The MSID parameter can be used in any valid SuiteCRM -URL.

- -
Arguments
- - -

seamless_login arguments

- - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
Response
- -

seamless_login response

- - - - - - - - - - - - - - -
NameTypeDesc
resultboolBoolean indicating success

- search_by_module -

-

Allows searching for records that contain a specific search string.

- -
Arguments
- - -

search_by_module arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
search_stringstringThe string to search for.
modulesarrayAn array of the modules to include in the search.
modules[]stringThe modules name.
offsetintThe result offset. Useful for pagination.
max_resultsintThe maximum number of results to return. Useful for pagination.
assigned_user_idstringFilter by the given assigned user. Leave blank to do no user filtering.
select_fieldsarrayAn array of the fields to return for the found records. An empty array will return all fields.
select_fields[]stringThe name of the field to return.
unified_search_onlyboolWhether to only return records for modules that participate in the global search.
favoritesboolFavorites were SugarCRM Professional functionality. This is unused.
Response
- - -

search_by_module response

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
entry_listarrayAn array of the results for each module.
entry_list[]arrayResults for a specific module.
entry_list[][name]stringThe name of the module that this entry contains results for.
entry_list[][records]arrayAn array of the record results.
entry_list[][records][]name_value_listA name value list of records id and name.
entry_list[][records][][id]arrayA name value pair containing the id of this record.
entry_list[][records][][name]arrayA name value pair containing the name of this record.

- set_document_revision -

-

Creates a new document revision for a document.

- -
Arguments
- - -

set_document_revision arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
notearrayAn array containing the document revision details.
note[id]stringThe id of the document to add this revision to.
note[file]binary stringThe binary contents of the file, base 64 encoded.
note[filename]stringThe name of the file.
note[revision]intThe revision number for this revision.
Response
- - -

set_document_revision response

- - - - - - - - - - - - - - -
NameTypeDesc
idstringThe id of the newly created document revision.

- set_entries -

-

Creates or updates a list of records.

- -
Arguments
- -

Note: Supplying a value for the id field will perform an update for that record.

- - -

set_entries arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
module_namestringThe name of the module to create/update records for.
name_value_listsname_value_listAn array of the details for each record to create/update.
name_value_lists[]arrayDetails of an individual record.
name_value_lists[][]arrayA name value pair for each field value.
name_value_lists[][][name]arrayThe name of the field.
name_value_lists[][][value]arrayThe value for the field.
Response
- - -

set_entries response

- - - - - - - - - - - - - - - - - - -
NameTypeDesc
idsarrayAn array of the resulting ids. Returned in the same order as specified in the call to set_entries.
ids[]arrayThe id for this record.

- set_entry -

-

Creates or updates a single record.

- -
Arguments
- -

Note: Supplying a value for the id field will perform an update for that record.

- - -

set_entries arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
module_namestringThe name of the module to create/update a record for.
name_value_listname_value_listAn array of the fields for the new/updated record.
name_value_lists[]arrayA name value pair for each field value.
name_value_lists[][name]arrayThe name of the field.
name_value_lists[][value]arrayThe value for the field.
Response
- - -

set_entries response

- - - - - - - - - - - - - - -
NameTypeDesc
idstringThe id of the newly created or updated record.

- get_note_attachment -

-

Returns the details of a given note attachment.

- -
Arguments
- - -

get_note_attachment arguments

- - - - - - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
idstringThe id of the note to retrieve information for.
Response
- - -

get_note_attachment response

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
note_attachmentarrayThe details for the note attachment.
note_attachment[id]stringThe id of the note to retrieve information for.
note_attachment[filename]stringThe filename of the file
note_attachment[file]binary stringThe full contents of the file
note_attachment[related_module_id]stringThe id of the record that this attachment is related to.
note_attachment[related_module_name]stringThe module of the record that this attachment is related to.

- set_note_attachment -

-

Creates a not attachment for a specified record.

- -
Arguments
- - -

set_note_attachment arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
notearrayThe details for the note attachment.
note[id]stringThe id of the note to add an attachment for.
note[filename]stringThe filename of the file
note[file]binary stringThe full contents of the file base 64 encoded.
Response
- - -

set_entries response

- - - - - - - - - - - - - - -
NameTypeDesc
idstringThe id of the note for this attachment.

- set_relationship -

-

Sets a relationship between a record and other records.

- -
Arguments
- - -

set_relationship arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
sessionstringThe session id. See login.
module_namestringThe name of the module to relate records to.
module_idstringThe id of the record to relate records to.
link_field_namestringThe name of the link field on the module through which records will be related.
related_idsarrayAn array of record ids to relate.
related_ids[]stringThe id of a record to relate.
name_value_listname_value_listA name value list of additional relationship fields to set.
name_value_list[]arrayA name value pair for a relationship field to set.
name_value_list[][name]stringThe name of the field to set.
name_value_list[][value]stringThe value of the field to set.
deleteboolWhether or not to delete the specified relationship instead of creating/updating it.
Response
- - -

set_relationship response

- - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
createdintThe number of relationships created.
failedintThe number of relationships that failed to be created/deleted.
deletedintThe number of relationships deleted.

- set_relationships -

-

Sets relationships between multiple records.

- -
Arguments
- - -

set_relationships arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc 
sessionstringThe session id. See login. 
module_namesarrayAn array of modules to relate records to. 
module_names[]stringThe name of the module to relate records to. 
module_idsarrayAn array of the ids of records to relate records to. 
module_ids[]stringThe id of the record to relate records to. 
link_field_namesstringAn array of the link names through which records will be related. 
link_field_names[]stringThe name of the link field on the module through which records will be related. 
related_idsarrayAn array of an array of record ids for each module specified. 
related_ids[]arrayAn array of record ids for the corresponding module. 
related_ids[][]stringThe record id. 
name_value_listsarrayAn array of an array of name value list of additional relationship fields to set. 
name_value_lists[]name_value_listAn array of name value pairs for the relationship fields of the corresponding module. 
name_value_lists[][name]stringThe name of the field to set. 
name_value_lists[][value]stringThe value of the field to set. 
delete_arrayarrayAn array of booleans indicating whether or not the relationship should be deleted for each module. 
delete_array[]boolWhether or not to delete the specified relationship instead of creating/updating it. 
Response
- -

set_relationships response

- - - - - - - - - - - - - - - - - - - - - - -
NameTypeDesc
createdintThe number of relationships created.
failedintThe number of relationships that failed to be created/deleted.
deletedintThe number of relationships deleted.
-
- - diff --git a/_source/html/images/CreateMeetingsScheduler.png b/_source/html/images/CreateMeetingsScheduler.png deleted file mode 100644 index d193f9dc1..000000000 Binary files a/_source/html/images/CreateMeetingsScheduler.png and /dev/null differ diff --git a/_source/html/images/leanpub-logo.png b/_source/html/images/leanpub-logo.png deleted file mode 100644 index 9f06aa63d..000000000 Binary files a/_source/html/images/leanpub-logo.png and /dev/null differ diff --git a/_source/html/images/leanpub_info-circle.png b/_source/html/images/leanpub_info-circle.png deleted file mode 100644 index 34f05271d..000000000 Binary files a/_source/html/images/leanpub_info-circle.png and /dev/null differ diff --git a/_source/html/images/leanpub_warning.png b/_source/html/images/leanpub_warning.png deleted file mode 100644 index 327f154cc..000000000 Binary files a/_source/html/images/leanpub_warning.png and /dev/null differ diff --git a/_source/html/images/title_page.jpg b/_source/html/images/title_page.jpg deleted file mode 100644 index e91d7b598..000000000 Binary files a/_source/html/images/title_page.jpg and /dev/null differ diff --git a/_source/html/metadata.yaml b/_source/html/metadata.yaml deleted file mode 100644 index 3a13e3656..000000000 --- a/_source/html/metadata.yaml +++ /dev/null @@ -1,4 +0,0 @@ ---- -weight: 1 -title: "PPPP" ---- diff --git a/_source/html/title_page.xhtml b/_source/html/title_page.xhtml deleted file mode 100644 index 02f064fdb..000000000 --- a/_source/html/title_page.xhtml +++ /dev/null @@ -1,13 +0,0 @@ - - - - -Title Page - - - -
-SuiteCRM for Developers -
- - diff --git a/_source/html/toc.xhtml b/_source/html/toc.xhtml deleted file mode 100644 index 2c03d78be..000000000 --- a/_source/html/toc.xhtml +++ /dev/null @@ -1,331 +0,0 @@ - - - - -Table of Contents - - - -
- -

Table of Contents

- - - -
- - diff --git a/_source/html/verso_page.xhtml b/_source/html/verso_page.xhtml deleted file mode 100644 index 6b63e9fc2..000000000 --- a/_source/html/verso_page.xhtml +++ /dev/null @@ -1,27 +0,0 @@ - - - - -Verso Page - - - -

SuiteCRM for Developers

- -

Getting started with developing for SuiteCRM

-

 

- -

Jim Mackin

-

 

-

This book is for sale at http://leanpub.com/suitecrmfordevelopers

-

This version was published on 2015-05-22

-

-

*   *   *   *   *

-

This is a Leanpub book. Leanpub empowers authors and publishers with the Lean Publishing process. Lean Publishing is the act of publishing an in-progress ebook using lightweight tools and many iterations to get reader feedback, pivot until you have the right book and build traction once you do.

-

*   *   *   *   *

- -

-
© 2015 Jim Mackin
- - - diff --git a/_source/output/chap00.md b/_source/output/chap00.md deleted file mode 100644 index 203cac268..000000000 --- a/_source/output/chap00.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -layout: page -title: "Chapter 00" ---- - - -
- -[for Developers](SuiteCRM)(File:images/title_page.jpg) - -
- - -## SuiteCRM for Developers ## - -### Getting started with developing for SuiteCRM ### - -  - -#### Jim Mackin #### - -  - -This book is for sale at http://leanpub.com/suitecrmfordevelopers - -This version was published on 2015-05-22 - -[logo](publisher's)(File:images/leanpub-logo.png) - -*   *   *   *   * - -This is a [Leanpub](http://leanpub.com) book. Leanpub empowers authors and publishers with the Lean Publishing process. [Lean Publishing](http://leanpub.com/manifesto) is the act of publishing an in-progress ebook using lightweight tools and many iterations to get reader feedback, pivot until you have the right book and build traction once you do. - -*   *   *   *   * - - - -
- -© 2015 Jim Mackin - -
- - -
- -## Table of Contents ## - -* [class="section-number">1. Introduction](2. SuiteCRM Directory Structure](3. Working with Beans](4. Vardefs](5. Views](6. Metadata](7. Controllers](8. Entry Points](9. Language Strings](10. Config](11. Logging](12. Logic Hooks](13. Scheduled Tasks](14. Extension Framework](15. Module Installer](16. API](17. Best Practices](18. Performance Tweaks](19. Further Resources](20. Appendix A - Code Examples](21. Appendix B - API Methods]( diff --git a/_source/output/chap01.md b/_source/output/chap01.md deleted file mode 100644 index 1daa21860..000000000 --- a/_source/output/chap01.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -layout: page -title: "Chapter 01" ---- - - -
- -## 1. Introduction ## - -### What is SuiteCRM ### - -The story of [SuiteCRM](https://www.suitecrm.com) starts with SugarCRM. SugarCRM was founded in 2004 and consisted of an open source version (called Community Edition) and various paid for versions. However trouble started brewing when it appeared that SugarCRM would not be releasing a Community Edition of SugarCRM 7 and would be providing limited, if any, updates to the Community Edition. - -Enter SuiteCRM. SalesAgility forked Community Edition to create SuiteCRM and also added various open source plugins to add improved functionality. - -### This book ### - -This book is intended for developers who are familiar (or at least acquainted) with using SuiteCRM but want to perform their own customisations. SuiteCRM is a large and mature piece of software so it is impractical for a book to cover all aspects of the software. I’ve tried to add the most important parts which should allow you to make the changes you need in 99% of situations. There is a further resources chapter at the end of this book to help out in those 1% of cases. With that being said if you feel there is anything important I have left out (or worse, anything incorrect in the book) please let me know. I can be contacted at [JSMackin.co.uk](http://www.jsmackin.co.uk). - -### Reading this book ### - -Each chapter in this book is intended to be self contained so the reader can jump to interesting chapters. Where there is some overlap this is usually indicated with links to the relevant chapters. - -Some parts of this book may refer to file paths or other parts of code that can have a variable value, for example controller names contain the module name or a file with an arbitrary name. In this case these will be marked in the form <TheModuleName>, <TheFileName> or something else suitable. In these cases you can substitute something appropriate (such as Accounts or MyNewFile). - -### Setting up SuiteCRM ### - -In this book we’ll be using SuiteCRM v7.1.5 which is the latest at time of writing. For up to date versions of the installation instructions see the SuiteCRM wiki at [suitecrm.com/wiki/index.php/Installation](https://suitecrm.com/wiki/index.php/Installation). - -#### Website #### - -The SuiteCRM installer can be found at [SuiteCRM.com](https://suitecrm.com/). I would recommend SuiteCRM MAX as I prefer to start with a full interface and customise it as needed. - -#### GitHub #### - -SuiteCRM is also available on [GitHub](http://github.com) at [github.com/salesagility/SuiteCRM](https://github.com/salesagility/SuiteCRM). Each SuiteCRM version is tagged so you can easily grab the version you need. - -### Initial Tweaks ### - -After the initial install there are a few tweaks you may want to make on an instance you are developing on. These changes should improve your development flow and productivity as well as help identify issues if they occur. - -#### Developer Mode #### - -SuiteCRM will cache various files that it processes, such as Smarty templates. Developer mode will turn off some of the caching so that changes to files will be seen immediately (though this isn’t always the case - as is the case with [extensions](#chap13.xhtml#extensions-chapter)). This can be enabled either through the config file or via the General settings page inside admin. - -#### Log Level #### - -The default log level of SuiteCRM is fatal. This is a good default for production instances but you may want to increase the log level to info or debug. This will make the log output more verbose so, should anything go wrong, you’ll have something to refer to. See the [on logging](chapter)(#chap10.xhtml#logging-chapter) for more information. - -#### Display errors #### - -You’ll also want to turn off display errors. Unfortunately at the moment SuiteCRM has various notices and warnings out of the box. With display_errors on this can sometimes cause AJAX pages and the link to break. - -With this being said you should be checking the PHP error logs or selectively enabling
-display_errors to ensure that the code you are creating is not creating additional notices, warnings or errors. - -#### XDebug #### - -[XDebug](http://xdebug.org) is a PHP extension which provides profiling and debugging capabilities to PHP. This can massively improve developer productivity by simplifying development and, particularly, tracking down any issues. See the XDebug site for information on XDebug. - - -
diff --git a/_source/output/chap02.md b/_source/output/chap02.md deleted file mode 100644 index 6bb2d55f4..000000000 --- a/_source/output/chap02.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -layout: page -title: "Chapter 02" ---- - - -
- -## 2. SuiteCRM Directory Structure ## - -; cache -: Contains cache files used by SuiteCRM including compiled smarty templates, grouped vardefs, minified and grouped JavaScript. Some modules and custom modules may also store (temporary) module specific info here. -; custom -: Contains user and developer customisations to SuiteCRM. Also contains some SuiteCRM code to maintain compatibility with SugarCRM. However this is likely to change in the future. -; data -: Stores the classes and files used to deal with SugarBeans and their relationships. -; examples -: Contains a few basic examples of lead capture and API usage. However these are very outdated. -; include -: Contains the bulk of non module and non data SuiteCRM code. -; install -: Code used by the SuiteCRM installer. -; jssource -: The jssource folder contains the unminified source of some of the JavaScript files used within SuiteCRM. -; metadata -: Stores relationship metadata for the various stock SuiteCRM modules. This should not be confused with module metadata which contains information on view, dashlet and search definitions. -; mobile -: Stores code for the [QuickCRM](http://www.quickcrm.fr) mobile app. -; ModuleInstall -: Code for the module installer. -; modules -: Contains the code for any stock or custom SuiteCRM modules. -; service -: Code for the SuiteCRM Soap and REST APIs. -; themes -: Code, data and images for the bundled SuiteCRM theme. -; upload -: The upload folder contains documents that have been uploaded to SuiteCRM. The names of the files comes from the ID of the matching Document Revision/Note. upload/upgrades will also contain various upgrade files and the packages of installed modules. -; log4php, soap, XTemplate, Zend -: Source code for various libraries used by SuiteCRM some of which are deprecated. - - -
diff --git a/_source/output/chap03.md b/_source/output/chap03.md deleted file mode 100644 index 5616d7303..000000000 --- a/_source/output/chap03.md +++ /dev/null @@ -1,600 +0,0 @@ ---- -layout: page -title: "Chapter 03" ---- - - -
- -## 3. Working with Beans ## - -Beans are the Model in SuiteCRM’s MVC (Model View Controller) architecture. They allow retrieving data from the database as objects and allow persisting and editing records. This section will go over the various ways of working with beans. - -### BeanFactory ### - -The BeanFactory allows dynamically loading bean instances or creating new records. For example to create a new bean you can use: - -
- -Example 3.1: Creating a new Bean using the BeanFactory - - ------ - -
- -
1 $bean = BeanFactory::newBean('<TheModule>');
-2 //For example a new account bean:
-3 $accountBean = BeanFactory::newBean('Accounts');
- -
- ------ - - -
-Retrieving an existing bean can be achieved in a similar manner: - -
- -Example 3.2: Retrieving a bean with the BeanFactory - - ------ - -
- -
1 $bean = BeanFactory::getBean('<TheModule>', $beanId);
-2 //For example to retrieve an account id
-3 $bean = BeanFactory::getBean('Accounts', $beanId);
- -
- ------ - - -
-getBean will return an unpopulated bean object if $beanId is not supplied or if there’s no such record. Retrieving an unpopulated bean can be useful if you wish to use the static methods of the bean (for example see the Searching for Beans section). To deliberately retrieve an unpopulated bean you can omit the second argument of the getBean call. I.e. - -
- -Example 3.3: Retrieving an unpopulated bean - - ------ - -
- -
1 $bean = BeanFactory::getBean('<TheModule>');
- -
- ------ - - -
-{| -|width="50%"| [50px|class=sidebar-image|warning](File:images/leanpub_warning.png) -|width="50%"| BeanFactory::getBean caches ten results. This can cause odd behaviour if you call getBean again and get a cached copy. Any calls that return a cached copy will return the same instance. This means changes to one of the beans will be reflected in all the results. -|} - -Using BeanFactory ensures that the bean is correctly set up and the necessary files are included etc. - -### SugarBean ### - -The SugarBean is the parent bean class and all beans in SuiteCRM extend this class. It provides various ways of retrieving and interacting with records. - -### Searching for beans ### - -The following examples show how to search for beans using a bean class. The examples provided assume that an account bean is available names $accountBean. This may have been retrieved using the getBean call mentioned in the BeanFactory section e.g. - -
- -Example 3.4: Retrieving an unpopulated account bean - - ------ - -
- -
$accountBean = BeanFactory::getBean('Accounts');
- -
- ------ - - -
-#### get_list #### - -The get_list method allows getting a list of matching beans and allows paginating the results. - -
- -Example 3.5: get_list method signature - - ------ - -
- -
1 get_list(
-2     $order_by = "",
-3     $where = "",
-4     $row_offset = 0,
-5     $limit=-1,
-6     $max=-1,
-7     $show_deleted = 0)
- -
- ------ - - -
-; $order_by -: Controls the ordering of the returned list. $order_by is specified as a string that will be used in the SQL ORDER BY clause e.g. to sort by name you can simply pass name, to sort by date_entered descending use date_entered DESC. You can also sort by multiple fields. For example sorting by date_modified and id descending date_modified, id DESC. -; $where -: Allows filtering the results using an SQL WHERE clause. $where should be a string containing the SQL conditions. For example in the contacts module searching for contacts with specific first names we might use contacts.first_name='Jim'. Note that we specify the table, the query may end up joining onto other tables so we want to ensure that there is no ambiguity in which field we target. -; $row_offset -: The row to start from. Can be used to paginate the results. -; $limit -: The maximum number of records to be returned by the query. -1 means no limit. -; $max -: The maximum number of entries to be returned per page. -1 means the default max (usually 20). -; $show_deleted -: Whether to include deleted results. - -##### Results ##### - -get_list will return an array. This will contain the paging information and will also contain the list of beans. This array will contain the following keys: - -; list -: An array of the beans returned by the list query -; row_count -: The total number of rows in the result -; next_offset -: The offset to be used for the next page or -1 if there are no further pages. -; previous_offset -: The offset to be used for the previous page or -1 if this is the first page. -; current_offset -: The offset used for the current results. - -##### Example ##### - -Let’s look at a concrete example. We will return the third page of all accounts with the industry Media using 10 as a page size and ordered by name. - -
- -Example 3.6: Example get_list call - - ------ - -
- -
 1 $beanList = $accountBean->get_list(
- 2                                 //Order by the accounts name
- 3                                 'name',
- 4                                 //Only accounts with industry 'Media'
- 5                                 "accounts.industry = 'Media'",
- 6                                 //Start with the 30th record (third page)
- 7                                 30,
- 8                                 //No limit - will default to max page size
- 9                                 -1,
-10                                 //10 items per page
-11                                 10);
- -
- ------ - - -
-This will return: - -
- -Example 3.7: Example get_list results - - ------ - -
- -
 1 Array
- 2 (
- 3     //Snipped for brevity - the list of Account SugarBeans
- 4     [list] => Array()
- 5     //The total number of results
- 6     [row_count] => 36
- 7     //This is the last page so the next offset is -1
- 8     [next_offset] => -1
- 9     //Previous page offset
-10     [previous_offset] => 20
-11     //The offset used for these results
-12     [current_offset] => 30
-13 )
- -
- ------ - - -
-#### get_full_list #### - -get_list is useful when you need paginated results. However if you are just interested in getting a list of all matching beans you can use get_full_list. The get_full_list method signature looks like this: - -
- -Example 3.8: get_full_list method signature - - ------ - -
- -
1 get_full_list(
-2             $order_by = "",
-3             $where = "",
-4             $check_dates=false,
-5             $show_deleted = 0
- -
- ------ - - -
-These arguments are identical to their usage in get_list the only difference is the $check_dates argument. This is used to indicate whether the date fields should be converted to their display values (i.e. converted to the users date format). - -##### Results ##### - -The get_full_list call simply returns an array of the matching beans - -##### Example ##### - -Let’s rework our get_list example to get the full list of matching accounts: - -
- -Example 3.9: Example get_full_list call - - ------ - -
- -
1 $beanList = $accountBean->get_full_list(
-2                                 //Order by the accounts name
-3                                 'name',
-4                                 //Only accounts with industry 'Media'
-5                                 "accounts.industry = 'Media'"
-6                                 );
- -
- ------ - - -
-#### retrieve_by_string_fields #### - -Sometimes you only want to retrieve one row but may not have the id of the record. retrieve_by_string_fields allows retrieving a single record based on matching string fields. - -
- -Example 3.10: retrieve_by_string_fields method signature - - ------ - -
- -
1 retrieve_by_string_fields(
-2                           $fields_array,
-3                           $encode=true,
-4                           $deleted=true)
- -
- ------ - - -
-; $fields_array -: An array of field names to the desired value. -; $encode -: Whether or not the results should be HTML encoded. -; $deleted -: Whether or not to add the deleted filter. - -{| -|width="50%"| [50px|class=sidebar-image|warning](File:images/leanpub_warning.png) -|width="50%"| Note here that, confusingly, the deleted flag works differently to the other methods we have looked at. It flags whether or not we should filter out deleted results. So if true is passed then the deleted results will ''not'' be included. -|} - -##### Results ##### - -retrieve_by_string_fields returns a single bean as it’s result or null if there was no matching bean. - -##### Example ##### - -For example to retrieve the account with name Tortoise Corp and account_type Customer we could use the following: - -
- -Example 3.11: Example retrieve_by_string_fields call - - ------ - -
- -
1 $beanList = $accountBean->retrieve_by_string_fields(
-2                                 array(
-3                                   'name' => 'Tortoise Corp',
-4                                   'account_type' => 'Customer'
-5                                 )
-6                               );
- -
- ------ - - -
-### Accessing fields ### - -If you have used one of the above methods we now have a bean record. This bean represents the record that we have retrieved. We can access the fields of that record by simply accessing properties on the bean just like any other PHP object. Similarly we can use property access to set the values of beans. Some examples are as follows: - -
- -Example 3.12: Accessing fields examples - - ------ - -
- -
 1 //Get the Name field on account bean
- 2 $accountBean->name;
- 3 
- 4 //Get the Meeting start date
- 5 $meetingBean->date_start;
- 6 
- 7 //Get a custom field on a case
- 8 $caseBean->third_party_code_c;
- 9 
-10 //Set the name of a case
-11 $caseBean->name = 'New Case name';
-12 
-13 //Set the billing address post code of an account
-14 $accountBean->billing_address_postalcode = '12345';
- -
- ------ - - -
-When changes are made to a bean instance they are not immediately persisted. We can save the changes to the database with a call to the beans save method. Likewise a call to save on a brand new bean will add that record to the database: - -
- -Example 3.13: Persisting bean changes - - ------ - -
- -
 1 //Get the Name field on account bean
- 2 $accountBean->name = 'New account name';
- 3 //Set the billing address post code of an account
- 4 $accountBean->billing_address_postalcode = '12345';
- 5 //Save both changes.
- 6 $accountBean->save();
- 7 
- 8 //Create a new case (see the BeanFactory section)
- 9 $caseBean = BeanFactory::newBean('Cases');
-10 //Give it a name and save
-11 $caseBean->name = 'New Case name';
-12 $caseBean->save();
- -
- ------ - - -
-{| -|width="50%"| [50px|class=sidebar-image|information](File:images/leanpub_info-circle.png) -|width="50%"| Whether to save or update a bean is decided by checking the id field of the bean. If id is set then SuiteCRM will attempt to perform an update. If there is no id then one will be generated and a new record will be inserted into the database. If for some reason you have supplied an id but the record is new (perhaps in a custom import script) then you can set new_with_id to true on the bean to let SuiteCRM know that this record is new. -|} - -### Related beans ### - -We have seen how to save single records but, in a CRM system, relationships between records are as important as the records themselves. For example an account may have a list of cases associated with it, a contact will have an account that it falls under etc. We can get and set relationships between beans using several methods. - -#### get_linked_beans #### - -The get_linked_beans method allows retrieving a list of related beans for a given record. - -
- -Example 3.14: get_linked_beans method signature - - ------ - -
- -
1 get_linked_beans(
-2                 $field_name,
-3                 $bean_name,
-4                 $sort_array = array(),
-5                 $begin_index = 0,
-6                 $end_index = -1,
-7                 $deleted=0,
-8                 $optional_where="");
- -
- ------ - - -
-; $field_name -: The link field name for this link. Note that this is not the same as the name of the relationship. If you are unsure of what this should be you can take a look into the cached vardefs of a module in cache/modules/<TheModule>/<TheModule>Vardefs.php for the link definition. -; $bean_name -: The name of the bean that we wish to retrieve. -; $sort_array -: This is a legacy parameter and is unused. -; $begin_index -: Skips the initial $begin_index results. Can be used to paginate. -; $end_index -: Return up to the $end_index result. Can be used to paginate. -; $deleted -: Controls whether deleted or non deleted records are shown. If true only deleted records will be returned. If false only non deleted records will be returned. -; $optional_where -: Allows filtering the results using an SQL WHERE clause. See the get_list method for more details. - -##### Results ##### - -get_linked_beans returns an array of the linked beans. - -##### Example ##### - -
- -Example 3.15: Example get_linked_beans call - - ------ - -
- -
1 $accountBean->get_linked_beans(
-2                 'contacts',
-3                 'Contacts',
-4                 array(),
-5                 0,
-6                 10,
-7                 0,
-8                 "contacts.primary_address_country = 'USA'");
- -
- ------ - - -
-#### relationships #### - -In addition to the get_linked_beans call you can also load and access the relationships more directly. - -##### Loading ##### - -Before accessing a relationship you must use the load_relationship call to ensure it is available. This call takes the link name of the relationship (not the name of the relationship). As mentioned previously you can find the name of the link in cache/modules/<TheModule>/<TheModule>Vardefs.php if you’re not sure. - -
- -Example 3.16: Loading a relationship - - ------ - -
- -
1 //Load the relationship
-2 $accountBean->load_relationship('contacts');
-3 //Can now call methods on the relationship object:
-4 $contactIds = $accountBean->contacts->get();
- -
- ------ - - -
-##### Methods ##### - -###### get ###### - -Returns the ids of the related records in this relationship e.g for the account - contacts relationship in the example above it will return the list of ids for contacts associated with the account. - -###### getBeans ###### - -Similar to get but returns an array of beans instead of just ids. - -{| -|width="50%"| [50px|class=sidebar-image|warning](File:images/leanpub_warning.png) -|width="50%"| getBeans will load the full bean for each related record. This may cause poor performance for relationships with a large number of beans. -|} - -###### add ###### - -Allows relating records to the current bean. add takes a single id or bean or an array of ids or beans. If the bean is available this should be used since it prevents reloading the bean. For example to add a contact to the relationship in our example we can do the following: - -
- -Example 3.18: Adding a new contact to a relationship - - ------ - -
- -
 1 //Load the relationship
- 2 $accountBean->load_relationship('contacts');
- 3 
- 4 //Create a new demo contact
- 5 $contactBean = BeanFactory::newBean();
- 6 $contactBean->first_name = 'Jim';
- 7 $contactBean->last_name = 'Mackin';
- 8 $contactBean->save();
- 9 
-10 //Link the bean to $accountBean
-11 $accountBean->contacts->add($contactBean);
- -
- ------ - - -
-###### delete ###### - -delete allows unrelating beans. Counter-intuitively it accepts the ids of both the bean and the related bean. For the related bean you should pass the bean if it is available e.g when unrelating an account and contact: - -
- -Example 3.19: Removing a new contact from a relationship - - ------ - -
- -
1 //Load the relationship
-2 $accountBean->load_relationship('contacts');
-3 
-4 //Unlink the contact from the account - assumes $contactBean is a Contact SugarB\
-5 ean
-6 $accountBean->contacts->delete($accountBean->id, $contactBean);
- -
- ------ - - -
-{| -|width="50%"| [50px|class=sidebar-image|warning](File:images/leanpub_warning.png) -|width="50%"| Be careful with the delete method. Omitting the second argument will cause all relationships for this link to be removed. -|} - - -
diff --git a/_source/output/chap04.md b/_source/output/chap04.md deleted file mode 100644 index f4df3d839..000000000 --- a/_source/output/chap04.md +++ /dev/null @@ -1,333 +0,0 @@ ---- -layout: page -title: "Chapter 04" ---- - - -
- -## 4. Vardefs ## - -### What are Vardefs ### - -The Vardefs are used to supply information to SuiteCRM about a particular bean. These generally specify the fields, relationships and indexes in a given module as well as additional information such as whether it is audited, the table name etc. - -### Defining Vardefs ### - -#### Module #### - -Vardefs are initially defined in their respective modules folder. For the Accounts module this will be in modules/Accounts/vardefs.php. The information is stored in an array named $dictionary using the module name as the key. For Accounts this will be $dictionary['Account']. Let’s look at the Account vardefs (which have been edited for brevity): - -
- -Example 4.1: Account Vardefs - - ------ - -
- -
 1 $dictionary['Account'] =
- 2 array(
- 3 	'table' => 'accounts',
- 4 	'audited'=>true,
- 5 	'unified_search' => true,
- 6 	'unified_search_default_enabled' => true,
- 7 	'duplicate_merge'=>true,
- 8 	'comment' => 'Accounts are organizations or entities that ...',
- 9 	'fields' => array (
-10 	  //Snipped for brevity. See the fields section.
-11 	),
-12 	'indices' => array (
-13 	  //Snipped for brevity. See the indices section.
-14 	),
-15 	'relationships' => array (
-16 	  //Snipped for brevity. See the relationship section.
-17 	),
-18 	//This enables optimistic locking for Saves From EditView
-19 	'optimistic_locking'=>true,
-20 );
-21 
-22 VardefManager::createVardef(
-23 	'Accounts',
-24 	'Account',
-25 	array('default', 'assignable','company',)
-26 );
- -
- ------ - - -
-##### Keys ##### - -The following are some of the keys that can be specified for the vardefs. Fields, indices and relationships are covered in their own sections. - -; table -: The database table name for this module. -; audited -: Whether or not this module should be audited. Note that audited must also be set at the fields level for a field to be audited. -; unified_search -: Whether this module can be searchable via the global search. -; unified_search_default_enabled -: Whether this module is searchable via the global search by default. -; duplicate_merge -: Whether or not duplicate merging functionality is enabled for this module. -; comment -: A description of this module. -; optimistic_locking -: Whether optimistic should be enabled for this module. Optimistic locking locks concurrent edits on a record by assuming that there will be no conflict. On save the last modified timestamp on the record will be checked. If it is different then an edit has occurred since this record was loaded. If this is the case then the user will be prompted with a page showing the differences in the two edits and asked to choose which edits are to be used. - -##### Fields ##### - -The field defines the behaviour and attributes of each field in the module. - -; name -: The name of the field. -; vname -: The name of the language label to be used for this field. -; type -: The type of the field. See the field types section. -; isnull -: Whether null values are allowed -; len -: If the field is a string type, the max number of characters allowed. -; options -: For enum fields the language label for the dropdown values for this field -; dbtype -: The type to be used by the database to store this field. This is not required as the appropriate type is usually chosen. -; default -: The default value of this field. -; massupdate -: Whether or not this field should be mass updatable. Note that some field types are always restricted from mass updates. -; rname -: For related fields only. The name of the field to be taken from the related module. -; id_name -: For related fields only. The field in this bean which contains the related id. -; source -: The source of this field. Can be set to ‘non-db’ if the field is not stored in the database - for example for link fields, fields populated by logic hooks or by other means. -; sort_on -: For concatenated fields (i.e. name fields) the field which should be used to sort. -; fields -: For concatenated fields (i.e. name fields) an array of the fields which should be concatenated. -; db_concat_fields -: For concatenated fields (i.e. name fields) an array of the fields which should be concatenated in the database. Usually this is the same as fields. -; unified_search -: True if this field should be searchable via the global search. -; enable_range_search -: Whether the list view search should allow a range search of this field. This is used for date and numeric fields. -; studio -: Whether the field should display in studio. -; audited -: Whether or not changes to this field should be audited. - -##### Field types ##### - -The following are common field types used: - -; id -: An id field. -; name -: A name field. This is usually a concatenation of other fields. -; bool -: A boolean field. -; varchar -: A variable length string field. -; char -: A character field. -; text -: A text area field. -; decimal -: A decimal field. -; date -: A date field. -; datetime -: A date and time field. -; enum -: A dropdown field. -; phone -: A phone number field. -; link -: A link to another module via a relationship. -; relate -: A related bean field. - -##### Indices ##### - -The indices array allows defining any database indexes that should be in place on the database table for this module. Let’s look at an example: - -
- -Example 4.2: Example indices definition - - ------ - -
- -
 1 'indices' => array (
- 2 	array(
- 3 		'name' =>'idx_mymod_id_del',
- 4 		'type' =>'index',
- 5 		'fields'=>array('id', 'deleted')),
- 6 	array(
- 7 		'name' =>'idx_mymod_parent_id',
- 8 		'type' =>'index',
- 9 		'fields'=>array( 'parent_id')),
-10 	array(
-11 		'name' =>'idx_mymod_parent_id',
-12 		'type' =>'unique',
-13 		'fields'=>array( 'third_party_id')),
-14 	),
- -
- ------ - - -
-Each array entry should have, at least, the following entries: - -; name -: The name of the index. This is usually used by the database to reference the index. Most databases require that these are unique. -; type -: The type of the index to create. index will simply add an index on the fields, unique will add a unique constraint on the fields, primary will add the fields as a primary key. -; fields -: An array of the fields to be indexed. The order of this array will be used as the order of the fields in the index. - -##### Relationships ##### - -The Vardefs also specify the relationships within this module. Here’s an edited example from the Accounts module: - -
- -Example 4.3: Example relationships definition - - ------ - -
- -
 1 'relationships' => array (
- 2 	'account_cases' => array(
- 3 		'lhs_module'=> 'Accounts',
- 4 		'lhs_table'=> 'accounts',
- 5 		'lhs_key' => 'id',
- 6 		'rhs_module'=> 'Cases',
- 7 		'rhs_table'=> 'cases',
- 8 		'rhs_key' => 'account_id',
- 9 		'relationship_type' => 'one-to-many'),
-10 ),
- -
- ------ - - -
-Here we see the link between accounts and cases. This is specified with the following keys: - -; lhs_module -: The module on the left hand side of this relationship. For a one to many relationship this will be the “One” side. -; lhs_table -: The table for the left hand side module. If you are unsure the table for a module can be found in it’s vardefs. -; lhs_key -: The field to use for the left hand side of this link. In this case it is the id of the account. -; rhs_module -: The right hand side module. In this case the “many” side of the relationship. -; rhs_table -: The table for the right hand side module. As stated previously you can find the table for a module can be found in it’s vardefs. -; rhs_key -: The field to use on the right hand side. In this case the account_id field on cases. -; relationship_type -: The type of relationship - “one-to-many” or “many-to-many”. Since this is a one to many relationship it means a case is related to a single account but a single account can have multiple cases. - -For many to many relationship fields the following keys are also available: - -; join_table -: The name of the join table for this relationship. -; join_key_lhs -: The name of the field on the join table for the left hand side. -; join_key_rhs -: The name of the field on the join table for the right hand side. - -#### Vardef templates #### - -Vardef templates provide a shortcut for defining common vardefs. This is done by calling VardefManager::createVardef and passing the module name, object name and an array of templates to be assigned. The following is an example from the accounts vardefs: - -
- -Example 4.4: Example vardef template - - ------ - -
- -
22 VardefManager::createVardef(
-23 		'Accounts',
-24 		'Account',
-25 		array('default', 'assignable','company',)
-26 		);
- -
- ------ - - -
-In this example the default, assignable and company templates are used. The following are some of the available templates: - -; basic
-default -: Adds the common base fields such as id, name, date_entered, etc. -; assignable -: Adds the fields and relationships necessary to assign a record to a user. -; person -: Adds fields common to people records such as first_name, last_name, address, etc. -; company -: Adds fields common to companies such as an industry dropdown, address, etc. - -#### Customising vardefs #### - -Vardefs can be customised by adding a file into - -
- -Example 4.5: Custom vardef location - - ------ - -
- -
custom/Extension/modules/<TheModule>/Ext/SomeFile.php
- -
- ------ - - -
-This file can then be used to add a new field definition or customise an existing one e.g changing a field type: - -
- -Example 4.6: Example overriding an existing vardef - - ------ - -
- -
$dictionary["TheModule"]["fields"]["some_field"]['type'] = 'int';
- -
- ------ - - -
- -
diff --git a/_source/output/chap05.md b/_source/output/chap05.md deleted file mode 100644 index 910e90356..000000000 --- a/_source/output/chap05.md +++ /dev/null @@ -1,184 +0,0 @@ ---- -layout: page -title: "Chapter 05" ---- - - -
- -## 5. Views ## - -SuiteCRM follows the MVC (Model-View-Controller) pattern and as such has the concept of views. Views are responsible for gathering and displaying data . There are a number of default views in SuiteCRM. These include - -; ListView -: Displays a list of records and provides links to the EditViews and DetailViews of those records. The ListView also allows some operations such as deleting and mass updating records. This is (usually) the default view for a module. -; DetailView -: Displays the details of a single record and also displays subpanels of related records. -; EditView -: The EditView allows editing the various fields of a record and provides validation on these values. - -### Location ### - -Views can be found in modules/<TheModule>/views/ or, for custom views,
-custom/modules/<TheModule>/views/, and are named in the following format: view.<viewname>.php. For example, the Accounts DetailView can be found in modules/Accounts/views/view.detail.php with a customised version in custom/modules/Accounts/views/view.detail.php. The custom version is used if it exists. If it doesn’t then the module version is used. Finally, if neither of these exist then the SuiteCRM default is used in include/MVC/View/views/. - -### Customising ### - -In order to customise a View we first need to create the appropriate view file. This will vary depending on the module we wish to target. - -#### Custom module #### - -In this case we can place the file directly into our module. Create a new file (if it doesn’t exist) at modules/<TheModule>/views/view.<viewname>.php. The contents will look similar to: - -
- -Example 5.1: View for a custom module - - ------ - -
- -
1 <?php
-2 
-3 require_once 'include/MVC/View/views/view.<viewname>.php';
-4 
-5 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-6 class <TheModule>View<ViewName> extends View<ViewName>
-7 {
-8 
-9 }
- -
- ------ - - -
-A more concrete example would be for the detail view for a custom module called ABC_Vehicles: - -
- -Example 5.2: Detail view for a custom module, ABC_Vehicles - - ------ - -
- -
1 <?php
-2 
-3 require_once 'include/MVC/View/views/view.detail.php';
-4 
-5 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-6 class ABC_VehiclesViewDetail extends ViewDetail
-7 {
-8 
-9 }
- -
- ------ - - -
-#### Preexisting modules #### - -For preexisting modules you will want to add the view to
-custom/modules/<TheModule>/views/view.<viewname>.php. - -The contents of this file will vary depending on whether you wish to extend the existing view (if it exists) or create your own version completely. It is usually best to extend the existing view, since this will retain important logic. Note the naming convention here. We name the class
-Custom<TheModule>View<ViewName> (for example CustomAccountsViewDetail). - -Here we don’t extend the existing view or no such view exists: - -
- -Example 5.3: Custom view for an existing module - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 
-4 require_once 'include/MVC/View/views/view.<viewname>.php';
-5 
-6 class Custom<TheModule>View<ViewName> extends ViewDetail
-7 {
-8 
-9 }
- -
- ------ - - -
-Otherwise we extend the existing view. Note that we are requiring the existing view: - -
- -Example 5.4: Overriding a view for an existing module - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 
-4 require_once 'modules/<TheModule>/views/view.<viewname>.php';
-5 
-6 class Custom<TheModule>View<ViewName> extends <TheModule>View<ViewName>
-7 {
-8 
-9 }
- -
- ------ - - -
-For example, overriding the List View of Accounts: - -
- -Example 5.5: Overriding the Accounts List View - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 
-4 require_once 'modules/Accounts/views/view.list.php';
-5 
-6 class CustomAccountsViewList extends AccountsViewList
-7 {
-8 
-9 }
- -
- ------ - - -
-#### Making changes #### - -Now that we have a custom view what can we actually do? The views have various methods which we can now override to change/add behaviour. The most common ones to override are: - -; preDisplay -: Explicitly intended to allow logic to be called before display() is called. This can be used to alter arguments to the list view or to output anything to appear before the main display code (such as, for example, adding JavaScript). -; display -: Does the actual work of displaying the view. Can be overridden to alter this behaviour or to output anything after the main display. You usually want to call parent::display(); to ensure that the display code is run (unless, of course, you are adding your own display logic). - - -
diff --git a/_source/output/chap06.md b/_source/output/chap06.md deleted file mode 100644 index 5f2114d75..000000000 --- a/_source/output/chap06.md +++ /dev/null @@ -1,742 +0,0 @@ ---- -layout: page -title: "Chapter 06" ---- - - -
- -## 6. Metadata ## - -### Intro ### - -Module metadata are used to describe how various views behave in the module. The main use of this is providing field and layout information but this can also be used to filter subpanels and to describe what fields are used in the search. - -### Location ### - -Module metadata can be found in: - -
- -Example 6.1: Module metadata location - - ------ - -
- -
modules/<TheModule>/metadata/
- -
- ------ - - -
-### Customising ### - -Usually studio is the best way of customising metadata. Even when you do wish to make customisations that are not possible through studio it can be simpler to set everything up in studio first. This is particularly true for layout based metadata. However if you are customising metadata it is as simple as placing, or editing, the file in the custom directory. For example to override the Accounts detailviewdefs (found in modules/Accounts/metadata/detailviewdefs.php) we would place (or edit) the file in custom/modules/Accounts/metadata/detailviewdefs.php. One exception to this rule is the studio.php file. The modules metadata folder is the only location checked - any version in custom/<TheModule>/metadata/studio.php is ignored. - -### Different metadata ### - -#### detailviewdefs.php #### - -detailviewdefs.php provides information on the layout and fields of the detail view for this module. This file uses the same structure as editviewdefs.php. Let’s look at an example for a fictional module ABC_Vehicles: - -
- -Example 6.2: DetailView metadata definition - - ------ - -
- -
 1 <?php
- 2 $viewdefs [['DetailView']('ABC_Vehicles']) = array (
- 3 	'templateMeta' => array (
- 4 		'form' => array (
- 5 			'buttons' => array (
- 6 				'EDIT',
- 7 				'DUPLICATE',
- 8 				'DELETE',
- 9 				'FIND_DUPLICATES'
-10 			)
-11 		),
-12 		'maxColumns' => '2',
-13 		'widths' => array (
-14 			array (
-15 				'label' => '10',
-16 				'field' => '30'
-17 			),
-18 			array (
-19 				'label' => '10',
-20 				'field' => '30'
-21 			)
-22 		),
-23 		'includes' => array (
-24 			array (
-25 				'file' => 'modules/ABC_Vehicles/ABC_VehiclesDetail.js'
-26 			)
-27 		)
-28 	),
-29 	'panels' => array (
-30 		'LBL_ABC_VEHICLES_INFO' => array (
-31 			array (
-32 				array (
-33 					'name' => 'name',
-34 					'comment' => 'The Name of the Vehicle',
-35 					'label' => 'LBL_NAME',
-36 				),
-37 				'reg_number'
-38 			),
-39 			array (
-40 				array (
-41 					'name' => 'type',
-42 					'label' => 'LBL_TYPE',
-43 				),
-44 				array (
-45 					'name' => 'phone_fax',
-46 					'comment' => 'The fax phone number of this company',
-47 					'label' => 'LBL_FAX'
-48 				)
-49 			),
-50 			array (
-51 				array (
-52 					'name' => 'registered_address_street',
-53 					'label' => 'LBL_REGISTERED_ADDRESS',
-54 					'type' => 'address',
-55 					'displayParams' => array (
-56 						'key' => 'registered'
-57 					)
-58 				),
-59 			),
-60 		),
-61 		'LBL_PANEL_ADVANCED' => array (
-62       array (
-63 				array (
-64 					'name' => 'assigned_user_name',
-65 					'label' => 'LBL_ASSIGNED_TO'
-66 				),
-67 				array (
-68 					'name' => 'date_modified',
-69 					'label' => 'LBL_DATE_MODIFIED',
-70 					'customCode' => '{$fields.date_modified.value} '
-71 							+ '{$APP.LBL_BY} '
-72 							+ '{$fields.modified_by_name.value}',
-73 				)
-74 			),
-75 		),
-76 	)
-77 );
-78 ?>
- -
- ------ - - -
-We see that line 2 defines an array $viewdefs['ABC_Vehicles']['DetailView'] which places a DetailView entry for the module ABC_Vehicles into $viewdefs (DetailView will be EditView or QuickCreateView as appropriate). This array has two main keys defined here: - -##### templateMeta ##### - -The templateMeta key provides information about the view in general. The ['form']['buttons'] entries define the buttons that should appear in this view. - -; maxColumns -: Defines the number of columns to use for this view. It is unusual for this to be more than 2. -; widths -: An array defining the width of the label and field for each column. -; includes -: An array of additional JavaScript files to include. This is useful for adding custom JavaScript behaviour to the page. - -##### panels ##### - -The panels entry defines the actual layout of the Detail (or Edit) view. Each entry is a new panel in the view with the key being the label for that panel. We can see in our example that we have 2 panels. One uses the label defined by the language string LBL_ABC_VEHICLES_INFO, the other uses LBL_PANEL_ADVANCED. - -Each panel has an array entry for each row, with each array containing an entry for each column. For example we can see that the first row has the following definition: - -
- -Example 6.3: DetailView metadata row definition - - ------ - -
- -
31 array(
-32 	array (
-33 		'name' => 'name',
-34 		'comment' => 'The Name of the Vehicle',
-35 		'label' => 'LBL_NAME',
-36 	),
-37 	'reg_number',
-38 ),
- -
- ------ - - -
-This has an array definition for the first row, first column and a string definition for the first row, second column. The string definition is very straightforward and simply displays the detail (or edit, as appropriate) view for that field. It will use the default label, type, etc. In our example we are displaying the field named reg_number. - -The array definition for the first row, first column is a little more complex. Each array definition must have a name value. In our example we are displaying the name field. However we also supply some other values. Values most commonly used are: - -; comment -: Used to note the purpose of the field. -; label -: The language key for this label. If the language key is not recognised then this value will be used instead (see the [on language](chapter)(#chap08.xhtml#language-chapter)). -; displayParams -: An array used to pass extra arguments for the field display. For the options and how they are used you can have a look into the appropriate field type in include/SugarFields/Fields or custom/include/SugarFields/Fields. An example is setting the size of a textarea: - -
- -Example 6.4: DetailView metadata displayParams - - ------ - -
- -
1 'displayParams' => array(
-2     'rows' => 2,
-3     'cols' => 30,
-4 ),
- -
- ------ - - -
-; customCode -: Allows supplying custom smarty code to be used for the display. The code here can include any valid smarty code and this will also have access to the current fields in this view via $fields. An example of outputing the ID field would be {$fields.id.value}. Additionally the module labels and app labels can be accessed via $MOD and $APP respectively. Finally you can use @@FIELD@@ to output the value of the field that would have been used. For example {if $someCondition}@@FIELD@@{/if} will conditionally show the field. - -#### editviewdefs.php #### - -editviewdefs.php provides information on the layout and fields of the edit view for this module. This file uses the same structure as detailviewdefs.php. Please see the information on detailviewdefs.php. - -#### listviewdefs.php #### - -The listviewdefs.php file for a module defines what fields the list view for that module will display. Let’s take a look at an example: - -
- -Example 6.5: ListView metadata definition - - ------ - -
- -
 1 $listViewDefs ['AOR_Reports'] =
- 2 array (
- 3   'NAME' =>
- 4   array (
- 5     'width' => '15%',
- 6     'label' => 'LBL_NAME',
- 7     'default' => true,
- 8     'link' => true,
- 9   ),
-10   'REPORT_MODULE' =>
-11   array (
-12     'type' => 'enum',
-13     'default' => true,
-14     'studio' => 'visible',
-15     'label' => 'LBL_REPORT_MODULE',
-16     'width' => '15%',
-17   ),
-18   'ASSIGNED_USER_NAME' =>
-19   array (
-20     'width' => '15%',
-21     'label' => 'LBL_ASSIGNED_TO_NAME',
-22     'module' => 'Employees',
-23     'id' => 'ASSIGNED_USER_ID',
-24     'default' => true,
-25   ),
-26   'DATE_ENTERED' =>
-27   array (
-28     'type' => 'datetime',
-29     'label' => 'LBL_DATE_ENTERED',
-30     'width' => '15%',
-31     'default' => true,
-32   ),
-33   'DATE_MODIFIED' =>
-34   array (
-35     'type' => 'datetime',
-36     'label' => 'LBL_DATE_MODIFIED',
-37     'width' => '15%',
-38     'default' => true,
-39   ),
-40 );
- -
- ------ - - -
-To define the list view defs we simply add a key to the $listViewDefs array. In this case we add an entry for AOR_Reports This array contains an entry for each field that we wish to show in the list view and is keyed by the upper case name of the field. For example, the REPORT_MODULE key refers to the report_module field of AOR_Reports. - -; type -: The type of the field. This can be used to override how a field is displayed. -; default -: Whether this field should be shown in the list view by default. If false then the field will appear in the available columns list in studio. -; studio -: Whether or not this field should be displayed in studio. This can be useful to ensure that a critical field is not removed. -; label -: The label to be used for this field. If this is not supplied then the default label for that field will be used. -; width -: The width of the field in the list view. Note that, although this is usually given as a percentage it is treated as a proportion. The example above has five columns with a width of 15% but these will actually be 20% since this is a ratio. - -#### popupdefs.php #### - -popupdefs.php provides information on the layout, fields and search options of the module popup that is usually used when selecting a related record. - -Let’s look at the default popupdefs.php for the Accounts module: - -
- -Example 6.6: PopupView metadata definition - - ------ - -
- -
 1 $popupMeta = array(
- 2 	'moduleMain' => 'Case',
- 3 	'varName' => 'CASE',
- 4 	'className' => 'aCase',
- 5 	'orderBy' => 'name',
- 6 	'whereClauses' =>
- 7 		array('name' => 'cases.name',
- 8 				'case_number' => 'cases.case_number',
- 9 				'account_name' => 'accounts.name'),
-10 	'listviewdefs' => array(
-11 		'CASE_NUMBER' => array(
-12 			'width' => '5',
-13 			'label' => 'LBL_LIST_NUMBER',
-14 	        'default' => true),
-15 		'NAME' => array(
-16 			'width' => '35',
-17 			'label' => 'LBL_LIST_SUBJECT',
-18 			'link' => true,
-19 	        'default' => true),
-20 		'ACCOUNT_NAME' => array(
-21 			'width' => '25',
-22 			'label' => 'LBL_LIST_ACCOUNT_NAME',
-23 			'module' => 'Accounts',
-24 			'id' => 'ACCOUNT_ID',
-25 			'link' => true,
-26 	        'default' => true,
-27 	        'ACLTag' => 'ACCOUNT',
-28 	        'related_fields' => array('account_id')),
-29 		'PRIORITY' => array(
-30 			'width' => '8',
-31 			'label' => 'LBL_LIST_PRIORITY',
-32 	        'default' => true),
-33 		'STATUS' => array(
-34 			'width' => '8',
-35 			'label' => 'LBL_LIST_STATUS',
-36 	        'default' => true),
-37 	    'ASSIGNED_USER_NAME' => array(
-38 	        'width' => '2',
-39 	        'label' => 'LBL_LIST_ASSIGNED_USER',
-40 	        'default' => true,
-41 	       ),
-42 		),
-43 	'searchdefs'   => array(
-44 	 	'case_number',
-45 		'name',
-46 		array(
-47 			'name' => 'account_name',
-48 			'displayParams' => array(
-49 				'hideButtons'=>'true',
-50 				'size'=>30,
-51 				'class'=>'sqsEnabled sqsNoAutofill'
-52 			)
-53 		),
-54 		'priority',
-55 		'status',
-56 		array(
-57 			'name' => 'assigned_user_id',
-58 			'type' => 'enum',
-59 			'label' => 'LBL_ASSIGNED_TO',
-60 			'function' => array(
-61 				'name' => 'get_user_array',
-62 				'params' => array(false))
-63 			),
-64 	  )
-65 );
- -
- ------ - - -
-The popupdefs.php specifies a $popupMeta array with the following keys: - -; moduleMain -: The module that will be displayed by this popup. -; varName -: The variable name used to store the search preferences etc. This will usually simply the upper case module name. -; className -: The class name of the SugarBean for this module. If this is not supplied then moduleMain will be used. This is only really required for classes where the class name and module name differ (such as Cases). -; orderBy -: The default field the list of records will be sorted by. -; whereClauses -: Legacy option. This is only used as a fallback when there are no searchdefs. Defines the names of fields to allow searching for and their database representation. -; listviewdefs -: The list of fields displayed in the popup list view. See listviewdefs.php. -; searchdefs -: An array of the fields that should be available for searching in the popup. See the individual search defs in the searchdefs.php section (for example the basic_search array). - -#### quickcreatedefs.php #### - -quickcreatedefs.php provides information on the layout and fields of the quick create view for this module (this is the view that appears when creating a record from a subpanel). This file uses the same structure as detailviewdefs.php. Please see the information on detailviewdefs.php. - -#### searchdefs.php #### - -The search defs of a module define how searching in that module looks and behaves. - -Let’s look at an example. - -
- -Example 6.7: Search View metadata definition - - ------ - -
- -
  1 $searchdefs ['Accounts'] = array (
-  2 	'templateMeta' => array (
-  3 		'maxColumns' => '3',
-  4 		'maxColumnsBasic' => '4',
-  5 		'widths' => array (
-  6 			'label' => '10',
-  7 			'field' => '30'
-  8 		)
-  9 	),
- 10 	'layout' => array (
- 11 		'basic_search' => array (
- 12 			'name' => array (
- 13 				'name' => 'name',
- 14 				'default' => true,
- 15 				'width' => '10%'
- 16 			),
- 17 			'current_user_only' => array (
- 18 				'name' => 'current_user_only',
- 19 				'label' => 'LBL_CURRENT_USER_FILTER',
- 20 				'type' => 'bool',
- 21 				'default' => true,
- 22 				'width' => '10%'
- 23 			)
- 24 		)
- 25 		,
- 26 		'advanced_search' => array (
- 27 			'name' => array (
- 28 				'name' => 'name',
- 29 				'default' => true,
- 30 				'width' => '10%'
- 31 			),
- 32 			'website' => array (
- 33 				'name' => 'website',
- 34 				'default' => true,
- 35 				'width' => '10%'
- 36 			),
- 37 			'phone' => array (
- 38 				'name' => 'phone',
- 39 				'label' => 'LBL_ANY_PHONE',
- 40 				'type' => 'name',
- 41 				'default' => true,
- 42 				'width' => '10%'
- 43 			),
- 44 			'email' => array (
- 45 				'name' => 'email',
- 46 				'label' => 'LBL_ANY_EMAIL',
- 47 				'type' => 'name',
- 48 				'default' => true,
- 49 				'width' => '10%'
- 50 			),
- 51 			'address_street' => array (
- 52 				'name' => 'address_street',
- 53 				'label' => 'LBL_ANY_ADDRESS',
- 54 				'type' => 'name',
- 55 				'default' => true,
- 56 				'width' => '10%'
- 57 			),
- 58 			'address_city' => array (
- 59 				'name' => 'address_city',
- 60 				'label' => 'LBL_CITY',
- 61 				'type' => 'name',
- 62 				'default' => true,
- 63 				'width' => '10%'
- 64 			),
- 65 			'address_state' => array (
- 66 				'name' => 'address_state',
- 67 				'label' => 'LBL_STATE',
- 68 				'type' => 'name',
- 69 				'default' => true,
- 70 				'width' => '10%'
- 71 			),
- 72 			'address_postalcode' => array (
- 73 				'name' => 'address_postalcode',
- 74 				'label' => 'LBL_POSTAL_CODE',
- 75 				'type' => 'name',
- 76 				'default' => true,
- 77 				'width' => '10%'
- 78 			),
- 79 			'billing_address_country' => array (
- 80 				'name' => 'billing_address_country',
- 81 				'label' => 'LBL_COUNTRY',
- 82 				'type' => 'name',
- 83 				'options' => 'countries_dom',
- 84 				'default' => true,
- 85 				'width' => '10%'
- 86 			),
- 87 			'account_type' => array (
- 88 				'name' => 'account_type',
- 89 				'default' => true,
- 90 				'width' => '10%'
- 91 			),
- 92 			'industry' => array (
- 93 				'name' => 'industry',
- 94 				'default' => true,
- 95 				'width' => '10%'
- 96 			),
- 97 			'assigned_user_id' => array (
- 98 				'name' => 'assigned_user_id',
- 99 				'type' => 'enum',
-100 				'label' => 'LBL_ASSIGNED_TO',
-101 				'function' => array (
-102 					'name' => 'get_user_array',
-103 					'params' => array (
-104 							0 => false
-105 					)
-106 				),
-107 				'default' => true,
-108 				'width' => '10%'
-109 			)
-110 		)
-111 	)
-112 );
- -
- ------ - - -
-Here we setup a new array for Accounts in the $searchdefs array. This has two keys: - -##### templateMeta ##### - -The templateMeta key controls the basic look of the search forms. Here we define some overall layout info such as the maximum columns (3) and the maximum number of columns for the basic search (4). Finally we set the widths for the search fields and their labels. - -##### layout ##### - -The layout key contains the layout definitions for the basic search and advanced search. This is simply a list of array definition of the fields. See the section on listviewdefs.php for a description of some of the options. - -#### subpaneldefs.php #### - -The subpaneldefs.php file provides definitions for the subpanels that appear in the detail view of a module. Let’s look at an example: - -
- -Example 6.8: Subpanel metadata definition - - ------ - -
- -
 1 $layout_defs['AOS_Quotes'] = array (
- 2 	'subpanel_setup' => array (
- 3 		'aos_quotes_aos_contracts' => array (
- 4 			'order' => 100,
- 5 			'module' => 'AOS_Contracts',
- 6 			'subpanel_name' => 'default',
- 7 			'sort_order' => 'asc',
- 8 			'sort_by' => 'id',
- 9 			'title_key' => 'AOS_Contracts',
-10 			'get_subpanel_data' => 'aos_quotes_aos_contracts',
-11 			'top_buttons' => array (
-12 				0 => array (
-13 					'widget_class' => 'SubPanelTopCreateButton'
-14 				),
-15 				1 => array (
-16 					'widget_class' => 'SubPanelTopSelectButton',
-17 					'popup_module' => 'AOS_Contracts',
-18 					'mode' => 'MultiSelect'
-19 				)
-20 			)
-21 		),
-22 		'aos_quotes_aos_invoices' => array (
-23 			'order' => 100,
-24 			'module' => 'AOS_Invoices',
-25 			'subpanel_name' => 'default',
-26 			'sort_order' => 'asc',
-27 			'sort_by' => 'id',
-28 			'title_key' => 'AOS_Invoices',
-29 			'get_subpanel_data' => 'aos_quotes_aos_invoices',
-30 			'top_buttons' => array (
-31 				0 => array (
-32 					'widget_class' => 'SubPanelTopCreateButton'
-33 				),
-34 				1 => array (
-35 					'widget_class' => 'SubPanelTopSelectButton',
-36 					'popup_module' => 'AOS_Invoices',
-37 					'mode' => 'MultiSelect'
-38 				)
-39 			)
-40 		),
-41 		'aos_quotes_project' => array (
-42 			'order' => 100,
-43 			'module' => 'Project',
-44 			'subpanel_name' => 'default',
-45 			'sort_order' => 'asc',
-46 			'sort_by' => 'id',
-47 			'title_key' => 'Project',
-48 			'get_subpanel_data' => 'aos_quotes_project',
-49 			'top_buttons' => array (
-50 				0 => array (
-51 					'widget_class' => 'SubPanelTopCreateButton'
-52 				),
-53 				1 => array (
-54 					'widget_class' => 'SubPanelTopSelectButton',
-55 					'popup_module' => 'Accounts',
-56 					'mode' => 'MultiSelect'
-57 				)
-58 			)
-59 		)
-60 	)
-61 );
- -
- ------ - - -
-In the example above we set up a definition for a module (in this case AOS_Quotes) in the $layout_defs array. This has a single key subpanel_setup which is an array of each of the subpanel definitions keyed by a name. This name should be something recognisable. In the case above it is the name of the link field displayed by the subpanel. The entry for each subpanel usually has the following defined: - -; order -: A number used for sorting the subpanels. The values themselves are arbitrary and are only used relative to other subpanels. -; module -: The module which will be displayed by this subpanel. For example the aos_quotes_project def in the example above will display a list of Project records. -; subpanel_name -: The subpanel from the displayed module which will be used. See the subpanels section of this chapter. -; sort_by -: The field to sort the records on. -; sort_order -: The order in which to sort the sort_by field. asc for ascending desc for descending. -; title_key -: The language key to be used for the label of this subpanel. -; get_subpanel_data -: Used to specify where to retrieve the subpanel records. Usually this is just a link name for the current module. In this case the related records will be displayed in the subpanel. However, for more complex links, it is possible to specify a function to call. When specifying a function you should ensure that the get_subpanel_data entry is in the form function:theFunctionName. Additionally you can specify the location of the function and any additional parameters that are needed by using the function_parameters key. An example of a subpanel which uses a function can be found in [A](Appendix)(#chap19.xhtml#appendix-a). -; function_parameters -: Specifies the parameters for a subpanel which gets it’s information from a function (see
-get_subpanel_data). This is an array which allows specifying where the function is by using the import_function_file key (if this is absent but get_subpanel_data defines a function then the function will be called on the bean for the parent of the subpanel). Additionally this array will be passed as an argument to the function defined in get_subpanel_data which allows passing in arguments to the function. -; generate_select -: For function subpanels (see get_subpanel_data) whether or not the function will return an array representing the query to be used (for generate_select = true) or whether it will simply return the query to be used as a string. -; get_distinct_data -: Whether or not to only return distinct rows. Relationships do not allow linking two records more than once therefore this only really applies if the subpanel source is a function. See
-get_subpanel_data for information on function subpanel sources. -; top_buttons -: Allows defining the buttons to appear on the subpanel. This is simply an array of the button definitions. These definitions have, at least, the widget_class defined which decides the button class to use in include/generic/SugarWidgets. Depending on the button this array may also be used to pass in extra arguments to the widget class. - -#### subpanels #### - -Inside the metadata folder is the subpanels folder. This allows creating different subpanel layouts for different parent modules. For example, the Contacts module will display differently in the subpanel on an account than it will in the subpanel of a case. The files inside the subpanels folder can be named anything. All that matters is that it can be referenced in the subpanel_name of the subpaneldefs.php of the parent module. The usual subpanel file is simply called default.php. Let’s look at the modules/Accounts/metadata/subpanels/default.php file: - -
- -Example 6.8: Module Subpanels definition - - ------ - -
- -
 1 $subpanel_layout = array(
- 2 	'top_buttons' => array(
- 3 		array(
- 4 			'widget_class' => 'SubPanelTopCreateButton'
- 5 		),
- 6 		array(
- 7 			'widget_class' => 'SubPanelTopSelectButton', 
- 8 			'popup_module' => 'Accounts'
- 9 		),
-10 	),
-11 	'where' => '',
-12 	'list_fields' => array (
-13 	  'name' =>
-14 	  array (
-15 	   'vname' => 'LBL_LIST_ACCOUNT_NAME',
-16 	   'widget_class' => 'SubPanelDetailViewLink',
-17 	   'width' => '45%',
-18 	   'default' => true,
-19 	  ),
-20 	  'billing_address_city' =>
-21 	  array (
-22     	'vname' => 'LBL_LIST_CITY',
-23     	'width' => '20%',
-24     	'default' => true,
-25 	  ),
-26 	  'billing_address_country' =>
-27 	  array (
-28 	  	'type' => 'varchar',
-29     	'vname' => 'LBL_BILLING_ADDRESS_COUNTRY',
-30     	'width' => '7%',
-31     	'default' => true,
-32 	  ),
-33 	  'phone_office' =>
-34 	  array (
-35 	  	'vname' => 'LBL_LIST_PHONE',
-36 	  	'width' => '20%',
-37 	  	'default' => true,
-38 	  ),
-39 	  'edit_button' =>
-40 	  array (
-41 	  	'vname' => 'LBL_EDIT_BUTTON',
-42 	  	'widget_class' => 'SubPanelEditButton',
-43 	  	'width' => '4%',
-44 	  	'default' => true,
-45 	  ),
-46 	  'remove_button' =>
-47 	  array (
-48 	    'vname' => 'LBL_REMOVE',
-49 	    'widget_class' => 'SubPanelRemoveButtonAccount',
-50 	    'width' => '4%',
-51 	    'default' => true,
-52 	  ),
-53    )
-54 );
- -
- ------ - - -
-There are three keys in the $subpanel_layout variable for this subpanel. These are: - -; top_buttons -: Defines the buttons that will appear at the top of the subpanel. See the top_buttons key in subpaneldefs.php. -; where -: Allows the addition of conditions to the where clause. For example this could be used to exclude Cases that are closed (cases.state != "Closed") or only include Accounts of a specific industry (accounts.industry = "Media"). Note that in these examples we specify the table to remove any ambiguity in the query. -; list_fields -: Defines the list of fields to be displayed in this subpanel. See the section on listviewdefs.php for more information. - -#### studio.php #### - -studio.php is the simplest file in metadata and it’s existence is simply used to confirm if a module should be shown in studio for user tweaking. Note that, unlike other metadata files, the file in modules/<TheModule>/metadata/studio.php will be the only one checked. A file in custom/modules/<TheModule>/metadata/studio.php will have no effect. - - -
diff --git a/_source/output/chap07.md b/_source/output/chap07.md deleted file mode 100644 index e318b9bd0..000000000 --- a/_source/output/chap07.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -layout: page -title: "Chapter 07" ---- - - -
- -## 7. Controllers ## - -SuiteCRM follows the MVC (Model-View-Controller) pattern and as such has the concept of controllers. The controller is responsible for making changes to the Model as well as passing control to the view as appropriate. SuiteCRM has the concept of actions which are actions that will be taken by the controller. Let’s take a look at a SuiteCRM URL: - -
- -Example 7.1: Example SuiteCRM URL - - ------ - -
- -
example.com/index.php?module=Accounts&action=index
- -
- ------ - - -
-In this (rather boring) example we see that the module is Accounts. This will determine which controller to use and then call the index action on that controller. - -SuiteCRM will first look for the controller in custom/module/<TheModule>/controller.php. If this is not found then next module/<TheModule>/controller.php will be checked. Finally if neither of these controllers exist then the default controller will be used. The default controller can be found in include/MVC/Controller/SugarController.php. - -### Customising controllers ### - -Ordinarily the default controller handles the request and delegates to the appropriate views etc. However custom controllers can be used to add or alter functionality. Let’s look at adding a new action. - -In the first instance we will have to add our custom controller. This will vary slightly depending on the nature of the module. - -#### Custom module #### - -In this case we can place the file directly into our module. You should create a new file (if it doesn’t exist) at modules/<TheModule>/controller.php. The contents will look similar to: - -
- -Example 7.2: Creating a custom controller for a custom module - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 class <TheModule>Controller extends SugarController
-4 {
-5 
-6 }
- -
- ------ - - -
-#### Pre-existing modules #### - -For pre-existing modules you should add the controller to
-custom/modules/<TheModule>/controller.php. - -The contents of this file will vary depending on whether you wish to extend the existing controller (if it exists) or create your own version completely. It is usually best to extend the existing controller since this will retain important logic. You should note the naming convention here. We name the class
-Custom<TheModule>Controller. - -Here we don’t extend the existing controller or no such controller exists: - -
- -Example 7.3: Creating a custom controller for an existing module - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 class Custom<TheModule>Controller extends SugarController
-4 {
-5 
-6 }
- -
- ------ - - -
-Alternatively we extend the existing controller. Note that we are requiring the existing controller: - -
- -Example 7.4: Creating a custom controller for an existing module with an existing controller - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 
-4 require_once 'modules/<TheModule>/controller.php';
-5 
-6 class Custom<TheModule>Controller extends <TheModule>Controller
-7 {
-8 
-9 }
- -
- ------ - - -
-#### Adding the action #### - -Now we can add a new action to our controller. Actions are created as methods on the controller with the name action_<actionName>. For example, to create a new action called ‘echo’ we could create the following method in one of the controllers we have created above. This can then perform whatever logic that is needed. In our example we will log the REQUEST and simply redirect: - -
- -Example 7.5: Adding a custom controller action method - - ------ - -
- -
1 public function action_echo(){
-2   $GLOBALS['log']->debug("Echo called with request: ".print_r($_REQUEST,1));
-3   SugarApplication::redirect('index.php');
-4 }
- -
- ------ - - -
-#### Legacy Style #### - -In previous versions of SugarCRM a new action was added by creating a file in either modules/<TheModule>/<actionname>.php or custom/modules/<TheModule>/<actionname>.php. Although this still works it is not recommended. - - -
diff --git a/_source/output/chap08.md b/_source/output/chap08.md deleted file mode 100644 index deba157e8..000000000 --- a/_source/output/chap08.md +++ /dev/null @@ -1,141 +0,0 @@ ---- -layout: page -title: "Chapter 08" ---- - - -
- -## 8. Entry Points ## - -Entry points are simply a page which provides access to SuiteCRM. These can be used for a variety of purposes such as allowing an external form simple access to SuiteCRM or, as is the case with the stock Events module, allowing an event invite to be responded to by clicking a link in an email. - -### Creating an entry point ### - -Let’s create a simple entry point to display the time. First we define this entry point in a new file in: - -
- -Example 8.1: Entry point registry location - - ------ - -
- -
custom/Extension/application/Ext/EntryPointRegistry/
- -
- ------ - - -
-For our example we’ll call our new file MyTimeEntryPoint.php - -
- -Example 8.2: Example entry point location - - ------ - -
- -
custom/Extension/application/Ext/EntryPointRegistry/MyTimeEntryPoint.php
- -
- ------ - - -
-In this file we will add a new entry to the $entry_point_registry. We supply the file that should be called. Here we are simply placing the file in custom if the entry point is related to a specific module it is usually a good idea to place this somewhere inside custom/<TheModule>/. - -In addition we supply an “auth” parameter. If “auth” is true then anyone accessing the entry point will need to be logged into SuiteCRM. - -
- -Example 8.3: Adding an entry point entry - - ------ - -
- -
1 <?php
-2 	$entry_point_registry['MyTimeEntryPoint'] = array(
-3 	    'file' => 'custom/MyTimeEntryPoint.php',
-4 	    'auth' => true,
-5 	);
- -
- ------ - - -
-Finally we add the actual logic itself inside custom/MyTimeEntryPoint.php: - -
- -Example 8.4: Example entry point that outputs the current time - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 $date = new DateTime();
-4 echo $date->format('r');
- -
- ------ - - -
-After a Quick Repair and Rebuild we can access our entry point: - -
- -Example 8.5: Custom entry point URL - - ------ - -
- -
example.com/index.php?entryPoint=MyTimeEntryPoint
- -
- ------ - - -
-and we should see something similar to: - -
- -Example 8.6: MyTimeEntryPoint - - ------ - -
- -
Sun, 15 Mar 2015 13:03:03 +0000
- -
- ------ - - -
-Obviously this is a contrived example but any logic that can be performed elsewhere in SuiteCRM can be performed in an entry point (for example creating or editing [SugarBeans](#chap02.xhtml#working-with-beans-chapter)). - - -
diff --git a/_source/output/chap09.md b/_source/output/chap09.md deleted file mode 100644 index 2e9476538..000000000 --- a/_source/output/chap09.md +++ /dev/null @@ -1,285 +0,0 @@ ---- -layout: page -title: "Chapter 09" ---- - - -
- -## 9. Language Strings ## - -Language strings provide an element of internationalisation to SuiteCRM. It allows specifying different strings to be used in different languages making it much easier to provide translations for modules and customisations. Even if you are only targeting a single language it is still worth using the language string functionality in SuiteCRM because it allows the simple changing of strings within SuiteCRM and it also allows users to customise the labels used in your customisations. There are three main types of language strings that we will cover here. - -At the core, the language strings are a key value store. The keys are used throughout SuiteCRM and the values are loaded based on the current language. - -Languages are handled in SuiteCRM by prefixing the file name with the IETF language code for the language that this file contains. Here are some examples of different language file names: - -
- -Example 9.1: Example language file names - - ------ - -
- -
# Core Accounts language file for en_us (United States English)
-modules/Accounts/language/en_us.lang.php
-
-# Core Cases language file for es_es (Spanish as spoken in Spain)
-modules/Cases/language/es_es.lang.php
-
-# Custom language file for de_de (German)
-custom/Extension/application/Ext/Language/de_de.SomeCustomPackage.php
- -
- ------ - - -
-SuiteCRM will choose the language prefix to be used based on the language the user selected when logging in or the default language if none was selected. Generally when a language file is loaded the default language files and the en_us files will also be loaded. These files are then merged. This ensures that there will still be a definition if there are language keys in either en_us or the default language that don’t have definitions in the current language. In essence the language “falls back” to the default language and en_us if there are missing keys. - -### Module Strings ### - -#### Use #### - -Module strings are strings associated with a particular module. These are usually, for example, field labels and panel name labels, but they may be used for anything that is specific to a single module. - -#### Definition location #### - -Module strings are defined in the $mod_strings array. This is initially defined in
-modules/<TheModule>/language/<LanguageTag>.lang.php, for example
-modules/Accounts/language/en_us.lang.php. - -#### Customisation location #### - -Customisations can be made to the module strings by adding a new file in
-custom/Extension/modules/<TheModule>/Ext/Language/<LanguageTag>.<Name>.php (<Name> in this case should be used to give it a descriptive name). An example is custom/Extension/modules/Accounts/Ext/Language/en_us.MyLanguageFile.php. See the Extensions section for more information on the Extensions folder. - -### Application Strings ### - -#### Use #### - -Application strings are used for language strings and labels that are not specific to a single module. Examples of these may include labels that will appear in the headers or footers, labels that appear on search buttons throughout SuiteCRM or labels for pagination controls. - -#### Definition location #### - -The application strings are defined in the $app_strings array. This is initially defined in
-include/language/<LanguageTag>.lang.php. - -#### Customisation location #### - -Customisations can be made to the application strings in two ways. Firstly you can edit the file
-custom/include/language/<LanguageTag>.lang.php. However to promote modularity it is recommended that you add a new file in the location
-custom/Extension/application/Ext/Language/<LanguageTag>.<Name>.php. For example
-custom/Extension/application/Ext/Language/es_es.MyAppLanguageFile.php. <Name> should be used to give the file a descriptive name. See the Extensions section for more information on the Extensions folder. - -### Application List Strings ### - -#### Use #### - -Application list strings are used to store the various dropdowns and lists used in SuiteCRM. Most of these are used as options for the various enum fields in SuiteCRM e.g the account type or the opportunity sales stage. - -#### Definition location #### - -The application list strings are defined in the $app_list_strings array. Similar to the $app_strings array this is initially defined in include/language/en_us.lang.php. - -#### Customisation location #### - -Customisations can be made to the application list strings in two ways. Firstly you can edit the file
-custom/include/language/<LanguageTag>.lang.php. However to promote modularity it is recommended that you add a new file in the location
-custom/Extension/application/Ext/Language/<LanguageTag>.<Name>.php (<Name> should be used to give the file a descriptive name). For example
-custom/Extension/application/Ext/Language/es_es.MyAppListLanguageFile.php. See the Extensions section for more information on the Extensions folder. - -### Why and when to customise ### - -Generally language strings should be changed from within SuiteCRM using the studio tool. However there are times when it can be simpler to add or modify language strings as described in the previous section. If you are importing a large number of language strings or dropdown options it can be simpler to create a new file to add these values. Similarly if you are adding entirely new functionality, it is usually best to simply add these language strings as new values. - -### Usage ### - -Language strings are used automatically throughout SuiteCRM. For example in metadata you can specify the language strings to display for fields. However in some cases you will want to access and use the language strings in custom code. There are several ways to do this. - -#### Globals #### - -The $mod_strings, $app_strings and $app_list_strings variables are all global and can be accessed as such. $app_strings and $app_list_strings will always be available. However $mod_strings will only contain the strings for the current module (see the next section for other ways of accessing $mod_strings). - -
- -Example 9.2: Accessing language strings globally - - ------ - -
- -
 1 function someFunction(){
- 2     global $mod_strings, $app_strings, $app_list_strings;
- 3     /*
- 4      * Grab the label LBL_NAME for the current module
- 5      * In most modules this will be the label for the
- 6      * name field of the module.
- 7      */
- 8     $modLabel = $mod_strings['LBL_NAME'];
- 9 
-10     $appLabel = $app_strings['LBL_GENERATE_LETTER'];
-11 
-12     /*
-13      * Unlike the previous two examples $appListLabel will be an
-14      * array of the dropdowns keys to it's display labels.
-15      */
-16     $appListLabel = $app_list_strings['aos_quotes_type_dom'];
-17 
-18     //Here we just log out the strings
-19     $GLOBALS['log']->debug("The module label is $modLabel");
-20     $GLOBALS['log']->debug("The app label is $appLabel");
-21     $GLOBALS['log']->debug("The app list label is ".print_r($appListLabel,1));
-22 }
- -
- ------ - - -
-#### Translate #### - -As an alternative to using globals or, if you are in a different module than the language string you wish to retrieve you can use the translate method. - -
- -Example 9.3: translate method signature - - ------ - -
- -
1 translate(
-2         $string,
-3         $mod='',
-4         $selectedValue='')
- -
- ------ - - -
-; $string -: The language string to be translated. -; $mod -: The module this string should come from. Defaults to the current module if empty. -; $selectedValue -: For dropdown strings. This will return the label for the key $selectedValue - -Here is an example of the above in action. Note that we do not have to worry about whether the label is a Module string, an Application string or an Application list string, as all of these will be checked (in that order - the first matching value will be returned). - -
- -Example 9.4: Example translate method calls - - ------ - -
- -
 1 function someFunction(){
- 2   //Grab the label LBL_NAME for the current module
- 3   $modLabel = translate('LBL_NAME');
- 4 
- 5   //Grab the label LBL_NAME for the AOS_Products module
- 6   $productModLabel = translate('LBL_NAME','AOS_Products');
- 7 
- 8   $appLabel = translate('LBL_GENERATE_LETTER');
- 9 
-10   /*
-11    * Return the label for the `Other` option of the `aos_quotes_type_dom`
-12    * We don't care about the module so this is left blank.
-13    */
-14   $appListLabel = translate('aos_quotes_type_dom','','Other');
-15 
-16   //Here we just log out the strings
-17   $GLOBALS['log']->debug("The module label is $modLabel");
-18   $GLOBALS['log']->debug("The module label for Products is $productModLabel");
-19   $GLOBALS['log']->debug("The app label is $appLabel");
-20   $GLOBALS['log']->debug("The app list label is ".print_r($appListLabel,1));
-21 }
- -
- ------ - - -
-#### JavaScript #### - -Finally, you may be using JavaScript (for example in a view), and wish to display a language string. For this you can use the SUGAR.language.get method, which is similar to the translate method in example 9.3. - -
- -Example 9.5: SUGAR.language.get method signature - - ------ - -
- -
1 SUGAR.language.get(
-2               module,
-3               str
-4 );
- -
- ------ - - -
-; module -: The module a language string will be returned for. You should supply app_strings or
-app_list_strings if the label you wish to retrieve is not a module string. -; str -: The key you want to retrieve a label for. - -
- -Example 9.6: Example SUGAR.language.get method calls - - ------ - -
- -
 1 function someFunction(){
- 2 
- 3   /*
- 4    * Grab the label LBL_NAME for AOS_Products
- 5    * Note that, unlike the translate function in example 9.3
- 6    * the module name is required.
- 7    */
- 8 
- 9   var modLabel = SUGAR.language.get('AOS_Products', 'LBL_NAME');
-10 
-11   /*
-12    * As mentioned above we explicitly need to pass if we are retrieving
-13    * an app_string or app_list_string
-14    */
-15   var appLabel = SUGAR.language.get('app_strings', 'LBL_GENERATE_LETTER');
-16   var appListLabel = SUGAR.language.get('app_list_strings',
-17                                         'aos_quotes_type_dom');
-18 
-19   //Here we just log out the strings
-20   console.log("The module label is "+modLabel);
-21   console.log("The app label is "+appLabel);
-22   console.log("The app list label is "+appListLabel);
-23 }
- -
- ------ - - -
- -
diff --git a/_source/output/chap10.md b/_source/output/chap10.md deleted file mode 100644 index c6da00a7c..000000000 --- a/_source/output/chap10.md +++ /dev/null @@ -1,143 +0,0 @@ ---- -layout: page -title: "Chapter 10" ---- - - -
- -## 10. Config ## - -### The config files ### - -There are two main config files in SuiteCRM, both of which are in the root SuiteCRM folder. These are config.php and config_override.php. The definitions in here provide various configuration options for SuiteCRM. All the way from the details used to access the database to how many entries to show per page in the list view. Most of these options are accessible from the SuiteCRM administration page. However some are only definable in the config files. - -#### config.php #### - -This is the main SuiteCRM config file and includes important information like the database settings and the current SuiteCRM version. - -Generally settings in this file wont be changed by hand. An exception to this is if SuiteCRM has been moved or migrated. In which case you may need to change the database settings and the site_url. Let’s look at the database settings first: - -
- -Example 10.1: Database config definition - - ------ - -
- -
 1 'dbconfig' =>
- 2 array (
- 3   'db_host_name' => 'localhost',
- 4   'db_host_instance' => 'SQLEXPRESS',
- 5   'db_user_name' => 'dbuser',
- 6   'db_password' => 'dbpass',
- 7   'db_name' => 'dbname',
- 8   'db_type' => 'mysql',
- 9   'db_port' => '',
-10   'db_manager' => 'MysqliManager',
-11 ),
- -
- ------ - - -
-Here we can see this instance is setup to access a local MySQL instance using the username/password dbuser/dbpass and accessing the database named ‘dbname’. - -The site url settings are even simpler: - -
- -Example 10.2: Setting the site URL - - ------ - -
- -
  'site_url' => 'http://example.com/suitecrm',
- -
- ------ - - -
-The site url for the above is simply ‘http://example.com/suitecrm’ if we were moving this instance to, for example, suite.example.org, then we can simply place that value in the file. - -These are generally the only two instances where you would directly change config.php. For other changes you would either make the change through SuiteCRM itself or you would use the
-config_override.php file. - -#### config_override.php #### - -config_override.php allows you to make config changes without risking breaking the main config file. This is achieved quite simply by adding, editing or removing items from the $sugar_config variable. The config_override.php file will be merged with the existing config allowing, as the name suggests, overriding the config. For example in config_override.php we can add our own, new, config item: - -
- -Example 10.3: Adding a custom config value - - ------ - -
- -
$sugar_config['enable_the_awesome'] = true;
- -
- ------ - - -
-or we can edit an existing config option in a very similar manner by simply overwriting it: - -
- -Example 10.4: Overwriting an existing config value - - ------ - -
- -
$sugar_config['logger']['level'] = 'debug';
- -
- ------ - - -
-### Using config options ### - -We may want to access config options in custom code (or as detailed above if we have created our own config setting we may want to use that). We can easily get the config using the php global keyword: - -
- -Example 10.5: Accessing a config setting within SuiteCRM - - ------ - -
- -
1 function myCustomLogic(){
-2   //Get access to config
-3   global $sugar_config;
-4   //use the config values
-5   if(!empty($sugar_config['enable_the_awesome'])){
-6     doTheAwesome();
-7   }
-8 }
- -
- ------ - - -
- -
diff --git a/_source/output/chap11.md b/_source/output/chap11.md deleted file mode 100644 index bf9b7441d..000000000 --- a/_source/output/chap11.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -layout: page -title: "Chapter 11" ---- - - -
- -## 11. Logging ## - -### Logging messages ### - -Logging in SuiteCRM is achieved by accessing the log global. Accessing an instance of the logger is as simple as - -
- -Example 11.1: Accessing the log - - ------ - -
- -
$GLOBALS['log']
- -
- ------ - - -
-This can then be used to log a message. Each log level is available as a method. For example: - -
- -Example 11.2: Logging messages - - ------ - -
- -
1 $GLOBALS['log']->debug('This is a debug message');
-2 $GLOBALS['log']->error('This is an error message');
- -
- ------ - - -
-This will produce the following output: - -
- -Example 11.3: Logging messages example output - - ------ - -
- -
1 Tue Apr 28 16:52:21 2015 [15006][1][DEBUG] This is a debug message
-2 Tue Apr 28 16:52:21 2015 [15006][1][ERROR] This is an error message
- -
- ------ - - -
-### Logging output ### - -The logging output displays the following information by default: - -
- -Example 11.4: Logging messages example output - - ------ - -
- -
<Date> [<ProcessId>][<UserId>][<LogLevel>] <LogMessage>
- -
- ------ - - -
-; <Date> -: The date and time that the message was logged. -; <ProcessId> -: The PHP process id. -; <UserId> -: The ID of the user that is logged into SuiteCRM. -; <LogLevel> -: The log level for this log message. -; <LogMessage> -: The contents of the log message. - -### Log levels ### - -Depending on the level setting in admin some messages will not be added to the log e.g if your logger is set to error then you will only see log levels of error or higher (error, fatal and security). - -The default log levels (in order of verbosity) are: - -* debug -* info -* warn -* deprecated -* error -* fatal -* security - -Generally on a production instance you will use the less verbose levels (probably error or fatal). However whilst you are developing you can use whatever level you prefer. I prefer the most verbose level - debug. - - -
diff --git a/_source/output/chap12.md b/_source/output/chap12.md deleted file mode 100644 index 1a12b15dc..000000000 --- a/_source/output/chap12.md +++ /dev/null @@ -1,353 +0,0 @@ ---- -layout: page -title: "Chapter 12" ---- - - -
- -## 12. Logic Hooks ## - -### Intro ### - -Logic hooks allow you to hook into various events in SuiteCRM to fire custom code. This can allow you to, for example, make a call to an external API, or to create a new record if certain events occur. - -### Types ### - -Logic hooks can occur in three contexts. These contexts are Application Hooks, Module Hooks and User Hooks. These are detailed below. - -### Application Hooks ### - -Application hooks are hooks which are fired in the application context (that is, they are not fired against a particular module). These hooks must be defined in the top level logic hook (i.e. custom/modules/logic_hooks.php). - -; after_entry_point -: Called after SuiteCRM has initialised but before any other processing is carried out. -; after_ui_footer -: Called after the UI footer. -; after_ui_frame -: Fired after the UI has been displayed but before the footer has been displayed. -; server_round_trip -: Fired at the end of every page request. - -### User Hooks ### - -User hooks are fired for certain login/logout actions. Similar to Application Hooks, these hooks must be defined in the top level logic hook (i.e. custom/modules/logic_hooks.php). - -; after_login -: Fired after a user logs in to SuiteCRM . -; after_logout -: Fired when a user logs out of SuiteCRM. -; before_logout -: Fired before a user logs out of SuiteCRM. -; login_failed -: Fired when a user attempts to login to SuiteCRM but the login fails. - -### Module Hooks ### - -Module Hooks are called on various record actions for a specific module. - -; after_delete -: Fired when a record is deleted. -; after_relationship_add -: Fired after a relationship is added between two records. Note that this may be called twice, once for each side of the relationship. -; after_relationship_delete -: Fired after a relationship between two records is deleted. -; after_restore -: Fired after a record is undeleted. -; after_retrieve -: Fired after a record is retrieved from the DB. -; after_save -: Fired after a record is saved. Note that due to some peculiarities some related modules may not be persisted to the database. The logic hook is fired within the SugarBean classes save method. Some implementing classes may save related beans after this method returns. A notable example of this is the saving of email addresses in Company modules. -; before_delete -: Fired before a record is deleted. -; before_relationship_add -: Fired before a relationship is added between two records. Note that this may be called twice, once for each side of the relationship. -; before_relationship_delete -: Fired before a relationship between two records is deleted. Note that this may be called twice, once for each side of the relationship. -; before_restore -: Fired before a record is undeleted. -; before_save -: Fired before a record is saved. -; handle_exception -: Fired when an exception occurs in a record. -; process_record -: Fired when a record is processed ready to be displayed in list views or dashlets. - -### Job Queue Hooks ### - -Job queue hooks are fired for scheduler jobs. Similar to application hooks these hooks must be defined in the top level logic hook (i.e. custom/modules/logic_hooks.php). - -; job_failure -: Fired when a scheduled job either returns false to signify failure or throws an exception and it will not be retried. See the section on [Tasks](Scheduled)(#chap12.xhtml#scheduled-tasks-chapter). -; job_failure_retry -: Fired when a scheduled job either returns false to signify failure or throws an exception but it will be retried. See the section on [Tasks](Scheduled)(#chap12.xhtml#scheduled-tasks-chapter). - -### Implementing ### - -Depending on the Logic Hook type logic hooks are either placed into
-custom/modules/Logic_Hooks.php or custom/modules/<TargetModule>/Logic_Hooks.php. - -#### Logic_Hooks.php #### - -The logic hook file itself specifies which logic hooks to fire on this event. It looks something like this: - -
- -Example 12.1: Logic hook file - - ------ - -
- -
 1 <?php
- 2 // Do not store anything in this file that is not part of the array or the hook
- 3 //version.  This file will be automatically rebuilt in the future.
- 4  $hook_version = 1;
- 5 $hook_array = Array();
- 6 // position, file, function
- 7 $hook_array['before_save'] = Array();
- 8 $hook_array['before_save'][] = Array(
- 9                               77,
-10                               'updateGeocodeInfo',
-11                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-12                               'CasesJjwg_MapsLogicHook',
-13                               'updateGeocodeInfo');
-14 $hook_array['before_save'][] = Array(
-15                               10,
-16                               'Save case updates',
-17                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-18                               'CaseUpdatesHook',
-19                               'saveUpdate');
-20 $hook_array['before_save'][] = Array(
-21                               11,
-22                               'Save case events',
-23                               'modules/AOP_Case_Events/CaseEventsHook.php',
-24                               'CaseEventsHook',
-25                               'saveUpdate');
-26 $hook_array['before_save'][] = Array(
-27                               12,
-28                               'Case closure prep',
-29                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-30                               'CaseUpdatesHook',
-31                               'closureNotifyPrep');
-32 $hook_array['before_save'][] = Array(
-33                               1,
-34                               'Cases push feed',
-35                               'custom/modules/Cases/SugarFeeds/CaseFeed.php',
-36                               'CaseFeed',
-37                               'pushFeed');
-38 $hook_array['after_save'] = Array();
-39 $hook_array['after_save'][] = Array(
-40                               77,
-41                               'updateRelatedMeetingsGeocodeInfo',
-42                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-43                               'CasesJjwg_MapsLogicHook',
-44                               'updateRelatedMeetingsGeocodeInfo');
-45 $hook_array['after_save'][] = Array(
-46                               10,
-47                               'Send contact case closure email',
-48                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-49                               'CaseUpdatesHook',
-50                               'closureNotify');
-51 $hook_array['after_relationship_add'] = Array();
-52 $hook_array['after_relationship_add'][] = Array(
-53                               77,
-54                               'addRelationship',
-55                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-56                               'CasesJjwg_MapsLogicHook',
-57                               'addRelationship');
-58 $hook_array['after_relationship_add'][] = Array(
-59                               9,
-60                               'Assign account',
-61                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-62                               'CaseUpdatesHook',
-63                               'assignAccount');
-64 $hook_array['after_relationship_add'][] = Array(
-65                               10,
-66                               'Send contact case email',
-67                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-68                               'CaseUpdatesHook',
-69                               'creationNotify');
-70 $hook_array['after_relationship_delete'] = Array();
-71 $hook_array['after_relationship_delete'][] = Array(
-72                               77,
-73                               'deleteRelationship',
-74                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-75                               'CasesJjwg_MapsLogicHook',
-76                               'deleteRelationship');
- -
- ------ - - -
-Let’s go through each part of the file. - -
- -
- -
4 $hook_version = 1;
- -
- -
-This sets the hook version that we are using. Currently there is only one version so this line is unused. - -
- -
- -
5 $hook_array = Array();
- -
- -
-Here we set up an empty array for our Logic Hooks. This should always be called $hook_array. - -
- -
- -
7 $hook_array['before_save'] = Array();
- -
- -
-Here we are going to be adding some before_save hooks so we add an empty array for that key. - -
- -
- -
 8 $hook_array['before_save'][] = Array(
- 9                               77,
-10                               'updateGeocodeInfo',
-11                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-12                               'CasesJjwg_MapsLogicHook',
-13                               'updateGeocodeInfo');
- -
- -
-Finally we reach an interesting line. This adds a new logic hook to the before_save hooks. This array contains 5 entries which define this hook. These are: - -##### Sort order ##### - -The first argument (77) is the sort order for this hook. The logic hook array is sorted by this value. If you wish for a hook to fire earlier you should use a lower number. If you wish for a hook to be fired later you should use a higher number. The numbers themselves are arbitrary. - -##### Hook label ##### - -The second argument (‘updateGeocodeInfo’) is simply a label for the logic hook. This should be something short but descriptive. - -##### Hook file ##### - -The third argument is where the actual class for this hook is. In this case it is in a file called custom/modules/Cases/CasesJjwg_MapsLogicHook.php. Generally you will want the files to be somewhere in custom and it is usual to have them in custom/modules/<TheModule>/<SomeDescriptiveName>.php or custom/modules/<SomeDescriptiveName>.php for Logic Hooks not targeting a specific module. However the files can be placed anywhere. - -##### Hook class ##### - -The fourth argument is the class name for the Logic Hook class. In this case
-CasesJjwg_MapsLogicHook. It is usual for the class name to match the file name but this is not required. - -##### Hook method ##### - -The fifth, and final, argument is the method that will be called on the class. In this case updateGeocodeInfo. - -#### Adding your own logic hooks #### - -When adding logic hooks you should make full use of the Extensions framework (see the section on Extensions). This involves creating a file in
-custom/Extension/application/Ext/LogicHooks/ for application hooks and
-custom/Extension/modules/<TheModule>/Ext/LogicHooks/ for module specific hooks. These files can then add to/alter the $hook_array as appropriate. - -{| -|width="50%"| [50px|class=sidebar-image|information](File:images/leanpub_info-circle.png) -|width="50%"| After adding a new logic hook it is necessary to perform a quick repair and rebuild in the admin menu for this to be picked up. -|} - -#### Logic Hook function #### - -The logic hook function itself will vary slightly based on the logic hook type. For module hooks it will appear similar to: - -
- -Example 12.2: Example logic hook method - - ------ - -
- -
1     class SomeClass
-2     {
-3         function someMethod($bean, $event, $arguments)
-4         {
-5           //Custom Logic
-6         }
-7     }
- -
- ------ - - -
-Application logic hooks omit the $bean argument: - -
- -Example 12.3: Example logic hook method for application hooks - - ------ - -
- -
1     class SomeClass
-2     {
-3         function someMethod($event, $arguments)
-4         {
-5           //Custom Logic
-6         }
-7     }
- -
- ------ - - -
-##### $bean (SugarBean) ##### - -The $bean argument passed to your logic hook is usually the bean that the logic hook is being performed on. For User Logic Hooks this will be the current User object. For module logic hooks (such as before_save) this will be the record that is being saved. For job queue logic hooks this will be the SchedulersJob bean. Note that for Application Logic Hook this argument is not present. - -##### $event (string) ##### - -The $event argument contains the logic hook event e.g process_record, before_save,
-after_delete etc. - -##### $arguments (array) ##### - -The $arguments argument contains any additional details of the logic hook event. I.e. in the case of before_relationship_add this will contain details of the related modules. - -### Tips ### - -{| -|width="50%"| [50px|class=sidebar-image|information](File:images/leanpub_info-circle.png) -|width="50%"| -#### Triggering extra logic hooks #### - -If you are performing certain actions that may trigger another logic hook (such as saving a bean) then you need to be aware that this will trigger the logic hooks associated with that bean and action. This can be troublesome if this causes a logic hook loop of saves causing further saves. One way around this is to simply be careful of the hooks that you may trigger. If doing so is unavoidable you can usually set an appropriate flag on the bean and then check for that flag in subsequent hooks. -|} - -{| -|width="50%"| [50px|class=sidebar-image|information](File:images/leanpub_info-circle.png) -|width="50%"| -#### Think of the user #### - -Most logic hooks will cause additional code which can degrade the users experience. If you have long running code in the after_save the user will need to wait for that code to run. This can be avoided by either ensuring the code runs quickly or by using the Job Queue (see the Job Queue chapter for more information). -|} - - -
diff --git a/_source/output/chap13.md b/_source/output/chap13.md deleted file mode 100644 index 988cb80a9..000000000 --- a/_source/output/chap13.md +++ /dev/null @@ -1,422 +0,0 @@ ---- -layout: page -title: "Chapter 13" ---- - - -
- -## 13. Scheduled Tasks ## - -### Intro ### - -Scheduled tasks are performed in SuiteCRM by the scheduler module. Jobs are placed into the queue either through the defined scheduled tasks or, for one off tasks, by code creating job objects. Note that both scheduled tasks and using the job queue requires that you have the schedulers set up. This will vary depending on your system but usually requires adding an entry either to Cron (for Linux systems) or to the windows scheduled tasks (for windows). Opening the scheduled tasks page within SuiteCRM will let you know the format for the entry. - -### Scheduler ### - -Scheduled tasks allow SuiteCRM to perform recurring tasks. Examples of these which ship with SuiteCRM include checking for incoming mail, sending email reminder notifications and indexing the full text search. What if you want to create your own tasks? - -SuiteCRM lets you define your own Scheduler. We do this by creating a file in
-custom/Extension/modules/Schedulers/Ext/ScheduledTasks/. You can give this file a name of your choice but it is more helpful to give it a descriptive name. Let’s create a simple file named
-custom/Extension/modules/Schedulers/Ext/ScheduledTasks/CleanMeetingsScheduler.php. This will add a new job to the job strings and a new method that the scheduler will call: - -
- -Example 13.1: Example Clean Meetings Scheduler - - ------ - -
- -
 1 <?php
- 2 /*
- 3  * We add the method name to the $job_strings array.
- 4  * This is the method that jobs for this scheduler will call.
- 5  */
- 6 $job_strings[] = 'cleanMeetingsScheduler';
- 7 
- 8 /**
- 9  * Example scheduled job to change any 'Planned' meetings older than a month
-10  * to 'Not Held'.
-11  * @return bool
-12  */
-13 function cleanMeetingsScheduler(){
-14   //Get the cutoff date for which meetings will be considered
-15 	$cutOff = new DateTime('now - 1 month');
-16 	$cutOff = $cutOff->format('Y-m-d H:i:s');
-17 
-18 	//Get an instance of the meetings bean for querying
-19   //see the Working With Beans chapter.
-20   $bean = BeanFactory::getBean('Meetings');
-21 
-22   //Get the list of meetings older than the cutoff that are marked as Planned
-23   $query = "meetings.date_start < '$cutOff' AND meetings.status = 'Planned'";
-24   $meetings = $bean->get_full_list('',$query);
-25 
-26   foreach($meetings as $meeting){
-27     //Mark each meeting as Not Held
-28     $meeting->status = 'Not Held';
-29     //Save the meeting changes
-30     $meeting->save();
-31   }
-32   //Signify we have successfully ran
-33   return true;
-34 }
- -
- ------ - - -
-We also make sure that we add a language file in
-custom/Extension/modules/Schedulers/Ext/Language/en_us.cleanMeetingsScheduler.php again, the name of the file doesn’t matter but it is helpful to use something descriptive. This will define the language string for our job so the user sees a nice label. See the section on language strings for more information. The key for the mod strings will be LBL_UPPERMETHODNAME. In our case our method name is cleanMeetingsScheduler so our language label key will be LBL_CLEANMEETINGSSCHEDULER. - -
- -Example 13.2: Example Language string for Clean Meetings Scheduler - - ------ - -
- -
1 <?php
-2 //We add the mod string for our method here.
-3 $mod_strings['LBL_CLEANMEETINGSSCHEDULER'] = 'Mark old, planned meetings as Not \
-4 Held';
- -
- ------ - - -
-If we perform a repair and rebuild our method will now be packaged up into the scheduler ext file (see the Extensions section for more information on this process) and will be available in the schedulers page. Note that for any changes to the scheduler method you will need to perform another quick repair and rebuild - even in developer mode. We can now create a new scheduler to call our new method: - -
- -[a scheduler that uses our new method](Creating)(File:images/CreateMeetingsScheduler.png) -Creating a scheduler that uses our new method - - -
-This will now behave just like any other scheduler and we can have this run as often (or as rarely) as we would like. Take care here. The default frequency is every one minute. If your task is heavy duty or long running this may not be what you would prefer. Here we settle for once a day. - -### Job Queue ### - -Sometimes you will require code to perform a long running task but you do not need the user to wait for this to be completed. A good example of this is sending an email in a logic hook (see the Logic Hooks chapter for information on these). Assuming we have the following logic hook: - -
- -Example 13.3: Example Email sending Logic Hook - - ------ - -
- -
 1 class SomeClass
- 2 {
- 3     function SomeMethod($bean, $event, $arguments)
- 4     {
- 5 
- 6         //Perform some setup of the email class
- 7         require_once "include/SugarPHPMailer.php";
- 8         $mailer=new SugarPHPMailer();
- 9         $admin = new Administration();
-10         $admin->retrieveSettings();
-11         $mailer->prepForOutbound();
-12         $mailer->setMailerForSystem();
-13         $admin = new Administration();
-14         $admin->retrieveSettings();
-15         $admin->settings['notify_fromname']
-16         $mailer->From     = $admin->settings['notify_fromaddress']
-17         $mailer->FromName = $emailSettings['from_name'];
-18         $mailer->IsHTML(true);
-19 
-20         //Add message and recipient.
-21         //We could go all out here and load and populate an email template
-22         //or get the email address from the bean
-23         $mailer->Subject = 'My Email Notification! '.$bean->name;
-24         $mailer->Body = $event. ' fired for bean '.$bean->name;
-25         $mailer->AddAddress('Jim@example.com');
-26         return $mailer->Send();
-27     }
-28 }
- -
- ------ - - -
-This will work fine. However you do not want the user to have to wait for the email to be sent out as this can cause the UI to feel sluggish. Instead you can create a Job and place it into the job queue and this will be picked by the scheduler. Let’s look at an example of how you would do this. - -First we want our Logic Hook class to create the scheduled job: - -
- -Example 13.4: Example Scheduled Job Creation - - ------ - -
- -
 1 class SomeClass
- 2 {
- 3     function SomeMethod($bean, $event, $arguments)
- 4     {
- 5       require_once 'include/SugarQueue/SugarJobQueue.php';
- 6       $scheduledJob = new SchedulersJob();
- 7 
- 8       //Give it a useful name
- 9       $scheduledJob->name = "Email job for {$bean->module_name} {$bean->id}";
-10 
-11       //Jobs need an assigned user in order to run. You can use the id
-12       //of the current user if you wish, grab the assigned user from the
-13       //current bean or anything you like.
-14       //Here we use the default admin user id for simplicity
-15       $scheduledJob->assigned_user_id = '1';
-16 
-17       //Pass the information that our Email job will need
-18       $scheduledJob->data = json_encode(array(
-19                                             'id' => $bean->id,
-20                                             'module' => $bean->module_name)
-21                                         );
-22 
-23       //Tell the scheduler what class to use
-24       $scheduledJob->target = "class::BeanEmailJob";
-25 
-26       $queue = new SugarJobQueue();
-27       $queue->submitJob($scheduledJob);
-28     }
-29 }
- -
- ------ - - -
-Next we create the BeanEmailJob class. This is placed into the
-custom/Extensions/modules/Schedulers/Ext/ScheduledTasks/ directory with the same name as the class. So in our example we will have:
-custom/Extensions/modules/Schedulers/Ext/ScheduledTasks/BeanEmailJob.php - -
- -Example 13.5: Example Scheduler job - - ------ - -
- -
 1 class BeanEmailJob implements RunnableSchedulerJob
- 2 {
- 3   public function run($arguments)
- 4   {
- 5 
- 6     //Only different part of the email code.
- 7     //We grab the bean using the supplied arguments.
- 8     $arguments = json_decode($arguments,1);
- 9     $bean = BeanFactory::getBean($arguments['module'],$arguments['id']);
-10 
-11     //Perform some setup of the email class
-12     require_once "include/SugarPHPMailer.php";
-13     $mailer=new SugarPHPMailer();
-14     $admin = new Administration();
-15     $admin->retrieveSettings();
-16     $mailer->prepForOutbound();
-17     $mailer->setMailerForSystem();
-18     $admin = new Administration();
-19     $admin->retrieveSettings();
-20     $mailer->From     = $admin->settings['notify_fromaddress'];
-21     $mailer->FromName = $emailSettings['from_name'];
-22     $mailer->IsHTML(true);
-23 
-24     //Add message and recipient.
-25     //We could go all out here and load and populate an email template
-26     //or get the email address from the bean
-27     $mailer->Subject = 'My Email Notification! '.$bean->name;
-28     $mailer->Body = $event. ' fired for bean '.$bean->name;
-29     $mailer->AddAddress('Jim@example.com');
-30     return $mailer->Send();
-31   }
-32   public function setJob(SchedulersJob $job)
-33   {
-34     $this->job = $job;
-35   }
-36 }
- -
- ------ - - -
-Now whenever a user triggers the hook it will be much quicker since we are simply persisting a little info to the database. The scheduler will run this in the background. - -#### Retries #### - -Occasionally you may have scheduled jobs which could fail intermittently. Perhaps you have a job which calls an external API. If the API is unavailable it would be unfortunate if the job failed and was never retried. Fortunately the SchedulersJob class has two properties which govern how retries are handled. These are requeue and retry_count. - -; requeue -: Signifies that this job is eligible for retries. -; retry_count -: Signifies how many retries remain for this job. If the job fails this value will be decremented. - -We can revisit our previous example and add two retries: - -
- -Example 13.6: Setting the retry count on a scheduled job - - ------ - -
- -
 6       $scheduledJob = new SchedulersJob();
- 7 
- 8       //Give it a useful name
- 9       $scheduledJob->name = "Email job for {$bean->module_name} {$bean->id}";
-10 
-11       //Jobs need an assigned user in order to run. You can use the id
-12       //of the current user if you wish, grab the assigned user from the
-13       //current bean or anything you like.
-14       //Here we use the default admin user id for simplicity
-15       $scheduledJob->assigned_user_id = '1';
-16 
-17       //Pass the information that our Email job will need
-18       $scheduledJob->data = json_encode(array(
-19                                             'id' => $bean->id,
-20                                             'module' => $bean->module_name)
-21                                         );
-22 
-23       //Tell the scheduler what class to use
-24       $scheduledJob->target = "class::BeanEmailJob";
-25 
-26       //Mark this job for 2 retries.
-27       $scheduledJob->requeue = true;
-28       $scheduledJob->retry = 2;
- -
- ------ - - -
-See the section on [hooks](logic)(#chap11.xhtml#logic-hooks-chapter) for more information on how job failures can be handled. - -### Debugging ### - -With Scheduled tasks and jobs running in the background it can sometimes be difficult to determine what is going on when things go wrong. If you are debugging a scheduled task the the scheduled task page is a good place to start. For both scheduled tasks and job queue tasks you can also check the job_queue table. For example, in MySQL we can check the last five scheduled jobs: - -
- -Example 13.7: Example MySQL query for listing jobs - - ------ - -
- -
SELECT * FROM job_queue ORDER BY date_entered DESC LIMIT 5
- -
- ------ - - -
-This will give us information on the last five jobs. Alternatively we can check on specific jobs: - -
- -Example 13.8: Example MySQL query for listing BeanEmailJobs - - ------ - -
- -
SELECT * FROM job_queue WHERE target = 'class::BeanEmailJob'
- -
- ------ - - -
-In either case this will give details for the job(s): - -
- -Example 13.9: Example MySQL list of jobs - - ------ - -
- -
*************************** 1. row ***************************
-assigned_user_id: 1
-              id: 6cdf13d5-55e9-946e-9c98-55044c5cecee
-            name: Email job for Accounts 103c4c9b-336f-0e87-782e-5501defb5900
-         deleted: 0
-    date_entered: 2015-03-14 14:58:15
-   date_modified: 2015-03-14 14:58:25
-    scheduler_id:
-    execute_time: 2015-03-14 14:58:00
-          status: done
-      resolution: success
-         message: NULL
-          target: class::BeanEmailJob
-            data: {"id":"103c4c9b-336f-0e87-782e-5501defb5900","module":"Account\
-s"}
-         requeue: 0
-     retry_count: NULL
-   failure_count: NULL
-       job_delay: 0
-          client: CRON3b06401793b3975cd00c0447c071ef9a:7781
-percent_complete: NULL
-1 row in set (0.00 sec)
- -
- ------ - - -
-Here we can check the status, resolution and message fields. If the status is queued then either the scheduler has not yet run or it isn’t running. Double check your Cron settings if this is the case. - -It may be the case that the job has ran but failed for some reason. In this case you will receive a message telling you to check the logs. Checking the logs usually provides enough information, particularly if you have made judicious use of logging (see the chapter on logging) in your job. - -It is possible that the job is failing outright, in which case your logging may not receive output before the scheduler exits. In this case you can usually check your PHP logs. - -As a last resort you can manually run the scheduler from the SuiteCRM directory using: - -
- -Example 13.10: Running the scheduler manually - - ------ - -
- -
php -f cron.php
- -
- ------ - - -
-Using this in addition to outputting any useful information should track down even the oddest of bugs. - - -
diff --git a/_source/output/chap14.md b/_source/output/chap14.md deleted file mode 100644 index bb6a5785d..000000000 --- a/_source/output/chap14.md +++ /dev/null @@ -1,157 +0,0 @@ ---- -layout: page -title: "Chapter 14" ---- - - -
- -## 14. Extension Framework ## - -### Introduction ### - -The extension framework provides a means to modify various application data inside SuiteCRM. For example it provides a way to add or modify vardefs, scheduled tasks, language strings and more. In general a folder is provided in custom/Extension (the exact path depends on the extension). This folder is then scanned for files which will be consolidated into a single ext file which SuiteCRM will then read and use. In this way it is possible for developers to add a new file to affect the behaviour of SuiteCRM rather than altering existing files. This makes the changes more modular and allows the easy addition or removal of changes. Additionally, because these files are all consolidated it means that there is no affect on performance of checking a (possibly large) number of files. This is only done when performing a repair and rebuild in the admin menu. - -### Standard Extensions ### - -List of standard SuiteCRM extensions - -{| -! Extension Directory -! Compiled file -! Module -! Description -|- -| ActionViewMap -| action_view_map.ext.php -|   -| Used to map actions for a module to a specified view. -|- -| ActionFileMap -| action_file_map.ext.php -|   -| Used to map actions for a module to a specified file. -|- -| ActionReMap -| action_remap.ext.php -|   -| Used to map actions for a module to existing actions. -|- -| Administration -| administration.ext.php -| Administration -| Used to add new sections to the administration panel. -|- -| EntryPointRegistry -| entry_point_registry.ext.php -| application -| Used to add new entry points to SuiteCRM. See the chapter on [Points](Entry)(#chap07.xhtml#entry-point-chapter). -|- -| Extensions -| extensions.ext.php -| application -| Used to add new extension types. -|- -| FileAccessControlMap -| file_access_control_map.ext.php -|   -| Used to add, update or delete entries in the access control lists for files. -|- -| Language -| N/A[1](#chap13.xhtml#fn-langNote) -|   -| Used to add, update or delete language strings for both modules and app strings. See the chapter on [Strings](Language)(#chap08.xhtml#language-chapter). -|- -| Layoutdefs -| layoutdefs.ext.php -|   -| Used to add, update or delete subpanel definitions for a module. -|- -| GlobalLinks -| links.ext.php -| application -| Used to add, update or delete global links (the list of links that appear in the top right of the SuiteCRM UI). -|- -| LogicHooks -| logichooks.ext.php -|   -| Used to add, update or delete logic hooks. See the chapter on [Hooks](Logic)(#chap11.xhtml#logic-hooks-chapter). -|- -| Include -| modules.ext.php -| application -| Used to register new beans and modules. -|- -| Menus -| menu.ext.php -|   -| Used to add, update or delete the menu links for each module. -|- -| ScheduledTasks -| scheduledtasks.ext.php -| Schedulers -| Used to add new scheduled tasks. See the chapter on [Tasks](Scheduled)(#chap12.xhtml#scheduled-tasks-chapter). -|- -| UserPage -| userpage.ext.php -| Users -| Unused -|- -| Utils -| custom_utils.ext.php -| application -| Used to add new utility methods. -|- -| Vardefs -| vardefs.ext.php -|   -| Used to add, update or delete vardefs for a module. See the section on [Vardefs](#chap03.xhtml#vardefs-chapter). -|- -| JSGroupings -| jsgroups.ext.php -|   -| Used to add, update or delete JavaScript groupings. -|- -| Actions -| actions.ext.php -| AOW_Actions -| Used to add new WorkFlow actions. -|} - -### Custom Extensions ### - -Interestingly the extension framework can be used to add new extensions. This allows you to create customisations that are easily customised by others (in a similar manner to, for example, how vardefs can be added - see the chapter on [Vardefs](#chap03.xhtml#vardefs-chapter)). - -To create a custom extension you simply add a new file in
-custom/Extension/application/Ext/Extensions. This can be given a name of your choosing. Our example will use
-custom/Extension/application/Ext/Extensions/SportsList.php and will look like: - -
- -Example 14.1: Adding an entry point entry - - ------ - -
- -
1 <?php
-2 $extensions["sports_list"] =  array(
-3                 "section" => "sports_list",
-4                 "extdir" => "SportsList",
-5                 "file" => 'sportslist.ext.php',
-6                 "module" => "");
- -
- ------ - - -
-Now when a Quick Repair and rebuild is run any files in
-custom/Extension/application/Ext/SportsList/ will be consolidated into
-custom/application/Ext/SportsList/sportslist.ext.php. On it’s own this file will not do anything but you are now able to write custom code that checks the consolidated file rather than having to worry about searching for customisations. - -
- -
    diff --git a/_source/output/chap15.md b/_source/output/chap15.md deleted file mode 100644 index 15b4fb957..000000000 --- a/_source/output/chap15.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -layout: page -title: "Chapter 15" ---- -
  1. - - - -
    -The language extensions are treated specially and, as such, aren’t compiled to a single file.[↩](#chap13.xhtml#fnref-langNote)
- - -
- -
diff --git a/_source/output/chap16.md b/_source/output/chap16.md deleted file mode 100644 index 55e93454c..000000000 --- a/_source/output/chap16.md +++ /dev/null @@ -1,428 +0,0 @@ ---- -layout: page -title: "Chapter 16" ---- - - -
- -## 15. Module Installer ## - -As detailed in the other chapters of this book there are many ways to customise SuiteCRM. The module installer allows you to package these changes and install them onto other SuiteCRM instances. This is achieved by creating a package. - -At the minimum a package is a zip file that contains a manifest.php file in it’s root. The manifest file is responsible for providing information about the installer as well as providing information on how to install the package. - -### manifest.php ### - -The manifest.php file contains the definition of three arrays. Let’s look at each of these arrays in turn. See [A](Appendix)(#chap19.xhtml#appendix-a) for the full sample manifest.php file. - -{| -|width="50%"| [50px|class=sidebar-image|information](File:images/leanpub_info-circle.png) -|width="50%"| Within path in the manifest file you can use <basepath> to refer to the base directory of the installer. For example <basepath>/Foo.txt will refer to the Foo.txt file in the root of the installer package. -|} - -#### $manifest #### - -The $manifest array provides information on the package itself such as it’s name, readme etc. (it also defines the copy array for patch packages). A sample definition of the manifest array will appear something like this: - -
- -Example 15.1: Example $manifest array definition - - ------ - -
- -
 1 $manifest = array(
- 2   'name' => 'My First Package',
- 3   'description' => 'This is a simple package example manifest file',
- 4   'version' => '1.5',
- 5   'author' => 'Jim Mackin',
- 6   'readme' => 'readme.txt',
- 7   'acceptable_sugar_flavors' => array('CE'),
- 8   'acceptable_sugar_versions' => array(
- 9     'exact_matches' => array(),
-10     'regex_matches' => array('6\\.5\\.[0-9]$'),
-11   ),
-12   'copy_files' => array (
-13     'from_dir' => '<basepath>/custom/',    
-14     'to_dir' => 'custom',     
-15     'force_copy' => array (),
-16   ),
-17   'dependencies' => array(
-18     array(
-19       'id_name' => 'example_dependency_package',
-20       'version' => '2.4',
-21     ),
-22   ),
-23 );
- -
- ------ - - -
-; name -: The name of the package. This is how the package will appear to the user during installation and in the Module Loader package list. The package name is required. -; description -: A brief description of the package. -; version -: The version of this package. This can be any string but is usually a traditional version number (such as 3.1.4). -; author -: The author of the package. -; readme -: A brief readme string. Note that if a README.txt is found in the root of the package this will be used instead. -; acceptable_sugar_flavors -: A remnant of the SugarCRM packages. This should always be an array with (at least) a CE entry. If you would like the installer to target both SuiteCRM and SugarCRM editions then this can contain one of the other SugarCRM flavours (PRO, CORP , ULT or ENT). -; acceptable_sugar_versions -: An array detailing the matching SugarCRM versions. Note that the SugarCRM version is distinct from the SuiteCRM version. This array has two keys. exact_matches is simply an array of the allowed versions. regex_matches allows specifying regexes to match versions. For SuiteCRM you only need to worry about supporting the 6.5.* versions which can be matched with the regex 6\\.5\\.[0-9]$. At the time of writing the current SugarCRM version for SuiteCRM is 6.5.20. -; copy_files -: This is only used for patch installers and will copy files in the from_dir key to those in the to_dir key. Finally the force_copy key can be used to specify files that should be forcibly copied over. -; dependencies -: An array of other packages that are relied on by this package. Each entry is an array with id_name - the id of the package and version - the required version of the package. -; icon -: The path (within the installer) to an icon to be displayed during installation. -; is_uninstallable -: Whether or not uninstalls should be allowed. -; published_date -: The date that the package was published. There is no fixed format for the date, it is simply a string. -; key -: Specifies a key to ensure that modules do not clash. This will prefix the installed modules and tables with key. This is used by the module builder when creating packages but can be specified if you wish. -; remove_tables -: A string specifying whether module tables should be removed when uninstalling this package. Accepted values are true, false and prompt. The default is true. -; type -: The type of the installer, one of langpack, module, patch or theme. See the types section. - -#### $install_defs #### - -Provides information on how the package is to be installed, which files go where and any additional information such as logic hooks, custom fields etc. - -##### id ##### - -A unique identifier for the module. - -##### connectors ##### - -An array of connectors to be installed. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| name -| The name of the connector. -|- -| connector -| The directory to copy the connector files from. -|- -| formatter -| The directory to copy the connector formatter files from. -|} - -##### copy ##### - -An array of files and directories to be copied on install. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| from -| The source file/directory in the package. -|- -| to -| The destination file/directory. -|} - -{| -|width="50%"| [50px|class=sidebar-image|information](File:images/leanpub_info-circle.png) -|width="50%"| In general if a file can be handled by one of the other keys then that key should be used. For example new admin entries should be copied using the administration key rather than using the copy key. -|} - -##### dashlets ##### - -An array of dashlets to be installed. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| name -| The name of the new dashlet. -|- -| from -| The path in the install package from which the dashlet files will be copied. -|} - -##### language ##### - -An array of language files to be installed. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| from -| The location of the language file inside the package. -|- -| to_module -| The module this language file is intended for (or ‘application’ for application language strings). -|- -| language -| The language that this file is for (i.e. en_us or es_es). -|} - -See the chapter on [Strings](Language)(#chap08.xhtml#language-chapter) for more information. - -##### layoutdefs ##### - -An array of layoutdef files which are used to add, remove or edit subpanels. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| from -| The path in the package to the file to be installed. -|- -| to_module -| The module that this file will be installed to. -|} - -##### vardefs ##### - -An array of the vardefs to be added to specific modules. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| from -| The location of the vardef file in the package. -|- -| to_module -| The destination module. -|} - -{| -|width="50%"| [50px|class=sidebar-image|information](File:images/leanpub_info-circle.png) -|width="50%"| Generally you should install custom fields using the custom_fields key. However this key can be used to alter existing fields or add more complex fields. -|} - -##### menu ##### - -An array of menus to be installed. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| from -| The location of the menu file in the package. -|- -| to_module -| The destination module for this menu. -|} - -##### beans ##### - -An array of beans to be installed. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| module -| The name of the module. -|- -| class -| The name of the bean class. -|- -| path -| The path (within the package) to the bean file. -|- -| tab -| Whether or not a tab should be added for this module. -|} - -##### relationships ##### - -An array detailing any new relationships added (in particular relationships where one side is an existing module). Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| module -| The module that this relationship will be attached to. -|- -| meta_data -| The location of the metadata file for this relationship. -|} - -##### custom_fields ##### - -An array of new custom fields to be installed (See the [Vardefs](#chap03.xhtml#vardefs-chapter) chapter for more information on this). Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| name -| The name of the new custom field. -|- -| label -| The key for the language string which will act as the label for this custom field. -|- -| type -| The type of this custom field. -|- -| max_size -| For string field types, the maximum number of characters. -|- -| require_option -| Whether or not the field is required. -|- -| default_value -| The default value of this field. -|- -| ext1 -| Extended field information. Different field types will use this value differently. For example Enum fields will store the key for the options in this field, decimal and float fields will store the precision. -|- -| ext2 -| Extended field information. Different field types will use this value differently. For example, dynamic dropdowns will store the parent dropdown, text areas will store the number of rows. -|- -| ext3 -| Extended field information. Different field types will use this value differently. For example, text areas will store the number of columns. -|- -| ext4 -| Extended field information. Different field types will use this value differently. For HTML field types this will store the HTML. -|- -| audited -| Whether or not changes to this field should be audited. -|- -| module -| Used to specify the module where the custom field will be added. -|} - -##### logic_hooks ##### - -An array of logic hooks to be installed. See the [Hooks](Logic)(#chap11.xhtml#logic-hooks-chapter) chapter for more information. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| module -| The module to where this logic hook should be installed. Leaving this empty will install into the top level logic hook. -|- -| hook -| The logic hook type (i.e. after_save, after_login, etc.). -|- -| order -| The sort order for this logic hook. -|- -| description -| A description of the hook. -|- -| file -| The file containing the class for this logic hook, relative to the SuiteCRM root. -|- -| class -| The class that contains the logic hook function that should be called by this hook. -|- -| function -| The function to be invoked when this hook is triggered. -|} - -##### image_dir ##### - -A path to a directory of images to be included in the install. - -##### schedulers ##### - -An array of schedulers to be installed. Each entry is an array with a single key: - -{| -! Key -! Description -|- -| from -| The file containing the new scheduled task. -|} - -##### administration ##### - -An array of admin panels to be installed. Each entry is an array with a single key: - -{| -! Key -! Description -|- -| from -| The file containing the new admin panel definition. -|} - -##### pre_execute ##### - -Defines an array of files to be executed before the package is installed. Each entry is a path to a file within the package. Any output will be displayed to the user in the install log. - -##### post_execute ##### - -Defines an array of files to be executed after the package is installed. Each entry is a path to a file within the package. Any output will be displayed to the user in the install log. - -##### pre_uninstall ##### - -Defines an array of files to be executed before the package is uninstalled. Each entry is a path to a file within the package. Any output will be displayed to the user in the uninstall log. - -##### post_uninstall ##### - -Defines an array of files to be executed after the package is uninstalled. Each entry is a path to a file within the package. Any output will be displayed to the user in the uninstall log. - -#### $upgrade_manifest #### - -Provides a means of upgrading an already installed package by providing different install_defs. - -
- - - -
-### Types ### - -{| -! Type -! Description -|- -| langpack -| A language installer. This will add an entry to the language dropdown. -|- -| module -| A module installer. Will install new modules and/or functionality. -|- -| patch -| A patch installer. This is used to upgrade SuiteCRM. -|- -| theme -| A theme installer. This will add a new option to the themes. -|} - -#### Other files #### - -; README.txt -: Contains the readme for this package. If README.txt and a readme entry in the manifest.php is defined then this file will be used. -; LICENSE.txt -: Provides information on the license for this package. -; scripts/pre_install.php -: A PHP script which defines a method pre_install(). This method will be called before the package is installed. Any output will be displayed to the user in the install log. -; scripts/post_install.php -: A PHP script which defines a method post_install(). This method will be called after the package is installed. -; scripts/pre_uninstall.php -: A PHP script which defines a method pre_uninstall(). This method will be called before the package is uninstalled. -; scripts/post_uninstall.php -: A PHP script which defines a method post_uninstall(). This method will be called after the package is uninstalled. - - -
diff --git a/_source/output/chap17.md b/_source/output/chap17.md deleted file mode 100644 index e272a8a6a..000000000 --- a/_source/output/chap17.md +++ /dev/null @@ -1,418 +0,0 @@ ---- -layout: page -title: "Chapter 17" ---- - - -
- -## 16. API ## - -The SuiteCRM API allows third party code to access and edit SuiteCRM data and functionality. - -### Using the API ### - -SuiteCRM has both a REST and a SOAP API. Which API you want to use will largely come down to personal preference and the support for SOAP/REST libraries in whichever language you will be using. - -Both APIs will require a username and password. It is usual to create a user specifically for the API. - -#### SOAP #### - -The WSDL for the SOAP API can be found at: - -
- -Example 16.1: SOAP API WSDL Location - - ------ - -
- -
example.com/suitecrm/service/v4_1/soap.php?wsdl
- -
- ------ - - -
-Where example.com/suitecrm is the address of your SuiteCRM instance. v4_1 is the version of the API and can be changed, v4_1 is the latest version at the time of writing. - -##### SOAP Example ##### - -The following PHP example uses the built in SoapClient class. - -
- -Example 16.2: Accessing the SOAP API - - ------ - -
- -
 1 <?php
- 2 //Create a new SoapClient
- 3 $wsdlURL = "http://example.com/suitecrm/service/v4_1/soap.php?wsdl";
- 4 $client = new SoapClient($wsdlURL);
- 5 
- 6 //Login to the API and get the session id
- 7 $userAuth = array(
- 8         'user_name' => '<suitecrmuser>',
- 9         'password' => md5('<suitecrmpassword>'),
-10 );
-11 $appName = 'My SuiteCRM SOAP Client';
-12 $nameValueList = array();
-13 $loginResults = $client->login($userAuth, $appName, $nameValueList);
-14 
-15 //Get a list of at most 10 accounts with a billing address in Ohio. Along with
-16 //The first and last names of any contacts in that Account.
-17 $results = $client->get_entry_list(
-18         //Session id - retrieved from login call
-19         $loginResults->id,
-20         //Module to get_entry_list for
-21         'Accounts',
-22         //Filter query - Added to the SQL where clause
-23         "accounts.billing_address_city = 'Ohio'",
-24         //Order by - unused
-25         '',
-26         //Start with the first record
-27         0,
-28         //Return the id and name fields
-29         array('id','name'),
-30         //Link to the "contacts" relationship and retrieve the
-31         //First and last names.
-32         array(
-33                 array(
-34                         'name' => 'contacts',
-35                         'value' => array(
-36                                 'first_name',
-37                                 'last_name',
-38                         ),
-39                 ),
-40         ),
-41         //Show 10 max results
-42         10,
-43         //Do not show deleted
-44         0
-45 );
-46 print_r($results);
- -
- ------ - - -
-
- - - -
-#### REST #### - -The SuiteCRM REST API can be found at: - -
- -Example 16.3: REST API Endpoint Location - - ------ - -
- -
example.com/suitecrm/service/v4_1/rest.php
- -
- ------ - - -
-Where example.com/suitecrm is the address of your SuiteCRM instance. v4_1 is the version of the API and can be changed, v4_1 is the latest version at the time of writing. - -The SuiteCRM REST API is not a true REST API - all calls are performed as POSTs and all calls are to the base URL with the method passed in as a post argument. - -; The arguments to the REST API calls are:
-method -: The method which will be called, i.e. login or get_entry_list. See [B](Appendix)(#chap20.xhtml#appendix-b) for a list of API methods. -; input_type -: The input type of the rest_data. This is usually JSON but can also be Serialize. -; response_type -: How the response will be encoded. This is usually JSON but can also be Serialize. -; rest_data -: Any other arguments that are required by this method. This is passed as an encoded array. The encoding is determined by input_type. - -{| -|width="50%"| [50px|class=sidebar-image|warning](File:images/leanpub_warning.png) -|width="50%"| Note that, for REST requests it is the order of the arguments that matter in rest_data and not the name. -|} - -
- - - -
-##### Examples ##### - -
- -Example 16.4: Accessing the REST API - - ------ - -
- -
 1 <?php
- 2 
- 3 $url = "http://example.com/suitecrm/service/v4_1/rest.php";
- 4 
- 5 function restRequest($method, $arguments){
- 6 	global $url;
- 7 	$curl = curl_init($url);
- 8 	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
- 9 	$post = array(
-10 			"method" => $method,
-11 			"input_type" => "JSON",
-12 			"response_type" => "JSON",
-13 			"rest_data" => json_encode($arguments),
-14 	);
-15 
-16 	curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
-17 
-18 	$result = curl_exec($curl);
-19 	curl_close($curl);
-20 	return json_decode($result,1);
-21 }
-22 
-23 
-24 $userAuth = array(
-25         'user_name' => 'suitecrmuser',
-26         'password' => md5('suitecrmpassword'),
-27 );
-28 $appName = 'My SuiteCRM REST Client';
-29 $nameValueList = array();
-30 
-31 $args = array(
-32             'user_auth' => $userAuth,
-33             'application_name' => $appName,
-34             'name_value_list' => $nameValueList);
-35 
-36 $result = restRequest('login',$args);
-37 $sessId = $result['id'];
-38 
-39 $entryArgs = array(
-40   //Session id - retrieved from login call
-41 	'session' => $sessId,
-42   //Module to get_entry_list for
-43 	'module_name' => 'Accounts',
-44   //Filter query - Added to the SQL where clause,
-45 	'query' => "accounts.billing_address_city = 'Ohio'",
-46   //Order by - unused
-47 	'order_by' => '',
-48   //Start with the first record
-49 	'offset' => 0,
-50   //Return the id and name fields
-51 	'select_fields' => array('id','name',),
-52 	//Link to the "contacts" relationship and retrieve the
-53 	//First and last names.
-54 	'link_name_to_fields_array' => array(
-55 			array(
-56 					'name' => 'contacts',
-57 					'value' => array(
-58 							'first_name',
-59 							'last_name',
-60 					),
-61 			),
-62 	),
-63   //Show 10 max results
-64 	'max_results' => 10,
-65   //Do not show deleted
-66 	'deleted' => 0,
-67 );
-68 $result = restRequest('get_entry_list',$entryArgs);
-69 
-70 print_r($result);
- -
- ------ - - -
-For a full list of API methods and their arguments see [B](Appendix)(#chap20.xhtml#appendix-b). - -### Adding custom API methods ### - -Sometimes the existing API methods are not sufficient or using them for a task would be overly complex. SuiteCRM allows the web services to be extended with additional methods or overriding existing methods. - -The recommended path for custom entry points is the following
-custom/service/<version>_custom/. At the time of writing the latest web service version is v4_1 so this would be custom/service/v4_1_custom/. - -Next we create the implementing class. This will create our new method. In our example we will simply create a new method which writes to the SuiteCRM log We will call this method
-write_log_message. - -
- -Example 16.5: Custom v4_1 Web Service Implementation - - ------ - -
- -
 1 <?php
- 2 if(!defined('sugarEntry')){
- 3   define('sugarEntry', true);
- 4 }
- 5 require_once 'service/v4_1/SugarWebServiceImplv4_1.php';
- 6 class SugarWebServiceImplv4_1_custom extends SugarWebServiceImplv4_1
- 7 {
- 8 
- 9   function write_log_message($session, $message)
-10   {
-11     $GLOBALS['log']->info('Begin: write_log_message');
-12 
-13     //Here we check that $session represents a valid session
-14     if (!self::$helperObject->checkSessionAndModuleAccess(
-15                                                     $session, 
-16                                                     'invalid_session', 
-17                                                     '', 
-18                                                     '', 
-19                                                     '',  
-20                                                     new SoapError()))
-21     {
-22       $GLOBALS['log']->info('End: write_log_message.');
-23       return false;
-24     }
-25     $GLOBALS['log']->info($message);
-26     return true;
-27   }
-28 }
- -
- ------ - - -
-Next we create the registry file which will register our new method. - -
- -Example 16.6: Custom v4_1 web service registry - - ------ - -
- -
 1 <?php
- 2     require_once 'service/v4_1/registry.php';
- 3     class registry_v4_1_custom extends registry_v4_1
- 4     {
- 5         protected function registerFunction()
- 6         {
- 7             parent::registerFunction();
- 8             $this->serviceClass->registerFunction('write_log_message', 
- 9                                                   array(
-10                                                     'session'=>'xsd:string',
-11                                                     'message'=>'xsd:string'), 
-12                                                   array(
-13                                                     'return'=>'xsd:boolean')
-14                                                   );
-15         }
-16     }
- -
- ------ - - -
-Finally we create the entry point. This is the actual file that will be called by our API clients. This will reference the two files which we have created and will call the webservice implementation with our files. - -
- -Example 16.7: Custom v4_1 REST Entry point - - ------ - -
- -
 1 <?php
- 2 chdir('../../..');
- 3 
- 4 require_once 'SugarWebServiceImplv4_1_custom.php';
- 5 
- 6 $webservice_path = 'service/core/SugarRestService.php';
- 7 $webservice_class = 'SugarRestService';
- 8 $webservice_impl_class = 'SugarWebServiceImplv4_1_custom';
- 9 $registry_path = 'custom/service/v4_1_custom/registry.php';
-10 $registry_class = 'registry_v4_1_custom';
-11 $location = 'custom/service/v4_1_custom/rest.php';
-12 
-13 require_once 'service/core/webservice.php';
- -
- ------ - - -
-
- -Example 16.8: Custom v4_1 SOAP Entry point - - ------ - -
- -
 1 <?php
- 2 chdir('../../..');
- 3 require_once('SugarWebServiceImplv4_1_custom.php');
- 4 $webservice_class = 'SugarSoapService2';
- 5 $webservice_path = 'service/v2/SugarSoapService2.php';
- 6 $webservice_impl_class = 'SugarWebServiceImplv4_1_custom';
- 7 $registry_class = 'registry_v4_1_custom';
- 8 $registry_path = 'custom/service/v4_1_custom/registry.php';
- 9 $location = 'custom/service/v4_1_custom/soap.php';
-10 require_once('service/core/webservice.php');
- -
- ------ - - -
-#### Usage #### - -We can now use our custom endpoint. This is identical to using the API as detailed above, except that we use our custom entry point for either the SOAP WSDL or REST URL. For example using the same SuiteCRM location (example.com/suitecrm) as the above examples and using v4_1, we would use the following - -
- -Example 16.9: Custom v4_1 URLS - - ------ - -
- -
1 //SOAP WSDL
-2 example.com/suitecrm/custom/service/v4_1_custom/soap.php?wsdl
-3 //REST URL
-4 example.com/suitecrm/custom/service/v4_1_custom/rest.php
- -
- ------ - - -
- -
diff --git a/_source/output/chap18.md b/_source/output/chap18.md deleted file mode 100644 index 5d5b4501f..000000000 --- a/_source/output/chap18.md +++ /dev/null @@ -1,165 +0,0 @@ ---- -layout: page -title: "Chapter 18" ---- - - -
- -## 17. Best Practices ## - -### Development instances ### - -When making changes you should always use a development or test instance first. This allows you to fully and safely test any changes. - -### Version control ### - -When developing customisations it is prudent to use some form of version control. Version control allows tracking changes to your codebase in addition to rolling back changes. There are many version control systems available. SuiteCRM uses [Git](http://git-scm.com/) although I also like [Mercurial](http://mercurial.selenic.com/). - -If you are using a development instance (as mentioned above) then Version Control usually allows you to push changes to other versions or to tag releases. This provides a way of pushing changes to live or test instances safely. Crucially it also means that, should there be major problems with a version then this can be easily rolled back. - -### Backup ### - -SuiteCRM has been developed to be customisable. However, mistakes, bugs and other unpleasantness can (and thanks to Murphy’s law, will) happen. You should always ensure, before making any changes, that you have a backup of all files and of the database. - -In order to back up files you can simply create a zip of the SuiteCRM directory and copy it to a safe place. On Linux systems this can be performed using the following: - -
- -Example 17.1: File backup - - ------ - -
- -
tar -czvf suitecrmfilebackup.tar.gz /path/to/suitecrm
- -
- ------ - - -
-Backing up the SuiteCRM database will vary depending on which database you are using. However MySQL backups can be performed using the mysqldump command on Linux as seen here: - -
- -Example 17.2: MySQL Database backup - - ------ - -
- -
mysqldump suitecrmdatabase -u databaseuser -p | gzip -c | cat > suitecrm.sql.gz
- -
- ------ - - -
-### Be upgrade safe ### - -Unless you are making changes to a custom module you should strive in all cases to use the custom framework and make changes in the custom folder. This ensures that, should you make a mistake, rectifying the mistake is as simple as removing the customisation. - -However the main advantage to using custom is that, when you upgrade SuiteCRM in the future you will not have your changes overwritten by the updated SuiteCRM files. See the [Extensions](#chap13.xhtml#extensions-chapter) chapter for more information. - -### Use appropriate log levels ### - -Using appropriate log levels (See the chapter on [Logging](#chap10.xhtml#logging-chapter)) makes it easier to track down issues. You do not want very important messages to be logged as debug since this will make them difficult to find. Likewise you don’t want unimportant log messages cluttering up the fatal log output. - -### Long running logic hooks ### - -If a logic hook task is long running then you should place it into the job queue (see the [Hook](Logic)(#chap11.xhtml#logic-hooks-chapter) and [Tasks](Scheduled)(#chap12.xhtml#scheduled-tasks-chapter) chapters). - -### Minimise SQL ### - -Where possible you should strive to use the SuiteCRM supplied methods of accessing data. This includes using beans and the BeanFactory where possible (see the chapter on [with beans](Working)(#chap02.xhtml#working-with-beans-chapter)). There are a few reasons for this. The first is that SQL is usually either hardcoded or has to be dynamically built. In the case where the SQL is hardcoded this means that changes to fields will not be reflected thereby making your code more brittle. - -Dynamic SQL is better because it can react to field changes and generally be tailored to fit the situation. However this requires adding extra, often complex, code. It can be hard to account for all situations (this can be especially problematic when attempting to traverse relationships dynamically). - -Another issue is that, usually SQL will end up being Database specific (see the next point for mitigating this however). - -Finally any custom logic (such as Logic Hooks) which would usually be fired for saving beans or relationships will not be fired for SQL queries. - -### SQL Use ### - -In some cases using raw SQL is unavoidable. If that is the case then you should strive to use standard compliant SQL. If database engine specific features need to be used, and you wish to target other database engines, you can check for the DB type. For example: - -
- -Example 17.1: Checking for the database engine - - ------ - -
- -
 1 function getSomeSQLQuery(){
- 2     global $sugar_config;
- 3     switch($sugar_config['dbconfig']['db_type']){
- 4         case 'mssql':
- 5             $sql = 'MSSQL specific SQL';
- 6             break;
- 7         case 'mysql':
- 8         default:
- 9             $sql = 'MySQL specific SQL';
-10             break;
-11     }
-12     return $sql;
-13 }
- -
- ------ - - -
-### Entry check ### - -The majority of SuiteCRM files will start with some variation of the following line: - -
- -Example 17.2: Entry check - - ------ - -
- -
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
- -
- ------ - - -
-This prevents direct access to the file by ensuring that SuiteCRM has been loaded through a valid entry point (i.e. it has been loaded through index.php, cron.php or a custom entry point). - -### Redirect after post ### - -Sometimes you may have custom controller actions (see the controller section) or custom entry points (see the [Points](Entry)(#chap07.xhtml#entry-point-chapter) chapter). These actions and entry points or other pages are usually accessed using POST. After a POST request it is a web best practice to redirect to a different page, especially if your page makes any changes. This prevents the user from refreshing the page and causing a duplicate action. Within SuiteCRM it is best to use the SugarApplication::redirect method to redirect. This simply accepts a URL. As follows: - -
- -Example 17.3: Redirecting within SuiteCRM - - ------ - -
- -
SugarApplication::redirect('index.php?module=<TheModule>');
- -
- ------ - - -
- -
diff --git a/_source/output/chap19.md b/_source/output/chap19.md deleted file mode 100644 index 2de20d1d1..000000000 --- a/_source/output/chap19.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -layout: page -title: "Chapter 19" ---- - - -
- -## 18. Performance Tweaks ## - -In most cases the performance of SuiteCRM should not be an issue. However in the case of large datasets or systems with many users you may notice some performance degradation. These changes can help improve performance. - -### Server ### - -The server that SuiteCRM runs on is, of course, very important when it comes to the kind of performance you can expect. A full guide on server setup is outside the scope of this book. However there are some things you can do to ensure that you get the best performance out of SuiteCRM. - -#### PHP #### - -Installing a PHP opcode cache will increase the performance of all PHP files. These work by caching the compilation of PHP files resulting in less work on each request. Furthermore SuiteCRM will use the caching API of some PHP accelerators which will further increase performance. If you are using Linux then [APC](http://php.net/manual/en/book.apc.php) is the usual choice. Windows users should check out [WinCache](http://php.net/manual/en/book.wincache.php). - -#### MySQL #### - -MySQL is notorious for having small default settings. Fully optimising MySQL is outside the scope of this book (however checkout [mysqltuner.pl](http://mysqltuner.pl) for a helpful Perl script which will provide setting recommendations - note that you should be careful when running files from an unknown source). One small change that can make a big difference is increasing the innodb_buffer_pool_size. - -If you have migrated or imported a significant amount of data it is possible that some tables will be fragmented. Running OPTIMIZE TABLE tablename can increase performance. - -### Indexes ### - -Adding indexes on the fields of modules can improve database performance. The core modules usually have important fields indexed. However if you have created a new module or added new, often searched fields to a module then these fields may benefit from being indexed. See the [Vardef](#chap03.xhtml#vardefs-chapter) chapter for adding indexes. - -### Config Changes ### - -The following are some config settings that can be used to improve performance. Please note that in most cases you will have better performance gains by first following the steps in previous sections. These settings should be set in the config_override.php file. See the chapter on the [Config](#chap09.xhtml#config-chapter) files for more information. - -
- -
- -
$sugar_config['developerMode'] = false;
- -
- -
-Unless you are actively developing on an instance developerMode should be off. Otherwise each page request will cause cached files to be reloaded. - -
- -
- -
$sugar_config['disable_count_query'] = true;
- -
- -
-For systems with large amounts of data the count queries on subpanels used for the pagination controls can become slow thereby causing the page to be sluggish or outright slow to load. Disabling these queries can improve performance dramatically on some pages. - -
- -
- -
$sugar_config['disable_vcr'] = true;
- -
- -
-By default opening the detail view of a record from the list view will also load the other records in the list to allow for easy moving through records. If you do not use this feature, or, if loading the detail view for some records has become slow, you can disable this feature. - -
- -
- -
$sugar_config['list_max_entries_per_page'] = '10';
- -
- -
-The number of records shown in each page of the list view can be decreased. This will result in a slight increase in performance on list view pages. - -
- -
- -
$sugar_config['logger']['level'] = 'fatal';
- -
- -
-Lowering the log level means that there will be less log messages to write to disk on each request. This will slightly (very slightly) increase performance. - - -
diff --git a/_source/output/chap20.md b/_source/output/chap20.md deleted file mode 100644 index 71b793ad7..000000000 --- a/_source/output/chap20.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -layout: page -title: "Chapter 20" ---- - - -
- -## 19. Further Resources ## - -Although this book has aimed to be a thorough resource, SuiteCRM is large and feature rich. Therefore it is not possible to include all the information you may require. Here are some extra resources for developing with SuiteCRM. - -### SuiteCRM Website ### - -The SuiteCRM website ([SuiteCRM.com](http://suitecrm.com) has many excellent resources including: - -* [SuiteCRM forums](https://suitecrm.com/forum/index) - come and say hi! -* [SuiteCRM Blog](https://suitecrm.com/suitecrm/blog) -* [SuiteCRM Wiki](https://suitecrm.com/wiki/index.php/Main_Page) - -### External SuiteCRM Resources ### - -; [SuiteCRM GitHub](https://github.com/salesagility/SuiteCRM) -: The SuiteCRM source code is hosted on GitHub. Here you can get bleeding edge code changes and even contribute code. - -### SugarCRM Resources ### - -SuiteCRM has strived to remain compatible with the SugarCRM community edition and much of the documentation is still valid. The appropriate version for SuiteCRM information is 6.5. Versions of documentation higher than this (i.e. 7) will probably not be relevant. - -* [SugarCRM Developer docs](http://support.sugarcrm.com/02_Documentation/04_Sugar_Developer/) -* [SugarCRM Developer Blog](http://developer.sugarcrm.com/) - -### Technical Links ### - -* [PHP](http://php.net/) - The main language used by SuiteCRM -* [Smarty](http://www.smarty.net/) - The templating language used throughout SuiteCRM. -* [XDebug](http://xdebug.org) - Debugging/profiling extension for PHP -* [Git](http://git-scm.com/) - Distributed version control system -* [YUI](http://yuilibrary.com/) - Legacy Javascript library used in SuiteCRM -* [JQuery](https://jquery.com/) - Javascript library used in SuiteCRM - to be preferred over YUI. -* [PHPMailer](https://github.com/PHPMailer/PHPMailer) Email library used in SuiteCRM -* [APC](http://php.net/manual/en/book.apc.php) - Alternative PHP Cache. PHP Opcode cache supported by SuiteCRM -* [WinCache](http://php.net/manual/en/book.wincache.php) - Windows PHP cache. PHP Opcode cache supported by SuiteCRM -* [PHPStorm](https://www.jetbrains.com/phpstorm/) - PHP IDE (Paid) -* [Eclipse PHP Development Tools](https://eclipse.org/pdt/) - PHP IDE (Free and Open Source) - -### Other Links ### - -* [SalesAgility](https://salesagility.com/) - The company behind SuiteCRM. -* [Jim Mackin](http://www.jsmackin.co.uk) - Me :) - - -
diff --git a/_source/output/chap21.md b/_source/output/chap21.md deleted file mode 100644 index 4e7fc1a11..000000000 --- a/_source/output/chap21.md +++ /dev/null @@ -1,201 +0,0 @@ ---- -layout: page -title: "Chapter 21" ---- - - -
- -## 20. Appendix A - Code Examples ## - -### Metadata ### - -This is an example of setting up a function subpanel (see the [Metadata](#chap05.xhtml#metadata-chapter) chapter for more information). - -In this example the cases module has a custom field incident_code_c which is used to track cases with the same root cause. We’ll add a subpanel to show all cases that have the same incident_code_c. - -Initially we add to the subpanel_setup section of Cases by creating the following file in custom/Extension/modules/Cases/Ext/Layoutdefs/IncidentLayoutdefs.php - -
- -Example A.1: IncidentLayoutdefs.php - - ------ - -
- -
 1 <?php
- 2 $layout_defs["Cases"]["subpanel_setup"]['incident_cases'] = array(
- 3   'module' => 'Cases',
- 4   'title_key' => 'LBL_INCIDENT_CASES',
- 5   'subpanel_name' => 'default',
- 6   'get_subpanel_data' => 'function:get_cases_by_incident',
- 7   'function_parameters' => 
- 8           array('import_function_file' => 'custom/modules/Cases/IncidentUtils.ph\
- 9 p',),
-10 );
- -
- ------ - - -
-Next we create the file which will define our get_cases_by_incident function custom/modules/Cases/IncidentUtils.php. - -
- -Example A.2: IncidentUtils.php - - ------ - -
- -
 1 <?php
- 2 function get_cases_by_incident(){
- 3         global $db;
- 4         //Get the current bean
- 5         $bean = $GLOBALS['app']->controller->bean;
- 6         $incidentCode = $db->quote($bean->incident_code_c);
- 7         //Create the SQL array
- 8         $ret = array();
- 9         $ret['select'] = ' SELECT id FROM cases ';
-10         $ret['from'] = ' FROM cases ';
-11         $ret['join'] = "";
-12         //Get all cases where the incident code matches but exclude the current \
-13 case.
-14         $ret['where']="WHERE cases.deleted = 0 AND cases_cstm.incident_code_c = \
-15 '{$incidentCode}' AND cases.id != '{$bean->id}'";
-16         return $ret;
-17 }
- -
- ------ - - -
-### Module Installer ### - -The following is a basic example manifest file. See the [Installer](Module)(#chap14.xhtml#module-installer-chapter) chapter. - -
- -Example A.3: Example manifest file - - ------ - -
- -
  1 $manifest = array(
-  2   'name' => 'Example manifest',
-  3   'description' => 'A basic manifest example',
-  4   'version' => '1.2.3',
-  5   'author' => 'Jim Mackin',
-  6   'readme' => 'This is a manifest example for the SuiteCRM for Developers book',
-  7   'acceptable_sugar_flavors' => array('CE'),
-  8   'acceptable_sugar_versions' => array(
-  9       'exact_matches' => array('6.5.20',),
- 10   ),
- 11   'dependencies' => array(
- 12     array(
- 13       'id_name' => 'hello_world',
- 14       'version' => '3.2.1'
- 15     ),
- 16   ),
- 17   'icon' => 'ManifestExample.png',
- 18   'is_uninstallable' => true,
- 19   'published_date' => '2015-05-05',
- 20   'type' => 'module',
- 21   'remove_tables' => 'prompt',
- 22 );
- 23 $installdefs = array(
- 24   'id' => 'suitecrmfordevelopers_example_manifest',
- 25   'image_dir' => '/images/',
- 26   'copy' => array(
- 27     array(
- 28       'from' => '/modules/ExampleModule',
- 29       'to' => 'modules/ExampleModule',
- 30     ),
- 31   ),
- 32   'dashlets' => array(  
- 33     array(
- 34       'from' => '/modules/ExampleModule/Dashlets/',  
- 35       'name' => 'ExampleModuleDashlet'  
- 36     )
- 37   ),
- 38   'language' => array(
- 39     array(
- 40       'from' => 'application/language/en_us.examplemoduleadmin.php',  
- 41       'to_module' => 'application',  
- 42       'language' => 'en_us'
- 43     ),
- 44     array(    
- 45       'from' => '/modules/Accounts/language/en_us.examplemodule.php',
- 46       'to_module' => 'Accounts',
- 47       'language' => 'en_us'
- 48     ),
- 49     array(
- 50       'from' => '/application/language/es_es.examplemoduleadmin.php',  
- 51       'to_module' => 'application',
- 52       'language' => 'es_es'
- 53     ),  
- 54     array(    
- 55       'from' => '/modules/Accounts/language/es_es.examplemodule.php',  
- 56       'to_module' => 'Accounts',
- 57       'language' => 'es_es'
- 58     ),  
- 59   ),
- 60   'custom_fields' => array(  
- 61     array(
- 62       'name' => 'example_field',
- 63       'label' => 'Example Field',
- 64       'type' => 'varchar',
- 65       'max_size' =>  100,
- 66       'module' => 'Accounts',  
- 67     ),
- 68   ),
- 69   'vardefs' => array(  
- 70     array(  
- 71       'from' => 'modules/Accounts/vardefs/examplemodule_vardefs.php',  
- 72       'to_module' => 'Accounts',  
- 73     ),
- 74   ),
- 75   'beans' => array(
- 76     array(
- 77       'module' => 'ExampleModule',  
- 78       'class' => 'ExampleModule',
- 79       'path' => 'modules/ExampleModule/ExampleModule.php',  
- 80     ),
- 81   ),
- 82   'logic_hooks' => array(
- 83     array(  
- 84       'module' => 'Accounts',
- 85       'hook' => 'before_save',  
- 86       'order' => 100,  
- 87       'description'  => 'Example module before save hook',  
- 88       'file' => 'modules/ExampleModule/ExampleModuleHook.php',
- 89       'class' => 'ExampleModuleLogicHooks',
- 90       'function' => 'accounts_before_save',  
- 91     ),
- 92   ),  
- 93   'administration' => array(  
- 94     array(  
- 95       'from' => 'modules/administration/examplemodule_admin.php',  
- 96     ),
- 97   ),
- 98 );
- 99 $upgrade_manifest = array(
-100 );
- -
- ------ - - -
- -
diff --git a/_source/pandoc-markdown/appendix.md b/_source/pandoc-markdown/appendix.md deleted file mode 100644 index fde417308..000000000 --- a/_source/pandoc-markdown/appendix.md +++ /dev/null @@ -1,206 +0,0 @@ ---- -title: Appendix -weight: 20 ---- - -## Appendix A - Code Examples - - -### Metadata - -This is an example of setting up a function subpanel (see the -\[\[\#chap05.xhtml\#metadata-chapter|Metadata\]\] chapter for more -information). - -In this example the cases module has a custom field -incident\_code\_c which is used to track cases with the -same root cause. We’ll add a subpanel to show all cases that have the -same incident\_code\_c. - -Initially we add to the subpanel\_setup section of Cases by -creating the following file in -custom/Extension/modules/Cases/Ext/Layoutdefs/IncidentLayoutdefs.php - -
- -Example A.1: IncidentLayoutdefs.php - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2 $layout_defs["Cases"]["subpanel_setup"]['incident_cases'] = array(
- 3   'module' => 'Cases',
- 4   'title_key' => 'LBL_INCIDENT_CASES',
- 5   'subpanel_name' => 'default',
- 6   'get_subpanel_data' => 'function:get_cases_by_incident',
- 7   'function_parameters' =>
- 8           array('import_function_file' => 'custom/modules/Cases/IncidentUtils.ph\
- 9 p',),
-10 );
- -
- ------------------------------------------------------------------------- - -
- -Next we create the file which will define our -get\_cases\_by\_incident function -custom/modules/Cases/IncidentUtils.php. - -
- -Example A.2: IncidentUtils.php - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2 function get_cases_by_incident(){
- 3         global $db;
- 4         //Get the current bean
- 5         $bean = $GLOBALS['app']->controller->bean;
- 6         $incidentCode = $db->quote($bean->incident_code_c);
- 7         //Create the SQL array
- 8         $ret = array();
- 9         $ret['select'] = ' SELECT id FROM cases ';
-10         $ret['from'] = ' FROM cases ';
-11         $ret['join'] = "";
-12         //Get all cases where the incident code matches but exclude the current \
-13 case.
-14         $ret['where']="WHERE cases.deleted = 0 AND cases_cstm.incident_code_c = \
-15 '{$incidentCode}' AND cases.id != '{$bean->id}'";
-16         return $ret;
-17 }
- -
- ------------------------------------------------------------------------- - -
- -### Module Installer - -The following is a basic example manifest file. See the -\[\[\#chap14.xhtml\#module-installer-chapter|Module Installer\]\] -chapter. - -
- -Example A.3: Example manifest file - ------------------------------------------------------------------------- - -
- -
  1 $manifest = array(
-  2   'name' => 'Example manifest',
-  3   'description' => 'A basic manifest example',
-  4   'version' => '1.2.3',
-  5   'author' => 'Jim Mackin',
-  6   'readme' => 'This is a manifest example for the SuiteCRM for Developers book',
-  7   'acceptable_sugar_flavors' => array('CE'),
-  8   'acceptable_sugar_versions' => array(
-  9       'exact_matches' => array('6.5.20',),
- 10   ),
- 11   'dependencies' => array(
- 12     array(
- 13       'id_name' => 'hello_world',
- 14       'version' => '3.2.1'
- 15     ),
- 16   ),
- 17   'icon' => 'ManifestExample.png',
- 18   'is_uninstallable' => true,
- 19   'published_date' => '2015-05-05',
- 20   'type' => 'module',
- 21   'remove_tables' => 'prompt',
- 22 );
- 23 $installdefs = array(
- 24   'id' => 'suitecrmfordevelopers_example_manifest',
- 25   'image_dir' => '/images/',
- 26   'copy' => array(
- 27     array(
- 28       'from' => '/modules/ExampleModule',
- 29       'to' => 'modules/ExampleModule',
- 30     ),
- 31   ),
- 32   'dashlets' => array(
- 33     array(
- 34       'from' => '/modules/ExampleModule/Dashlets/',
- 35       'name' => 'ExampleModuleDashlet'
- 36     )
- 37   ),
- 38   'language' => array(
- 39     array(
- 40       'from' => 'application/language/en_us.examplemoduleadmin.php',
- 41       'to_module' => 'application',
- 42       'language' => 'en_us'
- 43     ),
- 44     array(
- 45       'from' => '/modules/Accounts/language/en_us.examplemodule.php',
- 46       'to_module' => 'Accounts',
- 47       'language' => 'en_us'
- 48     ),
- 49     array(
- 50       'from' => '/application/language/es_es.examplemoduleadmin.php',
- 51       'to_module' => 'application',
- 52       'language' => 'es_es'
- 53     ),
- 54     array(
- 55       'from' => '/modules/Accounts/language/es_es.examplemodule.php',
- 56       'to_module' => 'Accounts',
- 57       'language' => 'es_es'
- 58     ),
- 59   ),
- 60   'custom_fields' => array(
- 61     array(
- 62       'name' => 'example_field',
- 63       'label' => 'Example Field',
- 64       'type' => 'varchar',
- 65       'max_size' =>  100,
- 66       'module' => 'Accounts',
- 67     ),
- 68   ),
- 69   'vardefs' => array(
- 70     array(
- 71       'from' => 'modules/Accounts/vardefs/examplemodule_vardefs.php',
- 72       'to_module' => 'Accounts',
- 73     ),
- 74   ),
- 75   'beans' => array(
- 76     array(
- 77       'module' => 'ExampleModule',
- 78       'class' => 'ExampleModule',
- 79       'path' => 'modules/ExampleModule/ExampleModule.php',
- 80     ),
- 81   ),
- 82   'logic_hooks' => array(
- 83     array(
- 84       'module' => 'Accounts',
- 85       'hook' => 'before_save',
- 86       'order' => 100,
- 87       'description'  => 'Example module before save hook',
- 88       'file' => 'modules/ExampleModule/ExampleModuleHook.php',
- 89       'class' => 'ExampleModuleLogicHooks',
- 90       'function' => 'accounts_before_save',
- 91     ),
- 92   ),
- 93   'administration' => array(
- 94     array(
- 95       'from' => 'modules/administration/examplemodule_admin.php',
- 96     ),
- 97   ),
- 98 );
- 99 $upgrade_manifest = array(
-100 );
- -
- ------------------------------------------------------------------------- - -
- -
diff --git a/_source/pandoc-markdown/chap01.md b/_source/pandoc-markdown/chap01.md deleted file mode 100644 index e610a57ea..000000000 --- a/_source/pandoc-markdown/chap01.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Introduction -weight: 1 ---- - -### What is SuiteCRM - -The story of \[https://www.suitecrm.com SuiteCRM\] starts with SugarCRM. -SugarCRM was founded in 2004 and consisted of an open source version -(called Community Edition) and various paid for versions. However -trouble started brewing when it appeared that SugarCRM would not be -releasing a Community Edition of SugarCRM 7 and would be providing -limited, if any, updates to the Community Edition. - -Enter SuiteCRM. SalesAgility forked Community Edition to create SuiteCRM -and also added various open source plugins to add improved -functionality. - -### This book - -This book is intended for developers who are familiar (or at least -acquainted) with using SuiteCRM but want to perform their own -customisations. SuiteCRM is a large and mature piece of software so it -is impractical for a book to cover all aspects of the software. I’ve -tried to add the most important parts which should allow you to make the -changes you need in 99% of situations. There is a further resources -chapter at the end of this book to help out in those 1% of cases. With -that being said if you feel there is anything important I have left out -(or worse, anything incorrect in the book) please let me know. I can be -contacted at \[http://www.jsmackin.co.uk JSMackin.co.uk\]. - -### Reading this book - -Each chapter in this book is intended to be self contained so the reader -can jump to interesting chapters. Where there is some overlap this is -usually indicated with links to the relevant chapters. - -Some parts of this book may refer to file paths or other parts of code -that can have a variable value, for example controller names contain the -module name or a file with an arbitrary name. In this case these will be -marked in the form <TheModuleName>, -<TheFileName> or something else suitable. In these -cases you can substitute something appropriate (such as -Accounts or MyNewFile). - -### Setting up SuiteCRM - -In this book we’ll be using SuiteCRM v7.1.5 which is the latest at time -of writing. For up to date versions of the installation instructions see -the SuiteCRM wiki at \[https://suitecrm.com/wiki/index.php/Installation -suitecrm.com/wiki/index.php/Installation\]. - -#### Website - -The SuiteCRM installer can be found at \[https://suitecrm.com/ -SuiteCRM.com\]. I would recommend SuiteCRM MAX as I prefer to start with -a full interface and customise it as needed. - -#### GitHub - -SuiteCRM is also available on \[http://github.com GitHub\] at -\[https://github.com/salesagility/SuiteCRM -github.com/salesagility/SuiteCRM\]. Each SuiteCRM version is tagged so -you can easily grab the version you need. - -### Initial Tweaks - -After the initial install there are a few tweaks you may want to make on -an instance you are developing on. These changes should improve your -development flow and productivity as well as help identify issues if -they occur. - -#### Developer Mode - -SuiteCRM will cache various files that it processes, such as Smarty -templates. Developer mode will turn off some of the caching so that -changes to files will be seen immediately (though this isn’t always the -case - as is the case with -\[\[\#chap13.xhtml\#extensions-chapter|extensions\]\]). This can be -enabled either through the config file or via the General settings page -inside admin. - -#### Log Level - -The default log level of SuiteCRM is fatal. This is a good -default for production instances but you may want to increase the log -level to info or debug. This will make the log -output more verbose so, should anything go wrong, you’ll have something -to refer to. See the \[\[\#chap10.xhtml\#logging-chapter|chapter on -logging\]\] for more information. - -#### Display errors - -You’ll also want to turn off display errors. Unfortunately at the moment -SuiteCRM has various notices and warnings out of the box. With -display\_errors on this can sometimes cause AJAX pages and -the link to break. - -With this being said you should be checking the PHP error logs or -selectively enabling
display\_errors to ensure that -the code you are creating is not creating additional notices, warnings -or errors. - -#### XDebug - -\[http://xdebug.org XDebug\] is a PHP extension which provides profiling -and debugging capabilities to PHP. This can massively improve developer -productivity by simplifying development and, particularly, tracking down -any issues. See the XDebug site for information on XDebug. diff --git a/_source/pandoc-markdown/chap02.md b/_source/pandoc-markdown/chap02.md deleted file mode 100644 index 8a0a22916..000000000 --- a/_source/pandoc-markdown/chap02.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: Directory Structure -weight: 2 ---- - -; cache -: Contains cache files used by SuiteCRM including compiled smarty - templates, grouped vardefs, minified and grouped JavaScript. Some - modules and custom modules may also store (temporary) module - specific info here. ; custom -: Contains user and developer customisations to SuiteCRM. Also - contains some SuiteCRM code to maintain compatibility with SugarCRM. - However this is likely to change in the future. ; data -: Stores the classes and files used to deal with SugarBeans and their - relationships. ; examples -: Contains a few basic examples of lead capture and API usage. However - these are very outdated. ; include -: Contains the bulk of non module and non data SuiteCRM code. ; - install -: Code used by the SuiteCRM installer. ; jssource -: The jssource folder contains the unminified source of - some of the JavaScript files used within SuiteCRM. ; - metadata -: Stores relationship metadata for the various stock SuiteCRM modules. - This should not be confused with module metadata which contains - information on view, dashlet and search definitions. ; - mobile -: Stores code for the \[http://www.quickcrm.fr QuickCRM\] mobile app. - ; ModuleInstall -: Code for the module installer. ; modules -: Contains the code for any stock or custom SuiteCRM modules. ; - service -: Code for the SuiteCRM Soap and REST APIs. ; themes -: Code, data and images for the bundled SuiteCRM theme. ; - upload -: The upload folder contains documents that have been - uploaded to SuiteCRM. The names of the files comes from the ID of - the matching Document Revision/Note. - upload/upgrades will also contain various - upgrade files and the packages of installed modules. ; - log4php, soap, XTemplate, - Zend -: Source code for various libraries used by SuiteCRM some of which are - deprecated. - - diff --git a/_source/pandoc-markdown/chap03.md b/_source/pandoc-markdown/chap03.md deleted file mode 100644 index f0e4ee5d0..000000000 --- a/_source/pandoc-markdown/chap03.md +++ /dev/null @@ -1,658 +0,0 @@ ---- -title: Working with Beans -weight: 3 ---- - -Beans are the Model in SuiteCRM’s MVC (Model View Controller) -architecture. They allow retrieving data from the database as objects -and allow persisting and editing records. This section will go over the -various ways of working with beans. - -### BeanFactory - -The BeanFactory allows dynamically loading bean instances or creating -new records. For example to create a new bean you can use: - -
- -Example 3.1: Creating a new Bean using the BeanFactory - ------------------------------------------------------------------------- - -
- -
1 $bean = BeanFactory::newBean('<TheModule>');
-2 //For example a new account bean:
-3 $accountBean = BeanFactory::newBean('Accounts');
- -
- ------------------------------------------------------------------------- - -
- -Retrieving an existing bean can be achieved in a similar manner: - -
- -Example 3.2: Retrieving a bean with the BeanFactory - ------------------------------------------------------------------------- - -
- -
1 $bean = BeanFactory::getBean('<TheModule>', $beanId);
-2 //For example to retrieve an account id
-3 $bean = BeanFactory::getBean('Accounts', $beanId);
- -
- ------------------------------------------------------------------------- - -
- -getBean will return an unpopulated bean object if -\$beanId is not supplied or if there’s no such record. -Retrieving an unpopulated bean can be useful if you wish to use the -static methods of the bean (for example see the Searching for Beans -section). To deliberately retrieve an unpopulated bean you can omit the -second argument of the getBean call. I.e. - -
- -Example 3.3: Retrieving an unpopulated bean - ------------------------------------------------------------------------- - -
- -
1 $bean = BeanFactory::getBean('<TheModule>');
- -
- ------------------------------------------------------------------------- - -
- -{| |width="50%"| -\[\[File:images/leanpub\_warning.png|50px|class=sidebar-image|warning\]\] -|width="50%"| BeanFactory::getBean caches ten results. This -can cause odd behaviour if you call getBean again and get a -cached copy. Any calls that return a cached copy will return the same -instance. This means changes to one of the beans will be reflected in -all the results. |} - -Using BeanFactory ensures that the bean is correctly set up and the -necessary files are included etc. - -### SugarBean - -The SugarBean is the parent bean class and all beans in SuiteCRM extend -this class. It provides various ways of retrieving and interacting with -records. - -### Searching for beans - -The following examples show how to search for beans using a bean class. -The examples provided assume that an account bean is available names -\$accountBean. This may have been retrieved using the getBean call -mentioned in the BeanFactory section e.g. - -
- -Example 3.4: Retrieving an unpopulated account bean - ------------------------------------------------------------------------- - -
- -
$accountBean = BeanFactory::getBean('Accounts');
- -
- ------------------------------------------------------------------------- - -
- -#### get\_list - -The get\_list method allows getting a list of matching beans and allows -paginating the results. - -
- -Example 3.5: get\_list method signature - ------------------------------------------------------------------------- - -
- -
1 get_list(
-2     $order_by = "",
-3     $where = "",
-4     $row_offset = 0,
-5     $limit=-1,
-6     $max=-1,
-7     $show_deleted = 0)
- -
- ------------------------------------------------------------------------- - -
- -; \$order\_by -: Controls the ordering of the returned list. \$order\_by - is specified as a string that will be used in the SQL ORDER BY - clause e.g. to sort by name you can simply pass name, - to sort by date\_entered descending use date\_entered - DESC. You can also sort by multiple fields. For example - sorting by date\_modified and id descending date\_modified, id - DESC. ; \$where -: Allows filtering the results using an SQL WHERE clause. - \$where should be a string containing the SQL - conditions. For example in the contacts module searching for - contacts with specific first names we might use - contacts.first\_name='Jim'. Note that we specify the - table, the query may end up joining onto other tables so we want to - ensure that there is no ambiguity in which field we target. ; - \$row\_offset -: The row to start from. Can be used to paginate the results. ; - \$limit -: The maximum number of records to be returned by the query. -1 means - no limit. ; \$max -: The maximum number of entries to be returned per page. -1 means the - default max (usually 20). ; \$show\_deleted -: Whether to include deleted results. - -#### = Results \#\#\#\#= - -get\_list will return an array. This will contain the paging information -and will also contain the list of beans. This array will contain the -following keys: - -; list -: An array of the beans returned by the list query ; row\_count -: The total number of rows in the result ; next\_offset -: The offset to be used for the next page or -1 if there are no - further pages. ; previous\_offset -: The offset to be used for the previous page or -1 if this is the - first page. ; current\_offset -: The offset used for the current results. - -#### = Example \#\#\#\#= - -Let’s look at a concrete example. We will return the third page of all -accounts with the industry Media using 10 as a page size -and ordered by name. - -
- -Example 3.6: Example get\_list call - ------------------------------------------------------------------------- - -
- -
 1 $beanList = $accountBean->get_list(
- 2                                 //Order by the accounts name
- 3                                 'name',
- 4                                 //Only accounts with industry 'Media'
- 5                                 "accounts.industry = 'Media'",
- 6                                 //Start with the 30th record (third page)
- 7                                 30,
- 8                                 //No limit - will default to max page size
- 9                                 -1,
-10                                 //10 items per page
-11                                 10);
- -
- ------------------------------------------------------------------------- - -
- -This will return: - -
- -Example 3.7: Example get\_list results - ------------------------------------------------------------------------- - -
- -
 1 Array
- 2 (
- 3     //Snipped for brevity - the list of Account SugarBeans
- 4     [list] => Array()
- 5     //The total number of results
- 6     [row_count] => 36
- 7     //This is the last page so the next offset is -1
- 8     [next_offset] => -1
- 9     //Previous page offset
-10     [previous_offset] => 20
-11     //The offset used for these results
-12     [current_offset] => 30
-13 )
- -
- ------------------------------------------------------------------------- - -
- -#### get\_full\_list - -get\_list is useful when you need paginated results. -However if you are just interested in getting a list of all matching -beans you can use get\_full\_list. The -get\_full\_list method signature looks like this: - -
- -Example 3.8: get\_full\_list method signature - ------------------------------------------------------------------------- - -
- -
1 get_full_list(
-2             $order_by = "",
-3             $where = "",
-4             $check_dates=false,
-5             $show_deleted = 0
- -
- ------------------------------------------------------------------------- - -
- -These arguments are identical to their usage in get\_list -the only difference is the \$check\_dates argument. This is -used to indicate whether the date fields should be converted to their -display values (i.e. converted to the users date format). - -#### = Results \#\#\#\#= - -The get\_full\_list call simply returns an array of the matching beans - -#### = Example \#\#\#\#= - -Let’s rework our get\_list example to get the full list of -matching accounts: - -
- -Example 3.9: Example get\_full\_list call - ------------------------------------------------------------------------- - -
- -
1 $beanList = $accountBean->get_full_list(
-2                                 //Order by the accounts name
-3                                 'name',
-4                                 //Only accounts with industry 'Media'
-5                                 "accounts.industry = 'Media'"
-6                                 );
- -
- ------------------------------------------------------------------------- - -
- -#### retrieve\_by\_string\_fields - -Sometimes you only want to retrieve one row but may not have the id of -the record. retrieve\_by\_string\_fields allows retrieving -a single record based on matching string fields. - -
- -Example 3.10: retrieve\_by\_string\_fields method signature - ------------------------------------------------------------------------- - -
- -
1 retrieve_by_string_fields(
-2                           $fields_array,
-3                           $encode=true,
-4                           $deleted=true)
- -
- ------------------------------------------------------------------------- - -
- -; \$fields\_array -: An array of field names to the desired value. ; \$encode -: Whether or not the results should be HTML encoded. ; \$deleted -: Whether or not to add the deleted filter. - -{| |width="50%"| -\[\[File:images/leanpub\_warning.png|50px|class=sidebar-image|warning\]\] -|width="50%"| Note here that, confusingly, the deleted flag works -differently to the other methods we have looked at. It flags whether or -not we should filter out deleted results. So if true is passed then the -deleted results will ''not'' be included. |} - -#### = Results \#\#\#\#= - -retrieve\_by\_string\_fields returns a single bean as it’s result or -null if there was no matching bean. - -#### = Example \#\#\#\#= - -For example to retrieve the account with name Tortoise Corp -and account\_type Customer we could use the following: - -
- -Example 3.11: Example retrieve\_by\_string\_fields call - ------------------------------------------------------------------------- - -
- -
1 $beanList = $accountBean->retrieve_by_string_fields(
-2                                 array(
-3                                   'name' => 'Tortoise Corp',
-4                                   'account_type' => 'Customer'
-5                                 )
-6                               );
- -
- ------------------------------------------------------------------------- - -
- -### Accessing fields - -If you have used one of the above methods we now have a bean record. -This bean represents the record that we have retrieved. We can access -the fields of that record by simply accessing properties on the bean -just like any other PHP object. Similarly we can use property access to -set the values of beans. Some examples are as follows: - -
- -Example 3.12: Accessing fields examples - ------------------------------------------------------------------------- - -
- -
 1 //Get the Name field on account bean
- 2 $accountBean->name;
- 3
- 4 //Get the Meeting start date
- 5 $meetingBean->date_start;
- 6
- 7 //Get a custom field on a case
- 8 $caseBean->third_party_code_c;
- 9
-10 //Set the name of a case
-11 $caseBean->name = 'New Case name';
-12
-13 //Set the billing address post code of an account
-14 $accountBean->billing_address_postalcode = '12345';
- -
- ------------------------------------------------------------------------- - -
- -When changes are made to a bean instance they are not immediately -persisted. We can save the changes to the database with a call to the -beans save method. Likewise a call to save on -a brand new bean will add that record to the database: - -
- -Example 3.13: Persisting bean changes - ------------------------------------------------------------------------- - -
- -
 1 //Get the Name field on account bean
- 2 $accountBean->name = 'New account name';
- 3 //Set the billing address post code of an account
- 4 $accountBean->billing_address_postalcode = '12345';
- 5 //Save both changes.
- 6 $accountBean->save();
- 7
- 8 //Create a new case (see the BeanFactory section)
- 9 $caseBean = BeanFactory::newBean('Cases');
-10 //Give it a name and save
-11 $caseBean->name = 'New Case name';
-12 $caseBean->save();
- -
- ------------------------------------------------------------------------- - -
- -{| |width="50%"| -\[\[File:images/leanpub\_info-circle.png|50px|class=sidebar-image|information\]\] -|width="50%"| Whether to save or update a bean is decided by checking -the id field of the bean. If id is set then -SuiteCRM will attempt to perform an update. If there is no -id then one will be generated and a new record will be -inserted into the database. If for some reason you have supplied an -id but the record is new (perhaps in a custom import -script) then you can set new\_with\_id to true on the bean -to let SuiteCRM know that this record is new. |} - -### Related beans - -We have seen how to save single records but, in a CRM system, -relationships between records are as important as the records -themselves. For example an account may have a list of cases associated -with it, a contact will have an account that it falls under etc. We can -get and set relationships between beans using several methods. - -#### get\_linked\_beans - -The get\_linked\_beans method allows retrieving a list of -related beans for a given record. - -
- -Example 3.14: get\_linked\_beans method signature - ------------------------------------------------------------------------- - -
- -
1 get_linked_beans(
-2                 $field_name,
-3                 $bean_name,
-4                 $sort_array = array(),
-5                 $begin_index = 0,
-6                 $end_index = -1,
-7                 $deleted=0,
-8                 $optional_where="");
- -
- ------------------------------------------------------------------------- - -
- -; \$field\_name -: The link field name for this link. Note that this is not the same as - the name of the relationship. If you are unsure of what this should - be you can take a look into the cached vardefs of a module in - cache/modules/<TheModule>/<TheModule>Vardefs.php - for the link definition. ; \$bean\_name -: The name of the bean that we wish to retrieve. ; \$sort\_array -: This is a legacy parameter and is unused. ; \$begin\_index -: Skips the initial \$begin\_index results. Can be used - to paginate. ; \$end\_index -: Return up to the \$end\_index result. Can be used to - paginate. ; \$deleted -: Controls whether deleted or non deleted records are shown. If true - only deleted records will be returned. If false only non deleted - records will be returned. ; \$optional\_where -: Allows filtering the results using an SQL WHERE clause. See the - get\_list method for more details. - -#### = Results \#\#\#\#= - -get\_linked\_beans returns an array of the linked beans. - -#### = Example \#\#\#\#= - -
- -Example 3.15: Example get\_linked\_beans call - ------------------------------------------------------------------------- - -
- -
1 $accountBean->get_linked_beans(
-2                 'contacts',
-3                 'Contacts',
-4                 array(),
-5                 0,
-6                 10,
-7                 0,
-8                 "contacts.primary_address_country = 'USA'");
- -
- ------------------------------------------------------------------------- - -
- -#### relationships - -In addition to the get\_linked\_beans call you can also -load and access the relationships more directly. - -#### = Loading \#\#\#\#= - -Before accessing a relationship you must use the -load\_relationship call to ensure it is available. This -call takes the link name of the relationship (not the name of the -relationship). As mentioned previously you can find the name of the link -in -cache/modules/<TheModule>/<TheModule>Vardefs.php -if you’re not sure. - -
- -Example 3.16: Loading a relationship - ------------------------------------------------------------------------- - -
- -
1 //Load the relationship
-2 $accountBean->load_relationship('contacts');
-3 //Can now call methods on the relationship object:
-4 $contactIds = $accountBean->contacts->get();
- -
- ------------------------------------------------------------------------- - -
- -#### = Methods \#\#\#\#= - -###### get - -Returns the ids of the related records in this relationship e.g for the -account - contacts relationship in the example above it will return the -list of ids for contacts associated with the account. - -###### getBeans - -Similar to get but returns an array of beans instead of -just ids. - -{| |width="50%"| -\[\[File:images/leanpub\_warning.png|50px|class=sidebar-image|warning\]\] -|width="50%"| getBeans will load the full bean for each -related record. This may cause poor performance for relationships with a -large number of beans. |} - -###### add - -Allows relating records to the current bean. add takes a -single id or bean or an array of ids or beans. If the bean is available -this should be used since it prevents reloading the bean. For example to -add a contact to the relationship in our example we can do the -following: - -
- -Example 3.18: Adding a new contact to a relationship - ------------------------------------------------------------------------- - -
- -
 1 //Load the relationship
- 2 $accountBean->load_relationship('contacts');
- 3
- 4 //Create a new demo contact
- 5 $contactBean = BeanFactory::newBean();
- 6 $contactBean->first_name = 'Jim';
- 7 $contactBean->last_name = 'Mackin';
- 8 $contactBean->save();
- 9
-10 //Link the bean to $accountBean
-11 $accountBean->contacts->add($contactBean);
- -
- ------------------------------------------------------------------------- - -
- -###### delete - -delete allows unrelating beans. Counter-intuitively it -accepts the ids of both the bean and the related bean. For the related -bean you should pass the bean if it is available e.g when unrelating an -account and contact: - -
- -Example 3.19: Removing a new contact from a relationship - ------------------------------------------------------------------------- - -
- -
1 //Load the relationship
-2 $accountBean->load_relationship('contacts');
-3
-4 //Unlink the contact from the account - assumes $contactBean is a Contact SugarB\
-5 ean
-6 $accountBean->contacts->delete($accountBean->id, $contactBean);
- -
- ------------------------------------------------------------------------- - -
- -{| |width="50%"| -\[\[File:images/leanpub\_warning.png|50px|class=sidebar-image|warning\]\] -|width="50%"| Be careful with the delete method. Omitting the second -argument will cause all relationships for this link to be removed. |} - - diff --git a/_source/pandoc-markdown/chap04.md b/_source/pandoc-markdown/chap04.md deleted file mode 100644 index 6cd44010a..000000000 --- a/_source/pandoc-markdown/chap04.md +++ /dev/null @@ -1,342 +0,0 @@ ---- -title: Vardefs -weight: 4 ---- - -### What are Vardefs - -The Vardefs are used to supply information to SuiteCRM about a -particular bean. These generally specify the fields, relationships and -indexes in a given module as well as additional information such as -whether it is audited, the table name etc. - -### Defining Vardefs - -#### Module - -Vardefs are initially defined in their respective modules folder. For -the Accounts module this will be in modules/Accounts/vardefs.php. The -information is stored in an array named -$dictionary using the module name as the key. For Accounts this will be $dictionary\['Account'\]. -Let’s look at the Account vardefs (which have been edited for brevity): - -
- -Example 4.1: Account Vardefs - ------------------------------------------------------------------------- - -
- -
 1 $dictionary['Account'] =
- 2 array(
- 3  'table' => 'accounts',
- 4  'audited'=>true,
- 5  'unified_search' => true,
- 6  'unified_search_default_enabled' => true,
- 7  'duplicate_merge'=>true,
- 8  'comment' => 'Accounts are organizations or entities that ...',
- 9  'fields' => array (
-10    //Snipped for brevity. See the fields section.
-11  ),
-12  'indices' => array (
-13    //Snipped for brevity. See the indices section.
-14  ),
-15  'relationships' => array (
-16    //Snipped for brevity. See the relationship section.
-17  ),
-18  //This enables optimistic locking for Saves From EditView
-19  'optimistic_locking'=>true,
-20 );
-21
-22 VardefManager::createVardef(
-23  'Accounts',
-24  'Account',
-25  array('default', 'assignable','company',)
-26 );
- -
- ------------------------------------------------------------------------- - -
- -#### = Keys \#\#\#\#= - -The following are some of the keys that can be specified for the -vardefs. Fields, indices and relationships are covered in their own -sections. - -; table -: The database table name for this module. ; audited -: Whether or not this module should be audited. Note that - audited must also be set at the fields level for a - field to be audited. ; unified\_search -: Whether this module can be searchable via the global search. ; - unified\_search\_default\_enabled -: Whether this module is searchable via the global search by default. - ; duplicate\_merge -: Whether or not duplicate merging functionality is enabled for this - module. ; comment -: A description of this module. ; optimistic\_locking -: Whether optimistic should be enabled for this module. Optimistic - locking locks concurrent edits on a record by assuming that there - will be no conflict. On save the last modified timestamp on the - record will be checked. If it is different then an edit has occurred - since this record was loaded. If this is the case then the user will - be prompted with a page showing the differences in the two edits and - asked to choose which edits are to be used. - -#### = Fields \#\#\#\#= - -The field defines the behaviour and attributes of each field in the -module. - -; name -: The name of the field. ; vname -: The name of the language label to be used for this field. ; - type -: The type of the field. See the field types section. ; - isnull -: Whether null values are allowed ; len -: If the field is a string type, the max number of characters allowed. - ; options -: For enum fields the language label for the dropdown values for this - field ; dbtype -: The type to be used by the database to store this field. This is not - required as the appropriate type is usually chosen. ; - default -: The default value of this field. ; massupdate -: Whether or not this field should be mass updatable. Note that some - field types are always restricted from mass updates. ; - rname -: For related fields only. The name of the field to be taken from the - related module. ; id\_name -: For related fields only. The field in this bean which contains the - related id. ; source -: The source of this field. Can be set to ‘non-db’ if the field is not - stored in the database - for example for link fields, fields - populated by logic hooks or by other means. ; sort\_on -: For concatenated fields (i.e. name fields) the field which should be - used to sort. ; fields -: For concatenated fields (i.e. name fields) an array of the fields - which should be concatenated. ; db\_concat\_fields -: For concatenated fields (i.e. name fields) an array of the fields - which should be concatenated in the database. Usually this is the - same as fields. ; unified\_search -: True if this field should be searchable via the global search. ; - enable\_range\_search -: Whether the list view search should allow a range search of this - field. This is used for date and numeric fields. ; - studio -: Whether the field should display in studio. ; audited -: Whether or not changes to this field should be audited. - -#### = Field types \#\#\#\#= - -The following are common field types used: - -; id -: An id field. ; name -: A name field. This is usually a concatenation of other fields. ; - bool -: A boolean field. ; varchar -: A variable length string field. ; char -: A character field. ; text -: A text area field. ; decimal -: A decimal field. ; date -: A date field. ; datetime -: A date and time field. ; enum -: A dropdown field. ; phone -: A phone number field. ; link -: A link to another module via a relationship. ; relate -: A related bean field. - -#### = Indices \#\#\#\#= - -The indices array allows defining any database indexes that should be in -place on the database table for this module. Let’s look at an example: - -
- -Example 4.2: Example indices definition - ------------------------------------------------------------------------- - -
- -
 1 'indices' => array (
- 2  array(
- 3      'name' =>'idx_mymod_id_del',
- 4      'type' =>'index',
- 5      'fields'=>array('id', 'deleted')),
- 6  array(
- 7      'name' =>'idx_mymod_parent_id',
- 8      'type' =>'index',
- 9      'fields'=>array( 'parent_id')),
-10  array(
-11      'name' =>'idx_mymod_parent_id',
-12      'type' =>'unique',
-13      'fields'=>array( 'third_party_id')),
-14  ),
- -
- ------------------------------------------------------------------------- - -
- -Each array entry should have, at least, the following entries: - -; name -: The name of the index. This is usually used by the database to - reference the index. Most databases require that these are unique. ; - type -: The type of the index to create. index will simply add - an index on the fields, unique will add a unique - constraint on the fields, primary will add the fields - as a primary key. ; fields -: An array of the fields to be indexed. The order of this array will - be used as the order of the fields in the index. - -#### = Relationships \#\#\#\#= - -The Vardefs also specify the relationships within this module. Here’s an -edited example from the Accounts module: - -
- -Example 4.3: Example relationships definition - ------------------------------------------------------------------------- - -
- -
 1 'relationships' => array (
- 2  'account_cases' => array(
- 3      'lhs_module'=> 'Accounts',
- 4      'lhs_table'=> 'accounts',
- 5      'lhs_key' => 'id',
- 6      'rhs_module'=> 'Cases',
- 7      'rhs_table'=> 'cases',
- 8      'rhs_key' => 'account_id',
- 9      'relationship_type' => 'one-to-many'),
-10 ),
- -
- ------------------------------------------------------------------------- - -
- -Here we see the link between accounts and cases. This is specified with -the following keys: - -; lhs\_module -: The module on the left hand side of this relationship. For a one to - many relationship this will be the “One” side. ; - lhs\_table -: The table for the left hand side module. If you are unsure the table - for a module can be found in it’s vardefs. ; lhs\_key -: The field to use for the left hand side of this link. In this case - it is the id of the account. ; rhs\_module -: The right hand side module. In this case the “many” side of the - relationship. ; rhs\_table -: The table for the right hand side module. As stated previously you - can find the table for a module can be found in it’s vardefs. ; - rhs\_key -: The field to use on the right hand side. In this case the - account\_id field on cases. ; - relationship\_type -: The type of relationship - “one-to-many” or “many-to-many”. Since - this is a one to many relationship it means a case is related to a - single account but a single account can have multiple cases. - -For many to many relationship fields the following keys are also -available: - -; join\_table -: The name of the join table for this relationship. ; - join\_key\_lhs -: The name of the field on the join table for the left hand side. ; - join\_key\_rhs -: The name of the field on the join table for the right hand side. - -#### Vardef templates - -Vardef templates provide a shortcut for defining common vardefs. This is -done by calling VardefManager::createVardef and passing the -module name, object name and an array of templates to be assigned. The -following is an example from the accounts vardefs: - -
- -Example 4.4: Example vardef template - ------------------------------------------------------------------------- - -
- -
22 VardefManager::createVardef(
-23      'Accounts',
-24      'Account',
-25      array('default', 'assignable','company',)
-26      );
- -
- ------------------------------------------------------------------------- - -
- -In this example the default, assignable and -company templates are used. The following are some of the -available templates: - -; basic
default : Adds the common base -fields such as id, name, -date\_entered, etc. ; assignable : Adds the -fields and relationships necessary to assign a record to a user. ; -person : Adds fields common to people records such as -first\_name, last\_name, address, etc. ; -company : Adds fields common to companies such as an -industry dropdown, address, etc. - -#### Customising vardefs - -Vardefs can be customised by adding a file into - -
- -Example 4.5: Custom vardef location - ------------------------------------------------------------------------- - -
- -
custom/Extension/modules/<TheModule>/Ext/SomeFile.php
- -
- ------------------------------------------------------------------------- - -
- -This file can then be used to add a new field definition or customise an -existing one e.g changing a field type: - -
- -Example 4.6: Example overriding an existing vardef - ------------------------------------------------------------------------- - -
- -
$dictionary["TheModule"]["fields"]["some_field"]['type'] = 'int';
- -
- ------------------------------------------------------------------------- - -
diff --git a/_source/pandoc-markdown/chap05.md b/_source/pandoc-markdown/chap05.md deleted file mode 100644 index 367eb6a48..000000000 --- a/_source/pandoc-markdown/chap05.md +++ /dev/null @@ -1,204 +0,0 @@ ---- -title: Views -weight: 5 ---- - -SuiteCRM follows the MVC (Model-View-Controller) pattern and as such has -the concept of views. Views are responsible for gathering and displaying -data . There are a number of default views in SuiteCRM. These include - -; ListView -: Displays a list of records and provides links to the EditViews and - DetailViews of those records. The ListView also allows some - operations such as deleting and mass updating records. This is - (usually) the default view for a module. ; DetailView -: Displays the details of a single record and also displays subpanels - of related records. ; EditView -: The EditView allows editing the various fields of a record and - provides validation on these values. - -### Location - -Views can be found in modules/<TheModule>/views/ or, -for custom views,
-custom/modules/<TheModule>/views/, and are named in -the following format: view.<viewname>.php. For -example, the Accounts DetailView can be found in -modules/Accounts/views/view.detail.php with a customised -version in custom/modules/Accounts/views/view.detail.php. -The custom version is used if it exists. If it doesn’t then the module -version is used. Finally, if neither of these exist then the SuiteCRM -default is used in include/MVC/View/views/. - -### Customising - -In order to customise a View we first need to create the appropriate -view file. This will vary depending on the module we wish to target. - -#### Custom module - -In this case we can place the file directly into our module. Create a -new file (if it doesn’t exist) at -modules/<TheModule>/views/view.<viewname>.php. -The contents will look similar to: - -
- -Example 5.1: View for a custom module - ------------------------------------------------------------------------- - -
- -
1 <?php
-2
-3 require_once 'include/MVC/View/views/view.<viewname>.php';
-4
-5 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-6 class <TheModule>View<ViewName> extends View<ViewName>
-7 {
-8
-9 }
- -
- ------------------------------------------------------------------------- - -
- -A more concrete example would be for the detail view for a custom module -called ABC\_Vehicles: - -
- -Example 5.2: Detail view for a custom module, ABC\_Vehicles - ------------------------------------------------------------------------- - -
- -
1 <?php
-2
-3 require_once 'include/MVC/View/views/view.detail.php';
-4
-5 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-6 class ABC_VehiclesViewDetail extends ViewDetail
-7 {
-8
-9 }
- -
- ------------------------------------------------------------------------- - -
- -#### Preexisting modules - -For preexisting modules you will want to add the view to
-custom/modules/<TheModule>/views/view.<viewname>.php. - -The contents of this file will vary depending on whether you wish to -extend the existing view (if it exists) or create your own version -completely. It is usually best to extend the existing view, since this -will retain important logic. Note the naming convention here. We name -the class
Custom<TheModule>View<ViewName> -(for example CustomAccountsViewDetail). - -Here we don’t extend the existing view or no such view exists: - -
- -Example 5.3: Custom view for an existing module - ------------------------------------------------------------------------- - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3
-4 require_once 'include/MVC/View/views/view.<viewname>.php';
-5
-6 class Custom<TheModule>View<ViewName> extends ViewDetail
-7 {
-8
-9 }
- -
- ------------------------------------------------------------------------- - -
- -Otherwise we extend the existing view. Note that we are requiring the -existing view: - -
- -Example 5.4: Overriding a view for an existing module - ------------------------------------------------------------------------- - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3
-4 require_once 'modules/<TheModule>/views/view.<viewname>.php';
-5
-6 class Custom<TheModule>View<ViewName> extends <TheModule>View<ViewName>
-7 {
-8
-9 }
- -
- ------------------------------------------------------------------------- - -
- -For example, overriding the List View of Accounts: - -
- -Example 5.5: Overriding the Accounts List View - ------------------------------------------------------------------------- - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3
-4 require_once 'modules/Accounts/views/view.list.php';
-5
-6 class CustomAccountsViewList extends AccountsViewList
-7 {
-8
-9 }
- -
- ------------------------------------------------------------------------- - -
- -#### Making changes - -Now that we have a custom view what can we actually do? The views have -various methods which we can now override to change/add behaviour. The -most common ones to override are: - -; preDisplay -: Explicitly intended to allow logic to be called before display() is - called. This can be used to alter arguments to the list view or to - output anything to appear before the main display code (such as, for - example, adding JavaScript). ; display -: Does the actual work of displaying the view. Can be overridden to - alter this behaviour or to output anything after the main display. - You usually want to call parent::display(); to ensure that the - display code is run (unless, of course, you are adding your own - display logic). - - diff --git a/_source/pandoc-markdown/chap06.md b/_source/pandoc-markdown/chap06.md deleted file mode 100644 index de1a51a29..000000000 --- a/_source/pandoc-markdown/chap06.md +++ /dev/null @@ -1,869 +0,0 @@ ---- -title: Metadata -weight: 6 ---- - -### Intro - -Module metadata are used to describe how various views behave in the -module. The main use of this is providing field and layout information -but this can also be used to filter subpanels and to describe what -fields are used in the search. - -### Location - -Module metadata can be found in: - -
- -Example 6.1: Module metadata location - ------------------------------------------------------------------------- - -
- -
modules/<TheModule>/metadata/
- -
- ------------------------------------------------------------------------- - -
- -### Customising - -Usually studio is the best way of customising metadata. Even when you do -wish to make customisations that are not possible through studio it can -be simpler to set everything up in studio first. This is particularly -true for layout based metadata. However if you are customising metadata -it is as simple as placing, or editing, the file in the custom -directory. For example to override the Accounts detailviewdefs (found in -modules/Accounts/metadata/detailviewdefs.php) we would -place (or edit) the file in -custom/modules/Accounts/metadata/detailviewdefs.php. One -exception to this rule is the studio.php file. The modules metadata -folder is the only location checked - any version in -custom/<TheModule>/metadata/studio.php is ignored. - -### Different metadata - -#### detailviewdefs.php - -detailviewdefs.php provides information on the layout and fields of the -detail view for this module. This file uses the same structure as -editviewdefs.php. Let’s look at an example for a fictional module -ABC\_Vehicles: - -
- -Example 6.2: DetailView metadata definition - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2 $viewdefs ['ABC_Vehicles'] ['DetailView'] = array (
- 3  'templateMeta' => array (
- 4      'form' => array (
- 5          'buttons' => array (
- 6              'EDIT',
- 7              'DUPLICATE',
- 8              'DELETE',
- 9              'FIND_DUPLICATES'
-10          )
-11      ),
-12      'maxColumns' => '2',
-13      'widths' => array (
-14          array (
-15              'label' => '10',
-16              'field' => '30'
-17          ),
-18          array (
-19              'label' => '10',
-20              'field' => '30'
-21          )
-22      ),
-23      'includes' => array (
-24          array (
-25              'file' => 'modules/ABC_Vehicles/ABC_VehiclesDetail.js'
-26          )
-27      )
-28  ),
-29  'panels' => array (
-30      'LBL_ABC_VEHICLES_INFO' => array (
-31          array (
-32              array (
-33                  'name' => 'name',
-34                  'comment' => 'The Name of the Vehicle',
-35                  'label' => 'LBL_NAME',
-36              ),
-37              'reg_number'
-38          ),
-39          array (
-40              array (
-41                  'name' => 'type',
-42                  'label' => 'LBL_TYPE',
-43              ),
-44              array (
-45                  'name' => 'phone_fax',
-46                  'comment' => 'The fax phone number of this company',
-47                  'label' => 'LBL_FAX'
-48              )
-49          ),
-50          array (
-51              array (
-52                  'name' => 'registered_address_street',
-53                  'label' => 'LBL_REGISTERED_ADDRESS',
-54                  'type' => 'address',
-55                  'displayParams' => array (
-56                      'key' => 'registered'
-57                  )
-58              ),
-59          ),
-60      ),
-61      'LBL_PANEL_ADVANCED' => array (
-62       array (
-63              array (
-64                  'name' => 'assigned_user_name',
-65                  'label' => 'LBL_ASSIGNED_TO'
-66              ),
-67              array (
-68                  'name' => 'date_modified',
-69                  'label' => 'LBL_DATE_MODIFIED',
-70                  'customCode' => '{$fields.date_modified.value} '
-71                          + '{$APP.LBL_BY} '
-72                          + '{$fields.modified_by_name.value}',
-73              )
-74          ),
-75      ),
-76  )
-77 );
-78 ?>
- -
- ------------------------------------------------------------------------- - -
- -We see that line 2 defines an array -$viewdefs['ABC_Vehicles']['DetailView'] which places a DetailView entry for the module ABC_Vehicles into $viewdefs -(DetailView will be EditView or QuickCreateView as appropriate). This -array has two main keys defined here: - -#### = templateMeta \#\#\#\#= - -The templateMeta key provides information about the view in general. The -\['form'\]\['buttons'\] entries define the buttons that -should appear in this view. - -; maxColumns -: Defines the number of columns to use for this view. It is unusual - for this to be more than 2. ; widths -: An array defining the width of the label and field for each column. - ; includes -: An array of additional JavaScript files to include. This is useful - for adding custom JavaScript behaviour to the page. - -#### = panels \#\#\#\#= - -The panels entry defines the actual layout of the Detail (or Edit) view. -Each entry is a new panel in the view with the key being the label for -that panel. We can see in our example that we have 2 panels. One uses -the label defined by the language string -LBL\_ABC\_VEHICLES\_INFO, the other uses -LBL\_PANEL\_ADVANCED. - -Each panel has an array entry for each row, with each array containing -an entry for each column. For example we can see that the first row has -the following definition: - -
- -Example 6.3: DetailView metadata row definition - ------------------------------------------------------------------------- - -
- -
31 array(
-32  array (
-33      'name' => 'name',
-34      'comment' => 'The Name of the Vehicle',
-35      'label' => 'LBL_NAME',
-36  ),
-37  'reg_number',
-38 ),
- -
- ------------------------------------------------------------------------- - -
- -This has an array definition for the first row, first column and a -string definition for the first row, second column. The string -definition is very straightforward and simply displays the detail (or -edit, as appropriate) view for that field. It will use the default -label, type, etc. In our example we are displaying the field named -reg\_number. - -The array definition for the first row, first column is a little more -complex. Each array definition must have a name value. In -our example we are displaying the name field. However we -also supply some other values. Values most commonly used are: - -; comment -: Used to note the purpose of the field. ; label -: The language key for this label. If the language key is not - recognised then this value will be used instead (see the - \[\[\#chap08.xhtml\#language-chapter|chapter on language\]\]). ; - displayParams -: An array used to pass extra arguments for the field display. For the - options and how they are used you can have a look into the - appropriate field type in include/SugarFields/Fields or - custom/include/SugarFields/Fields. An example is - setting the size of a textarea: - -
- -Example 6.4: DetailView metadata displayParams - ------------------------------------------------------------------------- - -
- -
1 'displayParams' => array(
-2     'rows' => 2,
-3     'cols' => 30,
-4 ),
- -
- ------------------------------------------------------------------------- - -
- -; customCode -: Allows supplying custom smarty code to be used for the display. The - code here can include any valid smarty code and this will also have - access to the current fields in this view via - $fields. An example of outputing the ID field would be {$fields.id.value}. - Additionally the module labels and app labels can be accessed via - $MOD and $APP respectively. Finally you - can use @@FIELD@@ to output the value of the field that - would have been used. For example {if - \$someCondition}@@FIELD@@{/if} will conditionally show the - field. - -#### editviewdefs.php - -editviewdefs.php provides information on the layout and -fields of the edit view for this module. This file uses the same -structure as detailviewdefs.php. Please see the information on -detailviewdefs.php. - -#### listviewdefs.php - -The listviewdefs.php file for a module defines what fields -the list view for that module will display. Let’s take a look at an -example: - -
- -Example 6.5: ListView metadata definition - ------------------------------------------------------------------------- - -
- -
 1 $listViewDefs ['AOR_Reports'] =
- 2 array (
- 3   'NAME' =>
- 4   array (
- 5     'width' => '15%',
- 6     'label' => 'LBL_NAME',
- 7     'default' => true,
- 8     'link' => true,
- 9   ),
-10   'REPORT_MODULE' =>
-11   array (
-12     'type' => 'enum',
-13     'default' => true,
-14     'studio' => 'visible',
-15     'label' => 'LBL_REPORT_MODULE',
-16     'width' => '15%',
-17   ),
-18   'ASSIGNED_USER_NAME' =>
-19   array (
-20     'width' => '15%',
-21     'label' => 'LBL_ASSIGNED_TO_NAME',
-22     'module' => 'Employees',
-23     'id' => 'ASSIGNED_USER_ID',
-24     'default' => true,
-25   ),
-26   'DATE_ENTERED' =>
-27   array (
-28     'type' => 'datetime',
-29     'label' => 'LBL_DATE_ENTERED',
-30     'width' => '15%',
-31     'default' => true,
-32   ),
-33   'DATE_MODIFIED' =>
-34   array (
-35     'type' => 'datetime',
-36     'label' => 'LBL_DATE_MODIFIED',
-37     'width' => '15%',
-38     'default' => true,
-39   ),
-40 );
- -
- ------------------------------------------------------------------------- - -
- -To define the list view defs we simply add a key to the -\$listViewDefs array. In this case we add an entry for -AOR\_Reports This array contains an entry for each field -that we wish to show in the list view and is keyed by the upper case -name of the field. For example, the REPORT\_MODULE key -refers to the report\_module field of AOR\_Reports. - -; type -: The type of the field. This can be used to override how a field is - displayed. ; default -: Whether this field should be shown in the list view by default. If - false then the field will appear in the available columns list in - studio. ; studio -: Whether or not this field should be displayed in studio. This can be - useful to ensure that a critical field is not removed. ; label -: The label to be used for this field. If this is not supplied then - the default label for that field will be used. ; width -: The width of the field in the list view. Note that, although this is - usually given as a percentage it is treated as a proportion. The - example above has five columns with a width of 15% but - these will actually be 20% since this is a ratio. - -#### popupdefs.php - -popupdefs.php provides information on the layout, fields and search -options of the module popup that is usually used when selecting a -related record. - -Let’s look at the default popupdefs.php for the Accounts module: - -
- -Example 6.6: PopupView metadata definition - ------------------------------------------------------------------------- - -
- -
 1 $popupMeta = array(
- 2  'moduleMain' => 'Case',
- 3  'varName' => 'CASE',
- 4  'className' => 'aCase',
- 5  'orderBy' => 'name',
- 6  'whereClauses' =>
- 7      array('name' => 'cases.name',
- 8              'case_number' => 'cases.case_number',
- 9              'account_name' => 'accounts.name'),
-10  'listviewdefs' => array(
-11      'CASE_NUMBER' => array(
-12          'width' => '5',
-13          'label' => 'LBL_LIST_NUMBER',
-14          'default' => true),
-15      'NAME' => array(
-16          'width' => '35',
-17          'label' => 'LBL_LIST_SUBJECT',
-18          'link' => true,
-19          'default' => true),
-20      'ACCOUNT_NAME' => array(
-21          'width' => '25',
-22          'label' => 'LBL_LIST_ACCOUNT_NAME',
-23          'module' => 'Accounts',
-24          'id' => 'ACCOUNT_ID',
-25          'link' => true,
-26          'default' => true,
-27          'ACLTag' => 'ACCOUNT',
-28          'related_fields' => array('account_id')),
-29      'PRIORITY' => array(
-30          'width' => '8',
-31          'label' => 'LBL_LIST_PRIORITY',
-32          'default' => true),
-33      'STATUS' => array(
-34          'width' => '8',
-35          'label' => 'LBL_LIST_STATUS',
-36          'default' => true),
-37      'ASSIGNED_USER_NAME' => array(
-38          'width' => '2',
-39          'label' => 'LBL_LIST_ASSIGNED_USER',
-40          'default' => true,
-41         ),
-42      ),
-43  'searchdefs'   => array(
-44      'case_number',
-45      'name',
-46      array(
-47          'name' => 'account_name',
-48          'displayParams' => array(
-49              'hideButtons'=>'true',
-50              'size'=>30,
-51              'class'=>'sqsEnabled sqsNoAutofill'
-52          )
-53      ),
-54      'priority',
-55      'status',
-56      array(
-57          'name' => 'assigned_user_id',
-58          'type' => 'enum',
-59          'label' => 'LBL_ASSIGNED_TO',
-60          'function' => array(
-61              'name' => 'get_user_array',
-62              'params' => array(false))
-63          ),
-64    )
-65 );
- -
- ------------------------------------------------------------------------- - -
- -The popupdefs.php specifies a \$popupMeta array with the -following keys: - -; moduleMain -: The module that will be displayed by this popup. ; - varName -: The variable name used to store the search preferences etc. This - will usually simply the upper case module name. ; - className -: The class name of the SugarBean for this module. If this is not - supplied then moduleMain will be used. This is only - really required for classes where the class name and module name - differ (such as Cases). ; orderBy -: The default field the list of records will be sorted by. ; - whereClauses -: Legacy option. This is only used as a fallback when there are no - searchdefs. Defines the names of fields to allow searching for and - their database representation. ; listviewdefs -: The list of fields displayed in the popup list view. See - listviewdefs.php. ; searchdefs -: An array of the fields that should be available for searching in the - popup. See the individual search defs in the searchdefs.php section - (for example the basic\_search array). - -#### quickcreatedefs.php - -quickcreatedefs.php provides information on the layout and -fields of the quick create view for this module (this is the view that -appears when creating a record from a subpanel). This file uses the same -structure as detailviewdefs.php. Please see the information -on detailviewdefs.php. - -#### searchdefs.php - -The search defs of a module define how searching in that module looks -and behaves. - -Let’s look at an example. - -
- -Example 6.7: Search View metadata definition - ------------------------------------------------------------------------- - -
- -
  1 $searchdefs ['Accounts'] = array (
-  2     'templateMeta' => array (
-  3         'maxColumns' => '3',
-  4         'maxColumnsBasic' => '4',
-  5         'widths' => array (
-  6             'label' => '10',
-  7             'field' => '30'
-  8         )
-  9     ),
- 10     'layout' => array (
- 11         'basic_search' => array (
- 12             'name' => array (
- 13                 'name' => 'name',
- 14                 'default' => true,
- 15                 'width' => '10%'
- 16             ),
- 17             'current_user_only' => array (
- 18                 'name' => 'current_user_only',
- 19                 'label' => 'LBL_CURRENT_USER_FILTER',
- 20                 'type' => 'bool',
- 21                 'default' => true,
- 22                 'width' => '10%'
- 23             )
- 24         )
- 25         ,
- 26         'advanced_search' => array (
- 27             'name' => array (
- 28                 'name' => 'name',
- 29                 'default' => true,
- 30                 'width' => '10%'
- 31             ),
- 32             'website' => array (
- 33                 'name' => 'website',
- 34                 'default' => true,
- 35                 'width' => '10%'
- 36             ),
- 37             'phone' => array (
- 38                 'name' => 'phone',
- 39                 'label' => 'LBL_ANY_PHONE',
- 40                 'type' => 'name',
- 41                 'default' => true,
- 42                 'width' => '10%'
- 43             ),
- 44             'email' => array (
- 45                 'name' => 'email',
- 46                 'label' => 'LBL_ANY_EMAIL',
- 47                 'type' => 'name',
- 48                 'default' => true,
- 49                 'width' => '10%'
- 50             ),
- 51             'address_street' => array (
- 52                 'name' => 'address_street',
- 53                 'label' => 'LBL_ANY_ADDRESS',
- 54                 'type' => 'name',
- 55                 'default' => true,
- 56                 'width' => '10%'
- 57             ),
- 58             'address_city' => array (
- 59                 'name' => 'address_city',
- 60                 'label' => 'LBL_CITY',
- 61                 'type' => 'name',
- 62                 'default' => true,
- 63                 'width' => '10%'
- 64             ),
- 65             'address_state' => array (
- 66                 'name' => 'address_state',
- 67                 'label' => 'LBL_STATE',
- 68                 'type' => 'name',
- 69                 'default' => true,
- 70                 'width' => '10%'
- 71             ),
- 72             'address_postalcode' => array (
- 73                 'name' => 'address_postalcode',
- 74                 'label' => 'LBL_POSTAL_CODE',
- 75                 'type' => 'name',
- 76                 'default' => true,
- 77                 'width' => '10%'
- 78             ),
- 79             'billing_address_country' => array (
- 80                 'name' => 'billing_address_country',
- 81                 'label' => 'LBL_COUNTRY',
- 82                 'type' => 'name',
- 83                 'options' => 'countries_dom',
- 84                 'default' => true,
- 85                 'width' => '10%'
- 86             ),
- 87             'account_type' => array (
- 88                 'name' => 'account_type',
- 89                 'default' => true,
- 90                 'width' => '10%'
- 91             ),
- 92             'industry' => array (
- 93                 'name' => 'industry',
- 94                 'default' => true,
- 95                 'width' => '10%'
- 96             ),
- 97             'assigned_user_id' => array (
- 98                 'name' => 'assigned_user_id',
- 99                 'type' => 'enum',
-100                 'label' => 'LBL_ASSIGNED_TO',
-101                 'function' => array (
-102                     'name' => 'get_user_array',
-103                     'params' => array (
-104                             0 => false
-105                     )
-106                 ),
-107                 'default' => true,
-108                 'width' => '10%'
-109             )
-110         )
-111     )
-112 );
- -
- ------------------------------------------------------------------------- - -
- -Here we setup a new array for Accounts in the -\$searchdefs array. This has two keys: - -#### = templateMeta \#\#\#\#= - -The templateMeta key controls the basic look of the search -forms. Here we define some overall layout info such as the maximum -columns (3) and the maximum number of columns for the basic search (4). -Finally we set the widths for the search fields and their labels. - -#### = layout \#\#\#\#= - -The layout key contains the layout definitions for the -basic search and advanced search. This is simply a list of array -definition of the fields. See the section on listviewdefs.php for a -description of some of the options. - -#### subpaneldefs.php - -The subpaneldefs.php file provides definitions for the subpanels that -appear in the detail view of a module. Let’s look at an example: - -
- -Example 6.8: Subpanel metadata definition - ------------------------------------------------------------------------- - -
- -
 1 $layout_defs['AOS_Quotes'] = array (
- 2  'subpanel_setup' => array (
- 3      'aos_quotes_aos_contracts' => array (
- 4          'order' => 100,
- 5          'module' => 'AOS_Contracts',
- 6          'subpanel_name' => 'default',
- 7          'sort_order' => 'asc',
- 8          'sort_by' => 'id',
- 9          'title_key' => 'AOS_Contracts',
-10          'get_subpanel_data' => 'aos_quotes_aos_contracts',
-11          'top_buttons' => array (
-12              0 => array (
-13                  'widget_class' => 'SubPanelTopCreateButton'
-14              ),
-15              1 => array (
-16                  'widget_class' => 'SubPanelTopSelectButton',
-17                  'popup_module' => 'AOS_Contracts',
-18                  'mode' => 'MultiSelect'
-19              )
-20          )
-21      ),
-22      'aos_quotes_aos_invoices' => array (
-23          'order' => 100,
-24          'module' => 'AOS_Invoices',
-25          'subpanel_name' => 'default',
-26          'sort_order' => 'asc',
-27          'sort_by' => 'id',
-28          'title_key' => 'AOS_Invoices',
-29          'get_subpanel_data' => 'aos_quotes_aos_invoices',
-30          'top_buttons' => array (
-31              0 => array (
-32                  'widget_class' => 'SubPanelTopCreateButton'
-33              ),
-34              1 => array (
-35                  'widget_class' => 'SubPanelTopSelectButton',
-36                  'popup_module' => 'AOS_Invoices',
-37                  'mode' => 'MultiSelect'
-38              )
-39          )
-40      ),
-41      'aos_quotes_project' => array (
-42          'order' => 100,
-43          'module' => 'Project',
-44          'subpanel_name' => 'default',
-45          'sort_order' => 'asc',
-46          'sort_by' => 'id',
-47          'title_key' => 'Project',
-48          'get_subpanel_data' => 'aos_quotes_project',
-49          'top_buttons' => array (
-50              0 => array (
-51                  'widget_class' => 'SubPanelTopCreateButton'
-52              ),
-53              1 => array (
-54                  'widget_class' => 'SubPanelTopSelectButton',
-55                  'popup_module' => 'Accounts',
-56                  'mode' => 'MultiSelect'
-57              )
-58          )
-59      )
-60  )
-61 );
- -
- ------------------------------------------------------------------------- - -
- -In the example above we set up a definition for a module (in this case -AOS\_Quotes) in the \$layout\_defs array. This -has a single key subpanel\_setup which is an array of each -of the subpanel definitions keyed by a name. This name should be -something recognisable. In the case above it is the name of the link -field displayed by the subpanel. The entry for each subpanel usually has -the following defined: - -; order -: A number used for sorting the subpanels. The values themselves are - arbitrary and are only used relative to other subpanels. ; module -: The module which will be displayed by this subpanel. For example the - aos\_quotes\_project def in the example above will - display a list of Project records. ; subpanel\_name -: The subpanel from the displayed module which will be used. See the - subpanels section of this chapter. ; sort\_by -: The field to sort the records on. ; sort\_order -: The order in which to sort the sort\_by field. - asc for ascending desc for descending. ; - title\_key -: The language key to be used for the label of this subpanel. ; - get\_subpanel\_data -: Used to specify where to retrieve the subpanel records. Usually this - is just a link name for the current module. In this case the related - records will be displayed in the subpanel. However, for more complex - links, it is possible to specify a function to call. When specifying - a function you should ensure that the - get\_subpanel\_data entry is in the form - function:theFunctionName. Additionally you can specify - the location of the function and any additional parameters that are - needed by using the function\_parameters key. An - example of a subpanel which uses a function can be found in - \[\[\#chap19.xhtml\#appendix-a|Appendix A\]\]. ; - function\_parameters -: Specifies the parameters for a subpanel which gets it’s information - from a function (see
get\_subpanel\_data). This - is an array which allows specifying where the function is by using - the import\_function\_file key (if this is absent but - get\_subpanel\_data defines a function then the - function will be called on the bean for the parent of the subpanel). - Additionally this array will be passed as an argument to the - function defined in get\_subpanel\_data which allows - passing in arguments to the function. ; generate\_select -: For function subpanels (see get\_subpanel\_data) - whether or not the function will return an array representing the - query to be used (for generate\_select = true) or - whether it will simply return the query to be used as a string. ; - get\_distinct\_data -: Whether or not to only return distinct rows. Relationships do not - allow linking two records more than once therefore this only really - applies if the subpanel source is a function. See
- get\_subpanel\_data for information on function - subpanel sources. ; top\_buttons -: Allows defining the buttons to appear on the subpanel. This is - simply an array of the button definitions. These definitions have, - at least, the widget\_class defined which decides the - button class to use in include/generic/SugarWidgets. - Depending on the button this array may also be used to pass in extra - arguments to the widget class. - -#### subpanels - -Inside the metadata folder is the subpanels folder. This -allows creating different subpanel layouts for different parent modules. -For example, the Contacts module will display differently in the -subpanel on an account than it will in the subpanel of a case. The files -inside the subpanels folder can be named anything. All that -matters is that it can be referenced in the subpanel\_name -of the subpaneldefs.php of the parent module. The usual -subpanel file is simply called default.php. Let’s look at -the modules/Accounts/metadata/subpanels/default.php file: - -
- -Example 6.8: Module Subpanels definition - ------------------------------------------------------------------------- - -
- -
 1 $subpanel_layout = array(
- 2  'top_buttons' => array(
- 3      array(
- 4          'widget_class' => 'SubPanelTopCreateButton'
- 5      ),
- 6      array(
- 7          'widget_class' => 'SubPanelTopSelectButton',
- 8          'popup_module' => 'Accounts'
- 9      ),
-10  ),
-11  'where' => '',
-12  'list_fields' => array (
-13    'name' =>
-14    array (
-15     'vname' => 'LBL_LIST_ACCOUNT_NAME',
-16     'widget_class' => 'SubPanelDetailViewLink',
-17     'width' => '45%',
-18     'default' => true,
-19    ),
-20    'billing_address_city' =>
-21    array (
-22      'vname' => 'LBL_LIST_CITY',
-23      'width' => '20%',
-24      'default' => true,
-25    ),
-26    'billing_address_country' =>
-27    array (
-28      'type' => 'varchar',
-29      'vname' => 'LBL_BILLING_ADDRESS_COUNTRY',
-30      'width' => '7%',
-31      'default' => true,
-32    ),
-33    'phone_office' =>
-34    array (
-35      'vname' => 'LBL_LIST_PHONE',
-36      'width' => '20%',
-37      'default' => true,
-38    ),
-39    'edit_button' =>
-40    array (
-41      'vname' => 'LBL_EDIT_BUTTON',
-42      'widget_class' => 'SubPanelEditButton',
-43      'width' => '4%',
-44      'default' => true,
-45    ),
-46    'remove_button' =>
-47    array (
-48      'vname' => 'LBL_REMOVE',
-49      'widget_class' => 'SubPanelRemoveButtonAccount',
-50      'width' => '4%',
-51      'default' => true,
-52    ),
-53    )
-54 );
- -
- ------------------------------------------------------------------------- - -
- -There are three keys in the \$subpanel\_layout variable for -this subpanel. These are: - -; top\_buttons -: Defines the buttons that will appear at the top of the subpanel. See - the top\_buttons key in subpaneldefs.php. - ; where -: Allows the addition of conditions to the where clause. - For example this could be used to exclude Cases that are closed - (cases.state != "Closed") or only include Accounts of a - specific industry (accounts.industry = "Media"). Note - that in these examples we specify the table to remove any ambiguity - in the query. ; list\_fields -: Defines the list of fields to be displayed in this subpanel. See the - section on listviewdefs.php for more information. - -#### studio.php - -studio.php is the simplest file in metadata and it’s existence is simply -used to confirm if a module should be shown in studio for user tweaking. -Note that, unlike other metadata files, the file in -modules/<TheModule>/metadata/studio.php will be the -only one checked. A file in -custom/modules/<TheModule>/metadata/studio.php will -have no effect. - - diff --git a/_source/pandoc-markdown/chap07.md b/_source/pandoc-markdown/chap07.md deleted file mode 100644 index aa643de61..000000000 --- a/_source/pandoc-markdown/chap07.md +++ /dev/null @@ -1,177 +0,0 @@ ---- -title: Controllers -weight: 7 ---- - -SuiteCRM follows the MVC (Model-View-Controller) pattern and as such has -the concept of controllers. The controller is responsible for making -changes to the Model as well as passing control to the view as -appropriate. SuiteCRM has the concept of actions which are actions that -will be taken by the controller. Let’s take a look at a SuiteCRM URL: - -
- -Example 7.1: Example SuiteCRM URL - ------------------------------------------------------------------------- - -
- -
example.com/index.php?module=Accounts&action=index
- -
- ------------------------------------------------------------------------- - -
- -In this (rather boring) example we see that the module is Accounts. This -will determine which controller to use and then call the index action on -that controller. - -SuiteCRM will first look for the controller in -custom/module/<TheModule>/controller.php. If this is -not found then next module/<TheModule>/controller.php -will be checked. Finally if neither of these controllers exist then the -default controller will be used. The default controller can be found in -include/MVC/Controller/SugarController.php. - -### Customising controllers - -Ordinarily the default controller handles the request and delegates to -the appropriate views etc. However custom controllers can be used to add -or alter functionality. Let’s look at adding a new action. - -In the first instance we will have to add our custom controller. This -will vary slightly depending on the nature of the module. - -#### Custom module - -In this case we can place the file directly into our module. You should -create a new file (if it doesn’t exist) at -modules/<TheModule>/controller.php. The contents will -look similar to: - -
- -Example 7.2: Creating a custom controller for a custom module - ------------------------------------------------------------------------- - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 class <TheModule>Controller extends SugarController
-4 {
-5
-6 }
- -
- ------------------------------------------------------------------------- - -
- -#### Pre-existing modules - -For pre-existing modules you should add the controller to
-custom/modules/<TheModule>/controller.php. - -The contents of this file will vary depending on whether you wish to -extend the existing controller (if it exists) or create your own version -completely. It is usually best to extend the existing controller since -this will retain important logic. You should note the naming convention -here. We name the class
-Custom<TheModule>Controller. - -Here we don’t extend the existing controller or no such controller -exists: - -
- -Example 7.3: Creating a custom controller for an existing module - ------------------------------------------------------------------------- - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 class Custom<TheModule>Controller extends SugarController
-4 {
-5
-6 }
- -
- ------------------------------------------------------------------------- - -
- -Alternatively we extend the existing controller. Note that we are -requiring the existing controller: - -
- -Example 7.4: Creating a custom controller for an existing module with an -existing controller - ------------------------------------------------------------------------- - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3
-4 require_once 'modules/<TheModule>/controller.php';
-5
-6 class Custom<TheModule>Controller extends <TheModule>Controller
-7 {
-8
-9 }
- -
- ------------------------------------------------------------------------- - -
- -#### Adding the action - -Now we can add a new action to our controller. Actions are created as -methods on the controller with the name -action\_<actionName>. For example, to create a new -action called ‘echo’ we could create the following method in one of the -controllers we have created above. This can then perform whatever logic -that is needed. In our example we will log the REQUEST and simply -redirect: - -
- -Example 7.5: Adding a custom controller action method - ------------------------------------------------------------------------- - -
- -
1 public function action_echo(){
-2   $GLOBALS['log']->debug("Echo called with request: ".print_r($_REQUEST,1));
-3   SugarApplication::redirect('index.php');
-4 }
- -
- ------------------------------------------------------------------------- - -
- -#### Legacy Style - -In previous versions of SugarCRM a new action was added by creating a -file in either -modules/<TheModule>/<actionname>.php or -custom/modules/<TheModule>/<actionname>.php. -Although this still works it is not recommended. - - diff --git a/_source/pandoc-markdown/chap08.md b/_source/pandoc-markdown/chap08.md deleted file mode 100644 index dfba73312..000000000 --- a/_source/pandoc-markdown/chap08.md +++ /dev/null @@ -1,143 +0,0 @@ ---- -title: Entry Points -weight: 8 ---- - -Entry points are simply a page which provides access to SuiteCRM. These -can be used for a variety of purposes such as allowing an external form -simple access to SuiteCRM or, as is the case with the stock Events -module, allowing an event invite to be responded to by clicking a link -in an email. - -### Creating an entry point - -Let’s create a simple entry point to display the time. First we define -this entry point in a new file in: - -
- -Example 8.1: Entry point registry location - ------------------------------------------------------------------------- - -
- -
custom/Extension/application/Ext/EntryPointRegistry/
- -
- ------------------------------------------------------------------------- - -
- -For our example we’ll call our new file MyTimeEntryPoint.php - -
- -Example 8.2: Example entry point location - ------------------------------------------------------------------------- - -
- -
custom/Extension/application/Ext/EntryPointRegistry/MyTimeEntryPoint.php
- -
- ------------------------------------------------------------------------- - -
- -In this file we will add a new entry to the -\$entry\_point\_registry. We supply the file that should be -called. Here we are simply placing the file in custom if the entry point -is related to a specific module it is usually a good idea to place this -somewhere inside custom/<TheModule>/. - -In addition we supply an “auth” parameter. If “auth” is true then anyone -accessing the entry point will need to be logged into SuiteCRM. - -
- -Example 8.3: Adding an entry point entry - ------------------------------------------------------------------------- - -
- -
1 <?php
-2   $entry_point_registry['MyTimeEntryPoint'] = array(
-3       'file' => 'custom/MyTimeEntryPoint.php',
-4       'auth' => true,
-5   );
- -
- ------------------------------------------------------------------------- - -
- -Finally we add the actual logic itself inside -custom/MyTimeEntryPoint.php: - -
- -Example 8.4: Example entry point that outputs the current time - ------------------------------------------------------------------------- - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 $date = new DateTime();
-4 echo $date->format('r');
- -
- ------------------------------------------------------------------------- - -
- -After a Quick Repair and Rebuild we can access our entry point: - -
- -Example 8.5: Custom entry point URL - ------------------------------------------------------------------------- - -
- -
example.com/index.php?entryPoint=MyTimeEntryPoint
- -
- ------------------------------------------------------------------------- - -
- -and we should see something similar to: - -
- -Example 8.6: MyTimeEntryPoint - ------------------------------------------------------------------------- - -
- -
Sun, 15 Mar 2015 13:03:03 +0000
- -
- ------------------------------------------------------------------------- - -
- -Obviously this is a contrived example but any logic that can be -performed elsewhere in SuiteCRM can be performed in an entry poiny (for -example creating or editing -\[\[\#chap02.xhtml\#working-with-beans-chapter|SugarBeans\]\]). - - diff --git a/_source/pandoc-markdown/chap09.md b/_source/pandoc-markdown/chap09.md deleted file mode 100644 index cd6233745..000000000 --- a/_source/pandoc-markdown/chap09.md +++ /dev/null @@ -1,348 +0,0 @@ ---- -title: Language Strings -weight: 9 ---- - -Language strings provide an element of internationalisation to SuiteCRM. -It allows specifying different strings to be used in different languages -making it much easier to provide translations for modules and -customisations. Even if you are only targeting a single language it is -still worth using the language string functionality in SuiteCRM because -it allows the simple changing of strings within SuiteCRM and it also -allows users to customise the labels used in your customisations. There -are three main types of language strings that we will cover here. - -At the core, the language strings are a key value store. The keys are -used throughout SuiteCRM and the values are loaded based on the current -language. - -Languages are handled in SuiteCRM by prefixing the file name with the -IETF language code for the language that this file contains. Here are -some examples of different language file names: - -
- -Example 9.1: Example language file names - ------------------------------------------------------------------------- - -
- -
# Core Accounts language file for en_us (United States English)
-modules/Accounts/language/en_us.lang.php
-
-# Core Cases language file for es_es (Spanish as spoken in Spain)
-modules/Cases/language/es_es.lang.php
-
-# Custom language file for de_de (German)
-custom/Extension/application/Ext/Language/de_de.SomeCustomPackage.php
- -
- ------------------------------------------------------------------------- - -
- -SuiteCRM will choose the language prefix to be used based on the -language the user selected when logging in or the default language if -none was selected. Generally when a language file is loaded the default -language files and the en\_us files will also be loaded. -These files are then merged. This ensures that there will still be a -definition if there are language keys in either en\_us or -the default language that don’t have definitions in the current -language. In essence the language “falls back” to the default language -and en\_us if there are missing keys. - -### Module Strings - -#### Use - -Module strings are strings associated with a particular module. These -are usually, for example, field labels and panel name labels, but they -may be used for anything that is specific to a single module. - -#### Definition location - -Module strings are defined in the \$mod\_strings array. -This is initially defined in
-modules/<TheModule>/language/<LanguageTag>.lang.php, -for example
-modules/Accounts/language/en\_us.lang.php. - -#### Customisation location - -Customisations can be made to the module strings by adding a new file -in
-custom/Extension/modules/<TheModule>/Ext/Language/<LanguageTag>.<Name>.php -(<Name> in this case should be used to give it a -descriptive name). An example is -custom/Extension/modules/Accounts/Ext/Language/en\_us.MyLanguageFile.php. -See the Extensions section for more information on the Extensions -folder. - -### Application Strings - -#### Use - -Application strings are used for language strings and labels that are -not specific to a single module. Examples of these may include labels -that will appear in the headers or footers, labels that appear on search -buttons throughout SuiteCRM or labels for pagination controls. - -#### Definition location - -The application strings are defined in the \$app\_strings -array. This is initially defined in
-include/language/<LanguageTag>.lang.php. - -#### Customisation location - -Customisations can be made to the application strings in two ways. -Firstly you can edit the file
-custom/include/language/<LanguageTag>.lang.php. -However to promote modularity it is recommended that you add a new file -in the location
-custom/Extension/application/Ext/Language/<LanguageTag>.<Name>.php. -For example
-custom/Extension/application/Ext/Language/es\_es.MyAppLanguageFile.php. -<Name> should be used to give the file a descriptive -name. See the Extensions section for more information on the Extensions -folder. - -### Application List Strings - -#### Use - -Application list strings are used to store the various dropdowns and -lists used in SuiteCRM. Most of these are used as options for the -various enum fields in SuiteCRM e.g the account type or the opportunity -sales stage. - -#### Definition location - -The application list strings are defined in the -$app_list_strings array. Similar to the $app\_strings -array this is initially defined in -include/language/en\_us.lang.php. - -#### Customisation location - -Customisations can be made to the application list strings in two ways. -Firstly you can edit the file
-custom/include/language/<LanguageTag>.lang.php. -However to promote modularity it is recommended that you add a new file -in the location
-custom/Extension/application/Ext/Language/<LanguageTag>.<Name>.php -(<Name> should be used to give the file a descriptive -name). For example
-custom/Extension/application/Ext/Language/es\_es.MyAppListLanguageFile.php. -See the Extensions section for more information on the Extensions -folder. - -### Why and when to customise - -Generally language strings should be changed from within SuiteCRM using -the studio tool. However there are times when it can be simpler to add -or modify language strings as described in the previous section. If you -are importing a large number of language strings or dropdown options it -can be simpler to create a new file to add these values. Similarly if -you are adding entirely new functionality, it is usually best to simply -add these language strings as new values. - -### Usage - -Language strings are used automatically throughout SuiteCRM. For example -in metadata you can specify the language strings to display for fields. -However in some cases you will want to access and use the language -strings in custom code. There are several ways to do this. - -#### Globals - -The $mod_strings, $app\_strings and -$app_list_strings variables are all global and can be accessed as such. $app\_strings -and -$app_list_strings will always be available. However $mod\_strings -will only contain the strings for the current module (see the next -section for other ways of accessing \$mod\_strings). - -
- -Example 9.2: Accessing language strings globally - ------------------------------------------------------------------------- - -
- -
 1 function someFunction(){
- 2     global $mod_strings, $app_strings, $app_list_strings;
- 3     /*
- 4      * Grab the label LBL_NAME for the current module
- 5      * In most modules this will be the label for the
- 6      * name field of the module.
- 7      */
- 8     $modLabel = $mod_strings['LBL_NAME'];
- 9
-10     $appLabel = $app_strings['LBL_GENERATE_LETTER'];
-11
-12     /*
-13      * Unlike the previous two examples $appListLabel will be an
-14      * array of the dropdowns keys to it's display labels.
-15      */
-16     $appListLabel = $app_list_strings['aos_quotes_type_dom'];
-17
-18     //Here we just log out the strings
-19     $GLOBALS['log']->debug("The module label is $modLabel");
-20     $GLOBALS['log']->debug("The app label is $appLabel");
-21     $GLOBALS['log']->debug("The app list label is ".print_r($appListLabel,1));
-22 }
- -
- ------------------------------------------------------------------------- - -
- -#### Translate - -As an alternative to using globals or, if you are in a different module -than the language string you wish to retrieve you can use the -translate method. - -
- -Example 9.3: translate method signature - ------------------------------------------------------------------------- - -
- -
1 translate(
-2         $string,
-3         $mod='',
-4         $selectedValue='')
- -
- ------------------------------------------------------------------------- - -
- -; \$string -: The language string to be translated. ; \$mod -: The module this string should come from. Defaults to the current - module if empty. ; \$selectedValue -: For dropdown strings. This will return the label for the key - \$selectedValue - -Here is an example of the above in action. Note that we do not have to -worry about whether the label is a Module string, an Application string -or an Application list string, as all of these will be checked (in that -order - the first matching value will be returned). - -
- -Example 9.4: Example translate method calls - ------------------------------------------------------------------------- - -
- -
 1 function someFunction(){
- 2   //Grab the label LBL_NAME for the current module
- 3   $modLabel = translate('LBL_NAME');
- 4
- 5   //Grab the label LBL_NAME for the AOS_Products module
- 6   $productModLabel = translate('LBL_NAME','AOS_Products');
- 7
- 8   $appLabel = translate('LBL_GENERATE_LETTER');
- 9
-10   /*
-11    * Return the label for the `Other` option of the `aos_quotes_type_dom`
-12    * We don't care about the module so this is left blank.
-13    */
-14   $appListLabel = translate('aos_quotes_type_dom','','Other');
-15
-16   //Here we just log out the strings
-17   $GLOBALS['log']->debug("The module label is $modLabel");
-18   $GLOBALS['log']->debug("The module label for Products is $productModLabel");
-19   $GLOBALS['log']->debug("The app label is $appLabel");
-20   $GLOBALS['log']->debug("The app list label is ".print_r($appListLabel,1));
-21 }
- -
- ------------------------------------------------------------------------- - -
- -#### JavaScript - -Finally, you may be using JavaScript (for example in a view), and wish -to display a language string. For this you can use the -SUGAR.language.get method, which is similar to the -translate method in example 9.3. - -
- -Example 9.5: SUGAR.language.get method signature - ------------------------------------------------------------------------- - -
- -
1 SUGAR.language.get(
-2               module,
-3               str
-4 );
- -
- ------------------------------------------------------------------------- - -
- -; module -: The module a language string will be returned for. You should supply - app\_strings or
app\_list\_strings - if the label you wish to retrieve is not a module string. ; str -: The key you want to retrieve a label for. - -
- -Example 9.6: Example SUGAR.language.get method calls - ------------------------------------------------------------------------- - -
- -
 1 function someFunction(){
- 2
- 3   /*
- 4    * Grab the label LBL_NAME for AOS_Products
- 5    * Note that, unlike the translate function in example 9.3
- 6    * the module name is required.
- 7    */
- 8
- 9   var modLabel = SUGAR.language.get('AOS_Products', 'LBL_NAME');
-10
-11   /*
-12    * As mentioned above we explicitly need to pass if we are retrieving
-13    * an app_string or app_list_string
-14    */
-15   var appLabel = SUGAR.language.get('app_strings', 'LBL_GENERATE_LETTER');
-16   var appListLabel = SUGAR.language.get('app_list_strings',
-17                                         'aos_quotes_type_dom');
-18
-19   //Here we just log out the strings
-20   console.log("The module label is "+modLabel);
-21   console.log("The app label is "+appLabel);
-22   console.log("The app list label is "+appListLabel);
-23 }
- -
- ------------------------------------------------------------------------- - -
- - diff --git a/_source/pandoc-markdown/chap10.md b/_source/pandoc-markdown/chap10.md deleted file mode 100644 index e30dfbbf3..000000000 --- a/_source/pandoc-markdown/chap10.md +++ /dev/null @@ -1,158 +0,0 @@ ---- -title: Config -weight: 10 ---- - -### The config files - -There are two main config files in SuiteCRM, both of which are in the -root SuiteCRM folder. These are config.php and -config\_override.php. The definitions in here provide -various configuration options for SuiteCRM. All the way from the details -used to access the database to how many entries to show per page in the -list view. Most of these options are accessible from the SuiteCRM -administration page. However some are only definable in the config -files. - -#### config.php - -This is the main SuiteCRM config file and includes important information -like the database settings and the current SuiteCRM version. - -Generally settings in this file wont be changed by hand. An exception to -this is if SuiteCRM has been moved or migrated. In which case you may -need to change the database settings and the site\_url. Let’s look at -the database settings first: - -
- -Example 10.1: Database config definition - ------------------------------------------------------------------------- - -
- -
 1 'dbconfig' =>
- 2 array (
- 3   'db_host_name' => 'localhost',
- 4   'db_host_instance' => 'SQLEXPRESS',
- 5   'db_user_name' => 'dbuser',
- 6   'db_password' => 'dbpass',
- 7   'db_name' => 'dbname',
- 8   'db_type' => 'mysql',
- 9   'db_port' => '',
-10   'db_manager' => 'MysqliManager',
-11 ),
- -
- ------------------------------------------------------------------------- - -
- -Here we can see this instance is setup to access a local MySQL instance -using the username/password dbuser/dbpass and accessing the database -named ‘dbname’. - -The site url settings are even simpler: - -
- -Example 10.2: Setting the site URL - ------------------------------------------------------------------------- - -
- -
  'site_url' => 'http://example.com/suitecrm',
- -
- ------------------------------------------------------------------------- - -
- -The site url for the above is simply ‘http://example.com/suitecrm’ if we -were moving this instance to, for example, suite.example.org, then we -can simply place that value in the file. - -These are generally the only two instances where you would directly -change config.php. For other changes you would either make -the change through SuiteCRM itself or you would use the
-config\_override.php file. - -#### config\_override.php - -config\_override.php allows you to make config changes -without risking breaking the main config file. This is achieved quite -simply by adding, editing or removing items from the \$sugar\_config -variable. The config\_override.php file will be merged with -the existing config allowing, as the name suggests, overriding the -config. For example in config\_override.php we can add our own, new, -config item: - -
- -Example 10.3: Adding a custom config value - ------------------------------------------------------------------------- - -
- -
$sugar_config['enable_the_awesome'] = true;
- -
- ------------------------------------------------------------------------- - -
- -or we can edit an existing config option in a very similar manner by -simply overwriting it: - -
- -Example 10.4: Overwriting an existing config value - ------------------------------------------------------------------------- - -
- -
$sugar_config['logger']['level'] = 'debug';
- -
- ------------------------------------------------------------------------- - -
- -### Using config options - -We may want to access config options in custom code (or as detailed -above if we have created our own config setting we may want to use -that). We can easily get the config using the php global keyword: - -
- -Example 10.5: Accessing a config setting within SuiteCRM - ------------------------------------------------------------------------- - -
- -
1 function myCustomLogic(){
-2   //Get access to config
-3   global $sugar_config;
-4   //use the config values
-5   if(!empty($sugar_config['enable_the_awesome'])){
-6     doTheAwesome();
-7   }
-8 }
- -
- ------------------------------------------------------------------------- - -
- - diff --git a/_source/pandoc-markdown/chap11.md b/_source/pandoc-markdown/chap11.md deleted file mode 100644 index 1ccec2469..000000000 --- a/_source/pandoc-markdown/chap11.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: Logging -weight: 11 ---- - - -### Logging messages - -Logging in SuiteCRM is achieved by accessing the log global. Accessing -an instance of the logger is as simple as - -
- -Example 11.1: Accessing the log - ------------------------------------------------------------------------- - -
- -
$GLOBALS['log']
- -
- ------------------------------------------------------------------------- - -
- -This can then be used to log a message. Each log level is available as a -method. For example: - -
- -Example 11.2: Logging messages - ------------------------------------------------------------------------- - -
- -
1 $GLOBALS['log']->debug('This is a debug message');
-2 $GLOBALS['log']->error('This is an error message');
- -
- ------------------------------------------------------------------------- - -
- -This will produce the following output: - -
- -Example 11.3: Logging messages example output - ------------------------------------------------------------------------- - -
- -
1 Tue Apr 28 16:52:21 2015 [15006][1][DEBUG] This is a debug message
-2 Tue Apr 28 16:52:21 2015 [15006][1][ERROR] This is an error message
- -
- ------------------------------------------------------------------------- - -
- -### Logging output - -The logging output displays the following information by default: - -
- -Example 11.4: Logging messages example output - ------------------------------------------------------------------------- - -
- -
<Date> [<ProcessId>][<UserId>][<LogLevel>] <LogMessage>
- -
- ------------------------------------------------------------------------- - -
- -; <Date> -: The date and time that the message was logged. ; - <ProcessId> -: The PHP process id. ; <UserId> -: The ID of the user that is logged into SuiteCRM. ; - <LogLevel> -: The log level for this log message. ; - <LogMessage> -: The contents of the log message. - -### Log levels - -Depending on the level setting in admin some messages will not be added -to the log e.g if your logger is set to error then you will -only see log levels of error or higher (error, -fatal and security). - -The default log levels (in order of verbosity) are: - -- debug -- info -- warn -- deprecated -- error -- fatal -- security - -Generally on a production instance you will use the less verbose levels -(probably error or fatal). However whilst you -are developing you can use whatever level you prefer. I prefer the most -verbose level - debug. - - diff --git a/_source/pandoc-markdown/chap12.md b/_source/pandoc-markdown/chap12.md deleted file mode 100644 index e1abed6d9..000000000 --- a/_source/pandoc-markdown/chap12.md +++ /dev/null @@ -1,398 +0,0 @@ ---- -title: Logic Hooks -weight: 12 ---- - -Logic hooks allow you to hook into various events in SuiteCRM to fire -custom code. This can allow you to, for example, make a call to an -external API, or to create a new record if certain events occur. - -### Types - -Logic hooks can occur in three contexts. These contexts are Application -Hooks, Module Hooks and User Hooks. These are detailed below. - -### Application Hooks - -Application hooks are hooks which are fired in the application context -(that is, they are not fired against a particular module). These hooks -must be defined in the top level logic hook (i.e. -custom/modules/logic\_hooks.php). - -; after\_entry\_point -: Called after SuiteCRM has initialised but before any other - processing is carried out. ; after\_ui\_footer -: Called after the UI footer. ; after\_ui\_frame -: Fired after the UI has been displayed but before the footer has been - displayed. ; server\_round\_trip -: Fired at the end of every page request. - -### User Hooks - -User hooks are fired for certain login/logout actions. Similar to -Application Hooks, these hooks must be defined in the top level logic -hook (i.e. custom/modules/logic\_hooks.php). - -; after\_login -: Fired after a user logs in to SuiteCRM . ; after\_logout -: Fired when a user logs out of SuiteCRM. ; before\_logout -: Fired before a user logs out of SuiteCRM. ; login\_failed -: Fired when a user attempts to login to SuiteCRM but the login fails. - -### Module Hooks - -Module Hooks are called on various record actions for a specific module. - -; after\_delete -: Fired when a record is deleted. ; after\_relationship\_add -: Fired after a relationship is added between two records. Note that - this may be called twice, once for each side of the relationship. ; - after\_relationship\_delete -: Fired after a relationship between two records is deleted. ; - after\_restore -: Fired after a record is undeleted. ; after\_retrieve -: Fired after a record is retrieved from the DB. ; after\_save -: Fired after a record is saved. Note that due to some peculiarities - some related modules may not be persisted to the database. The logic - hook is fired within the SugarBean classes save method. Some - implementing classes may save related beans after this method - returns. A notable example of this is the saving of email addresses - in Company modules. ; before\_delete -: Fired before a record is deleted. ; before\_relationship\_add -: Fired before a relationship is added between two records. Note that - this may be called twice, once for each side of the relationship. ; - before\_relationship\_delete -: Fired before a relationship between two records is deleted. Note - that this may be called twice, once for each side of the - relationship. ; before\_restore -: Fired before a record is undeleted. ; before\_save -: Fired before a record is saved. ; handle\_exception -: Fired when an exception occurs in a record. ; process\_record -: Fired when a record is processed ready to be displayed in list views - or dashlets. - -### Job Queue Hooks - -Job queue hooks are fired for scheduler jobs. Similar to application -hooks these hooks must be defined in the top level logic hook (i.e. -custom/modules/logic\_hooks.php). - -; job\_failure -: Fired when a scheduled job either returns false to signify failure - or throws an exception and it will not be retried. See the section - on \[\[\#chap12.xhtml\#scheduled-tasks-chapter|Scheduled Tasks\]\]. - ; job\_failure\_retry -: Fired when a scheduled job either returns false to signify failure - or throws an exception but it will be retried. See the section on - \[\[\#chap12.xhtml\#scheduled-tasks-chapter|Scheduled Tasks\]\]. - -### Implementing - -Depending on the Logic Hook type logic hooks are either placed -into
custom/modules/Logic\_Hooks.php or -custom/modules/<TargetModule>/Logic\_Hooks.php. - -#### Logic\_Hooks.php - -The logic hook file itself specifies which logic hooks to fire on this -event. It looks something like this: - -
- -Example 12.1: Logic hook file - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2 // Do not store anything in this file that is not part of the array or the hook
- 3 //version.  This file will be automatically rebuilt in the future.
- 4  $hook_version = 1;
- 5 $hook_array = Array();
- 6 // position, file, function
- 7 $hook_array['before_save'] = Array();
- 8 $hook_array['before_save'][] = Array(
- 9                               77,
-10                               'updateGeocodeInfo',
-11                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-12                               'CasesJjwg_MapsLogicHook',
-13                               'updateGeocodeInfo');
-14 $hook_array['before_save'][] = Array(
-15                               10,
-16                               'Save case updates',
-17                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-18                               'CaseUpdatesHook',
-19                               'saveUpdate');
-20 $hook_array['before_save'][] = Array(
-21                               11,
-22                               'Save case events',
-23                               'modules/AOP_Case_Events/CaseEventsHook.php',
-24                               'CaseEventsHook',
-25                               'saveUpdate');
-26 $hook_array['before_save'][] = Array(
-27                               12,
-28                               'Case closure prep',
-29                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-30                               'CaseUpdatesHook',
-31                               'closureNotifyPrep');
-32 $hook_array['before_save'][] = Array(
-33                               1,
-34                               'Cases push feed',
-35                               'custom/modules/Cases/SugarFeeds/CaseFeed.php',
-36                               'CaseFeed',
-37                               'pushFeed');
-38 $hook_array['after_save'] = Array();
-39 $hook_array['after_save'][] = Array(
-40                               77,
-41                               'updateRelatedMeetingsGeocodeInfo',
-42                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-43                               'CasesJjwg_MapsLogicHook',
-44                               'updateRelatedMeetingsGeocodeInfo');
-45 $hook_array['after_save'][] = Array(
-46                               10,
-47                               'Send contact case closure email',
-48                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-49                               'CaseUpdatesHook',
-50                               'closureNotify');
-51 $hook_array['after_relationship_add'] = Array();
-52 $hook_array['after_relationship_add'][] = Array(
-53                               77,
-54                               'addRelationship',
-55                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-56                               'CasesJjwg_MapsLogicHook',
-57                               'addRelationship');
-58 $hook_array['after_relationship_add'][] = Array(
-59                               9,
-60                               'Assign account',
-61                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-62                               'CaseUpdatesHook',
-63                               'assignAccount');
-64 $hook_array['after_relationship_add'][] = Array(
-65                               10,
-66                               'Send contact case email',
-67                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-68                               'CaseUpdatesHook',
-69                               'creationNotify');
-70 $hook_array['after_relationship_delete'] = Array();
-71 $hook_array['after_relationship_delete'][] = Array(
-72                               77,
-73                               'deleteRelationship',
-74                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-75                               'CasesJjwg_MapsLogicHook',
-76                               'deleteRelationship');
- -
- ------------------------------------------------------------------------- - -
- -Let’s go through each part of the file. - -
- -
- -
4 $hook_version = 1;
- -
- -
- -This sets the hook version that we are using. Currently there is only -one version so this line is unused. - -
- -
- -
5 $hook_array = Array();
- -
- -
- -Here we set up an empty array for our Logic Hooks. This should always be -called \$hook\_array. - -
- -
- -
7 $hook_array['before_save'] = Array();
- -
- -
- -Here we are going to be adding some before\_save hooks so we add an -empty array for that key. - -
- -
- -
 8 $hook_array['before_save'][] = Array(
- 9                               77,
-10                               'updateGeocodeInfo',
-11                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-12                               'CasesJjwg_MapsLogicHook',
-13                               'updateGeocodeInfo');
- -
- -
- -Finally we reach an interesting line. This adds a new logic hook to the -before\_save hooks. This array contains 5 entries which define this -hook. These are: - -#### = Sort order \#\#\#\#= - -The first argument (77) is the sort order for this hook. The logic hook -array is sorted by this value. If you wish for a hook to fire earlier -you should use a lower number. If you wish for a hook to be fired later -you should use a higher number. The numbers themselves are arbitrary. - -#### = Hook label \#\#\#\#= - -The second argument (‘updateGeocodeInfo’) is simply a label for the -logic hook. This should be something short but descriptive. - -#### = Hook file \#\#\#\#= - -The third argument is where the actual class for this hook is. In this -case it is in a file called -custom/modules/Cases/CasesJjwg\_MapsLogicHook.php. -Generally you will want the files to be somewhere in custom and it is -usual to have them in -custom/modules/<TheModule>/<SomeDescriptiveName>.php -or custom/modules/<SomeDescriptiveName>.php for Logic -Hooks not targeting a specific module. However the files can be placed -anywhere. - -#### = Hook class \#\#\#\#= - -The fourth argument is the class name for the Logic Hook class. In this -case
CasesJjwg\_MapsLogicHook. It is usual for the -class name to match the file name but this is not required. - -#### = Hook method \#\#\#\#= - -The fifth, and final, argument is the method that will be called on the -class. In this case updateGeocodeInfo. - -#### Adding your own logic hooks - -When adding logic hooks you should make full use of the Extensions -framework (see the section on Extensions). This involves creating a file -in
custom/Extension/application/Ext/LogicHooks/ for -application hooks and
-custom/Extension/modules/<TheModule>/Ext/LogicHooks/ -for module specific hooks. These files can then add to/alter the -\$hook\_array as appropriate. - -{| |width="50%"| -\[\[File:images/leanpub\_info-circle.png|50px|class=sidebar-image|information\]\] -|width="50%"| After adding a new logic hook it is necessary to perform a -quick repair and rebuild in the admin menu for this to be picked up. |} - -#### Logic Hook function - -The logic hook function itself will vary slightly based on the logic -hook type. For module hooks it will appear similar to: - -
- -Example 12.2: Example logic hook method - ------------------------------------------------------------------------- - -
- -
1     class SomeClass
-2     {
-3         function someMethod($bean, $event, $arguments)
-4         {
-5           //Custom Logic
-6         }
-7     }
- -
- ------------------------------------------------------------------------- - -
- -Application logic hooks omit the \$bean argument: - -
- -Example 12.3: Example logic hook method for application hooks - ------------------------------------------------------------------------- - -
- -
1     class SomeClass
-2     {
-3         function someMethod($event, $arguments)
-4         {
-5           //Custom Logic
-6         }
-7     }
- -
- ------------------------------------------------------------------------- - -
- -#### = \$bean (SugarBean) \#\#\#\#= - -The \$bean argument passed to your logic hook is usually the bean that -the logic hook is being performed on. For User Logic Hooks this will be -the current User object. For module logic hooks (such as -before\_save) this will be the record that is being saved. -For job queue logic hooks this will be the SchedulersJob bean. Note that -for Application Logic Hook this argument is not present. - -#### = \$event (string) \#\#\#\#= - -The \$event argument contains the logic hook event e.g -process\_record, before\_save,
-after\_delete etc. - -#### = \$arguments (array) \#\#\#\#= - -The \$arguments argument contains any additional details of the logic -hook event. I.e. in the case of before\_relationship\_add this will -contain details of the related modules. - -### Tips - -{| |width="50%"| -\[\[File:images/leanpub\_info-circle.png|50px|class=sidebar-image|information\]\] -|width="50%"| \#\#\#\# Triggering extra logic hooks \#\#\#\# - -If you are performing certain actions that may trigger another logic -hook (such as saving a bean) then you need to be aware that this will -trigger the logic hooks associated with that bean and action. This can -be troublesome if this causes a logic hook loop of saves causing further -saves. One way around this is to simply be careful of the hooks that you -may trigger. If doing so is unavoidable you can usually set an -appropriate flag on the bean and then check for that flag in subsequent -hooks. |} - -{| |width="50%"| -\[\[File:images/leanpub\_info-circle.png|50px|class=sidebar-image|information\]\] -|width="50%"| \#\#\#\# Think of the user \#\#\#\# - -Most logic hooks will cause additional code which can degrade the users -experience. If you have long running code in the after\_save the user -will need to wait for that code to run. This can be avoided by either -ensuring the code runs quickly or by using the Job Queue (see the Job -Queue chapter for more information). |} - - diff --git a/_source/pandoc-markdown/chap13.md b/_source/pandoc-markdown/chap13.md deleted file mode 100644 index b73dcf51a..000000000 --- a/_source/pandoc-markdown/chap13.md +++ /dev/null @@ -1,472 +0,0 @@ ---- -title: Scheduled Tasks -weight: 13 ---- - -### Intro - -Scheduled tasks are performed in SuiteCRM by the scheduler module. Jobs -are placed into the queue either through the defined scheduled tasks or, -for one off tasks, by code creating job objects. Note that both -scheduled tasks and using the job queue requires that you have the -schedulers set up. This will vary depending on your system but usually -requires adding an entry either to Cron (for Linux systems) or to the -windows scheduled tasks (for windows). Opening the scheduled tasks page -within SuiteCRM will let you know the format for the entry. - -### Scheduler - -Scheduled tasks allow SuiteCRM to perform recurring tasks. Examples of -these which ship with SuiteCRM include checking for incoming mail, -sending email reminder notifications and indexing the full text search. -What if you want to create your own tasks? - -SuiteCRM lets you define your own Scheduler. We do this by creating a -file in
-custom/Extension/modules/Schedulers/Ext/ScheduledTasks/. -You can give this file a name of your choice but it is more helpful to -give it a descriptive name. Let’s create a simple file named
-custom/Extension/modules/Schedulers/Ext/ScheduledTasks/CleanMeetingsScheduler.php. -This will add a new job to the job strings and a new method that the -scheduler will call: - -
- -Example 13.1: Example Clean Meetings Scheduler - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2 /*
- 3  * We add the method name to the $job_strings array.
- 4  * This is the method that jobs for this scheduler will call.
- 5  */
- 6 $job_strings[] = 'cleanMeetingsScheduler';
- 7
- 8 /**
- 9  * Example scheduled job to change any 'Planned' meetings older than a month
-10  * to 'Not Held'.
-11  * @return bool
-12  */
-13 function cleanMeetingsScheduler(){
-14   //Get the cutoff date for which meetings will be considered
-15  $cutOff = new DateTime('now - 1 month');
-16  $cutOff = $cutOff->format('Y-m-d H:i:s');
-17
-18  //Get an instance of the meetings bean for querying
-19   //see the Working With Beans chapter.
-20   $bean = BeanFactory::getBean('Meetings');
-21
-22   //Get the list of meetings older than the cutoff that are marked as Planned
-23   $query = "meetings.date_start < '$cutOff' AND meetings.status = 'Planned'";
-24   $meetings = $bean->get_full_list('',$query);
-25
-26   foreach($meetings as $meeting){
-27     //Mark each meeting as Not Held
-28     $meeting->status = 'Not Held';
-29     //Save the meeting changes
-30     $meeting->save();
-31   }
-32   //Signify we have successfully ran
-33   return true;
-34 }
- -
- ------------------------------------------------------------------------- - -
- -We also make sure that we add a language file in
-custom/Extension/modules/Schedulers/Ext/Language/en\_us.cleanMeetingsScheduler.php -again, the name of the file doesn’t matter but it is helpful to use -something descriptive. This will define the language string for our job -so the user sees a nice label. See the section on language strings for -more information. The key for the mod strings will be -LBL\_UPPERMETHODNAME. In our case our method name is -cleanMeetingsScheduler so our language label key will be -LBL\_CLEANMEETINGSSCHEDULER. - -
- -Example 13.2: Example Language string for Clean Meetings Scheduler - ------------------------------------------------------------------------- - -
- -
1 <?php
-2 //We add the mod string for our method here.
-3 $mod_strings['LBL_CLEANMEETINGSSCHEDULER'] = 'Mark old, planned meetings as Not \
-4 Held';
- -
- ------------------------------------------------------------------------- - -
- -If we perform a repair and rebuild our method will now be packaged up -into the scheduler ext file (see the Extensions section for more -information on this process) and will be available in the schedulers -page. Note that for any changes to the scheduler method you will need to -perform another quick repair and rebuild - even in developer mode. We -can now create a new scheduler to call our new method: - -
- -\[\[File:images/CreateMeetingsScheduler.png|Creating a scheduler that -uses our new method\]\] Creating a scheduler that uses our new method - -
- -This will now behave just like any other scheduler and we can have this -run as often (or as rarely) as we would like. Take care here. The -default frequency is every one minute. If your task is heavy duty or -long running this may not be what you would prefer. Here we settle for -once a day. - -### Job Queue - -Sometimes you will require code to perform a long running task but you -do not need the user to wait for this to be completed. A good example of -this is sending an email in a logic hook (see the Logic Hooks chapter -for information on these). Assuming we have the following logic hook: - -
- -Example 13.3: Example Email sending Logic Hook - ------------------------------------------------------------------------- - -
- -
 1 class SomeClass
- 2 {
- 3     function SomeMethod($bean, $event, $arguments)
- 4     {
- 5
- 6         //Perform some setup of the email class
- 7         require_once "include/SugarPHPMailer.php";
- 8         $mailer=new SugarPHPMailer();
- 9         $admin = new Administration();
-10         $admin->retrieveSettings();
-11         $mailer->prepForOutbound();
-12         $mailer->setMailerForSystem();
-13         $admin = new Administration();
-14         $admin->retrieveSettings();
-15         $admin->settings['notify_fromname']
-16         $mailer->From     = $admin->settings['notify_fromaddress']
-17         $mailer->FromName = $emailSettings['from_name'];
-18         $mailer->IsHTML(true);
-19
-20         //Add message and recipient.
-21         //We could go all out here and load and populate an email template
-22         //or get the email address from the bean
-23         $mailer->Subject = 'My Email Notification! '.$bean->name;
-24         $mailer->Body = $event. ' fired for bean '.$bean->name;
-25         $mailer->AddAddress('Jim@example.com');
-26         return $mailer->Send();
-27     }
-28 }
- -
- ------------------------------------------------------------------------- - -
- -This will work fine. However you do not want the user to have to wait -for the email to be sent out as this can cause the UI to feel sluggish. -Instead you can create a Job and place it into the job queue and this -will be picked by the scheduler. Let’s look at an example of how you -would do this. - -First we want our Logic Hook class to create the scheduled job: - -
- -Example 13.4: Example Scheduled Job Creation - ------------------------------------------------------------------------- - -
- -
 1 class SomeClass
- 2 {
- 3     function SomeMethod($bean, $event, $arguments)
- 4     {
- 5       require_once 'include/SugarQueue/SugarJobQueue.php';
- 6       $scheduledJob = new SchedulersJob();
- 7
- 8       //Give it a useful name
- 9       $scheduledJob->name = "Email job for {$bean->module_name} {$bean->id}";
-10
-11       //Jobs need an assigned user in order to run. You can use the id
-12       //of the current user if you wish, grab the assigned user from the
-13       //current bean or anything you like.
-14       //Here we use the default admin user id for simplicity
-15       $scheduledJob->assigned_user_id = '1';
-16
-17       //Pass the information that our Email job will need
-18       $scheduledJob->data = json_encode(array(
-19                                             'id' => $bean->id,
-20                                             'module' => $bean->module_name)
-21                                         );
-22
-23       //Tell the scheduler what class to use
-24       $scheduledJob->target = "class::BeanEmailJob";
-25
-26       $queue = new SugarJobQueue();
-27       $queue->submitJob($scheduledJob);
-28     }
-29 }
- -
- ------------------------------------------------------------------------- - -
- -Next we create the BeanEmailJob class. This is placed into the
-custom/Extensions/modules/Schedulers/Ext/ScheduledTasks/ -directory with the same name as the class. So in our example we will -have:
-custom/Extensions/modules/Schedulers/Ext/ScheduledTasks/BeanEmailJob.php - -
- -Example 13.5: Example Scheduler job - ------------------------------------------------------------------------- - -
- -
 1 class BeanEmailJob implements RunnableSchedulerJob
- 2 {
- 3   public function run($arguments)
- 4   {
- 5
- 6     //Only different part of the email code.
- 7     //We grab the bean using the supplied arguments.
- 8     $arguments = json_decode($arguments,1);
- 9     $bean = BeanFactory::getBean($arguments['module'],$arguments['id']);
-10
-11     //Perform some setup of the email class
-12     require_once "include/SugarPHPMailer.php";
-13     $mailer=new SugarPHPMailer();
-14     $admin = new Administration();
-15     $admin->retrieveSettings();
-16     $mailer->prepForOutbound();
-17     $mailer->setMailerForSystem();
-18     $admin = new Administration();
-19     $admin->retrieveSettings();
-20     $mailer->From     = $admin->settings['notify_fromaddress'];
-21     $mailer->FromName = $emailSettings['from_name'];
-22     $mailer->IsHTML(true);
-23
-24     //Add message and recipient.
-25     //We could go all out here and load and populate an email template
-26     //or get the email address from the bean
-27     $mailer->Subject = 'My Email Notification! '.$bean->name;
-28     $mailer->Body = $event. ' fired for bean '.$bean->name;
-29     $mailer->AddAddress('Jim@example.com');
-30     return $mailer->Send();
-31   }
-32   public function setJob(SchedulersJob $job)
-33   {
-34     $this->job = $job;
-35   }
-36 }
- -
- ------------------------------------------------------------------------- - -
- -Now whenever a user triggers the hook it will be much quicker since we -are simply persisting a little info to the database. The scheduler will -run this in the background. - -#### Retries - -Occasionally you may have scheduled jobs which could fail -intermittently. Perhaps you have a job which calls an external API. If -the API is unavailable it would be unfortunate if the job failed and was -never retried. Fortunately the SchedulersJob class has two properties -which govern how retries are handled. These are requeue and -retry\_count. - -; requeue -: Signifies that this job is eligible for retries. ; - retry\_count -: Signifies how many retries remain for this job. If the job fails - this value will be decremented. - -We can revisit our previous example and add two retries: - -
- -Example 13.6: Setting the retry count on a scheduled job - ------------------------------------------------------------------------- - -
- -
 6       $scheduledJob = new SchedulersJob();
- 7
- 8       //Give it a useful name
- 9       $scheduledJob->name = "Email job for {$bean->module_name} {$bean->id}";
-10
-11       //Jobs need an assigned user in order to run. You can use the id
-12       //of the current user if you wish, grab the assigned user from the
-13       //current bean or anything you like.
-14       //Here we use the default admin user id for simplicity
-15       $scheduledJob->assigned_user_id = '1';
-16
-17       //Pass the information that our Email job will need
-18       $scheduledJob->data = json_encode(array(
-19                                             'id' => $bean->id,
-20                                             'module' => $bean->module_name)
-21                                         );
-22
-23       //Tell the scheduler what class to use
-24       $scheduledJob->target = "class::BeanEmailJob";
-25
-26       //Mark this job for 2 retries.
-27       $scheduledJob->requeue = true;
-28       $scheduledJob->retry = 2;
- -
- ------------------------------------------------------------------------- - -
- -See the section on \[\[\#chap11.xhtml\#logic-hooks-chapter|logic -hooks\]\] for more information on how job failures can be handled. - -### Debugging - -With Scheduled tasks and jobs running in the background it can sometimes -be difficult to determine what is going on when things go wrong. If you -are debugging a scheduled task the the scheduled task page is a good -place to start. For both scheduled tasks and job queue tasks you can -also check the job\_queue table. For example, in MySQL we can check the -last five scheduled jobs: - -
- -Example 13.7: Example MySQL query for listing jobs - ------------------------------------------------------------------------- - -
- -
SELECT * FROM job_queue ORDER BY date_entered DESC LIMIT 5
- -
- ------------------------------------------------------------------------- - -
- -This will give us information on the last five jobs. Alternatively we -can check on specific jobs: - -
- -Example 13.8: Example MySQL query for listing BeanEmailJobs - ------------------------------------------------------------------------- - -
- -
SELECT * FROM job_queue WHERE target = 'class::BeanEmailJob'
- -
- ------------------------------------------------------------------------- - -
- -In either case this will give details for the job(s): - -
- -Example 13.9: Example MySQL list of jobs - ------------------------------------------------------------------------- - -
- -
*************************** 1. row ***************************
-assigned_user_id: 1
-              id: 6cdf13d5-55e9-946e-9c98-55044c5cecee
-            name: Email job for Accounts 103c4c9b-336f-0e87-782e-5501defb5900
-         deleted: 0
-    date_entered: 2015-03-14 14:58:15
-   date_modified: 2015-03-14 14:58:25
-    scheduler_id:
-    execute_time: 2015-03-14 14:58:00
-          status: done
-      resolution: success
-         message: NULL
-          target: class::BeanEmailJob
-            data: {"id":"103c4c9b-336f-0e87-782e-5501defb5900","module":"Account\
-s"}
-         requeue: 0
-     retry_count: NULL
-   failure_count: NULL
-       job_delay: 0
-          client: CRON3b06401793b3975cd00c0447c071ef9a:7781
-percent_complete: NULL
-1 row in set (0.00 sec)
- -
- ------------------------------------------------------------------------- - -
- -Here we can check the status, resolution and message fields. If the -status is queued then either the scheduler has not yet run -or it isn’t running. Double check your Cron settings if this is the -case. - -It may be the case that the job has ran but failed for some reason. In -this case you will receive a message telling you to check the logs. -Checking the logs usually provides enough information, particularly if -you have made judicious use of logging (see the chapter on logging) in -your job. - -It is possible that the job is failing outright, in which case your -logging may not receive output before the scheduler exits. In this case -you can usually check your PHP logs. - -As a last resort you can manually run the scheduler from the SuiteCRM -directory using: - -
- -Example 13.10: Running the scheduler manually - ------------------------------------------------------------------------- - -
- -
php -f cron.php
- -
- ------------------------------------------------------------------------- - -
- -Using this in addition to outputting any useful information should track -down even the oddest of bugs. - - diff --git a/_source/pandoc-markdown/chap14.md b/_source/pandoc-markdown/chap14.md deleted file mode 100644 index 41a689538..000000000 --- a/_source/pandoc-markdown/chap14.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: Extension Framework -weight: 14 ---- - -The extension framework provides a means to modify various application -data inside SuiteCRM. For example it provides a way to add or modify -vardefs, scheduled tasks, language strings and more. In general a folder -is provided in custom/Extension (the exact path depends on -the extension). This folder is then scanned for files which will be -consolidated into a single ext file which SuiteCRM will then read and -use. In this way it is possible for developers to add a new file to -affect the behaviour of SuiteCRM rather than altering existing files. -This makes the changes more modular and allows the easy addition or -removal of changes. Additionally, because these files are all -consolidated it means that there is no affect on performance of checking -a (possibly large) number of files. This is only done when performing a -repair and rebuild in the admin menu. - -### Standard Extensions - -List of standard SuiteCRM extensions - -{| ! Extension Directory ! Compiled file ! Module ! Description |- | -ActionViewMap | action\_view\_map.ext.php |   | Used to map actions for -a module to a specified view. |- | ActionFileMap | -action\_file\_map.ext.php |   | Used to map actions for a module to a -specified file. |- | ActionReMap | action\_remap.ext.php |   | Used to -map actions for a module to existing actions. |- | Administration | -administration.ext.php | Administration | Used to add new sections to -the administration panel. |- | EntryPointRegistry | -entry\_point\_registry.ext.php | application | Used to add new entry -points to SuiteCRM. See the chapter on -\[\[\#chap07.xhtml\#entry-point-chapter|Entry Points\]\]. |- | -Extensions | extensions.ext.php | application | Used to add new -extension types. |- | FileAccessControlMap | -file\_access\_control\_map.ext.php |   | Used to add, update or delete -entries in the access control lists for files. |- | Language | -N/A\[\[\#chap13.xhtml\#fn-langNote|1\]\] |   | Used to add, -update or delete language strings for both modules and app strings. See -the chapter on \[\[\#chap08.xhtml\#language-chapter|Language -Strings\]\]. |- | Layoutdefs | layoutdefs.ext.php |   | Used to add, -update or delete subpanel definitions for a module. |- | GlobalLinks | -links.ext.php | application | Used to add, update or delete global links -(the list of links that appear in the top right of the SuiteCRM UI). |- -| LogicHooks | logichooks.ext.php |   | Used to add, update or delete -logic hooks. See the chapter on -\[\[\#chap11.xhtml\#logic-hooks-chapter|Logic Hooks\]\]. |- | Include | -modules.ext.php | application | Used to register new beans and modules. -|- | Menus | menu.ext.php |   | Used to add, update or delete the menu -links for each module. |- | ScheduledTasks | scheduledtasks.ext.php | -Schedulers | Used to add new scheduled tasks. See the chapter on -\[\[\#chap12.xhtml\#scheduled-tasks-chapter|Scheduled Tasks\]\]. |- | -UserPage | userpage.ext.php | Users | Unused |- | Utils | -custom\_utils.ext.php | application | Used to add new utility methods. -|- | Vardefs | vardefs.ext.php |   | Used to add, update or delete -vardefs for a module. See the section on -\[\[\#chap03.xhtml\#vardefs-chapter|Vardefs\]\]. |- | JSGroupings | -jsgroups.ext.php |   | Used to add, update or delete JavaScript -groupings. |- | Actions | actions.ext.php | AOW\_Actions | Used to add -new WorkFlow actions. |} - -### Custom Extensions - -Interestingly the extension framework can be used to add new extensions. -This allows you to create customisations that are easily customised by -others (in a similar manner to, for example, how vardefs can be added - -see the chapter on \[\[\#chap03.xhtml\#vardefs-chapter|Vardefs\]\]). - -To create a custom extension you simply add a new file in
-custom/Extension/application/Ext/Extensions. This can be -given a name of your choosing. Our example will use
-custom/Extension/application/Ext/Extensions/SportsList.php -and will look like: - -
- -Example 14.1: Adding an entry point entry - ------------------------------------------------------------------------- - -
- -
1 <?php
-2 $extensions["sports_list"] =  array(
-3                 "section" => "sports_list",
-4                 "extdir" => "SportsList",
-5                 "file" => 'sportslist.ext.php',
-6                 "module" => "");
- -
- ------------------------------------------------------------------------- - -
- -Now when a Quick Repair and rebuild is run any files in
-custom/Extension/application/Ext/SportsList/ will be -consolidated into
-custom/application/Ext/SportsList/sportslist.ext.php. On -it’s own this file will not do anything but you are now able to write -custom code that checks the consolidated file rather than having to -worry about searching for customisations. - -
- -
    diff --git a/_source/pandoc-markdown/chap15.md b/_source/pandoc-markdown/chap15.md deleted file mode 100644 index 46e4b8ce1..000000000 --- a/_source/pandoc-markdown/chap15.md +++ /dev/null @@ -1,371 +0,0 @@ ---- -title: Module Installer -weight: 15 ---- - -As detailed in the other chapters of this book there are many ways to -customise SuiteCRM. The module installer allows you to package these -changes and install them onto other SuiteCRM instances. This is achieved -by creating a package. - -At the minimum a package is a zip file that contains a -manifest.php file in it’s root. The manifest file is -responsible for providing information about the installer as well as -providing information on how to install the package. - -### manifest.php - -The manifest.php file contains the definition of three -arrays. Let’s look at each of these arrays in turn. See -\[\[\#chap19.xhtml\#appendix-a|Appendix A\]\] for the full sample -manifest.php file. - -{| |width="50%"| -\[\[File:images/leanpub\_info-circle.png|50px|class=sidebar-image|information\]\] -|width="50%"| Within path in the manifest file you can use -<basepath> to refer to the base directory of the -installer. For example <basepath>/Foo.txt will refer -to the Foo.txt file in the root of the installer package. -|} - -#### \$manifest - -The \$manifest array provides information on the package -itself such as it’s name, readme etc. (it also defines the -copy array for patch packages). A sample -definition of the manifest array will appear something like this: - -
    - -Example 15.1: Example \$manifest array definition - ------------------------------------------------------------------------- - -
    - -
     1 $manifest = array(
    - 2   'name' => 'My First Package',
    - 3   'description' => 'This is a simple package example manifest file',
    - 4   'version' => '1.5',
    - 5   'author' => 'Jim Mackin',
    - 6   'readme' => 'readme.txt',
    - 7   'acceptable_sugar_flavors' => array('CE'),
    - 8   'acceptable_sugar_versions' => array(
    - 9     'exact_matches' => array(),
    -10     'regex_matches' => array('6\\.5\\.[0-9]$'),
    -11   ),
    -12   'copy_files' => array (
    -13     'from_dir' => '<basepath>/custom/',
    -14     'to_dir' => 'custom',
    -15     'force_copy' => array (),
    -16   ),
    -17   'dependencies' => array(
    -18     array(
    -19       'id_name' => 'example_dependency_package',
    -20       'version' => '2.4',
    -21     ),
    -22   ),
    -23 );
    - -
    - ------------------------------------------------------------------------- - -
    - -; name -: The name of the package. This is how the package will appear to the - user during installation and in the Module Loader package list. The - package name is required. ; description -: A brief description of the package. ; version -: The version of this package. This can be any string but is usually a - traditional version number (such as 3.1.4). ; - author -: The author of the package. ; readme -: A brief readme string. Note that if a README.txt is - found in the root of the package this will be used instead. ; - acceptable\_sugar\_flavors -: A remnant of the SugarCRM packages. This should always be an array - with (at least) a CE entry. If you would like the - installer to target both SuiteCRM and SugarCRM editions then this - can contain one of the other SugarCRM flavours (PRO, - CORP , ULT or ENT). ; - acceptable\_sugar\_versions -: An array detailing the matching SugarCRM versions. Note that the - SugarCRM version is distinct from the SuiteCRM version. This array - has two keys. exact\_matches is simply an array of the - allowed versions. regex\_matches allows specifying - regexes to match versions. For SuiteCRM you only need to worry about - supporting the 6.5.\* versions which can be matched - with the regex 6\\.5\\.\[0-9\]\$. At the time of - writing the current SugarCRM version for SuiteCRM is - 6.5.20. ; copy\_files -: This is only used for patch installers and will copy - files in the from\_dir key to those in the - to\_dir key. Finally the force\_copy key - can be used to specify files that should be forcibly copied over. ; - dependencies -: An array of other packages that are relied on by this package. Each - entry is an array with id\_name - the id of the package - and version - the required version of the package. ; - icon -: The path (within the installer) to an icon to be displayed during - installation. ; is\_uninstallable -: Whether or not uninstalls should be allowed. ; - published\_date -: The date that the package was published. There is no fixed format - for the date, it is simply a string. ; key -: Specifies a key to ensure that modules do not clash. This will - prefix the installed modules and tables with key. This - is used by the module builder when creating packages but can be - specified if you wish. ; remove\_tables -: A string specifying whether module tables should be removed when - uninstalling this package. Accepted values are true, - false and prompt. The default is - true. ; type -: The type of the installer, one of langpack, - module, patch or theme. See - the types section. - -#### \$install\_defs - -Provides information on how the package is to be installed, which files -go where and any additional information such as logic hooks, custom -fields etc. - -#### = id \#\#\#\#= - -A unique identifier for the module. - -#### = connectors \#\#\#\#= - -An array of connectors to be installed. Each entry is an array with the -following keys: - -{| ! Key ! Description |- | name | The name of the -connector. |- | connector | The directory to copy the -connector files from. |- | formatter | The directory to -copy the connector formatter files from. |} - -#### = copy \#\#\#\#= - -An array of files and directories to be copied on install. Each entry is -an array with the following keys: - -{| ! Key ! Description |- | from | The source -file/directory in the package. |- | to | The destination -file/directory. |} - -{| |width="50%"| -\[\[File:images/leanpub\_info-circle.png|50px|class=sidebar-image|information\]\] -|width="50%"| In general if a file can be handled by one of the other -keys then that key should be used. For example new admin entries should -be copied using the administration key rather than using -the copy key. |} - -#### = dashlets \#\#\#\#= - -An array of dashlets to be installed. Each entry is an array with the -following keys: - -{| ! Key ! Description |- | name | The name of the new -dashlet. |- | from | The path in the install package from -which the dashlet files will be copied. |} - -#### = language \#\#\#\#= - -An array of language files to be installed. Each entry is an array with -the following keys: - -{| ! Key ! Description |- | from | The location of the -language file inside the package. |- | to\_module | The -module this language file is intended for (or ‘application’ for -application language strings). |- | language | The language -that this file is for (i.e. en\_us or es\_es). |} - -See the chapter on \[\[\#chap08.xhtml\#language-chapter|Language -Strings\]\] for more information. - -#### = layoutdefs \#\#\#\#= - -An array of layoutdef files which are used to add, remove or edit -subpanels. Each entry is an array with the following keys: - -{| ! Key ! Description |- | from | The path in the package -to the file to be installed. |- | to\_module | The module -that this file will be installed to. |} - -#### = vardefs \#\#\#\#= - -An array of the vardefs to be added to specific modules. Each entry is -an array with the following keys: - -{| ! Key ! Description |- | from | The location of the -vardef file in the package. |- | to\_module | The -destination module. |} - -{| |width="50%"| -\[\[File:images/leanpub\_info-circle.png|50px|class=sidebar-image|information\]\] -|width="50%"| Generally you should install custom fields using the -custom\_fields key. However this key can be used to alter -existing fields or add more complex fields. |} - -#### = menu \#\#\#\#= - -An array of menus to be installed. Each entry is an array with the -following keys: - -{| ! Key ! Description |- | from | The location of the menu -file in the package. |- | to\_module | The destination -module for this menu. |} - -#### = beans \#\#\#\#= - -An array of beans to be installed. Each entry is an array with the -following keys: - -{| ! Key ! Description |- | module | The name of the -module. |- | class | The name of the bean class. |- | -path | The path (within the package) to the bean file. |- | -tab | Whether or not a tab should be added for this module. -|} - -#### = relationships \#\#\#\#= - -An array detailing any new relationships added (in particular -relationships where one side is an existing module). Each entry is an -array with the following keys: - -{| ! Key ! Description |- | module | The module that this -relationship will be attached to. |- | meta\_data | The -location of the metadata file for this relationship. |} - -#### = custom\_fields \#\#\#\#= - -An array of new custom fields to be installed (See the -\[\[\#chap03.xhtml\#vardefs-chapter|Vardefs\]\] chapter for more -information on this). Each entry is an array with the following keys: - -{| ! Key ! Description |- | name | The name of the new -custom field. |- | label | The key for the language string -which will act as the label for this custom field. |- | -type | The type of this custom field. |- | -max\_size | For string field types, the maximum number of -characters. |- | require\_option | Whether or not the field -is required. |- | default\_value | The default value of -this field. |- | ext1 | Extended field information. -Different field types will use this value differently. For example Enum -fields will store the key for the options in this field, decimal and -float fields will store the precision. |- | ext2 | Extended -field information. Different field types will use this value -differently. For example, dynamic dropdowns will store the parent -dropdown, text areas will store the number of rows. |- | -ext3 | Extended field information. Different field types -will use this value differently. For example, text areas will store the -number of columns. |- | ext4 | Extended field information. -Different field types will use this value differently. For HTML field -types this will store the HTML. |- | audited | Whether or -not changes to this field should be audited. |- | module | -Used to specify the module where the custom field will be added. |} - -#### = logic\_hooks \#\#\#\#= - -An array of logic hooks to be installed. See the -\[\[\#chap11.xhtml\#logic-hooks-chapter|Logic Hooks\]\] chapter for more -information. Each entry is an array with the following keys: - -{| ! Key ! Description |- | module | The module to where -this logic hook should be installed. Leaving this empty will install -into the top level logic hook. |- | hook | The logic hook -type (i.e. after\_save, after\_login, etc.). -|- | order | The sort order for this logic hook. |- | -description | A description of the hook. |- | -file | The file containing the class for this logic hook, -relative to the SuiteCRM root. |- | class | The class that -contains the logic hook function that should be called by this hook. |- -| function | The function to be invoked when this hook is -triggered. |} - -#### = image\_dir \#\#\#\#= - -A path to a directory of images to be included in the install. - -#### = schedulers \#\#\#\#= - -An array of schedulers to be installed. Each entry is an array with a -single key: - -{| ! Key ! Description |- | from | The file containing the -new scheduled task. |} - -#### = administration \#\#\#\#= - -An array of admin panels to be installed. Each entry is an array with a -single key: - -{| ! Key ! Description |- | from | The file containing the -new admin panel definition. |} - -#### = pre\_execute \#\#\#\#= - -Defines an array of files to be executed before the package is -installed. Each entry is a path to a file within the package. Any output -will be displayed to the user in the install log. - -#### = post\_execute \#\#\#\#= - -Defines an array of files to be executed after the package is installed. -Each entry is a path to a file within the package. Any output will be -displayed to the user in the install log. - -#### = pre\_uninstall \#\#\#\#= - -Defines an array of files to be executed before the package is -uninstalled. Each entry is a path to a file within the package. Any -output will be displayed to the user in the uninstall log. - -#### = post\_uninstall \#\#\#\#= - -Defines an array of files to be executed after the package is -uninstalled. Each entry is a path to a file within the package. Any -output will be displayed to the user in the uninstall log. - -#### \$upgrade\_manifest - -Provides a means of upgrading an already installed package by providing -different install\_defs. - -
    - -
    - -### Types - -{| ! Type ! Description |- | langpack | A language installer. This will -add an entry to the language dropdown. |- | module | A module installer. -Will install new modules and/or functionality. |- | patch | A patch -installer. This is used to upgrade SuiteCRM. |- | theme | A theme -installer. This will add a new option to the themes. |} - -#### Other files - -; README.txt -: Contains the readme for this package. If README.txt and - a readme entry in the manifest.php is defined then this - file will be used. ; LICENSE.txt -: Provides information on the license for this package. ; - scripts/pre\_install.php -: A PHP script which defines a method pre\_install(). - This method will be called before the package is installed. Any - output will be displayed to the user in the install log. ; - scripts/post\_install.php -: A PHP script which defines a method post\_install(). - This method will be called after the package is installed. ; - scripts/pre\_uninstall.php -: A PHP script which defines a method pre\_uninstall(). - This method will be called before the package is uninstalled. ; - scripts/post\_uninstall.php -: A PHP script which defines a method post\_uninstall(). - This method will be called after the package is uninstalled. - -
diff --git a/_source/pandoc-markdown/chap16.md b/_source/pandoc-markdown/chap16.md deleted file mode 100644 index e359d5639..000000000 --- a/_source/pandoc-markdown/chap16.md +++ /dev/null @@ -1,426 +0,0 @@ ---- -title: API -weight: 16 ---- - -The SuiteCRM API allows third party code to access and edit SuiteCRM -data and functionality. - -### Using the API - -SuiteCRM has both a REST and a SOAP API. Which API you want to use will -largely come down to personal preference and the support for SOAP/REST -libraries in whichever language you will be using. - -Both APIs will require a username and password. It is usual to create a -user specifically for the API. - -#### SOAP - -The WSDL for the SOAP API can be found at: - -
- -Example 16.1: SOAP API WSDL Location - ------------------------------------------------------------------------- - -
- -
example.com/suitecrm/service/v4_1/soap.php?wsdl
- -
- ------------------------------------------------------------------------- - -
- -Where example.com/suitecrm is the address of your SuiteCRM -instance. v4\_1 is the version of the API and can be -changed, v4\_1 is the latest version at the time of -writing. - -#### = SOAP Example \#\#\#\#= - -The following PHP example uses the built in SoapClient class. - -
- -Example 16.2: Accessing the SOAP API - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2 //Create a new SoapClient
- 3 $wsdlURL = "http://example.com/suitecrm/service/v4_1/soap.php?wsdl";
- 4 $client = new SoapClient($wsdlURL);
- 5
- 6 //Login to the API and get the session id
- 7 $userAuth = array(
- 8         'user_name' => '<suitecrmuser>',
- 9         'password' => md5('<suitecrmpassword>'),
-10 );
-11 $appName = 'My SuiteCRM SOAP Client';
-12 $nameValueList = array();
-13 $loginResults = $client->login($userAuth, $appName, $nameValueList);
-14
-15 //Get a list of at most 10 accounts with a billing address in Ohio. Along with
-16 //The first and last names of any contacts in that Account.
-17 $results = $client->get_entry_list(
-18         //Session id - retrieved from login call
-19         $loginResults->id,
-20         //Module to get_entry_list for
-21         'Accounts',
-22         //Filter query - Added to the SQL where clause
-23         "accounts.billing_address_city = 'Ohio'",
-24         //Order by - unused
-25         '',
-26         //Start with the first record
-27         0,
-28         //Return the id and name fields
-29         array('id','name'),
-30         //Link to the "contacts" relationship and retrieve the
-31         //First and last names.
-32         array(
-33                 array(
-34                         'name' => 'contacts',
-35                         'value' => array(
-36                                 'first_name',
-37                                 'last_name',
-38                         ),
-39                 ),
-40         ),
-41         //Show 10 max results
-42         10,
-43         //Do not show deleted
-44         0
-45 );
-46 print_r($results);
- -
- ------------------------------------------------------------------------- - -
- -
- -
- -#### REST - -The SuiteCRM REST API can be found at: - -
- -Example 16.3: REST API Endpoint Location - ------------------------------------------------------------------------- - -
- -
example.com/suitecrm/service/v4_1/rest.php
- -
- ------------------------------------------------------------------------- - -
- -Where example.com/suitecrm is the address of your SuiteCRM instance. -v4\_1 is the version of the API and can be changed, v4\_1 is the latest -version at the time of writing. - -The SuiteCRM REST API is not a true REST API - all calls are performed -as POSTs and all calls are to the base URL with the method passed in as -a post argument. - -; The arguments to the REST API calls are:
method : The method -which will be called, i.e. login or -get\_entry\_list. See -\[\[\#chap20.xhtml\#appendix-b|Appendix B\]\] for a list of API methods. -; input\_type : The input type of the rest\_data. This is usually -JSON but can also be Serialize. ; -response\_type : How the response will be encoded. This is usually -JSON but can also be Serialize. ; rest\_data : -Any other arguments that are required by this method. This is passed as -an encoded array. The encoding is determined by input\_type. - -{| |width="50%"| -\[\[File:images/leanpub\_warning.png|50px|class=sidebar-image|warning\]\] -|width="50%"| Note that, for REST requests it is the order of the -arguments that matter in rest\_data and not the name. |} - -
- -
- -#### = Examples \#\#\#\#= - -
- -Example 16.4: Accessing the REST API - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2
- 3 $url = "http://example.com/suitecrm/service/v4_1/rest.php";
- 4
- 5 function restRequest($method, $arguments){
- 6  global $url;
- 7  $curl = curl_init($url);
- 8  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
- 9  $post = array(
-10          "method" => $method,
-11          "input_type" => "JSON",
-12          "response_type" => "JSON",
-13          "rest_data" => json_encode($arguments),
-14  );
-15
-16  curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
-17
-18  $result = curl_exec($curl);
-19  curl_close($curl);
-20  return json_decode($result,1);
-21 }
-22
-23
-24 $userAuth = array(
-25         'user_name' => 'suitecrmuser',
-26         'password' => md5('suitecrmpassword'),
-27 );
-28 $appName = 'My SuiteCRM REST Client';
-29 $nameValueList = array();
-30
-31 $args = array(
-32             'user_auth' => $userAuth,
-33             'application_name' => $appName,
-34             'name_value_list' => $nameValueList);
-35
-36 $result = restRequest('login',$args);
-37 $sessId = $result['id'];
-38
-39 $entryArgs = array(
-40   //Session id - retrieved from login call
-41  'session' => $sessId,
-42   //Module to get_entry_list for
-43  'module_name' => 'Accounts',
-44   //Filter query - Added to the SQL where clause,
-45  'query' => "accounts.billing_address_city = 'Ohio'",
-46   //Order by - unused
-47  'order_by' => '',
-48   //Start with the first record
-49  'offset' => 0,
-50   //Return the id and name fields
-51  'select_fields' => array('id','name',),
-52  //Link to the "contacts" relationship and retrieve the
-53  //First and last names.
-54  'link_name_to_fields_array' => array(
-55          array(
-56                  'name' => 'contacts',
-57                  'value' => array(
-58                          'first_name',
-59                          'last_name',
-60                  ),
-61          ),
-62  ),
-63   //Show 10 max results
-64  'max_results' => 10,
-65   //Do not show deleted
-66  'deleted' => 0,
-67 );
-68 $result = restRequest('get_entry_list',$entryArgs);
-69
-70 print_r($result);
- -
- ------------------------------------------------------------------------- - -
- -For a full list of API methods and their arguments see -\[\[\#chap20.xhtml\#appendix-b|Appendix B\]\]. - -### Adding custom API methods - -Sometimes the existing API methods are not sufficient or using them for -a task would be overly complex. SuiteCRM allows the web services to be -extended with additional methods or overriding existing methods. - -The recommended path for custom entry points is the following
-custom/service/<version>\_custom/. At the time of -writing the latest web service version is v4\_1 so this -would be custom/service/v4\_1\_custom/. - -Next we create the implementing class. This will create our new method. -In our example we will simply create a new method which writes to the -SuiteCRM log We will call this method
-write\_log\_message. - -
- -Example 16.5: Custom v4\_1 Web Service Implementation - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2 if(!defined('sugarEntry')){
- 3   define('sugarEntry', true);
- 4 }
- 5 require_once 'service/v4_1/SugarWebServiceImplv4_1.php';
- 6 class SugarWebServiceImplv4_1_custom extends SugarWebServiceImplv4_1
- 7 {
- 8
- 9   function write_log_message($session, $message)
-10   {
-11     $GLOBALS['log']->info('Begin: write_log_message');
-12
-13     //Here we check that $session represents a valid session
-14     if (!self::$helperObject->checkSessionAndModuleAccess(
-15                                                     $session,
-16                                                     'invalid_session',
-17                                                     '',
-18                                                     '',
-19                                                     '',
-20                                                     new SoapError()))
-21     {
-22       $GLOBALS['log']->info('End: write_log_message.');
-23       return false;
-24     }
-25     $GLOBALS['log']->info($message);
-26     return true;
-27   }
-28 }
- -
- ------------------------------------------------------------------------- - -
- -Next we create the registry file which will register our new method. - -
- -Example 16.6: Custom v4\_1 web service registry - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2     require_once 'service/v4_1/registry.php';
- 3     class registry_v4_1_custom extends registry_v4_1
- 4     {
- 5         protected function registerFunction()
- 6         {
- 7             parent::registerFunction();
- 8             $this->serviceClass->registerFunction('write_log_message',
- 9                                                   array(
-10                                                     'session'=>'xsd:string',
-11                                                     'message'=>'xsd:string'),
-12                                                   array(
-13                                                     'return'=>'xsd:boolean')
-14                                                   );
-15         }
-16     }
- -
- ------------------------------------------------------------------------- - -
- -Finally we create the entry point. This is the actual file that will be -called by our API clients. This will reference the two files which we -have created and will call the webservice implementation with our files. - -
- -Example 16.7: Custom v4\_1 REST Entry point - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2 chdir('../../..');
- 3
- 4 require_once 'SugarWebServiceImplv4_1_custom.php';
- 5
- 6 $webservice_path = 'service/core/SugarRestService.php';
- 7 $webservice_class = 'SugarRestService';
- 8 $webservice_impl_class = 'SugarWebServiceImplv4_1_custom';
- 9 $registry_path = 'custom/service/v4_1_custom/registry.php';
-10 $registry_class = 'registry_v4_1_custom';
-11 $location = 'custom/service/v4_1_custom/rest.php';
-12
-13 require_once 'service/core/webservice.php';
- -
- ------------------------------------------------------------------------- - -
- -
- -Example 16.8: Custom v4\_1 SOAP Entry point - ------------------------------------------------------------------------- - -
- -
 1 <?php
- 2 chdir('../../..');
- 3 require_once('SugarWebServiceImplv4_1_custom.php');
- 4 $webservice_class = 'SugarSoapService2';
- 5 $webservice_path = 'service/v2/SugarSoapService2.php';
- 6 $webservice_impl_class = 'SugarWebServiceImplv4_1_custom';
- 7 $registry_class = 'registry_v4_1_custom';
- 8 $registry_path = 'custom/service/v4_1_custom/registry.php';
- 9 $location = 'custom/service/v4_1_custom/soap.php';
-10 require_once('service/core/webservice.php');
- -
- ------------------------------------------------------------------------- - -
- -#### Usage - -We can now use our custom endpoint. This is identical to using the API -as detailed above, except that we use our custom entry point for either -the SOAP WSDL or REST URL. For example using the same SuiteCRM location -(example.com/suitecrm) as the above examples and using -v4\_1, we would use the following - -
- -Example 16.9: Custom v4\_1 URLS - ------------------------------------------------------------------------- - -
- -
1 //SOAP WSDL
-2 example.com/suitecrm/custom/service/v4_1_custom/soap.php?wsdl
-3 //REST URL
-4 example.com/suitecrm/custom/service/v4_1_custom/rest.php
- -
- ------------------------------------------------------------------------- - -
- - diff --git a/_source/pandoc-markdown/chap17.md b/_source/pandoc-markdown/chap17.md deleted file mode 100644 index 144cf6b80..000000000 --- a/_source/pandoc-markdown/chap17.md +++ /dev/null @@ -1,213 +0,0 @@ ---- -title: Best Practices -weight: 17 ---- - -### Development instances - -When making changes you should always use a development or test instance -first. This allows you to fully and safely test any changes. - -### Version control - -When developing customisations it is prudent to use some form of version -control. Version control allows tracking changes to your codebase in -addition to rolling back changes. There are many version control systems -available. SuiteCRM uses \[http://git-scm.com/ Git\] although I also -like \[http://mercurial.selenic.com/ Mercurial\]. - -If you are using a development instance (as mentioned above) then -Version Control usually allows you to push changes to other versions or -to tag releases. This provides a way of pushing changes to live or test -instances safely. Crucially it also means that, should there be major -problems with a version then this can be easily rolled back. - -### Backup - -SuiteCRM has been developed to be customisable. However, mistakes, bugs -and other unpleasantness can (and thanks to Murphy’s law, will) happen. -You should always ensure, before making any changes, that you have a -backup of all files and of the database. - -In order to back up files you can simply create a zip of the SuiteCRM -directory and copy it to a safe place. On Linux systems this can be -performed using the following: - -
- -Example 17.1: File backup - ------------------------------------------------------------------------- - -
- -
tar -czvf suitecrmfilebackup.tar.gz /path/to/suitecrm
- -
- ------------------------------------------------------------------------- - -
- -Backing up the SuiteCRM database will vary depending on which database -you are using. However MySQL backups can be performed using the -mysqldump command on Linux as seen here: - -
- -Example 17.2: MySQL Database backup - ------------------------------------------------------------------------- - -
- -
mysqldump suitecrmdatabase -u databaseuser -p | gzip -c | cat > suitecrm.sql.gz
- -
- ------------------------------------------------------------------------- - -
- -### Be upgrade safe - -Unless you are making changes to a custom module you should strive in -all cases to use the custom framework and make changes in the custom -folder. This ensures that, should you make a mistake, rectifying the -mistake is as simple as removing the customisation. - -However the main advantage to using custom is that, when -you upgrade SuiteCRM in the future you will not have your changes -overwritten by the updated SuiteCRM files. See the -\[\[\#chap13.xhtml\#extensions-chapter|Extensions\]\] chapter for more -information. - -### Use appropriate log levels - -Using appropriate log levels (See the chapter on -\[\[\#chap10.xhtml\#logging-chapter|Logging\]\]) makes it easier to -track down issues. You do not want very important messages to be logged -as debug since this will make them difficult to find. -Likewise you don’t want unimportant log messages cluttering up the -fatal log output. - -### Long running logic hooks - -If a logic hook task is long running then you should place it into the -job queue (see the \[\[\#chap11.xhtml\#logic-hooks-chapter|Logic -Hook\]\] and \[\[\#chap12.xhtml\#scheduled-tasks-chapter|Scheduled -Tasks\]\] chapters). - -### Minimise SQL - -Where possible you should strive to use the SuiteCRM supplied methods of -accessing data. This includes using beans and the BeanFactory where -possible (see the chapter on -\[\[\#chap02.xhtml\#working-with-beans-chapter|Working with beans\]\]). -There are a few reasons for this. The first is that SQL is usually -either hardcoded or has to be dynamically built. In the case where the -SQL is hardcoded this means that changes to fields will not be reflected -thereby making your code more brittle. - -Dynamic SQL is better because it can react to field changes and -generally be tailored to fit the situation. However this requires adding -extra, often complex, code. It can be hard to account for all situations -(this can be especially problematic when attempting to traverse -relationships dynamically). - -Another issue is that, usually SQL will end up being Database specific -(see the next point for mitigating this however). - -Finally any custom logic (such as Logic Hooks) which would usually be -fired for saving beans or relationships will not be fired for SQL -queries. - -### SQL Use - -In some cases using raw SQL is unavoidable. If that is the case then you -should strive to use standard compliant SQL. If database engine specific -features need to be used, and you wish to target other database engines, -you can check for the DB type. For example: - -
- -Example 17.1: Checking for the database engine - ------------------------------------------------------------------------- - -
- -
 1 function getSomeSQLQuery(){
- 2     global $sugar_config;
- 3     switch($sugar_config['dbconfig']['db_type']){
- 4         case 'mssql':
- 5             $sql = 'MSSQL specific SQL';
- 6             break;
- 7         case 'mysql':
- 8         default:
- 9             $sql = 'MySQL specific SQL';
-10             break;
-11     }
-12     return $sql;
-13 }
- -
- ------------------------------------------------------------------------- - -
- -### Entry check - -The majority of SuiteCRM files will start with some variation of the -following line: - -
- -Example 17.2: Entry check - ------------------------------------------------------------------------- - -
- -
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
- -
- ------------------------------------------------------------------------- - -
- -This prevents direct access to the file by ensuring that SuiteCRM has -been loaded through a valid entry point (i.e. it has been loaded through -index.php, cron.php or a custom entry point). - -### Redirect after post - -Sometimes you may have custom controller actions (see the controller -section) or custom entry points (see the -\[\[\#chap07.xhtml\#entry-point-chapter|Entry Points\]\] chapter). These -actions and entry points or other pages are usually accessed using POST. -After a POST request it is a web best practice to redirect to a -different page, especially if your page makes any changes. This prevents -the user from refreshing the page and causing a duplicate action. Within -SuiteCRM it is best to use the SugarApplication::redirect -method to redirect. This simply accepts a URL. As follows: - -
- -Example 17.3: Redirecting within SuiteCRM - ------------------------------------------------------------------------- - -
- -
SugarApplication::redirect('index.php?module=<TheModule>');
- -
- ------------------------------------------------------------------------- - -
- - diff --git a/_source/pandoc-markdown/chap18.md b/_source/pandoc-markdown/chap18.md deleted file mode 100644 index adfe32554..000000000 --- a/_source/pandoc-markdown/chap18.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -title: Performance Tweaks -weight: 18 ---- - -In most cases the performance of SuiteCRM should not be an issue. -However in the case of large datasets or systems with many users you may -notice some performance degradation. These changes can help improve -performance. - -### Server - -The server that SuiteCRM runs on is, of course, very important when it -comes to the kind of performance you can expect. A full guide on server -setup is outside the scope of this book. However there are some things -you can do to ensure that you get the best performance out of SuiteCRM. - -#### PHP - -Installing a PHP opcode cache will increase the performance of all PHP -files. These work by caching the compilation of PHP files resulting in -less work on each request. Furthermore SuiteCRM will use the caching API -of some PHP accelerators which will further increase performance. If you -are using Linux then \[http://php.net/manual/en/book.apc.php APC\] is -the usual choice. Windows users should check out -\[http://php.net/manual/en/book.wincache.php WinCache\]. - -#### MySQL - -MySQL is notorious for having small default settings. Fully optimising -MySQL is outside the scope of this book (however checkout -\[http://mysqltuner.pl mysqltuner.pl\] for a helpful Perl script which -will provide setting recommendations - note that you should be careful -when running files from an unknown source). One small change that can -make a big difference is increasing the -innodb\_buffer\_pool\_size. - -If you have migrated or imported a significant amount of data it is -possible that some tables will be fragmented. Running OPTIMIZE -TABLE tablename can increase performance. - -### Indexes - -Adding indexes on the fields of modules can improve database -performance. The core modules usually have important fields indexed. -However if you have created a new module or added new, often searched -fields to a module then these fields may benefit from being indexed. See -the \[\[\#chap03.xhtml\#vardefs-chapter|Vardef\]\] chapter for adding -indexes. - -### Config Changes - -The following are some config settings that can be used to improve -performance. Please note that in most cases you will have better -performance gains by first following the steps in previous sections. -These settings should be set in the config\_override.php file. See the -chapter on the \[\[\#chap09.xhtml\#config-chapter|Config\]\] files for -more information. - -
- -
- -
$sugar_config['developerMode'] = false;
- -
- -
- -Unless you are actively developing on an instance developerMode should -be off. Otherwise each page request will cause cached files to be -reloaded. - -
- -
- -
$sugar_config['disable_count_query'] = true;
- -
- -
- -For systems with large amounts of data the count queries on subpanels -used for the pagination controls can become slow thereby causing the -page to be sluggish or outright slow to load. Disabling these queries -can improve performance dramatically on some pages. - -
- -
- -
$sugar_config['disable_vcr'] = true;
- -
- -
- -By default opening the detail view of a record from the list view will -also load the other records in the list to allow for easy moving through -records. If you do not use this feature, or, if loading the detail view -for some records has become slow, you can disable this feature. - -
- -
- -
$sugar_config['list_max_entries_per_page'] = '10';
- -
- -
- -The number of records shown in each page of the list view can be -decreased. This will result in a slight increase in performance on list -view pages. - -
- -
- -
$sugar_config['logger']['level'] = 'fatal';
- -
- -
- -Lowering the log level means that there will be less log messages to -write to disk on each request. This will slightly (very slightly) -increase performance. - - diff --git a/_source/pandoc-markdown/chap19.md b/_source/pandoc-markdown/chap19.md deleted file mode 100644 index 83f381442..000000000 --- a/_source/pandoc-markdown/chap19.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: Further Resources -weight: 19 ---- - -Although this book has aimed to be a thorough resource, SuiteCRM is -large and feature rich. Therefore it is not possible to include all the -information you may require. Here are some extra resources for -developing with SuiteCRM. - -### SuiteCRM Website - -The SuiteCRM website (\[http://suitecrm.com SuiteCRM.com\] has many -excellent resources including: - -- \[https://suitecrm.com/forum/index SuiteCRM forums\] - come and say - hi! -- \[https://suitecrm.com/suitecrm/blog SuiteCRM Blog\] -- \[https://suitecrm.com/wiki/index.php/Main\_Page SuiteCRM Wiki\] - -### External SuiteCRM Resources - -; \[https://github.com/salesagility/SuiteCRM SuiteCRM GitHub\] -: The SuiteCRM source code is hosted on GitHub. Here you can get - bleeding edge code changes and even contribute code. - -### SugarCRM Resources - -SuiteCRM has strived to remain compatible with the SugarCRM community -edition and much of the documentation is still valid. The appropriate -version for SuiteCRM information is 6.5. Versions of documentation -higher than this (i.e. 7) will probably not be relevant. - -- \[http://support.sugarcrm.com/02\_Documentation/04\_Sugar\_Developer/ - SugarCRM Developer docs\] -- \[http://developer.sugarcrm.com/ SugarCRM Developer Blog\] - -### Technical Links - -- \[http://php.net/ PHP\] - The main language used by SuiteCRM -- \[http://www.smarty.net/ Smarty\] - The templating language used - throughout SuiteCRM. -- \[http://xdebug.org XDebug\] - Debugging/profiling extension for PHP -- \[http://git-scm.com/ Git\] - Distributed version control system -- \[http://yuilibrary.com/ YUI\] - Legacy Javascript library used in - SuiteCRM -- \[https://jquery.com/ JQuery\] - Javascript library used in - SuiteCRM - to be preferred over YUI. -- \[https://github.com/PHPMailer/PHPMailer PHPMailer\] Email library - used in SuiteCRM -- \[http://php.net/manual/en/book.apc.php APC\] - Alternative PHP - Cache. PHP Opcode cache supported by SuiteCRM -- \[http://php.net/manual/en/book.wincache.php WinCache\] - Windows - PHP cache. PHP Opcode cache supported by SuiteCRM -- \[https://www.jetbrains.com/phpstorm/ PHPStorm\] - PHP IDE (Paid) -- \[https://eclipse.org/pdt/ Eclipse PHP Development Tools\] - PHP IDE - (Free and Open Source) - -### Other Links - -- \[https://salesagility.com/ SalesAgility\] - The company behind - SuiteCRM. -- \[http://www.jsmackin.co.uk Jim Mackin\] - Me :) - - diff --git a/_source/releases.md b/_source/releases.md deleted file mode 100644 index 59eceaa7b..000000000 --- a/_source/releases.md +++ /dev/null @@ -1,425 +0,0 @@ - - -[Source](https://github.com/salesagility/SuiteCRM/releases "Permalink to Releases · salesagility/SuiteCRM · GitHub") - -# Releases · salesagility/SuiteCRM · GitHub - -[Skip to content][1] - -[ ][2] - -* [ Features ][3] -* [ Business ][4] -* [ Explore ][5] -* [ Marketplace ][6] -* [ Pricing ][7] - -[This repository][8] - -[Sign in][9] or [Sign up][10] - -* [ Watch ][11] [ 164 ][12] -* [ Star ][11] [ 818 ][13] -* [ Fork ][11] [ 686 ][14] - -# [salesagility][15]/[**SuiteCRM][16]** - -[ Code ][16] [ Issues 609 ][17] [ Pull requests 286 ][18] [ Wiki ][19] [ Insights ][20] - -[Releases][8] [Tags][21] - -[Latest release][22] - -* [ v7.9.9 ][23] -* [ `00260c7` ][24] - -Verified - -This commit was created on GitHub.com and signed with a **verified signature** using GitHub's key. - -GPG key ID: 4AEE18F83AFDEB23 [Learn about signing commits][25] - -# [7.9.9][26] - -![@Dillon-Brown][27] [Dillon-Brown][28] released this Jan 11, 2018 · [ 6 commits][29] to master since this release - -## Assets - -* [ **Source code** (zip) ][30] -* [ **Source code** (tar.gz) ][31] - -**SuiteCRM 7.9.9 is now Available to Download** - -For more detail and to see all issues addressed in this release view the [Release Notes][32]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][33] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -We have also updated our Security Process asking the community to send their security issues directly to us via email [security@suitecrm.com][34] - -We have also added a Code of Conduct to help build a more welcoming environment for our community. -[SuiteCRM Code of Conduct][35] - -* [ v7.8.10 ][36] -* [ `a501db7` ][37] - -Verified - -This commit was created on GitHub.com and signed with a **verified signature** using GitHub's key. - -GPG key ID: 4AEE18F83AFDEB23 [Learn about signing commits][25] - -# [7.8.10][38] - -![@Dillon-Brown][27] [Dillon-Brown][28] released this Jan 11, 2018 - -## Assets - -* [ **Source code** (zip) ][39] -* [ **Source code** (tar.gz) ][40] - -**SuiteCRM 7.8.10 LTS is now Available to Download** - -For more detail and to see all issues addressed in this release view the [Release Notes][41]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][33] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -We have also updated our Security Process asking the community to send their security issues directly to us via email [security@suitecrm.com][34] - -We have also added a Code of Conduct to help build a more welcoming environment for our community. -[SuiteCRM Code of Conduct][35] - -Pre-release - -* [ v7.10-beta-3 ][42] -* [ `bcf9906` ][43] - -# [7.10 Beta 3][44] - -![@samus-aran][45] [samus-aran][46] released this Dec 18, 2017 · [ 61 commits][47] to develop since this release - -## Assets - -* [ **Source code** (zip) ][48] -* [ **Source code** (tar.gz) ][49] - -**This is a Beta release and should not be used in a production environment.** - -Try 7.10 Beta 3 to preview the new features coming in SuiteCRM 7.10 - -[Click here][50] to get the full details of this release and to get the upgrade packages - -Changes since Beta 2: - -* 4 SuiteP colour schemes (Day, Dawn, Dusk, Night) -* Email Performance Improvements -* Bug Fixing -* API swagger documentation added -* [ v7.9.8 ][51] -* [ `5b3eeb8` ][52] - -# [7.9.8][53] - -![@Dillon-Brown][27] [Dillon-Brown][28] released this Dec 14, 2017 · [ 185 commits][54] to master since this release - -## Assets - -* [ **Source code** (zip) ][55] -* [ **Source code** (tar.gz) ][56] - -**SuiteCRM 7.9.8 is now Available to Download** - -For more detail and to see all issues addressed in this release view the [Release Notes][57]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][33] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -We have also updated our Security Process asking the community to send their security issues directly to us via email [security@suitecrm.com][34] - -We have also added a Code of Conduct to help build a more welcoming environment for our community. -[SuiteCRM Code of Conduct][35] - -* [ v7.8.9 ][58] -* [ `9856e75` ][59] - -# [7.8.9][60] - -![@Dillon-Brown][27] [Dillon-Brown][28] released this Dec 14, 2017 · [ 90 commits][61] to 7.8.x since this release - -## Assets - -* [ **Source code** (zip) ][62] -* [ **Source code** (tar.gz) ][63] - -**SuiteCRM 7.8.9 LTS is now Available to Download** - -For more detail and to see all issues addressed in this release view the [Release Notes][64]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][33] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -We have also updated our Security Process asking the community to send their security issues directly to us via email [security@suitecrm.com][34] - -We have also added a Code of Conduct to help build a more welcoming environment for our community. -[SuiteCRM Code of Conduct][35] - -Pre-release - -* [ v7.10-beta-2 ][65] -* [ `dd64f89` ][66] - -Verified - -This commit was created on GitHub.com and signed with a **verified signature** using GitHub's key. - -GPG key ID: 4AEE18F83AFDEB23 [Learn about signing commits][25] - -# [7.10 Beta 2][67] - -![@Dillon-Brown][27] [Dillon-Brown][28] released this Dec 1, 2017 · [ 372 commits][68] to develop since this release - -## Assets - -* [ **Source code** (zip) ][69] -* [ **Source code** (tar.gz) ][70] - -**This is a Beta release and should not be used in a production environment.** - -Try 7.10 Beta 2 to preview the new features coming in SuiteCRM 7.10 - -[Click here][50] to get the full details of this release and to get the upgrade package - -Pre-release - -* [ v7.10-beta ][71] -* [ `fcd4175` ][72] - -# [7.10 Beta][73] - -![@Dillon-Brown][27] [Dillon-Brown][28] released this Nov 17, 2017 · [ 509 commits][74] to develop since this release - -## Assets - -* [ **Source code** (zip) ][75] -* [ **Source code** (tar.gz) ][76] - -**This is a Beta release and should not be used in a production environment.** - -Try 7.10 Beta to preview the new features coming in SuiteCRM 7.10 - -[Click here][50] to get the full details of this release and to get the upgrade package - -* [ v7.9.7 ][77] -* [ `41f5fea` ][78] - -# [7.9.7][79] - -![@Dillon-Brown][27] [Dillon-Brown][28] released this Oct 18, 2017 · [ 426 commits][80] to master since this release - -## Assets - -* [ **Source code** (zip) ][81] -* [ **Source code** (tar.gz) ][82] - -**SuiteCRM 7.9.7 is now Available to Download** - -For more detail and to see all issues addressed in this release view the [Release Notes][83]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][33] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -We have also updated our Security Process asking the community to send their security issues directly to us via email [security@suitecrm.com][34] - -We have also added a Code of Conduct to help build a more welcoming environment for our community. -[SuiteCRM Code of Conduct][35] - -* [ v7.8.8 ][84] -* [ `5edffe2` ][85] - -# [7.8.8][86] - -![@Dillon-Brown][27] [Dillon-Brown][28] released this Oct 18, 2017 · [ 225 commits][87] to 7.8.x since this release - -## Assets - -* [ **Source code** (zip) ][88] -* [ **Source code** (tar.gz) ][89] - -**SuiteCRM 7.8.8 LTS is now Available to Download** - -For more detail and to see all issues addressed in this release view the [Release Notes][90]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][33] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -We have also updated our Security Process asking the community to send their security issues directly to us via email [security@suitecrm.com][34] - -We have also added a Code of Conduct to help build a more welcoming environment for our community. -[SuiteCRM Code of Conduct][35] - -* [ 7.9.6 ][91] -* [ `e0a0a9c` ][92] - -# [7.9.6][93] - -![@Dillon-Brown][27] [Dillon-Brown][28] released this Oct 3, 2017 · [ 507 commits][94] to master since this release - -## Assets - -* [ **Source code** (zip) ][95] -* [ **Source code** (tar.gz) ][96] - -**SuiteCRM 7.9.6 is now Available to Download** - -For more detail and to see all issues addressed in this release view the [Release Notes][97]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][33] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -We have also updated our Security Process asking the community to send their security issues directly to us via email [security@suitecrm.com][34] - -We have also added a Code of Conduct to help build a more welcoming environment for our community. -[SuiteCRM Code of Conduct][35] - -Previous[Next][98] - -* © 2018 GitHub, Inc. -* [Terms][99] -* [Privacy][100] -* [Security][101] -* [Status][102] -* [Help][103] -[ ][104] - -* [Contact GitHub][105] -* [API][106] -* [Training][107] -* [Shop][108] -* [Blog][109] -* [About][110] - -You can't perform that action at this time. - -You signed in with another tab or window. [Reload][111] to refresh your session. You signed out in another tab or window. [Reload][111] to refresh your session. - -[1]: https://github.com#start-of-content -[2]: https://github.com/ -[3]: https://github.com/features -[4]: https://github.com/business -[5]: https://github.com/explore -[6]: https://github.com/marketplace -[7]: https://github.com/pricing -[8]: https://github.com/salesagility/SuiteCRM/releases -[9]: /login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases -[10]: /join?source=header-repo -[11]: /login?return_to=%2Fsalesagility%2FSuiteCRM -[12]: https://github.com/salesagility/SuiteCRM/watchers -[13]: https://github.com/salesagility/SuiteCRM/stargazers -[14]: https://github.com/salesagility/SuiteCRM/network -[15]: https://github.com/salesagility -[16]: https://github.com/salesagility/SuiteCRM -[17]: https://github.com/salesagility/SuiteCRM/issues -[18]: https://github.com/salesagility/SuiteCRM/pulls -[19]: https://github.com/salesagility/SuiteCRM/wiki -[20]: https://github.com/salesagility/SuiteCRM/pulse -[21]: https://github.com/salesagility/SuiteCRM/tags -[22]: https://github.com/salesagility/SuiteCRM/releases/latest -[23]: https://github.com/salesagility/SuiteCRM/tree/v7.9.9 -[24]: https://github.com/salesagility/SuiteCRM/commit/00260c72a12f79e280ea1beb4241d03c9d39681d -[25]: https://help.github.com/articles/signing-commits-with-gpg/ -[26]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.9 -[27]: https://avatars0.githubusercontent.com/u/26431166?s=40&v=4 -[28]: https://github.com/Dillon-Brown -[29]: https://github.com/salesagility/SuiteCRM/compare/v7.9.9...master -[30]: https://github.com/salesagility/SuiteCRM/archive/v7.9.9.zip -[31]: https://github.com/salesagility/SuiteCRM/archive/v7.9.9.tar.gz -[32]: https://suitecrm.com/wiki/index.php/Release_notes_7.9.9 -[33]: https://suitecrm.com/download -[34]: mailto:security%40suitecrm.com -[35]: https://github.com/salesagility/SuiteCRM/blob/master/CODE_OF_CONDUCT.md -[36]: https://github.com/salesagility/SuiteCRM/tree/v7.8.10 -[37]: https://github.com/salesagility/SuiteCRM/commit/a501db76b422a78db30b11a62242e83ca2dfe733 -[38]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.10 -[39]: https://github.com/salesagility/SuiteCRM/archive/v7.8.10.zip -[40]: https://github.com/salesagility/SuiteCRM/archive/v7.8.10.tar.gz -[41]: https://suitecrm.com/wiki/index.php/Release_notes_7.8.10 -[42]: https://github.com/salesagility/SuiteCRM/tree/v7.10-beta-3 -[43]: https://github.com/salesagility/SuiteCRM/commit/bcf99067ca1e8e301498c9753d2f8325a1b95aab -[44]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.10-beta-3 -[45]: https://avatars1.githubusercontent.com/u/4041275?s=40&v=4 -[46]: https://github.com/samus-aran -[47]: https://github.com/salesagility/SuiteCRM/compare/v7.10-beta-3...develop -[48]: https://github.com/salesagility/SuiteCRM/archive/v7.10-beta-3.zip -[49]: https://github.com/salesagility/SuiteCRM/archive/v7.10-beta-3.tar.gz -[50]: https://suitecrm.com/download/download-pre-release -[51]: https://github.com/salesagility/SuiteCRM/tree/v7.9.8 -[52]: https://github.com/salesagility/SuiteCRM/commit/5b3eeb843089279bcb4abea37f3361ec123be4b0 -[53]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.8 -[54]: https://github.com/salesagility/SuiteCRM/compare/v7.9.8...master -[55]: https://github.com/salesagility/SuiteCRM/archive/v7.9.8.zip -[56]: https://github.com/salesagility/SuiteCRM/archive/v7.9.8.tar.gz -[57]: https://suitecrm.com/wiki/index.php/Release_notes_7.9.8 -[58]: https://github.com/salesagility/SuiteCRM/tree/v7.8.9 -[59]: https://github.com/salesagility/SuiteCRM/commit/9856e75076c71210485940153cd7ad632f79b56d -[60]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.9 -[61]: https://github.com/salesagility/SuiteCRM/compare/v7.8.9...7.8.x -[62]: https://github.com/salesagility/SuiteCRM/archive/v7.8.9.zip -[63]: https://github.com/salesagility/SuiteCRM/archive/v7.8.9.tar.gz -[64]: https://suitecrm.com/wiki/index.php/Release_notes_7.8.9 -[65]: https://github.com/salesagility/SuiteCRM/tree/v7.10-beta-2 -[66]: https://github.com/salesagility/SuiteCRM/commit/dd64f89af4fdaf809665bddf6d14fed930859335 -[67]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.10-beta-2 -[68]: https://github.com/salesagility/SuiteCRM/compare/v7.10-beta-2...develop -[69]: https://github.com/salesagility/SuiteCRM/archive/v7.10-beta-2.zip -[70]: https://github.com/salesagility/SuiteCRM/archive/v7.10-beta-2.tar.gz -[71]: https://github.com/salesagility/SuiteCRM/tree/v7.10-beta -[72]: https://github.com/salesagility/SuiteCRM/commit/fcd417573e56a86e3b3d1c945b3b22dc85ad7a7f -[73]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.10-beta -[74]: https://github.com/salesagility/SuiteCRM/compare/v7.10-beta...develop -[75]: https://github.com/salesagility/SuiteCRM/archive/v7.10-beta.zip -[76]: https://github.com/salesagility/SuiteCRM/archive/v7.10-beta.tar.gz -[77]: https://github.com/salesagility/SuiteCRM/tree/v7.9.7 -[78]: https://github.com/salesagility/SuiteCRM/commit/41f5fea5123cc7c6e4f599d766005490c6023889 -[79]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.7 -[80]: https://github.com/salesagility/SuiteCRM/compare/v7.9.7...master -[81]: https://github.com/salesagility/SuiteCRM/archive/v7.9.7.zip -[82]: https://github.com/salesagility/SuiteCRM/archive/v7.9.7.tar.gz -[83]: https://suitecrm.com/wiki/index.php/Release_notes_7.9.7 -[84]: https://github.com/salesagility/SuiteCRM/tree/v7.8.8 -[85]: https://github.com/salesagility/SuiteCRM/commit/5edffe2150f9a69de809d3d653d505d0f4908a62 -[86]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.8 -[87]: https://github.com/salesagility/SuiteCRM/compare/v7.8.8...7.8.x -[88]: https://github.com/salesagility/SuiteCRM/archive/v7.8.8.zip -[89]: https://github.com/salesagility/SuiteCRM/archive/v7.8.8.tar.gz -[90]: https://suitecrm.com/wiki/index.php/Release_notes_7.8.8 -[91]: https://github.com/salesagility/SuiteCRM/tree/7.9.6 -[92]: https://github.com/salesagility/SuiteCRM/commit/e0a0a9cd8ad2f01049ef2d412f024fb435151652 -[93]: https://github.com/salesagility/SuiteCRM/releases/tag/7.9.6 -[94]: https://github.com/salesagility/SuiteCRM/compare/7.9.6...master -[95]: https://github.com/salesagility/SuiteCRM/archive/7.9.6.zip -[96]: https://github.com/salesagility/SuiteCRM/archive/7.9.6.tar.gz -[97]: https://suitecrm.com/wiki/index.php/Release_notes_7.9.6 -[98]: https://github.com/salesagility/SuiteCRM/releases?after=7.9.6 -[99]: https://github.com/site/terms -[100]: https://github.com/site/privacy -[101]: https://github.com/security -[102]: https://status.github.com/ -[103]: https://help.github.com -[104]: https://github.com "GitHub" -[105]: https://github.com/contact -[106]: https://developer.github.com -[107]: https://training.github.com -[108]: https://shop.github.com -[109]: https://github.com/blog -[110]: https://github.com/about -[111]: - - diff --git a/_source/releases10.md b/_source/releases10.md deleted file mode 100644 index 4e2419929..000000000 --- a/_source/releases10.md +++ /dev/null @@ -1,342 +0,0 @@ - - -[Source](https://github.com/salesagility/SuiteCRM/releases?after=v7.1.5 "Permalink to Releases · salesagility/SuiteCRM · GitHub") - -# Releases · salesagility/SuiteCRM · GitHub - -[Skip to content][1] - -[ ][2] - -* [ Features ][3] -* [ Business ][4] -* [ Explore ][5] -* [ Marketplace ][6] -* [ Pricing ][7] - -[This repository][8] - -[Sign in][9] or [Sign up][10] - -* [ Watch ][11] [ 164 ][12] -* [ Star ][11] [ 819 ][13] -* [ Fork ][11] [ 686 ][14] - -# [salesagility][15]/[**SuiteCRM][16]** - -[ Code ][16] [ Issues 609 ][17] [ Pull requests 285 ][18] [ Wiki ][19] [ Insights ][20] - -[Releases][8] [Tags][21] - -Pre-release - -* [ v7.2beta2 ][22] -* [ `cc1e2fd` ][23] - -# [7.2 Beta 2][24] - -![@mattlorimer][25] [mattlorimer][26] released this Dec 9, 2014 · [ 7320 commits][27] to develop since this release - -## Assets - -* [ **Source code** (zip) ][28] -* [ **Source code** (tar.gz) ][29] - -**This is a beta release and should not be used in a production environment.** - -Try 7.2 Beta 2 to preview the new features coming in 7.2 - -Including reports, cases and project enhancements - -[Click here][30] to get the full details of this release and to get the upgrade package from 7.1.x (also valid for upgrading from 7.2 beta) - -Pre-release - -* [ v7.2beta ][31] -* [ `fbc11ec` ][32] - -# [7.2 Beta][33] - -![@mattlorimer][25] [mattlorimer][26] released this Oct 31, 2014 · [ 7437 commits][34] to develop since this release - -## Assets - -* [ **Source code** (zip) ][35] -* [ **Source code** (tar.gz) ][36] - -**This is a beta release and should not be used in a production environment.** - -Try 7.2 Beta to preview the new features coming in 7.2 - -The main new feature of this release is the new Project Management with Gantt charts - -In addition the SuiteCRM install process has been given a new look and feel as well as many bug fixes and other little additions, and there is still more to come. - -* [ v7.1.4 ][37] -* [ `0becccf` ][38] - -# [7.1.4][39] - -![@mattlorimer][25] [mattlorimer][26] released this Sep 25, 2014 · [ 6892 commits][40] to master since this release - -## Assets - -* [ **Source code** (zip) ][41] -* [ **Source code** (tar.gz) ][42] - -SuiteCRM has been updated to version 7.1.4 - -This is a bug fix release which also addresses some important security issues - -For a full list of what has changed and been fixed check out the release notes on the wiki - -* [ v7.1.3 ][43] -* [ `b4015f1` ][44] - -# [7.1.3][45] - -![@mattlorimer][25] [mattlorimer][26] released this Aug 13, 2014 · [ 6905 commits][46] to master since this release - -## Assets - -* [ **Source code** (zip) ][47] -* [ **Source code** (tar.gz) ][48] - -SuiteCRM has been updated to version 7.1.3 - -This is a bug fix release - -For a full list of what has changed and been fixed check out the release notes on the wiki - -* [ v7.1.2 ][49] -* [ `934ac6b` ][50] - -# [7.1.2][51] - -![@mattlorimer][25] [mattlorimer][26] released this Jul 7, 2014 · [ 6925 commits][52] to master since this release - -## Assets - -* [ **Source code** (zip) ][53] -* [ **Source code** (tar.gz) ][54] - -SuiteCRM has been updated to version 7.1.2 - -This is a bug fix release - -For a full list of what has changed and been fixed check out the release notes on the wiki - -* [ v7.1.1 ][55] -* [ `c1d7af4` ][56] - -# [7.1.1][57] - -![@mattlorimer][25] [mattlorimer][26] released this Apr 7, 2014 · [ 6987 commits][58] to master since this release - -## Assets - -* [ **Source code** (zip) ][59] -* [ **Source code** (tar.gz) ][60] - -SuiteCRM has been updated to version 7.1.1 - -This is a bug fix release - -For a full list of what has changed and been fixed check out the release notes on the wiki - -* [ v7.1 ][61] -* [ `4eabe6c` ][62] - -# [7.1][63] - -![@mattlorimer][25] [mattlorimer][26] released this Apr 1, 2014 · [ 7001 commits][64] to master since this release - -## Assets - -* [ **Source code** (zip) ][65] -* [ **Source code** (tar.gz) ][66] - -The long awaited SuiteCRM 7.1 is now available - -This release packs in many new features, most notably the many enhancements to workflow, the new lucene powered search, (to enable see AOD in the admin panel), the multi tabbed homepage, the ability to filter the history sub-panel and more - -Pre-release - -* [ v7.1RC2 ][67] -* [ `96ba6e5` ][68] - -# [7.1 Release Candidate 2][69] - -![@mattlorimer][25] [mattlorimer][26] released this Mar 28, 2014 · [ 7657 commits][70] to develop since this release - -## Assets - -* [ **Source code** (zip) ][71] -* [ **Source code** (tar.gz) ][72] - -Try out the Latest release of SuiteCRM, the final Release Candidate before Mondays release! - -Help to find the remaining bugs! - -Thanks all the feedback and fixes contributed for this release - -Pre-release - -* [ v7.1RC ][73] -* [ `f994bd0` ][74] - -# [7.1 Release Candidate ][75] - -![@mattlorimer][25] [mattlorimer][26] released this Mar 24, 2014 · [ 7687 commits][76] to develop since this release - -## Assets - -* [ **Source code** (zip) ][77] -* [ **Source code** (tar.gz) ][78] - -Try out the Latest release of SuiteCRM, the first Release Candidate, which should be more stable than it beta predecessors! But still not recommended for a production environment just yet - -But we still need you help to find the remaining bugs! - -Thanks all the feedback and fixes contributed so far. - -Pre-release - -* [ v7.1beta2 ][79] -* [ `8983fdf` ][80] - -# [7.1 Beta2][81] - -![@mattlorimer][25] [mattlorimer][26] released this Mar 14, 2014 · [ 7713 commits][82] to develop since this release - -## Assets - -* [ **Source code** (zip) ][83] -* [ **Source code** (tar.gz) ][84] - -Try out the Latest Beta release of SuiteCRM with many improvements and some major enhancements to Workflow - -Thanks to everyone who contributed! - -[Previous][85][Next][86] - -* © 2018 GitHub, Inc. -* [Terms][87] -* [Privacy][88] -* [Security][89] -* [Status][90] -* [Help][91] -[ ][92] - -* [Contact GitHub][93] -* [API][94] -* [Training][95] -* [Shop][96] -* [Blog][97] -* [About][98] - -You can't perform that action at this time. - -You signed in with another tab or window. [Reload][99] to refresh your session. You signed out in another tab or window. [Reload][99] to refresh your session. - -[1]: https://github.com#start-of-content -[2]: https://github.com/ -[3]: https://github.com/features -[4]: https://github.com/business -[5]: https://github.com/explore -[6]: https://github.com/marketplace -[7]: https://github.com/pricing -[8]: https://github.com/salesagility/SuiteCRM/releases -[9]: /login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases%3Fafter%3Dv7.1.5 -[10]: /join?source=header-repo -[11]: /login?return_to=%2Fsalesagility%2FSuiteCRM -[12]: https://github.com/salesagility/SuiteCRM/watchers -[13]: https://github.com/salesagility/SuiteCRM/stargazers -[14]: https://github.com/salesagility/SuiteCRM/network -[15]: https://github.com/salesagility -[16]: https://github.com/salesagility/SuiteCRM -[17]: https://github.com/salesagility/SuiteCRM/issues -[18]: https://github.com/salesagility/SuiteCRM/pulls -[19]: https://github.com/salesagility/SuiteCRM/wiki -[20]: https://github.com/salesagility/SuiteCRM/pulse -[21]: https://github.com/salesagility/SuiteCRM/tags -[22]: https://github.com/salesagility/SuiteCRM/tree/v7.2beta2 -[23]: https://github.com/salesagility/SuiteCRM/commit/cc1e2fd85ed757763231c84d25b4b0052c6d9d8b -[24]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.2beta2 -[25]: https://avatars1.githubusercontent.com/u/6449723?s=40&v=4 -[26]: https://github.com/mattlorimer -[27]: https://github.com/salesagility/SuiteCRM/compare/v7.2beta2...develop -[28]: https://github.com/salesagility/SuiteCRM/archive/v7.2beta2.zip -[29]: https://github.com/salesagility/SuiteCRM/archive/v7.2beta2.tar.gz -[30]: https://suitecrm.com/suitecrm?id=207:download&catid=126:suitecrm-beta -[31]: https://github.com/salesagility/SuiteCRM/tree/v7.2beta -[32]: https://github.com/salesagility/SuiteCRM/commit/fbc11ec38bcd0b3314d8f1eedc245460ea68d14d -[33]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.2beta -[34]: https://github.com/salesagility/SuiteCRM/compare/v7.2beta...develop -[35]: https://github.com/salesagility/SuiteCRM/archive/v7.2beta.zip -[36]: https://github.com/salesagility/SuiteCRM/archive/v7.2beta.tar.gz -[37]: https://github.com/salesagility/SuiteCRM/tree/v7.1.4 -[38]: https://github.com/salesagility/SuiteCRM/commit/0becccf2a82e42137357a09b069faa03f27763f7 -[39]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.1.4 -[40]: https://github.com/salesagility/SuiteCRM/compare/v7.1.4...master -[41]: https://github.com/salesagility/SuiteCRM/archive/v7.1.4.zip -[42]: https://github.com/salesagility/SuiteCRM/archive/v7.1.4.tar.gz -[43]: https://github.com/salesagility/SuiteCRM/tree/v7.1.3 -[44]: https://github.com/salesagility/SuiteCRM/commit/b4015f18b56eb20d3bc4ba9c51946ad8e5287f88 -[45]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.1.3 -[46]: https://github.com/salesagility/SuiteCRM/compare/v7.1.3...master -[47]: https://github.com/salesagility/SuiteCRM/archive/v7.1.3.zip -[48]: https://github.com/salesagility/SuiteCRM/archive/v7.1.3.tar.gz -[49]: https://github.com/salesagility/SuiteCRM/tree/v7.1.2 -[50]: https://github.com/salesagility/SuiteCRM/commit/934ac6b0296cbfbbc62c4566cd398566536bee49 -[51]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.1.2 -[52]: https://github.com/salesagility/SuiteCRM/compare/v7.1.2...master -[53]: https://github.com/salesagility/SuiteCRM/archive/v7.1.2.zip -[54]: https://github.com/salesagility/SuiteCRM/archive/v7.1.2.tar.gz -[55]: https://github.com/salesagility/SuiteCRM/tree/v7.1.1 -[56]: https://github.com/salesagility/SuiteCRM/commit/c1d7af470a81ac3af5a59c0b35612fd886e6bf4e -[57]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.1.1 -[58]: https://github.com/salesagility/SuiteCRM/compare/v7.1.1...master -[59]: https://github.com/salesagility/SuiteCRM/archive/v7.1.1.zip -[60]: https://github.com/salesagility/SuiteCRM/archive/v7.1.1.tar.gz -[61]: https://github.com/salesagility/SuiteCRM/tree/v7.1 -[62]: https://github.com/salesagility/SuiteCRM/commit/4eabe6c591837696043a1d9d0c8a5e2bbc63904f -[63]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.1 -[64]: https://github.com/salesagility/SuiteCRM/compare/v7.1...master -[65]: https://github.com/salesagility/SuiteCRM/archive/v7.1.zip -[66]: https://github.com/salesagility/SuiteCRM/archive/v7.1.tar.gz -[67]: https://github.com/salesagility/SuiteCRM/tree/v7.1RC2 -[68]: https://github.com/salesagility/SuiteCRM/commit/96ba6e53adeafe540628cdd1914a566feba2aa14 -[69]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.1RC2 -[70]: https://github.com/salesagility/SuiteCRM/compare/v7.1RC2...develop -[71]: https://github.com/salesagility/SuiteCRM/archive/v7.1RC2.zip -[72]: https://github.com/salesagility/SuiteCRM/archive/v7.1RC2.tar.gz -[73]: https://github.com/salesagility/SuiteCRM/tree/v7.1RC -[74]: https://github.com/salesagility/SuiteCRM/commit/f994bd0af71b41138a7be2b050e85417fa87c0b9 -[75]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.1RC -[76]: https://github.com/salesagility/SuiteCRM/compare/v7.1RC...develop -[77]: https://github.com/salesagility/SuiteCRM/archive/v7.1RC.zip -[78]: https://github.com/salesagility/SuiteCRM/archive/v7.1RC.tar.gz -[79]: https://github.com/salesagility/SuiteCRM/tree/v7.1beta2 -[80]: https://github.com/salesagility/SuiteCRM/commit/8983fdf5252b3081b4deb66cd5c30a9a2a598ed0 -[81]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.1beta2 -[82]: https://github.com/salesagility/SuiteCRM/compare/v7.1beta2...develop -[83]: https://github.com/salesagility/SuiteCRM/archive/v7.1beta2.zip -[84]: https://github.com/salesagility/SuiteCRM/archive/v7.1beta2.tar.gz -[85]: https://github.com/salesagility/SuiteCRM/releases?after=v7.1.8 -[86]: https://github.com/salesagility/SuiteCRM/releases?after=v7.1beta2 -[87]: https://github.com/site/terms -[88]: https://github.com/site/privacy -[89]: https://github.com/security -[90]: https://status.github.com/ -[91]: https://help.github.com -[92]: https://github.com "GitHub" -[93]: https://github.com/contact -[94]: https://developer.github.com -[95]: https://training.github.com -[96]: https://shop.github.com -[97]: https://github.com/blog -[98]: https://github.com/about -[99]: - - diff --git a/_source/releases11.md b/_source/releases11.md deleted file mode 100644 index 9c715250c..000000000 --- a/_source/releases11.md +++ /dev/null @@ -1,156 +0,0 @@ - - -[Source](https://github.com/salesagility/SuiteCRM/releases?after=v7.1beta2 "Permalink to Releases · salesagility/SuiteCRM · GitHub") - -# Releases · salesagility/SuiteCRM · GitHub - -[Skip to content][1] - -[ ][2] - -* [ Features ][3] -* [ Business ][4] -* [ Explore ][5] -* [ Marketplace ][6] -* [ Pricing ][7] - -[This repository][8] - -[Sign in][9] or [Sign up][10] - -* [ Watch ][11] [ 164 ][12] -* [ Star ][11] [ 819 ][13] -* [ Fork ][11] [ 686 ][14] - -# [salesagility][15]/[**SuiteCRM][16]** - -[ Code ][16] [ Issues 609 ][17] [ Pull requests 286 ][18] [ Wiki ][19] [ Insights ][20] - -[Releases][8] [Tags][21] - -Pre-release - -* [ v7.1beta ][22] -* [ `4aa8f7f` ][23] - -# [7.1 Beta][24] - -![@mattlorimer][25] [mattlorimer][26] released this Feb 4, 2014 · [ 7741 commits][27] to develop since this release - -## Assets - -* [ **Source code** (zip) ][28] -* [ **Source code** (tar.gz) ][29] - -This is a beta release and should not be used in a production environment. - -Try 7.1 Beta to preview the new features coming in 7.1 including enhanced search, improved workflow and default theme plus social integration. - -* [ v7.0.2 ][30] -* [ `d28205e` ][31] - -# [v7.0.2][32] - -![@mattlorimer][25] [mattlorimer][26] released this Jan 20, 2014 · [ 7226 commits][33] to master since this release - -## Assets - -* [ **Source code** (zip) ][34] -* [ **Source code** (tar.gz) ][35] - -Bug fix release which also adds in two new language translations for Spanish and Russian - -* [ v7.0.1 ][36] -* [ `f60dbf5` ][37] - -# [v7.0.1: Update README.md][38] - -![@salesagility][39] [salesagility][15] released this Nov 25, 2013 · [ 7295 commits][40] to master since this release - -## Assets - -* [ **Source code** (zip) ][41] -* [ **Source code** (tar.gz) ][42] - - - Adding details to SuiteCRM readme.md - -[Previous][43]Next - -* © 2018 GitHub, Inc. -* [Terms][44] -* [Privacy][45] -* [Security][46] -* [Status][47] -* [Help][48] -[ ][49] - -* [Contact GitHub][50] -* [API][51] -* [Training][52] -* [Shop][53] -* [Blog][54] -* [About][55] - -You can't perform that action at this time. - -You signed in with another tab or window. [Reload][56] to refresh your session. You signed out in another tab or window. [Reload][56] to refresh your session. - -[1]: https://github.com#start-of-content -[2]: https://github.com/ -[3]: https://github.com/features -[4]: https://github.com/business -[5]: https://github.com/explore -[6]: https://github.com/marketplace -[7]: https://github.com/pricing -[8]: https://github.com/salesagility/SuiteCRM/releases -[9]: /login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases%3Fafter%3Dv7.1beta2 -[10]: /join?source=header-repo -[11]: /login?return_to=%2Fsalesagility%2FSuiteCRM -[12]: https://github.com/salesagility/SuiteCRM/watchers -[13]: https://github.com/salesagility/SuiteCRM/stargazers -[14]: https://github.com/salesagility/SuiteCRM/network -[15]: https://github.com/salesagility -[16]: https://github.com/salesagility/SuiteCRM -[17]: https://github.com/salesagility/SuiteCRM/issues -[18]: https://github.com/salesagility/SuiteCRM/pulls -[19]: https://github.com/salesagility/SuiteCRM/wiki -[20]: https://github.com/salesagility/SuiteCRM/pulse -[21]: https://github.com/salesagility/SuiteCRM/tags -[22]: https://github.com/salesagility/SuiteCRM/tree/v7.1beta -[23]: https://github.com/salesagility/SuiteCRM/commit/4aa8f7fda9ca15356f35d64e351f382db1d3e8e0 -[24]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.1beta -[25]: https://avatars1.githubusercontent.com/u/6449723?s=40&v=4 -[26]: https://github.com/mattlorimer -[27]: https://github.com/salesagility/SuiteCRM/compare/v7.1beta...develop -[28]: https://github.com/salesagility/SuiteCRM/archive/v7.1beta.zip -[29]: https://github.com/salesagility/SuiteCRM/archive/v7.1beta.tar.gz -[30]: https://github.com/salesagility/SuiteCRM/tree/v7.0.2 -[31]: https://github.com/salesagility/SuiteCRM/commit/d28205e9ee8043269c4cb275270a226519648285 -[32]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.0.2 -[33]: https://github.com/salesagility/SuiteCRM/compare/v7.0.2...master -[34]: https://github.com/salesagility/SuiteCRM/archive/v7.0.2.zip -[35]: https://github.com/salesagility/SuiteCRM/archive/v7.0.2.tar.gz -[36]: https://github.com/salesagility/SuiteCRM/tree/v7.0.1 -[37]: https://github.com/salesagility/SuiteCRM/commit/f60dbf5502392b8b9d90e5110cc1302bf9c5f8ee -[38]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.0.1 -[39]: https://avatars2.githubusercontent.com/u/1450870?s=40&v=4 -[40]: https://github.com/salesagility/SuiteCRM/compare/v7.0.1...master -[41]: https://github.com/salesagility/SuiteCRM/archive/v7.0.1.zip -[42]: https://github.com/salesagility/SuiteCRM/archive/v7.0.1.tar.gz -[43]: https://github.com/salesagility/SuiteCRM/releases?after=v7.1.5 -[44]: https://github.com/site/terms -[45]: https://github.com/site/privacy -[46]: https://github.com/security -[47]: https://status.github.com/ -[48]: https://help.github.com -[49]: https://github.com "GitHub" -[50]: https://github.com/contact -[51]: https://developer.github.com -[52]: https://training.github.com -[53]: https://shop.github.com -[54]: https://github.com/blog -[55]: https://github.com/about -[56]: - - diff --git a/_source/releases2.md b/_source/releases2.md deleted file mode 100644 index 9d2ea1c74..000000000 --- a/_source/releases2.md +++ /dev/null @@ -1,425 +0,0 @@ - - -[Source](https://github.com/salesagility/SuiteCRM/releases?after=7.9.6 "Permalink to Releases · salesagility/SuiteCRM · GitHub") - -# Releases · salesagility/SuiteCRM · GitHub - -[Skip to content][1] - -[ ][2] - -* [ Features ][3] -* [ Business ][4] -* [ Explore ][5] -* [ Marketplace ][6] -* [ Pricing ][7] - -[This repository][8] - -[Sign in][9] or [Sign up][10] - -* [ Watch ][11] [ 164 ][12] -* [ Star ][11] [ 819 ][13] -* [ Fork ][11] [ 686 ][14] - -# [salesagility][15]/[**SuiteCRM][16]** - -[ Code ][16] [ Issues 609 ][17] [ Pull requests 285 ][18] [ Wiki ][19] [ Insights ][20] - -[Releases][8] [Tags][21] - -* [ v7.8.7 ][22] -* [ `6f54080` ][23] - -# [v7.8.7][24] - -![@Dillon-Brown][25] [Dillon-Brown][26] released this Oct 3, 2017 · [ 257 commits][27] to 7.8.x since this release - -## Assets - -* [ **Source code** (zip) ][28] -* [ **Source code** (tar.gz) ][29] - -**SuiteCRM 7.8.7 LTS is now Available to Download** - -For more detail and to see all issues addressed in this release view the [Release Notes][30]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][31] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -We have also updated our Security Process asking the community to send their security issues directly to us via email [security@suitecrm.com][32] - -We have also added a Code of Conduct to help build a more welcoming environment for our community. -[SuiteCRM Code of Conduct][33] - -* [ v7.9.5 ][34] -* [ `da2f36e` ][35] - -# [7.9.5][36] - -![@mattlorimer][37] [mattlorimer][38] released this Sep 6, 2017 · [ 633 commits][39] to master since this release - -## Assets - -* [ **Source code** (zip) ][40] -* [ **Source code** (tar.gz) ][41] - -**SuiteCRM 7.9.5 is now Available to Download** - -For more detail and to see all issues addressed in this release view the [Release Notes][42]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][31] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -We have also updated our Security Process asking the community to send their security issues directly to us via email [security@suitecrm.com][32] - -We have also added a Code of Conduct to help build a more welcoming environment for our community. -[SuiteCRM Code of Conduct][33] - -* [ v7.8.6 ][43] -* [ `de18c84` ][44] - -# [v7.8.6][45] - -![@mattlorimer][37] [mattlorimer][38] released this Sep 6, 2017 · [ 356 commits][46] to 7.8.x since this release - -## Assets - -* [ **Source code** (zip) ][47] -* [ **Source code** (tar.gz) ][48] - -**SuiteCRM 7.8.6 LTS is now Available to Download** - -For more detail and to see all issues addressed in this release view the [Release Notes][49]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][31] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -We have also updated our Security Process asking the community to send their security issues directly to us via email [security@suitecrm.com][32] - -We have also added a Code of Conduct to help build a more welcoming environment for our community. -[SuiteCRM Code of Conduct][33] - -* [ v7.9.4 ][50] -* [ `24ce66e` ][51] - -# [7.9.4][52] - -![@Dillon-Brown][25] [Dillon-Brown][26] released this Jul 20, 2017 · [ 850 commits][53] to master since this release - -## Assets - -* [ **Source code** (zip) ][54] -* [ **Source code** (tar.gz) ][55] - -**SuiteCRM 7.9.4 is now Available to Download** - -For more detail and to see all issues addressed in this release view the [Release Notes][56]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][31] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -We have also updated our Security Process asking the community to send their security issues directly to us via email [security@suitecrm.com][32] - -We have also added a Code of Conduct to help build a more welcoming environment for our community. -[SuiteCRM Code of Conduct][33] - -* [ v7.9.3 ][57] -* [ `3daeb36` ][58] - -# [7.9.3][59] - -![@Dillon-Brown][25] [Dillon-Brown][26] released this Jul 17, 2017 · [ 867 commits][60] to master since this release - -## Assets - -* [ **Source code** (zip) ][61] -* [ **Source code** (tar.gz) ][62] - -**SuiteCRM 7.9.3 is now Available to Download** - -For more detail and to see all issues addressed in this release view the [Release Notes][63]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][31] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -We have also updated our Security Process asking the community to send their security issues directly to us via email [security@suitecrm.com][32] - -We have also added a Code of Conduct to help build a more welcoming environment for our community. -[SuiteCRM Code of Conduct][33] - -Special thanks to [@sergio91pt][64] for raising/reviewing security issues. - -* [ v7.9.2 ][65] -* [ `084f2f3` ][66] - -# [7.9.2][67] - -![@samus-aran][68] [samus-aran][69] released this Jun 30, 2017 · [ 1109 commits][70] to master since this release - -## Assets - -* [ **Source code** (zip) ][71] -* [ **Source code** (tar.gz) ][72] - -**SuiteCRM 7.9.2 is now Available to Download** - -For more detail and to see all issues addressed in this release view the [Release Notes][73]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][31] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -Checkout our [SuiteCRM][74] forum announcement. - -We have also updated our Security Process asking the community to send their security issues directly to us via email [security@suitecrm.com][32] - -* [ v7.9.1 ][75] -* [ `032cc00` ][76] - -# [7.9.1][77] - -![@samus-aran][68] [samus-aran][69] released this Jun 15, 2017 · [ 1189 commits][78] to master since this release - -## Assets - -* [ **Source code** (zip) ][79] -* [ **Source code** (tar.gz) ][80] - -**SuiteCRM 7.9.1 is now Available to Download** - -This release resolves a IMPORTANT Security Vulnerability that effect all releases of SuiteCRM, all users of ALL previous releases are advised to Upgrade to 7.9.1 or 7.8.5 as soon as possible. - -For more detail and to see all issues addressed in this release view the [Release Notes][81]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][31] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -Special thanks to [krzyc][82] for notifying us of the security issue. - -We have also updated our Security Process asking the community to send their security issues directly to us via email [security@suitecrm.com][32] - -* [ v7.8.5 ][83] -* [ `1b69962` ][84] - -# [7.8.5][85] - -![@samus-aran][68] [samus-aran][69] released this Jun 15, 2017 · [ 375 commits][86] to 7.8.x since this release - -## Assets - -* [ **Source code** (zip) ][87] -* [ **Source code** (tar.gz) ][88] - -**SuiteCRM 7.8.5 is now Available to Download** - -This release addresses an Important Security Issue and addresses many other Issues - -Users of ALL previous releases are advised to Upgrade to 7.8.5 or 7.9.1 as soon as possible - -For more detail and to see all issues addressed in this release view the [Release Notes][89] - -Download here from the SuiteCRM GitHub Repository or [visit the official website][31] to find the appropriate upgrade. - -Special thanks to [krzyc][82] for notifying us of the security issue. - -We have also updated our Security Process asking the community to send their security issues directly to us via email [security@suitecrm.com][32]. - -* [ v7.9.0 ][90] -* [ `2e1122e` ][91] - -# [7.9.0][92] - -![@samus-aran][68] [samus-aran][69] released this May 29, 2017 · [ 1419 commits][93] to master since this release - -## Assets - -* [ **Source code** (zip) ][94] -* [ **Source code** (tar.gz) ][95] - -**SuiteCRM 7.9.0 is now Available to Download** - -**New Email Client** New designed SuiteP Email client - see Release Notes for more details -**New Preferred Email Template Editor** \- a new user preference to select either a TinyMCE, Mozaik, or direct HTML -**Improved Project Module** \- Gantt chart, Project creation and task allocation improvements -**Updated View Summary** \- Updated styling and new grouped by 'type' -**Deprecated Suite7 & SuiteR themes** \- don't worry, we have announced LTS for 7.8.x - -For more detail and to see all issues addressed in this release view the [Release Notes][96] which also includes a 7.9.0 specific User Guide. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][31] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -* [ v7.8.4 ][97] -* [ `e7fe1d5` ][98] - -# [7.8.4][99] - -![@samus-aran][68] [samus-aran][69] released this May 29, 2017 · [ 1958 commits][100] to master since this release - -## Assets - -* [ **Source code** (zip) ][101] -* [ **Source code** (tar.gz) ][102] - -**SuiteCRM 7.8.4 is now Available to Download** - -SuiteCRM 7.8.4 is a Bug Fix release - -Please see the [Release Notes][103] on list of Bug fixes noted on Github and [SuiteCRM Forums][104]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][31] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -Special thanks to [haris-raheem][105] for providing further enhancements for the Projects Module. - -[Previous][8][Next][106] - -* © 2018 GitHub, Inc. -* [Terms][107] -* [Privacy][108] -* [Security][109] -* [Status][110] -* [Help][111] -[ ][112] - -* [Contact GitHub][113] -* [API][114] -* [Training][115] -* [Shop][116] -* [Blog][117] -* [About][118] - -You can't perform that action at this time. - -You signed in with another tab or window. [Reload][119] to refresh your session. You signed out in another tab or window. [Reload][119] to refresh your session. - -[1]: https://github.com#start-of-content -[2]: https://github.com/ -[3]: https://github.com/features -[4]: https://github.com/business -[5]: https://github.com/explore -[6]: https://github.com/marketplace -[7]: https://github.com/pricing -[8]: https://github.com/salesagility/SuiteCRM/releases -[9]: /login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases%3Fafter%3D7.9.6 -[10]: /join?source=header-repo -[11]: /login?return_to=%2Fsalesagility%2FSuiteCRM -[12]: https://github.com/salesagility/SuiteCRM/watchers -[13]: https://github.com/salesagility/SuiteCRM/stargazers -[14]: https://github.com/salesagility/SuiteCRM/network -[15]: https://github.com/salesagility -[16]: https://github.com/salesagility/SuiteCRM -[17]: https://github.com/salesagility/SuiteCRM/issues -[18]: https://github.com/salesagility/SuiteCRM/pulls -[19]: https://github.com/salesagility/SuiteCRM/wiki -[20]: https://github.com/salesagility/SuiteCRM/pulse -[21]: https://github.com/salesagility/SuiteCRM/tags -[22]: https://github.com/salesagility/SuiteCRM/tree/v7.8.7 -[23]: https://github.com/salesagility/SuiteCRM/commit/6f540808a0bf9334ca55013c4abe6698c580f81b -[24]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.7 -[25]: https://avatars0.githubusercontent.com/u/26431166?s=40&v=4 -[26]: https://github.com/Dillon-Brown -[27]: https://github.com/salesagility/SuiteCRM/compare/v7.8.7...7.8.x -[28]: https://github.com/salesagility/SuiteCRM/archive/v7.8.7.zip -[29]: https://github.com/salesagility/SuiteCRM/archive/v7.8.7.tar.gz -[30]: https://suitecrm.com/wiki/index.php/Release_notes_7.8.7 -[31]: https://suitecrm.com/download -[32]: mailto:security%40suitecrm.com -[33]: https://github.com/salesagility/SuiteCRM/blob/master/CODE_OF_CONDUCT.md -[34]: https://github.com/salesagility/SuiteCRM/tree/v7.9.5 -[35]: https://github.com/salesagility/SuiteCRM/commit/da2f36eb904933f9b5f4d5a7809ee6b26d05b43a -[36]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.5 -[37]: https://avatars1.githubusercontent.com/u/6449723?s=40&v=4 -[38]: https://github.com/mattlorimer -[39]: https://github.com/salesagility/SuiteCRM/compare/v7.9.5...master -[40]: https://github.com/salesagility/SuiteCRM/archive/v7.9.5.zip -[41]: https://github.com/salesagility/SuiteCRM/archive/v7.9.5.tar.gz -[42]: https://suitecrm.com/wiki/index.php/Release_notes_7.9.5 -[43]: https://github.com/salesagility/SuiteCRM/tree/v7.8.6 -[44]: https://github.com/salesagility/SuiteCRM/commit/de18c84462d4e173bee9c14b0cb71dce855354cc -[45]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.6 -[46]: https://github.com/salesagility/SuiteCRM/compare/v7.8.6...7.8.x -[47]: https://github.com/salesagility/SuiteCRM/archive/v7.8.6.zip -[48]: https://github.com/salesagility/SuiteCRM/archive/v7.8.6.tar.gz -[49]: https://suitecrm.com/wiki/index.php/Release_notes_7.8.6 -[50]: https://github.com/salesagility/SuiteCRM/tree/v7.9.4 -[51]: https://github.com/salesagility/SuiteCRM/commit/24ce66ea84a8f7dbf6628c9539109bc17ec4476e -[52]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.4 -[53]: https://github.com/salesagility/SuiteCRM/compare/v7.9.4...master -[54]: https://github.com/salesagility/SuiteCRM/archive/v7.9.4.zip -[55]: https://github.com/salesagility/SuiteCRM/archive/v7.9.4.tar.gz -[56]: https://suitecrm.com/wiki/index.php/Release_notes_7.9.4 -[57]: https://github.com/salesagility/SuiteCRM/tree/v7.9.3 -[58]: https://github.com/salesagility/SuiteCRM/commit/3daeb36ed366d83a56609165e50048c2fa46f57a -[59]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.3 -[60]: https://github.com/salesagility/SuiteCRM/compare/v7.9.3...master -[61]: https://github.com/salesagility/SuiteCRM/archive/v7.9.3.zip -[62]: https://github.com/salesagility/SuiteCRM/archive/v7.9.3.tar.gz -[63]: https://suitecrm.com/wiki/index.php/Release_notes_7.9.3 -[64]: https://github.com/sergio91pt -[65]: https://github.com/salesagility/SuiteCRM/tree/v7.9.2 -[66]: https://github.com/salesagility/SuiteCRM/commit/084f2f3f1f805cea2603323b1924f998ebffe0e9 -[67]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.2 -[68]: https://avatars1.githubusercontent.com/u/4041275?s=40&v=4 -[69]: https://github.com/samus-aran -[70]: https://github.com/salesagility/SuiteCRM/compare/v7.9.2...master -[71]: https://github.com/salesagility/SuiteCRM/archive/v7.9.2.zip -[72]: https://github.com/salesagility/SuiteCRM/archive/v7.9.2.tar.gz -[73]: https://suitecrm.com/wiki/index.php/Release_notes_7.9.2 -[74]: https://suitecrm.com/forum/announcements/14874-suitecrm-7-9-2-maintenance-patch-now-available -[75]: https://github.com/salesagility/SuiteCRM/tree/v7.9.1 -[76]: https://github.com/salesagility/SuiteCRM/commit/032cc000331e1d9a411e468f292e8f9d14d553fd -[77]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.1 -[78]: https://github.com/salesagility/SuiteCRM/compare/v7.9.1...master -[79]: https://github.com/salesagility/SuiteCRM/archive/v7.9.1.zip -[80]: https://github.com/salesagility/SuiteCRM/archive/v7.9.1.tar.gz -[81]: https://suitecrm.com/wiki/index.php/Release_notes_7.9.1 -[82]: https://github.com/krzyc -[83]: https://github.com/salesagility/SuiteCRM/tree/v7.8.5 -[84]: https://github.com/salesagility/SuiteCRM/commit/1b69962444472196760d139a65c00379f161b3ac -[85]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.5 -[86]: https://github.com/salesagility/SuiteCRM/compare/v7.8.5...7.8.x -[87]: https://github.com/salesagility/SuiteCRM/archive/v7.8.5.zip -[88]: https://github.com/salesagility/SuiteCRM/archive/v7.8.5.tar.gz -[89]: https://suitecrm.com/wiki/index.php?title=Release_notes_7.8.5 -[90]: https://github.com/salesagility/SuiteCRM/tree/v7.9.0 -[91]: https://github.com/salesagility/SuiteCRM/commit/2e1122effe9684c524dcc9e21b77d1eba45b4787 -[92]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.0 -[93]: https://github.com/salesagility/SuiteCRM/compare/v7.9.0...master -[94]: https://github.com/salesagility/SuiteCRM/archive/v7.9.0.zip -[95]: https://github.com/salesagility/SuiteCRM/archive/v7.9.0.tar.gz -[96]: https://suitecrm.com/wiki/index.php/Release_notes_7.9.0 -[97]: https://github.com/salesagility/SuiteCRM/tree/v7.8.4 -[98]: https://github.com/salesagility/SuiteCRM/commit/e7fe1d56b62f650824cbbfca1fcd8da8dda46205 -[99]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.4 -[100]: https://github.com/salesagility/SuiteCRM/compare/v7.8.4...master -[101]: https://github.com/salesagility/SuiteCRM/archive/v7.8.4.zip -[102]: https://github.com/salesagility/SuiteCRM/archive/v7.8.4.tar.gz -[103]: https://suitecrm.com/wiki/index.php/Release_notes_7.8.4 -[104]: https://suitecrm.com/forum/index -[105]: https://github.com/haris-raheem -[106]: https://github.com/salesagility/SuiteCRM/releases?after=v7.8.4 -[107]: https://github.com/site/terms -[108]: https://github.com/site/privacy -[109]: https://github.com/security -[110]: https://status.github.com/ -[111]: https://help.github.com -[112]: https://github.com "GitHub" -[113]: https://github.com/contact -[114]: https://developer.github.com -[115]: https://training.github.com -[116]: https://shop.github.com -[117]: https://github.com/blog -[118]: https://github.com/about -[119]: - - diff --git a/_source/releases3.md b/_source/releases3.md deleted file mode 100644 index 66241dfcb..000000000 --- a/_source/releases3.md +++ /dev/null @@ -1,399 +0,0 @@ - - -[Source](https://github.com/salesagility/SuiteCRM/releases?after=v7.8.4 "Permalink to Releases · salesagility/SuiteCRM · GitHub") - -# Releases · salesagility/SuiteCRM · GitHub - -[Skip to content][1] - -[ ][2] - -* [ Features ][3] -* [ Business ][4] -* [ Explore ][5] -* [ Marketplace ][6] -* [ Pricing ][7] - -[This repository][8] - -[Sign in][9] or [Sign up][10] - -* [ Watch ][11] [ 164 ][12] -* [ Star ][11] [ 819 ][13] -* [ Fork ][11] [ 686 ][14] - -# [salesagility][15]/[**SuiteCRM][16]** - -[ Code ][16] [ Issues 609 ][17] [ Pull requests 285 ][18] [ Wiki ][19] [ Insights ][20] - -[Releases][8] [Tags][21] - -Pre-release - -* [ v7.9.0-rc ][22] -* [ `e239cdb` ][23] - -# [7.9.0 Release Candidate][24] - -![@Dillon-Brown][25] [Dillon-Brown][26] released this May 8, 2017 · [ 2245 commits][27] to develop since this release - -## Assets - -* [ **Source code** (zip) ][28] -* [ **Source code** (tar.gz) ][29] - -**This is a Release Candidate release and should not be used in a production environment.** - -Try 7.9.0 Release Candidate to preview the new features coming in SuiteCRM 7.9. - -The focus of SuiteCRM 7.9 is to introduce a new and responsive Email Client and enhancements for Campaigns Email Template editor. - -[Click here][30] to get the full details of this release and to get the upgrade package - -Pre-release - -* [ v7.9.0-beta ][31] -* [ `e5c3d1c` ][32] - -# [7.9.0 Beta][33] - -![@samus-aran][34] [samus-aran][35] released this Apr 25, 2017 · [ 2391 commits][36] to develop since this release - -## Assets - -* [ **Source code** (zip) ][37] -* [ **Source code** (tar.gz) ][38] - -**This is a Beta release and should not be used in a production environment.** - -Try 7.9.0 Beta to preview the new features coming in SuiteCRM 7.9. - -The focus of SuiteCRM 7.9 is to introduce a new and responsive Email Client and enhancements for Campaigns Email Template editor. - -[Click here][30] to get the full details of this release and to get the upgrade package - -* [ v7.8.3 ][39] -* [ `8b38625` ][40] - -# [7.8.3][41] - -![@samus-aran][34] [samus-aran][35] released this Apr 11, 2017 · [ 2023 commits][42] to master since this release - -## Assets - -* [ **Source code** (zip) ][43] -* [ **Source code** (tar.gz) ][44] - -**SuiteCRM 7.8.3 is now Available to Download** - -SuiteCRM 7.8.3 is a Bug Fix release - -Please see the [Release Notes][45] on list of Bug fixes noted on Github and [SuiteCRM Forums][46]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][47] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -* [ v7.8.2 ][48] -* [ `8a8a300` ][49] - -# [7.8.2][50] - -![@samus-aran][34] [samus-aran][35] released this Feb 27, 2017 · [ 2123 commits][51] to master since this release - -## Assets - -* [ **Source code** (zip) ][52] -* [ **Source code** (tar.gz) ][53] - -**SuiteCRM 7.8.2 is now Available to Download** - -This release addresses an Important Security Issue and addresses many other Issues - -Users of ALL previous releases are advised to Upgrade to 7.8.2 as soon as possible - -Please see the [Release Notes][54] on list of Bug fixes noted on Github and [SuiteCRM Forums][46]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][47] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -* [ v7.8.1 ][55] -* [ `b4218b0` ][56] - -# [7.8.1][57] - -![@samus-aran][34] [samus-aran][35] released this Feb 6, 2017 · [ 2230 commits][58] to master since this release - -## Assets - -* [ **Source code** (zip) ][59] -* [ **Source code** (tar.gz) ][60] - -**SuiteCRM 7.8.1 is now Available to Download** - -SuiteCRM 7.8.1 is a Bug Fix release - -Please see the [Release Notes][61] on list of Bug fixes noted on Github and [SuiteCRM Forums][46]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][47] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -* [ v7.8.0 ][62] -* [ `673712c` ][63] - -# [7.8][64] - -![@samus-aran][34] [samus-aran][35] released this Jan 30, 2017 · [ 2263 commits][65] to master since this release - -## Assets - -* [ **Source code** (zip) ][66] -* [ **Source code** (tar.gz) ][67] - -**SuiteCRM 7.8 is now Available to Download** - -**New Filter** functionality which replaces the legacy Basic/Advanced Search layouts. If you still prefer the old search view on any modules you can add a setting within the config_overwrite.php file - see Release Notes. -**New Workflow Calculated fields** \- a new action that allows you to enter formulas to execute complex actions. Contributed by [diligent technology & business consulting GmbH][68] -**Improved SuiteP theme** \- introduced Sass (for developers new steps will be introduced for when contributing style changes), cleaned up CSS and tidied up many areas of the system. - -For more detail and to see all issues addressed in this release view the [Release Notes][69] - -Download here from the SuiteCRM GitHub Repository or [visit the official website][47] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -Pre-release - -* [ v7.8.0-rc ][70] -* [ `779ee20` ][71] - -# [7.8 Release Candidate][72] - -![@mattlorimer][73] [mattlorimer][74] released this Jan 23, 2017 · [ 2992 commits][75] to develop since this release - -## Assets - -* [ **Source code** (zip) ][76] -* [ **Source code** (tar.gz) ][77] - -**This is a Pre release and should not be used in a production environment.** - -Try 7.8.0 RC to preview the new features coming in SuiteCRM 7.8. - -The focus of SuiteCRM 7.8 is to enhance and refine the SuiteP theme and fix many issues - -SuiteP Rewritten in SASS, Refined List View filters, added support for PHP 7.1 and this release includes a great contribution of Workflow Calculated Fields from diligent technology & business consulting GmbH () - -[Click here][30] to get the full details of this release and to get the upgrade package - -Pre-release - -* [ v7.8.0-beta.2 ][78] -* [ `711cda1` ][79] - -# [7.8 Beta 2][80] - -![@mattlorimer][73] [mattlorimer][74] released this Jan 16, 2017 · [ 3096 commits][81] to develop since this release - -## Assets - -* [ **Source code** (zip) ][82] -* [ **Source code** (tar.gz) ][83] - -**This is a Beta release and should not be used in a production environment.** - -Try 7.8.0 Beta 2 to preview the new features coming in SuiteCRM 7.8. - -The focus of SuiteCRM 7.8 is to enhance and refine the SuiteP theme and fix many issues - -SuiteP Rewritten in SASS, Refined List View filters and added support for PHP 7.1 - -[Click here][30] to get the full details of this release and to get the upgrade package - -* [ v7.7.9 ][84] -* [ `b64d0fd` ][85] - -# [7.7.9][86] - -![@mattlorimer][73] [mattlorimer][74] released this Dec 31, 2016 · [ 2920 commits][87] to master since this release - -## Assets - -* [ **Source code** (zip) ][88] -* [ **Source code** (tar.gz) ][89] - -**SuiteCRM 7.7.9 is now Available to Download** - -This release addresses an Important Security Issue and addresses many other Issues - -Users of ALL previous releases are advised to Upgrade to 7.7.9 as soon as possible - -For more detail and to see all issues addressed in this release view the [Release Notes][90] - -Download here from the SuiteCRM GitHub Repository or [visit the official website][47] to find the appropriate upgrade. - -Special thanks to [gunnicom][91] and [sk1p][92] for notifying us of the [security issue][93]. - -Pre-release - -* [ v7.8.0-beta ][94] -* [ `02047a7` ][95] - -# [7.8 Beta][96] - -![@mattlorimer][73] [mattlorimer][74] released this Dec 30, 2016 · [ 3235 commits][97] to develop since this release - -## Assets - -* [ **Source code** (zip) ][98] -* [ **Source code** (tar.gz) ][99] - -**This is a Beta release and should not be used in a production environment.** - -Try 7.8.0 Beta to preview the new features coming in SuiteCRM 7.8. - -The focus of SuiteCRM 7.8 is to enhance and refine the SuiteP theme and fix many issues - -SuiteP Rewritten in SASS and Refined List View filters - -[Click here][30] to get the full details of this release and to get the upgrade package - -[Previous][100][Next][101] - -* © 2018 GitHub, Inc. -* [Terms][102] -* [Privacy][103] -* [Security][104] -* [Status][105] -* [Help][106] -[ ][107] - -* [Contact GitHub][108] -* [API][109] -* [Training][110] -* [Shop][111] -* [Blog][112] -* [About][113] - -You can't perform that action at this time. - -You signed in with another tab or window. [Reload][114] to refresh your session. You signed out in another tab or window. [Reload][114] to refresh your session. - -[1]: https://github.com#start-of-content -[2]: https://github.com/ -[3]: https://github.com/features -[4]: https://github.com/business -[5]: https://github.com/explore -[6]: https://github.com/marketplace -[7]: https://github.com/pricing -[8]: https://github.com/salesagility/SuiteCRM/releases -[9]: /login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases%3Fafter%3Dv7.8.4 -[10]: /join?source=header-repo -[11]: /login?return_to=%2Fsalesagility%2FSuiteCRM -[12]: https://github.com/salesagility/SuiteCRM/watchers -[13]: https://github.com/salesagility/SuiteCRM/stargazers -[14]: https://github.com/salesagility/SuiteCRM/network -[15]: https://github.com/salesagility -[16]: https://github.com/salesagility/SuiteCRM -[17]: https://github.com/salesagility/SuiteCRM/issues -[18]: https://github.com/salesagility/SuiteCRM/pulls -[19]: https://github.com/salesagility/SuiteCRM/wiki -[20]: https://github.com/salesagility/SuiteCRM/pulse -[21]: https://github.com/salesagility/SuiteCRM/tags -[22]: https://github.com/salesagility/SuiteCRM/tree/v7.9.0-rc -[23]: https://github.com/salesagility/SuiteCRM/commit/e239cdb0b0522e48f8e366a9144bc96849bf6032 -[24]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.0-rc -[25]: https://avatars0.githubusercontent.com/u/26431166?s=40&v=4 -[26]: https://github.com/Dillon-Brown -[27]: https://github.com/salesagility/SuiteCRM/compare/v7.9.0-rc...develop -[28]: https://github.com/salesagility/SuiteCRM/archive/v7.9.0-rc.zip -[29]: https://github.com/salesagility/SuiteCRM/archive/v7.9.0-rc.tar.gz -[30]: https://suitecrm.com/download/download-pre-release -[31]: https://github.com/salesagility/SuiteCRM/tree/v7.9.0-beta -[32]: https://github.com/salesagility/SuiteCRM/commit/e5c3d1ce8d86ac83511e61ee53f7d68bc4e3badf -[33]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.0-beta -[34]: https://avatars1.githubusercontent.com/u/4041275?s=40&v=4 -[35]: https://github.com/samus-aran -[36]: https://github.com/salesagility/SuiteCRM/compare/v7.9.0-beta...develop -[37]: https://github.com/salesagility/SuiteCRM/archive/v7.9.0-beta.zip -[38]: https://github.com/salesagility/SuiteCRM/archive/v7.9.0-beta.tar.gz -[39]: https://github.com/salesagility/SuiteCRM/tree/v7.8.3 -[40]: https://github.com/salesagility/SuiteCRM/commit/8b386259cf0e6123f7ba6d27a4aab32d81c19bd0 -[41]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.3 -[42]: https://github.com/salesagility/SuiteCRM/compare/v7.8.3...master -[43]: https://github.com/salesagility/SuiteCRM/archive/v7.8.3.zip -[44]: https://github.com/salesagility/SuiteCRM/archive/v7.8.3.tar.gz -[45]: https://suitecrm.com/wiki/index.php/Release_notes_7.8.3 -[46]: https://suitecrm.com/forum/index -[47]: https://suitecrm.com/download -[48]: https://github.com/salesagility/SuiteCRM/tree/v7.8.2 -[49]: https://github.com/salesagility/SuiteCRM/commit/8a8a300bd7664bd3b7fb2cb6fda0f348a9dcd23e -[50]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.2 -[51]: https://github.com/salesagility/SuiteCRM/compare/v7.8.2...master -[52]: https://github.com/salesagility/SuiteCRM/archive/v7.8.2.zip -[53]: https://github.com/salesagility/SuiteCRM/archive/v7.8.2.tar.gz -[54]: https://suitecrm.com/wiki/index.php/Release_notes_7.8.2 -[55]: https://github.com/salesagility/SuiteCRM/tree/v7.8.1 -[56]: https://github.com/salesagility/SuiteCRM/commit/b4218b0759cf3f7d40d820bb62729d17d4e5eb31 -[57]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.1 -[58]: https://github.com/salesagility/SuiteCRM/compare/v7.8.1...master -[59]: https://github.com/salesagility/SuiteCRM/archive/v7.8.1.zip -[60]: https://github.com/salesagility/SuiteCRM/archive/v7.8.1.tar.gz -[61]: https://suitecrm.com/wiki/index.php/Release_notes_7.8.1 -[62]: https://github.com/salesagility/SuiteCRM/tree/v7.8.0 -[63]: https://github.com/salesagility/SuiteCRM/commit/673712cc1faf269d470767430bf734e09f126b6a -[64]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.0 -[65]: https://github.com/salesagility/SuiteCRM/compare/v7.8.0...master -[66]: https://github.com/salesagility/SuiteCRM/archive/v7.8.0.zip -[67]: https://github.com/salesagility/SuiteCRM/archive/v7.8.0.tar.gz -[68]: http://www.dtbc.eu/ -[69]: https://suitecrm.com/wiki/index.php?title=Release_notes_7.8 -[70]: https://github.com/salesagility/SuiteCRM/tree/v7.8.0-rc -[71]: https://github.com/salesagility/SuiteCRM/commit/779ee2083a36a4c4efb4fd6c8b04c418c5241f37 -[72]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.0-rc -[73]: https://avatars1.githubusercontent.com/u/6449723?s=40&v=4 -[74]: https://github.com/mattlorimer -[75]: https://github.com/salesagility/SuiteCRM/compare/v7.8.0-rc...develop -[76]: https://github.com/salesagility/SuiteCRM/archive/v7.8.0-rc.zip -[77]: https://github.com/salesagility/SuiteCRM/archive/v7.8.0-rc.tar.gz -[78]: https://github.com/salesagility/SuiteCRM/tree/v7.8.0-beta.2 -[79]: https://github.com/salesagility/SuiteCRM/commit/711cda1b5851b113c8885a9d67297bd66305ec39 -[80]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.0-beta.2 -[81]: https://github.com/salesagility/SuiteCRM/compare/v7.8.0-beta.2...develop -[82]: https://github.com/salesagility/SuiteCRM/archive/v7.8.0-beta.2.zip -[83]: https://github.com/salesagility/SuiteCRM/archive/v7.8.0-beta.2.tar.gz -[84]: https://github.com/salesagility/SuiteCRM/tree/v7.7.9 -[85]: https://github.com/salesagility/SuiteCRM/commit/b64d0fd5df3e11c59387e7e3c0ea7c114a0a2361 -[86]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.7.9 -[87]: https://github.com/salesagility/SuiteCRM/compare/v7.7.9...master -[88]: https://github.com/salesagility/SuiteCRM/archive/v7.7.9.zip -[89]: https://github.com/salesagility/SuiteCRM/archive/v7.7.9.tar.gz -[90]: https://suitecrm.com/wiki/index.php?title=Release_notes_7.7.9 -[91]: https://github.com/gunnicom -[92]: https://github.com/sk1p -[93]: https://github.com/salesagility/SuiteCRM/issues/2831 -[94]: https://github.com/salesagility/SuiteCRM/tree/v7.8.0-beta -[95]: https://github.com/salesagility/SuiteCRM/commit/02047a72628ed38e0a768d5fbec949f898351a05 -[96]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.0-beta -[97]: https://github.com/salesagility/SuiteCRM/compare/v7.8.0-beta...develop -[98]: https://github.com/salesagility/SuiteCRM/archive/v7.8.0-beta.zip -[99]: https://github.com/salesagility/SuiteCRM/archive/v7.8.0-beta.tar.gz -[100]: https://github.com/salesagility/SuiteCRM/releases?after=7.9.6 -[101]: https://github.com/salesagility/SuiteCRM/releases?after=v7.8.0-beta -[102]: https://github.com/site/terms -[103]: https://github.com/site/privacy -[104]: https://github.com/security -[105]: https://status.github.com/ -[106]: https://help.github.com -[107]: https://github.com "GitHub" -[108]: https://github.com/contact -[109]: https://developer.github.com -[110]: https://training.github.com -[111]: https://shop.github.com -[112]: https://github.com/blog -[113]: https://github.com/about -[114]: - - diff --git a/_source/releases4.md b/_source/releases4.md deleted file mode 100644 index c97f3ea6b..000000000 --- a/_source/releases4.md +++ /dev/null @@ -1,396 +0,0 @@ - - -[Source](https://github.com/salesagility/SuiteCRM/releases?after=v7.8.0-beta "Permalink to Releases · salesagility/SuiteCRM · GitHub") - -# Releases · salesagility/SuiteCRM · GitHub - -[Skip to content][1] - -[ ][2] - -* [ Features ][3] -* [ Business ][4] -* [ Explore ][5] -* [ Marketplace ][6] -* [ Pricing ][7] - -[This repository][8] - -[Sign in][9] or [Sign up][10] - -* [ Watch ][11] [ 164 ][12] -* [ Star ][11] [ 819 ][13] -* [ Fork ][11] [ 686 ][14] - -# [salesagility][15]/[**SuiteCRM][16]** - -[ Code ][16] [ Issues 609 ][17] [ Pull requests 285 ][18] [ Wiki ][19] [ Insights ][20] - -[Releases][8] [Tags][21] - -* [ v7.7.8 ][22] -* [ `7895179` ][23] - -# [7.7.8][24] - -![@samus-aran][25] [samus-aran][26] released this Nov 16, 2016 · [ 2958 commits][27] to master since this release - -## Assets - -* [ **Source code** (zip) ][28] -* [ **Source code** (tar.gz) ][29] - -**SuiteCRM 7.7.8 is now Available to Download** - -SuiteCRM 7.7.8 is a Bug Fix release - -Please see the [Release Notes][30] on list of Bug fixes noted on Github and [SuiteCRM Forums][31]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][32] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -* [ v7.6.10 ][33] -* [ `d18587a` ][34] - -# [7.6.10][35] - -![@samus-aran][25] [samus-aran][26] released this Nov 16, 2016 - -## Assets - -* [ **Source code** (zip) ][36] -* [ **Source code** (tar.gz) ][37] - -**SuiteCRM 7.6.10 is now Available to Download** - -This release addresses the bug for search using MultiSelect fields - -For more detail and to see all issues addressed in this release view the [Release Notes][38] - -Download here from the SuiteCRM GitHub Repository or [visit the official website][32] to find the appropriate upgrade. - -* [ v7.7.7 ][39] -* [ `cdabd01` ][40] - -# [7.7.7][41] - -![@samus-aran][25] [samus-aran][26] released this Nov 7, 2016 · [ 2996 commits][42] to master since this release - -## Assets - -* [ **Source code** (zip) ][43] -* [ **Source code** (tar.gz) ][44] - -**SuiteCRM 7.7.7 is now Available to Download** - -This release addresses Important Security Issues and addresses many other Issues - -Users of ALL previous releases are advised to Upgrade to 7.7.7 as soon as possible - -For more detail and to see all issues addressed in this release view the [Release Notes][45] - -Download here from the SuiteCRM GitHub Repository or [visit the official website][32] to find the appropriate upgrade. - -Special thanks for [Egidio Romano][46] for notifying us of these security issues. - -* [ v7.6.9 ][47] -* [ `e26387d` ][48] - -# [7.6.9][49] - -![@samus-aran][25] [samus-aran][26] released this Nov 7, 2016 - -## Assets - -* [ **Source code** (zip) ][50] -* [ **Source code** (tar.gz) ][51] - -**SuiteCRM 7.6.9 is now Available to Download** - -This release addresses Important Security Issues and other core functionality - -Users of ALL previous releases are advised to Upgrade to 7.6.9 as soon as possible - -For more detail and to see all issues addressed in this release view the [Release Notes][52] - -Download here from the SuiteCRM GitHub Repository or [visit the official website][32] to find the appropriate upgrade. - -Special thanks for [Egidio Romano][46] for notifying us of these security issues. - -* [ v7.7.6 ][53] -* [ `40f1488` ][54] - -# [7.7.6][55] - -![@mattlorimer][56] [mattlorimer][57] released this Oct 19, 2016 · [ 3066 commits][58] to master since this release - -## Assets - -* [ **Source code** (zip) ][59] -* [ **Source code** (tar.gz) ][60] - -**SuiteCRM 7.7.6 is now Available to Download** - -This release addresses Important Security Issues and addresses many other Issues - -Users of ALL previous releases are advised to Upgrade to 7.7.6 as soon as possible - -For more detail and to see all issues addressed in this release view the [Release Notes][61] - -Download here from the SuiteCRM GitHub Repository or [visit the official website][32] to find the appropriate upgrade. - -Special thanks for [Egidio Romano][46] for notifying us of these security issues. - -* [ v7.6.8 ][62] -* [ `7c22bc3` ][63] - -# [7.6.8][64] - -![@mattlorimer][56] [mattlorimer][57] released this Oct 19, 2016 - -## Assets - -* [ **Source code** (zip) ][65] -* [ **Source code** (tar.gz) ][66] - -**SuiteCRM 7.6.8 is now Available to Download** - -This release addresses Important Security Issues and addresses Report Issues - -Users of ALL previous releases are advised to Upgrade to 7.6.8 as soon as possible - -For more detail and to see all issues addressed in this release view the [Release Notes][67] - -Download here from the SuiteCRM GitHub Repository or [visit the official website][32] to find the appropriate upgrade. - -Special thanks for [Egidio Romano][46] for notifying us of these security issues. - -* [ v7.7.5 ][68] -* [ `b96b7c7` ][69] - -# [7.7.5][70] - -![@samus-aran][25] [samus-aran][26] released this Sep 28, 2016 · [ 3256 commits][71] to master since this release - -## Assets - -* [ **Source code** (zip) ][72] -* [ **Source code** (tar.gz) ][73] - -**SuiteCRM 7.7.5 is now Available to Download** - -* Updates a Security vulnerability with Serialized Input, to prevent possible object,file, beans and SQL injection attacks -* Bug fixes and UI styling for a variety of areas include, Reports, Calendar, Responsiveness and more. - -Please see the [Release Notes][74] on list of Bug fixes noted on Github and [SuiteCRM Forums][31]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][32] to find the appropriate upgrade. - -Special thanks for [Egidio Romano][46] for notifying us of this security update. - -Thank you to all community members who logged bugs and contributed to this release. - -* [ v7.6.7 ][75] -* [ `419a9ef` ][76] - -# [7.6.7][77] - -![@samus-aran][25] [samus-aran][26] released this Sep 28, 2016 - -## Assets - -* [ **Source code** (zip) ][78] -* [ **Source code** (tar.gz) ][79] - -**SuiteCRM 7.6.7 is now Available to Download** - -Includes SugarCRM 6.5.24 - [more information here][80] -Updates a Security vulnerability with Serialized Input, to prevent possible object,file, beans and SQL injection attacks - -Users of ALL previous releases are advised to Upgrade to 7.6.7 as soon as possible - -For more detail and to see all issues addressed in this release view the [Release Notes][81] - -Download here from the SuiteCRM GitHub Repository or [visit the official website][32] to find the appropriate upgrade. - -Special thanks for [Egidio Romano][46] and [adminibt][82] for notifying us of this security update. - -* [ v7.7.4 ][83] -* [ `932b871` ][84] - -# [7.7.4][85] - -![@samus-aran][25] [samus-aran][26] released this Aug 31, 2016 · [ 3361 commits][86] to master since this release - -## Assets - -* [ **Source code** (zip) ][87] -* [ **Source code** (tar.gz) ][88] - -**SuiteCRM 7.7.4 is now Available to Download** - -SuiteCRM 7.7.4 includes bug fixes for dropdown editor (browser specific), dashlets, calendar, studio layout updates and improve styling on top bar for non module filter settings. - -Please see the [Release Notes][89] on list of Bug fixes noted on Github and [SuiteCRM Forums][31]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][32] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -* [ v7.7.3 ][90] -* [ `ba95cd5` ][91] - -# [7.7.3][92] - -![@samus-aran][25] [samus-aran][26] released this Aug 26, 2016 · [ 3411 commits][93] to master since this release - -## Assets - -* [ **Source code** (zip) ][94] -* [ **Source code** (tar.gz) ][95] - -**SuiteCRM 7.7.3 is now Available to Download** - -SuiteCRM 7.7.3 includes a fix due to a regression issue with basic search, this release also includes PHP 5.3 for Spots modules, fix the ability to drag Dashlets to multi column Dashboards and have collapsible subpanels system setting. - -Please see the [Release Notes][96] on list of Bug fixes noted on Github and [SuiteCRM Forums][31]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][32] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -[Previous][97][Next][98] - -* © 2018 GitHub, Inc. -* [Terms][99] -* [Privacy][100] -* [Security][101] -* [Status][102] -* [Help][103] -[ ][104] - -* [Contact GitHub][105] -* [API][106] -* [Training][107] -* [Shop][108] -* [Blog][109] -* [About][110] - -You can't perform that action at this time. - -You signed in with another tab or window. [Reload][111] to refresh your session. You signed out in another tab or window. [Reload][111] to refresh your session. - -[1]: https://github.com#start-of-content -[2]: https://github.com/ -[3]: https://github.com/features -[4]: https://github.com/business -[5]: https://github.com/explore -[6]: https://github.com/marketplace -[7]: https://github.com/pricing -[8]: https://github.com/salesagility/SuiteCRM/releases -[9]: /login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases%3Fafter%3Dv7.8.0-beta -[10]: /join?source=header-repo -[11]: /login?return_to=%2Fsalesagility%2FSuiteCRM -[12]: https://github.com/salesagility/SuiteCRM/watchers -[13]: https://github.com/salesagility/SuiteCRM/stargazers -[14]: https://github.com/salesagility/SuiteCRM/network -[15]: https://github.com/salesagility -[16]: https://github.com/salesagility/SuiteCRM -[17]: https://github.com/salesagility/SuiteCRM/issues -[18]: https://github.com/salesagility/SuiteCRM/pulls -[19]: https://github.com/salesagility/SuiteCRM/wiki -[20]: https://github.com/salesagility/SuiteCRM/pulse -[21]: https://github.com/salesagility/SuiteCRM/tags -[22]: https://github.com/salesagility/SuiteCRM/tree/v7.7.8 -[23]: https://github.com/salesagility/SuiteCRM/commit/7895179a585518462ef9191e93657beb12fd869a -[24]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.7.8 -[25]: https://avatars1.githubusercontent.com/u/4041275?s=40&v=4 -[26]: https://github.com/samus-aran -[27]: https://github.com/salesagility/SuiteCRM/compare/v7.7.8...master -[28]: https://github.com/salesagility/SuiteCRM/archive/v7.7.8.zip -[29]: https://github.com/salesagility/SuiteCRM/archive/v7.7.8.tar.gz -[30]: https://suitecrm.com/wiki/index.php/Release_notes_7.7.8 -[31]: https://suitecrm.com/forum/index -[32]: https://suitecrm.com/download -[33]: https://github.com/salesagility/SuiteCRM/tree/v7.6.10 -[34]: https://github.com/salesagility/SuiteCRM/commit/d18587a0d90baa95571954c488b00cd07b50d324 -[35]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.6.10 -[36]: https://github.com/salesagility/SuiteCRM/archive/v7.6.10.zip -[37]: https://github.com/salesagility/SuiteCRM/archive/v7.6.10.tar.gz -[38]: https://suitecrm.com/wiki/index.php?title=Release_notes_7.6.10 -[39]: https://github.com/salesagility/SuiteCRM/tree/v7.7.7 -[40]: https://github.com/salesagility/SuiteCRM/commit/cdabd015b3728ec8a7a5483f6294b9de9d7a769d -[41]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.7.7 -[42]: https://github.com/salesagility/SuiteCRM/compare/v7.7.7...master -[43]: https://github.com/salesagility/SuiteCRM/archive/v7.7.7.zip -[44]: https://github.com/salesagility/SuiteCRM/archive/v7.7.7.tar.gz -[45]: https://suitecrm.com/wiki/index.php?title=Release_notes_7.7.7 -[46]: http://karmainsecurity.com -[47]: https://github.com/salesagility/SuiteCRM/tree/v7.6.9 -[48]: https://github.com/salesagility/SuiteCRM/commit/e26387d054527ed407ab6de0a1b68e238a0d0447 -[49]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.6.9 -[50]: https://github.com/salesagility/SuiteCRM/archive/v7.6.9.zip -[51]: https://github.com/salesagility/SuiteCRM/archive/v7.6.9.tar.gz -[52]: https://suitecrm.com/wiki/index.php?title=Release_notes_7.6.9 -[53]: https://github.com/salesagility/SuiteCRM/tree/v7.7.6 -[54]: https://github.com/salesagility/SuiteCRM/commit/40f148803d60246dff9cf88e2dfe100d76d2fa05 -[55]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.7.6 -[56]: https://avatars1.githubusercontent.com/u/6449723?s=40&v=4 -[57]: https://github.com/mattlorimer -[58]: https://github.com/salesagility/SuiteCRM/compare/v7.7.6...master -[59]: https://github.com/salesagility/SuiteCRM/archive/v7.7.6.zip -[60]: https://github.com/salesagility/SuiteCRM/archive/v7.7.6.tar.gz -[61]: https://suitecrm.com/wiki/index.php?title=Release_notes_7.7.6 -[62]: https://github.com/salesagility/SuiteCRM/tree/v7.6.8 -[63]: https://github.com/salesagility/SuiteCRM/commit/7c22bc3eeebd425f4359101f9fb465c33d8569a5 -[64]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.6.8 -[65]: https://github.com/salesagility/SuiteCRM/archive/v7.6.8.zip -[66]: https://github.com/salesagility/SuiteCRM/archive/v7.6.8.tar.gz -[67]: https://suitecrm.com/wiki/index.php?title=Release_notes_7.6.8 -[68]: https://github.com/salesagility/SuiteCRM/tree/v7.7.5 -[69]: https://github.com/salesagility/SuiteCRM/commit/b96b7c74c7645a28ce86f33dc4ced647f4bbe705 -[70]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.7.5 -[71]: https://github.com/salesagility/SuiteCRM/compare/v7.7.5...master -[72]: https://github.com/salesagility/SuiteCRM/archive/v7.7.5.zip -[73]: https://github.com/salesagility/SuiteCRM/archive/v7.7.5.tar.gz -[74]: https://suitecrm.com/wiki/index.php/Release_notes_7.7.5 -[75]: https://github.com/salesagility/SuiteCRM/tree/v7.6.7 -[76]: https://github.com/salesagility/SuiteCRM/commit/419a9ef2a88891303ab87aa5c7ad818cc9fed6b6 -[77]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.6.7 -[78]: https://github.com/salesagility/SuiteCRM/archive/v7.6.7.zip -[79]: https://github.com/salesagility/SuiteCRM/archive/v7.6.7.tar.gz -[80]: http://support.sugarcrm.com/Documentation/Sugar_Versions/6.5/CE/Sugar_Release_Notes_6.5.24/ -[81]: https://suitecrm.com/wiki/index.php?title=Release_notes_7.6.7 -[82]: https://github.com/salesagility/SuiteCRM/issues/1843 -[83]: https://github.com/salesagility/SuiteCRM/tree/v7.7.4 -[84]: https://github.com/salesagility/SuiteCRM/commit/932b87108edc154dd3c9c86b57ceaa24acd40835 -[85]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.7.4 -[86]: https://github.com/salesagility/SuiteCRM/compare/v7.7.4...master -[87]: https://github.com/salesagility/SuiteCRM/archive/v7.7.4.zip -[88]: https://github.com/salesagility/SuiteCRM/archive/v7.7.4.tar.gz -[89]: https://suitecrm.com/wiki/index.php/Release_notes_7.7.4 -[90]: https://github.com/salesagility/SuiteCRM/tree/v7.7.3 -[91]: https://github.com/salesagility/SuiteCRM/commit/ba95cd5e21c57317fb5be278091c013dfb5a9eb7 -[92]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.7.3 -[93]: https://github.com/salesagility/SuiteCRM/compare/v7.7.3...master -[94]: https://github.com/salesagility/SuiteCRM/archive/v7.7.3.zip -[95]: https://github.com/salesagility/SuiteCRM/archive/v7.7.3.tar.gz -[96]: https://suitecrm.com/wiki/index.php/Release_notes_7.7.3 -[97]: https://github.com/salesagility/SuiteCRM/releases?after=v7.8.4 -[98]: https://github.com/salesagility/SuiteCRM/releases?after=v7.7.3 -[99]: https://github.com/site/terms -[100]: https://github.com/site/privacy -[101]: https://github.com/security -[102]: https://status.github.com/ -[103]: https://help.github.com -[104]: https://github.com "GitHub" -[105]: https://github.com/contact -[106]: https://developer.github.com -[107]: https://training.github.com -[108]: https://shop.github.com -[109]: https://github.com/blog -[110]: https://github.com/about -[111]: - - diff --git a/_source/releases5.md b/_source/releases5.md deleted file mode 100644 index 3b82a022e..000000000 --- a/_source/releases5.md +++ /dev/null @@ -1,426 +0,0 @@ - - -[Source](https://github.com/salesagility/SuiteCRM/releases?after=v7.7.3 "Permalink to Releases · salesagility/SuiteCRM · GitHub") - -# Releases · salesagility/SuiteCRM · GitHub - -[Skip to content][1] - -[ ][2] - -* [ Features ][3] -* [ Business ][4] -* [ Explore ][5] -* [ Marketplace ][6] -* [ Pricing ][7] - -[This repository][8] - -[Sign in][9] or [Sign up][10] - -* [ Watch ][11] [ 164 ][12] -* [ Star ][11] [ 819 ][13] -* [ Fork ][11] [ 686 ][14] - -# [salesagility][15]/[**SuiteCRM][16]** - -[ Code ][16] [ Issues 609 ][17] [ Pull requests 285 ][18] [ Wiki ][19] [ Insights ][20] - -[Releases][8] [Tags][21] - -* [ v7.7.2 ][22] -* [ `9b3cc99` ][23] - -# [7.7.2][24] - -![@samus-aran][25] [samus-aran][26] released this Aug 23, 2016 · [ 3446 commits][27] to master since this release - -## Assets - -* [ **Source code** (zip) ][28] -* [ **Source code** (tar.gz) ][29] - -**SuiteCRM 7.7.2 is now Available to Download** - -SuiteCRM 7.7.2 features bug fixes for calendar, php7, MSSQL upgrades and improves Theme SuiteP UI and functionality - -Please see the [Release Notes][30] on list of Bug fixes noted on Github and [SuiteCRM Forums][31]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][32] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -* [ v7.7.1 ][33] -* [ `8e8f826` ][34] - -# [7.7.1][35] - -![@samus-aran][25] [samus-aran][26] released this Aug 11, 2016 · [ 3575 commits][36] to master since this release - -## Assets - -* [ **Source code** (zip) ][37] -* [ **Source code** (tar.gz) ][38] - -**SuiteCRM 7.7.1 is now Available to Download** - -SuiteCRM 7.7.1 features bug fixes, improves Theme SuiteP UI and functionality - -Please see the [Release Notes][39] on list of Bug fixes noted on Github and [SuiteCRM Forums][31]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][32] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -* [ v7.7 ][40] -* [ `e40feec` ][41] - -# [7.7][42] - -![@samus-aran][25] [samus-aran][26] released this Aug 2, 2016 · [ 3637 commits][43] to master since this release - -## Assets - -* [ **Source code** (zip) ][44] -* [ **Source code** (tar.gz) ][45] - -**SuiteCRM 7.7 is now Available to Download** - -**SuiteP Theme** \- We want SuiteCRM 7.7 to be something special this Summer. Packed with new and improved features and an amazing new UI, it will transform the way you view SuiteCRM. -**Analytic Reporting Tool - "SuiteSpots"** \- Using Drag and Drop functionality you can create in depth Pivot Tables and charts using your customer data. -**Module Group Selection upon Installation Configurations** \- When installing you can choose which groups of modules you wish to include as default. This will give users the choice of how what they feel they need from the word go. -**Updated** Silent Installer -**New Calendar** library -**New Search filter** for Event Delegates subpanel -**Improved** Project and Project Templates functionality - -== Security == -Includes **SugarCRM 6.5.24** \- more information here - () - -Special thanks for [adminibt][46] for notifying us of this security update. - -For more detail and to see all issues addressed in this release view the [Release Notes][47] - -Download here from the SuiteCRM GitHub Repository or [visit the official website][32] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -Pre-release - -* [ v7.7-rc2 ][48] -* [ `864eb31` ][49] - -# [7.7 Release Candidate 2][50] - -![@samus-aran][25] [samus-aran][26] released this Jul 26, 2016 · [ 4375 commits][51] to develop since this release - -## Assets - -* [ **Source code** (zip) ][52] -* [ **Source code** (tar.gz) ][53] - -**This is a release candidate release and should not be used in a production environment.** - -Try 7.7 Release Candidate 2 to preview the new features coming in SuiteCRM 7.7. - -The focus of SuiteCRM 7.7 Release Candidate 2 is to introduce our new theme SuiteP (SuitePea). - -* Further adding to the SuiteP theme -* Improvements in Project Templates and Projects functionality -* Introducing Business Hours Module -* Search Filter by Events Delegates -* Bug fixes for Email Assignment notifications, Pipeline By Sales Stage Dashlet, and more - -[Click here][54] to get the full details of this release and to get the upgrade package from 7.5.x, 7.6.x, 7.7beta1, 7.7beta2 and 7.7.RC - -Pre-release - -* [ v7.7-rc ][55] -* [ `8706c49` ][56] - -# [7.7 Release Candidate][57] - -![@samus-aran][25] [samus-aran][26] released this Jul 18, 2016 · [ 4535 commits][58] to develop since this release - -## Assets - -* [ **Source code** (zip) ][59] -* [ **Source code** (tar.gz) ][60] - -**This is a release candidate release and should not be used in a production environment.** - -Try 7.7 Release Candidate to preview the new features coming in SuiteCRM 7.7. - -The focus of SuiteCRM 7.7 Release Candidate is to introduce our new theme SuiteP (SuitePea). - -[Click here][54] to get the full details of this release and to get the upgrade package from 7.5.x, 7.6.x, 7.7beta1 and 7.7beta2 - -* [ v7.6.6 ][61] -* [ `a654519` ][62] - -# [7.6.6][63] - -![@samus-aran][25] [samus-aran][26] released this Jul 18, 2016 · [ 4135 commits][64] to master since this release - -## Assets - -* [ **Source code** (zip) ][65] -* [ **Source code** (tar.gz) ][66] - -**SuiteCRM 7.6.6 is now Available to Download** - -This release resolves Multiple XSS Vulnerabilities in Yahoo YUI component & YUI IO Utility - -** Removes the use of uploader.swf file (and references) within self-hosted YUI library that can be vulnerable to XSS attacks - -Users of ALL previous releases are advised to Upgrade to 7.5.5 or 7.6.6 as soon as possible - -For more detail and to see all issues addressed in this release view the [Release Notes][67] - -Download here from the SuiteCRM GitHub Repository or [visit the official website][32] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. -Special thanks to [chadbennett][68] for alerting and helping us resolve this vulnerability. - -* [ v7.5.5 ][69] -* [ `f2e0e7f` ][70] - -# [7.5.5][71] - -![@samus-aran][25] [samus-aran][26] released this Jul 20, 2016 - -## Assets - -* [ **Source code** (zip) ][72] -* [ **Source code** (tar.gz) ][73] - -**SuiteCRM 7.5.5 is now Available to Download** - -This release resolves Multiple XSS Vulnerabilities in Yahoo YUI component & YUI IO Utility - -** Removes the use of uploader.swf file (and references) within self-hosted YUI library that can be vulnerable to XSS attacks - -Users of ALL previous releases are advised to Upgrade to 7.5.5 or 7.6.6 as soon as possible - -Download here from the SuiteCRM GitHub Repository or [visit the official website][32] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. -Special thanks to [chadbennett][68] for alerting and helping us resolve this vulnerability. - -* [ v7.6.5 ][74] -* [ `5b259a5` ][75] - -# [7.6.5][76] - -![@samus-aran][25] [samus-aran][26] released this Jul 4, 2016 · [ 4143 commits][77] to master since this release - -## Assets - -* [ **Source code** (zip) ][78] -* [ **Source code** (tar.gz) ][79] - -**SuiteCRM 7.6.5 is now Available to Download** - -This release resolves a Security vulnerability with Serialized Input, to prevent possible object injection attacks - -Users of ALL previous releases are advised to Upgrade to 7.5.4 or 7.6.5 as soon as possible - -For more detail and to see all issues addressed in this release view the [Release Notes][80] - -Download here from the SuiteCRM GitHub Repository or [visit the official website][32] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. -Special thanks to [Egidio Romano][81] for alerting and helping us resolve this vulnerability. - -* [ v7.5.4 ][82] -* [ `f128b63` ][83] - -Verified - -This tag was signed with a **verified signature**. - -[ ![@mattlorimer][84] ][85] [mattlorimer][85] Matt Lorimer - -GPG key ID: D7B45FDF7506BF33 [Learn about signing commits][86] - -# [7.5.4][87] - -![@mattlorimer][88] [mattlorimer][85] released this Jul 4, 2016 - -## Assets - -* [ **Source code** (zip) ][89] -* [ **Source code** (tar.gz) ][90] - -SuiteCRM 7.5.4 is now Available to Download - -This release resolves a Security vulnerability with Serialized Input, to prevent possible object injection attacks - -* Removes the option to allow serialized user input to the SuiteCRM Rest Client. -* Changed serialized User input to use JSON - -Users of ALL previous releases are advised to Upgrade to 7.5.4 or 7.6.5 as soon as possible - -Download here from the SuiteCRM GitHub Repository or visit the official website to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. -Special thanks to [Egidio Romano][81] for alerting and helping us resolve this vulnerability. - -Pre-release - -* [ v7.7-beta2 ][91] -* [ `7c1bda8` ][92] - -# [7.7 Beta2][93] - -![@samus-aran][25] [samus-aran][26] released this Jun 27, 2016 · [ 4737 commits][94] to develop since this release - -## Assets - -* [ **Source code** (zip) ][95] -* [ **Source code** (tar.gz) ][96] - -**This is a beta release and should not be used in a production environment.** - -Try 7.7 Beta 2 to preview the new features coming in SuiteCRM 7.7. - -The focus of SuiteCRM 7.7 beta 2 is to introduce our new theme SuiteP (SuitePea). - -Fixes for Campaigns, Sending Emails and other bugs. - -[Click here][54] to get the full details of this release and to get the upgrade package from 7.4.x, 7.5.x, 7.6.x and 7.7beta1 - -[Previous][97][Next][98] - -* © 2018 GitHub, Inc. -* [Terms][99] -* [Privacy][100] -* [Security][101] -* [Status][102] -* [Help][103] -[ ][104] - -* [Contact GitHub][105] -* [API][106] -* [Training][107] -* [Shop][108] -* [Blog][109] -* [About][110] - -You can't perform that action at this time. - -You signed in with another tab or window. [Reload][111] to refresh your session. You signed out in another tab or window. [Reload][111] to refresh your session. - -[1]: https://github.com#start-of-content -[2]: https://github.com/ -[3]: https://github.com/features -[4]: https://github.com/business -[5]: https://github.com/explore -[6]: https://github.com/marketplace -[7]: https://github.com/pricing -[8]: https://github.com/salesagility/SuiteCRM/releases -[9]: /login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases%3Fafter%3Dv7.7.3 -[10]: /join?source=header-repo -[11]: /login?return_to=%2Fsalesagility%2FSuiteCRM -[12]: https://github.com/salesagility/SuiteCRM/watchers -[13]: https://github.com/salesagility/SuiteCRM/stargazers -[14]: https://github.com/salesagility/SuiteCRM/network -[15]: https://github.com/salesagility -[16]: https://github.com/salesagility/SuiteCRM -[17]: https://github.com/salesagility/SuiteCRM/issues -[18]: https://github.com/salesagility/SuiteCRM/pulls -[19]: https://github.com/salesagility/SuiteCRM/wiki -[20]: https://github.com/salesagility/SuiteCRM/pulse -[21]: https://github.com/salesagility/SuiteCRM/tags -[22]: https://github.com/salesagility/SuiteCRM/tree/v7.7.2 -[23]: https://github.com/salesagility/SuiteCRM/commit/9b3cc99ce45c5b1e43f76571e6dc255e671db08a -[24]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.7.2 -[25]: https://avatars1.githubusercontent.com/u/4041275?s=40&v=4 -[26]: https://github.com/samus-aran -[27]: https://github.com/salesagility/SuiteCRM/compare/v7.7.2...master -[28]: https://github.com/salesagility/SuiteCRM/archive/v7.7.2.zip -[29]: https://github.com/salesagility/SuiteCRM/archive/v7.7.2.tar.gz -[30]: https://suitecrm.com/wiki/index.php/Release_notes_7.7.2 -[31]: https://suitecrm.com/forum/index -[32]: https://suitecrm.com/download -[33]: https://github.com/salesagility/SuiteCRM/tree/v7.7.1 -[34]: https://github.com/salesagility/SuiteCRM/commit/8e8f82695c15cf55df3fe606002ecde1718bef7f -[35]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.7.1 -[36]: https://github.com/salesagility/SuiteCRM/compare/v7.7.1...master -[37]: https://github.com/salesagility/SuiteCRM/archive/v7.7.1.zip -[38]: https://github.com/salesagility/SuiteCRM/archive/v7.7.1.tar.gz -[39]: https://suitecrm.com/wiki/index.php/Release_notes_7.7.1 -[40]: https://github.com/salesagility/SuiteCRM/tree/v7.7 -[41]: https://github.com/salesagility/SuiteCRM/commit/e40feec9a51e5cb0c40a271eabfda466947de897 -[42]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.7 -[43]: https://github.com/salesagility/SuiteCRM/compare/v7.7...master -[44]: https://github.com/salesagility/SuiteCRM/archive/v7.7.zip -[45]: https://github.com/salesagility/SuiteCRM/archive/v7.7.tar.gz -[46]: https://github.com/salesagility/SuiteCRM/issues/1843 -[47]: https://suitecrm.com/wiki/index.php?title=Release_notes_7.7 -[48]: https://github.com/salesagility/SuiteCRM/tree/v7.7-rc2 -[49]: https://github.com/salesagility/SuiteCRM/commit/864eb31d4175bf09dd9a14de1ec0bc4af16b525f -[50]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.7-rc2 -[51]: https://github.com/salesagility/SuiteCRM/compare/v7.7-rc2...develop -[52]: https://github.com/salesagility/SuiteCRM/archive/v7.7-rc2.zip -[53]: https://github.com/salesagility/SuiteCRM/archive/v7.7-rc2.tar.gz -[54]: https://suitecrm.com/download/download-pre-release -[55]: https://github.com/salesagility/SuiteCRM/tree/v7.7-rc -[56]: https://github.com/salesagility/SuiteCRM/commit/8706c4960882fecf43eb4883d80eb82b8713917c -[57]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.7-rc -[58]: https://github.com/salesagility/SuiteCRM/compare/v7.7-rc...develop -[59]: https://github.com/salesagility/SuiteCRM/archive/v7.7-rc.zip -[60]: https://github.com/salesagility/SuiteCRM/archive/v7.7-rc.tar.gz -[61]: https://github.com/salesagility/SuiteCRM/tree/v7.6.6 -[62]: https://github.com/salesagility/SuiteCRM/commit/a6545196033a6ef3f9ddbf6a2babbbb351072798 -[63]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.6.6 -[64]: https://github.com/salesagility/SuiteCRM/compare/v7.6.6...master -[65]: https://github.com/salesagility/SuiteCRM/archive/v7.6.6.zip -[66]: https://github.com/salesagility/SuiteCRM/archive/v7.6.6.tar.gz -[67]: https://suitecrm.com/wiki/index.php?title=Release_notes_7.6.6 -[68]: https://github.com/salesagility/SuiteCRM/issues/1724 -[69]: https://github.com/salesagility/SuiteCRM/tree/v7.5.5 -[70]: https://github.com/salesagility/SuiteCRM/commit/f2e0e7f49c4a2ed689dface44ff8457041a7200a -[71]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.5.5 -[72]: https://github.com/salesagility/SuiteCRM/archive/v7.5.5.zip -[73]: https://github.com/salesagility/SuiteCRM/archive/v7.5.5.tar.gz -[74]: https://github.com/salesagility/SuiteCRM/tree/v7.6.5 -[75]: https://github.com/salesagility/SuiteCRM/commit/5b259a52b832e8f46ba06a00e95783a6aa065295 -[76]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.6.5 -[77]: https://github.com/salesagility/SuiteCRM/compare/v7.6.5...master -[78]: https://github.com/salesagility/SuiteCRM/archive/v7.6.5.zip -[79]: https://github.com/salesagility/SuiteCRM/archive/v7.6.5.tar.gz -[80]: https://suitecrm.com/wiki/index.php?title=Release_notes_7.6.5 -[81]: http://karmainsecurity.com -[82]: https://github.com/salesagility/SuiteCRM/tree/v7.5.4 -[83]: https://github.com/salesagility/SuiteCRM/commit/f128b63e37e97c58f20f5a81d6f5a8b22511a43f -[84]: https://avatars2.githubusercontent.com/u/6449723?s=64&v=4 -[85]: https://github.com/mattlorimer -[86]: https://help.github.com/articles/signing-commits-with-gpg/ -[87]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.5.4 -[88]: https://avatars1.githubusercontent.com/u/6449723?s=40&v=4 -[89]: https://github.com/salesagility/SuiteCRM/archive/v7.5.4.zip -[90]: https://github.com/salesagility/SuiteCRM/archive/v7.5.4.tar.gz -[91]: https://github.com/salesagility/SuiteCRM/tree/v7.7-beta2 -[92]: https://github.com/salesagility/SuiteCRM/commit/7c1bda85a44757e681346d2f450dacea8ca54849 -[93]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.7-beta2 -[94]: https://github.com/salesagility/SuiteCRM/compare/v7.7-beta2...develop -[95]: https://github.com/salesagility/SuiteCRM/archive/v7.7-beta2.zip -[96]: https://github.com/salesagility/SuiteCRM/archive/v7.7-beta2.tar.gz -[97]: https://github.com/salesagility/SuiteCRM/releases?after=v7.8.0-beta -[98]: https://github.com/salesagility/SuiteCRM/releases?after=v7.7-beta2 -[99]: https://github.com/site/terms -[100]: https://github.com/site/privacy -[101]: https://github.com/security -[102]: https://status.github.com/ -[103]: https://help.github.com -[104]: https://github.com "GitHub" -[105]: https://github.com/contact -[106]: https://developer.github.com -[107]: https://training.github.com -[108]: https://shop.github.com -[109]: https://github.com/blog -[110]: https://github.com/about -[111]: - - diff --git a/_source/releases6.md b/_source/releases6.md deleted file mode 100644 index 1344ca479..000000000 --- a/_source/releases6.md +++ /dev/null @@ -1,429 +0,0 @@ - - -[Source](https://github.com/salesagility/SuiteCRM/releases?after=v7.7-beta2 "Permalink to Releases · salesagility/SuiteCRM · GitHub") - -# Releases · salesagility/SuiteCRM · GitHub - -[Skip to content][1] - -[ ][2] - -* [ Features ][3] -* [ Business ][4] -* [ Explore ][5] -* [ Marketplace ][6] -* [ Pricing ][7] - -[This repository][8] - -[Sign in][9] or [Sign up][10] - -* [ Watch ][11] [ 164 ][12] -* [ Star ][11] [ 819 ][13] -* [ Fork ][11] [ 686 ][14] - -# [salesagility][15]/[**SuiteCRM][16]** - -[ Code ][16] [ Issues 609 ][17] [ Pull requests 285 ][18] [ Wiki ][19] [ Insights ][20] - -[Releases][8] [Tags][21] - -Pre-release - -* [ v7.7-beta1 ][22] -* [ `6c2f119` ][23] - -# [7.7 Beta][24] - -![@samus-aran][25] [samus-aran][26] released this Jun 15, 2016 · [ 4815 commits][27] to develop since this release - -## Assets - -* [ **Source code** (zip) ][28] -* [ **Source code** (tar.gz) ][29] - -**This is a beta release and should not be used in a production environment.** - -Try 7.7 Beta 1 to preview the new features coming in SuiteCRM 7.7. - -The focus of SuiteCRM 7.7 is to introduce our new Analytical Reporting Tool - SuiteSpots, and provide more options upon installing SuiteCRM. - -The first Beta release includes enhancements to the following: - -**New Analytic Reporting Tool** \- **SuiteSpots** \- Using Drag and Drop functionality you can create in depth Pivot Tables and charts using your customer data. - -**New Module Group Selection upon installation Configurations** \- When installing you can choose which groups of modules you wish to include as default. This will give users the choice of what modules they need from the word go. - -Fixes for Campaigns, Calls/Meetings Reminders and other bugs - -[Click here][30] to get the full details of this release and to get the upgrade package from 7.4.x, 7.5.x, and 7.6.x - -* [ v7.6.4 ][31] -* [ `4c7587b` ][32] - -# [7.6.4][33] - -![@samus-aran][25] [samus-aran][26] released this May 30, 2016 · [ 4245 commits][34] to master since this release - -## Assets - -* [ **Source code** (zip) ][35] -* [ **Source code** (tar.gz) ][36] - -**SuiteCRM 7.6.4 is now Available to Download** - -SuiteCRM 7.6.4 features bug fixes, improves Campaign Wizard UI and improves Reporting functionality on MSSQL servers - -Add the budget fields into Campaign Header screen -Test emails send out immediately (rather than queued) -Improved UI for creating Email Marketing Records and Templates via the Wizard -Update the Campaign Wizard Summary's interface -And more below: - -Download here from the SuiteCRM GitHub Repository or [visit the official website][37] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -* [ v7.6.3 ][38] -* [ `084b51c` ][39] - -# [7.6.3][40] - -![@samus-aran][25] [samus-aran][26] released this May 17, 2016 · [ 4401 commits][41] to master since this release - -## Assets - -* [ **Source code** (zip) ][42] -* [ **Source code** (tar.gz) ][43] - -**SuiteCRM 7.6.3 is now Available to Download** - -This is a bug fix release for SuiteCRM 7.6.x and includes updated Campaign Wizard UI, resolving issues with running scheduled email campaigns and upgrading using MSSQL. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][37] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -* [ v7.6.2 ][44] -* [ `a833c2e` ][45] - -# [7.6.2][46] - -![@samus-aran][25] [samus-aran][26] released this May 10, 2016 · [ 4499 commits][47] to master since this release - -## Assets - -* [ **Source code** (zip) ][48] -* [ **Source code** (tar.gz) ][49] - -**SuiteCRM 7.6.2 is now Available to Download** - -This is a bug fix release for SuiteCRM 7.6.2 and includes updated Campaign Wizard UI. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][37] to find the appropriate upgrade. - -View [release notes][50] - -Thank you to all community members who logged bugs and contributed to this release. - -* [ v7.6.1 ][51] -* [ `58f496e` ][52] - -# [7.6.1][53] - -![@samus-aran][25] [samus-aran][26] released this May 2, 2016 · [ 4616 commits][54] to master since this release - -## Assets - -* [ **Source code** (zip) ][55] -* [ **Source code** (tar.gz) ][56] - -**SuiteCRM 7.6.1 is now Available to Download** - -This is a bug fix release for SuiteCRM 7.6 to resolve legacy customisations [code issue][57] when upgrading to 7.6. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][37] to find the appropriate upgrade. - -View [release notes][58] - -Thank you to all community members who logged bugs and contributed to this release. - -* [ v7.6 ][59] -* [ `c78e63d` ][60] - -# [7.6][61] - -![@samus-aran][25] [samus-aran][26] released this Apr 27, 2016 · [ 4633 commits][62] to master since this release - -## Assets - -* [ **Source code** (zip) ][63] -* [ **Source code** (tar.gz) ][64] - -**SuiteCRM 7.6 is now Officially Available to Download** - -SuiteCRM 7.6, the latest cutting edge release, focuses on enhancing the functionality of the native Campaign module as well as including the latest bug fixes. - -The release includes the latest enhancements to the following: - -**Campaign Wizard** \- A simplified Campaign Wizard that is easily understood. Includes an enhanced UI and progress bar. - -**Email Templates** \- The ability to add Tracker Links to Email Templates while creating the template so that they do not need to be created beforehand. - -**Web To Lead Form** \- Web-To-Lead Forms are now HTML 5 compliant for easier integration with modern Websites. - -**Target List** \- Create Target Lists of Contacts based on associated Accounts. This allows for contact lists to be segmented by Account properties without the need to use a report. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][37] to find the appropriate upgrade. - -Thank you to all community members who contributed, tested and helped with this release. - -Pre-release - -* [ v7.6-rc ][65] -* [ `c690a10` ][66] - -# [7.6 Release Candidate][67] - -![@samus-aran][25] [samus-aran][26] released this Apr 20, 2016 · [ 5348 commits][68] to develop since this release - -## Assets - -* [ **Source code** (zip) ][69] -* [ **Source code** (tar.gz) ][70] - -**This is a Release Candidate and should not be used in a production environment.** - -Try 7.6 Release Candidate to preview the new features coming in SuiteCRM 7.6. - -The focus of SuiteCRM 7.6 is to enhance the functionality of the native Campaign module. - -The Release Candidate includes the latest enhancements to the following: - -**Campaign Wizard** \- A simplified Campaign Wizard that is easily understood. Includes an enhanced UI and progress bar. - -**Email Templates** \- The ability to add Tracker Links to Email Templates while creating the template so that they do not need to be created beforehand. - -**Web To Lead Form** \- Web-To-Lead Forms are now HTML 5 compliant for easier integration with modern Websites. - -**Target List** \- Create Target Lists of Contacts based on associated Accounts. This allows for contact lists to be segmented by Account properties without the need to use a report. - -[Click here][30] to get the full details of this release and to get the upgrade packs - -Pre-release - -* [ v7.6-beta.2 ][71] -* [ `cdcf76c` ][72] - -# [7.6 Beta 2][73] - -![@mattlorimer][74] [mattlorimer][75] released this Apr 13, 2016 · [ 5403 commits][76] to develop since this release - -## Assets - -* [ **Source code** (zip) ][77] -* [ **Source code** (tar.gz) ][78] - -**This is a beta release and should not be used in a production environment.** - -Try 7.6 Beta 2 to preview the new features coming in SuiteCRM 7.6. - -The focus of SuiteCRM 7.6 is to enhance the functionality of the native Campaign module. - -This Beta release includes the latest enhancements to the following: - -**Campaign Wizard** \- A simplified Campaign Wizard that is easily understood. Includes an enhanced UI and progress bar. - -**Email Templates** \- The ability to add Tracker Links to Email Templates while creating the template so that they do not need to be created beforehand. - -**Web To Lead Form** \- Web-To-Lead Forms are now HTML 5 compliant for easier integration with modern Websites. - -**Target List** \- Create Target Lists of Contacts based on associated Accounts. This allows for contact lists to be segmented by Account properties without the need to use a report. - -[Click here][30] to get the full details of this release and to get the upgrade packs - -Pre-release - -* [ v7.6-beta-1 ][79] -* [ `2b7e73b` ][80] - -# [7.6 Beta][81] - -![@samus-aran][25] [samus-aran][26] released this Mar 30, 2016 · [ 5489 commits][82] to develop since this release - -## Assets - -* [ **Source code** (zip) ][83] -* [ **Source code** (tar.gz) ][84] - -**This is a beta release and should not be used in a production environment.** - -Try 7.6 Beta 1 to preview the new features coming in SuiteCRM 7.6. - -The focus of SuiteCRM 7.6 is to enhance the functionality of the native Campaign module. - -The first Beta release includes enhancements to the following: - -**Campaign Wizard** \- A simplified Campaign Wizard that is easily understood. Includes an enhanced UI and progress bar. - -**Email Templates** \- The ability to add Tracker Links to Email Templates while creating the template so that they do not need to be created beforehand. - -**Web To Lead Form** \- Web-To-Lead Forms are now HTML 5 compliant for easier integration with modern Websites. - -**Target List** \- Create Target Lists of Contacts based on associated Accounts. This allows for contact lists to be segmented by Account properties without the need to use a report. - -[Click here][30] to get the full details of this release and to get the upgrade package from 7.4.x and 7.5.x - -* [ v7.5.3 ][85] -* [ `26fbd73` ][86] - -# [7.5.3][87] - -![@mattlorimer][74] [mattlorimer][75] released this Mar 15, 2016 · [ 5058 commits][88] to master since this release - -## Assets - -* [ **Source code** (zip) ][89] -* [ **Source code** (tar.gz) ][90] - -**SuiteCRM 7.5.3 is now Officially Available to Download** - -This release resolves Security Issues and other various issues - -Its is recommended to update to 7.5.3 as soon as possible - -For more information view the release notes on the SuiteCRM Wiki [here][91]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][37] to find the appropriate upgrade. - -Thank you to all community members who contributed, tested and helped with this release. - -[Previous][92][Next][93] - -* © 2018 GitHub, Inc. -* [Terms][94] -* [Privacy][95] -* [Security][96] -* [Status][97] -* [Help][98] -[ ][99] - -* [Contact GitHub][100] -* [API][101] -* [Training][102] -* [Shop][103] -* [Blog][104] -* [About][105] - -You can't perform that action at this time. - -You signed in with another tab or window. [Reload][106] to refresh your session. You signed out in another tab or window. [Reload][106] to refresh your session. - -[1]: https://github.com#start-of-content -[2]: https://github.com/ -[3]: https://github.com/features -[4]: https://github.com/business -[5]: https://github.com/explore -[6]: https://github.com/marketplace -[7]: https://github.com/pricing -[8]: https://github.com/salesagility/SuiteCRM/releases -[9]: /login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases%3Fafter%3Dv7.7-beta2 -[10]: /join?source=header-repo -[11]: /login?return_to=%2Fsalesagility%2FSuiteCRM -[12]: https://github.com/salesagility/SuiteCRM/watchers -[13]: https://github.com/salesagility/SuiteCRM/stargazers -[14]: https://github.com/salesagility/SuiteCRM/network -[15]: https://github.com/salesagility -[16]: https://github.com/salesagility/SuiteCRM -[17]: https://github.com/salesagility/SuiteCRM/issues -[18]: https://github.com/salesagility/SuiteCRM/pulls -[19]: https://github.com/salesagility/SuiteCRM/wiki -[20]: https://github.com/salesagility/SuiteCRM/pulse -[21]: https://github.com/salesagility/SuiteCRM/tags -[22]: https://github.com/salesagility/SuiteCRM/tree/v7.7-beta1 -[23]: https://github.com/salesagility/SuiteCRM/commit/6c2f119627fd62eec03ad8144f7f44e181d34ef3 -[24]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.7-beta1 -[25]: https://avatars1.githubusercontent.com/u/4041275?s=40&v=4 -[26]: https://github.com/samus-aran -[27]: https://github.com/salesagility/SuiteCRM/compare/v7.7-beta1...develop -[28]: https://github.com/salesagility/SuiteCRM/archive/v7.7-beta1.zip -[29]: https://github.com/salesagility/SuiteCRM/archive/v7.7-beta1.tar.gz -[30]: https://suitecrm.com/download/download-pre-release -[31]: https://github.com/salesagility/SuiteCRM/tree/v7.6.4 -[32]: https://github.com/salesagility/SuiteCRM/commit/4c7587b97748092cda481896a94c18d52c119a5a -[33]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.6.4 -[34]: https://github.com/salesagility/SuiteCRM/compare/v7.6.4...master -[35]: https://github.com/salesagility/SuiteCRM/archive/v7.6.4.zip -[36]: https://github.com/salesagility/SuiteCRM/archive/v7.6.4.tar.gz -[37]: https://suitecrm.com/download -[38]: https://github.com/salesagility/SuiteCRM/tree/v7.6.3 -[39]: https://github.com/salesagility/SuiteCRM/commit/084b51c91dc5ef34dd3dfe63a262dc8901dfb7a4 -[40]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.6.3 -[41]: https://github.com/salesagility/SuiteCRM/compare/v7.6.3...master -[42]: https://github.com/salesagility/SuiteCRM/archive/v7.6.3.zip -[43]: https://github.com/salesagility/SuiteCRM/archive/v7.6.3.tar.gz -[44]: https://github.com/salesagility/SuiteCRM/tree/v7.6.2 -[45]: https://github.com/salesagility/SuiteCRM/commit/a833c2e504219682ccf1f2048584880ae1121318 -[46]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.6.2 -[47]: https://github.com/salesagility/SuiteCRM/compare/v7.6.2...master -[48]: https://github.com/salesagility/SuiteCRM/archive/v7.6.2.zip -[49]: https://github.com/salesagility/SuiteCRM/archive/v7.6.2.tar.gz -[50]: https://suitecrm.com/wiki/index.php/Release_notes_7.6.2#SuiteCRM_7.6.2 -[51]: https://github.com/salesagility/SuiteCRM/tree/v7.6.1 -[52]: https://github.com/salesagility/SuiteCRM/commit/58f496e71ba249896d5e57523d5092f09bbb8965 -[53]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.6.1 -[54]: https://github.com/salesagility/SuiteCRM/compare/v7.6.1...master -[55]: https://github.com/salesagility/SuiteCRM/archive/v7.6.1.zip -[56]: https://github.com/salesagility/SuiteCRM/archive/v7.6.1.tar.gz -[57]: https://github.com/salesagility/SuiteCRM/issues/1300 -[58]: https://suitecrm.com/wiki/index.php/Release_notes_7.6.1#SuiteCRM_7.6.1 -[59]: https://github.com/salesagility/SuiteCRM/tree/v7.6 -[60]: https://github.com/salesagility/SuiteCRM/commit/c78e63d748fc57c5d64dbae4c7f45b584d691024 -[61]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.6 -[62]: https://github.com/salesagility/SuiteCRM/compare/v7.6...master -[63]: https://github.com/salesagility/SuiteCRM/archive/v7.6.zip -[64]: https://github.com/salesagility/SuiteCRM/archive/v7.6.tar.gz -[65]: https://github.com/salesagility/SuiteCRM/tree/v7.6-rc -[66]: https://github.com/salesagility/SuiteCRM/commit/c690a1063e32de85f727be51235c20212556c79f -[67]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.6-rc -[68]: https://github.com/salesagility/SuiteCRM/compare/v7.6-rc...develop -[69]: https://github.com/salesagility/SuiteCRM/archive/v7.6-rc.zip -[70]: https://github.com/salesagility/SuiteCRM/archive/v7.6-rc.tar.gz -[71]: https://github.com/salesagility/SuiteCRM/tree/v7.6-beta.2 -[72]: https://github.com/salesagility/SuiteCRM/commit/cdcf76cb830d296e8de1739e9313a276b48cefd1 -[73]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.6-beta.2 -[74]: https://avatars1.githubusercontent.com/u/6449723?s=40&v=4 -[75]: https://github.com/mattlorimer -[76]: https://github.com/salesagility/SuiteCRM/compare/v7.6-beta.2...develop -[77]: https://github.com/salesagility/SuiteCRM/archive/v7.6-beta.2.zip -[78]: https://github.com/salesagility/SuiteCRM/archive/v7.6-beta.2.tar.gz -[79]: https://github.com/salesagility/SuiteCRM/tree/v7.6-beta-1 -[80]: https://github.com/salesagility/SuiteCRM/commit/2b7e73bea6c5e34f1ab042af4787066d8cfaaa3f -[81]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.6-beta-1 -[82]: https://github.com/salesagility/SuiteCRM/compare/v7.6-beta-1...develop -[83]: https://github.com/salesagility/SuiteCRM/archive/v7.6-beta-1.zip -[84]: https://github.com/salesagility/SuiteCRM/archive/v7.6-beta-1.tar.gz -[85]: https://github.com/salesagility/SuiteCRM/tree/v7.5.3 -[86]: https://github.com/salesagility/SuiteCRM/commit/26fbd737a47163bff07e1ff828fc488e7e5075bb -[87]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.5.3 -[88]: https://github.com/salesagility/SuiteCRM/compare/v7.5.3...master -[89]: https://github.com/salesagility/SuiteCRM/archive/v7.5.3.zip -[90]: https://github.com/salesagility/SuiteCRM/archive/v7.5.3.tar.gz -[91]: https://suitecrm.com/wiki/index.php/Release_notes_7.5.3 -[92]: https://github.com/salesagility/SuiteCRM/releases?after=v7.7.3 -[93]: https://github.com/salesagility/SuiteCRM/releases?after=v7.5.3 -[94]: https://github.com/site/terms -[95]: https://github.com/site/privacy -[96]: https://github.com/security -[97]: https://status.github.com/ -[98]: https://help.github.com -[99]: https://github.com "GitHub" -[100]: https://github.com/contact -[101]: https://developer.github.com -[102]: https://training.github.com -[103]: https://shop.github.com -[104]: https://github.com/blog -[105]: https://github.com/about -[106]: - - diff --git a/_source/releases7.md b/_source/releases7.md deleted file mode 100644 index c4321a59a..000000000 --- a/_source/releases7.md +++ /dev/null @@ -1,379 +0,0 @@ - - -[Source](https://github.com/salesagility/SuiteCRM/releases?after=v7.5.3 "Permalink to Releases · salesagility/SuiteCRM · GitHub") - -# Releases · salesagility/SuiteCRM · GitHub - -[Skip to content][1] - -[ ][2] - -* [ Features ][3] -* [ Business ][4] -* [ Explore ][5] -* [ Marketplace ][6] -* [ Pricing ][7] - -[This repository][8] - -[Sign in][9] or [Sign up][10] - -* [ Watch ][11] [ 164 ][12] -* [ Star ][11] [ 819 ][13] -* [ Fork ][11] [ 686 ][14] - -# [salesagility][15]/[**SuiteCRM][16]** - -[ Code ][16] [ Issues 609 ][17] [ Pull requests 285 ][18] [ Wiki ][19] [ Insights ][20] - -[Releases][8] [Tags][21] - -* [ v7.5.2 ][22] -* [ `b099183` ][23] - -# [7.5.2][24] - -![@mattlorimer][25] [mattlorimer][26] released this Mar 7, 2016 · [ 5101 commits][27] to master since this release - -## Assets - -* [ **Source code** (zip) ][28] -* [ **Source code** (tar.gz) ][29] - -**SuiteCRM 7.5.2 is now Officially Available to Download** - -This is a bug fix release for SuiteCRM 7.5 release. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][30] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -* [ v7.5.1 ][31] -* [ `a75ecc2` ][32] - -# [7.5.1][33] - -![@willrennie][34] [willrennie][35] released this Jan 26, 2016 · [ 5299 commits][36] to master since this release - -## Assets - -* [ **Source code** (zip) ][37] -* [ **Source code** (tar.gz) ][38] - -**SuiteCRM 7.5.1 is now Officially Available to Download** - -This is a bug fix release for SuiteCRM 7.5 release. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][30] to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to this release. - -* [ v7.5 ][39] -* [ `bc02d48` ][40] - -# [7.5][41] - -![@willrennie][34] [willrennie][35] released this Jan 18, 2016 · [ 7296 commits][42] to master since this release - -## Assets - -* [ **Source code** (zip) ][43] -* [ **Source code** (tar.gz) ][44] - -**SuiteCRM 7.5 is now Officially Available to Download** - -SuiteCRM 7.5, the latest cutting edge release, focuses on enhancing the Reports module. A full list of new functionality is detailed below: - -* Cleaner Reports Interface - Making the report writer and results view more user friendly and less cluttered. -* AND/OR Conditions - Improving your ability to refine results using a mixture of OR as well as AND logical operators. -* New Charting Engine - Present your report results using eye catching configurable charts to clearly communicate your intended metrics. -* Grouped Reports View - Grouped Reports view, including dashlets, which can be expanded/collapsed and grouped on multiple fields. -* Custom file removal - Removing a large volume of files from the custom directory ensuring only required custom files remain. -* Formatting Options - Display dates and other key fields in a format effective for your audience. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][30] to find the appropriate upgrade. - -Thank you to all community members who contributed, tested and helped with this release. - -Pre-release - -* [ v7.5-rc ][45] -* [ `6d6c676` ][46] - -# [7.5 Release Candidate][47] - -![@willrennie][34] [willrennie][35] released this Jan 11, 2016 · [ 6128 commits][48] to develop since this release - -## Assets - -* [ **Source code** (zip) ][49] -* [ **Source code** (tar.gz) ][50] - -**This is a beta release and should not be used in a production environment.** - -Try 7.5 Release Candidate to preview the new features coming in SuiteCRM 7.5. - -The focus of SuiteCRM 7.5 is to enhance the functionality of the native Reports module and introduce new charting functionality/designs. - -This release candidate release includes the following new features, as well as bug-fixes to the 7.5 Beta 2 release: - -* Enhancements to the User Interface. -* Grouped Report View. -* AND/OR reporting operators. -* New RGraph charting engine. - -[Click here][51] to get the full details of this release and to get the upgrade package from 7.3.x, 7.4.x, 7.5 Beta 1 and 7.5 Beta 2. - -Pre-release - -* [ v7.5-beta.2 ][52] -* [ `8bff783` ][53] - -# [7.5 Beta 2][54] - -![@willrennie][34] [willrennie][35] released this Dec 21, 2015 · [ 6157 commits][55] to develop since this release - -## Assets - -* [ **Source code** (zip) ][56] -* [ **Source code** (tar.gz) ][57] - -**This is a beta release and should not be used in a production environment.** - -Try 7.5 Beta 2 to preview the new features coming in SuiteCRM 7.5. - -The focus of SuiteCRM 7.5 is to enhance the functionality of the native Reports module and introduce new charting functionality/designs. - -This second Beta release includes enhancements to the User Interface, AND/OR reporting operators, new RGraph charting functionality and bug fixes to the 7.5 Beta 1 release. - -[Click here][51] to get the full details of this release and to get the upgrade package from 7.3.x, 7.4.x and 7.5 Beta 1. - -Pre-release - -* [ v7.5-beta ][58] -* [ `82cb105` ][59] - -# [7.5 Beta][60] - -![@willrennie][34] [willrennie][35] released this Dec 14, 2015 · [ 6175 commits][61] to develop since this release - -## Assets - -* [ **Source code** (zip) ][62] -* [ **Source code** (tar.gz) ][63] - -**This is a beta release and should not be used in a production environment.** - -Try 7.5 to preview the new features coming in SuiteCRM 7.5. - -The focus of SuiteCRM 7.5 is to enhance the functionality of the native Reports module. - -The first Beta release includes enhancements to the User Interface and the introduction of AND/OR operators. - -[Click here][51] to get the full details of this release and to get the upgrade package from 7.3.x and 7.4.x - -* [ v7.4.3 ][64] -* [ `aad2273` ][65] - -# [7.4.3][66] - -![@willrennie][34] [willrennie][35] released this Nov 23, 2015 · [ 5555 commits][67] to master since this release - -## Assets - -* [ **Source code** (zip) ][68] -* [ **Source code** (tar.gz) ][69] - -**SuiteCRM 7.4.3 is now Officially Available to Download** - -SuiteCRM 7.4.3, the latest cutting edge release, introduces the new reminder meetings functionality. - -This functionality allows users to more efficiently manage call and meeting reminders with the following features: - -* Add multiple reminders to a Meeting/Call so that users can be reminded about a meeting at different intervals. -* Select if all invitees should get a reminder so that users can choose who to remind about the Meeting/Call. -* Choose people who should not get a reminder so that users can choose who to remind about the Meeting/Call. -* Ability to select who receives reminders so that no one else is reminded about the Meeting/Call. - -In addition to the Reminder Meetings functionality, there have also been many bug-fixes implemented in SuiteCRM 7.4.3. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][30] to find the appropriate upgrade. - -Thank you to all community members who contributed, tested and helped with this release. - -* Nov 23, 2015 - -### [ v7.4.2 ][70] … - - Merge branch 'reminders' into 7.4.2 - - - * [ 3655540 ][71] - * [ zip ][72] - * [ tar.gz ][73] -* [ v7.4.1 ][74] -* [ `a74ed2f` ][75] - -# [7.4.1][76] - -![@willrennie][34] [willrennie][35] released this Nov 10, 2015 · [ 5673 commits][77] to master since this release - -## Assets - -* [ **Source code** (zip) ][78] -* [ **Source code** (tar.gz) ][79] - -**SuiteCRM 7.4.1 is now Officially Available to Download** - -This is a bug fix release for SuiteCRM 7.4 release. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][30] to find the appropriate upgrade. - -Thank you to all community members who contributed, tested and helped with this release. - -* [ v7.4 ][80] -* [ `1cb8753` ][81] - -# [7.4][82] - -![@mattlorimer][25] [mattlorimer][26] released this Oct 30, 2015 · [ 5747 commits][83] to master since this release - -## Assets - -* [ **Source code** (zip) ][84] -* [ **Source code** (tar.gz) ][85] - -**SuiteCRM 7.4 is now Officially Available to Download** - -This release bring many enhancements - Favourites, Knowledge Base, Improved PHP Compatibility and More.. - -For more information view the release notes on the SuiteCRM Wiki [here][86]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][30] to find the appropriate upgrade. - -Thank you to all community members who contributed, tested and helped with this release. - -[Previous][87][Next][88] - -* © 2018 GitHub, Inc. -* [Terms][89] -* [Privacy][90] -* [Security][91] -* [Status][92] -* [Help][93] -[ ][94] - -* [Contact GitHub][95] -* [API][96] -* [Training][97] -* [Shop][98] -* [Blog][99] -* [About][100] - -You can't perform that action at this time. - -You signed in with another tab or window. [Reload][101] to refresh your session. You signed out in another tab or window. [Reload][101] to refresh your session. - -[1]: https://github.com#start-of-content -[2]: https://github.com/ -[3]: https://github.com/features -[4]: https://github.com/business -[5]: https://github.com/explore -[6]: https://github.com/marketplace -[7]: https://github.com/pricing -[8]: https://github.com/salesagility/SuiteCRM/releases -[9]: /login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases%3Fafter%3Dv7.5.3 -[10]: /join?source=header-repo -[11]: /login?return_to=%2Fsalesagility%2FSuiteCRM -[12]: https://github.com/salesagility/SuiteCRM/watchers -[13]: https://github.com/salesagility/SuiteCRM/stargazers -[14]: https://github.com/salesagility/SuiteCRM/network -[15]: https://github.com/salesagility -[16]: https://github.com/salesagility/SuiteCRM -[17]: https://github.com/salesagility/SuiteCRM/issues -[18]: https://github.com/salesagility/SuiteCRM/pulls -[19]: https://github.com/salesagility/SuiteCRM/wiki -[20]: https://github.com/salesagility/SuiteCRM/pulse -[21]: https://github.com/salesagility/SuiteCRM/tags -[22]: https://github.com/salesagility/SuiteCRM/tree/v7.5.2 -[23]: https://github.com/salesagility/SuiteCRM/commit/b099183355f664d754c8e9065bae12c868c2d6d6 -[24]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.5.2 -[25]: https://avatars1.githubusercontent.com/u/6449723?s=40&v=4 -[26]: https://github.com/mattlorimer -[27]: https://github.com/salesagility/SuiteCRM/compare/v7.5.2...master -[28]: https://github.com/salesagility/SuiteCRM/archive/v7.5.2.zip -[29]: https://github.com/salesagility/SuiteCRM/archive/v7.5.2.tar.gz -[30]: https://suitecrm.com/download -[31]: https://github.com/salesagility/SuiteCRM/tree/v7.5.1 -[32]: https://github.com/salesagility/SuiteCRM/commit/a75ecc22a3ae6a098cf7b2c597eede61d698fe6a -[33]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.5.1 -[34]: https://avatars3.githubusercontent.com/u/5641419?s=40&v=4 -[35]: https://github.com/willrennie -[36]: https://github.com/salesagility/SuiteCRM/compare/v7.5.1...master -[37]: https://github.com/salesagility/SuiteCRM/archive/v7.5.1.zip -[38]: https://github.com/salesagility/SuiteCRM/archive/v7.5.1.tar.gz -[39]: https://github.com/salesagility/SuiteCRM/tree/v7.5 -[40]: https://github.com/salesagility/SuiteCRM/commit/bc02d48068f78718807bd0f7027826d9894f1e42 -[41]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.5 -[42]: https://github.com/salesagility/SuiteCRM/compare/v7.5...master -[43]: https://github.com/salesagility/SuiteCRM/archive/v7.5.zip -[44]: https://github.com/salesagility/SuiteCRM/archive/v7.5.tar.gz -[45]: https://github.com/salesagility/SuiteCRM/tree/v7.5-rc -[46]: https://github.com/salesagility/SuiteCRM/commit/6d6c676f7e2fba958a8b82e1ffc01e3875095608 -[47]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.5-rc -[48]: https://github.com/salesagility/SuiteCRM/compare/v7.5-rc...develop -[49]: https://github.com/salesagility/SuiteCRM/archive/v7.5-rc.zip -[50]: https://github.com/salesagility/SuiteCRM/archive/v7.5-rc.tar.gz -[51]: https://suitecrm.com/suitecrm?id=222 -[52]: https://github.com/salesagility/SuiteCRM/tree/v7.5-beta.2 -[53]: https://github.com/salesagility/SuiteCRM/commit/8bff783446f9cf2f05333232a36f7966ccc08371 -[54]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.5-beta.2 -[55]: https://github.com/salesagility/SuiteCRM/compare/v7.5-beta.2...develop -[56]: https://github.com/salesagility/SuiteCRM/archive/v7.5-beta.2.zip -[57]: https://github.com/salesagility/SuiteCRM/archive/v7.5-beta.2.tar.gz -[58]: https://github.com/salesagility/SuiteCRM/tree/v7.5-beta -[59]: https://github.com/salesagility/SuiteCRM/commit/82cb105baf7fbbc8d3d8f5fa54b102a6655ae106 -[60]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.5-beta -[61]: https://github.com/salesagility/SuiteCRM/compare/v7.5-beta...develop -[62]: https://github.com/salesagility/SuiteCRM/archive/v7.5-beta.zip -[63]: https://github.com/salesagility/SuiteCRM/archive/v7.5-beta.tar.gz -[64]: https://github.com/salesagility/SuiteCRM/tree/v7.4.3 -[65]: https://github.com/salesagility/SuiteCRM/commit/aad227325a9238e9e916f6d6401b34aca703300a -[66]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.4.3 -[67]: https://github.com/salesagility/SuiteCRM/compare/v7.4.3...master -[68]: https://github.com/salesagility/SuiteCRM/archive/v7.4.3.zip -[69]: https://github.com/salesagility/SuiteCRM/archive/v7.4.3.tar.gz -[70]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.4.2 -[71]: https://github.com/salesagility/SuiteCRM/commit/36555404f051b4636f8c602b9d7b36a185f4639a -[72]: https://github.com/salesagility/SuiteCRM/archive/v7.4.2.zip -[73]: https://github.com/salesagility/SuiteCRM/archive/v7.4.2.tar.gz -[74]: https://github.com/salesagility/SuiteCRM/tree/v7.4.1 -[75]: https://github.com/salesagility/SuiteCRM/commit/a74ed2f7f112cc7ce946be6e36b3e8178be594f0 -[76]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.4.1 -[77]: https://github.com/salesagility/SuiteCRM/compare/v7.4.1...master -[78]: https://github.com/salesagility/SuiteCRM/archive/v7.4.1.zip -[79]: https://github.com/salesagility/SuiteCRM/archive/v7.4.1.tar.gz -[80]: https://github.com/salesagility/SuiteCRM/tree/v7.4 -[81]: https://github.com/salesagility/SuiteCRM/commit/1cb87534570b37d742389c12b845ed7b7e625c95 -[82]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.4 -[83]: https://github.com/salesagility/SuiteCRM/compare/v7.4...master -[84]: https://github.com/salesagility/SuiteCRM/archive/v7.4.zip -[85]: https://github.com/salesagility/SuiteCRM/archive/v7.4.tar.gz -[86]: https://suitecrm.com/wiki/index.php/Release_notes_7.4.0 -[87]: https://github.com/salesagility/SuiteCRM/releases?after=v7.7-beta2 -[88]: https://github.com/salesagility/SuiteCRM/releases?after=v7.4 -[89]: https://github.com/site/terms -[90]: https://github.com/site/privacy -[91]: https://github.com/security -[92]: https://status.github.com/ -[93]: https://help.github.com -[94]: https://github.com "GitHub" -[95]: https://github.com/contact -[96]: https://developer.github.com -[97]: https://training.github.com -[98]: https://shop.github.com -[99]: https://github.com/blog -[100]: https://github.com/about -[101]: - - diff --git a/_source/releases8.md b/_source/releases8.md deleted file mode 100644 index 0fd5dad03..000000000 --- a/_source/releases8.md +++ /dev/null @@ -1,363 +0,0 @@ - - - -[Source](https://github.com/salesagility/SuiteCRM/releases?after=v7.4 "Permalink to Releases · salesagility/SuiteCRM · GitHub") - -# Releases · salesagility/SuiteCRM · GitHub - -[Skip to content][1] - -[ ][2] - -* [ Features ][3] -* [ Business ][4] -* [ Explore ][5] -* [ Marketplace ][6] -* [ Pricing ][7] - -[This repository][8] - -[Sign in][9] or [Sign up][10] - -* [ Watch ][11] [ 164 ][12] -* [ Star ][11] [ 819 ][13] -* [ Fork ][11] [ 686 ][14] - -# [salesagility][15]/[**SuiteCRM][16]** - -[ Code ][16] [ Issues 609 ][17] [ Pull requests 285 ][18] [ Wiki ][19] [ Insights ][20] - -[Releases][8] [Tags][21] - -* [ v7.3.2 ][22] -* [ `1257ab2` ][23] - -# [7.3.2][24] - -![@mattlorimer][25] [mattlorimer][26] released this Oct 22, 2015 · [ 5893 commits][27] to master since this release - -## Assets - -* [ **Source code** (zip) ][28] -* [ **Source code** (tar.gz) ][29] - -**SuiteCRM 7.3.2 is now Officially Available to Download** - -This is a bug fix release for SuiteCRM 7.3 release. - -For more information view the release notes on the SuiteCRM Wiki [here][30]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][31] to find the appropriate upgrade. - -Thank you to all community members who contributed, tested and helped with this release. - -Pre-release - -* [ v7.4-rc ][32] -* [ `9e59c99` ][33] - -# [7.4 Release Candidate][34] - -![@mattlorimer][25] [mattlorimer][26] released this Oct 19, 2015 · [ 6438 commits][35] to develop since this release - -## Assets - -* [ **Source code** (zip) ][36] -* [ **Source code** (tar.gz) ][37] - -**This is a beta release and should not be used in a production environment.** - -Try 7.4RC to preview the new features coming in 7.4 - -Including Favourites, Knowledge Base, Improved PHP Compatibility and More. - -[Click here][38] to get the full details of this release and to get the upgrade package from 7.3.x and 7.4 Beta 1 or Beta 2 - -Pre-release - -* [ v7.4-beta.2 ][39] -* [ `5943e36` ][40] - -# [7.4 Beta 2][41] - -![@mattlorimer][25] [mattlorimer][26] released this Oct 12, 2015 · [ 6447 commits][42] to develop since this release - -## Assets - -* [ **Source code** (zip) ][43] -* [ **Source code** (tar.gz) ][44] - -**This is a beta release and should not be used in a production environment.** - -Try 7.4 Beta 2 to preview the new features coming in 7.4 - -Including Favourites, Knowledge Base, Improved Installer and More. - -[Click here][45] to get the full details of this release and to get the upgrade package from 7.3.x and 7.4 Beta 1 - -Pre-release - -* [ v7.4-beta ][46] -* [ `a522851` ][47] - -# [7.4 Beta][48] - -![@mattlorimer][25] [mattlorimer][26] released this Oct 5, 2015 · [ 6530 commits][49] to develop since this release - -## Assets - -* [ **Source code** (zip) ][50] -* [ **Source code** (tar.gz) ][51] - -**This is a beta release and should not be used in a production environment.** - -Try 7.4 Beta to preview the new features coming in 7.4 - -Including Favourites, Knowledge Base and More. - -[Click here][45] to get the full details of this release and to get the upgrade package from 7.3.x - -* [ v7.3.1 ][52] -* [ `9cec557` ][53] - -# [7.3.1][54] - -![@willrennie][55] [willrennie][56] released this Aug 25, 2015 · [ 5978 commits][57] to master since this release - -## Assets - -* [ **Source code** (zip) ][58] -* [ **Source code** (tar.gz) ][59] - -**SuiteCRM 7.3.1 is now Officially Available to Download** - -This is a bug fix release for SuiteCRM 7.3 release. - -For more information view the release notes on the SuiteCRM Wiki [here][60]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][31] to find the appropriate upgrade. - -Thank you to all community members who contributed, tested and helped with this release. - -* [ v7.2.4 ][61] -* [ `c95c9fb` ][62] - -# [7.2.4][63] - -![@willrennie][55] [willrennie][56] released this Aug 20, 2015 - -## Assets - -* [ **Source code** (zip) ][64] -* [ **Source code** (tar.gz) ][65] - -**SuiteCRM 7.2.4 is now Officially Available to Download** - -This is a bug-fix release. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][31] to find the appropriate upgrade. - -Thank you to all community members who contributed, tested and helped with this release. - -* [ v7.3 ][66] -* [ `cf31edd` ][67] - -# [7.3][68] - -![@willrennie][55] [willrennie][56] released this Aug 14, 2015 · [ 6017 commits][69] to master since this release - -## Assets - -* [ **Source code** (zip) ][70] -* [ **Source code** (tar.gz) ][71] - -**SuiteCRM 7.3 is now Officially Available to Download** - -This release bring many enhancements - inline editing, desktop notifications, enhancements to Reports, enhancements to Workflow and bug fixes. - -For more information view the release notes on the SuiteCRM Wiki [here][72]. - -Download here from the SuiteCRM GitHub Repository or [visit the official website][31] to find the appropriate upgrade. - -Thank you to all community members who contributed, tested and helped with this release. - -Pre-release - -* [ v7.3beta3 ][73] -* [ `a4a1884` ][74] - -# [7.3 Beta 3][75] - -![@willrennie][55] [willrennie][56] released this Aug 7, 2015 · [ 6690 commits][76] to develop since this release - -## Assets - -* [ **Source code** (zip) ][77] -* [ **Source code** (tar.gz) ][78] - - - v7.3beta3 - - Don't do a final move for invalid/malicious files. See #333. - -* [ v7.2.3 ][79] -* [ `817f434` ][80] - -# [7.2.3][81] - -![@willrennie][55] [willrennie][56] released this Aug 7, 2015 · [ 6162 commits][82] to master since this release - -## Assets - -* [ **Source code** (zip) ][83] -* [ **Source code** (tar.gz) ][84] - - - v7.2.3 - - Update version number to the latest release version. - -* [ v7.1.8 ][85] -* [ `ad74c85` ][86] - -# [7.1.8][87] - -![@willrennie][55] [willrennie][56] released this Aug 7, 2015 - -## Assets - -* [ **Source code** (zip) ][88] -* [ **Source code** (tar.gz) ][89] - - - v7.1.8 - - Don't do a final move for invalid/malicious files. See #333. - -[Previous][90][Next][91] - -* © 2018 GitHub, Inc. -* [Terms][92] -* [Privacy][93] -* [Security][94] -* [Status][95] -* [Help][96] -[ ][97] - -* [Contact GitHub][98] -* [API][99] -* [Training][100] -* [Shop][101] -* [Blog][102] -* [About][103] - -You can't perform that action at this time. - -You signed in with another tab or window. [Reload][104] to refresh your session. You signed out in another tab or window. [Reload][104] to refresh your session. - -[1]: https://github.com#start-of-content -[2]: https://github.com/ -[3]: https://github.com/features -[4]: https://github.com/business -[5]: https://github.com/explore -[6]: https://github.com/marketplace -[7]: https://github.com/pricing -[8]: https://github.com/salesagility/SuiteCRM/releases -[9]: /login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases%3Fafter%3Dv7.4 -[10]: /join?source=header-repo -[11]: /login?return_to=%2Fsalesagility%2FSuiteCRM -[12]: https://github.com/salesagility/SuiteCRM/watchers -[13]: https://github.com/salesagility/SuiteCRM/stargazers -[14]: https://github.com/salesagility/SuiteCRM/network -[15]: https://github.com/salesagility -[16]: https://github.com/salesagility/SuiteCRM -[17]: https://github.com/salesagility/SuiteCRM/issues -[18]: https://github.com/salesagility/SuiteCRM/pulls -[19]: https://github.com/salesagility/SuiteCRM/wiki -[20]: https://github.com/salesagility/SuiteCRM/pulse -[21]: https://github.com/salesagility/SuiteCRM/tags -[22]: https://github.com/salesagility/SuiteCRM/tree/v7.3.2 -[23]: https://github.com/salesagility/SuiteCRM/commit/1257ab233056558d2ec203691e479d6c685b5177 -[24]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.3.2 -[25]: https://avatars1.githubusercontent.com/u/6449723?s=40&v=4 -[26]: https://github.com/mattlorimer -[27]: https://github.com/salesagility/SuiteCRM/compare/v7.3.2...master -[28]: https://github.com/salesagility/SuiteCRM/archive/v7.3.2.zip -[29]: https://github.com/salesagility/SuiteCRM/archive/v7.3.2.tar.gz -[30]: https://suitecrm.com/wiki/index.php/Release_notes_7.3.2 -[31]: https://suitecrm.com/download -[32]: https://github.com/salesagility/SuiteCRM/tree/v7.4-rc -[33]: https://github.com/salesagility/SuiteCRM/commit/9e59c99d877e1ccf310797f1a2e63e3314c4c38b -[34]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.4-rc -[35]: https://github.com/salesagility/SuiteCRM/compare/v7.4-rc...develop -[36]: https://github.com/salesagility/SuiteCRM/archive/v7.4-rc.zip -[37]: https://github.com/salesagility/SuiteCRM/archive/v7.4-rc.tar.gz -[38]: https://suitecrm.com/suitecrm?id=224 -[39]: https://github.com/salesagility/SuiteCRM/tree/v7.4-beta.2 -[40]: https://github.com/salesagility/SuiteCRM/commit/5943e3632264b2dcd0eefa05f9a7670571c31543 -[41]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.4-beta.2 -[42]: https://github.com/salesagility/SuiteCRM/compare/v7.4-beta.2...develop -[43]: https://github.com/salesagility/SuiteCRM/archive/v7.4-beta.2.zip -[44]: https://github.com/salesagility/SuiteCRM/archive/v7.4-beta.2.tar.gz -[45]: https://suitecrm.com/suitecrm?id=222 -[46]: https://github.com/salesagility/SuiteCRM/tree/v7.4-beta -[47]: https://github.com/salesagility/SuiteCRM/commit/a522851389df6d41255a9fe3984bee012f5c3b45 -[48]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.4-beta -[49]: https://github.com/salesagility/SuiteCRM/compare/v7.4-beta...develop -[50]: https://github.com/salesagility/SuiteCRM/archive/v7.4-beta.zip -[51]: https://github.com/salesagility/SuiteCRM/archive/v7.4-beta.tar.gz -[52]: https://github.com/salesagility/SuiteCRM/tree/v7.3.1 -[53]: https://github.com/salesagility/SuiteCRM/commit/9cec55772ec039833ca2b1e4135b0b8e2debe719 -[54]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.3.1 -[55]: https://avatars3.githubusercontent.com/u/5641419?s=40&v=4 -[56]: https://github.com/willrennie -[57]: https://github.com/salesagility/SuiteCRM/compare/v7.3.1...master -[58]: https://github.com/salesagility/SuiteCRM/archive/v7.3.1.zip -[59]: https://github.com/salesagility/SuiteCRM/archive/v7.3.1.tar.gz -[60]: https://suitecrm.com/wiki/index.php/Release_notes_7.3.1 -[61]: https://github.com/salesagility/SuiteCRM/tree/v7.2.4 -[62]: https://github.com/salesagility/SuiteCRM/commit/c95c9fb49211dbe89f144ff6e3160b15c39504f5 -[63]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.2.4 -[64]: https://github.com/salesagility/SuiteCRM/archive/v7.2.4.zip -[65]: https://github.com/salesagility/SuiteCRM/archive/v7.2.4.tar.gz -[66]: https://github.com/salesagility/SuiteCRM/tree/v7.3 -[67]: https://github.com/salesagility/SuiteCRM/commit/cf31edd1d0653a7ba07b6959685fdfa79b6c9f37 -[68]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.3 -[69]: https://github.com/salesagility/SuiteCRM/compare/v7.3...master -[70]: https://github.com/salesagility/SuiteCRM/archive/v7.3.zip -[71]: https://github.com/salesagility/SuiteCRM/archive/v7.3.tar.gz -[72]: https://suitecrm.com/wiki/index.php/Release_notes_7.3.0 -[73]: https://github.com/salesagility/SuiteCRM/tree/v7.3beta3 -[74]: https://github.com/salesagility/SuiteCRM/commit/a4a1884ea79825b07d2229b73915eb4512499da1 -[75]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.3beta3 -[76]: https://github.com/salesagility/SuiteCRM/compare/v7.3beta3...develop -[77]: https://github.com/salesagility/SuiteCRM/archive/v7.3beta3.zip -[78]: https://github.com/salesagility/SuiteCRM/archive/v7.3beta3.tar.gz -[79]: https://github.com/salesagility/SuiteCRM/tree/v7.2.3 -[80]: https://github.com/salesagility/SuiteCRM/commit/817f43482e32408a95a94e11e3ee3ce4e3bddcc9 -[81]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.2.3 -[82]: https://github.com/salesagility/SuiteCRM/compare/v7.2.3...master -[83]: https://github.com/salesagility/SuiteCRM/archive/v7.2.3.zip -[84]: https://github.com/salesagility/SuiteCRM/archive/v7.2.3.tar.gz -[85]: https://github.com/salesagility/SuiteCRM/tree/v7.1.8 -[86]: https://github.com/salesagility/SuiteCRM/commit/ad74c85a93add6f57e946b1fb87fb0820f214ba7 -[87]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.1.8 -[88]: https://github.com/salesagility/SuiteCRM/archive/v7.1.8.zip -[89]: https://github.com/salesagility/SuiteCRM/archive/v7.1.8.tar.gz -[90]: https://github.com/salesagility/SuiteCRM/releases?after=v7.5.3 -[91]: https://github.com/salesagility/SuiteCRM/releases?after=v7.1.8 -[92]: https://github.com/site/terms -[93]: https://github.com/site/privacy -[94]: https://github.com/security -[95]: https://status.github.com/ -[96]: https://help.github.com -[97]: https://github.com "GitHub" -[98]: https://github.com/contact -[99]: https://developer.github.com -[100]: https://training.github.com -[101]: https://shop.github.com -[102]: https://github.com/blog -[103]: https://github.com/about -[104]: - - diff --git a/_source/releases9.md b/_source/releases9.md deleted file mode 100644 index 565fc3296..000000000 --- a/_source/releases9.md +++ /dev/null @@ -1,327 +0,0 @@ - - -[Source](https://github.com/salesagility/SuiteCRM/releases?after=v7.1.8 "Permalink to Releases · salesagility/SuiteCRM · GitHub") - -# Releases · salesagility/SuiteCRM · GitHub - -[Skip to content][1] - -[ ][2] - -* [ Features ][3] -* [ Business ][4] -* [ Explore ][5] -* [ Marketplace ][6] -* [ Pricing ][7] - -[This repository][8] - -[Sign in][9] or [Sign up][10] - -* [ Watch ][11] [ 164 ][12] -* [ Star ][11] [ 819 ][13] -* [ Fork ][11] [ 686 ][14] - -# [salesagility][15]/[**SuiteCRM][16]** - -[ Code ][16] [ Issues 609 ][17] [ Pull requests 285 ][18] [ Wiki ][19] [ Insights ][20] - -[Releases][8] [Tags][21] - -Pre-release - -* [ v7.3-beta ][22] -* [ `2eaa734` ][23] - -# [7.3 Beta][24] - -![@willrennie][25] [willrennie][26] released this Jun 5, 2015 · [ 6733 commits][27] to develop since this release - -## Assets - -* [ **Source code** (zip) ][28] -* [ **Source code** (tar.gz) ][29] - -**This is a beta release and should not be used in a production environment.** - -Try 7.3 Beta to preview the new features coming in 7.3 - -Including Inline Editing, Desktop Notifications and More. - -[Click here][30] to get the full details of this release and to get the upgrade package from 7.2.x - -* [ v7.2.2 ][31] -* [ `016d6c6` ][32] - -# [7.2.2][33] - -![@willrennie][25] [willrennie][26] released this May 20, 2015 · [ 6164 commits][34] to master since this release - -## Assets - -* [ **Source code** (zip) ][35] -* [ **Source code** (tar.gz) ][36] - -SuiteCRM 7.2 has been updated to version 7.2.2. - -This is a bug fix release which addresses bugs in the SuiteCRM 7.2.1 release and also Post-Auth RCE vulnerabilities in SuiteCRM. - -* May 20, 2015 - -### [ 7.2.2 ][37] … - - Update SuiteCRM version to 7.2.2. - - - * [ bf42349 ][38] - * [ zip ][39] - * [ tar.gz ][40] -* May 20, 2015 - -### [ 7.1.7 ][41] … - - Fix Post-Auth RCE Vulnerabilit - - - * [ d004245 ][42] - * [ zip ][43] - * [ tar.gz ][44] -* [ v7.1.7 ][45] -* [ `d004245` ][42] - -# [7.1.7][46] - -![@willrennie][25] [willrennie][26] released this May 20, 2015 - -## Assets - -* [ **Source code** (zip) ][47] -* [ **Source code** (tar.gz) ][48] - -SuiteCRM 7.1 has been updated to version 7.1.7. - -This is a bug fix release which addresses Post-Auth RCE vulnerabilities in SuiteCRM. - -* [ v7.2.1 ][49] -* [ `dda786a` ][50] - -# [7.2.1][51] - -![@mattlorimer][52] [mattlorimer][53] released this Mar 11, 2015 · [ 6220 commits][54] to master since this release - -## Assets - -* [ **Source code** (zip) ][55] -* [ **Source code** (tar.gz) ][56] - -**SuiteCRM 7.2.1 is now Officially Available to Download** - -This is a Bug Fix release that addresses that addresses many issues - -For more check out the release notes on the wiki [here][57] - -Download here or [click here][58] to find the appropriate upgrade. - -Big Thanks to everyone who contributed, tested and helped with this release, - -* [ v7.1.6 ][59] -* [ `bac37f5` ][60] - -# [7.1.6][61] - -![@mattlorimer][52] [mattlorimer][53] released this Mar 11, 2015 - -## Assets - -* [ **Source code** (zip) ][62] -* [ **Source code** (tar.gz) ][63] - -SuiteCRM has been updated to version 7.1.6 - -This is a bug fix release which addresses many issues - -For a full list of what has changed and been fixed check out the release notes on the wiki - -* [ v7.2 ][64] -* [ `2c529f7` ][65] - -# [7.2][66] - -![@mattlorimer][52] [mattlorimer][53] released this Mar 2, 2015 · [ 6252 commits][67] to master since this release - -## Assets - -* [ **Source code** (zip) ][68] -* [ **Source code** (tar.gz) ][69] - -**SuiteCRM 7.2 is now Officially Available to Download** - -This release bring many enhancements - a brand new responsive theme, enhanced reporting, an image field and much more - -For more check out the release notes on the wiki [here][70] - -Download here or [click here][58] to find the appropriate upgrade. - -Big Thanks to everyone who contributed, tested and helped with this release, - -Pre-release - -* [ v7.2beta3 ][71] -* [ `169047a` ][72] - -# [7.2 Beta 3][73] - -![@mattlorimer][52] [mattlorimer][53] released this Feb 9, 2015 · [ 7091 commits][74] to develop since this release - -## Assets - -* [ **Source code** (zip) ][75] -* [ **Source code** (tar.gz) ][76] - -**This is a beta release and should not be used in a production environment.** - -Try 7.2 Beta 3 to preview the new features coming in 7.2 - -Including reports, cases and project enhancements - -[Click here][77] to get the full details of this release and to get the upgrade package from 7.1.x (also valid for upgrading from 7.2 beta/beta2) - -* [ v7.1.5 ][78] -* [ `08e610e` ][79] - -# [7.1.5][80] - -![@mattlorimer][52] [mattlorimer][53] released this Jan 19, 2015 · [ 6842 commits][81] to master since this release - -## Assets - -* [ **Source code** (zip) ][82] -* [ **Source code** (tar.gz) ][83] - -SuiteCRM has been updated to version 7.1.5 - -This is a bug fix release which also addresses some important security issues - -For a full list of what has changed and been fixed check out the release notes on the wiki - -[Previous][84][Next][85] - -* © 2018 GitHub, Inc. -* [Terms][86] -* [Privacy][87] -* [Security][88] -* [Status][89] -* [Help][90] -[ ][91] - -* [Contact GitHub][92] -* [API][93] -* [Training][94] -* [Shop][95] -* [Blog][96] -* [About][97] - -You can't perform that action at this time. - -You signed in with another tab or window. [Reload][98] to refresh your session. You signed out in another tab or window. [Reload][98] to refresh your session. - -[1]: https://github.com#start-of-content -[2]: https://github.com/ -[3]: https://github.com/features -[4]: https://github.com/business -[5]: https://github.com/explore -[6]: https://github.com/marketplace -[7]: https://github.com/pricing -[8]: https://github.com/salesagility/SuiteCRM/releases -[9]: /login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases%3Fafter%3Dv7.1.8 -[10]: /join?source=header-repo -[11]: /login?return_to=%2Fsalesagility%2FSuiteCRM -[12]: https://github.com/salesagility/SuiteCRM/watchers -[13]: https://github.com/salesagility/SuiteCRM/stargazers -[14]: https://github.com/salesagility/SuiteCRM/network -[15]: https://github.com/salesagility -[16]: https://github.com/salesagility/SuiteCRM -[17]: https://github.com/salesagility/SuiteCRM/issues -[18]: https://github.com/salesagility/SuiteCRM/pulls -[19]: https://github.com/salesagility/SuiteCRM/wiki -[20]: https://github.com/salesagility/SuiteCRM/pulse -[21]: https://github.com/salesagility/SuiteCRM/tags -[22]: https://github.com/salesagility/SuiteCRM/tree/v7.3-beta -[23]: https://github.com/salesagility/SuiteCRM/commit/2eaa73477206457911b072badf225d74a55ed4fc -[24]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.3-beta -[25]: https://avatars3.githubusercontent.com/u/5641419?s=40&v=4 -[26]: https://github.com/willrennie -[27]: https://github.com/salesagility/SuiteCRM/compare/v7.3-beta...develop -[28]: https://github.com/salesagility/SuiteCRM/archive/v7.3-beta.zip -[29]: https://github.com/salesagility/SuiteCRM/archive/v7.3-beta.tar.gz -[30]: https://suitecrm.com/index.php?option=com_content&layout=edit&view=article&id=209 -[31]: https://github.com/salesagility/SuiteCRM/tree/v7.2.2 -[32]: https://github.com/salesagility/SuiteCRM/commit/016d6c6abee5852f91f119c2201e6d05741d4003 -[33]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.2.2 -[34]: https://github.com/salesagility/SuiteCRM/compare/v7.2.2...master -[35]: https://github.com/salesagility/SuiteCRM/archive/v7.2.2.zip -[36]: https://github.com/salesagility/SuiteCRM/archive/v7.2.2.tar.gz -[37]: https://github.com/salesagility/SuiteCRM/releases/tag/7.2.2 -[38]: https://github.com/salesagility/SuiteCRM/commit/bf42349ed7604334601eb3a1eaf98baf4e56c7ea -[39]: https://github.com/salesagility/SuiteCRM/archive/7.2.2.zip -[40]: https://github.com/salesagility/SuiteCRM/archive/7.2.2.tar.gz -[41]: https://github.com/salesagility/SuiteCRM/releases/tag/7.1.7 -[42]: https://github.com/salesagility/SuiteCRM/commit/d0042450f5bb73e1db2ec86460609cb5b2e4fa5b -[43]: https://github.com/salesagility/SuiteCRM/archive/7.1.7.zip -[44]: https://github.com/salesagility/SuiteCRM/archive/7.1.7.tar.gz -[45]: https://github.com/salesagility/SuiteCRM/tree/v7.1.7 -[46]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.1.7 -[47]: https://github.com/salesagility/SuiteCRM/archive/v7.1.7.zip -[48]: https://github.com/salesagility/SuiteCRM/archive/v7.1.7.tar.gz -[49]: https://github.com/salesagility/SuiteCRM/tree/v7.2.1 -[50]: https://github.com/salesagility/SuiteCRM/commit/dda786a6489bfd8c743150033a29fd460f25b980 -[51]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.2.1 -[52]: https://avatars1.githubusercontent.com/u/6449723?s=40&v=4 -[53]: https://github.com/mattlorimer -[54]: https://github.com/salesagility/SuiteCRM/compare/v7.2.1...master -[55]: https://github.com/salesagility/SuiteCRM/archive/v7.2.1.zip -[56]: https://github.com/salesagility/SuiteCRM/archive/v7.2.1.tar.gz -[57]: https://suitecrm.com/wiki/index.php/Release_notes_7.2.1 -[58]: https://suitecrm.com/download -[59]: https://github.com/salesagility/SuiteCRM/tree/v7.1.6 -[60]: https://github.com/salesagility/SuiteCRM/commit/bac37f5776d3d90b65e06853771fd50339fbf98a -[61]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.1.6 -[62]: https://github.com/salesagility/SuiteCRM/archive/v7.1.6.zip -[63]: https://github.com/salesagility/SuiteCRM/archive/v7.1.6.tar.gz -[64]: https://github.com/salesagility/SuiteCRM/tree/v7.2 -[65]: https://github.com/salesagility/SuiteCRM/commit/2c529f735a72ad6730a692660249175797be7d0b -[66]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.2 -[67]: https://github.com/salesagility/SuiteCRM/compare/v7.2...master -[68]: https://github.com/salesagility/SuiteCRM/archive/v7.2.zip -[69]: https://github.com/salesagility/SuiteCRM/archive/v7.2.tar.gz -[70]: https://suitecrm.com/wiki/index.php/Release_notes_7.2.0 -[71]: https://github.com/salesagility/SuiteCRM/tree/v7.2beta3 -[72]: https://github.com/salesagility/SuiteCRM/commit/169047ae360552505b365be928b959b13d8264ae -[73]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.2beta3 -[74]: https://github.com/salesagility/SuiteCRM/compare/v7.2beta3...develop -[75]: https://github.com/salesagility/SuiteCRM/archive/v7.2beta3.zip -[76]: https://github.com/salesagility/SuiteCRM/archive/v7.2beta3.tar.gz -[77]: https://suitecrm.com/suitecrm?id=207:download&catid=126:suitecrm-beta -[78]: https://github.com/salesagility/SuiteCRM/tree/v7.1.5 -[79]: https://github.com/salesagility/SuiteCRM/commit/08e610e40ea80f71a29600c450930f872feee6e7 -[80]: https://github.com/salesagility/SuiteCRM/releases/tag/v7.1.5 -[81]: https://github.com/salesagility/SuiteCRM/compare/v7.1.5...master -[82]: https://github.com/salesagility/SuiteCRM/archive/v7.1.5.zip -[83]: https://github.com/salesagility/SuiteCRM/archive/v7.1.5.tar.gz -[84]: https://github.com/salesagility/SuiteCRM/releases?after=v7.4 -[85]: https://github.com/salesagility/SuiteCRM/releases?after=v7.1.5 -[86]: https://github.com/site/terms -[87]: https://github.com/site/privacy -[88]: https://github.com/security -[89]: https://status.github.com/ -[90]: https://help.github.com -[91]: https://github.com "GitHub" -[92]: https://github.com/contact -[93]: https://developer.github.com -[94]: https://training.github.com -[95]: https://shop.github.com -[96]: https://github.com/blog -[97]: https://github.com/about -[98]: - - diff --git a/_source/relnotes/releases.adoc b/_source/relnotes/releases.adoc deleted file mode 100644 index ac2b08498..000000000 --- a/_source/relnotes/releases.adoc +++ /dev/null @@ -1,486 +0,0 @@ -https://github.com/salesagility/SuiteCRM/releases[Source] - -[[releases-salesagilitysuitecrm-github]] -Releases · salesagility/SuiteCRM · GitHub ------------------------------------------ - -https://github.com#start-of-content[Skip to content] - -https://github.com/[] - -* https://github.com/features[Features] -* https://github.com/business[Business] -* https://github.com/explore[Explore] -* https://github.com/marketplace[Marketplace] -* https://github.com/pricing[Pricing] - -https://github.com/salesagility/SuiteCRM/releases[This repository] - -link:/login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases[Sign in] or -link:/join?source=header-repo[Sign up] - -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Watch] -https://github.com/salesagility/SuiteCRM/watchers[164] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Star] -https://github.com/salesagility/SuiteCRM/stargazers[818] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Fork] -https://github.com/salesagility/SuiteCRM/network[686] - -[[salesagility15suitecrm16]] -https://github.com/salesagility[salesagility]/https://github.com/salesagility/SuiteCRM[**SuiteCRM]** ----------------------------------------------------------------------------------------------------- - -https://github.com/salesagility/SuiteCRM[Code] -https://github.com/salesagility/SuiteCRM/issues[Issues 609] -https://github.com/salesagility/SuiteCRM/pulls[Pull requests 286] -https://github.com/salesagility/SuiteCRM/wiki[Wiki] -https://github.com/salesagility/SuiteCRM/pulse[Insights] - -https://github.com/salesagility/SuiteCRM/releases[Releases] -https://github.com/salesagility/SuiteCRM/tags[Tags] - -https://github.com/salesagility/SuiteCRM/releases/latest[Latest release] - -* https://github.com/salesagility/SuiteCRM/tree/v7.9.9[v7.9.9] -* https://github.com/salesagility/SuiteCRM/commit/00260c72a12f79e280ea1beb4241d03c9d39681d[`00260c7`] - -Verified - -This commit was created on GitHub.com and signed with a *verified -signature* using GitHub's key. - -GPG key ID: 4AEE18F83AFDEB23 -https://help.github.com/articles/signing-commits-with-gpg/[Learn about -signing commits] - -[[section]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.9[7.9.9] -------------------------------------------------------------------- - -image:https://avatars0.githubusercontent.com/u/26431166?s=40&v=4[@Dillon-Brown] -https://github.com/Dillon-Brown[Dillon-Brown] released this Jan 11, 2018 -· https://github.com/salesagility/SuiteCRM/compare/v7.9.9...master[6 -commits] to master since this release - -[[assets]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.9.9.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.9.9.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.9.9 is now Available to Download* - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php/Release_notes_7.9.9[Release Notes]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -We have also updated our Security Process asking the community to send -their security issues directly to us via email -mailto:security%40suitecrm.com[security@suitecrm.com] - -We have also added a Code of Conduct to help build a more welcoming -environment for our community. + -https://github.com/salesagility/SuiteCRM/blob/master/CODE_OF_CONDUCT.md[SuiteCRM -Code of Conduct] - -* https://github.com/salesagility/SuiteCRM/tree/v7.8.10[v7.8.10] -* https://github.com/salesagility/SuiteCRM/commit/a501db76b422a78db30b11a62242e83ca2dfe733[`a501db7`] - -Verified - -This commit was created on GitHub.com and signed with a *verified -signature* using GitHub's key. - -GPG key ID: 4AEE18F83AFDEB23 -https://help.github.com/articles/signing-commits-with-gpg/[Learn about -signing commits] - -[[section-1]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.10[7.8.10] ---------------------------------------------------------------------- - -image:https://avatars0.githubusercontent.com/u/26431166?s=40&v=4[@Dillon-Brown] -https://github.com/Dillon-Brown[Dillon-Brown] released this Jan 11, 2018 - -[[assets-1]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.8.10.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.8.10.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.8.10 LTS is now Available to Download* - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php/Release_notes_7.8.10[Release Notes]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -We have also updated our Security Process asking the community to send -their security issues directly to us via email -mailto:security%40suitecrm.com[security@suitecrm.com] - -We have also added a Code of Conduct to help build a more welcoming -environment for our community. + -https://github.com/salesagility/SuiteCRM/blob/master/CODE_OF_CONDUCT.md[SuiteCRM -Code of Conduct] - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.10-beta-3[v7.10-beta-3] -* https://github.com/salesagility/SuiteCRM/commit/bcf99067ca1e8e301498c9753d2f8325a1b95aab[`bcf9906`] - -[[beta-344]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.10-beta-3[7.10 -Beta 3] -------------------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Dec 18, 2017 · -https://github.com/salesagility/SuiteCRM/compare/v7.10-beta-3...develop[61 -commits] to develop since this release - -[[assets-2]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.10-beta-3.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.10-beta-3.tar.gz[*Source -code* (tar.gz)] - -*This is a Beta release and should not be used in a production -environment.* - -Try 7.10 Beta 3 to preview the new features coming in SuiteCRM 7.10 - -https://suitecrm.com/download/download-pre-release[Click here] to get -the full details of this release and to get the upgrade packages - -Changes since Beta 2: - -* 4 SuiteP colour schemes (Day, Dawn, Dusk, Night) -* Email Performance Improvements -* Bug Fixing -* API swagger documentation added -* https://github.com/salesagility/SuiteCRM/tree/v7.9.8[v7.9.8] -* https://github.com/salesagility/SuiteCRM/commit/5b3eeb843089279bcb4abea37f3361ec123be4b0[`5b3eeb8`] - -[[section-2]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.8[7.9.8] -------------------------------------------------------------------- - -image:https://avatars0.githubusercontent.com/u/26431166?s=40&v=4[@Dillon-Brown] -https://github.com/Dillon-Brown[Dillon-Brown] released this Dec 14, 2017 -· https://github.com/salesagility/SuiteCRM/compare/v7.9.8...master[185 -commits] to master since this release - -[[assets-3]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.9.8.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.9.8.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.9.8 is now Available to Download* - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php/Release_notes_7.9.8[Release Notes]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -We have also updated our Security Process asking the community to send -their security issues directly to us via email -mailto:security%40suitecrm.com[security@suitecrm.com] - -We have also added a Code of Conduct to help build a more welcoming -environment for our community. + -https://github.com/salesagility/SuiteCRM/blob/master/CODE_OF_CONDUCT.md[SuiteCRM -Code of Conduct] - -* https://github.com/salesagility/SuiteCRM/tree/v7.8.9[v7.8.9] -* https://github.com/salesagility/SuiteCRM/commit/9856e75076c71210485940153cd7ad632f79b56d[`9856e75`] - -[[section-3]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.9[7.8.9] -------------------------------------------------------------------- - -image:https://avatars0.githubusercontent.com/u/26431166?s=40&v=4[@Dillon-Brown] -https://github.com/Dillon-Brown[Dillon-Brown] released this Dec 14, 2017 -· https://github.com/salesagility/SuiteCRM/compare/v7.8.9...7.8.x[90 -commits] to 7.8.x since this release - -[[assets-4]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.8.9.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.8.9.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.8.9 LTS is now Available to Download* - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php/Release_notes_7.8.9[Release Notes]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -We have also updated our Security Process asking the community to send -their security issues directly to us via email -mailto:security%40suitecrm.com[security@suitecrm.com] - -We have also added a Code of Conduct to help build a more welcoming -environment for our community. + -https://github.com/salesagility/SuiteCRM/blob/master/CODE_OF_CONDUCT.md[SuiteCRM -Code of Conduct] - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.10-beta-2[v7.10-beta-2] -* https://github.com/salesagility/SuiteCRM/commit/dd64f89af4fdaf809665bddf6d14fed930859335[`dd64f89`] - -Verified - -This commit was created on GitHub.com and signed with a *verified -signature* using GitHub's key. - -GPG key ID: 4AEE18F83AFDEB23 -https://help.github.com/articles/signing-commits-with-gpg/[Learn about -signing commits] - -[[beta-267]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.10-beta-2[7.10 -Beta 2] -------------------------------------------------------------------------------- - -image:https://avatars0.githubusercontent.com/u/26431166?s=40&v=4[@Dillon-Brown] -https://github.com/Dillon-Brown[Dillon-Brown] released this Dec 1, 2017 -· -https://github.com/salesagility/SuiteCRM/compare/v7.10-beta-2...develop[372 -commits] to develop since this release - -[[assets-5]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.10-beta-2.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.10-beta-2.tar.gz[*Source -code* (tar.gz)] - -*This is a Beta release and should not be used in a production -environment.* - -Try 7.10 Beta 2 to preview the new features coming in SuiteCRM 7.10 - -https://suitecrm.com/download/download-pre-release[Click here] to get -the full details of this release and to get the upgrade package - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.10-beta[v7.10-beta] -* https://github.com/salesagility/SuiteCRM/commit/fcd417573e56a86e3b3d1c945b3b22dc85ad7a7f[`fcd4175`] - -[[beta73]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.10-beta[7.10 -Beta] ---------------------------------------------------------------------------- - -image:https://avatars0.githubusercontent.com/u/26431166?s=40&v=4[@Dillon-Brown] -https://github.com/Dillon-Brown[Dillon-Brown] released this Nov 17, 2017 -· -https://github.com/salesagility/SuiteCRM/compare/v7.10-beta...develop[509 -commits] to develop since this release - -[[assets-6]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.10-beta.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.10-beta.tar.gz[*Source -code* (tar.gz)] - -*This is a Beta release and should not be used in a production -environment.* - -Try 7.10 Beta to preview the new features coming in SuiteCRM 7.10 - -https://suitecrm.com/download/download-pre-release[Click here] to get -the full details of this release and to get the upgrade package - -* https://github.com/salesagility/SuiteCRM/tree/v7.9.7[v7.9.7] -* https://github.com/salesagility/SuiteCRM/commit/41f5fea5123cc7c6e4f599d766005490c6023889[`41f5fea`] - -[[section-4]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.7[7.9.7] -------------------------------------------------------------------- - -image:https://avatars0.githubusercontent.com/u/26431166?s=40&v=4[@Dillon-Brown] -https://github.com/Dillon-Brown[Dillon-Brown] released this Oct 18, 2017 -· https://github.com/salesagility/SuiteCRM/compare/v7.9.7...master[426 -commits] to master since this release - -[[assets-7]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.9.7.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.9.7.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.9.7 is now Available to Download* - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php/Release_notes_7.9.7[Release Notes]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -We have also updated our Security Process asking the community to send -their security issues directly to us via email -mailto:security%40suitecrm.com[security@suitecrm.com] - -We have also added a Code of Conduct to help build a more welcoming -environment for our community. + -https://github.com/salesagility/SuiteCRM/blob/master/CODE_OF_CONDUCT.md[SuiteCRM -Code of Conduct] - -* https://github.com/salesagility/SuiteCRM/tree/v7.8.8[v7.8.8] -* https://github.com/salesagility/SuiteCRM/commit/5edffe2150f9a69de809d3d653d505d0f4908a62[`5edffe2`] - -[[section-5]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.8[7.8.8] -------------------------------------------------------------------- - -image:https://avatars0.githubusercontent.com/u/26431166?s=40&v=4[@Dillon-Brown] -https://github.com/Dillon-Brown[Dillon-Brown] released this Oct 18, 2017 -· https://github.com/salesagility/SuiteCRM/compare/v7.8.8...7.8.x[225 -commits] to 7.8.x since this release - -[[assets-8]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.8.8.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.8.8.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.8.8 LTS is now Available to Download* - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php/Release_notes_7.8.8[Release Notes]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -We have also updated our Security Process asking the community to send -their security issues directly to us via email -mailto:security%40suitecrm.com[security@suitecrm.com] - -We have also added a Code of Conduct to help build a more welcoming -environment for our community. + -https://github.com/salesagility/SuiteCRM/blob/master/CODE_OF_CONDUCT.md[SuiteCRM -Code of Conduct] - -* https://github.com/salesagility/SuiteCRM/tree/7.9.6[7.9.6] -* https://github.com/salesagility/SuiteCRM/commit/e0a0a9cd8ad2f01049ef2d412f024fb435151652[`e0a0a9c`] - -[[section-6]] -https://github.com/salesagility/SuiteCRM/releases/tag/7.9.6[7.9.6] ------------------------------------------------------------------- - -image:https://avatars0.githubusercontent.com/u/26431166?s=40&v=4[@Dillon-Brown] -https://github.com/Dillon-Brown[Dillon-Brown] released this Oct 3, 2017 -· https://github.com/salesagility/SuiteCRM/compare/7.9.6...master[507 -commits] to master since this release - -[[assets-9]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/7.9.6.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/7.9.6.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.9.6 is now Available to Download* - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php/Release_notes_7.9.6[Release Notes]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -We have also updated our Security Process asking the community to send -their security issues directly to us via email -mailto:security%40suitecrm.com[security@suitecrm.com] - -We have also added a Code of Conduct to help build a more welcoming -environment for our community. + -https://github.com/salesagility/SuiteCRM/blob/master/CODE_OF_CONDUCT.md[SuiteCRM -Code of Conduct] - -Previoushttps://github.com/salesagility/SuiteCRM/releases?after=7.9.6[Next] - -* © 2018 GitHub, Inc. -* https://github.com/site/terms[Terms] -* https://github.com/site/privacy[Privacy] -* https://github.com/security[Security] -* https://status.github.com/[Status] -* https://help.github.com[Help] https://github.com[] -* https://github.com/contact[Contact GitHub] -* https://developer.github.com[API] -* https://training.github.com[Training] -* https://shop.github.com[Shop] -* https://github.com/blog[Blog] -* https://github.com/about[About] - -You can't perform that action at this time. - -You signed in with another tab or window. link:[Reload] to refresh your -session. You signed out in another tab or window. link:[Reload] to -refresh your session. diff --git a/_source/relnotes/releases10.adoc b/_source/relnotes/releases10.adoc deleted file mode 100644 index 9f1c574a3..000000000 --- a/_source/relnotes/releases10.adoc +++ /dev/null @@ -1,364 +0,0 @@ -https://github.com/salesagility/SuiteCRM/releases?after=v7.1.5[Source] - -[[releases-salesagilitysuitecrm-github]] -Releases · salesagility/SuiteCRM · GitHub ------------------------------------------ - -https://github.com#start-of-content[Skip to content] - -https://github.com/[] - -* https://github.com/features[Features] -* https://github.com/business[Business] -* https://github.com/explore[Explore] -* https://github.com/marketplace[Marketplace] -* https://github.com/pricing[Pricing] - -https://github.com/salesagility/SuiteCRM/releases[This repository] - -link:/login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases%3Fafter%3Dv7.1.5[Sign -in] or link:/join?source=header-repo[Sign up] - -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Watch] -https://github.com/salesagility/SuiteCRM/watchers[164] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Star] -https://github.com/salesagility/SuiteCRM/stargazers[819] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Fork] -https://github.com/salesagility/SuiteCRM/network[686] - -[[salesagility15suitecrm16]] -https://github.com/salesagility[salesagility]/https://github.com/salesagility/SuiteCRM[**SuiteCRM]** ----------------------------------------------------------------------------------------------------- - -https://github.com/salesagility/SuiteCRM[Code] -https://github.com/salesagility/SuiteCRM/issues[Issues 609] -https://github.com/salesagility/SuiteCRM/pulls[Pull requests 285] -https://github.com/salesagility/SuiteCRM/wiki[Wiki] -https://github.com/salesagility/SuiteCRM/pulse[Insights] - -https://github.com/salesagility/SuiteCRM/releases[Releases] -https://github.com/salesagility/SuiteCRM/tags[Tags] - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.2beta2[v7.2beta2] -* https://github.com/salesagility/SuiteCRM/commit/cc1e2fd85ed757763231c84d25b4b0052c6d9d8b[`cc1e2fd`] - -[[beta-224]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.2beta2[7.2 Beta -2] ---------------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Dec 9, 2014 · -https://github.com/salesagility/SuiteCRM/compare/v7.2beta2...develop[7320 -commits] to develop since this release - -[[assets]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.2beta2.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.2beta2.tar.gz[*Source -code* (tar.gz)] - -*This is a beta release and should not be used in a production -environment.* - -Try 7.2 Beta 2 to preview the new features coming in 7.2 - -Including reports, cases and project enhancements - -https://suitecrm.com/suitecrm?id=207:download&catid=126:suitecrm-beta[Click -here] to get the full details of this release and to get the upgrade -package from 7.1.x (also valid for upgrading from 7.2 beta) - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.2beta[v7.2beta] -* https://github.com/salesagility/SuiteCRM/commit/fbc11ec38bcd0b3314d8f1eedc245460ea68d14d[`fbc11ec`] - -[[beta33]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.2beta[7.2 Beta] ------------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Oct 31, 2014 · -https://github.com/salesagility/SuiteCRM/compare/v7.2beta...develop[7437 -commits] to develop since this release - -[[assets-1]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.2beta.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.2beta.tar.gz[*Source -code* (tar.gz)] - -*This is a beta release and should not be used in a production -environment.* - -Try 7.2 Beta to preview the new features coming in 7.2 - -The main new feature of this release is the new Project Management with -Gantt charts - -In addition the SuiteCRM install process has been given a new look and -feel as well as many bug fixes and other little additions, and there is -still more to come. - -* https://github.com/salesagility/SuiteCRM/tree/v7.1.4[v7.1.4] -* https://github.com/salesagility/SuiteCRM/commit/0becccf2a82e42137357a09b069faa03f27763f7[`0becccf`] - -[[section]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.1.4[7.1.4] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Sep 25, 2014 · -https://github.com/salesagility/SuiteCRM/compare/v7.1.4...master[6892 -commits] to master since this release - -[[assets-2]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.1.4.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.1.4.tar.gz[*Source -code* (tar.gz)] - -SuiteCRM has been updated to version 7.1.4 - -This is a bug fix release which also addresses some important security -issues - -For a full list of what has changed and been fixed check out the release -notes on the wiki - -* https://github.com/salesagility/SuiteCRM/tree/v7.1.3[v7.1.3] -* https://github.com/salesagility/SuiteCRM/commit/b4015f18b56eb20d3bc4ba9c51946ad8e5287f88[`b4015f1`] - -[[section-1]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.1.3[7.1.3] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Aug 13, 2014 · -https://github.com/salesagility/SuiteCRM/compare/v7.1.3...master[6905 -commits] to master since this release - -[[assets-3]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.1.3.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.1.3.tar.gz[*Source -code* (tar.gz)] - -SuiteCRM has been updated to version 7.1.3 - -This is a bug fix release - -For a full list of what has changed and been fixed check out the release -notes on the wiki - -* https://github.com/salesagility/SuiteCRM/tree/v7.1.2[v7.1.2] -* https://github.com/salesagility/SuiteCRM/commit/934ac6b0296cbfbbc62c4566cd398566536bee49[`934ac6b`] - -[[section-2]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.1.2[7.1.2] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Jul 7, 2014 · -https://github.com/salesagility/SuiteCRM/compare/v7.1.2...master[6925 -commits] to master since this release - -[[assets-4]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.1.2.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.1.2.tar.gz[*Source -code* (tar.gz)] - -SuiteCRM has been updated to version 7.1.2 - -This is a bug fix release - -For a full list of what has changed and been fixed check out the release -notes on the wiki - -* https://github.com/salesagility/SuiteCRM/tree/v7.1.1[v7.1.1] -* https://github.com/salesagility/SuiteCRM/commit/c1d7af470a81ac3af5a59c0b35612fd886e6bf4e[`c1d7af4`] - -[[section-3]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.1.1[7.1.1] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Apr 7, 2014 · -https://github.com/salesagility/SuiteCRM/compare/v7.1.1...master[6987 -commits] to master since this release - -[[assets-5]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.1.1.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.1.1.tar.gz[*Source -code* (tar.gz)] - -SuiteCRM has been updated to version 7.1.1 - -This is a bug fix release - -For a full list of what has changed and been fixed check out the release -notes on the wiki - -* https://github.com/salesagility/SuiteCRM/tree/v7.1[v7.1] -* https://github.com/salesagility/SuiteCRM/commit/4eabe6c591837696043a1d9d0c8a5e2bbc63904f[`4eabe6c`] - -[[section-4]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.1[7.1] ---------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Apr 1, 2014 · -https://github.com/salesagility/SuiteCRM/compare/v7.1...master[7001 -commits] to master since this release - -[[assets-6]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.1.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.1.tar.gz[*Source -code* (tar.gz)] - -The long awaited SuiteCRM 7.1 is now available - -This release packs in many new features, most notably the many -enhancements to workflow, the new lucene powered search, (to enable see -AOD in the admin panel), the multi tabbed homepage, the ability to -filter the history sub-panel and more - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.1RC2[v7.1RC2] -* https://github.com/salesagility/SuiteCRM/commit/96ba6e53adeafe540628cdd1914a566feba2aa14[`96ba6e5`] - -[[release-candidate-269]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.1RC2[7.1 -Release Candidate 2] --------------------------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Mar 28, 2014 · -https://github.com/salesagility/SuiteCRM/compare/v7.1RC2...develop[7657 -commits] to develop since this release - -[[assets-7]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.1RC2.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.1RC2.tar.gz[*Source -code* (tar.gz)] - -Try out the Latest release of SuiteCRM, the final Release Candidate -before Mondays release! - -Help to find the remaining bugs! - -Thanks all the feedback and fixes contributed for this release - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.1RC[v7.1RC] -* https://github.com/salesagility/SuiteCRM/commit/f994bd0af71b41138a7be2b050e85417fa87c0b9[`f994bd0`] - -[[release-candidate-75]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.1RC[7.1 Release -Candidate] ------------------------------------------------------------------------------------ - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Mar 24, 2014 · -https://github.com/salesagility/SuiteCRM/compare/v7.1RC...develop[7687 -commits] to develop since this release - -[[assets-8]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.1RC.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.1RC.tar.gz[*Source -code* (tar.gz)] - -Try out the Latest release of SuiteCRM, the first Release Candidate, -which should be more stable than it beta predecessors! But still not -recommended for a production environment just yet - -But we still need you help to find the remaining bugs! - -Thanks all the feedback and fixes contributed so far. - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.1beta2[v7.1beta2] -* https://github.com/salesagility/SuiteCRM/commit/8983fdf5252b3081b4deb66cd5c30a9a2a598ed0[`8983fdf`] - -[[beta281]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.1beta2[7.1 -Beta2] --------------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Mar 14, 2014 · -https://github.com/salesagility/SuiteCRM/compare/v7.1beta2...develop[7713 -commits] to develop since this release - -[[assets-9]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.1beta2.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.1beta2.tar.gz[*Source -code* (tar.gz)] - -Try out the Latest Beta release of SuiteCRM with many improvements and -some major enhancements to Workflow - -Thanks to everyone who contributed! - -https://github.com/salesagility/SuiteCRM/releases?after=v7.1.8[Previous]https://github.com/salesagility/SuiteCRM/releases?after=v7.1beta2[Next] - -* © 2018 GitHub, Inc. -* https://github.com/site/terms[Terms] -* https://github.com/site/privacy[Privacy] -* https://github.com/security[Security] -* https://status.github.com/[Status] -* https://help.github.com[Help] https://github.com[] -* https://github.com/contact[Contact GitHub] -* https://developer.github.com[API] -* https://training.github.com[Training] -* https://shop.github.com[Shop] -* https://github.com/blog[Blog] -* https://github.com/about[About] - -You can't perform that action at this time. - -You signed in with another tab or window. link:[Reload] to refresh your -session. You signed out in another tab or window. link:[Reload] to -refresh your session. diff --git a/_source/relnotes/releases11.adoc b/_source/relnotes/releases11.adoc deleted file mode 100644 index 0ca3e40ba..000000000 --- a/_source/relnotes/releases11.adoc +++ /dev/null @@ -1,139 +0,0 @@ -https://github.com/salesagility/SuiteCRM/releases?after=v7.1beta2[Source] - -[[releases-salesagilitysuitecrm-github]] -Releases · salesagility/SuiteCRM · GitHub ------------------------------------------ - -https://github.com#start-of-content[Skip to content] - -https://github.com/[] - -* https://github.com/features[Features] -* https://github.com/business[Business] -* https://github.com/explore[Explore] -* https://github.com/marketplace[Marketplace] -* https://github.com/pricing[Pricing] - -https://github.com/salesagility/SuiteCRM/releases[This repository] - -link:/login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases%3Fafter%3Dv7.1beta2[Sign -in] or link:/join?source=header-repo[Sign up] - -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Watch] -https://github.com/salesagility/SuiteCRM/watchers[164] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Star] -https://github.com/salesagility/SuiteCRM/stargazers[819] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Fork] -https://github.com/salesagility/SuiteCRM/network[686] - -[[salesagility15suitecrm16]] -https://github.com/salesagility[salesagility]/https://github.com/salesagility/SuiteCRM[**SuiteCRM]** ----------------------------------------------------------------------------------------------------- - -https://github.com/salesagility/SuiteCRM[Code] -https://github.com/salesagility/SuiteCRM/issues[Issues 609] -https://github.com/salesagility/SuiteCRM/pulls[Pull requests 286] -https://github.com/salesagility/SuiteCRM/wiki[Wiki] -https://github.com/salesagility/SuiteCRM/pulse[Insights] - -https://github.com/salesagility/SuiteCRM/releases[Releases] -https://github.com/salesagility/SuiteCRM/tags[Tags] - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.1beta[v7.1beta] -* https://github.com/salesagility/SuiteCRM/commit/4aa8f7fda9ca15356f35d64e351f382db1d3e8e0[`4aa8f7f`] - -[[beta24]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.1beta[7.1 Beta] ------------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Feb 4, 2014 · -https://github.com/salesagility/SuiteCRM/compare/v7.1beta...develop[7741 -commits] to develop since this release - -[[assets]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.1beta.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.1beta.tar.gz[*Source -code* (tar.gz)] - -This is a beta release and should not be used in a production -environment. - -Try 7.1 Beta to preview the new features coming in 7.1 including -enhanced search, improved workflow and default theme plus social -integration. - -* https://github.com/salesagility/SuiteCRM/tree/v7.0.2[v7.0.2] -* https://github.com/salesagility/SuiteCRM/commit/d28205e9ee8043269c4cb275270a226519648285[`d28205e`] - -[[v7.0.232]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.0.2[v7.0.2] --------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Jan 20, 2014 · -https://github.com/salesagility/SuiteCRM/compare/v7.0.2...master[7226 -commits] to master since this release - -[[assets-1]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.0.2.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.0.2.tar.gz[*Source -code* (tar.gz)] - -Bug fix release which also adds in two new language translations for -Spanish and Russian - -* https://github.com/salesagility/SuiteCRM/tree/v7.0.1[v7.0.1] -* https://github.com/salesagility/SuiteCRM/commit/f60dbf5502392b8b9d90e5110cc1302bf9c5f8ee[`f60dbf5`] - -[[v7.0.1-update-readme.md38]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.0.1[v7.0.1: -Update README.md] --------------------------------------------------------------------------------------- - -image:https://avatars2.githubusercontent.com/u/1450870?s=40&v=4[@salesagility] -https://github.com/salesagility[salesagility] released this Nov 25, 2013 -· https://github.com/salesagility/SuiteCRM/compare/v7.0.1...master[7295 -commits] to master since this release - -[[assets-2]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.0.1.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.0.1.tar.gz[*Source -code* (tar.gz)] -+ -Adding details to SuiteCRM readme.md - -https://github.com/salesagility/SuiteCRM/releases?after=v7.1.5[Previous]Next - -* © 2018 GitHub, Inc. -* https://github.com/site/terms[Terms] -* https://github.com/site/privacy[Privacy] -* https://github.com/security[Security] -* https://status.github.com/[Status] -* https://help.github.com[Help] https://github.com[] -* https://github.com/contact[Contact GitHub] -* https://developer.github.com[API] -* https://training.github.com[Training] -* https://shop.github.com[Shop] -* https://github.com/blog[Blog] -* https://github.com/about[About] - -You can't perform that action at this time. - -You signed in with another tab or window. link:[Reload] to refresh your -session. You signed out in another tab or window. link:[Reload] to -refresh your session. diff --git a/_source/relnotes/releases2.adoc b/_source/relnotes/releases2.adoc deleted file mode 100644 index 669c0e518..000000000 --- a/_source/relnotes/releases2.adoc +++ /dev/null @@ -1,487 +0,0 @@ -https://github.com/salesagility/SuiteCRM/releases?after=7.9.6[Source] - -[[releases-salesagilitysuitecrm-github]] -Releases · salesagility/SuiteCRM · GitHub ------------------------------------------ - -https://github.com#start-of-content[Skip to content] - -https://github.com/[] - -* https://github.com/features[Features] -* https://github.com/business[Business] -* https://github.com/explore[Explore] -* https://github.com/marketplace[Marketplace] -* https://github.com/pricing[Pricing] - -https://github.com/salesagility/SuiteCRM/releases[This repository] - -link:/login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases%3Fafter%3D7.9.6[Sign -in] or link:/join?source=header-repo[Sign up] - -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Watch] -https://github.com/salesagility/SuiteCRM/watchers[164] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Star] -https://github.com/salesagility/SuiteCRM/stargazers[819] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Fork] -https://github.com/salesagility/SuiteCRM/network[686] - -[[salesagility15suitecrm16]] -https://github.com/salesagility[salesagility]/https://github.com/salesagility/SuiteCRM[**SuiteCRM]** ----------------------------------------------------------------------------------------------------- - -https://github.com/salesagility/SuiteCRM[Code] -https://github.com/salesagility/SuiteCRM/issues[Issues 609] -https://github.com/salesagility/SuiteCRM/pulls[Pull requests 285] -https://github.com/salesagility/SuiteCRM/wiki[Wiki] -https://github.com/salesagility/SuiteCRM/pulse[Insights] - -https://github.com/salesagility/SuiteCRM/releases[Releases] -https://github.com/salesagility/SuiteCRM/tags[Tags] - -* https://github.com/salesagility/SuiteCRM/tree/v7.8.7[v7.8.7] -* https://github.com/salesagility/SuiteCRM/commit/6f540808a0bf9334ca55013c4abe6698c580f81b[`6f54080`] - -[[v7.8.724]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.7[v7.8.7] --------------------------------------------------------------------- - -image:https://avatars0.githubusercontent.com/u/26431166?s=40&v=4[@Dillon-Brown] -https://github.com/Dillon-Brown[Dillon-Brown] released this Oct 3, 2017 -· https://github.com/salesagility/SuiteCRM/compare/v7.8.7...7.8.x[257 -commits] to 7.8.x since this release - -[[assets]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.8.7.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.8.7.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.8.7 LTS is now Available to Download* - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php/Release_notes_7.8.7[Release Notes]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -We have also updated our Security Process asking the community to send -their security issues directly to us via email -mailto:security%40suitecrm.com[security@suitecrm.com] - -We have also added a Code of Conduct to help build a more welcoming -environment for our community. + -https://github.com/salesagility/SuiteCRM/blob/master/CODE_OF_CONDUCT.md[SuiteCRM -Code of Conduct] - -* https://github.com/salesagility/SuiteCRM/tree/v7.9.5[v7.9.5] -* https://github.com/salesagility/SuiteCRM/commit/da2f36eb904933f9b5f4d5a7809ee6b26d05b43a[`da2f36e`] - -[[section]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.5[7.9.5] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Sep 6, 2017 · -https://github.com/salesagility/SuiteCRM/compare/v7.9.5...master[633 -commits] to master since this release - -[[assets-1]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.9.5.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.9.5.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.9.5 is now Available to Download* - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php/Release_notes_7.9.5[Release Notes]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -We have also updated our Security Process asking the community to send -their security issues directly to us via email -mailto:security%40suitecrm.com[security@suitecrm.com] - -We have also added a Code of Conduct to help build a more welcoming -environment for our community. + -https://github.com/salesagility/SuiteCRM/blob/master/CODE_OF_CONDUCT.md[SuiteCRM -Code of Conduct] - -* https://github.com/salesagility/SuiteCRM/tree/v7.8.6[v7.8.6] -* https://github.com/salesagility/SuiteCRM/commit/de18c84462d4e173bee9c14b0cb71dce855354cc[`de18c84`] - -[[v7.8.645]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.6[v7.8.6] --------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Sep 6, 2017 · -https://github.com/salesagility/SuiteCRM/compare/v7.8.6...7.8.x[356 -commits] to 7.8.x since this release - -[[assets-2]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.8.6.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.8.6.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.8.6 LTS is now Available to Download* - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php/Release_notes_7.8.6[Release Notes]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -We have also updated our Security Process asking the community to send -their security issues directly to us via email -mailto:security%40suitecrm.com[security@suitecrm.com] - -We have also added a Code of Conduct to help build a more welcoming -environment for our community. + -https://github.com/salesagility/SuiteCRM/blob/master/CODE_OF_CONDUCT.md[SuiteCRM -Code of Conduct] - -* https://github.com/salesagility/SuiteCRM/tree/v7.9.4[v7.9.4] -* https://github.com/salesagility/SuiteCRM/commit/24ce66ea84a8f7dbf6628c9539109bc17ec4476e[`24ce66e`] - -[[section-1]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.4[7.9.4] -------------------------------------------------------------------- - -image:https://avatars0.githubusercontent.com/u/26431166?s=40&v=4[@Dillon-Brown] -https://github.com/Dillon-Brown[Dillon-Brown] released this Jul 20, 2017 -· https://github.com/salesagility/SuiteCRM/compare/v7.9.4...master[850 -commits] to master since this release - -[[assets-3]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.9.4.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.9.4.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.9.4 is now Available to Download* - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php/Release_notes_7.9.4[Release Notes]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -We have also updated our Security Process asking the community to send -their security issues directly to us via email -mailto:security%40suitecrm.com[security@suitecrm.com] - -We have also added a Code of Conduct to help build a more welcoming -environment for our community. + -https://github.com/salesagility/SuiteCRM/blob/master/CODE_OF_CONDUCT.md[SuiteCRM -Code of Conduct] - -* https://github.com/salesagility/SuiteCRM/tree/v7.9.3[v7.9.3] -* https://github.com/salesagility/SuiteCRM/commit/3daeb36ed366d83a56609165e50048c2fa46f57a[`3daeb36`] - -[[section-2]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.3[7.9.3] -------------------------------------------------------------------- - -image:https://avatars0.githubusercontent.com/u/26431166?s=40&v=4[@Dillon-Brown] -https://github.com/Dillon-Brown[Dillon-Brown] released this Jul 17, 2017 -· https://github.com/salesagility/SuiteCRM/compare/v7.9.3...master[867 -commits] to master since this release - -[[assets-4]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.9.3.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.9.3.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.9.3 is now Available to Download* - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php/Release_notes_7.9.3[Release Notes]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -We have also updated our Security Process asking the community to send -their security issues directly to us via email -mailto:security%40suitecrm.com[security@suitecrm.com] - -We have also added a Code of Conduct to help build a more welcoming -environment for our community. + -https://github.com/salesagility/SuiteCRM/blob/master/CODE_OF_CONDUCT.md[SuiteCRM -Code of Conduct] - -Special thanks to [@sergio91pt]https://github.com/sergio91pt[64] for -raising/reviewing security issues. - -* https://github.com/salesagility/SuiteCRM/tree/v7.9.2[v7.9.2] -* https://github.com/salesagility/SuiteCRM/commit/084f2f3f1f805cea2603323b1924f998ebffe0e9[`084f2f3`] - -[[section-3]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.2[7.9.2] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Jun 30, 2017 · -https://github.com/salesagility/SuiteCRM/compare/v7.9.2...master[1109 -commits] to master since this release - -[[assets-5]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.9.2.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.9.2.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.9.2 is now Available to Download* - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php/Release_notes_7.9.2[Release Notes]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -Checkout our -https://suitecrm.com/forum/announcements/14874-suitecrm-7-9-2-maintenance-patch-now-available[SuiteCRM] -forum announcement. - -We have also updated our Security Process asking the community to send -their security issues directly to us via email -mailto:security%40suitecrm.com[security@suitecrm.com] - -* https://github.com/salesagility/SuiteCRM/tree/v7.9.1[v7.9.1] -* https://github.com/salesagility/SuiteCRM/commit/032cc000331e1d9a411e468f292e8f9d14d553fd[`032cc00`] - -[[section-4]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.1[7.9.1] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Jun 15, 2017 · -https://github.com/salesagility/SuiteCRM/compare/v7.9.1...master[1189 -commits] to master since this release - -[[assets-6]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.9.1.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.9.1.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.9.1 is now Available to Download* - -This release resolves a IMPORTANT Security Vulnerability that effect all -releases of SuiteCRM, all users of ALL previous releases are advised to -Upgrade to 7.9.1 or 7.8.5 as soon as possible. - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php/Release_notes_7.9.1[Release Notes]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -Special thanks to https://github.com/krzyc[krzyc] for notifying us of -the security issue. - -We have also updated our Security Process asking the community to send -their security issues directly to us via email -mailto:security%40suitecrm.com[security@suitecrm.com] - -* https://github.com/salesagility/SuiteCRM/tree/v7.8.5[v7.8.5] -* https://github.com/salesagility/SuiteCRM/commit/1b69962444472196760d139a65c00379f161b3ac[`1b69962`] - -[[section-5]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.5[7.8.5] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Jun 15, 2017 · -https://github.com/salesagility/SuiteCRM/compare/v7.8.5...7.8.x[375 -commits] to 7.8.x since this release - -[[assets-7]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.8.5.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.8.5.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.8.5 is now Available to Download* - -This release addresses an Important Security Issue and addresses many -other Issues - -Users of ALL previous releases are advised to Upgrade to 7.8.5 or 7.9.1 -as soon as possible - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php?title=Release_notes_7.8.5[Release -Notes] - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Special thanks to https://github.com/krzyc[krzyc] for notifying us of -the security issue. - -We have also updated our Security Process asking the community to send -their security issues directly to us via email -mailto:security%40suitecrm.com[security@suitecrm.com]. - -* https://github.com/salesagility/SuiteCRM/tree/v7.9.0[v7.9.0] -* https://github.com/salesagility/SuiteCRM/commit/2e1122effe9684c524dcc9e21b77d1eba45b4787[`2e1122e`] - -[[section-6]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.0[7.9.0] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this May 29, 2017 · -https://github.com/salesagility/SuiteCRM/compare/v7.9.0...master[1419 -commits] to master since this release - -[[assets-8]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.9.0.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.9.0.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.9.0 is now Available to Download* - -*New Email Client* New designed SuiteP Email client - see Release Notes -for more details + -*New Preferred Email Template Editor* - a new user preference to select -either a TinyMCE, Mozaik, or direct HTML + -*Improved Project Module* - Gantt chart, Project creation and task -allocation improvements + -*Updated View Summary* - Updated styling and new grouped by 'type' + -*Deprecated Suite7 & SuiteR themes* - don't worry, we have announced LTS -for 7.8.x - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php/Release_notes_7.9.0[Release Notes] -which also includes a 7.9.0 specific User Guide. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -* https://github.com/salesagility/SuiteCRM/tree/v7.8.4[v7.8.4] -* https://github.com/salesagility/SuiteCRM/commit/e7fe1d56b62f650824cbbfca1fcd8da8dda46205[`e7fe1d5`] - -[[section-7]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.4[7.8.4] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this May 29, 2017 · -https://github.com/salesagility/SuiteCRM/compare/v7.8.4...master[1958 -commits] to master since this release - -[[assets-9]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.8.4.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.8.4.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.8.4 is now Available to Download* - -SuiteCRM 7.8.4 is a Bug Fix release - -Please see the -https://suitecrm.com/wiki/index.php/Release_notes_7.8.4[Release Notes] -on list of Bug fixes noted on Github and -https://suitecrm.com/forum/index[SuiteCRM Forums]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -Special thanks to https://github.com/haris-raheem[haris-raheem] for -providing further enhancements for the Projects Module. - -https://github.com/salesagility/SuiteCRM/releases[Previous]https://github.com/salesagility/SuiteCRM/releases?after=v7.8.4[Next] - -* © 2018 GitHub, Inc. -* https://github.com/site/terms[Terms] -* https://github.com/site/privacy[Privacy] -* https://github.com/security[Security] -* https://status.github.com/[Status] -* https://help.github.com[Help] https://github.com[] -* https://github.com/contact[Contact GitHub] -* https://developer.github.com[API] -* https://training.github.com[Training] -* https://shop.github.com[Shop] -* https://github.com/blog[Blog] -* https://github.com/about[About] - -You can't perform that action at this time. - -You signed in with another tab or window. link:[Reload] to refresh your -session. You signed out in another tab or window. link:[Reload] to -refresh your session. diff --git a/_source/relnotes/releases3.adoc b/_source/relnotes/releases3.adoc deleted file mode 100644 index 57283df77..000000000 --- a/_source/relnotes/releases3.adoc +++ /dev/null @@ -1,448 +0,0 @@ -https://github.com/salesagility/SuiteCRM/releases?after=v7.8.4[Source] - -[[releases-salesagilitysuitecrm-github]] -Releases · salesagility/SuiteCRM · GitHub ------------------------------------------ - -https://github.com#start-of-content[Skip to content] - -https://github.com/[] - -* https://github.com/features[Features] -* https://github.com/business[Business] -* https://github.com/explore[Explore] -* https://github.com/marketplace[Marketplace] -* https://github.com/pricing[Pricing] - -https://github.com/salesagility/SuiteCRM/releases[This repository] - -link:/login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases%3Fafter%3Dv7.8.4[Sign -in] or link:/join?source=header-repo[Sign up] - -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Watch] -https://github.com/salesagility/SuiteCRM/watchers[164] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Star] -https://github.com/salesagility/SuiteCRM/stargazers[819] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Fork] -https://github.com/salesagility/SuiteCRM/network[686] - -[[salesagility15suitecrm16]] -https://github.com/salesagility[salesagility]/https://github.com/salesagility/SuiteCRM[**SuiteCRM]** ----------------------------------------------------------------------------------------------------- - -https://github.com/salesagility/SuiteCRM[Code] -https://github.com/salesagility/SuiteCRM/issues[Issues 609] -https://github.com/salesagility/SuiteCRM/pulls[Pull requests 285] -https://github.com/salesagility/SuiteCRM/wiki[Wiki] -https://github.com/salesagility/SuiteCRM/pulse[Insights] - -https://github.com/salesagility/SuiteCRM/releases[Releases] -https://github.com/salesagility/SuiteCRM/tags[Tags] - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.9.0-rc[v7.9.0-rc] -* https://github.com/salesagility/SuiteCRM/commit/e239cdb0b0522e48f8e366a9144bc96849bf6032[`e239cdb`] - -[[release-candidate24]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.0-rc[7.9.0 -Release Candidate] ----------------------------------------------------------------------------------------- - -image:https://avatars0.githubusercontent.com/u/26431166?s=40&v=4[@Dillon-Brown] -https://github.com/Dillon-Brown[Dillon-Brown] released this May 8, 2017 -· -https://github.com/salesagility/SuiteCRM/compare/v7.9.0-rc...develop[2245 -commits] to develop since this release - -[[assets]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.9.0-rc.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.9.0-rc.tar.gz[*Source -code* (tar.gz)] - -*This is a Release Candidate release and should not be used in a -production environment.* - -Try 7.9.0 Release Candidate to preview the new features coming in -SuiteCRM 7.9. - -The focus of SuiteCRM 7.9 is to introduce a new and responsive Email -Client and enhancements for Campaigns Email Template editor. - -https://suitecrm.com/download/download-pre-release[Click here] to get -the full details of this release and to get the upgrade package - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.9.0-beta[v7.9.0-beta] -* https://github.com/salesagility/SuiteCRM/commit/e5c3d1ce8d86ac83511e61ee53f7d68bc4e3badf[`e5c3d1c`] - -[[beta33]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.9.0-beta[7.9.0 -Beta] ------------------------------------------------------------------------------ - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Apr 25, 2017 · -https://github.com/salesagility/SuiteCRM/compare/v7.9.0-beta...develop[2391 -commits] to develop since this release - -[[assets-1]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.9.0-beta.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.9.0-beta.tar.gz[*Source -code* (tar.gz)] - -*This is a Beta release and should not be used in a production -environment.* - -Try 7.9.0 Beta to preview the new features coming in SuiteCRM 7.9. - -The focus of SuiteCRM 7.9 is to introduce a new and responsive Email -Client and enhancements for Campaigns Email Template editor. - -https://suitecrm.com/download/download-pre-release[Click here] to get -the full details of this release and to get the upgrade package - -* https://github.com/salesagility/SuiteCRM/tree/v7.8.3[v7.8.3] -* https://github.com/salesagility/SuiteCRM/commit/8b386259cf0e6123f7ba6d27a4aab32d81c19bd0[`8b38625`] - -[[section]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.3[7.8.3] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Apr 11, 2017 · -https://github.com/salesagility/SuiteCRM/compare/v7.8.3...master[2023 -commits] to master since this release - -[[assets-2]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.8.3.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.8.3.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.8.3 is now Available to Download* - -SuiteCRM 7.8.3 is a Bug Fix release - -Please see the -https://suitecrm.com/wiki/index.php/Release_notes_7.8.3[Release Notes] -on list of Bug fixes noted on Github and -https://suitecrm.com/forum/index[SuiteCRM Forums]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -* https://github.com/salesagility/SuiteCRM/tree/v7.8.2[v7.8.2] -* https://github.com/salesagility/SuiteCRM/commit/8a8a300bd7664bd3b7fb2cb6fda0f348a9dcd23e[`8a8a300`] - -[[section-1]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.2[7.8.2] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Feb 27, 2017 · -https://github.com/salesagility/SuiteCRM/compare/v7.8.2...master[2123 -commits] to master since this release - -[[assets-3]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.8.2.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.8.2.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.8.2 is now Available to Download* - -This release addresses an Important Security Issue and addresses many -other Issues - -Users of ALL previous releases are advised to Upgrade to 7.8.2 as soon -as possible - -Please see the -https://suitecrm.com/wiki/index.php/Release_notes_7.8.2[Release Notes] -on list of Bug fixes noted on Github and -https://suitecrm.com/forum/index[SuiteCRM Forums]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -* https://github.com/salesagility/SuiteCRM/tree/v7.8.1[v7.8.1] -* https://github.com/salesagility/SuiteCRM/commit/b4218b0759cf3f7d40d820bb62729d17d4e5eb31[`b4218b0`] - -[[section-2]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.1[7.8.1] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Feb 6, 2017 · -https://github.com/salesagility/SuiteCRM/compare/v7.8.1...master[2230 -commits] to master since this release - -[[assets-4]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.8.1.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.8.1.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.8.1 is now Available to Download* - -SuiteCRM 7.8.1 is a Bug Fix release - -Please see the -https://suitecrm.com/wiki/index.php/Release_notes_7.8.1[Release Notes] -on list of Bug fixes noted on Github and -https://suitecrm.com/forum/index[SuiteCRM Forums]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -* https://github.com/salesagility/SuiteCRM/tree/v7.8.0[v7.8.0] -* https://github.com/salesagility/SuiteCRM/commit/673712cc1faf269d470767430bf734e09f126b6a[`673712c`] - -[[section-3]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.0[7.8] ------------------------------------------------------------------ - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Jan 30, 2017 · -https://github.com/salesagility/SuiteCRM/compare/v7.8.0...master[2263 -commits] to master since this release - -[[assets-5]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.8.0.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.8.0.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.8 is now Available to Download* - -*New Filter* functionality which replaces the legacy Basic/Advanced -Search layouts. If you still prefer the old search view on any modules -you can add a setting within the config_overwrite.php file - see Release -Notes. + -*New Workflow Calculated fields* - a new action that allows you to enter -formulas to execute complex actions. Contributed by -http://www.dtbc.eu/[diligent technology & business consulting GmbH] + -*Improved SuiteP theme* - introduced Sass (for developers new steps will -be introduced for when contributing style changes), cleaned up CSS and -tidied up many areas of the system. - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php?title=Release_notes_7.8[Release -Notes] - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.8.0-rc[v7.8.0-rc] -* https://github.com/salesagility/SuiteCRM/commit/779ee2083a36a4c4efb4fd6c8b04c418c5241f37[`779ee20`] - -[[release-candidate72]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.0-rc[7.8 -Release Candidate] --------------------------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Jan 23, 2017 · -https://github.com/salesagility/SuiteCRM/compare/v7.8.0-rc...develop[2992 -commits] to develop since this release - -[[assets-6]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.8.0-rc.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.8.0-rc.tar.gz[*Source -code* (tar.gz)] - -*This is a Pre release and should not be used in a production -environment.* - -Try 7.8.0 RC to preview the new features coming in SuiteCRM 7.8. - -The focus of SuiteCRM 7.8 is to enhance and refine the SuiteP theme and -fix many issues - -SuiteP Rewritten in SASS, Refined List View filters, added support for -PHP 7.1 and this release includes a great contribution of Workflow -Calculated Fields from diligent technology & business consulting GmbH () - -https://suitecrm.com/download/download-pre-release[Click here] to get -the full details of this release and to get the upgrade package - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.8.0-beta.2[v7.8.0-beta.2] -* https://github.com/salesagility/SuiteCRM/commit/711cda1b5851b113c8885a9d67297bd66305ec39[`711cda1`] - -[[beta-280]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.0-beta.2[7.8 -Beta 2] -------------------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Jan 16, 2017 · -https://github.com/salesagility/SuiteCRM/compare/v7.8.0-beta.2...develop[3096 -commits] to develop since this release - -[[assets-7]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.8.0-beta.2.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.8.0-beta.2.tar.gz[*Source -code* (tar.gz)] - -*This is a Beta release and should not be used in a production -environment.* - -Try 7.8.0 Beta 2 to preview the new features coming in SuiteCRM 7.8. - -The focus of SuiteCRM 7.8 is to enhance and refine the SuiteP theme and -fix many issues - -SuiteP Rewritten in SASS, Refined List View filters and added support -for PHP 7.1 - -https://suitecrm.com/download/download-pre-release[Click here] to get -the full details of this release and to get the upgrade package - -* https://github.com/salesagility/SuiteCRM/tree/v7.7.9[v7.7.9] -* https://github.com/salesagility/SuiteCRM/commit/b64d0fd5df3e11c59387e7e3c0ea7c114a0a2361[`b64d0fd`] - -[[section-4]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.7.9[7.7.9] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Dec 31, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.7.9...master[2920 -commits] to master since this release - -[[assets-8]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.7.9.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.7.9.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.7.9 is now Available to Download* - -This release addresses an Important Security Issue and addresses many -other Issues - -Users of ALL previous releases are advised to Upgrade to 7.7.9 as soon -as possible - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php?title=Release_notes_7.7.9[Release -Notes] - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Special thanks to https://github.com/gunnicom[gunnicom] and -https://github.com/sk1p[sk1p] for notifying us of the -https://github.com/salesagility/SuiteCRM/issues/2831[security issue]. - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.8.0-beta[v7.8.0-beta] -* https://github.com/salesagility/SuiteCRM/commit/02047a72628ed38e0a768d5fbec949f898351a05[`02047a7`] - -[[beta96]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.8.0-beta[7.8 -Beta] ---------------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Dec 30, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.8.0-beta...develop[3235 -commits] to develop since this release - -[[assets-9]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.8.0-beta.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.8.0-beta.tar.gz[*Source -code* (tar.gz)] - -*This is a Beta release and should not be used in a production -environment.* - -Try 7.8.0 Beta to preview the new features coming in SuiteCRM 7.8. - -The focus of SuiteCRM 7.8 is to enhance and refine the SuiteP theme and -fix many issues - -SuiteP Rewritten in SASS and Refined List View filters - -https://suitecrm.com/download/download-pre-release[Click here] to get -the full details of this release and to get the upgrade package - -https://github.com/salesagility/SuiteCRM/releases?after=7.9.6[Previous]https://github.com/salesagility/SuiteCRM/releases?after=v7.8.0-beta[Next] - -* © 2018 GitHub, Inc. -* https://github.com/site/terms[Terms] -* https://github.com/site/privacy[Privacy] -* https://github.com/security[Security] -* https://status.github.com/[Status] -* https://help.github.com[Help] https://github.com[] -* https://github.com/contact[Contact GitHub] -* https://developer.github.com[API] -* https://training.github.com[Training] -* https://shop.github.com[Shop] -* https://github.com/blog[Blog] -* https://github.com/about[About] - -You can't perform that action at this time. - -You signed in with another tab or window. link:[Reload] to refresh your -session. You signed out in another tab or window. link:[Reload] to -refresh your session. diff --git a/_source/relnotes/releases4.adoc b/_source/relnotes/releases4.adoc deleted file mode 100644 index 07308ec90..000000000 --- a/_source/relnotes/releases4.adoc +++ /dev/null @@ -1,449 +0,0 @@ -https://github.com/salesagility/SuiteCRM/releases?after=v7.8.0-beta[Source] - -[[releases-salesagilitysuitecrm-github]] -Releases · salesagility/SuiteCRM · GitHub ------------------------------------------ - -https://github.com#start-of-content[Skip to content] - -https://github.com/[] - -* https://github.com/features[Features] -* https://github.com/business[Business] -* https://github.com/explore[Explore] -* https://github.com/marketplace[Marketplace] -* https://github.com/pricing[Pricing] - -https://github.com/salesagility/SuiteCRM/releases[This repository] - -link:/login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases%3Fafter%3Dv7.8.0-beta[Sign -in] or link:/join?source=header-repo[Sign up] - -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Watch] -https://github.com/salesagility/SuiteCRM/watchers[164] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Star] -https://github.com/salesagility/SuiteCRM/stargazers[819] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Fork] -https://github.com/salesagility/SuiteCRM/network[686] - -[[salesagility15suitecrm16]] -https://github.com/salesagility[salesagility]/https://github.com/salesagility/SuiteCRM[**SuiteCRM]** ----------------------------------------------------------------------------------------------------- - -https://github.com/salesagility/SuiteCRM[Code] -https://github.com/salesagility/SuiteCRM/issues[Issues 609] -https://github.com/salesagility/SuiteCRM/pulls[Pull requests 285] -https://github.com/salesagility/SuiteCRM/wiki[Wiki] -https://github.com/salesagility/SuiteCRM/pulse[Insights] - -https://github.com/salesagility/SuiteCRM/releases[Releases] -https://github.com/salesagility/SuiteCRM/tags[Tags] - -* https://github.com/salesagility/SuiteCRM/tree/v7.7.8[v7.7.8] -* https://github.com/salesagility/SuiteCRM/commit/7895179a585518462ef9191e93657beb12fd869a[`7895179`] - -[[section]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.7.8[7.7.8] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Nov 16, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.7.8...master[2958 -commits] to master since this release - -[[assets]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.7.8.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.7.8.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.7.8 is now Available to Download* - -SuiteCRM 7.7.8 is a Bug Fix release - -Please see the -https://suitecrm.com/wiki/index.php/Release_notes_7.7.8[Release Notes] -on list of Bug fixes noted on Github and -https://suitecrm.com/forum/index[SuiteCRM Forums]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -* https://github.com/salesagility/SuiteCRM/tree/v7.6.10[v7.6.10] -* https://github.com/salesagility/SuiteCRM/commit/d18587a0d90baa95571954c488b00cd07b50d324[`d18587a`] - -[[section-1]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.6.10[7.6.10] ---------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Nov 16, 2016 - -[[assets-1]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.6.10.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.6.10.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.6.10 is now Available to Download* - -This release addresses the bug for search using MultiSelect fields - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php?title=Release_notes_7.6.10[Release -Notes] - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -* https://github.com/salesagility/SuiteCRM/tree/v7.7.7[v7.7.7] -* https://github.com/salesagility/SuiteCRM/commit/cdabd015b3728ec8a7a5483f6294b9de9d7a769d[`cdabd01`] - -[[section-2]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.7.7[7.7.7] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Nov 7, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.7.7...master[2996 -commits] to master since this release - -[[assets-2]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.7.7.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.7.7.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.7.7 is now Available to Download* - -This release addresses Important Security Issues and addresses many -other Issues - -Users of ALL previous releases are advised to Upgrade to 7.7.7 as soon -as possible - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php?title=Release_notes_7.7.7[Release -Notes] - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Special thanks for http://karmainsecurity.com[Egidio Romano] for -notifying us of these security issues. - -* https://github.com/salesagility/SuiteCRM/tree/v7.6.9[v7.6.9] -* https://github.com/salesagility/SuiteCRM/commit/e26387d054527ed407ab6de0a1b68e238a0d0447[`e26387d`] - -[[section-3]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.6.9[7.6.9] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Nov 7, 2016 - -[[assets-3]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.6.9.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.6.9.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.6.9 is now Available to Download* - -This release addresses Important Security Issues and other core -functionality - -Users of ALL previous releases are advised to Upgrade to 7.6.9 as soon -as possible - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php?title=Release_notes_7.6.9[Release -Notes] - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Special thanks for http://karmainsecurity.com[Egidio Romano] for -notifying us of these security issues. - -* https://github.com/salesagility/SuiteCRM/tree/v7.7.6[v7.7.6] -* https://github.com/salesagility/SuiteCRM/commit/40f148803d60246dff9cf88e2dfe100d76d2fa05[`40f1488`] - -[[section-4]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.7.6[7.7.6] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Oct 19, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.7.6...master[3066 -commits] to master since this release - -[[assets-4]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.7.6.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.7.6.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.7.6 is now Available to Download* - -This release addresses Important Security Issues and addresses many -other Issues - -Users of ALL previous releases are advised to Upgrade to 7.7.6 as soon -as possible - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php?title=Release_notes_7.7.6[Release -Notes] - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Special thanks for http://karmainsecurity.com[Egidio Romano] for -notifying us of these security issues. - -* https://github.com/salesagility/SuiteCRM/tree/v7.6.8[v7.6.8] -* https://github.com/salesagility/SuiteCRM/commit/7c22bc3eeebd425f4359101f9fb465c33d8569a5[`7c22bc3`] - -[[section-5]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.6.8[7.6.8] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Oct 19, 2016 - -[[assets-5]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.6.8.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.6.8.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.6.8 is now Available to Download* - -This release addresses Important Security Issues and addresses Report -Issues - -Users of ALL previous releases are advised to Upgrade to 7.6.8 as soon -as possible - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php?title=Release_notes_7.6.8[Release -Notes] - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Special thanks for http://karmainsecurity.com[Egidio Romano] for -notifying us of these security issues. - -* https://github.com/salesagility/SuiteCRM/tree/v7.7.5[v7.7.5] -* https://github.com/salesagility/SuiteCRM/commit/b96b7c74c7645a28ce86f33dc4ced647f4bbe705[`b96b7c7`] - -[[section-6]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.7.5[7.7.5] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Sep 28, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.7.5...master[3256 -commits] to master since this release - -[[assets-6]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.7.5.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.7.5.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.7.5 is now Available to Download* - -* Updates a Security vulnerability with Serialized Input, to prevent -possible object,file, beans and SQL injection attacks -* Bug fixes and UI styling for a variety of areas include, Reports, -Calendar, Responsiveness and more. - -Please see the -https://suitecrm.com/wiki/index.php/Release_notes_7.7.5[Release Notes] -on list of Bug fixes noted on Github and -https://suitecrm.com/forum/index[SuiteCRM Forums]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Special thanks for http://karmainsecurity.com[Egidio Romano] for -notifying us of this security update. - -Thank you to all community members who logged bugs and contributed to -this release. - -* https://github.com/salesagility/SuiteCRM/tree/v7.6.7[v7.6.7] -* https://github.com/salesagility/SuiteCRM/commit/419a9ef2a88891303ab87aa5c7ad818cc9fed6b6[`419a9ef`] - -[[section-7]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.6.7[7.6.7] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Sep 28, 2016 - -[[assets-7]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.6.7.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.6.7.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.6.7 is now Available to Download* - -Includes SugarCRM 6.5.24 - -http://support.sugarcrm.com/Documentation/Sugar_Versions/6.5/CE/Sugar_Release_Notes_6.5.24/[more -information here] + -Updates a Security vulnerability with Serialized Input, to prevent -possible object,file, beans and SQL injection attacks - -Users of ALL previous releases are advised to Upgrade to 7.6.7 as soon -as possible - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php?title=Release_notes_7.6.7[Release -Notes] - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Special thanks for http://karmainsecurity.com[Egidio Romano] and -https://github.com/salesagility/SuiteCRM/issues/1843[adminibt] for -notifying us of this security update. - -* https://github.com/salesagility/SuiteCRM/tree/v7.7.4[v7.7.4] -* https://github.com/salesagility/SuiteCRM/commit/932b87108edc154dd3c9c86b57ceaa24acd40835[`932b871`] - -[[section-8]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.7.4[7.7.4] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Aug 31, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.7.4...master[3361 -commits] to master since this release - -[[assets-8]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.7.4.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.7.4.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.7.4 is now Available to Download* - -SuiteCRM 7.7.4 includes bug fixes for dropdown editor (browser -specific), dashlets, calendar, studio layout updates and improve styling -on top bar for non module filter settings. - -Please see the -https://suitecrm.com/wiki/index.php/Release_notes_7.7.4[Release Notes] -on list of Bug fixes noted on Github and -https://suitecrm.com/forum/index[SuiteCRM Forums]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -* https://github.com/salesagility/SuiteCRM/tree/v7.7.3[v7.7.3] -* https://github.com/salesagility/SuiteCRM/commit/ba95cd5e21c57317fb5be278091c013dfb5a9eb7[`ba95cd5`] - -[[section-9]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.7.3[7.7.3] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Aug 26, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.7.3...master[3411 -commits] to master since this release - -[[assets-9]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.7.3.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.7.3.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.7.3 is now Available to Download* - -SuiteCRM 7.7.3 includes a fix due to a regression issue with basic -search, this release also includes PHP 5.3 for Spots modules, fix the -ability to drag Dashlets to multi column Dashboards and have collapsible -subpanels system setting. - -Please see the -https://suitecrm.com/wiki/index.php/Release_notes_7.7.3[Release Notes] -on list of Bug fixes noted on Github and -https://suitecrm.com/forum/index[SuiteCRM Forums]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -https://github.com/salesagility/SuiteCRM/releases?after=v7.8.4[Previous]https://github.com/salesagility/SuiteCRM/releases?after=v7.7.3[Next] - -* © 2018 GitHub, Inc. -* https://github.com/site/terms[Terms] -* https://github.com/site/privacy[Privacy] -* https://github.com/security[Security] -* https://status.github.com/[Status] -* https://help.github.com[Help] https://github.com[] -* https://github.com/contact[Contact GitHub] -* https://developer.github.com[API] -* https://training.github.com[Training] -* https://shop.github.com[Shop] -* https://github.com/blog[Blog] -* https://github.com/about[About] - -You can't perform that action at this time. - -You signed in with another tab or window. link:[Reload] to refresh your -session. You signed out in another tab or window. link:[Reload] to -refresh your session. diff --git a/_source/relnotes/releases5.adoc b/_source/relnotes/releases5.adoc deleted file mode 100644 index fc382c8bd..000000000 --- a/_source/relnotes/releases5.adoc +++ /dev/null @@ -1,490 +0,0 @@ -https://github.com/salesagility/SuiteCRM/releases?after=v7.7.3[Source] - -[[releases-salesagilitysuitecrm-github]] -Releases · salesagility/SuiteCRM · GitHub ------------------------------------------ - -https://github.com#start-of-content[Skip to content] - -https://github.com/[] - -* https://github.com/features[Features] -* https://github.com/business[Business] -* https://github.com/explore[Explore] -* https://github.com/marketplace[Marketplace] -* https://github.com/pricing[Pricing] - -https://github.com/salesagility/SuiteCRM/releases[This repository] - -link:/login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases%3Fafter%3Dv7.7.3[Sign -in] or link:/join?source=header-repo[Sign up] - -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Watch] -https://github.com/salesagility/SuiteCRM/watchers[164] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Star] -https://github.com/salesagility/SuiteCRM/stargazers[819] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Fork] -https://github.com/salesagility/SuiteCRM/network[686] - -[[salesagility15suitecrm16]] -https://github.com/salesagility[salesagility]/https://github.com/salesagility/SuiteCRM[**SuiteCRM]** ----------------------------------------------------------------------------------------------------- - -https://github.com/salesagility/SuiteCRM[Code] -https://github.com/salesagility/SuiteCRM/issues[Issues 609] -https://github.com/salesagility/SuiteCRM/pulls[Pull requests 285] -https://github.com/salesagility/SuiteCRM/wiki[Wiki] -https://github.com/salesagility/SuiteCRM/pulse[Insights] - -https://github.com/salesagility/SuiteCRM/releases[Releases] -https://github.com/salesagility/SuiteCRM/tags[Tags] - -* https://github.com/salesagility/SuiteCRM/tree/v7.7.2[v7.7.2] -* https://github.com/salesagility/SuiteCRM/commit/9b3cc99ce45c5b1e43f76571e6dc255e671db08a[`9b3cc99`] - -[[section]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.7.2[7.7.2] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Aug 23, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.7.2...master[3446 -commits] to master since this release - -[[assets]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.7.2.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.7.2.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.7.2 is now Available to Download* - -SuiteCRM 7.7.2 features bug fixes for calendar, php7, MSSQL upgrades and -improves Theme SuiteP UI and functionality - -Please see the -https://suitecrm.com/wiki/index.php/Release_notes_7.7.2[Release Notes] -on list of Bug fixes noted on Github and -https://suitecrm.com/forum/index[SuiteCRM Forums]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -* https://github.com/salesagility/SuiteCRM/tree/v7.7.1[v7.7.1] -* https://github.com/salesagility/SuiteCRM/commit/8e8f82695c15cf55df3fe606002ecde1718bef7f[`8e8f826`] - -[[section-1]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.7.1[7.7.1] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Aug 11, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.7.1...master[3575 -commits] to master since this release - -[[assets-1]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.7.1.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.7.1.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.7.1 is now Available to Download* - -SuiteCRM 7.7.1 features bug fixes, improves Theme SuiteP UI and -functionality - -Please see the -https://suitecrm.com/wiki/index.php/Release_notes_7.7.1[Release Notes] -on list of Bug fixes noted on Github and -https://suitecrm.com/forum/index[SuiteCRM Forums]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -* https://github.com/salesagility/SuiteCRM/tree/v7.7[v7.7] -* https://github.com/salesagility/SuiteCRM/commit/e40feec9a51e5cb0c40a271eabfda466947de897[`e40feec`] - -[[section-2]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.7[7.7] ---------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Aug 2, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.7...master[3637 -commits] to master since this release - -[[assets-2]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.7.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.7.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.7 is now Available to Download* - -*SuiteP Theme* - We want SuiteCRM 7.7 to be something special this -Summer. Packed with new and improved features and an amazing new UI, it -will transform the way you view SuiteCRM. + -*Analytic Reporting Tool - "SuiteSpots"* - Using Drag and Drop -functionality you can create in depth Pivot Tables and charts using your -customer data. + -*Module Group Selection upon Installation Configurations* - When -installing you can choose which groups of modules you wish to include as -default. This will give users the choice of how what they feel they need -from the word go. + -*Updated* Silent Installer + -*New Calendar* library + -*New Search filter* for Event Delegates subpanel + -*Improved* Project and Project Templates functionality - -== Security == + -Includes *SugarCRM 6.5.24* - more information here - () - -Special thanks for -https://github.com/salesagility/SuiteCRM/issues/1843[adminibt] for -notifying us of this security update. - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php?title=Release_notes_7.7[Release -Notes] - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.7-rc2[v7.7-rc2] -* https://github.com/salesagility/SuiteCRM/commit/864eb31d4175bf09dd9a14de1ec0bc4af16b525f[`864eb31`] - -[[release-candidate-250]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.7-rc2[7.7 -Release Candidate 2] ---------------------------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Jul 26, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.7-rc2...develop[4375 -commits] to develop since this release - -[[assets-3]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.7-rc2.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.7-rc2.tar.gz[*Source -code* (tar.gz)] - -*This is a release candidate release and should not be used in a -production environment.* - -Try 7.7 Release Candidate 2 to preview the new features coming in -SuiteCRM 7.7. - -The focus of SuiteCRM 7.7 Release Candidate 2 is to introduce our new -theme SuiteP (SuitePea). - -* Further adding to the SuiteP theme -* Improvements in Project Templates and Projects functionality -* Introducing Business Hours Module -* Search Filter by Events Delegates -* Bug fixes for Email Assignment notifications, Pipeline By Sales Stage -Dashlet, and more - -https://suitecrm.com/download/download-pre-release[Click here] to get -the full details of this release and to get the upgrade package from -7.5.x, 7.6.x, 7.7beta1, 7.7beta2 and 7.7.RC - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.7-rc[v7.7-rc] -* https://github.com/salesagility/SuiteCRM/commit/8706c4960882fecf43eb4883d80eb82b8713917c[`8706c49`] - -[[release-candidate57]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.7-rc[7.7 -Release Candidate] ------------------------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Jul 18, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.7-rc...develop[4535 -commits] to develop since this release - -[[assets-4]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.7-rc.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.7-rc.tar.gz[*Source -code* (tar.gz)] - -*This is a release candidate release and should not be used in a -production environment.* - -Try 7.7 Release Candidate to preview the new features coming in SuiteCRM -7.7. - -The focus of SuiteCRM 7.7 Release Candidate is to introduce our new -theme SuiteP (SuitePea). - -https://suitecrm.com/download/download-pre-release[Click here] to get -the full details of this release and to get the upgrade package from -7.5.x, 7.6.x, 7.7beta1 and 7.7beta2 - -* https://github.com/salesagility/SuiteCRM/tree/v7.6.6[v7.6.6] -* https://github.com/salesagility/SuiteCRM/commit/a6545196033a6ef3f9ddbf6a2babbbb351072798[`a654519`] - -[[section-3]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.6.6[7.6.6] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Jul 18, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.6.6...master[4135 -commits] to master since this release - -[[assets-5]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.6.6.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.6.6.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.6.6 is now Available to Download* - -This release resolves Multiple XSS Vulnerabilities in Yahoo YUI -component & YUI IO Utility - -** Removes the use of uploader.swf file (and references) within -self-hosted YUI library that can be vulnerable to XSS attacks - -Users of ALL previous releases are advised to Upgrade to 7.5.5 or 7.6.6 -as soon as possible - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php?title=Release_notes_7.6.6[Release -Notes] - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. + -Special thanks to -https://github.com/salesagility/SuiteCRM/issues/1724[chadbennett] for -alerting and helping us resolve this vulnerability. - -* https://github.com/salesagility/SuiteCRM/tree/v7.5.5[v7.5.5] -* https://github.com/salesagility/SuiteCRM/commit/f2e0e7f49c4a2ed689dface44ff8457041a7200a[`f2e0e7f`] - -[[section-4]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.5.5[7.5.5] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Jul 20, 2016 - -[[assets-6]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.5.5.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.5.5.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.5.5 is now Available to Download* - -This release resolves Multiple XSS Vulnerabilities in Yahoo YUI -component & YUI IO Utility - -** Removes the use of uploader.swf file (and references) within -self-hosted YUI library that can be vulnerable to XSS attacks - -Users of ALL previous releases are advised to Upgrade to 7.5.5 or 7.6.6 -as soon as possible - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. + -Special thanks to -https://github.com/salesagility/SuiteCRM/issues/1724[chadbennett] for -alerting and helping us resolve this vulnerability. - -* https://github.com/salesagility/SuiteCRM/tree/v7.6.5[v7.6.5] -* https://github.com/salesagility/SuiteCRM/commit/5b259a52b832e8f46ba06a00e95783a6aa065295[`5b259a5`] - -[[section-5]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.6.5[7.6.5] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Jul 4, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.6.5...master[4143 -commits] to master since this release - -[[assets-7]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.6.5.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.6.5.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.6.5 is now Available to Download* - -This release resolves a Security vulnerability with Serialized Input, to -prevent possible object injection attacks - -Users of ALL previous releases are advised to Upgrade to 7.5.4 or 7.6.5 -as soon as possible - -For more detail and to see all issues addressed in this release view the -https://suitecrm.com/wiki/index.php?title=Release_notes_7.6.5[Release -Notes] - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. + -Special thanks to http://karmainsecurity.com[Egidio Romano] for alerting -and helping us resolve this vulnerability. - -* https://github.com/salesagility/SuiteCRM/tree/v7.5.4[v7.5.4] -* https://github.com/salesagility/SuiteCRM/commit/f128b63e37e97c58f20f5a81d6f5a8b22511a43f[`f128b63`] - -Verified - -This tag was signed with a *verified signature*. - -https://github.com/mattlorimer[image:https://avatars2.githubusercontent.com/u/6449723?s=64&v=4[@mattlorimer]] -https://github.com/mattlorimer[mattlorimer] Matt Lorimer - -GPG key ID: D7B45FDF7506BF33 -https://help.github.com/articles/signing-commits-with-gpg/[Learn about -signing commits] - -[[section-6]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.5.4[7.5.4] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Jul 4, 2016 - -[[assets-8]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.5.4.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.5.4.tar.gz[*Source -code* (tar.gz)] - -SuiteCRM 7.5.4 is now Available to Download - -This release resolves a Security vulnerability with Serialized Input, to -prevent possible object injection attacks - -* Removes the option to allow serialized user input to the SuiteCRM Rest -Client. -* Changed serialized User input to use JSON - -Users of ALL previous releases are advised to Upgrade to 7.5.4 or 7.6.5 -as soon as possible - -Download here from the SuiteCRM GitHub Repository or visit the official -website to find the appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. + -Special thanks to http://karmainsecurity.com[Egidio Romano] for alerting -and helping us resolve this vulnerability. - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.7-beta2[v7.7-beta2] -* https://github.com/salesagility/SuiteCRM/commit/7c1bda85a44757e681346d2f450dacea8ca54849[`7c1bda8`] - -[[beta293]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.7-beta2[7.7 -Beta2] ---------------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Jun 27, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.7-beta2...develop[4737 -commits] to develop since this release - -[[assets-9]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.7-beta2.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.7-beta2.tar.gz[*Source -code* (tar.gz)] - -*This is a beta release and should not be used in a production -environment.* - -Try 7.7 Beta 2 to preview the new features coming in SuiteCRM 7.7. - -The focus of SuiteCRM 7.7 beta 2 is to introduce our new theme SuiteP -(SuitePea). - -Fixes for Campaigns, Sending Emails and other bugs. - -https://suitecrm.com/download/download-pre-release[Click here] to get -the full details of this release and to get the upgrade package from -7.4.x, 7.5.x, 7.6.x and 7.7beta1 - -https://github.com/salesagility/SuiteCRM/releases?after=v7.8.0-beta[Previous]https://github.com/salesagility/SuiteCRM/releases?after=v7.7-beta2[Next] - -* © 2018 GitHub, Inc. -* https://github.com/site/terms[Terms] -* https://github.com/site/privacy[Privacy] -* https://github.com/security[Security] -* https://status.github.com/[Status] -* https://help.github.com[Help] https://github.com[] -* https://github.com/contact[Contact GitHub] -* https://developer.github.com[API] -* https://training.github.com[Training] -* https://shop.github.com[Shop] -* https://github.com/blog[Blog] -* https://github.com/about[About] - -You can't perform that action at this time. - -You signed in with another tab or window. link:[Reload] to refresh your -session. You signed out in another tab or window. link:[Reload] to -refresh your session. diff --git a/_source/relnotes/releases6.adoc b/_source/relnotes/releases6.adoc deleted file mode 100644 index 5ffb9163f..000000000 --- a/_source/relnotes/releases6.adoc +++ /dev/null @@ -1,501 +0,0 @@ -https://github.com/salesagility/SuiteCRM/releases?after=v7.7-beta2[Source] - -[[releases-salesagilitysuitecrm-github]] -Releases · salesagility/SuiteCRM · GitHub ------------------------------------------ - -https://github.com#start-of-content[Skip to content] - -https://github.com/[] - -* https://github.com/features[Features] -* https://github.com/business[Business] -* https://github.com/explore[Explore] -* https://github.com/marketplace[Marketplace] -* https://github.com/pricing[Pricing] - -https://github.com/salesagility/SuiteCRM/releases[This repository] - -link:/login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases%3Fafter%3Dv7.7-beta2[Sign -in] or link:/join?source=header-repo[Sign up] - -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Watch] -https://github.com/salesagility/SuiteCRM/watchers[164] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Star] -https://github.com/salesagility/SuiteCRM/stargazers[819] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Fork] -https://github.com/salesagility/SuiteCRM/network[686] - -[[salesagility15suitecrm16]] -https://github.com/salesagility[salesagility]/https://github.com/salesagility/SuiteCRM[**SuiteCRM]** ----------------------------------------------------------------------------------------------------- - -https://github.com/salesagility/SuiteCRM[Code] -https://github.com/salesagility/SuiteCRM/issues[Issues 609] -https://github.com/salesagility/SuiteCRM/pulls[Pull requests 285] -https://github.com/salesagility/SuiteCRM/wiki[Wiki] -https://github.com/salesagility/SuiteCRM/pulse[Insights] - -https://github.com/salesagility/SuiteCRM/releases[Releases] -https://github.com/salesagility/SuiteCRM/tags[Tags] - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.7-beta1[v7.7-beta1] -* https://github.com/salesagility/SuiteCRM/commit/6c2f119627fd62eec03ad8144f7f44e181d34ef3[`6c2f119`] - -[[beta24]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.7-beta1[7.7 -Beta] --------------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Jun 15, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.7-beta1...develop[4815 -commits] to develop since this release - -[[assets]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.7-beta1.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.7-beta1.tar.gz[*Source -code* (tar.gz)] - -*This is a beta release and should not be used in a production -environment.* - -Try 7.7 Beta 1 to preview the new features coming in SuiteCRM 7.7. - -The focus of SuiteCRM 7.7 is to introduce our new Analytical Reporting -Tool - SuiteSpots, and provide more options upon installing SuiteCRM. - -The first Beta release includes enhancements to the following: - -*New Analytic Reporting Tool* - *SuiteSpots* - Using Drag and Drop -functionality you can create in depth Pivot Tables and charts using your -customer data. - -*New Module Group Selection upon installation Configurations* - When -installing you can choose which groups of modules you wish to include as -default. This will give users the choice of what modules they need from -the word go. - -Fixes for Campaigns, Calls/Meetings Reminders and other bugs - -https://suitecrm.com/download/download-pre-release[Click here] to get -the full details of this release and to get the upgrade package from -7.4.x, 7.5.x, and 7.6.x - -* https://github.com/salesagility/SuiteCRM/tree/v7.6.4[v7.6.4] -* https://github.com/salesagility/SuiteCRM/commit/4c7587b97748092cda481896a94c18d52c119a5a[`4c7587b`] - -[[section]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.6.4[7.6.4] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this May 30, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.6.4...master[4245 -commits] to master since this release - -[[assets-1]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.6.4.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.6.4.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.6.4 is now Available to Download* - -SuiteCRM 7.6.4 features bug fixes, improves Campaign Wizard UI and -improves Reporting functionality on MSSQL servers - -Add the budget fields into Campaign Header screen + -Test emails send out immediately (rather than queued) + -Improved UI for creating Email Marketing Records and Templates via the -Wizard + -Update the Campaign Wizard Summary's interface + -And more below: - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -* https://github.com/salesagility/SuiteCRM/tree/v7.6.3[v7.6.3] -* https://github.com/salesagility/SuiteCRM/commit/084b51c91dc5ef34dd3dfe63a262dc8901dfb7a4[`084b51c`] - -[[section-1]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.6.3[7.6.3] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this May 17, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.6.3...master[4401 -commits] to master since this release - -[[assets-2]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.6.3.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.6.3.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.6.3 is now Available to Download* - -This is a bug fix release for SuiteCRM 7.6.x and includes updated -Campaign Wizard UI, resolving issues with running scheduled email -campaigns and upgrading using MSSQL. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -* https://github.com/salesagility/SuiteCRM/tree/v7.6.2[v7.6.2] -* https://github.com/salesagility/SuiteCRM/commit/a833c2e504219682ccf1f2048584880ae1121318[`a833c2e`] - -[[section-2]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.6.2[7.6.2] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this May 10, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.6.2...master[4499 -commits] to master since this release - -[[assets-3]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.6.2.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.6.2.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.6.2 is now Available to Download* - -This is a bug fix release for SuiteCRM 7.6.2 and includes updated -Campaign Wizard UI. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -View -https://suitecrm.com/wiki/index.php/Release_notes_7.6.2#SuiteCRM_7.6.2[release -notes] - -Thank you to all community members who logged bugs and contributed to -this release. - -* https://github.com/salesagility/SuiteCRM/tree/v7.6.1[v7.6.1] -* https://github.com/salesagility/SuiteCRM/commit/58f496e71ba249896d5e57523d5092f09bbb8965[`58f496e`] - -[[section-3]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.6.1[7.6.1] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this May 2, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.6.1...master[4616 -commits] to master since this release - -[[assets-4]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.6.1.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.6.1.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.6.1 is now Available to Download* - -This is a bug fix release for SuiteCRM 7.6 to resolve legacy -customisations https://github.com/salesagility/SuiteCRM/issues/1300[code -issue] when upgrading to 7.6. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -View -https://suitecrm.com/wiki/index.php/Release_notes_7.6.1#SuiteCRM_7.6.1[release -notes] - -Thank you to all community members who logged bugs and contributed to -this release. - -* https://github.com/salesagility/SuiteCRM/tree/v7.6[v7.6] -* https://github.com/salesagility/SuiteCRM/commit/c78e63d748fc57c5d64dbae4c7f45b584d691024[`c78e63d`] - -[[section-4]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.6[7.6] ---------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Apr 27, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.6...master[4633 -commits] to master since this release - -[[assets-5]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.6.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.6.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.6 is now Officially Available to Download* - -SuiteCRM 7.6, the latest cutting edge release, focuses on enhancing the -functionality of the native Campaign module as well as including the -latest bug fixes. - -The release includes the latest enhancements to the following: - -*Campaign Wizard* - A simplified Campaign Wizard that is easily -understood. Includes an enhanced UI and progress bar. - -*Email Templates* - The ability to add Tracker Links to Email Templates -while creating the template so that they do not need to be created -beforehand. - -*Web To Lead Form* - Web-To-Lead Forms are now HTML 5 compliant for -easier integration with modern Websites. - -*Target List* - Create Target Lists of Contacts based on associated -Accounts. This allows for contact lists to be segmented by Account -properties without the need to use a report. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who contributed, tested and helped -with this release. - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.6-rc[v7.6-rc] -* https://github.com/salesagility/SuiteCRM/commit/c690a1063e32de85f727be51235c20212556c79f[`c690a10`] - -[[release-candidate67]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.6-rc[7.6 -Release Candidate] ------------------------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Apr 20, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.6-rc...develop[5348 -commits] to develop since this release - -[[assets-6]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.6-rc.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.6-rc.tar.gz[*Source -code* (tar.gz)] - -*This is a Release Candidate and should not be used in a production -environment.* - -Try 7.6 Release Candidate to preview the new features coming in SuiteCRM -7.6. - -The focus of SuiteCRM 7.6 is to enhance the functionality of the native -Campaign module. - -The Release Candidate includes the latest enhancements to the following: - -*Campaign Wizard* - A simplified Campaign Wizard that is easily -understood. Includes an enhanced UI and progress bar. - -*Email Templates* - The ability to add Tracker Links to Email Templates -while creating the template so that they do not need to be created -beforehand. - -*Web To Lead Form* - Web-To-Lead Forms are now HTML 5 compliant for -easier integration with modern Websites. - -*Target List* - Create Target Lists of Contacts based on associated -Accounts. This allows for contact lists to be segmented by Account -properties without the need to use a report. - -https://suitecrm.com/download/download-pre-release[Click here] to get -the full details of this release and to get the upgrade packs - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.6-beta.2[v7.6-beta.2] -* https://github.com/salesagility/SuiteCRM/commit/cdcf76cb830d296e8de1739e9313a276b48cefd1[`cdcf76c`] - -[[beta-273]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.6-beta.2[7.6 -Beta 2] ------------------------------------------------------------------------------ - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Apr 13, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.6-beta.2...develop[5403 -commits] to develop since this release - -[[assets-7]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.6-beta.2.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.6-beta.2.tar.gz[*Source -code* (tar.gz)] - -*This is a beta release and should not be used in a production -environment.* - -Try 7.6 Beta 2 to preview the new features coming in SuiteCRM 7.6. - -The focus of SuiteCRM 7.6 is to enhance the functionality of the native -Campaign module. - -This Beta release includes the latest enhancements to the following: - -*Campaign Wizard* - A simplified Campaign Wizard that is easily -understood. Includes an enhanced UI and progress bar. - -*Email Templates* - The ability to add Tracker Links to Email Templates -while creating the template so that they do not need to be created -beforehand. - -*Web To Lead Form* - Web-To-Lead Forms are now HTML 5 compliant for -easier integration with modern Websites. - -*Target List* - Create Target Lists of Contacts based on associated -Accounts. This allows for contact lists to be segmented by Account -properties without the need to use a report. - -https://suitecrm.com/download/download-pre-release[Click here] to get -the full details of this release and to get the upgrade packs - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.6-beta-1[v7.6-beta-1] -* https://github.com/salesagility/SuiteCRM/commit/2b7e73bea6c5e34f1ab042af4787066d8cfaaa3f[`2b7e73b`] - -[[beta81]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.6-beta-1[7.6 -Beta] ---------------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/4041275?s=40&v=4[@samus-aran] -https://github.com/samus-aran[samus-aran] released this Mar 30, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.6-beta-1...develop[5489 -commits] to develop since this release - -[[assets-8]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.6-beta-1.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.6-beta-1.tar.gz[*Source -code* (tar.gz)] - -*This is a beta release and should not be used in a production -environment.* - -Try 7.6 Beta 1 to preview the new features coming in SuiteCRM 7.6. - -The focus of SuiteCRM 7.6 is to enhance the functionality of the native -Campaign module. - -The first Beta release includes enhancements to the following: - -*Campaign Wizard* - A simplified Campaign Wizard that is easily -understood. Includes an enhanced UI and progress bar. - -*Email Templates* - The ability to add Tracker Links to Email Templates -while creating the template so that they do not need to be created -beforehand. - -*Web To Lead Form* - Web-To-Lead Forms are now HTML 5 compliant for -easier integration with modern Websites. - -*Target List* - Create Target Lists of Contacts based on associated -Accounts. This allows for contact lists to be segmented by Account -properties without the need to use a report. - -https://suitecrm.com/download/download-pre-release[Click here] to get -the full details of this release and to get the upgrade package from -7.4.x and 7.5.x - -* https://github.com/salesagility/SuiteCRM/tree/v7.5.3[v7.5.3] -* https://github.com/salesagility/SuiteCRM/commit/26fbd737a47163bff07e1ff828fc488e7e5075bb[`26fbd73`] - -[[section-5]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.5.3[7.5.3] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Mar 15, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.5.3...master[5058 -commits] to master since this release - -[[assets-9]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.5.3.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.5.3.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.5.3 is now Officially Available to Download* - -This release resolves Security Issues and other various issues - -Its is recommended to update to 7.5.3 as soon as possible - -For more information view the release notes on the SuiteCRM Wiki -https://suitecrm.com/wiki/index.php/Release_notes_7.5.3[here]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who contributed, tested and helped -with this release. - -https://github.com/salesagility/SuiteCRM/releases?after=v7.7.3[Previous]https://github.com/salesagility/SuiteCRM/releases?after=v7.5.3[Next] - -* © 2018 GitHub, Inc. -* https://github.com/site/terms[Terms] -* https://github.com/site/privacy[Privacy] -* https://github.com/security[Security] -* https://status.github.com/[Status] -* https://help.github.com[Help] https://github.com[] -* https://github.com/contact[Contact GitHub] -* https://developer.github.com[API] -* https://training.github.com[Training] -* https://shop.github.com[Shop] -* https://github.com/blog[Blog] -* https://github.com/about[About] - -You can't perform that action at this time. - -You signed in with another tab or window. link:[Reload] to refresh your -session. You signed out in another tab or window. link:[Reload] to -refresh your session. diff --git a/_source/relnotes/releases7.adoc b/_source/relnotes/releases7.adoc deleted file mode 100644 index 7dc8b2fce..000000000 --- a/_source/relnotes/releases7.adoc +++ /dev/null @@ -1,425 +0,0 @@ -https://github.com/salesagility/SuiteCRM/releases?after=v7.5.3[Source] - -[[releases-salesagilitysuitecrm-github]] -Releases · salesagility/SuiteCRM · GitHub ------------------------------------------ - -https://github.com#start-of-content[Skip to content] - -https://github.com/[] - -* https://github.com/features[Features] -* https://github.com/business[Business] -* https://github.com/explore[Explore] -* https://github.com/marketplace[Marketplace] -* https://github.com/pricing[Pricing] - -https://github.com/salesagility/SuiteCRM/releases[This repository] - -link:/login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases%3Fafter%3Dv7.5.3[Sign -in] or link:/join?source=header-repo[Sign up] - -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Watch] -https://github.com/salesagility/SuiteCRM/watchers[164] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Star] -https://github.com/salesagility/SuiteCRM/stargazers[819] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Fork] -https://github.com/salesagility/SuiteCRM/network[686] - -[[salesagility15suitecrm16]] -https://github.com/salesagility[salesagility]/https://github.com/salesagility/SuiteCRM[**SuiteCRM]** ----------------------------------------------------------------------------------------------------- - -https://github.com/salesagility/SuiteCRM[Code] -https://github.com/salesagility/SuiteCRM/issues[Issues 609] -https://github.com/salesagility/SuiteCRM/pulls[Pull requests 285] -https://github.com/salesagility/SuiteCRM/wiki[Wiki] -https://github.com/salesagility/SuiteCRM/pulse[Insights] - -https://github.com/salesagility/SuiteCRM/releases[Releases] -https://github.com/salesagility/SuiteCRM/tags[Tags] - -* https://github.com/salesagility/SuiteCRM/tree/v7.5.2[v7.5.2] -* https://github.com/salesagility/SuiteCRM/commit/b099183355f664d754c8e9065bae12c868c2d6d6[`b099183`] - -[[section]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.5.2[7.5.2] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Mar 7, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.5.2...master[5101 -commits] to master since this release - -[[assets]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.5.2.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.5.2.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.5.2 is now Officially Available to Download* - -This is a bug fix release for SuiteCRM 7.5 release. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -* https://github.com/salesagility/SuiteCRM/tree/v7.5.1[v7.5.1] -* https://github.com/salesagility/SuiteCRM/commit/a75ecc22a3ae6a098cf7b2c597eede61d698fe6a[`a75ecc2`] - -[[section-1]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.5.1[7.5.1] -------------------------------------------------------------------- - -image:https://avatars3.githubusercontent.com/u/5641419?s=40&v=4[@willrennie] -https://github.com/willrennie[willrennie] released this Jan 26, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.5.1...master[5299 -commits] to master since this release - -[[assets-1]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.5.1.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.5.1.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.5.1 is now Officially Available to Download* - -This is a bug fix release for SuiteCRM 7.5 release. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who logged bugs and contributed to -this release. - -* https://github.com/salesagility/SuiteCRM/tree/v7.5[v7.5] -* https://github.com/salesagility/SuiteCRM/commit/bc02d48068f78718807bd0f7027826d9894f1e42[`bc02d48`] - -[[section-2]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.5[7.5] ---------------------------------------------------------------- - -image:https://avatars3.githubusercontent.com/u/5641419?s=40&v=4[@willrennie] -https://github.com/willrennie[willrennie] released this Jan 18, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.5...master[7296 -commits] to master since this release - -[[assets-2]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.5.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.5.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.5 is now Officially Available to Download* - -SuiteCRM 7.5, the latest cutting edge release, focuses on enhancing the -Reports module. A full list of new functionality is detailed below: - -* Cleaner Reports Interface - Making the report writer and results view -more user friendly and less cluttered. -* AND/OR Conditions - Improving your ability to refine results using a -mixture of OR as well as AND logical operators. -* New Charting Engine - Present your report results using eye catching -configurable charts to clearly communicate your intended metrics. -* Grouped Reports View - Grouped Reports view, including dashlets, which -can be expanded/collapsed and grouped on multiple fields. -* Custom file removal - Removing a large volume of files from the custom -directory ensuring only required custom files remain. -* Formatting Options - Display dates and other key fields in a format -effective for your audience. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who contributed, tested and helped -with this release. - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.5-rc[v7.5-rc] -* https://github.com/salesagility/SuiteCRM/commit/6d6c676f7e2fba958a8b82e1ffc01e3875095608[`6d6c676`] - -[[release-candidate47]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.5-rc[7.5 -Release Candidate] ------------------------------------------------------------------------------------- - -image:https://avatars3.githubusercontent.com/u/5641419?s=40&v=4[@willrennie] -https://github.com/willrennie[willrennie] released this Jan 11, 2016 · -https://github.com/salesagility/SuiteCRM/compare/v7.5-rc...develop[6128 -commits] to develop since this release - -[[assets-3]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.5-rc.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.5-rc.tar.gz[*Source -code* (tar.gz)] - -*This is a beta release and should not be used in a production -environment.* - -Try 7.5 Release Candidate to preview the new features coming in SuiteCRM -7.5. - -The focus of SuiteCRM 7.5 is to enhance the functionality of the native -Reports module and introduce new charting functionality/designs. - -This release candidate release includes the following new features, as -well as bug-fixes to the 7.5 Beta 2 release: - -* Enhancements to the User Interface. -* Grouped Report View. -* AND/OR reporting operators. -* New RGraph charting engine. - -https://suitecrm.com/suitecrm?id=222[Click here] to get the full details -of this release and to get the upgrade package from 7.3.x, 7.4.x, 7.5 -Beta 1 and 7.5 Beta 2. - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.5-beta.2[v7.5-beta.2] -* https://github.com/salesagility/SuiteCRM/commit/8bff783446f9cf2f05333232a36f7966ccc08371[`8bff783`] - -[[beta-254]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.5-beta.2[7.5 -Beta 2] ------------------------------------------------------------------------------ - -image:https://avatars3.githubusercontent.com/u/5641419?s=40&v=4[@willrennie] -https://github.com/willrennie[willrennie] released this Dec 21, 2015 · -https://github.com/salesagility/SuiteCRM/compare/v7.5-beta.2...develop[6157 -commits] to develop since this release - -[[assets-4]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.5-beta.2.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.5-beta.2.tar.gz[*Source -code* (tar.gz)] - -*This is a beta release and should not be used in a production -environment.* - -Try 7.5 Beta 2 to preview the new features coming in SuiteCRM 7.5. - -The focus of SuiteCRM 7.5 is to enhance the functionality of the native -Reports module and introduce new charting functionality/designs. - -This second Beta release includes enhancements to the User Interface, -AND/OR reporting operators, new RGraph charting functionality and bug -fixes to the 7.5 Beta 1 release. - -https://suitecrm.com/suitecrm?id=222[Click here] to get the full details -of this release and to get the upgrade package from 7.3.x, 7.4.x and 7.5 -Beta 1. - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.5-beta[v7.5-beta] -* https://github.com/salesagility/SuiteCRM/commit/82cb105baf7fbbc8d3d8f5fa54b102a6655ae106[`82cb105`] - -[[beta60]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.5-beta[7.5 -Beta] -------------------------------------------------------------------------- - -image:https://avatars3.githubusercontent.com/u/5641419?s=40&v=4[@willrennie] -https://github.com/willrennie[willrennie] released this Dec 14, 2015 · -https://github.com/salesagility/SuiteCRM/compare/v7.5-beta...develop[6175 -commits] to develop since this release - -[[assets-5]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.5-beta.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.5-beta.tar.gz[*Source -code* (tar.gz)] - -*This is a beta release and should not be used in a production -environment.* - -Try 7.5 to preview the new features coming in SuiteCRM 7.5. - -The focus of SuiteCRM 7.5 is to enhance the functionality of the native -Reports module. - -The first Beta release includes enhancements to the User Interface and -the introduction of AND/OR operators. - -https://suitecrm.com/suitecrm?id=222[Click here] to get the full details -of this release and to get the upgrade package from 7.3.x and 7.4.x - -* https://github.com/salesagility/SuiteCRM/tree/v7.4.3[v7.4.3] -* https://github.com/salesagility/SuiteCRM/commit/aad227325a9238e9e916f6d6401b34aca703300a[`aad2273`] - -[[section-3]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.4.3[7.4.3] -------------------------------------------------------------------- - -image:https://avatars3.githubusercontent.com/u/5641419?s=40&v=4[@willrennie] -https://github.com/willrennie[willrennie] released this Nov 23, 2015 · -https://github.com/salesagility/SuiteCRM/compare/v7.4.3...master[5555 -commits] to master since this release - -[[assets-6]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.4.3.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.4.3.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.4.3 is now Officially Available to Download* - -SuiteCRM 7.4.3, the latest cutting edge release, introduces the new -reminder meetings functionality. - -This functionality allows users to more efficiently manage call and -meeting reminders with the following features: - -* Add multiple reminders to a Meeting/Call so that users can be reminded -about a meeting at different intervals. -* Select if all invitees should get a reminder so that users can choose -who to remind about the Meeting/Call. -* Choose people who should not get a reminder so that users can choose -who to remind about the Meeting/Call. -* Ability to select who receives reminders so that no one else is -reminded about the Meeting/Call. - -In addition to the Reminder Meetings functionality, there have also been -many bug-fixes implemented in SuiteCRM 7.4.3. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who contributed, tested and helped -with this release. - -* Nov 23, 2015 - -[[v7.4.2-70]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.4.2[v7.4.2] … -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.... - Merge branch 'reminders' into 7.4.2 - - -* [ 3655540 ][71] -* [ zip ][72] -* [ tar.gz ][73] -.... - -* https://github.com/salesagility/SuiteCRM/tree/v7.4.1[v7.4.1] -* https://github.com/salesagility/SuiteCRM/commit/a74ed2f7f112cc7ce946be6e36b3e8178be594f0[`a74ed2f`] - -[[section-4]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.4.1[7.4.1] -------------------------------------------------------------------- - -image:https://avatars3.githubusercontent.com/u/5641419?s=40&v=4[@willrennie] -https://github.com/willrennie[willrennie] released this Nov 10, 2015 · -https://github.com/salesagility/SuiteCRM/compare/v7.4.1...master[5673 -commits] to master since this release - -[[assets-7]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.4.1.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.4.1.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.4.1 is now Officially Available to Download* - -This is a bug fix release for SuiteCRM 7.4 release. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who contributed, tested and helped -with this release. - -* https://github.com/salesagility/SuiteCRM/tree/v7.4[v7.4] -* https://github.com/salesagility/SuiteCRM/commit/1cb87534570b37d742389c12b845ed7b7e625c95[`1cb8753`] - -[[section-5]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.4[7.4] ---------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Oct 30, 2015 · -https://github.com/salesagility/SuiteCRM/compare/v7.4...master[5747 -commits] to master since this release - -[[assets-8]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.4.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.4.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.4 is now Officially Available to Download* - -This release bring many enhancements - Favourites, Knowledge Base, -Improved PHP Compatibility and More.. - -For more information view the release notes on the SuiteCRM Wiki -https://suitecrm.com/wiki/index.php/Release_notes_7.4.0[here]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who contributed, tested and helped -with this release. - -https://github.com/salesagility/SuiteCRM/releases?after=v7.7-beta2[Previous]https://github.com/salesagility/SuiteCRM/releases?after=v7.4[Next] - -* © 2018 GitHub, Inc. -* https://github.com/site/terms[Terms] -* https://github.com/site/privacy[Privacy] -* https://github.com/security[Security] -* https://status.github.com/[Status] -* https://help.github.com[Help] https://github.com[] -* https://github.com/contact[Contact GitHub] -* https://developer.github.com[API] -* https://training.github.com[Training] -* https://shop.github.com[Shop] -* https://github.com/blog[Blog] -* https://github.com/about[About] - -You can't perform that action at this time. - -You signed in with another tab or window. link:[Reload] to refresh your -session. You signed out in another tab or window. link:[Reload] to -refresh your session. diff --git a/_source/relnotes/releases8.adoc b/_source/relnotes/releases8.adoc deleted file mode 100644 index ef41c3b74..000000000 --- a/_source/relnotes/releases8.adoc +++ /dev/null @@ -1,376 +0,0 @@ -https://github.com/salesagility/SuiteCRM/releases?after=v7.4[Source] - -[[releases-salesagilitysuitecrm-github]] -Releases · salesagility/SuiteCRM · GitHub ------------------------------------------ - -https://github.com#start-of-content[Skip to content] - -https://github.com/[] - -* https://github.com/features[Features] -* https://github.com/business[Business] -* https://github.com/explore[Explore] -* https://github.com/marketplace[Marketplace] -* https://github.com/pricing[Pricing] - -https://github.com/salesagility/SuiteCRM/releases[This repository] - -link:/login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases%3Fafter%3Dv7.4[Sign -in] or link:/join?source=header-repo[Sign up] - -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Watch] -https://github.com/salesagility/SuiteCRM/watchers[164] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Star] -https://github.com/salesagility/SuiteCRM/stargazers[819] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Fork] -https://github.com/salesagility/SuiteCRM/network[686] - -[[salesagility15suitecrm16]] -https://github.com/salesagility[salesagility]/https://github.com/salesagility/SuiteCRM[**SuiteCRM]** ----------------------------------------------------------------------------------------------------- - -https://github.com/salesagility/SuiteCRM[Code] -https://github.com/salesagility/SuiteCRM/issues[Issues 609] -https://github.com/salesagility/SuiteCRM/pulls[Pull requests 285] -https://github.com/salesagility/SuiteCRM/wiki[Wiki] -https://github.com/salesagility/SuiteCRM/pulse[Insights] - -https://github.com/salesagility/SuiteCRM/releases[Releases] -https://github.com/salesagility/SuiteCRM/tags[Tags] - -* https://github.com/salesagility/SuiteCRM/tree/v7.3.2[v7.3.2] -* https://github.com/salesagility/SuiteCRM/commit/1257ab233056558d2ec203691e479d6c685b5177[`1257ab2`] - -[[section]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.3.2[7.3.2] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Oct 22, 2015 · -https://github.com/salesagility/SuiteCRM/compare/v7.3.2...master[5893 -commits] to master since this release - -[[assets]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.3.2.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.3.2.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.3.2 is now Officially Available to Download* - -This is a bug fix release for SuiteCRM 7.3 release. - -For more information view the release notes on the SuiteCRM Wiki -https://suitecrm.com/wiki/index.php/Release_notes_7.3.2[here]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who contributed, tested and helped -with this release. - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.4-rc[v7.4-rc] -* https://github.com/salesagility/SuiteCRM/commit/9e59c99d877e1ccf310797f1a2e63e3314c4c38b[`9e59c99`] - -[[release-candidate34]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.4-rc[7.4 -Release Candidate] ------------------------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Oct 19, 2015 · -https://github.com/salesagility/SuiteCRM/compare/v7.4-rc...develop[6438 -commits] to develop since this release - -[[assets-1]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.4-rc.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.4-rc.tar.gz[*Source -code* (tar.gz)] - -*This is a beta release and should not be used in a production -environment.* - -Try 7.4RC to preview the new features coming in 7.4 - -Including Favourites, Knowledge Base, Improved PHP Compatibility and -More. - -https://suitecrm.com/suitecrm?id=224[Click here] to get the full details -of this release and to get the upgrade package from 7.3.x and 7.4 Beta 1 -or Beta 2 - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.4-beta.2[v7.4-beta.2] -* https://github.com/salesagility/SuiteCRM/commit/5943e3632264b2dcd0eefa05f9a7670571c31543[`5943e36`] - -[[beta-241]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.4-beta.2[7.4 -Beta 2] ------------------------------------------------------------------------------ - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Oct 12, 2015 · -https://github.com/salesagility/SuiteCRM/compare/v7.4-beta.2...develop[6447 -commits] to develop since this release - -[[assets-2]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.4-beta.2.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.4-beta.2.tar.gz[*Source -code* (tar.gz)] - -*This is a beta release and should not be used in a production -environment.* - -Try 7.4 Beta 2 to preview the new features coming in 7.4 - -Including Favourites, Knowledge Base, Improved Installer and More. - -https://suitecrm.com/suitecrm?id=222[Click here] to get the full details -of this release and to get the upgrade package from 7.3.x and 7.4 Beta 1 - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.4-beta[v7.4-beta] -* https://github.com/salesagility/SuiteCRM/commit/a522851389df6d41255a9fe3984bee012f5c3b45[`a522851`] - -[[beta48]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.4-beta[7.4 -Beta] -------------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Oct 5, 2015 · -https://github.com/salesagility/SuiteCRM/compare/v7.4-beta...develop[6530 -commits] to develop since this release - -[[assets-3]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.4-beta.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.4-beta.tar.gz[*Source -code* (tar.gz)] - -*This is a beta release and should not be used in a production -environment.* - -Try 7.4 Beta to preview the new features coming in 7.4 - -Including Favourites, Knowledge Base and More. - -https://suitecrm.com/suitecrm?id=222[Click here] to get the full details -of this release and to get the upgrade package from 7.3.x - -* https://github.com/salesagility/SuiteCRM/tree/v7.3.1[v7.3.1] -* https://github.com/salesagility/SuiteCRM/commit/9cec55772ec039833ca2b1e4135b0b8e2debe719[`9cec557`] - -[[section-1]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.3.1[7.3.1] -------------------------------------------------------------------- - -image:https://avatars3.githubusercontent.com/u/5641419?s=40&v=4[@willrennie] -https://github.com/willrennie[willrennie] released this Aug 25, 2015 · -https://github.com/salesagility/SuiteCRM/compare/v7.3.1...master[5978 -commits] to master since this release - -[[assets-4]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.3.1.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.3.1.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.3.1 is now Officially Available to Download* - -This is a bug fix release for SuiteCRM 7.3 release. - -For more information view the release notes on the SuiteCRM Wiki -https://suitecrm.com/wiki/index.php/Release_notes_7.3.1[here]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who contributed, tested and helped -with this release. - -* https://github.com/salesagility/SuiteCRM/tree/v7.2.4[v7.2.4] -* https://github.com/salesagility/SuiteCRM/commit/c95c9fb49211dbe89f144ff6e3160b15c39504f5[`c95c9fb`] - -[[section-2]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.2.4[7.2.4] -------------------------------------------------------------------- - -image:https://avatars3.githubusercontent.com/u/5641419?s=40&v=4[@willrennie] -https://github.com/willrennie[willrennie] released this Aug 20, 2015 - -[[assets-5]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.2.4.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.2.4.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.2.4 is now Officially Available to Download* - -This is a bug-fix release. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who contributed, tested and helped -with this release. - -* https://github.com/salesagility/SuiteCRM/tree/v7.3[v7.3] -* https://github.com/salesagility/SuiteCRM/commit/cf31edd1d0653a7ba07b6959685fdfa79b6c9f37[`cf31edd`] - -[[section-3]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.3[7.3] ---------------------------------------------------------------- - -image:https://avatars3.githubusercontent.com/u/5641419?s=40&v=4[@willrennie] -https://github.com/willrennie[willrennie] released this Aug 14, 2015 · -https://github.com/salesagility/SuiteCRM/compare/v7.3...master[6017 -commits] to master since this release - -[[assets-6]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.3.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.3.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.3 is now Officially Available to Download* - -This release bring many enhancements - inline editing, desktop -notifications, enhancements to Reports, enhancements to Workflow and bug -fixes. - -For more information view the release notes on the SuiteCRM Wiki -https://suitecrm.com/wiki/index.php/Release_notes_7.3.0[here]. - -Download here from the SuiteCRM GitHub Repository or -https://suitecrm.com/download[visit the official website] to find the -appropriate upgrade. - -Thank you to all community members who contributed, tested and helped -with this release. - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.3beta3[v7.3beta3] -* https://github.com/salesagility/SuiteCRM/commit/a4a1884ea79825b07d2229b73915eb4512499da1[`a4a1884`] - -[[beta-375]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.3beta3[7.3 Beta -3] ---------------------------------------------------------------------------- - -image:https://avatars3.githubusercontent.com/u/5641419?s=40&v=4[@willrennie] -https://github.com/willrennie[willrennie] released this Aug 7, 2015 · -https://github.com/salesagility/SuiteCRM/compare/v7.3beta3...develop[6690 -commits] to develop since this release - -[[assets-7]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.3beta3.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.3beta3.tar.gz[*Source -code* (tar.gz)] -+ -v7.3beta3 -+ -Don't do a final move for invalid/malicious files. See #333. -* https://github.com/salesagility/SuiteCRM/tree/v7.2.3[v7.2.3] -* https://github.com/salesagility/SuiteCRM/commit/817f43482e32408a95a94e11e3ee3ce4e3bddcc9[`817f434`] - -[[section-4]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.2.3[7.2.3] -------------------------------------------------------------------- - -image:https://avatars3.githubusercontent.com/u/5641419?s=40&v=4[@willrennie] -https://github.com/willrennie[willrennie] released this Aug 7, 2015 · -https://github.com/salesagility/SuiteCRM/compare/v7.2.3...master[6162 -commits] to master since this release - -[[assets-8]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.2.3.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.2.3.tar.gz[*Source -code* (tar.gz)] -+ -v7.2.3 -+ -Update version number to the latest release version. -* https://github.com/salesagility/SuiteCRM/tree/v7.1.8[v7.1.8] -* https://github.com/salesagility/SuiteCRM/commit/ad74c85a93add6f57e946b1fb87fb0820f214ba7[`ad74c85`] - -[[section-5]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.1.8[7.1.8] -------------------------------------------------------------------- - -image:https://avatars3.githubusercontent.com/u/5641419?s=40&v=4[@willrennie] -https://github.com/willrennie[willrennie] released this Aug 7, 2015 - -[[assets-9]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.1.8.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.1.8.tar.gz[*Source -code* (tar.gz)] -+ -v7.1.8 -+ -Don't do a final move for invalid/malicious files. See #333. - -https://github.com/salesagility/SuiteCRM/releases?after=v7.5.3[Previous]https://github.com/salesagility/SuiteCRM/releases?after=v7.1.8[Next] - -* © 2018 GitHub, Inc. -* https://github.com/site/terms[Terms] -* https://github.com/site/privacy[Privacy] -* https://github.com/security[Security] -* https://status.github.com/[Status] -* https://help.github.com[Help] https://github.com[] -* https://github.com/contact[Contact GitHub] -* https://developer.github.com[API] -* https://training.github.com[Training] -* https://shop.github.com[Shop] -* https://github.com/blog[Blog] -* https://github.com/about[About] - -You can't perform that action at this time. - -You signed in with another tab or window. link:[Reload] to refresh your -session. You signed out in another tab or window. link:[Reload] to -refresh your session. diff --git a/_source/relnotes/releases9.adoc b/_source/relnotes/releases9.adoc deleted file mode 100644 index 075531acf..000000000 --- a/_source/relnotes/releases9.adoc +++ /dev/null @@ -1,335 +0,0 @@ -https://github.com/salesagility/SuiteCRM/releases?after=v7.1.8[Source] - -[[releases-salesagilitysuitecrm-github]] -Releases · salesagility/SuiteCRM · GitHub ------------------------------------------ - -https://github.com#start-of-content[Skip to content] - -https://github.com/[] - -* https://github.com/features[Features] -* https://github.com/business[Business] -* https://github.com/explore[Explore] -* https://github.com/marketplace[Marketplace] -* https://github.com/pricing[Pricing] - -https://github.com/salesagility/SuiteCRM/releases[This repository] - -link:/login?return_to=%2Fsalesagility%2FSuiteCRM%2Freleases%3Fafter%3Dv7.1.8[Sign -in] or link:/join?source=header-repo[Sign up] - -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Watch] -https://github.com/salesagility/SuiteCRM/watchers[164] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Star] -https://github.com/salesagility/SuiteCRM/stargazers[819] -* link:/login?return_to=%2Fsalesagility%2FSuiteCRM[Fork] -https://github.com/salesagility/SuiteCRM/network[686] - -[[salesagility15suitecrm16]] -https://github.com/salesagility[salesagility]/https://github.com/salesagility/SuiteCRM[**SuiteCRM]** ----------------------------------------------------------------------------------------------------- - -https://github.com/salesagility/SuiteCRM[Code] -https://github.com/salesagility/SuiteCRM/issues[Issues 609] -https://github.com/salesagility/SuiteCRM/pulls[Pull requests 285] -https://github.com/salesagility/SuiteCRM/wiki[Wiki] -https://github.com/salesagility/SuiteCRM/pulse[Insights] - -https://github.com/salesagility/SuiteCRM/releases[Releases] -https://github.com/salesagility/SuiteCRM/tags[Tags] - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.3-beta[v7.3-beta] -* https://github.com/salesagility/SuiteCRM/commit/2eaa73477206457911b072badf225d74a55ed4fc[`2eaa734`] - -[[beta24]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.3-beta[7.3 -Beta] -------------------------------------------------------------------------- - -image:https://avatars3.githubusercontent.com/u/5641419?s=40&v=4[@willrennie] -https://github.com/willrennie[willrennie] released this Jun 5, 2015 · -https://github.com/salesagility/SuiteCRM/compare/v7.3-beta...develop[6733 -commits] to develop since this release - -[[assets]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.3-beta.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.3-beta.tar.gz[*Source -code* (tar.gz)] - -*This is a beta release and should not be used in a production -environment.* - -Try 7.3 Beta to preview the new features coming in 7.3 - -Including Inline Editing, Desktop Notifications and More. - -https://suitecrm.com/index.php?option=com_content&layout=edit&view=article&id=209[Click -here] to get the full details of this release and to get the upgrade -package from 7.2.x - -* https://github.com/salesagility/SuiteCRM/tree/v7.2.2[v7.2.2] -* https://github.com/salesagility/SuiteCRM/commit/016d6c6abee5852f91f119c2201e6d05741d4003[`016d6c6`] - -[[section]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.2.2[7.2.2] -------------------------------------------------------------------- - -image:https://avatars3.githubusercontent.com/u/5641419?s=40&v=4[@willrennie] -https://github.com/willrennie[willrennie] released this May 20, 2015 · -https://github.com/salesagility/SuiteCRM/compare/v7.2.2...master[6164 -commits] to master since this release - -[[assets-1]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.2.2.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.2.2.tar.gz[*Source -code* (tar.gz)] - -SuiteCRM 7.2 has been updated to version 7.2.2. - -This is a bug fix release which addresses bugs in the SuiteCRM 7.2.1 -release and also Post-Auth RCE vulnerabilities in SuiteCRM. - -* May 20, 2015 - -[[section-1]] -https://github.com/salesagility/SuiteCRM/releases/tag/7.2.2[7.2.2] … -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.... - Update SuiteCRM version to 7.2.2. - - -* [ bf42349 ][38] -* [ zip ][39] -* [ tar.gz ][40] -.... - -* May 20, 2015 - -[[section-2]] -https://github.com/salesagility/SuiteCRM/releases/tag/7.1.7[7.1.7] … -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.... - Fix Post-Auth RCE Vulnerabilit - - -* [ d004245 ][42] -* [ zip ][43] -* [ tar.gz ][44] -.... - -* https://github.com/salesagility/SuiteCRM/tree/v7.1.7[v7.1.7] -* https://github.com/salesagility/SuiteCRM/commit/d0042450f5bb73e1db2ec86460609cb5b2e4fa5b[`d004245`] - -[[section-3]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.1.7[7.1.7] -------------------------------------------------------------------- - -image:https://avatars3.githubusercontent.com/u/5641419?s=40&v=4[@willrennie] -https://github.com/willrennie[willrennie] released this May 20, 2015 - -[[assets-2]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.1.7.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.1.7.tar.gz[*Source -code* (tar.gz)] - -SuiteCRM 7.1 has been updated to version 7.1.7. - -This is a bug fix release which addresses Post-Auth RCE vulnerabilities -in SuiteCRM. - -* https://github.com/salesagility/SuiteCRM/tree/v7.2.1[v7.2.1] -* https://github.com/salesagility/SuiteCRM/commit/dda786a6489bfd8c743150033a29fd460f25b980[`dda786a`] - -[[section-4]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.2.1[7.2.1] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Mar 11, 2015 · -https://github.com/salesagility/SuiteCRM/compare/v7.2.1...master[6220 -commits] to master since this release - -[[assets-3]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.2.1.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.2.1.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.2.1 is now Officially Available to Download* - -This is a Bug Fix release that addresses that addresses many issues - -For more check out the release notes on the wiki -https://suitecrm.com/wiki/index.php/Release_notes_7.2.1[here] - -Download here or https://suitecrm.com/download[click here] to find the -appropriate upgrade. - -Big Thanks to everyone who contributed, tested and helped with this -release, - -* https://github.com/salesagility/SuiteCRM/tree/v7.1.6[v7.1.6] -* https://github.com/salesagility/SuiteCRM/commit/bac37f5776d3d90b65e06853771fd50339fbf98a[`bac37f5`] - -[[section-5]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.1.6[7.1.6] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Mar 11, 2015 - -[[assets-4]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.1.6.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.1.6.tar.gz[*Source -code* (tar.gz)] - -SuiteCRM has been updated to version 7.1.6 - -This is a bug fix release which addresses many issues - -For a full list of what has changed and been fixed check out the release -notes on the wiki - -* https://github.com/salesagility/SuiteCRM/tree/v7.2[v7.2] -* https://github.com/salesagility/SuiteCRM/commit/2c529f735a72ad6730a692660249175797be7d0b[`2c529f7`] - -[[section-6]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.2[7.2] ---------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Mar 2, 2015 · -https://github.com/salesagility/SuiteCRM/compare/v7.2...master[6252 -commits] to master since this release - -[[assets-5]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.2.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.2.tar.gz[*Source -code* (tar.gz)] - -*SuiteCRM 7.2 is now Officially Available to Download* - -This release bring many enhancements - a brand new responsive theme, -enhanced reporting, an image field and much more - -For more check out the release notes on the wiki -https://suitecrm.com/wiki/index.php/Release_notes_7.2.0[here] - -Download here or https://suitecrm.com/download[click here] to find the -appropriate upgrade. - -Big Thanks to everyone who contributed, tested and helped with this -release, - -Pre-release - -* https://github.com/salesagility/SuiteCRM/tree/v7.2beta3[v7.2beta3] -* https://github.com/salesagility/SuiteCRM/commit/169047ae360552505b365be928b959b13d8264ae[`169047a`] - -[[beta-373]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.2beta3[7.2 Beta -3] ---------------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Feb 9, 2015 · -https://github.com/salesagility/SuiteCRM/compare/v7.2beta3...develop[7091 -commits] to develop since this release - -[[assets-6]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.2beta3.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.2beta3.tar.gz[*Source -code* (tar.gz)] - -*This is a beta release and should not be used in a production -environment.* - -Try 7.2 Beta 3 to preview the new features coming in 7.2 - -Including reports, cases and project enhancements - -https://suitecrm.com/suitecrm?id=207:download&catid=126:suitecrm-beta[Click -here] to get the full details of this release and to get the upgrade -package from 7.1.x (also valid for upgrading from 7.2 beta/beta2) - -* https://github.com/salesagility/SuiteCRM/tree/v7.1.5[v7.1.5] -* https://github.com/salesagility/SuiteCRM/commit/08e610e40ea80f71a29600c450930f872feee6e7[`08e610e`] - -[[section-7]] -https://github.com/salesagility/SuiteCRM/releases/tag/v7.1.5[7.1.5] -------------------------------------------------------------------- - -image:https://avatars1.githubusercontent.com/u/6449723?s=40&v=4[@mattlorimer] -https://github.com/mattlorimer[mattlorimer] released this Jan 19, 2015 · -https://github.com/salesagility/SuiteCRM/compare/v7.1.5...master[6842 -commits] to master since this release - -[[assets-7]] -Assets -~~~~~~ - -* https://github.com/salesagility/SuiteCRM/archive/v7.1.5.zip[*Source -code* (zip)] -* https://github.com/salesagility/SuiteCRM/archive/v7.1.5.tar.gz[*Source -code* (tar.gz)] - -SuiteCRM has been updated to version 7.1.5 - -This is a bug fix release which also addresses some important security -issues - -For a full list of what has changed and been fixed check out the release -notes on the wiki - -https://github.com/salesagility/SuiteCRM/releases?after=v7.4[Previous]https://github.com/salesagility/SuiteCRM/releases?after=v7.1.5[Next] - -* © 2018 GitHub, Inc. -* https://github.com/site/terms[Terms] -* https://github.com/site/privacy[Privacy] -* https://github.com/security[Security] -* https://status.github.com/[Status] -* https://help.github.com[Help] https://github.com[] -* https://github.com/contact[Contact GitHub] -* https://developer.github.com[API] -* https://training.github.com[Training] -* https://shop.github.com[Shop] -* https://github.com/blog[Blog] -* https://github.com/about[About] - -You can't perform that action at this time. - -You signed in with another tab or window. link:[Reload] to refresh your -session. You signed out in another tab or window. link:[Reload] to -refresh your session. diff --git a/_source/suitecrm_developer_book.adoc b/_source/suitecrm_developer_book.adoc deleted file mode 100644 index 290f5e3da..000000000 --- a/_source/suitecrm_developer_book.adoc +++ /dev/null @@ -1,7044 +0,0 @@ -image:images/title_page.jpg[SuiteCRM for -Developers,title="SuiteCRM for Developers"] - -[[suitecrm-for-developers]] -SuiteCRM for Developers -~~~~~~~~~~~~~~~~~~~~~~~ - -[[getting-started-with-developing-for-suitecrm]] -Getting started with developing for SuiteCRM -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -  - -[[jim-mackin]] -Jim Mackin -++++++++++ - -  - -This book is for sale at http://leanpub.com/suitecrmfordevelopers - -This version was published on 2015-05-22 - -image:images/leanpub-logo.png[publisher's logo,title="publisher's logo"] - -*    *   *   *   * - -This is a http://leanpub.com[Leanpub] book. Leanpub empowers authors and -publishers with the Lean Publishing process. -http://leanpub.com/manifesto[Lean Publishing] is the act of publishing -an in-progress ebook using lightweight tools and many iterations to get -reader feedback, pivot until you have the right book and build traction -once you do. - -*    *   *   *   * - -© 2015 Jim Mackin - -[[table-of-contents]] -Table of Contents -~~~~~~~~~~~~~~~~~ - -* link:#chap00.xhtml#leanpub-auto-introduction[1. Introduction] -** link:#chap00.xhtml#leanpub-auto-what-is-suitecrm[What is SuiteCRM] -** link:#chap00.xhtml#leanpub-auto-this-book[This book] -** link:#chap00.xhtml#leanpub-auto-reading-this-book[Reading this book] -** link:#chap00.xhtml#leanpub-auto-setting-up-suitecrm[Setting up -SuiteCRM] -** link:#chap00.xhtml#leanpub-auto-initial-tweaks[Initial Tweaks] -* link:#chap01.xhtml#leanpub-auto-suitecrm-directory-structure[2. -SuiteCRM Directory Structure] -* link:#chap02.xhtml#working-with-beans-chapter[3. Working with Beans] -** link:#chap02.xhtml#leanpub-auto-beanfactory[BeanFactory] -** link:#chap02.xhtml#leanpub-auto-sugarbean[SugarBean] -** link:#chap02.xhtml#leanpub-auto-searching-for-beans[Searching for -beans] -** link:#chap02.xhtml#leanpub-auto-accessing-fields[Accessing fields] -** link:#chap02.xhtml#leanpub-auto-related-beans[Related beans] -* link:#chap03.xhtml#vardefs-chapter[4. Vardefs] -** link:#chap03.xhtml#leanpub-auto-what-are-vardefs[What are Vardefs] -** link:#chap03.xhtml#leanpub-auto-defining-vardefs[Defining Vardefs] -* link:#chap04.xhtml#leanpub-auto-views[5. Views] -** link:#chap04.xhtml#leanpub-auto-location[Location] -** link:#chap04.xhtml#leanpub-auto-customising[Customising] -* link:#chap05.xhtml#metadata-chapter[6. Metadata] -** link:#chap05.xhtml#leanpub-auto-intro[Intro] -** link:#chap05.xhtml#leanpub-auto-location-1[Location] -** link:#chap05.xhtml#leanpub-auto-customising-1[Customising] -** link:#chap05.xhtml#leanpub-auto-different-metadata[Different -metadata] -* link:#chap06.xhtml#leanpub-auto-controllers[7. Controllers] -** link:#chap06.xhtml#leanpub-auto-customising-controllers[Customising -controllers] -* link:#chap07.xhtml#entry-point-chapter[8. Entry Points] -** link:#chap07.xhtml#leanpub-auto-creating-an-entry-point[Creating an -entry point] -* link:#chap08.xhtml#language-chapter[9. Language Strings] -** link:#chap08.xhtml#leanpub-auto-module-strings[Module Strings] -** link:#chap08.xhtml#leanpub-auto-application-strings[Application -Strings] -** link:#chap08.xhtml#leanpub-auto-application-list-strings[Application -List Strings] -** link:#chap08.xhtml#leanpub-auto-why-and-when-to-customise[Why and -when to customise] -** link:#chap08.xhtml#leanpub-auto-usage[Usage] -* link:#chap09.xhtml#config-chapter[10. Config] -** link:#chap09.xhtml#leanpub-auto-the-config-files[The config files] -** link:#chap09.xhtml#leanpub-auto-using-config-options[Using config -options] -* link:#chap10.xhtml#logging-chapter[11. Logging] -** link:#chap10.xhtml#leanpub-auto-logging-messages[Logging messages] -** link:#chap10.xhtml#leanpub-auto-logging-output[Logging output] -** link:#chap10.xhtml#leanpub-auto-log-levels[Log levels] -* link:#chap11.xhtml#logic-hooks-chapter[12. Logic Hooks] -** link:#chap11.xhtml#leanpub-auto-intro-1[Intro] -** link:#chap11.xhtml#leanpub-auto-types[Types] -** link:#chap11.xhtml#leanpub-auto-application-hooks[Application Hooks] -** link:#chap11.xhtml#leanpub-auto-user-hooks[User Hooks] -** link:#chap11.xhtml#leanpub-auto-module-hooks[Module Hooks] -** link:#chap11.xhtml#leanpub-auto-job-queue-hooks[Job Queue Hooks] -** link:#chap11.xhtml#leanpub-auto-implementing[Implementing] -** link:#chap11.xhtml#leanpub-auto-tips[Tips] -* link:#chap12.xhtml#scheduled-tasks-chapter[13. Scheduled Tasks] -** link:#chap12.xhtml#leanpub-auto-intro-2[Intro] -** link:#chap12.xhtml#leanpub-auto-scheduler[Scheduler] -** link:#chap12.xhtml#leanpub-auto-job-queue[Job Queue] -** link:#chap12.xhtml#leanpub-auto-debugging[Debugging] -* link:#chap13.xhtml#extensions-chapter[14. Extension Framework] -** link:#chap13.xhtml#leanpub-auto-introduction-1[Introduction] -** link:#chap13.xhtml#leanpub-auto-standard-extensions[Standard -Extensions] -** link:#chap13.xhtml#leanpub-auto-custom-extensions[Custom Extensions] -* link:#chap14.xhtml#module-installer-chapter[15. Module Installer] -** link:#chap14.xhtml#leanpub-auto-manifestphp[manifest.php] -** link:#chap14.xhtml#leanpub-auto-types-1[Types] -* link:#chap15.xhtml#leanpub-auto-api[16. API] -** link:#chap15.xhtml#leanpub-auto-using-the-api[Using the API] -** link:#chap15.xhtml#leanpub-auto-adding-custom-api-methods[Adding -custom API methods] -* link:#chap16.xhtml#leanpub-auto-best-practices[17. Best Practices] -** link:#chap16.xhtml#leanpub-auto-development-instances[Development -instances] -** link:#chap16.xhtml#leanpub-auto-version-control[Version control] -** link:#chap16.xhtml#leanpub-auto-backup[Backup] -** link:#chap16.xhtml#leanpub-auto-be-upgrade-safe[Be upgrade safe] -** link:#chap16.xhtml#leanpub-auto-use-appropriate-log-levels[Use -appropriate log levels] -** link:#chap16.xhtml#leanpub-auto-long-running-logic-hooks[Long running -logic hooks] -** link:#chap16.xhtml#leanpub-auto-minimise-sql[Minimise SQL] -** link:#chap16.xhtml#leanpub-auto-sql-use[SQL Use] -** link:#chap16.xhtml#leanpub-auto-entry-check[Entry check] -** link:#chap16.xhtml#leanpub-auto-redirect-after-post[Redirect after -post] -* link:#chap17.xhtml#leanpub-auto-performance-tweaks[18. Performance -Tweaks] -** link:#chap17.xhtml#leanpub-auto-server[Server] -** link:#chap17.xhtml#leanpub-auto-indexes[Indexes] -** link:#chap17.xhtml#leanpub-auto-config-changes[Config Changes] -* link:#chap18.xhtml#leanpub-auto-further-resources[19. Further -Resources] -** link:#chap18.xhtml#leanpub-auto-suitecrm-website[SuiteCRM Website] -** link:#chap18.xhtml#leanpub-auto-external-suitecrm-resources[External -SuiteCRM Resources] -** link:#chap18.xhtml#leanpub-auto-sugarcrm-resources[SugarCRM -Resources] -** link:#chap18.xhtml#leanpub-auto-technical-links[Technical Links] -** link:#chap18.xhtml#leanpub-auto-other-links[Other Links] -* link:#chap19.xhtml#appendix-a[20. Appendix A - Code Examples] -** link:#chap19.xhtml#leanpub-auto-metadata[Metadata] -** link:#chap19.xhtml#leanpub-auto-module-installer[Module Installer] -* link:#chap20.xhtml#appendix-b[21. Appendix B - API Methods] -** link:#chap20.xhtml#leanpub-auto-methods-1[Methods] - -[[introduction]] -1. Introduction -~~~~~~~~~~~~~~~ - -[[what-is-suitecrm]] -What is SuiteCRM -^^^^^^^^^^^^^^^^ - -The story of https://www.suitecrm.com[SuiteCRM] starts with SugarCRM. -SugarCRM was founded in 2004 and consisted of an open source version -(called Community Edition) and various paid for versions. However -trouble started brewing when it appeared that SugarCRM would not be -releasing a Community Edition of SugarCRM 7 and would be providing -limited, if any, updates to the Community Edition. - -Enter SuiteCRM. SalesAgility forked Community Edition to create SuiteCRM -and also added various open source plugins to add improved -functionality. - -[[this-book]] -This book -^^^^^^^^^ - -This book is intended for developers who are familiar (or at least -acquainted) with using SuiteCRM but want to perform their own -customisations. SuiteCRM is a large and mature piece of software so it -is impractical for a book to cover all aspects of the software. I’ve -tried to add the most important parts which should allow you to make the -changes you need in 99% of situations. There is a further resources -chapter at the end of this book to help out in those 1% of cases. With -that being said if you feel there is anything important I have left out -(or worse, anything incorrect in the book) please let me know. I can be -contacted at http://www.jsmackin.co.uk[JSMackin.co.uk]. - -[[reading-this-book]] -Reading this book -^^^^^^^^^^^^^^^^^ - -Each chapter in this book is intended to be self contained so the reader -can jump to interesting chapters. Where there is some overlap this is -usually indicated with links to the relevant chapters. - -Some parts of this book may refer to file paths or other parts of code -that can have a variable value, for example controller names contain the -module name or a file with an arbitrary name. In this case these will be -marked in the form ``, `` or something else -suitable. In these cases you can substitute something appropriate (such -as `Accounts` or `MyNewFile`). - -[[setting-up-suitecrm]] -Setting up SuiteCRM -^^^^^^^^^^^^^^^^^^^ - -In this book we’ll be using SuiteCRM v7.1.5 which is the latest at time -of writing. For up to date versions of the installation instructions see -the SuiteCRM wiki at -https://suitecrm.com/wiki/index.php/Installation[suitecrm.com/wiki/index.php/Installation]. - -[[website]] -Website -+++++++ - -The SuiteCRM installer can be found at -https://suitecrm.com/[SuiteCRM.com]. I would recommend SuiteCRM MAX as I -prefer to start with a full interface and customise it as needed. - -[[github]] -GitHub -++++++ - -SuiteCRM is also available on http://github.com[GitHub] at -https://github.com/salesagility/SuiteCRM[github.com/salesagility/SuiteCRM]. -Each SuiteCRM version is tagged so you can easily grab the version you -need. - -[[initial-tweaks]] -Initial Tweaks -^^^^^^^^^^^^^^ - -After the initial install there are a few tweaks you may want to make on -an instance you are developing on. These changes should improve your -development flow and productivity as well as help identify issues if -they occur. - -[[developer-mode]] -Developer Mode -++++++++++++++ - -SuiteCRM will cache various files that it processes, such as Smarty -templates. Developer mode will turn off some of the caching so that -changes to files will be seen immediately (though this isn’t always the -case - as is the case with -link:#chap13.xhtml#extensions-chapter[extensions]). This can be enabled -either through the config file or via the General settings page inside -admin. - -[[log-level]] -Log Level -+++++++++ - -The default log level of SuiteCRM is `fatal`. This is a good default for -production instances but you may want to increase the log level to -`info` or `debug`. This will make the log output more verbose so, should -anything go wrong, you’ll have something to refer to. See the -link:#chap10.xhtml#logging-chapter[chapter on logging] for more -information. - -[[display-errors]] -Display errors -++++++++++++++ - -You’ll also want to turn off display errors. Unfortunately at the moment -SuiteCRM has various notices and warnings out of the box. With -`display_errors` on this can sometimes cause AJAX pages and the link to -break. - -With this being said you should be checking the PHP error logs or -selectively enabling + -`display_errors` to ensure that the code you are creating is not -creating additional notices, warnings or errors. - -[[xdebug]] -XDebug -++++++ - -http://xdebug.org[XDebug] is a PHP extension which provides profiling -and debugging capabilities to PHP. This can massively improve developer -productivity by simplifying development and, particularly, tracking down -any issues. See the XDebug site for information on XDebug. - -[[suitecrm-directory-structure]] -2. SuiteCRM Directory Structure -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -`cache`:: - Contains cache files used by SuiteCRM including compiled smarty - templates, grouped vardefs, minified and grouped JavaScript. Some - modules and custom modules may also store (temporary) module specific - info here. -`custom`:: - Contains user and developer customisations to SuiteCRM. Also contains - some SuiteCRM code to maintain compatibility with SugarCRM. However - this is likely to change in the future. -`data`:: - Stores the classes and files used to deal with SugarBeans and their - relationships. -`examples`:: - Contains a few basic examples of lead capture and API usage. However - these are very outdated. -`include`:: - Contains the bulk of non module and non data SuiteCRM code. -`install`:: - Code used by the SuiteCRM installer. -`jssource`:: - The `jssource` folder contains the unminified source of some of the - JavaScript files used within SuiteCRM. -`metadata`:: - Stores relationship metadata for the various stock SuiteCRM modules. - This should not be confused with module metadata which contains - information on view, dashlet and search definitions. -`mobile`:: - Stores code for the http://www.quickcrm.fr[QuickCRM] mobile app. -`ModuleInstall`:: - Code for the module installer. -`modules`:: - Contains the code for any stock or custom SuiteCRM modules. -`service`:: - Code for the SuiteCRM Soap and REST APIs. -`themes`:: - Code, data and images for the bundled SuiteCRM theme. -`upload`:: - The `upload` folder contains documents that have been uploaded to - SuiteCRM. The names of the files comes from the ID of the matching - Document Revision/Note. `upload`/`upgrades` will also contain various - upgrade files and the packages of installed modules. -`log4php`, `soap`, `XTemplate`, `Zend`:: - Source code for various libraries used by SuiteCRM some of which are - deprecated. - -[[working-with-beans]] -3. Working with Beans -~~~~~~~~~~~~~~~~~~~~~ - -Beans are the Model in SuiteCRM’s MVC (Model View Controller) -architecture. They allow retrieving data from the database as objects -and allow persisting and editing records. This section will go over the -various ways of working with beans. - -[[beanfactory]] -BeanFactory -^^^^^^^^^^^ - -The BeanFactory allows dynamically loading bean instances or creating -new records. For example to create a new bean you can use: - -Example 3.1: Creating a new Bean using the BeanFactory - -''''' - -.... -1 $bean = BeanFactory::newBean('<TheModule>'); -2 //For example a new account bean: -3 $accountBean = BeanFactory::newBean('Accounts'); -.... - -''''' - -Retrieving an existing bean can be achieved in a similar manner: - -Example 3.2: Retrieving a bean with the BeanFactory - -''''' - -.... -1 $bean = BeanFactory::getBean('<TheModule>', $beanId); -2 //For example to retrieve an account id -3 $bean = BeanFactory::getBean('Accounts', $beanId); -.... - -''''' - -`getBean` will return an unpopulated bean object if `$beanId` is not -supplied or if there’s no such record. Retrieving an unpopulated bean -can be useful if you wish to use the static methods of the bean (for -example see the Searching for Beans section). To deliberately retrieve -an unpopulated bean you can omit the second argument of the `getBean` -call. I.e. - -Example 3.3: Retrieving an unpopulated bean - -''''' - -.... -1 $bean = BeanFactory::getBean('<TheModule>'); -.... - -''''' - -[width="100%",cols="50%,50%",] -|======================================================================= -|image:images/leanpub_warning.png[warning,title="fig:warning",width=50] -|`BeanFactory::getBean` caches ten results. This can cause odd behaviour -if you call `getBean` again and get a cached copy. Any calls that return -a cached copy will return the same instance. This means changes to one -of the beans will be reflected in all the results. -|======================================================================= - -Using BeanFactory ensures that the bean is correctly set up and the -necessary files are included etc. - -[[sugarbean]] -SugarBean -^^^^^^^^^ - -The SugarBean is the parent bean class and all beans in SuiteCRM extend -this class. It provides various ways of retrieving and interacting with -records. - -[[searching-for-beans]] -Searching for beans -^^^^^^^^^^^^^^^^^^^ - -The following examples show how to search for beans using a bean class. -The examples provided assume that an account bean is available names -$accountBean. This may have been retrieved using the getBean call -mentioned in the BeanFactory section e.g. - -Example 3.4: Retrieving an unpopulated account bean - -''''' - -.... -$accountBean = BeanFactory::getBean('Accounts'); -.... - -''''' - -[[get_list]] -get_list -++++++++ - -The get_list method allows getting a list of matching beans and allows -paginating the results. - -Example 3.5: get_list method signature - -''''' - -.... -1 get_list( -2 $order_by = "", -3 $where = "", -4 $row_offset = 0, -5 $limit=-1, -6 $max=-1, -7 $show_deleted = 0) -.... - -''''' - -$order_by:: - Controls the ordering of the returned list. `$order_by` is specified - as a string that will be used in the SQL ORDER BY clause e.g. to sort - by name you can simply pass `name`, to sort by date_entered descending - use `date_entered DESC`. You can also sort by multiple fields. For - example sorting by date_modified and id descending - `date_modified, id DESC`. -$where:: - Allows filtering the results using an SQL WHERE clause. `$where` - should be a string containing the SQL conditions. For example in the - contacts module searching for contacts with specific first names we - might use `contacts.first_name='Jim'`. Note that we specify the table, - the query may end up joining onto other tables so we want to ensure - that there is no ambiguity in which field we target. -$row_offset:: - The row to start from. Can be used to paginate the results. -$limit:: - The maximum number of records to be returned by the query. -1 means no - limit. -$max:: - The maximum number of entries to be returned per page. -1 means the - default max (usually 20). -$show_deleted:: - Whether to include deleted results. - -[[results]] -Results - -get_list will return an array. This will contain the paging information -and will also contain the list of beans. This array will contain the -following keys: - -list:: - An array of the beans returned by the list query -row_count:: - The total number of rows in the result -next_offset:: - The offset to be used for the next page or -1 if there are no further - pages. -previous_offset:: - The offset to be used for the previous page or -1 if this is the first - page. -current_offset:: - The offset used for the current results. - -[[example]] -Example - -Let’s look at a concrete example. We will return the third page of all -accounts with the industry `Media` using 10 as a page size and ordered -by name. - -Example 3.6: Example get_list call - -''''' - -.... - 1 $beanList = $accountBean->get_list( - 2 //Order by the accounts name - 3 'name', - 4 //Only accounts with industry 'Media' - 5 "accounts.industry = 'Media'", - 6 //Start with the 30th record (third page) - 7 30, - 8 //No limit - will default to max page size - 9 -1, -10 //10 items per page -11 10); -.... - -''''' - -This will return: - -Example 3.7: Example get_list results - -''''' - -.... - 1 Array - 2 ( - 3 //Snipped for brevity - the list of Account SugarBeans - 4 [list] => Array() - 5 //The total number of results - 6 [row_count] => 36 - 7 //This is the last page so the next offset is -1 - 8 [next_offset] => -1 - 9 //Previous page offset -10 [previous_offset] => 20 -11 //The offset used for these results -12 [current_offset] => 30 -13 ) -.... - -''''' - -[[get_full_list]] -get_full_list -+++++++++++++ - -`get_list` is useful when you need paginated results. However if you are -just interested in getting a list of all matching beans you can use -`get_full_list`. The `get_full_list` method signature looks like this: - -Example 3.8: get_full_list method signature - -''''' - -.... -1 get_full_list( -2 $order_by = "", -3 $where = "", -4 $check_dates=false, -5 $show_deleted = 0 -.... - -''''' - -These arguments are identical to their usage in `get_list` the only -difference is the `$check_dates` argument. This is used to indicate -whether the date fields should be converted to their display values -(i.e. converted to the users date format). - -[[results-1]] -Results - -The get_full_list call simply returns an array of the matching beans - -[[example-1]] -Example - -Let’s rework our `get_list` example to get the full list of matching -accounts: - -Example 3.9: Example get_full_list call - -''''' - -.... -1 $beanList = $accountBean->get_full_list( -2 //Order by the accounts name -3 'name', -4 //Only accounts with industry 'Media' -5 "accounts.industry = 'Media'" -6 ); -.... - -''''' - -[[retrieve_by_string_fields]] -retrieve_by_string_fields -+++++++++++++++++++++++++ - -Sometimes you only want to retrieve one row but may not have the id of -the record. `retrieve_by_string_fields` allows retrieving a single -record based on matching string fields. - -Example 3.10: retrieve_by_string_fields method signature - -''''' - -.... -1 retrieve_by_string_fields( -2 $fields_array, -3 $encode=true, -4 $deleted=true) -.... - -''''' - -$fields_array:: - An array of field names to the desired value. -$encode:: - Whether or not the results should be HTML encoded. -$deleted:: - Whether or not to add the deleted filter. - -[width="100%",cols="50%,50%",] -|======================================================================= -|image:images/leanpub_warning.png[warning,title="fig:warning",width=50] -|Note here that, confusingly, the deleted flag works differently to the -other methods we have looked at. It flags whether or not we should -filter out deleted results. So if true is passed then the deleted -results will _not_ be included. -|======================================================================= - -[[results-2]] -Results - -retrieve_by_string_fields returns a single bean as it’s result or null -if there was no matching bean. - -[[example-2]] -Example - -For example to retrieve the account with name `Tortoise Corp` and -account_type `Customer` we could use the following: - -Example 3.11: Example retrieve_by_string_fields call - -''''' - -.... -1 $beanList = $accountBean->retrieve_by_string_fields( -2 array( -3 'name' => 'Tortoise Corp', -4 'account_type' => 'Customer' -5 ) -6 ); -.... - -''''' - -[[accessing-fields]] -Accessing fields -^^^^^^^^^^^^^^^^ - -If you have used one of the above methods we now have a bean record. -This bean represents the record that we have retrieved. We can access -the fields of that record by simply accessing properties on the bean -just like any other PHP object. Similarly we can use property access to -set the values of beans. Some examples are as follows: - -Example 3.12: Accessing fields examples - -''''' - -.... - 1 //Get the Name field on account bean - 2 $accountBean->name; - 3 - 4 //Get the Meeting start date - 5 $meetingBean->date_start; - 6 - 7 //Get a custom field on a case - 8 $caseBean->third_party_code_c; - 9 -10 //Set the name of a case -11 $caseBean->name = 'New Case name'; -12 -13 //Set the billing address post code of an account -14 $accountBean->billing_address_postalcode = '12345'; -.... - -''''' - -When changes are made to a bean instance they are not immediately -persisted. We can save the changes to the database with a call to the -beans `save` method. Likewise a call to `save` on a brand new bean will -add that record to the database: - -Example 3.13: Persisting bean changes - -''''' - -.... - 1 //Get the Name field on account bean - 2 $accountBean->name = 'New account name'; - 3 //Set the billing address post code of an account - 4 $accountBean->billing_address_postalcode = '12345'; - 5 //Save both changes. - 6 $accountBean->save(); - 7 - 8 //Create a new case (see the BeanFactory section) - 9 $caseBean = BeanFactory::newBean('Cases'); -10 //Give it a name and save -11 $caseBean->name = 'New Case name'; -12 $caseBean->save(); -.... - -''''' - -[width="100%",cols="50%,50%",] -|======================================================================= -|image:images/leanpub_info-circle.png[information,title="fig:information",width=50] -|Whether to save or update a bean is decided by checking the `id` field -of the bean. If `id` is set then SuiteCRM will attempt to perform an -update. If there is no `id` then one will be generated and a new record -will be inserted into the database. If for some reason you have supplied -an `id` but the record is new (perhaps in a custom import script) then -you can set `new_with_id` to true on the bean to let SuiteCRM know that -this record is new. -|======================================================================= - -[[related-beans]] -Related beans -^^^^^^^^^^^^^ - -We have seen how to save single records but, in a CRM system, -relationships between records are as important as the records -themselves. For example an account may have a list of cases associated -with it, a contact will have an account that it falls under etc. We can -get and set relationships between beans using several methods. - -[[get_linked_beans]] -get_linked_beans -++++++++++++++++ - -The `get_linked_beans` method allows retrieving a list of related beans -for a given record. - -Example 3.14: get_linked_beans method signature - -''''' - -.... -1 get_linked_beans( -2 $field_name, -3 $bean_name, -4 $sort_array = array(), -5 $begin_index = 0, -6 $end_index = -1, -7 $deleted=0, -8 $optional_where=""); -.... - -''''' - -$field_name:: - The link field name for this link. Note that this is not the same as - the name of the relationship. If you are unsure of what this should be - you can take a look into the cached vardefs of a module in - `cache/modules//Vardefs.php` for the link - definition. -$bean_name:: - The name of the bean that we wish to retrieve. -$sort_array:: - This is a legacy parameter and is unused. -$begin_index:: - Skips the initial `$begin_index` results. Can be used to paginate. -$end_index:: - Return up to the `$end_index` result. Can be used to paginate. -$deleted:: - Controls whether deleted or non deleted records are shown. If true - only deleted records will be returned. If false only non deleted - records will be returned. -$optional_where:: - Allows filtering the results using an SQL WHERE clause. See the - `get_list` method for more details. - -[[results-3]] -Results - -`get_linked_beans` returns an array of the linked beans. - -[[example-3]] -Example - -Example 3.15: Example get_linked_beans call - -''''' - -.... -1 $accountBean->get_linked_beans( -2 'contacts', -3 'Contacts', -4 array(), -5 0, -6 10, -7 0, -8 "contacts.primary_address_country = 'USA'"); -.... - -''''' - -[[relationships]] -relationships -+++++++++++++ - -In addition to the `get_linked_beans` call you can also load and access -the relationships more directly. - -[[loading]] -Loading - -Before accessing a relationship you must use the `load_relationship` -call to ensure it is available. This call takes the link name of the -relationship (not the name of the relationship). As mentioned previously -you can find the name of the link in -`cache/modules//Vardefs.php` if you’re not sure. - -Example 3.16: Loading a relationship - -''''' - -.... -1 //Load the relationship -2 $accountBean->load_relationship('contacts'); -3 //Can now call methods on the relationship object: -4 $contactIds = $accountBean->contacts->get(); -.... - -''''' - -[[methods]] -Methods - -[[get]] -`get` - -Returns the ids of the related records in this relationship e.g for the -account - contacts relationship in the example above it will return the -list of ids for contacts associated with the account. - -[[getbeans]] -`getBeans` - -Similar to `get` but returns an array of beans instead of just ids. - -[width="100%",cols="50%,50%",] -|======================================================================= -|image:images/leanpub_warning.png[warning,title="fig:warning",width=50] -|`getBeans` will load the full bean for each related record. This may -cause poor performance for relationships with a large number of beans. -|======================================================================= - -[[add]] -`add` - -Allows relating records to the current bean. `add` takes a single id or -bean or an array of ids or beans. If the bean is available this should -be used since it prevents reloading the bean. For example to add a -contact to the relationship in our example we can do the following: - -Example 3.18: Adding a new contact to a relationship - -''''' - -.... - 1 //Load the relationship - 2 $accountBean->load_relationship('contacts'); - 3 - 4 //Create a new demo contact - 5 $contactBean = BeanFactory::newBean(); - 6 $contactBean->first_name = 'Jim'; - 7 $contactBean->last_name = 'Mackin'; - 8 $contactBean->save(); - 9 -10 //Link the bean to $accountBean -11 $accountBean->contacts->add($contactBean); -.... - -''''' - -[[delete]] -`delete` - -`delete` allows unrelating beans. Counter-intuitively it accepts the ids -of both the bean and the related bean. For the related bean you should -pass the bean if it is available e.g when unrelating an account and -contact: - -Example 3.19: Removing a new contact from a relationship - -''''' - -.... -1 //Load the relationship -2 $accountBean->load_relationship('contacts'); -3 -4 //Unlink the contact from the account - assumes $contactBean is a Contact SugarB\ -5 ean -6 $accountBean->contacts->delete($accountBean->id, $contactBean); -.... - -''''' - -[width="100%",cols="50%,50%",] -|======================================================================= -|image:images/leanpub_warning.png[warning,title="fig:warning",width=50] -|Be careful with the delete method. Omitting the second argument will -cause all relationships for this link to be removed. -|======================================================================= - -[[vardefs]] -4. Vardefs -~~~~~~~~~~ - -[[what-are-vardefs]] -What are Vardefs -^^^^^^^^^^^^^^^^ - -The Vardefs are used to supply information to SuiteCRM about a -particular bean. These generally specify the fields, relationships and -indexes in a given module as well as additional information such as -whether it is audited, the table name etc. - -[[defining-vardefs]] -Defining Vardefs -^^^^^^^^^^^^^^^^ - -[[module]] -Module -++++++ - -Vardefs are initially defined in their respective modules folder. For -the Accounts module this will be in modules/Accounts/vardefs.php. The -information is stored in an array named $dictionary using the module -name as the key. For Accounts this will be `$dictionary['Account']`. -Let’s look at the Account vardefs (which have been edited for brevity): - -Example 4.1: Account Vardefs - -''''' - -.... - 1 $dictionary['Account'] = - 2 array( - 3 'table' => 'accounts', - 4 'audited'=>true, - 5 'unified_search' => true, - 6 'unified_search_default_enabled' => true, - 7 'duplicate_merge'=>true, - 8 'comment' => 'Accounts are organizations or entities that ...', - 9 'fields' => array ( -10 //Snipped for brevity. See the fields section. -11 ), -12 'indices' => array ( -13 //Snipped for brevity. See the indices section. -14 ), -15 'relationships' => array ( -16 //Snipped for brevity. See the relationship section. -17 ), -18 //This enables optimistic locking for Saves From EditView -19 'optimistic_locking'=>true, -20 ); -21 -22 VardefManager::createVardef( -23 'Accounts', -24 'Account', -25 array('default', 'assignable','company',) -26 ); -.... - -''''' - -[[keys]] -Keys - -The following are some of the keys that can be specified for the -vardefs. Fields, indices and relationships are covered in their own -sections. - -`table`:: - The database table name for this module. -`audited`:: - Whether or not this module should be audited. Note that `audited` must - also be set at the fields level for a field to be audited. -`unified_search`:: - Whether this module can be searchable via the global search. -`unified_search_default_enabled`:: - Whether this module is searchable via the global search by default. -`duplicate_merge`:: - Whether or not duplicate merging functionality is enabled for this - module. -`comment`:: - A description of this module. -`optimistic_locking`:: - Whether optimistic should be enabled for this module. Optimistic - locking locks concurrent edits on a record by assuming that there will - be no conflict. On save the last modified timestamp on the record will - be checked. If it is different then an edit has occurred since this - record was loaded. If this is the case then the user will be prompted - with a page showing the differences in the two edits and asked to - choose which edits are to be used. - -[[fields]] -Fields - -The field defines the behaviour and attributes of each field in the -module. - -`name`:: - The name of the field. -`vname`:: - The name of the language label to be used for this field. -`type`:: - The type of the field. See the field types section. -`isnull`:: - Whether null values are allowed -`len`:: - If the field is a string type, the max number of characters allowed. -`options`:: - For enum fields the language label for the dropdown values for this - field -`dbtype`:: - The type to be used by the database to store this field. This is not - required as the appropriate type is usually chosen. -`default`:: - The default value of this field. -`massupdate`:: - Whether or not this field should be mass updatable. Note that some - field types are always restricted from mass updates. -`rname`:: - For related fields only. The name of the field to be taken from the - related module. -`id_name`:: - For related fields only. The field in this bean which contains the - related id. -`source`:: - The source of this field. Can be set to ‘non-db’ if the field is not - stored in the database - for example for link fields, fields populated - by logic hooks or by other means. -`sort_on`:: - For concatenated fields (i.e. name fields) the field which should be - used to sort. -`fields`:: - For concatenated fields (i.e. name fields) an array of the fields - which should be concatenated. -`db_concat_fields`:: - For concatenated fields (i.e. name fields) an array of the fields - which should be concatenated in the database. Usually this is the same - as fields. -`unified_search`:: - True if this field should be searchable via the global search. -`enable_range_search`:: - Whether the list view search should allow a range search of this - field. This is used for date and numeric fields. -`studio`:: - Whether the field should display in studio. -`audited`:: - Whether or not changes to this field should be audited. - -[[field-types]] -Field types - -The following are common field types used: - -`id`:: - An id field. -`name`:: - A name field. This is usually a concatenation of other fields. -`bool`:: - A boolean field. -`varchar`:: - A variable length string field. -`char`:: - A character field. -`text`:: - A text area field. -`decimal`:: - A decimal field. -`date`:: - A date field. -`datetime`:: - A date and time field. -`enum`:: - A dropdown field. -`phone`:: - A phone number field. -`link`:: - A link to another module via a relationship. -`relate`:: - A related bean field. - -[[indices]] -Indices - -The indices array allows defining any database indexes that should be in -place on the database table for this module. Let’s look at an example: - -Example 4.2: Example indices definition - -''''' - -.... - 1 'indices' => array ( - 2 array( - 3 'name' =>'idx_mymod_id_del', - 4 'type' =>'index', - 5 'fields'=>array('id', 'deleted')), - 6 array( - 7 'name' =>'idx_mymod_parent_id', - 8 'type' =>'index', - 9 'fields'=>array( 'parent_id')), -10 array( -11 'name' =>'idx_mymod_parent_id', -12 'type' =>'unique', -13 'fields'=>array( 'third_party_id')), -14 ), -.... - -''''' - -Each array entry should have, at least, the following entries: - -name:: - The name of the index. This is usually used by the database to - reference the index. Most databases require that these are unique. -type:: - The type of the index to create. `index` will simply add an index on - the fields, `unique` will add a unique constraint on the fields, - `primary` will add the fields as a primary key. -fields:: - An array of the fields to be indexed. The order of this array will be - used as the order of the fields in the index. - -[[relationships-1]] -Relationships - -The Vardefs also specify the relationships within this module. Here’s an -edited example from the Accounts module: - -Example 4.3: Example relationships definition - -''''' - -.... - 1 'relationships' => array ( - 2 'account_cases' => array( - 3 'lhs_module'=> 'Accounts', - 4 'lhs_table'=> 'accounts', - 5 'lhs_key' => 'id', - 6 'rhs_module'=> 'Cases', - 7 'rhs_table'=> 'cases', - 8 'rhs_key' => 'account_id', - 9 'relationship_type' => 'one-to-many'), -10 ), -.... - -''''' - -Here we see the link between accounts and cases. This is specified with -the following keys: - -`lhs_module`:: - The module on the left hand side of this relationship. For a one to - many relationship this will be the “One” side. -`lhs_table`:: - The table for the left hand side module. If you are unsure the table - for a module can be found in it’s vardefs. -`lhs_key`:: - The field to use for the left hand side of this link. In this case it - is the `id` of the account. -`rhs_module`:: - The right hand side module. In this case the “many” side of the - relationship. -`rhs_table`:: - The table for the right hand side module. As stated previously you can - find the table for a module can be found in it’s vardefs. -`rhs_key`:: - The field to use on the right hand side. In this case the `account_id` - field on cases. -`relationship_type`:: - The type of relationship - “one-to-many” or “many-to-many”. Since this - is a one to many relationship it means a case is related to a single - account but a single account can have multiple cases. - -For many to many relationship fields the following keys are also -available: - -`join_table`:: - The name of the join table for this relationship. -`join_key_lhs`:: - The name of the field on the join table for the left hand side. -`join_key_rhs`:: - The name of the field on the join table for the right hand side. - -[[vardef-templates]] -Vardef templates -++++++++++++++++ - -Vardef templates provide a shortcut for defining common vardefs. This is -done by calling `VardefManager::createVardef` and passing the module -name, object name and an array of templates to be assigned. The -following is an example from the accounts vardefs: - -Example 4.4: Example vardef template - -''''' - -.... -22 VardefManager::createVardef( -23 'Accounts', -24 'Account', -25 array('default', 'assignable','company',) -26 ); -.... - -''''' - -In this example the `default`, `assignable` and `company` templates are -used. The following are some of the available templates: - -`basic` + -:: - -`default` - -:: - Adds the common base fields such as `id`, `name`, `date_entered`, etc. -`assignable`:: - Adds the fields and relationships necessary to assign a record to a - user. -`person`:: - Adds fields common to people records such as `first_name`, - `last_name`, address, etc. -`company`:: - Adds fields common to companies such as an industry dropdown, address, - etc. - -[[customising-vardefs]] -Customising vardefs -+++++++++++++++++++ - -Vardefs can be customised by adding a file into - -Example 4.5: Custom vardef location - -''''' - -.... -custom/Extension/modules/<TheModule>/Ext/SomeFile.php -.... - -''''' - -This file can then be used to add a new field definition or customise an -existing one e.g changing a field type: - -Example 4.6: Example overriding an existing vardef - -''''' - -.... -$dictionary["TheModule"]["fields"]["some_field"]['type'] = 'int'; -.... - -''''' - -[[views]] -5. Views -~~~~~~~~ - -SuiteCRM follows the MVC (Model-View-Controller) pattern and as such has -the concept of views. Views are responsible for gathering and displaying -data . There are a number of default views in SuiteCRM. These include - -ListView:: - Displays a list of records and provides links to the EditViews and - DetailViews of those records. The ListView also allows some operations - such as deleting and mass updating records. This is (usually) the - default view for a module. -DetailView:: - Displays the details of a single record and also displays subpanels of - related records. -EditView:: - The EditView allows editing the various fields of a record and - provides validation on these values. - -[[location]] -Location -^^^^^^^^ - -Views can be found in `modules//views/` or, for custom -views, + -`custom/modules//views/`, and are named in the following -format: `view..php`. For example, the Accounts DetailView can -be found in `modules/Accounts/views/view.detail.php` with a customised -version in `custom/modules/Accounts/views/view.detail.php`. The custom -version is used if it exists. If it doesn’t then the module version is -used. Finally, if neither of these exist then the SuiteCRM default is -used in `include/MVC/View/views/`. - -[[customising]] -Customising -^^^^^^^^^^^ - -In order to customise a View we first need to create the appropriate -view file. This will vary depending on the module we wish to target. - -[[custom-module]] -Custom module -+++++++++++++ - -In this case we can place the file directly into our module. Create a -new file (if it doesn’t exist) at -`modules//views/view..php`. The contents will look -similar to: - -Example 5.1: View for a custom module - -''''' - -.... -1 <?php -2 -3 require_once 'include/MVC/View/views/view.<viewname>.php'; -4 -5 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); -6 class <TheModule>View<ViewName> extends View<ViewName> -7 { -8 -9 } -.... - -''''' - -A more concrete example would be for the detail view for a custom module -called ABC_Vehicles: - -Example 5.2: Detail view for a custom module, ABC_Vehicles - -''''' - -.... -1 <?php -2 -3 require_once 'include/MVC/View/views/view.detail.php'; -4 -5 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); -6 class ABC_VehiclesViewDetail extends ViewDetail -7 { -8 -9 } -.... - -''''' - -[[preexisting-modules]] -Preexisting modules -+++++++++++++++++++ - -For preexisting modules you will want to add the view to + -`custom/modules//views/view..php`. - -The contents of this file will vary depending on whether you wish to -extend the existing view (if it exists) or create your own version -completely. It is usually best to extend the existing view, since this -will retain important logic. Note the naming convention here. We name -the class + -`CustomView` (for example -`CustomAccountsViewDetail`). - -Here we don’t extend the existing view or no such view exists: - -Example 5.3: Custom view for an existing module - -''''' - -.... -1 <?php -2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); -3 -4 require_once 'include/MVC/View/views/view.<viewname>.php'; -5 -6 class Custom<TheModule>View<ViewName> extends ViewDetail -7 { -8 -9 } -.... - -''''' - -Otherwise we extend the existing view. Note that we are requiring the -existing view: - -Example 5.4: Overriding a view for an existing module - -''''' - -.... -1 <?php -2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); -3 -4 require_once 'modules/<TheModule>/views/view.<viewname>.php'; -5 -6 class Custom<TheModule>View<ViewName> extends <TheModule>View<ViewName> -7 { -8 -9 } -.... - -''''' - -For example, overriding the List View of Accounts: - -Example 5.5: Overriding the Accounts List View - -''''' - -.... -1 <?php -2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); -3 -4 require_once 'modules/Accounts/views/view.list.php'; -5 -6 class CustomAccountsViewList extends AccountsViewList -7 { -8 -9 } -.... - -''''' - -[[making-changes]] -Making changes -++++++++++++++ - -Now that we have a custom view what can we actually do? The views have -various methods which we can now override to change/add behaviour. The -most common ones to override are: - -preDisplay:: - Explicitly intended to allow logic to be called before display() is - called. This can be used to alter arguments to the list view or to - output anything to appear before the main display code (such as, for - example, adding JavaScript). -display:: - Does the actual work of displaying the view. Can be overridden to - alter this behaviour or to output anything after the main display. You - usually want to call parent::display(); to ensure that the display - code is run (unless, of course, you are adding your own display - logic). - -[[metadata]] -6. Metadata -~~~~~~~~~~~ - -[[intro]] -Intro -^^^^^ - -Module metadata are used to describe how various views behave in the -module. The main use of this is providing field and layout information -but this can also be used to filter subpanels and to describe what -fields are used in the search. - -[[location-1]] -Location -^^^^^^^^ - -Module metadata can be found in: - -Example 6.1: Module metadata location - -''''' - -.... -modules/<TheModule>/metadata/ -.... - -''''' - -[[customising-1]] -Customising -^^^^^^^^^^^ - -Usually studio is the best way of customising metadata. Even when you do -wish to make customisations that are not possible through studio it can -be simpler to set everything up in studio first. This is particularly -true for layout based metadata. However if you are customising metadata -it is as simple as placing, or editing, the file in the custom -directory. For example to override the Accounts detailviewdefs (found in -`modules/Accounts/metadata/detailviewdefs.php`) we would place (or edit) -the file in `custom/modules/Accounts/metadata/detailviewdefs.php`. One -exception to this rule is the studio.php file. The modules metadata -folder is the only location checked - any version in -`custom//metadata/studio.php` is ignored. - -[[different-metadata]] -Different metadata -^^^^^^^^^^^^^^^^^^ - -[[detailviewdefs.php]] -detailviewdefs.php -++++++++++++++++++ - -detailviewdefs.php provides information on the layout and fields of the -detail view for this module. This file uses the same structure as -editviewdefs.php. Let’s look at an example for a fictional module -`ABC_Vehicles`: - -Example 6.2: DetailView metadata definition - -''''' - -.... - 1 <?php - 2 $viewdefs ['ABC_Vehicles'] ['DetailView'] = array ( - 3 'templateMeta' => array ( - 4 'form' => array ( - 5 'buttons' => array ( - 6 'EDIT', - 7 'DUPLICATE', - 8 'DELETE', - 9 'FIND_DUPLICATES' -10 ) -11 ), -12 'maxColumns' => '2', -13 'widths' => array ( -14 array ( -15 'label' => '10', -16 'field' => '30' -17 ), -18 array ( -19 'label' => '10', -20 'field' => '30' -21 ) -22 ), -23 'includes' => array ( -24 array ( -25 'file' => 'modules/ABC_Vehicles/ABC_VehiclesDetail.js' -26 ) -27 ) -28 ), -29 'panels' => array ( -30 'LBL_ABC_VEHICLES_INFO' => array ( -31 array ( -32 array ( -33 'name' => 'name', -34 'comment' => 'The Name of the Vehicle', -35 'label' => 'LBL_NAME', -36 ), -37 'reg_number' -38 ), -39 array ( -40 array ( -41 'name' => 'type', -42 'label' => 'LBL_TYPE', -43 ), -44 array ( -45 'name' => 'phone_fax', -46 'comment' => 'The fax phone number of this company', -47 'label' => 'LBL_FAX' -48 ) -49 ), -50 array ( -51 array ( -52 'name' => 'registered_address_street', -53 'label' => 'LBL_REGISTERED_ADDRESS', -54 'type' => 'address', -55 'displayParams' => array ( -56 'key' => 'registered' -57 ) -58 ), -59 ), -60 ), -61 'LBL_PANEL_ADVANCED' => array ( -62 array ( -63 array ( -64 'name' => 'assigned_user_name', -65 'label' => 'LBL_ASSIGNED_TO' -66 ), -67 array ( -68 'name' => 'date_modified', -69 'label' => 'LBL_DATE_MODIFIED', -70 'customCode' => '{$fields.date_modified.value} ' -71 + '{$APP.LBL_BY} ' -72 + '{$fields.modified_by_name.value}', -73 ) -74 ), -75 ), -76 ) -77 ); -78 ?> -.... - -''''' - -We see that line 2 defines an array -`$viewdefs['ABC_Vehicles']['DetailView']` which places a DetailView -entry for the module ABC_Vehicles into `$viewdefs` (DetailView will be -EditView or QuickCreateView as appropriate). This array has two main -keys defined here: - -[[templatemeta]] -templateMeta - -The templateMeta key provides information about the view in general. The -`['form']['buttons']` entries define the buttons that should appear in -this view. - -`maxColumns`:: - Defines the number of columns to use for this view. It is unusual for - this to be more than 2. -`widths`:: - An array defining the width of the label and field for each column. -`includes`:: - An array of additional JavaScript files to include. This is useful for - adding custom JavaScript behaviour to the page. - -[[panels]] -panels - -The panels entry defines the actual layout of the Detail (or Edit) view. -Each entry is a new panel in the view with the key being the label for -that panel. We can see in our example that we have 2 panels. One uses -the label defined by the language string `LBL_ABC_VEHICLES_INFO`, the -other uses `LBL_PANEL_ADVANCED`. - -Each panel has an array entry for each row, with each array containing -an entry for each column. For example we can see that the first row has -the following definition: - -Example 6.3: DetailView metadata row definition - -''''' - -.... -31 array( -32 array ( -33 'name' => 'name', -34 'comment' => 'The Name of the Vehicle', -35 'label' => 'LBL_NAME', -36 ), -37 'reg_number', -38 ), -.... - -''''' - -This has an array definition for the first row, first column and a -string definition for the first row, second column. The string -definition is very straightforward and simply displays the detail (or -edit, as appropriate) view for that field. It will use the default -label, type, etc. In our example we are displaying the field named -`reg_number`. - -The array definition for the first row, first column is a little more -complex. Each array definition must have a `name` value. In our example -we are displaying the `name` field. However we also supply some other -values. Values most commonly used are: - -`comment`:: - Used to note the purpose of the field. -`label`:: - The language key for this label. If the language key is not recognised - then this value will be used instead (see the - link:#chap08.xhtml#language-chapter[chapter on language]). -`displayParams`:: - An array used to pass extra arguments for the field display. For the - options and how they are used you can have a look into the appropriate - field type in `include/SugarFields/Fields` or - `custom/include/SugarFields/Fields`. An example is setting the size of - a textarea: - -Example 6.4: DetailView metadata displayParams - -''''' - -.... -1 'displayParams' => array( -2 'rows' => 2, -3 'cols' => 30, -4 ), -.... - -''''' - -customCode:: - Allows supplying custom smarty code to be used for the display. The - code here can include any valid smarty code and this will also have - access to the current fields in this view via `$fields`. An example of - outputing the ID field would be `{$fields.id.value}`. Additionally the - module labels and app labels can be accessed via `$MOD` and `$APP` - respectively. Finally you can use `@@FIELD@@` to output the value of - the field that would have been used. For example - `{if $someCondition}@@FIELD@@{/if}` will conditionally show the field. - -[[editviewdefs.php]] -editviewdefs.php -++++++++++++++++ - -`editviewdefs.php` provides information on the layout and fields of the -edit view for this module. This file uses the same structure as -detailviewdefs.php. Please see the information on detailviewdefs.php. - -[[listviewdefs.php]] -listviewdefs.php -++++++++++++++++ - -The `listviewdefs.php` file for a module defines what fields the list -view for that module will display. Let’s take a look at an example: - -Example 6.5: ListView metadata definition - -''''' - -.... - 1 $listViewDefs ['AOR_Reports'] = - 2 array ( - 3 'NAME' => - 4 array ( - 5 'width' => '15%', - 6 'label' => 'LBL_NAME', - 7 'default' => true, - 8 'link' => true, - 9 ), -10 'REPORT_MODULE' => -11 array ( -12 'type' => 'enum', -13 'default' => true, -14 'studio' => 'visible', -15 'label' => 'LBL_REPORT_MODULE', -16 'width' => '15%', -17 ), -18 'ASSIGNED_USER_NAME' => -19 array ( -20 'width' => '15%', -21 'label' => 'LBL_ASSIGNED_TO_NAME', -22 'module' => 'Employees', -23 'id' => 'ASSIGNED_USER_ID', -24 'default' => true, -25 ), -26 'DATE_ENTERED' => -27 array ( -28 'type' => 'datetime', -29 'label' => 'LBL_DATE_ENTERED', -30 'width' => '15%', -31 'default' => true, -32 ), -33 'DATE_MODIFIED' => -34 array ( -35 'type' => 'datetime', -36 'label' => 'LBL_DATE_MODIFIED', -37 'width' => '15%', -38 'default' => true, -39 ), -40 ); -.... - -''''' - -To define the list view defs we simply add a key to the `$listViewDefs` -array. In this case we add an entry for `AOR_Reports` This array -contains an entry for each field that we wish to show in the list view -and is keyed by the upper case name of the field. For example, the -`REPORT_MODULE` key refers to the `report_module` field of AOR_Reports. - -type:: - The type of the field. This can be used to override how a field is - displayed. -default:: - Whether this field should be shown in the list view by default. If - false then the field will appear in the available columns list in - studio. -studio:: - Whether or not this field should be displayed in studio. This can be - useful to ensure that a critical field is not removed. -label:: - The label to be used for this field. If this is not supplied then the - default label for that field will be used. -width:: - The width of the field in the list view. Note that, although this is - usually given as a percentage it is treated as a proportion. The - example above has five columns with a width of `15%` but these will - actually be `20%` since this is a ratio. - -[[popupdefs.php]] -popupdefs.php -+++++++++++++ - -popupdefs.php provides information on the layout, fields and search -options of the module popup that is usually used when selecting a -related record. - -Let’s look at the default popupdefs.php for the Accounts module: - -Example 6.6: PopupView metadata definition - -''''' - -.... - 1 $popupMeta = array( - 2 'moduleMain' => 'Case', - 3 'varName' => 'CASE', - 4 'className' => 'aCase', - 5 'orderBy' => 'name', - 6 'whereClauses' => - 7 array('name' => 'cases.name', - 8 'case_number' => 'cases.case_number', - 9 'account_name' => 'accounts.name'), -10 'listviewdefs' => array( -11 'CASE_NUMBER' => array( -12 'width' => '5', -13 'label' => 'LBL_LIST_NUMBER', -14 'default' => true), -15 'NAME' => array( -16 'width' => '35', -17 'label' => 'LBL_LIST_SUBJECT', -18 'link' => true, -19 'default' => true), -20 'ACCOUNT_NAME' => array( -21 'width' => '25', -22 'label' => 'LBL_LIST_ACCOUNT_NAME', -23 'module' => 'Accounts', -24 'id' => 'ACCOUNT_ID', -25 'link' => true, -26 'default' => true, -27 'ACLTag' => 'ACCOUNT', -28 'related_fields' => array('account_id')), -29 'PRIORITY' => array( -30 'width' => '8', -31 'label' => 'LBL_LIST_PRIORITY', -32 'default' => true), -33 'STATUS' => array( -34 'width' => '8', -35 'label' => 'LBL_LIST_STATUS', -36 'default' => true), -37 'ASSIGNED_USER_NAME' => array( -38 'width' => '2', -39 'label' => 'LBL_LIST_ASSIGNED_USER', -40 'default' => true, -41 ), -42 ), -43 'searchdefs' => array( -44 'case_number', -45 'name', -46 array( -47 'name' => 'account_name', -48 'displayParams' => array( -49 'hideButtons'=>'true', -50 'size'=>30, -51 'class'=>'sqsEnabled sqsNoAutofill' -52 ) -53 ), -54 'priority', -55 'status', -56 array( -57 'name' => 'assigned_user_id', -58 'type' => 'enum', -59 'label' => 'LBL_ASSIGNED_TO', -60 'function' => array( -61 'name' => 'get_user_array', -62 'params' => array(false)) -63 ), -64 ) -65 ); -.... - -''''' - -The popupdefs.php specifies a `$popupMeta` array with the following -keys: - -`moduleMain`:: - The module that will be displayed by this popup. -`varName`:: - The variable name used to store the search preferences etc. This will - usually simply the upper case module name. -`className`:: - The class name of the SugarBean for this module. If this is not - supplied then `moduleMain` will be used. This is only really required - for classes where the class name and module name differ (such as - Cases). -`orderBy`:: - The default field the list of records will be sorted by. -`whereClauses`:: - Legacy option. This is only used as a fallback when there are no - searchdefs. Defines the names of fields to allow searching for and - their database representation. -`listviewdefs`:: - The list of fields displayed in the popup list view. See - `listviewdefs.php`. -`searchdefs`:: - An array of the fields that should be available for searching in the - popup. See the individual search defs in the searchdefs.php section - (for example the `basic_search` array). - -[[quickcreatedefs.php]] -quickcreatedefs.php -+++++++++++++++++++ - -`quickcreatedefs.php` provides information on the layout and fields of -the quick create view for this module (this is the view that appears -when creating a record from a subpanel). This file uses the same -structure as `detailviewdefs.php`. Please see the information on -`detailviewdefs.php`. - -[[searchdefs.php]] -searchdefs.php -++++++++++++++ - -The search defs of a module define how searching in that module looks -and behaves. - -Let’s look at an example. - -Example 6.7: Search View metadata definition - -''''' - -.... - 1 $searchdefs ['Accounts'] = array ( - 2 'templateMeta' => array ( - 3 'maxColumns' => '3', - 4 'maxColumnsBasic' => '4', - 5 'widths' => array ( - 6 'label' => '10', - 7 'field' => '30' - 8 ) - 9 ), - 10 'layout' => array ( - 11 'basic_search' => array ( - 12 'name' => array ( - 13 'name' => 'name', - 14 'default' => true, - 15 'width' => '10%' - 16 ), - 17 'current_user_only' => array ( - 18 'name' => 'current_user_only', - 19 'label' => 'LBL_CURRENT_USER_FILTER', - 20 'type' => 'bool', - 21 'default' => true, - 22 'width' => '10%' - 23 ) - 24 ) - 25 , - 26 'advanced_search' => array ( - 27 'name' => array ( - 28 'name' => 'name', - 29 'default' => true, - 30 'width' => '10%' - 31 ), - 32 'website' => array ( - 33 'name' => 'website', - 34 'default' => true, - 35 'width' => '10%' - 36 ), - 37 'phone' => array ( - 38 'name' => 'phone', - 39 'label' => 'LBL_ANY_PHONE', - 40 'type' => 'name', - 41 'default' => true, - 42 'width' => '10%' - 43 ), - 44 'email' => array ( - 45 'name' => 'email', - 46 'label' => 'LBL_ANY_EMAIL', - 47 'type' => 'name', - 48 'default' => true, - 49 'width' => '10%' - 50 ), - 51 'address_street' => array ( - 52 'name' => 'address_street', - 53 'label' => 'LBL_ANY_ADDRESS', - 54 'type' => 'name', - 55 'default' => true, - 56 'width' => '10%' - 57 ), - 58 'address_city' => array ( - 59 'name' => 'address_city', - 60 'label' => 'LBL_CITY', - 61 'type' => 'name', - 62 'default' => true, - 63 'width' => '10%' - 64 ), - 65 'address_state' => array ( - 66 'name' => 'address_state', - 67 'label' => 'LBL_STATE', - 68 'type' => 'name', - 69 'default' => true, - 70 'width' => '10%' - 71 ), - 72 'address_postalcode' => array ( - 73 'name' => 'address_postalcode', - 74 'label' => 'LBL_POSTAL_CODE', - 75 'type' => 'name', - 76 'default' => true, - 77 'width' => '10%' - 78 ), - 79 'billing_address_country' => array ( - 80 'name' => 'billing_address_country', - 81 'label' => 'LBL_COUNTRY', - 82 'type' => 'name', - 83 'options' => 'countries_dom', - 84 'default' => true, - 85 'width' => '10%' - 86 ), - 87 'account_type' => array ( - 88 'name' => 'account_type', - 89 'default' => true, - 90 'width' => '10%' - 91 ), - 92 'industry' => array ( - 93 'name' => 'industry', - 94 'default' => true, - 95 'width' => '10%' - 96 ), - 97 'assigned_user_id' => array ( - 98 'name' => 'assigned_user_id', - 99 'type' => 'enum', -100 'label' => 'LBL_ASSIGNED_TO', -101 'function' => array ( -102 'name' => 'get_user_array', -103 'params' => array ( -104 0 => false -105 ) -106 ), -107 'default' => true, -108 'width' => '10%' -109 ) -110 ) -111 ) -112 ); -.... - -''''' - -Here we setup a new array for `Accounts` in the `$searchdefs` array. -This has two keys: - -[[templatemeta-1]] -templateMeta - -The `templateMeta` key controls the basic look of the search forms. Here -we define some overall layout info such as the maximum columns (3) and -the maximum number of columns for the basic search (4). Finally we set -the widths for the search fields and their labels. - -[[layout]] -layout - -The `layout` key contains the layout definitions for the basic search -and advanced search. This is simply a list of array definition of the -fields. See the section on listviewdefs.php for a description of some of -the options. - -[[subpaneldefs.php]] -`subpaneldefs.php` -++++++++++++++++++ - -The subpaneldefs.php file provides definitions for the subpanels that -appear in the detail view of a module. Let’s look at an example: - -Example 6.8: Subpanel metadata definition - -''''' - -.... - 1 $layout_defs['AOS_Quotes'] = array ( - 2 'subpanel_setup' => array ( - 3 'aos_quotes_aos_contracts' => array ( - 4 'order' => 100, - 5 'module' => 'AOS_Contracts', - 6 'subpanel_name' => 'default', - 7 'sort_order' => 'asc', - 8 'sort_by' => 'id', - 9 'title_key' => 'AOS_Contracts', -10 'get_subpanel_data' => 'aos_quotes_aos_contracts', -11 'top_buttons' => array ( -12 0 => array ( -13 'widget_class' => 'SubPanelTopCreateButton' -14 ), -15 1 => array ( -16 'widget_class' => 'SubPanelTopSelectButton', -17 'popup_module' => 'AOS_Contracts', -18 'mode' => 'MultiSelect' -19 ) -20 ) -21 ), -22 'aos_quotes_aos_invoices' => array ( -23 'order' => 100, -24 'module' => 'AOS_Invoices', -25 'subpanel_name' => 'default', -26 'sort_order' => 'asc', -27 'sort_by' => 'id', -28 'title_key' => 'AOS_Invoices', -29 'get_subpanel_data' => 'aos_quotes_aos_invoices', -30 'top_buttons' => array ( -31 0 => array ( -32 'widget_class' => 'SubPanelTopCreateButton' -33 ), -34 1 => array ( -35 'widget_class' => 'SubPanelTopSelectButton', -36 'popup_module' => 'AOS_Invoices', -37 'mode' => 'MultiSelect' -38 ) -39 ) -40 ), -41 'aos_quotes_project' => array ( -42 'order' => 100, -43 'module' => 'Project', -44 'subpanel_name' => 'default', -45 'sort_order' => 'asc', -46 'sort_by' => 'id', -47 'title_key' => 'Project', -48 'get_subpanel_data' => 'aos_quotes_project', -49 'top_buttons' => array ( -50 0 => array ( -51 'widget_class' => 'SubPanelTopCreateButton' -52 ), -53 1 => array ( -54 'widget_class' => 'SubPanelTopSelectButton', -55 'popup_module' => 'Accounts', -56 'mode' => 'MultiSelect' -57 ) -58 ) -59 ) -60 ) -61 ); -.... - -''''' - -In the example above we set up a definition for a module (in this case -`AOS_Quotes`) in the `$layout_defs` array. This has a single key -`subpanel_setup` which is an array of each of the subpanel definitions -keyed by a name. This name should be something recognisable. In the case -above it is the name of the link field displayed by the subpanel. The -entry for each subpanel usually has the following defined: - -order:: - A number used for sorting the subpanels. The values themselves are - arbitrary and are only used relative to other subpanels. -module:: - The module which will be displayed by this subpanel. For example the - `aos_quotes_project` def in the example above will display a list of - `Project` records. -subpanel_name:: - The subpanel from the displayed module which will be used. See the - subpanels section of this chapter. -sort_by:: - The field to sort the records on. -sort_order:: - The order in which to sort the `sort_by` field. `asc` for ascending - `desc` for descending. -title_key:: - The language key to be used for the label of this subpanel. -get_subpanel_data:: - Used to specify where to retrieve the subpanel records. Usually this - is just a link name for the current module. In this case the related - records will be displayed in the subpanel. However, for more complex - links, it is possible to specify a function to call. When specifying a - function you should ensure that the `get_subpanel_data` entry is in - the form `function:theFunctionName`. Additionally you can specify the - location of the function and any additional parameters that are needed - by using the `function_parameters` key. An example of a subpanel which - uses a function can be found in link:#chap19.xhtml#appendix-a[Appendix - A]. -function_parameters:: - Specifies the parameters for a subpanel which gets it’s information - from a function (see + - -`get_subpanel_data`). This is an array which allows specifying where the -function is by using the `import_function_file` key (if this is absent -but `get_subpanel_data` defines a function then the function will be -called on the bean for the parent of the subpanel). Additionally this -array will be passed as an argument to the function defined in -`get_subpanel_data` which allows passing in arguments to the function. - -generate_select:: - For function subpanels (see `get_subpanel_data`) whether or not the - function will return an array representing the query to be used (for - `generate_select = true`) or whether it will simply return the query - to be used as a string. -get_distinct_data:: - Whether or not to only return distinct rows. Relationships do not - allow linking two records more than once therefore this only really - applies if the subpanel source is a function. See + - -`get_subpanel_data` for information on function subpanel sources. - -top_buttons:: - Allows defining the buttons to appear on the subpanel. This is simply - an array of the button definitions. These definitions have, at least, - the `widget_class` defined which decides the button class to use in - `include/generic/SugarWidgets`. Depending on the button this array may - also be used to pass in extra arguments to the widget class. - -[[subpanels]] -subpanels -+++++++++ - -Inside the metadata folder is the `subpanels` folder. This allows -creating different subpanel layouts for different parent modules. For -example, the Contacts module will display differently in the subpanel on -an account than it will in the subpanel of a case. The files inside the -`subpanels` folder can be named anything. All that matters is that it -can be referenced in the `subpanel_name` of the `subpaneldefs.php` of -the parent module. The usual subpanel file is simply called -`default.php`. Let’s look at the -`modules/Accounts/metadata/subpanels/default.php` file: - -Example 6.8: Module Subpanels definition - -''''' - -.... - 1 $subpanel_layout = array( - 2 'top_buttons' => array( - 3 array( - 4 'widget_class' => 'SubPanelTopCreateButton' - 5 ), - 6 array( - 7 'widget_class' => 'SubPanelTopSelectButton', - 8 'popup_module' => 'Accounts' - 9 ), -10 ), -11 'where' => '', -12 'list_fields' => array ( -13 'name' => -14 array ( -15 'vname' => 'LBL_LIST_ACCOUNT_NAME', -16 'widget_class' => 'SubPanelDetailViewLink', -17 'width' => '45%', -18 'default' => true, -19 ), -20 'billing_address_city' => -21 array ( -22 'vname' => 'LBL_LIST_CITY', -23 'width' => '20%', -24 'default' => true, -25 ), -26 'billing_address_country' => -27 array ( -28 'type' => 'varchar', -29 'vname' => 'LBL_BILLING_ADDRESS_COUNTRY', -30 'width' => '7%', -31 'default' => true, -32 ), -33 'phone_office' => -34 array ( -35 'vname' => 'LBL_LIST_PHONE', -36 'width' => '20%', -37 'default' => true, -38 ), -39 'edit_button' => -40 array ( -41 'vname' => 'LBL_EDIT_BUTTON', -42 'widget_class' => 'SubPanelEditButton', -43 'width' => '4%', -44 'default' => true, -45 ), -46 'remove_button' => -47 array ( -48 'vname' => 'LBL_REMOVE', -49 'widget_class' => 'SubPanelRemoveButtonAccount', -50 'width' => '4%', -51 'default' => true, -52 ), -53 ) -54 ); -.... - -''''' - -There are three keys in the `$subpanel_layout` variable for this -subpanel. These are: - -`top_buttons`:: - Defines the buttons that will appear at the top of the subpanel. See - the `top_buttons` key in `subpaneldefs.php`. -`where`:: - Allows the addition of conditions to the `where` clause. For example - this could be used to exclude Cases that are closed - (`cases.state != "Closed"`) or only include Accounts of a specific - industry (`accounts.industry = "Media"`). Note that in these examples - we specify the table to remove any ambiguity in the query. -`list_fields`:: - Defines the list of fields to be displayed in this subpanel. See the - section on `listviewdefs.php` for more information. - -[[studio.php]] -studio.php -++++++++++ - -studio.php is the simplest file in metadata and it’s existence is simply -used to confirm if a module should be shown in studio for user tweaking. -Note that, unlike other metadata files, the file in -`modules//metadata/studio.php` will be the only one checked. -A file in `custom/modules//metadata/studio.php` will have no -effect. - -[[controllers]] -7. Controllers -~~~~~~~~~~~~~~ - -SuiteCRM follows the MVC (Model-View-Controller) pattern and as such has -the concept of controllers. The controller is responsible for making -changes to the Model as well as passing control to the view as -appropriate. SuiteCRM has the concept of actions which are actions that -will be taken by the controller. Let’s take a look at a SuiteCRM URL: - -Example 7.1: Example SuiteCRM URL - -''''' - -.... -example.com/index.php?module=Accounts&action=index -.... - -''''' - -In this (rather boring) example we see that the module is Accounts. This -will determine which controller to use and then call the index action on -that controller. - -SuiteCRM will first look for the controller in -`custom/module//controller.php`. If this is not found then -next `module//controller.php` will be checked. Finally if -neither of these controllers exist then the default controller will be -used. The default controller can be found in -`include/MVC/Controller/SugarController.php`. - -[[customising-controllers]] -Customising controllers -^^^^^^^^^^^^^^^^^^^^^^^ - -Ordinarily the default controller handles the request and delegates to -the appropriate views etc. However custom controllers can be used to add -or alter functionality. Let’s look at adding a new action. - -In the first instance we will have to add our custom controller. This -will vary slightly depending on the nature of the module. - -[[custom-module-1]] -Custom module -+++++++++++++ - -In this case we can place the file directly into our module. You should -create a new file (if it doesn’t exist) at -`modules//controller.php`. The contents will look similar to: - -Example 7.2: Creating a custom controller for a custom module - -''''' - -.... -1 <?php -2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); -3 class <TheModule>Controller extends SugarController -4 { -5 -6 } -.... - -''''' - -[[pre-existing-modules]] -Pre-existing modules -++++++++++++++++++++ - -For pre-existing modules you should add the controller to + -`custom/modules//controller.php`. - -The contents of this file will vary depending on whether you wish to -extend the existing controller (if it exists) or create your own version -completely. It is usually best to extend the existing controller since -this will retain important logic. You should note the naming convention -here. We name the class + -`CustomController`. - -Here we don’t extend the existing controller or no such controller -exists: - -Example 7.3: Creating a custom controller for an existing module - -''''' - -.... -1 <?php -2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); -3 class Custom<TheModule>Controller extends SugarController -4 { -5 -6 } -.... - -''''' - -Alternatively we extend the existing controller. Note that we are -requiring the existing controller: - -Example 7.4: Creating a custom controller for an existing module with an -existing controller - -''''' - -.... -1 <?php -2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); -3 -4 require_once 'modules/<TheModule>/controller.php'; -5 -6 class Custom<TheModule>Controller extends <TheModule>Controller -7 { -8 -9 } -.... - -''''' - -[[adding-the-action]] -Adding the action -+++++++++++++++++ - -Now we can add a new action to our controller. Actions are created as -methods on the controller with the name `action_`. For -example, to create a new action called ‘echo’ we could create the -following method in one of the controllers we have created above. This -can then perform whatever logic that is needed. In our example we will -log the REQUEST and simply redirect: - -Example 7.5: Adding a custom controller action method - -''''' - -.... -1 public function action_echo(){ -2 $GLOBALS['log']->debug("Echo called with request: ".print_r($_REQUEST,1)); -3 SugarApplication::redirect('index.php'); -4 } -.... - -''''' - -[[legacy-style]] -Legacy Style -++++++++++++ - -In previous versions of SugarCRM a new action was added by creating a -file in either `modules//.php` or -`custom/modules//.php`. Although this still works -it is not recommended. - -[[entry-points]] -8. Entry Points -~~~~~~~~~~~~~~~ - -Entry points are simply a page which provides access to SuiteCRM. These -can be used for a variety of purposes such as allowing an external form -simple access to SuiteCRM or, as is the case with the stock Events -module, allowing an event invite to be responded to by clicking a link -in an email. - -[[creating-an-entry-point]] -Creating an entry point -^^^^^^^^^^^^^^^^^^^^^^^ - -Let’s create a simple entry point to display the time. First we define -this entry point in a new file in: - -Example 8.1: Entry point registry location - -''''' - -.... -custom/Extension/application/Ext/EntryPointRegistry/ -.... - -''''' - -For our example we’ll call our new file MyTimeEntryPoint.php - -Example 8.2: Example entry point location - -''''' - -.... -custom/Extension/application/Ext/EntryPointRegistry/MyTimeEntryPoint.php -.... - -''''' - -In this file we will add a new entry to the `$entry_point_registry`. We -supply the file that should be called. Here we are simply placing the -file in custom if the entry point is related to a specific module it is -usually a good idea to place this somewhere inside -`custom//`. - -In addition we supply an “auth” parameter. If “auth” is true then anyone -accessing the entry point will need to be logged into SuiteCRM. - -Example 8.3: Adding an entry point entry - -''''' - -.... -1 <?php -2 $entry_point_registry['MyTimeEntryPoint'] = array( -3 'file' => 'custom/MyTimeEntryPoint.php', -4 'auth' => true, -5 ); -.... - -''''' - -Finally we add the actual logic itself inside -custom/MyTimeEntryPoint.php: - -Example 8.4: Example entry point that outputs the current time - -''''' - -.... -1 <?php -2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); -3 $date = new DateTime(); -4 echo $date->format('r'); -.... - -''''' - -After a Quick Repair and Rebuild we can access our entry point: - -Example 8.5: Custom entry point URL - -''''' - -.... -example.com/index.php?entryPoint=MyTimeEntryPoint -.... - -''''' - -and we should see something similar to: - -Example 8.6: MyTimeEntryPoint - -''''' - -.... -Sun, 15 Mar 2015 13:03:03 +0000 -.... - -''''' - -Obviously this is a contrived example but any logic that can be -performed elsewhere in SuiteCRM can be performed in an entry point (for -example creating or editing -link:#chap02.xhtml#working-with-beans-chapter[SugarBeans]). - -[[language-strings]] -9. Language Strings -~~~~~~~~~~~~~~~~~~~ - -Language strings provide an element of internationalisation to SuiteCRM. -It allows specifying different strings to be used in different languages -making it much easier to provide translations for modules and -customisations. Even if you are only targeting a single language it is -still worth using the language string functionality in SuiteCRM because -it allows the simple changing of strings within SuiteCRM and it also -allows users to customise the labels used in your customisations. There -are three main types of language strings that we will cover here. - -At the core, the language strings are a key value store. The keys are -used throughout SuiteCRM and the values are loaded based on the current -language. - -Languages are handled in SuiteCRM by prefixing the file name with the -IETF language code for the language that this file contains. Here are -some examples of different language file names: - -Example 9.1: Example language file names - -''''' - -.... -# Core Accounts language file for en_us (United States English) -modules/Accounts/language/en_us.lang.php - -# Core Cases language file for es_es (Spanish as spoken in Spain) -modules/Cases/language/es_es.lang.php - -# Custom language file for de_de (German) -custom/Extension/application/Ext/Language/de_de.SomeCustomPackage.php -.... - -''''' - -SuiteCRM will choose the language prefix to be used based on the -language the user selected when logging in or the default language if -none was selected. Generally when a language file is loaded the default -language files and the `en_us` files will also be loaded. These files -are then merged. This ensures that there will still be a definition if -there are language keys in either `en_us` or the default language that -don’t have definitions in the current language. In essence the language -“falls back” to the default language and `en_us` if there are missing -keys. - -[[module-strings]] -Module Strings -^^^^^^^^^^^^^^ - -[[use]] -Use -+++ - -Module strings are strings associated with a particular module. These -are usually, for example, field labels and panel name labels, but they -may be used for anything that is specific to a single module. - -[[definition-location]] -Definition location -+++++++++++++++++++ - -Module strings are defined in the `$mod_strings` array. This is -initially defined in + -`modules//language/.lang.php`, for example + -`modules/Accounts/language/en_us.lang.php`. - -[[customisation-location]] -Customisation location -++++++++++++++++++++++ - -Customisations can be made to the module strings by adding a new file -in + -`custom/Extension/modules//Ext/Language/..php` -(`` in this case should be used to give it a descriptive name). An -example is -`custom/Extension/modules/Accounts/Ext/Language/en_us.MyLanguageFile.php`. -See the Extensions section for more information on the Extensions -folder. - -[[application-strings]] -Application Strings -^^^^^^^^^^^^^^^^^^^ - -[[use-1]] -Use -+++ - -Application strings are used for language strings and labels that are -not specific to a single module. Examples of these may include labels -that will appear in the headers or footers, labels that appear on search -buttons throughout SuiteCRM or labels for pagination controls. - -[[definition-location-1]] -Definition location -+++++++++++++++++++ - -The application strings are defined in the `$app_strings` array. This is -initially defined in + -`include/language/.lang.php`. - -[[customisation-location-1]] -Customisation location -++++++++++++++++++++++ - -Customisations can be made to the application strings in two ways. -Firstly you can edit the file + -`custom/include/language/.lang.php`. However to promote -modularity it is recommended that you add a new file in the location + -`custom/Extension/application/Ext/Language/..php`. -For example + -`custom/Extension/application/Ext/Language/es_es.MyAppLanguageFile.php`. -`` should be used to give the file a descriptive name. See the -Extensions section for more information on the Extensions folder. - -[[application-list-strings]] -Application List Strings -^^^^^^^^^^^^^^^^^^^^^^^^ - -[[use-2]] -Use -+++ - -Application list strings are used to store the various dropdowns and -lists used in SuiteCRM. Most of these are used as options for the -various enum fields in SuiteCRM e.g the account type or the opportunity -sales stage. - -[[definition-location-2]] -Definition location -+++++++++++++++++++ - -The application list strings are defined in the `$app_list_strings` -array. Similar to the `$app_strings` array this is initially defined in -`include/language/en_us.lang.php`. - -[[customisation-location-2]] -Customisation location -++++++++++++++++++++++ - -Customisations can be made to the application list strings in two ways. -Firstly you can edit the file + -`custom/include/language/.lang.php`. However to promote -modularity it is recommended that you add a new file in the location + -`custom/Extension/application/Ext/Language/..php` -(`` should be used to give the file a descriptive name). For -example + -`custom/Extension/application/Ext/Language/es_es.MyAppListLanguageFile.php`. -See the Extensions section for more information on the Extensions -folder. - -[[why-and-when-to-customise]] -Why and when to customise -^^^^^^^^^^^^^^^^^^^^^^^^^ - -Generally language strings should be changed from within SuiteCRM using -the studio tool. However there are times when it can be simpler to add -or modify language strings as described in the previous section. If you -are importing a large number of language strings or dropdown options it -can be simpler to create a new file to add these values. Similarly if -you are adding entirely new functionality, it is usually best to simply -add these language strings as new values. - -[[usage]] -Usage -^^^^^ - -Language strings are used automatically throughout SuiteCRM. For example -in metadata you can specify the language strings to display for fields. -However in some cases you will want to access and use the language -strings in custom code. There are several ways to do this. - -[[globals]] -Globals -+++++++ - -The `$mod_strings`, `$app_strings` and `$app_list_strings` variables are -all global and can be accessed as such. `$app_strings` and -`$app_list_strings` will always be available. However `$mod_strings` -will only contain the strings for the current module (see the next -section for other ways of accessing `$mod_strings`). - -Example 9.2: Accessing language strings globally - -''''' - -.... - 1 function someFunction(){ - 2 global $mod_strings, $app_strings, $app_list_strings; - 3 /* - 4 * Grab the label LBL_NAME for the current module - 5 * In most modules this will be the label for the - 6 * name field of the module. - 7 */ - 8 $modLabel = $mod_strings['LBL_NAME']; - 9 -10 $appLabel = $app_strings['LBL_GENERATE_LETTER']; -11 -12 /* -13 * Unlike the previous two examples $appListLabel will be an -14 * array of the dropdowns keys to it's display labels. -15 */ -16 $appListLabel = $app_list_strings['aos_quotes_type_dom']; -17 -18 //Here we just log out the strings -19 $GLOBALS['log']->debug("The module label is $modLabel"); -20 $GLOBALS['log']->debug("The app label is $appLabel"); -21 $GLOBALS['log']->debug("The app list label is ".print_r($appListLabel,1)); -22 } -.... - -''''' - -[[translate]] -Translate -+++++++++ - -As an alternative to using globals or, if you are in a different module -than the language string you wish to retrieve you can use the -`translate` method. - -Example 9.3: `translate` method signature - -''''' - -.... -1 translate( -2 $string, -3 $mod='', -4 $selectedValue='') -.... - -''''' - -$string:: - The language string to be translated. -$mod:: - The module this string should come from. Defaults to the current - module if empty. -$selectedValue:: - For dropdown strings. This will return the label for the key - `$selectedValue` - -Here is an example of the above in action. Note that we do not have to -worry about whether the label is a Module string, an Application string -or an Application list string, as all of these will be checked (in that -order - the first matching value will be returned). - -Example 9.4: Example `translate` method calls - -''''' - -.... - 1 function someFunction(){ - 2 //Grab the label LBL_NAME for the current module - 3 $modLabel = translate('LBL_NAME'); - 4 - 5 //Grab the label LBL_NAME for the AOS_Products module - 6 $productModLabel = translate('LBL_NAME','AOS_Products'); - 7 - 8 $appLabel = translate('LBL_GENERATE_LETTER'); - 9 -10 /* -11 * Return the label for the `Other` option of the `aos_quotes_type_dom` -12 * We don't care about the module so this is left blank. -13 */ -14 $appListLabel = translate('aos_quotes_type_dom','','Other'); -15 -16 //Here we just log out the strings -17 $GLOBALS['log']->debug("The module label is $modLabel"); -18 $GLOBALS['log']->debug("The module label for Products is $productModLabel"); -19 $GLOBALS['log']->debug("The app label is $appLabel"); -20 $GLOBALS['log']->debug("The app list label is ".print_r($appListLabel,1)); -21 } -.... - -''''' - -[[javascript]] -JavaScript -++++++++++ - -Finally, you may be using JavaScript (for example in a view), and wish -to display a language string. For this you can use the -`SUGAR.language.get` method, which is similar to the `translate` method -in example 9.3. - -Example 9.5: `SUGAR.language.get` method signature - -''''' - -.... -1 SUGAR.language.get( -2 module, -3 str -4 ); -.... - -''''' - -module:: - The module a language string will be returned for. You should supply - `app_strings` or + - -`app_list_strings` if the label you wish to retrieve is not a module -string. - -str:: - The key you want to retrieve a label for. - -Example 9.6: Example `SUGAR.language.get` method calls - -''''' - -.... - 1 function someFunction(){ - 2 - 3 /* - 4 * Grab the label LBL_NAME for AOS_Products - 5 * Note that, unlike the translate function in example 9.3 - 6 * the module name is required. - 7 */ - 8 - 9 var modLabel = SUGAR.language.get('AOS_Products', 'LBL_NAME'); -10 -11 /* -12 * As mentioned above we explicitly need to pass if we are retrieving -13 * an app_string or app_list_string -14 */ -15 var appLabel = SUGAR.language.get('app_strings', 'LBL_GENERATE_LETTER'); -16 var appListLabel = SUGAR.language.get('app_list_strings', -17 'aos_quotes_type_dom'); -18 -19 //Here we just log out the strings -20 console.log("The module label is "+modLabel); -21 console.log("The app label is "+appLabel); -22 console.log("The app list label is "+appListLabel); -23 } -.... - -''''' - -[[config]] -10. Config -~~~~~~~~~~ - -[[the-config-files]] -The config files -^^^^^^^^^^^^^^^^ - -There are two main config files in SuiteCRM, both of which are in the -root SuiteCRM folder. These are `config.php` and `config_override.php`. -The definitions in here provide various configuration options for -SuiteCRM. All the way from the details used to access the database to -how many entries to show per page in the list view. Most of these -options are accessible from the SuiteCRM administration page. However -some are only definable in the config files. - -[[config.php]] -config.php -++++++++++ - -This is the main SuiteCRM config file and includes important information -like the database settings and the current SuiteCRM version. - -Generally settings in this file wont be changed by hand. An exception to -this is if SuiteCRM has been moved or migrated. In which case you may -need to change the database settings and the site_url. Let’s look at the -database settings first: - -Example 10.1: Database config definition - -''''' - -.... - 1 'dbconfig' => - 2 array ( - 3 'db_host_name' => 'localhost', - 4 'db_host_instance' => 'SQLEXPRESS', - 5 'db_user_name' => 'dbuser', - 6 'db_password' => 'dbpass', - 7 'db_name' => 'dbname', - 8 'db_type' => 'mysql', - 9 'db_port' => '', -10 'db_manager' => 'MysqliManager', -11 ), -.... - -''''' - -Here we can see this instance is setup to access a local MySQL instance -using the username/password dbuser/dbpass and accessing the database -named ‘dbname’. - -The site url settings are even simpler: - -Example 10.2: Setting the site URL - -''''' - -.... - 'site_url' => 'http://example.com/suitecrm', -.... - -''''' - -The site url for the above is simply ‘http://example.com/suitecrm’ if we -were moving this instance to, for example, suite.example.org, then we -can simply place that value in the file. - -These are generally the only two instances where you would directly -change `config.php`. For other changes you would either make the change -through SuiteCRM itself or you would use the + -`config_override.php` file. - -[[config_override.php]] -config_override.php -+++++++++++++++++++ - -`config_override.php` allows you to make config changes without risking -breaking the main config file. This is achieved quite simply by adding, -editing or removing items from the $sugar_config variable. The -`config_override.php` file will be merged with the existing config -allowing, as the name suggests, overriding the config. For example in -config_override.php we can add our own, new, config item: - -Example 10.3: Adding a custom config value - -''''' - -.... -$sugar_config['enable_the_awesome'] = true; -.... - -''''' - -or we can edit an existing config option in a very similar manner by -simply overwriting it: - -Example 10.4: Overwriting an existing config value - -''''' - -.... -$sugar_config['logger']['level'] = 'debug'; -.... - -''''' - -[[using-config-options]] -Using config options -^^^^^^^^^^^^^^^^^^^^ - -We may want to access config options in custom code (or as detailed -above if we have created our own config setting we may want to use -that). We can easily get the config using the php global keyword: - -Example 10.5: Accessing a config setting within SuiteCRM - -''''' - -.... -1 function myCustomLogic(){ -2 //Get access to config -3 global $sugar_config; -4 //use the config values -5 if(!empty($sugar_config['enable_the_awesome'])){ -6 doTheAwesome(); -7 } -8 } -.... - -''''' - -[[logging]] -11. Logging -~~~~~~~~~~~ - -[[logging-messages]] -Logging messages -^^^^^^^^^^^^^^^^ - -Logging in SuiteCRM is achieved by accessing the log global. Accessing -an instance of the logger is as simple as - -Example 11.1: Accessing the log - -''''' - -.... -$GLOBALS['log'] -.... - -''''' - -This can then be used to log a message. Each log level is available as a -method. For example: - -Example 11.2: Logging messages - -''''' - -.... -1 $GLOBALS['log']->debug('This is a debug message'); -2 $GLOBALS['log']->error('This is an error message'); -.... - -''''' - -This will produce the following output: - -Example 11.3: Logging messages example output - -''''' - -.... -1 Tue Apr 28 16:52:21 2015 [15006][1][DEBUG] This is a debug message -2 Tue Apr 28 16:52:21 2015 [15006][1][ERROR] This is an error message -.... - -''''' - -[[logging-output]] -Logging output -^^^^^^^^^^^^^^ - -The logging output displays the following information by default: - -Example 11.4: Logging messages example output - -''''' - -.... -<Date> [<ProcessId>][<UserId>][<LogLevel>] <LogMessage> -.... - -''''' - -``:: - The date and time that the message was logged. -``:: - The PHP process id. -``:: - The ID of the user that is logged into SuiteCRM. -``:: - The log level for this log message. -``:: - The contents of the log message. - -[[log-levels]] -Log levels -^^^^^^^^^^ - -Depending on the level setting in admin some messages will not be added -to the log e.g if your logger is set to `error` then you will only see -log levels of `error` or higher (`error`, `fatal` and `security`). - -The default log levels (in order of verbosity) are: - -* `debug` -* `info` -* `warn` -* `deprecated` -* `error` -* `fatal` -* `security` - -Generally on a production instance you will use the less verbose levels -(probably `error` or `fatal`). However whilst you are developing you can -use whatever level you prefer. I prefer the most verbose level - -`debug`. - -[[logic-hooks]] -12. Logic Hooks -~~~~~~~~~~~~~~~ - -[[intro-1]] -Intro -^^^^^ - -Logic hooks allow you to hook into various events in SuiteCRM to fire -custom code. This can allow you to, for example, make a call to an -external API, or to create a new record if certain events occur. - -[[types]] -Types -^^^^^ - -Logic hooks can occur in three contexts. These contexts are Application -Hooks, Module Hooks and User Hooks. These are detailed below. - -[[application-hooks]] -Application Hooks -^^^^^^^^^^^^^^^^^ - -Application hooks are hooks which are fired in the application context -(that is, they are not fired against a particular module). These hooks -must be defined in the top level logic hook (i.e. -`custom/modules/logic_hooks.php`). - -after_entry_point:: - Called after SuiteCRM has initialised but before any other processing - is carried out. -after_ui_footer:: - Called after the UI footer. -after_ui_frame:: - Fired after the UI has been displayed but before the footer has been - displayed. -server_round_trip:: - Fired at the end of every page request. - -[[user-hooks]] -User Hooks -^^^^^^^^^^ - -User hooks are fired for certain login/logout actions. Similar to -Application Hooks, these hooks must be defined in the top level logic -hook (i.e. custom/modules/logic_hooks.php). - -after_login:: - Fired after a user logs in to SuiteCRM . -after_logout:: - Fired when a user logs out of SuiteCRM. -before_logout:: - Fired before a user logs out of SuiteCRM. -login_failed:: - Fired when a user attempts to login to SuiteCRM but the login fails. - -[[module-hooks]] -Module Hooks -^^^^^^^^^^^^ - -Module Hooks are called on various record actions for a specific module. - -after_delete:: - Fired when a record is deleted. -after_relationship_add:: - Fired after a relationship is added between two records. Note that - this may be called twice, once for each side of the relationship. -after_relationship_delete:: - Fired after a relationship between two records is deleted. -after_restore:: - Fired after a record is undeleted. -after_retrieve:: - Fired after a record is retrieved from the DB. -after_save:: - Fired after a record is saved. Note that due to some peculiarities - some related modules may not be persisted to the database. The logic - hook is fired within the SugarBean classes save method. Some - implementing classes may save related beans after this method returns. - A notable example of this is the saving of email addresses in Company - modules. -before_delete:: - Fired before a record is deleted. -before_relationship_add:: - Fired before a relationship is added between two records. Note that - this may be called twice, once for each side of the relationship. -before_relationship_delete:: - Fired before a relationship between two records is deleted. Note that - this may be called twice, once for each side of the relationship. -before_restore:: - Fired before a record is undeleted. -before_save:: - Fired before a record is saved. -handle_exception:: - Fired when an exception occurs in a record. -process_record:: - Fired when a record is processed ready to be displayed in list views - or dashlets. - -[[job-queue-hooks]] -Job Queue Hooks -^^^^^^^^^^^^^^^ - -Job queue hooks are fired for scheduler jobs. Similar to application -hooks these hooks must be defined in the top level logic hook (i.e. -`custom/modules/logic_hooks.php`). - -job_failure:: - Fired when a scheduled job either returns false to signify failure or - throws an exception and it will not be retried. See the section on - link:#chap12.xhtml#scheduled-tasks-chapter[Scheduled Tasks]. -job_failure_retry:: - Fired when a scheduled job either returns false to signify failure or - throws an exception but it will be retried. See the section on - link:#chap12.xhtml#scheduled-tasks-chapter[Scheduled Tasks]. - -[[implementing]] -Implementing -^^^^^^^^^^^^ - -Depending on the Logic Hook type logic hooks are either placed into + -`custom/modules/Logic_Hooks.php` or -`custom/modules//Logic_Hooks.php`. - -[[logic_hooks.php]] -Logic_Hooks.php -+++++++++++++++ - -The logic hook file itself specifies which logic hooks to fire on this -event. It looks something like this: - -Example 12.1: Logic hook file - -''''' - -.... - 1 <?php - 2 // Do not store anything in this file that is not part of the array or the hook - 3 //version. This file will be automatically rebuilt in the future. - 4 $hook_version = 1; - 5 $hook_array = Array(); - 6 // position, file, function - 7 $hook_array['before_save'] = Array(); - 8 $hook_array['before_save'][] = Array( - 9 77, -10 'updateGeocodeInfo', -11 'custom/modules/Cases/CasesJjwg_MapsLogicHook.php', -12 'CasesJjwg_MapsLogicHook', -13 'updateGeocodeInfo'); -14 $hook_array['before_save'][] = Array( -15 10, -16 'Save case updates', -17 'modules/AOP_Case_Updates/CaseUpdatesHook.php', -18 'CaseUpdatesHook', -19 'saveUpdate'); -20 $hook_array['before_save'][] = Array( -21 11, -22 'Save case events', -23 'modules/AOP_Case_Events/CaseEventsHook.php', -24 'CaseEventsHook', -25 'saveUpdate'); -26 $hook_array['before_save'][] = Array( -27 12, -28 'Case closure prep', -29 'modules/AOP_Case_Updates/CaseUpdatesHook.php', -30 'CaseUpdatesHook', -31 'closureNotifyPrep'); -32 $hook_array['before_save'][] = Array( -33 1, -34 'Cases push feed', -35 'custom/modules/Cases/SugarFeeds/CaseFeed.php', -36 'CaseFeed', -37 'pushFeed'); -38 $hook_array['after_save'] = Array(); -39 $hook_array['after_save'][] = Array( -40 77, -41 'updateRelatedMeetingsGeocodeInfo', -42 'custom/modules/Cases/CasesJjwg_MapsLogicHook.php', -43 'CasesJjwg_MapsLogicHook', -44 'updateRelatedMeetingsGeocodeInfo'); -45 $hook_array['after_save'][] = Array( -46 10, -47 'Send contact case closure email', -48 'modules/AOP_Case_Updates/CaseUpdatesHook.php', -49 'CaseUpdatesHook', -50 'closureNotify'); -51 $hook_array['after_relationship_add'] = Array(); -52 $hook_array['after_relationship_add'][] = Array( -53 77, -54 'addRelationship', -55 'custom/modules/Cases/CasesJjwg_MapsLogicHook.php', -56 'CasesJjwg_MapsLogicHook', -57 'addRelationship'); -58 $hook_array['after_relationship_add'][] = Array( -59 9, -60 'Assign account', -61 'modules/AOP_Case_Updates/CaseUpdatesHook.php', -62 'CaseUpdatesHook', -63 'assignAccount'); -64 $hook_array['after_relationship_add'][] = Array( -65 10, -66 'Send contact case email', -67 'modules/AOP_Case_Updates/CaseUpdatesHook.php', -68 'CaseUpdatesHook', -69 'creationNotify'); -70 $hook_array['after_relationship_delete'] = Array(); -71 $hook_array['after_relationship_delete'][] = Array( -72 77, -73 'deleteRelationship', -74 'custom/modules/Cases/CasesJjwg_MapsLogicHook.php', -75 'CasesJjwg_MapsLogicHook', -76 'deleteRelationship'); -.... - -''''' - -Let’s go through each part of the file. - -.... -4 $hook_version = 1; -.... - -This sets the hook version that we are using. Currently there is only -one version so this line is unused. - -.... -5 $hook_array = Array(); -.... - -Here we set up an empty array for our Logic Hooks. This should always be -called $hook_array. - -.... -7 $hook_array['before_save'] = Array(); -.... - -Here we are going to be adding some before_save hooks so we add an empty -array for that key. - -.... - 8 $hook_array['before_save'][] = Array( - 9 77, -10 'updateGeocodeInfo', -11 'custom/modules/Cases/CasesJjwg_MapsLogicHook.php', -12 'CasesJjwg_MapsLogicHook', -13 'updateGeocodeInfo'); -.... - -Finally we reach an interesting line. This adds a new logic hook to the -before_save hooks. This array contains 5 entries which define this hook. -These are: - -[[sort-order]] -Sort order - -The first argument (77) is the sort order for this hook. The logic hook -array is sorted by this value. If you wish for a hook to fire earlier -you should use a lower number. If you wish for a hook to be fired later -you should use a higher number. The numbers themselves are arbitrary. - -[[hook-label]] -Hook label - -The second argument (‘updateGeocodeInfo’) is simply a label for the -logic hook. This should be something short but descriptive. - -[[hook-file]] -Hook file - -The third argument is where the actual class for this hook is. In this -case it is in a file called -`custom/modules/Cases/CasesJjwg_MapsLogicHook.php`. Generally you will -want the files to be somewhere in custom and it is usual to have them in -`custom/modules//.php` or -`custom/modules/.php` for Logic Hooks not targeting -a specific module. However the files can be placed anywhere. - -[[hook-class]] -Hook class - -The fourth argument is the class name for the Logic Hook class. In this -case + -`CasesJjwg_MapsLogicHook`. It is usual for the class name to match the -file name but this is not required. - -[[hook-method]] -Hook method - -The fifth, and final, argument is the method that will be called on the -class. In this case `updateGeocodeInfo`. - -[[adding-your-own-logic-hooks]] -Adding your own logic hooks -+++++++++++++++++++++++++++ - -When adding logic hooks you should make full use of the Extensions -framework (see the section on Extensions). This involves creating a file -in + -`custom/Extension/application/Ext/LogicHooks/` for application hooks -and + -`custom/Extension/modules//Ext/LogicHooks/` for module -specific hooks. These files can then add to/alter the `$hook_array` as -appropriate. - -[width="100%",cols="50%,50%",] -|======================================================================= -|image:images/leanpub_info-circle.png[information,title="fig:information",width=50] -|After adding a new logic hook it is necessary to perform a quick repair -and rebuild in the admin menu for this to be picked up. -|======================================================================= - -[[logic-hook-function]] -Logic Hook function -+++++++++++++++++++ - -The logic hook function itself will vary slightly based on the logic -hook type. For module hooks it will appear similar to: - -Example 12.2: Example logic hook method - -''''' - -.... -1 class SomeClass -2 { -3 function someMethod($bean, $event, $arguments) -4 { -5 //Custom Logic -6 } -7 } -.... - -''''' - -Application logic hooks omit the $bean argument: - -Example 12.3: Example logic hook method for application hooks - -''''' - -.... -1 class SomeClass -2 { -3 function someMethod($event, $arguments) -4 { -5 //Custom Logic -6 } -7 } -.... - -''''' - -[[bean-sugarbean]] -$bean (`SugarBean`) - -The $bean argument passed to your logic hook is usually the bean that -the logic hook is being performed on. For User Logic Hooks this will be -the current User object. For module logic hooks (such as `before_save`) -this will be the record that is being saved. For job queue logic hooks -this will be the SchedulersJob bean. Note that for Application Logic -Hook this argument is not present. - -[[event-string]] -$event (`string`) - -The $event argument contains the logic hook event e.g `process_record`, -`before_save`, + -`after_delete` etc. - -[[arguments-array]] -$arguments (`array`) - -The $arguments argument contains any additional details of the logic -hook event. I.e. in the case of before_relationship_add this will -contain details of the related modules. - -[[tips]] -Tips -^^^^ - -[width="100%",cols="50%,50%",] -|======================================================================= -|image:images/leanpub_info-circle.png[information,title="fig:information",width=50] -a| -[[triggering-extra-logic-hooks]] -Triggering extra logic hooks -++++++++++++++++++++++++++++ - -If you are performing certain actions that may trigger another logic -hook (such as saving a bean) then you need to be aware that this will -trigger the logic hooks associated with that bean and action. This can -be troublesome if this causes a logic hook loop of saves causing further -saves. One way around this is to simply be careful of the hooks that you -may trigger. If doing so is unavoidable you can usually set an -appropriate flag on the bean and then check for that flag in subsequent -hooks. - -|======================================================================= - -[width="100%",cols="50%,50%",] -|======================================================================= -|image:images/leanpub_info-circle.png[information,title="fig:information",width=50] -a| -[[think-of-the-user]] -Think of the user -+++++++++++++++++ - -Most logic hooks will cause additional code which can degrade the users -experience. If you have long running code in the after_save the user -will need to wait for that code to run. This can be avoided by either -ensuring the code runs quickly or by using the Job Queue (see the Job -Queue chapter for more information). - -|======================================================================= - -[[scheduled-tasks]] -13. Scheduled Tasks -~~~~~~~~~~~~~~~~~~~ - -[[intro-2]] -Intro -^^^^^ - -Scheduled tasks are performed in SuiteCRM by the scheduler module. Jobs -are placed into the queue either through the defined scheduled tasks or, -for one off tasks, by code creating job objects. Note that both -scheduled tasks and using the job queue requires that you have the -schedulers set up. This will vary depending on your system but usually -requires adding an entry either to Cron (for Linux systems) or to the -windows scheduled tasks (for windows). Opening the scheduled tasks page -within SuiteCRM will let you know the format for the entry. - -[[scheduler]] -Scheduler -^^^^^^^^^ - -Scheduled tasks allow SuiteCRM to perform recurring tasks. Examples of -these which ship with SuiteCRM include checking for incoming mail, -sending email reminder notifications and indexing the full text search. -What if you want to create your own tasks? - -SuiteCRM lets you define your own Scheduler. We do this by creating a -file in + -`custom/Extension/modules/Schedulers/Ext/ScheduledTasks/`. You can give -this file a name of your choice but it is more helpful to give it a -descriptive name. Let’s create a simple file named + -`custom/Extension/modules/Schedulers/Ext/ScheduledTasks/CleanMeetingsScheduler.php`. -This will add a new job to the job strings and a new method that the -scheduler will call: - -Example 13.1: Example Clean Meetings Scheduler - -''''' - -.... - 1 <?php - 2 /* - 3 * We add the method name to the $job_strings array. - 4 * This is the method that jobs for this scheduler will call. - 5 */ - 6 $job_strings[] = 'cleanMeetingsScheduler'; - 7 - 8 /** - 9 * Example scheduled job to change any 'Planned' meetings older than a month -10 * to 'Not Held'. -11 * @return bool -12 */ -13 function cleanMeetingsScheduler(){ -14 //Get the cutoff date for which meetings will be considered -15 $cutOff = new DateTime('now - 1 month'); -16 $cutOff = $cutOff->format('Y-m-d H:i:s'); -17 -18 //Get an instance of the meetings bean for querying -19 //see the Working With Beans chapter. -20 $bean = BeanFactory::getBean('Meetings'); -21 -22 //Get the list of meetings older than the cutoff that are marked as Planned -23 $query = "meetings.date_start < '$cutOff' AND meetings.status = 'Planned'"; -24 $meetings = $bean->get_full_list('',$query); -25 -26 foreach($meetings as $meeting){ -27 //Mark each meeting as Not Held -28 $meeting->status = 'Not Held'; -29 //Save the meeting changes -30 $meeting->save(); -31 } -32 //Signify we have successfully ran -33 return true; -34 } -.... - -''''' - -We also make sure that we add a language file in + -`custom/Extension/modules/Schedulers/Ext/Language/en_us.cleanMeetingsScheduler.php` -again, the name of the file doesn’t matter but it is helpful to use -something descriptive. This will define the language string for our job -so the user sees a nice label. See the section on language strings for -more information. The key for the mod strings will be -LBL_UPPERMETHODNAME. In our case our method name is -`cleanMeetingsScheduler` so our language label key will be -`LBL_CLEANMEETINGSSCHEDULER`. - -Example 13.2: Example Language string for Clean Meetings Scheduler - -''''' - -.... -1 <?php -2 //We add the mod string for our method here. -3 $mod_strings['LBL_CLEANMEETINGSSCHEDULER'] = 'Mark old, planned meetings as Not \ -4 Held'; -.... - -''''' - -If we perform a repair and rebuild our method will now be packaged up -into the scheduler ext file (see the Extensions section for more -information on this process) and will be available in the schedulers -page. Note that for any changes to the scheduler method you will need to -perform another quick repair and rebuild - even in developer mode. We -can now create a new scheduler to call our new method: - -image:images/CreateMeetingsScheduler.png[Creating a scheduler that uses -our new -method,title="fig:Creating a scheduler that uses our new method"] -Creating a scheduler that uses our new method - -This will now behave just like any other scheduler and we can have this -run as often (or as rarely) as we would like. Take care here. The -default frequency is every one minute. If your task is heavy duty or -long running this may not be what you would prefer. Here we settle for -once a day. - -[[job-queue]] -Job Queue -^^^^^^^^^ - -Sometimes you will require code to perform a long running task but you -do not need the user to wait for this to be completed. A good example of -this is sending an email in a logic hook (see the Logic Hooks chapter -for information on these). Assuming we have the following logic hook: - -Example 13.3: Example Email sending Logic Hook - -''''' - -.... - 1 class SomeClass - 2 { - 3 function SomeMethod($bean, $event, $arguments) - 4 { - 5 - 6 //Perform some setup of the email class - 7 require_once "include/SugarPHPMailer.php"; - 8 $mailer=new SugarPHPMailer(); - 9 $admin = new Administration(); -10 $admin->retrieveSettings(); -11 $mailer->prepForOutbound(); -12 $mailer->setMailerForSystem(); -13 $admin = new Administration(); -14 $admin->retrieveSettings(); -15 $admin->settings['notify_fromname'] -16 $mailer->From = $admin->settings['notify_fromaddress'] -17 $mailer->FromName = $emailSettings['from_name']; -18 $mailer->IsHTML(true); -19 -20 //Add message and recipient. -21 //We could go all out here and load and populate an email template -22 //or get the email address from the bean -23 $mailer->Subject = 'My Email Notification! '.$bean->name; -24 $mailer->Body = $event. ' fired for bean '.$bean->name; -25 $mailer->AddAddress('Jim@example.com'); -26 return $mailer->Send(); -27 } -28 } -.... - -''''' - -This will work fine. However you do not want the user to have to wait -for the email to be sent out as this can cause the UI to feel sluggish. -Instead you can create a Job and place it into the job queue and this -will be picked by the scheduler. Let’s look at an example of how you -would do this. - -First we want our Logic Hook class to create the scheduled job: - -Example 13.4: Example Scheduled Job Creation - -''''' - -.... - 1 class SomeClass - 2 { - 3 function SomeMethod($bean, $event, $arguments) - 4 { - 5 require_once 'include/SugarQueue/SugarJobQueue.php'; - 6 $scheduledJob = new SchedulersJob(); - 7 - 8 //Give it a useful name - 9 $scheduledJob->name = "Email job for {$bean->module_name} {$bean->id}"; -10 -11 //Jobs need an assigned user in order to run. You can use the id -12 //of the current user if you wish, grab the assigned user from the -13 //current bean or anything you like. -14 //Here we use the default admin user id for simplicity -15 $scheduledJob->assigned_user_id = '1'; -16 -17 //Pass the information that our Email job will need -18 $scheduledJob->data = json_encode(array( -19 'id' => $bean->id, -20 'module' => $bean->module_name) -21 ); -22 -23 //Tell the scheduler what class to use -24 $scheduledJob->target = "class::BeanEmailJob"; -25 -26 $queue = new SugarJobQueue(); -27 $queue->submitJob($scheduledJob); -28 } -29 } -.... - -''''' - -Next we create the BeanEmailJob class. This is placed into the + -`custom/Extensions/modules/Schedulers/Ext/ScheduledTasks/` directory -with the same name as the class. So in our example we will have: + -`custom/Extensions/modules/Schedulers/Ext/ScheduledTasks/BeanEmailJob.php` - -Example 13.5: Example Scheduler job - -''''' - -.... - 1 class BeanEmailJob implements RunnableSchedulerJob - 2 { - 3 public function run($arguments) - 4 { - 5 - 6 //Only different part of the email code. - 7 //We grab the bean using the supplied arguments. - 8 $arguments = json_decode($arguments,1); - 9 $bean = BeanFactory::getBean($arguments['module'],$arguments['id']); -10 -11 //Perform some setup of the email class -12 require_once "include/SugarPHPMailer.php"; -13 $mailer=new SugarPHPMailer(); -14 $admin = new Administration(); -15 $admin->retrieveSettings(); -16 $mailer->prepForOutbound(); -17 $mailer->setMailerForSystem(); -18 $admin = new Administration(); -19 $admin->retrieveSettings(); -20 $mailer->From = $admin->settings['notify_fromaddress']; -21 $mailer->FromName = $emailSettings['from_name']; -22 $mailer->IsHTML(true); -23 -24 //Add message and recipient. -25 //We could go all out here and load and populate an email template -26 //or get the email address from the bean -27 $mailer->Subject = 'My Email Notification! '.$bean->name; -28 $mailer->Body = $event. ' fired for bean '.$bean->name; -29 $mailer->AddAddress('Jim@example.com'); -30 return $mailer->Send(); -31 } -32 public function setJob(SchedulersJob $job) -33 { -34 $this->job = $job; -35 } -36 } -.... - -''''' - -Now whenever a user triggers the hook it will be much quicker since we -are simply persisting a little info to the database. The scheduler will -run this in the background. - -[[retries]] -Retries -+++++++ - -Occasionally you may have scheduled jobs which could fail -intermittently. Perhaps you have a job which calls an external API. If -the API is unavailable it would be unfortunate if the job failed and was -never retried. Fortunately the SchedulersJob class has two properties -which govern how retries are handled. These are `requeue` and -`retry_count`. - -`requeue`:: - Signifies that this job is eligible for retries. -`retry_count`:: - Signifies how many retries remain for this job. If the job fails this - value will be decremented. - -We can revisit our previous example and add two retries: - -Example 13.6: Setting the retry count on a scheduled job - -''''' - -.... - 6 $scheduledJob = new SchedulersJob(); - 7 - 8 //Give it a useful name - 9 $scheduledJob->name = "Email job for {$bean->module_name} {$bean->id}"; -10 -11 //Jobs need an assigned user in order to run. You can use the id -12 //of the current user if you wish, grab the assigned user from the -13 //current bean or anything you like. -14 //Here we use the default admin user id for simplicity -15 $scheduledJob->assigned_user_id = '1'; -16 -17 //Pass the information that our Email job will need -18 $scheduledJob->data = json_encode(array( -19 'id' => $bean->id, -20 'module' => $bean->module_name) -21 ); -22 -23 //Tell the scheduler what class to use -24 $scheduledJob->target = "class::BeanEmailJob"; -25 -26 //Mark this job for 2 retries. -27 $scheduledJob->requeue = true; -28 $scheduledJob->retry = 2; -.... - -''''' - -See the section on link:#chap11.xhtml#logic-hooks-chapter[logic hooks] -for more information on how job failures can be handled. - -[[debugging]] -Debugging -^^^^^^^^^ - -With Scheduled tasks and jobs running in the background it can sometimes -be difficult to determine what is going on when things go wrong. If you -are debugging a scheduled task the the scheduled task page is a good -place to start. For both scheduled tasks and job queue tasks you can -also check the job_queue table. For example, in MySQL we can check the -last five scheduled jobs: - -Example 13.7: Example MySQL query for listing jobs - -''''' - -.... -SELECT * FROM job_queue ORDER BY date_entered DESC LIMIT 5 -.... - -''''' - -This will give us information on the last five jobs. Alternatively we -can check on specific jobs: - -Example 13.8: Example MySQL query for listing BeanEmailJobs - -''''' - -.... -SELECT * FROM job_queue WHERE target = 'class::BeanEmailJob' -.... - -''''' - -In either case this will give details for the job(s): - -Example 13.9: Example MySQL list of jobs - -''''' - -.... -*************************** 1. row *************************** -assigned_user_id: 1 - id: 6cdf13d5-55e9-946e-9c98-55044c5cecee - name: Email job for Accounts 103c4c9b-336f-0e87-782e-5501defb5900 - deleted: 0 - date_entered: 2015-03-14 14:58:15 - date_modified: 2015-03-14 14:58:25 - scheduler_id: - execute_time: 2015-03-14 14:58:00 - status: done - resolution: success - message: NULL - target: class::BeanEmailJob - data: {"id":"103c4c9b-336f-0e87-782e-5501defb5900","module":"Account\ -s"} - requeue: 0 - retry_count: NULL - failure_count: NULL - job_delay: 0 - client: CRON3b06401793b3975cd00c0447c071ef9a:7781 -percent_complete: NULL -1 row in set (0.00 sec) -.... - -''''' - -Here we can check the status, resolution and message fields. If the -status is `queued` then either the scheduler has not yet run or it isn’t -running. Double check your Cron settings if this is the case. - -It may be the case that the job has ran but failed for some reason. In -this case you will receive a message telling you to check the logs. -Checking the logs usually provides enough information, particularly if -you have made judicious use of logging (see the chapter on logging) in -your job. - -It is possible that the job is failing outright, in which case your -logging may not receive output before the scheduler exits. In this case -you can usually check your PHP logs. - -As a last resort you can manually run the scheduler from the SuiteCRM -directory using: - -Example 13.10: Running the scheduler manually - -''''' - -.... -php -f cron.php -.... - -''''' - -Using this in addition to outputting any useful information should track -down even the oddest of bugs. - -[[extension-framework]] -14. Extension Framework -~~~~~~~~~~~~~~~~~~~~~~~ - -[[introduction-1]] -Introduction -^^^^^^^^^^^^ - -The extension framework provides a means to modify various application -data inside SuiteCRM. For example it provides a way to add or modify -vardefs, scheduled tasks, language strings and more. In general a folder -is provided in `custom/Extension` (the exact path depends on the -extension). This folder is then scanned for files which will be -consolidated into a single ext file which SuiteCRM will then read and -use. In this way it is possible for developers to add a new file to -affect the behaviour of SuiteCRM rather than altering existing files. -This makes the changes more modular and allows the easy addition or -removal of changes. Additionally, because these files are all -consolidated it means that there is no affect on performance of checking -a (possibly large) number of files. This is only done when performing a -repair and rebuild in the admin menu. - -[[standard-extensions]] -Standard Extensions -^^^^^^^^^^^^^^^^^^^ - -List of standard SuiteCRM extensions - -[cols=",,,",options="header",] -|======================================================================= -|Extension Directory |Compiled file |Module |Description -|ActionViewMap |action_view_map.ext.php |  |Used to map actions for a -module to a specified view. - -|ActionFileMap |action_file_map.ext.php |  |Used to map actions for a -module to a specified file. - -|ActionReMap |action_remap.ext.php |  |Used to map actions for a module -to existing actions. - -|Administration |administration.ext.php |Administration |Used to add new -sections to the administration panel. - -|EntryPointRegistry |entry_point_registry.ext.php |application |Used to -add new entry points to SuiteCRM. See the chapter on -link:#chap07.xhtml#entry-point-chapter[Entry Points]. - -|Extensions |extensions.ext.php |application |Used to add new extension -types. - -|FileAccessControlMap |file_access_control_map.ext.php |  |Used to add, -update or delete entries in the access control lists for files. - -|Language |N/A^link:#chap13.xhtml#fn-langNote[1]^ |  |Used to add, -update or delete language strings for both modules and app strings. See -the chapter on link:#chap08.xhtml#language-chapter[Language Strings]. - -|Layoutdefs |layoutdefs.ext.php |  |Used to add, update or delete -subpanel definitions for a module. - -|GlobalLinks |links.ext.php |application |Used to add, update or delete -global links (the list of links that appear in the top right of the -SuiteCRM UI). - -|LogicHooks |logichooks.ext.php |  |Used to add, update or delete logic -hooks. See the chapter on link:#chap11.xhtml#logic-hooks-chapter[Logic -Hooks]. - -|Include |modules.ext.php |application |Used to register new beans and -modules. - -|Menus |menu.ext.php |  |Used to add, update or delete the menu links -for each module. - -|ScheduledTasks |scheduledtasks.ext.php |Schedulers |Used to add new -scheduled tasks. See the chapter on -link:#chap12.xhtml#scheduled-tasks-chapter[Scheduled Tasks]. - -|UserPage |userpage.ext.php |Users |Unused - -|Utils |custom_utils.ext.php |application |Used to add new utility -methods. - -|Vardefs |vardefs.ext.php |  |Used to add, update or delete vardefs for -a module. See the section on -link:#chap03.xhtml#vardefs-chapter[Vardefs]. - -|JSGroupings |jsgroups.ext.php |  |Used to add, update or delete -JavaScript groupings. - -|Actions |actions.ext.php |AOW_Actions |Used to add new WorkFlow -actions. -|======================================================================= - -[[custom-extensions]] -Custom Extensions -^^^^^^^^^^^^^^^^^ - -Interestingly the extension framework can be used to add new extensions. -This allows you to create customisations that are easily customised by -others (in a similar manner to, for example, how vardefs can be added - -see the chapter on link:#chap03.xhtml#vardefs-chapter[Vardefs]). - -To create a custom extension you simply add a new file in + -`custom/Extension/application/Ext/Extensions`. This can be given a name -of your choosing. Our example will use + -`custom/Extension/application/Ext/Extensions/SportsList.php` and will -look like: - -Example 14.1: Adding an entry point entry - -''''' - -.... -1 <?php -2 $extensions["sports_list"] = array( -3 "section" => "sports_list", -4 "extdir" => "SportsList", -5 "file" => 'sportslist.ext.php', -6 "module" => ""); -.... - -''''' - -Now when a Quick Repair and rebuild is run any files in + -`custom/Extension/application/Ext/SportsList/` will be consolidated -into + -`custom/application/Ext/SportsList/sportslist.ext.php`. On it’s own this -file will not do anything but you are now able to write custom code that -checks the consolidated file rather than having to worry about searching -for customisations. - -1. The language extensions are treated specially and, as such, aren’t -compiled to a single file.link:#chap13.xhtml#fnref-langNote[↩] - -[[module-installer]] -15. Module Installer -~~~~~~~~~~~~~~~~~~~~ - -As detailed in the other chapters of this book there are many ways to -customise SuiteCRM. The module installer allows you to package these -changes and install them onto other SuiteCRM instances. This is achieved -by creating a package. - -At the minimum a package is a zip file that contains a `manifest.php` -file in it’s root. The manifest file is responsible for providing -information about the installer as well as providing information on how -to install the package. - -[[manifest.php]] -manifest.php -^^^^^^^^^^^^ - -The `manifest.php` file contains the definition of three arrays. Let’s -look at each of these arrays in turn. See -link:#chap19.xhtml#appendix-a[Appendix A] for the full sample -`manifest.php` file. - -[width="100%",cols="50%,50%",] -|======================================================================= -|image:images/leanpub_info-circle.png[information,title="fig:information",width=50] -|Within path in the manifest file you can use `` to refer to -the base directory of the installer. For example `/Foo.txt` -will refer to the `Foo.txt` file in the root of the installer package. -|======================================================================= - -[[manifest]] -`$manifest` -+++++++++++ - -The `$manifest` array provides information on the package itself such as -it’s name, readme etc. (it also defines the `copy` array for `patch` -packages). A sample definition of the manifest array will appear -something like this: - -Example 15.1: Example `$manifest` array definition - -''''' - -.... - 1 $manifest = array( - 2 'name' => 'My First Package', - 3 'description' => 'This is a simple package example manifest file', - 4 'version' => '1.5', - 5 'author' => 'Jim Mackin', - 6 'readme' => 'readme.txt', - 7 'acceptable_sugar_flavors' => array('CE'), - 8 'acceptable_sugar_versions' => array( - 9 'exact_matches' => array(), -10 'regex_matches' => array('6\\.5\\.[0-9]$'), -11 ), -12 'copy_files' => array ( -13 'from_dir' => '<basepath>/custom/', -14 'to_dir' => 'custom', -15 'force_copy' => array (), -16 ), -17 'dependencies' => array( -18 array( -19 'id_name' => 'example_dependency_package', -20 'version' => '2.4', -21 ), -22 ), -23 ); -.... - -''''' - -`name`:: - The name of the package. This is how the package will appear to the - user during installation and in the Module Loader package list. The - package name is required. -`description`:: - A brief description of the package. -`version`:: - The version of this package. This can be any string but is usually a - traditional version number (such as `3.1.4`). -`author`:: - The author of the package. -`readme`:: - A brief readme string. Note that if a `README.txt` is found in the - root of the package this will be used instead. -`acceptable_sugar_flavors`:: - A remnant of the SugarCRM packages. This should always be an array - with (at least) a `CE` entry. If you would like the installer to - target both SuiteCRM and SugarCRM editions then this can contain one - of the other SugarCRM flavours (`PRO`, `CORP` , `ULT` or `ENT`). -`acceptable_sugar_versions`:: - An array detailing the matching SugarCRM versions. Note that the - SugarCRM version is distinct from the SuiteCRM version. This array has - two keys. `exact_matches` is simply an array of the allowed versions. - `regex_matches` allows specifying regexes to match versions. For - SuiteCRM you only need to worry about supporting the `6.5.*` versions - which can be matched with the regex `6\\.5\\.[0-9]$`. At the time of - writing the current SugarCRM version for SuiteCRM is `6.5.20`. -`copy_files`:: - This is only used for `patch` installers and will copy files in the - `from_dir` key to those in the `to_dir` key. Finally the `force_copy` - key can be used to specify files that should be forcibly copied over. -`dependencies`:: - An array of other packages that are relied on by this package. Each - entry is an array with `id_name` - the id of the package and `version` - - the required version of the package. -`icon`:: - The path (within the installer) to an icon to be displayed during - installation. -`is_uninstallable`:: - Whether or not uninstalls should be allowed. -`published_date`:: - The date that the package was published. There is no fixed format for - the date, it is simply a string. -`key`:: - Specifies a key to ensure that modules do not clash. This will prefix - the installed modules and tables with `key`. This is used by the - module builder when creating packages but can be specified if you - wish. -`remove_tables`:: - A string specifying whether module tables should be removed when - uninstalling this package. Accepted values are `true`, `false` and - `prompt`. The default is `true`. -`type`:: - The type of the installer, one of `langpack`, `module`, `patch` or - `theme`. See the types section. - -[[install_defs]] -`$install_defs` -+++++++++++++++ - -Provides information on how the package is to be installed, which files -go where and any additional information such as logic hooks, custom -fields etc. - -[[id]] -`id` - -A unique identifier for the module. - -[[connectors]] -`connectors` - -An array of connectors to be installed. Each entry is an array with the -following keys: - -[cols=",",options="header",] -|====================================================================== -|Key |Description -|`name` |The name of the connector. -|`connector` |The directory to copy the connector files from. -|`formatter` |The directory to copy the connector formatter files from. -|====================================================================== - -[[copy]] -`copy` - -An array of files and directories to be copied on install. Each entry is -an array with the following keys: - -[cols=",",options="header",] -|================================================= -|Key |Description -|`from` |The source file/directory in the package. -|`to` |The destination file/directory. -|================================================= - -[width="100%",cols="50%,50%",] -|======================================================================= -|image:images/leanpub_info-circle.png[information,title="fig:information",width=50] -|In general if a file can be handled by one of the other keys then that -key should be used. For example new admin entries should be copied using -the `administration` key rather than using the `copy` key. -|======================================================================= - -[[dashlets]] -`dashlets` - -An array of dashlets to be installed. Each entry is an array with the -following keys: - -[cols=",",options="header",] -|======================================================================= -|Key |Description -|`name` |The name of the new dashlet. - -|`from` |The path in the install package from which the dashlet files -will be copied. -|======================================================================= - -[[language]] -`language` - -An array of language files to be installed. Each entry is an array with -the following keys: - -[cols=",",options="header",] -|======================================================================= -|Key |Description -|`from` |The location of the language file inside the package. - -|`to_module` |The module this language file is intended for (or -‘application’ for application language strings). - -|`language` |The language that this file is for (i.e. en_us or es_es). -|======================================================================= - -See the chapter on link:#chap08.xhtml#language-chapter[Language Strings] -for more information. - -[[layoutdefs]] -`layoutdefs` - -An array of layoutdef files which are used to add, remove or edit -subpanels. Each entry is an array with the following keys: - -[cols=",",options="header",] -|============================================================ -|Key |Description -|`from` |The path in the package to the file to be installed. -|`to_module` |The module that this file will be installed to. -|============================================================ - -[[vardefs-1]] -`vardefs` - -An array of the vardefs to be added to specific modules. Each entry is -an array with the following keys: - -[cols=",",options="header",] -|======================================================= -|Key |Description -|`from` |The location of the vardef file in the package. -|`to_module` |The destination module. -|======================================================= - -[width="100%",cols="50%,50%",] -|======================================================================= -|image:images/leanpub_info-circle.png[information,title="fig:information",width=50] -|Generally you should install custom fields using the `custom_fields` -key. However this key can be used to alter existing fields or add more -complex fields. -|======================================================================= - -[[menu]] -`menu` - -An array of menus to be installed. Each entry is an array with the -following keys: - -[cols=",",options="header",] -|===================================================== -|Key |Description -|`from` |The location of the menu file in the package. -|`to_module` |The destination module for this menu. -|===================================================== - -[[beans]] -`beans` - -An array of beans to be installed. Each entry is an array with the -following keys: - -[cols=",",options="header",] -|============================================================ -|Key |Description -|`module` |The name of the module. -|`class` |The name of the bean class. -|`path` |The path (within the package) to the bean file. -|`tab` |Whether or not a tab should be added for this module. -|============================================================ - -[[relationships-2]] -`relationships` - -An array detailing any new relationships added (in particular -relationships where one side is an existing module). Each entry is an -array with the following keys: - -[cols=",",options="header",] -|===================================================================== -|Key |Description -|`module` |The module that this relationship will be attached to. -|`meta_data` |The location of the metadata file for this relationship. -|===================================================================== - -[[custom_fields]] -`custom_fields` - -An array of new custom fields to be installed (See the -link:#chap03.xhtml#vardefs-chapter[Vardefs] chapter for more information -on this). Each entry is an array with the following keys: - -[cols=",",options="header",] -|======================================================================= -|Key |Description -|`name` |The name of the new custom field. - -|`label` |The key for the language string which will act as the label -for this custom field. - -|`type` |The type of this custom field. - -|`max_size` |For string field types, the maximum number of characters. - -|`require_option` |Whether or not the field is required. - -|`default_value` |The default value of this field. - -|`ext1` |Extended field information. Different field types will use this -value differently. For example Enum fields will store the key for the -options in this field, decimal and float fields will store the -precision. - -|`ext2` |Extended field information. Different field types will use this -value differently. For example, dynamic dropdowns will store the parent -dropdown, text areas will store the number of rows. - -|`ext3` |Extended field information. Different field types will use this -value differently. For example, text areas will store the number of -columns. - -|`ext4` |Extended field information. Different field types will use this -value differently. For HTML field types this will store the HTML. - -|`audited` |Whether or not changes to this field should be audited. - -|`module` |Used to specify the module where the custom field will be -added. -|======================================================================= - -[[logic_hooks]] -`logic_hooks` - -An array of logic hooks to be installed. See the -link:#chap11.xhtml#logic-hooks-chapter[Logic Hooks] chapter for more -information. Each entry is an array with the following keys: - -[cols=",",options="header",] -|======================================================================= -|Key |Description -|`module` |The module to where this logic hook should be installed. -Leaving this empty will install into the top level logic hook. - -|`hook` |The logic hook type (i.e. `after_save`, `after_login`, etc.). - -|`order` |The sort order for this logic hook. - -|`description` |A description of the hook. - -|`file` |The file containing the class for this logic hook, relative to -the SuiteCRM root. - -|`class` |The class that contains the logic hook function that should be -called by this hook. - -|`function` |The function to be invoked when this hook is triggered. -|======================================================================= - -[[image_dir]] -`image_dir` - -A path to a directory of images to be included in the install. - -[[schedulers]] -`schedulers` - -An array of schedulers to be installed. Each entry is an array with a -single key: - -[cols=",",options="header",] -|=================================================== -|Key |Description -|`from` |The file containing the new scheduled task. -|=================================================== - -[[administration]] -`administration` - -An array of admin panels to be installed. Each entry is an array with a -single key: - -[cols=",",options="header",] -|=========================================================== -|Key |Description -|`from` |The file containing the new admin panel definition. -|=========================================================== - -[[pre_execute]] -`pre_execute` - -Defines an array of files to be executed before the package is -installed. Each entry is a path to a file within the package. Any output -will be displayed to the user in the install log. - -[[post_execute]] -`post_execute` - -Defines an array of files to be executed after the package is installed. -Each entry is a path to a file within the package. Any output will be -displayed to the user in the install log. - -[[pre_uninstall]] -`pre_uninstall` - -Defines an array of files to be executed before the package is -uninstalled. Each entry is a path to a file within the package. Any -output will be displayed to the user in the uninstall log. - -[[post_uninstall]] -`post_uninstall` - -Defines an array of files to be executed after the package is -uninstalled. Each entry is a path to a file within the package. Any -output will be displayed to the user in the uninstall log. - -[[upgrade_manifest]] -`$upgrade_manifest` -+++++++++++++++++++ - -Provides a means of upgrading an already installed package by providing -different `install_defs`. - -[[types-1]] -Types -^^^^^ - -[cols=",",options="header",] -|======================================================================= -|Type |Description -|langpack |A language installer. This will add an entry to the language -dropdown. - -|module |A module installer. Will install new modules and/or -functionality. - -|patch |A patch installer. This is used to upgrade SuiteCRM. - -|theme |A theme installer. This will add a new option to the themes. -|======================================================================= - -[[other-files]] -Other files -+++++++++++ - -`README.txt`:: - Contains the readme for this package. If `README.txt` and a readme - entry in the `manifest.php` is defined then this file will be used. -`LICENSE.txt`:: - Provides information on the license for this package. -`scripts/pre_install.php`:: - A PHP script which defines a method `pre_install()`. This method will - be called before the package is installed. Any output will be - displayed to the user in the install log. -`scripts/post_install.php`:: - A PHP script which defines a method `post_install()`. This method will - be called after the package is installed. -`scripts/pre_uninstall.php`:: - A PHP script which defines a method `pre_uninstall()`. This method - will be called before the package is uninstalled. -`scripts/post_uninstall.php`:: - A PHP script which defines a method `post_uninstall()`. This method - will be called after the package is uninstalled. - -[[api]] -16. API -~~~~~~~ - -The SuiteCRM API allows third party code to access and edit SuiteCRM -data and functionality. - -[[using-the-api]] -Using the API -^^^^^^^^^^^^^ - -SuiteCRM has both a REST and a SOAP API. Which API you want to use will -largely come down to personal preference and the support for SOAP/REST -libraries in whichever language you will be using. - -Both APIs will require a username and password. It is usual to create a -user specifically for the API. - -[[soap]] -SOAP -++++ - -The WSDL for the SOAP API can be found at: - -Example 16.1: SOAP API WSDL Location - -''''' - -.... -example.com/suitecrm/service/v4_1/soap.php?wsdl -.... - -''''' - -Where `example.com/suitecrm` is the address of your SuiteCRM instance. -`v4_1` is the version of the API and can be changed, `v4_1` is the -latest version at the time of writing. - -[[soap-example]] -SOAP Example - -The following PHP example uses the built in SoapClient class. - -Example 16.2: Accessing the SOAP API - -''''' - -.... - 1 <?php - 2 //Create a new SoapClient - 3 $wsdlURL = "http://example.com/suitecrm/service/v4_1/soap.php?wsdl"; - 4 $client = new SoapClient($wsdlURL); - 5 - 6 //Login to the API and get the session id - 7 $userAuth = array( - 8 'user_name' => '<suitecrmuser>', - 9 'password' => md5('<suitecrmpassword>'), -10 ); -11 $appName = 'My SuiteCRM SOAP Client'; -12 $nameValueList = array(); -13 $loginResults = $client->login($userAuth, $appName, $nameValueList); -14 -15 //Get a list of at most 10 accounts with a billing address in Ohio. Along with -16 //The first and last names of any contacts in that Account. -17 $results = $client->get_entry_list( -18 //Session id - retrieved from login call -19 $loginResults->id, -20 //Module to get_entry_list for -21 'Accounts', -22 //Filter query - Added to the SQL where clause -23 "accounts.billing_address_city = 'Ohio'", -24 //Order by - unused -25 '', -26 //Start with the first record -27 0, -28 //Return the id and name fields -29 array('id','name'), -30 //Link to the "contacts" relationship and retrieve the -31 //First and last names. -32 array( -33 array( -34 'name' => 'contacts', -35 'value' => array( -36 'first_name', -37 'last_name', -38 ), -39 ), -40 ), -41 //Show 10 max results -42 10, -43 //Do not show deleted -44 0 -45 ); -46 print_r($results); -.... - -''''' - -[[rest]] -REST -++++ - -The SuiteCRM REST API can be found at: - -Example 16.3: REST API Endpoint Location - -''''' - -.... -example.com/suitecrm/service/v4_1/rest.php -.... - -''''' - -Where example.com/suitecrm is the address of your SuiteCRM instance. -v4_1 is the version of the API and can be changed, v4_1 is the latest -version at the time of writing. - -The SuiteCRM REST API is not a true REST API - all calls are performed -as POSTs and all calls are to the base URL with the method passed in as -a post argument. - -The arguments to the REST API calls are: + -:: - -method - -:: - The method which will be called, i.e. `login` or `get_entry_list`. See - link:#chap20.xhtml#appendix-b[Appendix B] for a list of API methods. -input_type:: - The input type of the rest_data. This is usually `JSON` but can also - be `Serialize`. -response_type:: - How the response will be encoded. This is usually `JSON` but can also - be `Serialize`. -rest_data:: - Any other arguments that are required by this method. This is passed - as an encoded array. The encoding is determined by input_type. - -[width="100%",cols="50%,50%",] -|======================================================================= -|image:images/leanpub_warning.png[warning,title="fig:warning",width=50] -|Note that, for REST requests it is the order of the arguments that -matter in `rest_data` and not the name. -|======================================================================= - -[[examples]] -Examples - -Example 16.4: Accessing the REST API - -''''' - -.... - 1 <?php - 2 - 3 $url = "http://example.com/suitecrm/service/v4_1/rest.php"; - 4 - 5 function restRequest($method, $arguments){ - 6 global $url; - 7 $curl = curl_init($url); - 8 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); - 9 $post = array( -10 "method" => $method, -11 "input_type" => "JSON", -12 "response_type" => "JSON", -13 "rest_data" => json_encode($arguments), -14 ); -15 -16 curl_setopt($curl, CURLOPT_POSTFIELDS, $post); -17 -18 $result = curl_exec($curl); -19 curl_close($curl); -20 return json_decode($result,1); -21 } -22 -23 -24 $userAuth = array( -25 'user_name' => 'suitecrmuser', -26 'password' => md5('suitecrmpassword'), -27 ); -28 $appName = 'My SuiteCRM REST Client'; -29 $nameValueList = array(); -30 -31 $args = array( -32 'user_auth' => $userAuth, -33 'application_name' => $appName, -34 'name_value_list' => $nameValueList); -35 -36 $result = restRequest('login',$args); -37 $sessId = $result['id']; -38 -39 $entryArgs = array( -40 //Session id - retrieved from login call -41 'session' => $sessId, -42 //Module to get_entry_list for -43 'module_name' => 'Accounts', -44 //Filter query - Added to the SQL where clause, -45 'query' => "accounts.billing_address_city = 'Ohio'", -46 //Order by - unused -47 'order_by' => '', -48 //Start with the first record -49 'offset' => 0, -50 //Return the id and name fields -51 'select_fields' => array('id','name',), -52 //Link to the "contacts" relationship and retrieve the -53 //First and last names. -54 'link_name_to_fields_array' => array( -55 array( -56 'name' => 'contacts', -57 'value' => array( -58 'first_name', -59 'last_name', -60 ), -61 ), -62 ), -63 //Show 10 max results -64 'max_results' => 10, -65 //Do not show deleted -66 'deleted' => 0, -67 ); -68 $result = restRequest('get_entry_list',$entryArgs); -69 -70 print_r($result); -.... - -''''' - -For a full list of API methods and their arguments see -link:#chap20.xhtml#appendix-b[Appendix B]. - -[[adding-custom-api-methods]] -Adding custom API methods -^^^^^^^^^^^^^^^^^^^^^^^^^ - -Sometimes the existing API methods are not sufficient or using them for -a task would be overly complex. SuiteCRM allows the web services to be -extended with additional methods or overriding existing methods. - -The recommended path for custom entry points is the following + -`custom/service/_custom/`. At the time of writing the latest -web service version is `v4_1` so this would be -`custom/service/v4_1_custom/`. - -Next we create the implementing class. This will create our new method. -In our example we will simply create a new method which writes to the -SuiteCRM log We will call this method + -`write_log_message`. - -Example 16.5: Custom v4_1 Web Service Implementation - -''''' - -.... - 1 <?php - 2 if(!defined('sugarEntry')){ - 3 define('sugarEntry', true); - 4 } - 5 require_once 'service/v4_1/SugarWebServiceImplv4_1.php'; - 6 class SugarWebServiceImplv4_1_custom extends SugarWebServiceImplv4_1 - 7 { - 8 - 9 function write_log_message($session, $message) -10 { -11 $GLOBALS['log']->info('Begin: write_log_message'); -12 -13 //Here we check that $session represents a valid session -14 if (!self::$helperObject->checkSessionAndModuleAccess( -15 $session, -16 'invalid_session', -17 '', -18 '', -19 '', -20 new SoapError())) -21 { -22 $GLOBALS['log']->info('End: write_log_message.'); -23 return false; -24 } -25 $GLOBALS['log']->info($message); -26 return true; -27 } -28 } -.... - -''''' - -Next we create the registry file which will register our new method. - -Example 16.6: Custom v4_1 web service registry - -''''' - -.... - 1 <?php - 2 require_once 'service/v4_1/registry.php'; - 3 class registry_v4_1_custom extends registry_v4_1 - 4 { - 5 protected function registerFunction() - 6 { - 7 parent::registerFunction(); - 8 $this->serviceClass->registerFunction('write_log_message', - 9 array( -10 'session'=>'xsd:string', -11 'message'=>'xsd:string'), -12 array( -13 'return'=>'xsd:boolean') -14 ); -15 } -16 } -.... - -''''' - -Finally we create the entry point. This is the actual file that will be -called by our API clients. This will reference the two files which we -have created and will call the webservice implementation with our files. - -Example 16.7: Custom v4_1 REST Entry point - -''''' - -.... - 1 <?php - 2 chdir('../../..'); - 3 - 4 require_once 'SugarWebServiceImplv4_1_custom.php'; - 5 - 6 $webservice_path = 'service/core/SugarRestService.php'; - 7 $webservice_class = 'SugarRestService'; - 8 $webservice_impl_class = 'SugarWebServiceImplv4_1_custom'; - 9 $registry_path = 'custom/service/v4_1_custom/registry.php'; -10 $registry_class = 'registry_v4_1_custom'; -11 $location = 'custom/service/v4_1_custom/rest.php'; -12 -13 require_once 'service/core/webservice.php'; -.... - -''''' - -Example 16.8: Custom v4_1 SOAP Entry point - -''''' - -.... - 1 <?php - 2 chdir('../../..'); - 3 require_once('SugarWebServiceImplv4_1_custom.php'); - 4 $webservice_class = 'SugarSoapService2'; - 5 $webservice_path = 'service/v2/SugarSoapService2.php'; - 6 $webservice_impl_class = 'SugarWebServiceImplv4_1_custom'; - 7 $registry_class = 'registry_v4_1_custom'; - 8 $registry_path = 'custom/service/v4_1_custom/registry.php'; - 9 $location = 'custom/service/v4_1_custom/soap.php'; -10 require_once('service/core/webservice.php'); -.... - -''''' - -[[usage-1]] -Usage -+++++ - -We can now use our custom endpoint. This is identical to using the API -as detailed above, except that we use our custom entry point for either -the SOAP WSDL or REST URL. For example using the same SuiteCRM location -(`example.com/suitecrm`) as the above examples and using `v4_1`, we -would use the following - -Example 16.9: Custom v4_1 URLS - -''''' - -.... -1 //SOAP WSDL -2 example.com/suitecrm/custom/service/v4_1_custom/soap.php?wsdl -3 //REST URL -4 example.com/suitecrm/custom/service/v4_1_custom/rest.php -.... - -''''' - -[[best-practices]] -17. Best Practices -~~~~~~~~~~~~~~~~~~ - -[[development-instances]] -Development instances -^^^^^^^^^^^^^^^^^^^^^ - -When making changes you should always use a development or test instance -first. This allows you to fully and safely test any changes. - -[[version-control]] -Version control -^^^^^^^^^^^^^^^ - -When developing customisations it is prudent to use some form of version -control. Version control allows tracking changes to your codebase in -addition to rolling back changes. There are many version control systems -available. SuiteCRM uses http://git-scm.com/[Git] although I also like -http://mercurial.selenic.com/[Mercurial]. - -If you are using a development instance (as mentioned above) then -Version Control usually allows you to push changes to other versions or -to tag releases. This provides a way of pushing changes to live or test -instances safely. Crucially it also means that, should there be major -problems with a version then this can be easily rolled back. - -[[backup]] -Backup -^^^^^^ - -SuiteCRM has been developed to be customisable. However, mistakes, bugs -and other unpleasantness can (and thanks to Murphy’s law, will) happen. -You should always ensure, before making any changes, that you have a -backup of all files and of the database. - -In order to back up files you can simply create a zip of the SuiteCRM -directory and copy it to a safe place. On Linux systems this can be -performed using the following: - -Example 17.1: File backup - -''''' - -.... -tar -czvf suitecrmfilebackup.tar.gz /path/to/suitecrm -.... - -''''' - -Backing up the SuiteCRM database will vary depending on which database -you are using. However MySQL backups can be performed using the -`mysqldump` command on Linux as seen here: - -Example 17.2: MySQL Database backup - -''''' - -.... -mysqldump suitecrmdatabase -u databaseuser -p | gzip -c | cat > suitecrm.sql.gz -.... - -''''' - -[[be-upgrade-safe]] -Be upgrade safe -^^^^^^^^^^^^^^^ - -Unless you are making changes to a custom module you should strive in -all cases to use the custom framework and make changes in the custom -folder. This ensures that, should you make a mistake, rectifying the -mistake is as simple as removing the customisation. - -However the main advantage to using `custom` is that, when you upgrade -SuiteCRM in the future you will not have your changes overwritten by the -updated SuiteCRM files. See the -link:#chap13.xhtml#extensions-chapter[Extensions] chapter for more -information. - -[[use-appropriate-log-levels]] -Use appropriate log levels -^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Using appropriate log levels (See the chapter on -link:#chap10.xhtml#logging-chapter[Logging]) makes it easier to track -down issues. You do not want very important messages to be logged as -`debug` since this will make them difficult to find. Likewise you don’t -want unimportant log messages cluttering up the `fatal` log output. - -[[long-running-logic-hooks]] -Long running logic hooks -^^^^^^^^^^^^^^^^^^^^^^^^ - -If a logic hook task is long running then you should place it into the -job queue (see the link:#chap11.xhtml#logic-hooks-chapter[Logic Hook] -and link:#chap12.xhtml#scheduled-tasks-chapter[Scheduled Tasks] -chapters). - -[[minimise-sql]] -Minimise SQL -^^^^^^^^^^^^ - -Where possible you should strive to use the SuiteCRM supplied methods of -accessing data. This includes using beans and the BeanFactory where -possible (see the chapter on -link:#chap02.xhtml#working-with-beans-chapter[Working with beans]). -There are a few reasons for this. The first is that SQL is usually -either hardcoded or has to be dynamically built. In the case where the -SQL is hardcoded this means that changes to fields will not be reflected -thereby making your code more brittle. - -Dynamic SQL is better because it can react to field changes and -generally be tailored to fit the situation. However this requires adding -extra, often complex, code. It can be hard to account for all situations -(this can be especially problematic when attempting to traverse -relationships dynamically). - -Another issue is that, usually SQL will end up being Database specific -(see the next point for mitigating this however). - -Finally any custom logic (such as Logic Hooks) which would usually be -fired for saving beans or relationships will not be fired for SQL -queries. - -[[sql-use]] -SQL Use -^^^^^^^ - -In some cases using raw SQL is unavoidable. If that is the case then you -should strive to use standard compliant SQL. If database engine specific -features need to be used, and you wish to target other database engines, -you can check for the DB type. For example: - -Example 17.1: Checking for the database engine - -''''' - -.... - 1 function getSomeSQLQuery(){ - 2 global $sugar_config; - 3 switch($sugar_config['dbconfig']['db_type']){ - 4 case 'mssql': - 5 $sql = 'MSSQL specific SQL'; - 6 break; - 7 case 'mysql': - 8 default: - 9 $sql = 'MySQL specific SQL'; -10 break; -11 } -12 return $sql; -13 } -.... - -''''' - -[[entry-check]] -Entry check -^^^^^^^^^^^ - -The majority of SuiteCRM files will start with some variation of the -following line: - -Example 17.2: Entry check - -''''' - -.... -if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); -.... - -''''' - -This prevents direct access to the file by ensuring that SuiteCRM has -been loaded through a valid entry point (i.e. it has been loaded through -index.php, cron.php or a custom entry point). - -[[redirect-after-post]] -Redirect after post -^^^^^^^^^^^^^^^^^^^ - -Sometimes you may have custom controller actions (see the controller -section) or custom entry points (see the -link:#chap07.xhtml#entry-point-chapter[Entry Points] chapter). These -actions and entry points or other pages are usually accessed using POST. -After a POST request it is a web best practice to redirect to a -different page, especially if your page makes any changes. This prevents -the user from refreshing the page and causing a duplicate action. Within -SuiteCRM it is best to use the `SugarApplication::redirect` method to -redirect. This simply accepts a URL. As follows: - -Example 17.3: Redirecting within SuiteCRM - -''''' - -.... -SugarApplication::redirect('index.php?module=<TheModule>'); -.... - -''''' - -[[performance-tweaks]] -18. Performance Tweaks -~~~~~~~~~~~~~~~~~~~~~~ - -In most cases the performance of SuiteCRM should not be an issue. -However in the case of large datasets or systems with many users you may -notice some performance degradation. These changes can help improve -performance. - -[[server]] -Server -^^^^^^ - -The server that SuiteCRM runs on is, of course, very important when it -comes to the kind of performance you can expect. A full guide on server -setup is outside the scope of this book. However there are some things -you can do to ensure that you get the best performance out of SuiteCRM. - -[[php]] -PHP -+++ - -Installing a PHP opcode cache will increase the performance of all PHP -files. These work by caching the compilation of PHP files resulting in -less work on each request. Furthermore SuiteCRM will use the caching API -of some PHP accelerators which will further increase performance. If you -are using Linux then http://php.net/manual/en/book.apc.php[APC] is the -usual choice. Windows users should check out -http://php.net/manual/en/book.wincache.php[WinCache]. - -[[mysql]] -MySQL -+++++ - -MySQL is notorious for having small default settings. Fully optimising -MySQL is outside the scope of this book (however checkout -http://mysqltuner.pl[mysqltuner.pl] for a helpful Perl script which will -provide setting recommendations - note that you should be careful when -running files from an unknown source). One small change that can make a -big difference is increasing the `innodb_buffer_pool_size`. - -If you have migrated or imported a significant amount of data it is -possible that some tables will be fragmented. Running -`OPTIMIZE TABLE tablename` can increase performance. - -[[indexes]] -Indexes -^^^^^^^ - -Adding indexes on the fields of modules can improve database -performance. The core modules usually have important fields indexed. -However if you have created a new module or added new, often searched -fields to a module then these fields may benefit from being indexed. See -the link:#chap03.xhtml#vardefs-chapter[Vardef] chapter for adding -indexes. - -[[config-changes]] -Config Changes -^^^^^^^^^^^^^^ - -The following are some config settings that can be used to improve -performance. Please note that in most cases you will have better -performance gains by first following the steps in previous sections. -These settings should be set in the config_override.php file. See the -chapter on the link:#chap09.xhtml#config-chapter[Config] files for more -information. - -.... -$sugar_config['developerMode'] = false; -.... - -Unless you are actively developing on an instance developerMode should -be off. Otherwise each page request will cause cached files to be -reloaded. - -.... -$sugar_config['disable_count_query'] = true; -.... - -For systems with large amounts of data the count queries on subpanels -used for the pagination controls can become slow thereby causing the -page to be sluggish or outright slow to load. Disabling these queries -can improve performance dramatically on some pages. - -.... -$sugar_config['disable_vcr'] = true; -.... - -By default opening the detail view of a record from the list view will -also load the other records in the list to allow for easy moving through -records. If you do not use this feature, or, if loading the detail view -for some records has become slow, you can disable this feature. - -.... -$sugar_config['list_max_entries_per_page'] = '10'; -.... - -The number of records shown in each page of the list view can be -decreased. This will result in a slight increase in performance on list -view pages. - -.... -$sugar_config['logger']['level'] = 'fatal'; -.... - -Lowering the log level means that there will be less log messages to -write to disk on each request. This will slightly (very slightly) -increase performance. - -[[further-resources]] -19. Further Resources -~~~~~~~~~~~~~~~~~~~~~ - -Although this book has aimed to be a thorough resource, SuiteCRM is -large and feature rich. Therefore it is not possible to include all the -information you may require. Here are some extra resources for -developing with SuiteCRM. - -[[suitecrm-website]] -SuiteCRM Website -^^^^^^^^^^^^^^^^ - -The SuiteCRM website (http://suitecrm.com[SuiteCRM.com] has many -excellent resources including: - -* https://suitecrm.com/forum/index[SuiteCRM forums] - come and say hi! -* https://suitecrm.com/suitecrm/blog[SuiteCRM Blog] -* https://suitecrm.com/wiki/index.php/Main_Page[SuiteCRM Wiki] - -[[external-suitecrm-resources]] -External SuiteCRM Resources -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -https://github.com/salesagility/SuiteCRM[SuiteCRM GitHub]:: - The SuiteCRM source code is hosted on GitHub. Here you can get - bleeding edge code changes and even contribute code. - -[[sugarcrm-resources]] -SugarCRM Resources -^^^^^^^^^^^^^^^^^^ - -SuiteCRM has strived to remain compatible with the SugarCRM community -edition and much of the documentation is still valid. The appropriate -version for SuiteCRM information is 6.5. Versions of documentation -higher than this (i.e. 7) will probably not be relevant. - -* http://support.sugarcrm.com/02_Documentation/04_Sugar_Developer/[SugarCRM -Developer docs] -* http://developer.sugarcrm.com/[SugarCRM Developer Blog] - -[[technical-links]] -Technical Links -^^^^^^^^^^^^^^^ - -* http://php.net/[PHP] - The main language used by SuiteCRM -* http://www.smarty.net/[Smarty] - The templating language used -throughout SuiteCRM. -* http://xdebug.org[XDebug] - Debugging/profiling extension for PHP -* http://git-scm.com/[Git] - Distributed version control system -* http://yuilibrary.com/[YUI] - Legacy Javascript library used in -SuiteCRM -* https://jquery.com/[JQuery] - Javascript library used in SuiteCRM - to -be preferred over YUI. -* https://github.com/PHPMailer/PHPMailer[PHPMailer] Email library used -in SuiteCRM -* http://php.net/manual/en/book.apc.php[APC] - Alternative PHP Cache. -PHP Opcode cache supported by SuiteCRM -* http://php.net/manual/en/book.wincache.php[WinCache] - Windows PHP -cache. PHP Opcode cache supported by SuiteCRM -* https://www.jetbrains.com/phpstorm/[PHPStorm] - PHP IDE (Paid) -* https://eclipse.org/pdt/[Eclipse PHP Development Tools] - PHP IDE -(Free and Open Source) - -[[other-links]] -Other Links -^^^^^^^^^^^ - -* https://salesagility.com/[SalesAgility] - The company behind SuiteCRM. -* http://www.jsmackin.co.uk[Jim Mackin] - Me :) - -[[appendix-a---code-examples]] -20. Appendix A - Code Examples -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -[[metadata-1]] -Metadata -^^^^^^^^ - -This is an example of setting up a function subpanel (see the -link:#chap05.xhtml#metadata-chapter[Metadata] chapter for more -information). - -In this example the cases module has a custom field `incident_code_c` -which is used to track cases with the same root cause. We’ll add a -subpanel to show all cases that have the same `incident_code_c`. - -Initially we add to the `subpanel_setup` section of Cases by creating -the following file in -`custom/Extension/modules/Cases/Ext/Layoutdefs/IncidentLayoutdefs.php` - -Example A.1: `IncidentLayoutdefs.php` - -''''' - -.... - 1 <?php - 2 $layout_defs["Cases"]["subpanel_setup"]['incident_cases'] = array( - 3 'module' => 'Cases', - 4 'title_key' => 'LBL_INCIDENT_CASES', - 5 'subpanel_name' => 'default', - 6 'get_subpanel_data' => 'function:get_cases_by_incident', - 7 'function_parameters' => - 8 array('import_function_file' => 'custom/modules/Cases/IncidentUtils.ph\ - 9 p',), -10 ); -.... - -''''' - -Next we create the file which will define our `get_cases_by_incident` -function `custom/modules/Cases/IncidentUtils.php`. - -Example A.2: `IncidentUtils.php` - -''''' - -.... - 1 <?php - 2 function get_cases_by_incident(){ - 3 global $db; - 4 //Get the current bean - 5 $bean = $GLOBALS['app']->controller->bean; - 6 $incidentCode = $db->quote($bean->incident_code_c); - 7 //Create the SQL array - 8 $ret = array(); - 9 $ret['select'] = ' SELECT id FROM cases '; -10 $ret['from'] = ' FROM cases '; -11 $ret['join'] = ""; -12 //Get all cases where the incident code matches but exclude the current \ -13 case. -14 $ret['where']="WHERE cases.deleted = 0 AND cases_cstm.incident_code_c = \ -15 '{$incidentCode}' AND cases.id != '{$bean->id}'"; -16 return $ret; -17 } -.... - -''''' - -[[module-installer-1]] -Module Installer -^^^^^^^^^^^^^^^^ - -The following is a basic example manifest file. See the -link:#chap14.xhtml#module-installer-chapter[Module Installer] chapter. - -Example A.3: Example manifest file - -''''' - -.... - 1 $manifest = array( - 2 'name' => 'Example manifest', - 3 'description' => 'A basic manifest example', - 4 'version' => '1.2.3', - 5 'author' => 'Jim Mackin', - 6 'readme' => 'This is a manifest example for the SuiteCRM for Developers book', - 7 'acceptable_sugar_flavors' => array('CE'), - 8 'acceptable_sugar_versions' => array( - 9 'exact_matches' => array('6.5.20',), - 10 ), - 11 'dependencies' => array( - 12 array( - 13 'id_name' => 'hello_world', - 14 'version' => '3.2.1' - 15 ), - 16 ), - 17 'icon' => 'ManifestExample.png', - 18 'is_uninstallable' => true, - 19 'published_date' => '2015-05-05', - 20 'type' => 'module', - 21 'remove_tables' => 'prompt', - 22 ); - 23 $installdefs = array( - 24 'id' => 'suitecrmfordevelopers_example_manifest', - 25 'image_dir' => '/images/', - 26 'copy' => array( - 27 array( - 28 'from' => '/modules/ExampleModule', - 29 'to' => 'modules/ExampleModule', - 30 ), - 31 ), - 32 'dashlets' => array( - 33 array( - 34 'from' => '/modules/ExampleModule/Dashlets/', - 35 'name' => 'ExampleModuleDashlet' - 36 ) - 37 ), - 38 'language' => array( - 39 array( - 40 'from' => 'application/language/en_us.examplemoduleadmin.php', - 41 'to_module' => 'application', - 42 'language' => 'en_us' - 43 ), - 44 array( - 45 'from' => '/modules/Accounts/language/en_us.examplemodule.php', - 46 'to_module' => 'Accounts', - 47 'language' => 'en_us' - 48 ), - 49 array( - 50 'from' => '/application/language/es_es.examplemoduleadmin.php', - 51 'to_module' => 'application', - 52 'language' => 'es_es' - 53 ), - 54 array( - 55 'from' => '/modules/Accounts/language/es_es.examplemodule.php', - 56 'to_module' => 'Accounts', - 57 'language' => 'es_es' - 58 ), - 59 ), - 60 'custom_fields' => array( - 61 array( - 62 'name' => 'example_field', - 63 'label' => 'Example Field', - 64 'type' => 'varchar', - 65 'max_size' => 100, - 66 'module' => 'Accounts', - 67 ), - 68 ), - 69 'vardefs' => array( - 70 array( - 71 'from' => 'modules/Accounts/vardefs/examplemodule_vardefs.php', - 72 'to_module' => 'Accounts', - 73 ), - 74 ), - 75 'beans' => array( - 76 array( - 77 'module' => 'ExampleModule', - 78 'class' => 'ExampleModule', - 79 'path' => 'modules/ExampleModule/ExampleModule.php', - 80 ), - 81 ), - 82 'logic_hooks' => array( - 83 array( - 84 'module' => 'Accounts', - 85 'hook' => 'before_save', - 86 'order' => 100, - 87 'description' => 'Example module before save hook', - 88 'file' => 'modules/ExampleModule/ExampleModuleHook.php', - 89 'class' => 'ExampleModuleLogicHooks', - 90 'function' => 'accounts_before_save', - 91 ), - 92 ), - 93 'administration' => array( - 94 array( - 95 'from' => 'modules/administration/examplemodule_admin.php', - 96 ), - 97 ), - 98 ); - 99 $upgrade_manifest = array( -100 ); -.... - -''''' - -[[appendix-b---api-methods]] -21. Appendix B - API Methods -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -[[methods-1]] -Methods -^^^^^^^ - -[[login]] -login -+++++ - -Logs into SuiteCRM and returns a session id used for subsequent API -calls. - -[[arguments]] -Arguments - -login arguments - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|user_auth |array |Authentication details for the API User - -|user_auth[user_name] |string |The user name of the SuiteCRM user. -Required. - -|user_auth[password] |string |The MD5 hash of the password for -user_name. Required. - -|application_name |string |An identifier for the application accessing -the API - -|name_value_list |name_value_list |An array of login options - -|name_value_list[language] |string |The language for this user - -|name_value_list[notifyonsave] |bool |Send email notifications when a -new record is saved and assigned to a user -|======================================================================= - -[[response]] -Response - -login response - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|id |string |The session id for this login. Required for all other API -calls. - -|name_value_list |name_value_list |An array containing information about -this user. - -|name_value_list[user_id] |string |The id of the logged in user. - -|name_value_list[user_name] |string |The user_name of the logged in user - -|name_value_list[user_language] |string |The language setting of the -logged in user - -|name_value_list[user_currency_id] |string |The id of the currency of -the logged in user. -99 is the default currency. - -|name_value_list[user_currency_name] |string |The name of the currency -of the logged in user. - -|name_value_list[user_is_admin] |bool |Whether the logged in user is an -admin - -|name_value_list[user_default_team_id] |string |The default team of the -logged in user. This value comes from before the fork of SuiteCRM and -isn’t used. - -|name_value_list[user_default_dateformat] |string |The default date -format of the logged in user. - -|name_value_list[user_default_timeformat] |string |The default time -format of the logged in user - -|name_value_list[user_number_seperator] |string |The number separator of -the logged in user. (I.e. comma for numbers in the 1,000.00 format) - -|name_value_list[user_decimal_seperator] |string |The decimal separator -of the logged in user. (I.e. period for numbers in the 1,000.00 format) - -|name_value_list[mobile_max_list_entries] |int |Max list entries for the -logged in user (simply grabs the wl_list_max_entries_per_subpanel config -key) - -|name_value_list[mobile_max_subpanel_entries] |int |Max subpanel entries -for the logged in user(simply grabs the wl_list_max_entries_per_subpanel -config key) -|======================================================================= - -[[logout]] -logout -++++++ - -Logs the web user out of SuiteCRM and destroys the session. - -[[arguments-1]] -Arguments - -logout arguments - -[cols=",,",options="header",] -|=========================================== -|Name |Type |Desc -|session |string |The session id. See login. -|=========================================== - -[[response-1]] -Response - -No response. - -[[get_available_modules]] -get_available_modules -+++++++++++++++++++++ - -Returns a list of the modules available for use. Also returns the ACL -(Access Control List) for each module. - -[[arguments-2]] -Arguments - -get_available_modules arguments - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|session |string |The session id. See login. - -|filter |string |Filter the modules returned. Either ‘default’, ‘mobile’ -or ‘all’. -|======================================================================= - -[[response-2]] -Response - -get_available_modules response - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|modules |array |An array containing the module details. - -|modules[][module_key] |string |The key for this module - -|modules[][module_label] |string |The label for this module - -|modules[][favorite_enabled] |bool |Favorites were SugarCRM Professional -functionality. This is always empty. - -|modules[][acls] |array |An array containing the ACL list - that is what -actions are allowed. - -|modules[][acls][][action] |string |The action i.e. edit, delete, list -etc. - -|modules[][acls][][access] |bool |Whether or not access is allowed. -|======================================================================= - -[[get_document_revision]] -get_document_revision -+++++++++++++++++++++ - -Returns the details for a specific document revision. - -[[arguments-3]] -Arguments - -get_document_revision arguments - -[cols=",,",options="header",] -|====================================================== -|Name |Type |Desc -|session |string |The session id. See login. -|i |string |The id of the document revision to retrieve -|====================================================== - -[[response-3]] -Response - -get_document_revision response - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|document_revision |array |An array containing the document revision -details - -|document_revision[id] |string |The id of the document revision. - -|document_revision[document_name] |string |The name of the document -revision - -|document_revision[revision] |int |The revision number of the document -revision. - -|document_revision[filename] |string |The filename of the file - -|document_revision[file] |binary string |The full contents of the file -|======================================================================= - -[[get_entries]] -get_entries -+++++++++++ - -Gets a list of entries for a specific module and list of module ids. -Optionally allows returning related records. - -[[arguments-4]] -Arguments - -get_entries arguments - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|session |string |The session id. See login. - -|module_name |string |The name of the module to display entries for. - -|ids |array |An array of record ids to fetch - -|ids[] |string |An individual id - -|select_fields |array |An array of fields to return. An empty array will -return all fields. - -|select_fields[] |string |The name of a field to return - -|link_name_to_fields_array |name_value_list |An array of relationships -to retrieved. - -|link_name_to_fields_array[][name] |string |The name of the link to -follow (as defined in `module_name`). - -|link_name_to_fields_array[][value] |array |An array of the fields to -return for this related module. - -|link_name_to_fields_array[][value][] |string |The field name - -|track_view |bool |Whether to mark these records as recently viewed. -|======================================================================= - -[[response-4]] -Response - -get_entries response - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|entry_list |array |An array of records. - -|entry_list[] |array |Details for an individual record. - -|entry_list[][id] |string |The id of this record. - -|entry_list[][module_name] |string |The name of the module this record -belongs to. - -|entry_list[][name_value_list] |name_value_list |An array containing -each returned field. - -|entry_list[][name_value_list][] |array |Details for an individual -field. - -|entry_list[][name_value_list][][name] |string |The name of the field. - -|entry_list[][name_value_list][][value] |string |The value of the field. - -|relationship_list |array |An array of arrays containing the -relationships for the corresponding record. - -|relationship_list[] |array |The relationships for the corresponding -record. - -|relationship_list[link_list] |array |The list of relationships for this -record. - -|relationship_list[link_list][] |array |Details of a single -relationship. - -|relationship_list[link_list][][name] |string |The name of this -relationship. - -|relationship_list[link_list][][records] |array |The related records for -this relationship. - -|relationship_list[link_list][][records][] |array |Details of a single -related record. - -|relationship_list[link_list][][records][][link_value] |name_value_list -|An array of the requested fields for this relationship. - -|relationship_list[link_list][][records][][link_value][] |array |A name -value pair for this particular field. - -|relationship_list[link_list][][records][][link_value][name] |string -|The name of the field. - -|relationship_list[link_list][][records][][link_value][value] |string -|The value of the field. -|======================================================================= - -[[get_entries_count]] -get_entries_count -+++++++++++++++++ - -Returns a count of entries matching the given query. - -[[arguments-5]] -Arguments - -get_entries_count arguments - -[cols=",,",options="header",] -|=================================================================== -|Name |Type |Desc -|session |string |The session id. See login. -|module_name |string |The name of the module to display entries for. -|query |string |An SQL WHERE clause to apply to the query. -|deleted |bool |Whether to include deleted records -|=================================================================== - -[[response-5]] -Response - -get_entries_count response - -[cols=",,",options="header",] -|================================================= -|Name |Type |Desc -|result_count |int |The count of matching entries. -|================================================= - -[[get_entry]] -get_entry -+++++++++ - -Returns the details for a single record. Optionally allows returning -related records. - -[[arguments-6]] -Arguments - -get_entry arguments - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|session |string |The session id. See login. - -|module_name |string |The name of the module to fetch the entry for. - -|id |string |The id of the record to fetch - -|select_fields |array |An array of fields to return. An empty array will -return all fields. - -|select_fields[] |string |The name of a field to return - -|link_name_to_fields_array |name_value_list |An array of relationships -to retrieved. - -|link_name_to_fields_array[][name] |string |The name of the link to -follow (as defined in `module_name`). - -|link_name_to_fields_array[][value] |array |An array of the fields to -return for this related module. - -|link_name_to_fields_array[][value][] |string |The field name - -|track_view |bool |Whether to mark these records as recently viewed. -|======================================================================= - -[[response-6]] -Response - -Identical to the response by `get_entries` except only one record will -be returned. - -[[get_entry_list]] -`get_entry_list` -++++++++++++++++ - -[[arguments-7]] -Arguments - -get_entry_list arguments - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|session |string |The session id. See login. - -|module_name |string |The name of the module to fetch the entry for. - -|query |string |An SQL WHERE clause to apply to the query. - -|order_by |string |In theory for ordering results but this is unused. - -|offset |int |The result offset. Useful for pagination. - -|select_fields |array |An array of fields to return. An empty array will -return all fields. - -|select_fields[] |string |The name of a field to return - -|link_name_to_fields_array |name_value_list |An array of relationships -to retrieved. - -|link_name_to_fields_array[][name] |string |The name of the link to -follow (as defined in `module_name`). - -|link_name_to_fields_array[][value] |array |An array of the fields to -return for this related module. - -|link_name_to_fields_array[][value][] |string |The field name - -|max_results |int |The maximum number of results to return. Useful for -pagination. - -|deleted |bool |Whether to include deleted records. - -|favorites |bool |Favorites were SugarCRM Professional functionality. -This is unused. -|======================================================================= - -[[response-7]] -Response - -get_entry_list response - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|result_count |int |The number of returned records. - -|total_count |int |The total number of records matching the query. - -|next_offset |int |The offset of the next set of records. - -|entry_list |array |An array of records. - -|entry_list[] |array |Details for an individual record. - -|entry_list[][id] |string |The id of this record. - -|entry_list[][module_name] |string |The name of the module this record -belongs to. - -|entry_list[][name_value_list] |name_value_list |An array containing -each returned field. - -|entry_list[][name_value_list][] |array |Details for an individual -field. - -|entry_list[][name_value_list][][name] |string |The name of the field. - -|entry_list[][name_value_list][][value] |string |The value of the field. - -|relationship_list |array |An array of arrays containing the -relationships for the corresponding record. - -|relationship_list[] |array |The relationships for the corresponding -record. - -|relationship_list[link_list] |array |The list of relationships for this -record. - -|relationship_list[link_list][] |array |Details of a single -relationship. - -|relationship_list[link_list][][name] |string |The name of this -relationship. - -|relationship_list[link_list][][records] |array |The related records for -this relationship. - -|relationship_list[link_list][][records][] |array |Details of a single -related record. - -|relationship_list[link_list][][records][][link_value] |name_value_list -|An array of the requested fields for this relationship. - -|relationship_list[link_list][][records][][link_value][] |array |A name -value pair for this particular field. - -|relationship_list[link_list][][records][][link_value][name] |string -|The name of the field. - -|relationship_list[link_list][][records][][link_value][value] |string -|The value of the field. -|======================================================================= - -[[get_language_definition]] -get_language_definition -+++++++++++++++++++++++ - -Returns - -[[arguments-8]] -Arguments - -get_language_definition arguments - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|session |string |The session id. See login. - -|modules |array |An array of the modules to return language labels for - -|modules[] |string |The modules name. - -|md5 |bool |Whether to return the md5 for each module. Can be useful for -caching responses. -|======================================================================= - -[[response-8]] -Response - -get_language_definition response - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|result[] |string/array |An array of the labels -or an md5 string for -|======================================================================= - -[[get_last_viewed]] -`get_last_viewed` -+++++++++++++++++ - -Returns a list of the most recently viewed modules for the current user. - -[[arguments-9]] -Arguments - -get_last_viewed arguments - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|session |string |The session id. See login. - -|module_names |array |An array of the modules to return the last viewed -records for. - -|module_names[] |string |The modules name. -|======================================================================= - -[[response-9]] -Response - -get_last_viewed response - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|result[] |array |An array of the details of recently viewed records - -|result[][id] |int |The id of the tracker row for this viewing - -|result[][item_id] |string |The id of the viewed record. - -|result[][item_summary] |string |The summary of the record. This is -usually it’s name. - -|result[][module_name] |string |The module for this record. - -|result[][monitor_id] |string |The monitor id for this viewing. Legacy -and unused. - -|result[][date_modified] |string |The date that this record was viewed. -|======================================================================= - -[[get_modified_relationships]] -`get_modified_relationships` -++++++++++++++++++++++++++++ - -Returns a list of the modified relationships for the current user -between one of the Calls, Meetings or Contacts modules. - -[[arguments-10]] -Arguments - -get_modified_relationships arguments - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|session |string |The session id. See login. - -|module_name |string |The name of the module to retrieve relationships -for. Always `Users`. - -|related_module |string |The related module to retrieve records for. One -of `Meetings`, `Calls` or `Contacts`. - -|from_date |string |The start date of the range to search. In the format -`Y-m-d H:i:s`. - -|to_date |string |The end date of the range to search. In the format -`Y-m-d H:i:s`. - -|offset |int |The record offset to start with. - -|max_results |int |The maximum number of results to return. - -|deleted |bool |Whether to include deleted records. - -|module_user_id |string |In theory the id of the user to return -relationships for. However the current user is always used. - -|select_fields |array |An array of the fields to return for the -relationship record. An empty array will return all fields. - -|select_fields[] |string |The name of the field to return. - -|relationship_name |string |The name of the relationship between -`module_name` and `related_module`. - -|deletion_date |string |A start date for the range in which to return -deleted records. In the format `Y-m-d H:i:s`. -|======================================================================= - -[[response-10]] -Response - -get_modified_relationships response - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|result_count |int |The number of returned records. - -|next_offset |int |The offset of the next set of records. - -|entry_list |array |An array of the returned records. - -|entry_list[] |array |Details for an individual record. - -|entry_list[][id] |string |The id of this record. - -|entry_list[][module_name] |string |The name of the module this record -belongs to. - -|entry_list[][name_value_list] |name_value_list |An array containing -each returned field. - -|entry_list[][name_value_list][] |array |A name value pair of the field -information. - -|entry_list[][name_value_list][][name] |string |The name of the field. - -|entry_list[][name_value_list][][value] |string |The value of the field. - -|error |array |An array containing the error details. - -|error[number] |int |The error number of the error that occurred. - -|error[name] |string |The name of the error that occurred. - -|error[description] |string |A description of the error that occurred. -|======================================================================= - -[[get_module_fields]] -`get_module_fields` -+++++++++++++++++++ - -Returns the field definitions for a given module. - -[[arguments-11]] -Arguments - -get_module_fields arguments - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|session |string |The session id. See login. - -|module_name |string |The name of the module to return field definitions -for. - -|fields |array |An array of fields to return definitions for. An empty -array will return all fields. - -|fields[] |string |The name of the field. -|======================================================================= - -[[response-11]] -Response - -get_module_fields response - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|module_name |string |The name of the module. - -|table_name |string |The name of the database table for this module. - -|module_fields |array |An array of the requested fields for this module. - -|module_fields[] |array |The details of a specific field. - -|module_fields[name] |string |The name of the field. - -|module_fields[type] |string |The type of the field. - -|module_fields[group] |string |The group of fields that this field -belongs to. Used for addresses or link definitions. - -|module_fields[id_name] |string |The name of the id field on this module -for this link if appropriate. - -|module_fields[label] |string |The display label for this field. - -|module_fields[required] |bool |Whether this field is required or not. - -|module_fields[options] |name_value_list |An array of possible options -for this field. An empty array if options are not appropriate for this -field type. - -|module_fields[options][] |array |A name value pair of a single option. - -|module_fields[options][][name] |string |The options key. - -|module_fields[options][][value] |string |The options display value. - -|module_fields[related_module] |string |The related module for this -field if it is a related type. Empty otherwise. - -|module_fields[calculated] |string |Calculated fields were a SugarCRM -professional feature. Will be empty. - -|module_fields[len] |int |The length of this field or an empty string if -this is not appropriate for this field type. - -|link_fields |array |An array of the requested link fields for this -module. - -|link_fields[] |array |The details of a specific field. - -|link_fields[name] |string |The name of the field. - -|link_fields[type] |string |The type of the field. Will always be link. - -|link_fields[group] |string |The group of fields that this field belongs -to. Will be empty for links. - -|link_fields[id_name] |string |The name of the id field on this module -for this link if appropriate. - -|link_fields[relationship] |string |The relationship name for this link. - -|link_fields[module] |string |The module this field links to. - -|link_fields[bean_name] |string |The bean that this field links to. -|======================================================================= - -[[get_module_fields_md5]] -`get_module_fields_md5` -+++++++++++++++++++++++ - -Returns an md5 of the a modules field definitions. Useful for caching. - -[[arguments-12]] -Arguments - -get_module_fields_md5 arguments - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|session |string |The session id. See login. - -|module_names |array |An array of modules to return the md5 for. - -|module_names[] |string |The name of the module to return the field -definitions md5 for. -|======================================================================= - -[[response-12]] -Response - -get_module_fields_md5 response - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|result[] |array |An array of the md5’s keyed by the module name. - -|result[] |string |The md5 string for - -|======================================================================= - -[[get_module_layout]] -`get_module_layout` -+++++++++++++++++++ - -Returns the layout for specified modules and views. Optionally returns -an md5 of the layouts. - -[[arguments-13]] -Arguments - -get_module_layout arguments - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|session |string |The session id. See login. - -|modules |array |An array of the modules to return layouts for. - -|modules[] |string |The name of the module. - -|types |array |An array of the types of views to return. Only `default` -is supported. - -|types[] |string |The type of the views. - -|views |array |An array of the views to return. One of `edit`, `detail`, -`list` and `subpanel`. - -|views[] |string |The name of the view. - -|acl_check |bool |Whether or not to check that the current user has -access to this module and view. - -|md5 |bool |Whether or not to return the view as an md5 string. Useful -for caching. -|======================================================================= - -[[response-13]] -Response - -get_module_layout response - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|result |array |The array of results keyed by module name. - -|result[] |array |An array of layouts for -. - -|result[][default] |array |An array of the -layouts keyed by the view name. - -|result[][default][] -|array/string |The layout of the view for the module - or an md5 of the layout. See the section on metadata for -the layout format. -|======================================================================= - -[[get_module_layout_md5]] -`get_module_layout_md5` -+++++++++++++++++++++++ - -Returns the md5 of the specified views for the specified modules. -Behaves identically to get_module_layout with the md5 parameter set to -true. - -[[arguments-14]] -Arguments - -get_module_layout arguments - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|session |string |The session id. See login. - -|modules |array |An array of the modules to return layouts for. - -|modules[] |string |The name of the module. - -|types |array |An array of the types of views to return. Only `default` -is supported. - -|types[] |string |The type of the views. - -|views |array |An array of the views to return. One of `edit`, `detail`, -`list` and `subpanel`. - -|views[] |string |The name of the view. - -|acl_check |bool |Whether or not to check that the current user has -access to this module and view. -|======================================================================= - -[[response-14]] -Response - -get_module_layout_md5 response - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|md5 |array |The array of results keyed by module name. - -|md5[] |array |An array of layouts for -. - -|md5[][default] |array |An array of the layouts -keyed by the view name. - -|md5[][default][] |string -|The md5 of the layout layout of the view for the module -. -|======================================================================= - -[[get_relationships]] -`get_relationships` -+++++++++++++++++++ - -Returns related records given a specific module, record and list of -links. ####Arguments - -get_relationships arguments - -[cols=",,,",options="header",] -|======================================================================= -|Name |Type |Desc |  -|session |string |The session id. See login. |  - -|module_name |string |The module to return relationships for. |  - -|module_id |string |The record to return relationships for. |  - -|link_field_name |string |The link field to follow for this record. |  - -|related_module_query |string |A WHERE clause to use to filter the -related modules by. |  - -|related_fields |array |An array of the fields to return for matching -records. |  - -|related_fields[] |string |The name of the field. |  - -|related_module_link_name_to_fields_array |name_value_list |An array of -related fields to return for matching records. |  - -|related_module_link_name_to_fields_array[] |array |Details for a -specific link. |  - -|related_module_link_name_to_fields_array[][name] |string |The name of -the link to follow for matching records. |  - -|related_module_link_name_to_fields_array[][value] |array |An array of -fields to return for this link. |  - -|related_module_link_name_to_fields_array[][value][] |string |The field -name. |  - -|deleted |bool |Whether to include deleted records. |  - -|order_by |string |In theory for ordering results but this is unused. |  - -|offset |int |The record offset to start with. |  - -|limit |int |The maximum number of results to return. |  -|======================================================================= - -[[response-15]] -Response - -Identical to the response by `get_entries`. - -[[get_server_info]] -`get_server_info` -+++++++++++++++++ - -Returns information about the SuiteCRM server. Currently still returns -information about the SugarCRM flavor and versions. - -[[arguments-15]] -Arguments - -No arguments. - -[[response-16]] -Response - -get_server_info response - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|flavor |string |The SugarCRM flavor. For SuiteCRM will always be ‘CE’. - -|version |string |The SugarCRM version. Note this this is distinct from -the SuiteCRM version - -|gmt_time |string |The server time in UTC. -|======================================================================= - -[[get_upcoming_activities]] -`get_upcoming_activities` -+++++++++++++++++++++++++ - -Returns a list of the 10 upcoming activities (Meetings, Calls and Tasks -- also includes Opportunities) for the currently logged in user. - -[[arguments-16]] -Arguments - -get_upcoming_activities arguments - -[cols=",,",options="header",] -|=========================================== -|Name |Type |Desc -|session |string |The session id. See login. -|=========================================== - -[[response-17]] -Response - -get_upcoming_activities response - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|result |array |An array of the upcoming activities. - -|result[] |array |The details of a single activity. - -|result[][id] |string |The id of this activity. - -|result[][module] |string |The module for this activity. - -|result[][date_due] |string |The due date for this activity. - -|result[][summary] |string |The summary of this activity. Usually simply -it’s name. -|======================================================================= - -[[get_user_id]] -`get_user_id` -+++++++++++++ - -Returns the id of the currently logged in user. - -[[arguments-17]] -Arguments - -get_user_id arguments - -[cols=",,",options="header",] -|=========================================== -|Name |Type |Desc -|session |string |The session id. See login. -|=========================================== - -[[response-18]] -Response - -get_user_id response - -[cols=",,",options="header",] -|======================================= -|Name |Type |Desc -|id |string |The id of the current user. -|======================================= - -[[seamless_login]] -`seamless_login` -++++++++++++++++ - -Marks a session as allowing a seamless login. If successful then the -session id (see the login call) can be used in a URL (as MSID) to log -the user into SuiteCRM in the browser seamlessly. For example if you -have the session id `1234` then accessing the URL -`example.com/index.php?MSID=1234`. The MSID parameter can be used in any -valid SuiteCRM URL. - -[[arguments-18]] -Arguments - -seamless_login arguments - -[cols=",,",options="header",] -|=========================================== -|Name |Type |Desc -|session |string |The session id. See login. -|=========================================== - -[[response-19]] -Response - -seamless_login response - -[cols=",,",options="header",] -|======================================== -|Name |Type |Desc -|result |bool |Boolean indicating success -|======================================== - -[[search_by_module]] -`search_by_module` -++++++++++++++++++ - -Allows searching for records that contain a specific search string. - -[[arguments-19]] -Arguments - -search_by_module arguments - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|session |string |The session id. See login. - -|search_string |string |The string to search for. - -|modules |array |An array of the modules to include in the search. - -|modules[] |string |The modules name. - -|offset |int |The result offset. Useful for pagination. - -|max_results |int |The maximum number of results to return. Useful for -pagination. - -|assigned_user_id |string |Filter by the given assigned user. Leave -blank to do no user filtering. - -|select_fields |array |An array of the fields to return for the found -records. An empty array will return all fields. - -|select_fields[] |string |The name of the field to return. - -|unified_search_only |bool |Whether to only return records for modules -that participate in the global search. - -|favorites |bool |Favorites were SugarCRM Professional functionality. -This is unused. -|======================================================================= - -[[response-20]] -Response - -search_by_module response - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|entry_list |array |An array of the results for each module. - -|entry_list[] |array |Results for a specific module. - -|entry_list[][name] |string |The name of the module that this entry -contains results for. - -|entry_list[][records] |array |An array of the record results. - -|entry_list[][records][] |name_value_list |A name value list of records -id and name. - -|entry_list[][records][][id] |array |A name value pair containing the id -of this record. - -|entry_list[][records][][name] |array |A name value pair containing the -name of this record. -|======================================================================= - -[[set_document_revision]] -`set_document_revision` -+++++++++++++++++++++++ - -Creates a new document revision for a document. - -[[arguments-20]] -Arguments - -set_document_revision arguments - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|session |string |The session id. See login. - -|note |array |An array containing the document revision details. - -|note[id] |string |The id of the document to add this revision to. - -|note[file] |binary string |The binary contents of the file, base 64 -encoded. - -|note[filename] |string |The name of the file. - -|note[revision] |int |The revision number for this revision. -|======================================================================= - -[[response-21]] -Response - -set_document_revision response - -[cols=",,",options="header",] -|========================================================== -|Name |Type |Desc -|id |string |The id of the newly created document revision. -|========================================================== - -[[set_entries]] -`set_entries` -+++++++++++++ - -Creates or updates a list of records. - -[[arguments-21]] -Arguments - -Note: Supplying a value for the id field will perform an update for that -record. - -set_entries arguments - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|session |string |The session id. See login. - -|module_name |string |The name of the module to create/update records -for. - -|name_value_lists |name_value_list |An array of the details for each -record to create/update. - -|name_value_lists[] |array |Details of an individual record. - -|name_value_lists[][] |array |A name value pair for each field value. - -|name_value_lists[][][name] |array |The name of the field. - -|name_value_lists[][][value] |array |The value for the field. -|======================================================================= - -[[response-22]] -Response - -set_entries response - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|ids |array |An array of the resulting ids. Returned in the same order -as specified in the call to `set_entries`. - -|ids[] |array |The id for this record. -|======================================================================= - -[[set_entry]] -`set_entry` -+++++++++++ - -Creates or updates a single record. - -[[arguments-22]] -Arguments - -Note: Supplying a value for the id field will perform an update for that -record. - -set_entries arguments - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|session |string |The session id. See login. - -|module_name |string |The name of the module to create/update a record -for. - -|name_value_list |name_value_list |An array of the fields for the -new/updated record. - -|name_value_lists[] |array |A name value pair for each field value. - -|name_value_lists[][name] |array |The name of the field. - -|name_value_lists[][value] |array |The value for the field. -|======================================================================= - -[[response-23]] -Response - -set_entries response - -[cols=",,",options="header",] -|========================================================== -|Name |Type |Desc -|id |string |The id of the newly created or updated record. -|========================================================== - -[[get_note_attachment]] -`get_note_attachment` -+++++++++++++++++++++ - -Returns the details of a given note attachment. - -[[arguments-23]] -Arguments - -get_note_attachment arguments - -[cols=",,",options="header",] -|=========================================================== -|Name |Type |Desc -|session |string |The session id. See login. -|id |string |The id of the note to retrieve information for. -|=========================================================== - -[[response-24]] -Response - -get_note_attachment response - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|note_attachment |array |The details for the note attachment. - -|note_attachment[id] |string |The id of the note to retrieve information -for. - -|note_attachment[filename] |string |The filename of the file - -|note_attachment[file] |binary string |The full contents of the file - -|note_attachment[related_module_id] |string |The id of the record that -this attachment is related to. - -|note_attachment[related_module_name] |string |The module of the record -that this attachment is related to. -|======================================================================= - -[[set_note_attachment]] -`set_note_attachment` -+++++++++++++++++++++ - -Creates a not attachment for a specified record. - -[[arguments-24]] -Arguments - -set_note_attachment arguments - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|session |string |The session id. See login. - -|note |array |The details for the note attachment. - -|note[id] |string |The id of the note to add an attachment for. - -|note[filename] |string |The filename of the file - -|note[file] |binary string |The full contents of the file base 64 -encoded. -|======================================================================= - -[[response-25]] -Response - -set_entries response - -[cols=",,",options="header",] -|=================================================== -|Name |Type |Desc -|id |string |The id of the note for this attachment. -|=================================================== - -[[set_relationship]] -`set_relationship` -++++++++++++++++++ - -Sets a relationship between a record and other records. - -[[arguments-25]] -Arguments - -set_relationship arguments - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|session |string |The session id. See login. - -|module_name |string |The name of the module to relate records to. - -|module_id |string |The id of the record to relate records to. - -|link_field_name |string |The name of the link field on the module -through which records will be related. - -|related_ids |array |An array of record ids to relate. - -|related_ids[] |string |The id of a record to relate. - -|name_value_list |name_value_list |A name value list of additional -relationship fields to set. - -|name_value_list[] |array |A name value pair for a relationship field to -set. - -|name_value_list[][name] |string |The name of the field to set. - -|name_value_list[][value] |string |The value of the field to set. - -|delete |bool |Whether or not to delete the specified relationship -instead of creating/updating it. -|======================================================================= - -[[response-26]] -Response - -set_relationship response - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|created |int |The number of relationships created. - -|failed |int |The number of relationships that failed to be -created/deleted. - -|deleted |int |The number of relationships deleted. -|======================================================================= - -[[set_relationships]] -`set_relationships` -+++++++++++++++++++ - -Sets relationships between multiple records. - -[[arguments-26]] -Arguments - -set_relationships arguments - -[cols=",,,",options="header",] -|======================================================================= -|Name |Type |Desc |  -|session |string |The session id. See login. |  - -|module_names |array |An array of modules to relate records to. |  - -|module_names[] |string |The name of the module to relate records to. |  - -|module_ids |array |An array of the ids of records to relate records to. -|  - -|module_ids[] |string |The id of the record to relate records to. |  - -|link_field_names |string |An array of the link names through which -records will be related. |  - -|link_field_names[] |string |The name of the link field on the module -through which records will be related. |  - -|related_ids |array |An array of an array of record ids for each module -specified. |  - -|related_ids[] |array |An array of record ids for the corresponding -module. |  - -|related_ids[][] |string |The record id. |  - -|name_value_lists |array |An array of an array of name value list of -additional relationship fields to set. |  - -|name_value_lists[] |name_value_list |An array of name value pairs for -the relationship fields of the corresponding module. |  - -|name_value_lists[][name] |string |The name of the field to set. |  - -|name_value_lists[][value] |string |The value of the field to set. |  - -|delete_array |array |An array of booleans indicating whether or not the -relationship should be deleted for each module. |  - -|delete_array[] |bool |Whether or not to delete the specified -relationship instead of creating/updating it. |  -|======================================================================= - -[[response-27]] -Response - -set_relationships response - -[cols=",,",options="header",] -|======================================================================= -|Name |Type |Desc -|created |int |The number of relationships created. - -|failed |int |The number of relationships that failed to be -created/deleted. - -|deleted |int |The number of relationships deleted. -|======================================================================= diff --git a/_source/suitecrm_developer_book.md b/_source/suitecrm_developer_book.md deleted file mode 100644 index e96d5afcb..000000000 --- a/_source/suitecrm_developer_book.md +++ /dev/null @@ -1,5650 +0,0 @@ - - -
-![SuiteCRM for Developers](images/title_page.jpg "SuiteCRM for Developers") - -
- - -SuiteCRM for Developers ------------------------ - -### Getting started with developing for SuiteCRM - -  - -#### Jim Mackin - -  - -This book is for sale at - -This version was published on 2015-05-22 - -![publisher's logo](images/leanpub-logo.png "publisher's logo") - --    \*   \*   \*   \* - -This is a [Leanpub](http://leanpub.com) book. Leanpub empowers authors and publishers with the Lean Publishing process. [Lean Publishing](http://leanpub.com/manifesto) is the act of publishing an in-progress ebook using lightweight tools and many iterations to get reader feedback, pivot until you have the right book and build traction once you do. - --    \*   \*   \*   \* - -
-© 2015 Jim Mackin - -
- - -
-Table of Contents ------------------ - -- [1. Introduction](#chap00.xhtml#leanpub-auto-introduction "wikilink") - - [What is SuiteCRM](#chap00.xhtml#leanpub-auto-what-is-suitecrm "wikilink") - - [This book](#chap00.xhtml#leanpub-auto-this-book "wikilink") - - [Reading this book](#chap00.xhtml#leanpub-auto-reading-this-book "wikilink") - - [Setting up SuiteCRM](#chap00.xhtml#leanpub-auto-setting-up-suitecrm "wikilink") - - [Initial Tweaks](#chap00.xhtml#leanpub-auto-initial-tweaks "wikilink") -- [2. SuiteCRM Directory Structure](#chap01.xhtml#leanpub-auto-suitecrm-directory-structure "wikilink") -- [3. Working with Beans](#chap02.xhtml#working-with-beans-chapter "wikilink") - - [BeanFactory](#chap02.xhtml#leanpub-auto-beanfactory "wikilink") - - [SugarBean](#chap02.xhtml#leanpub-auto-sugarbean "wikilink") - - [Searching for beans](#chap02.xhtml#leanpub-auto-searching-for-beans "wikilink") - - [Accessing fields](#chap02.xhtml#leanpub-auto-accessing-fields "wikilink") - - [Related beans](#chap02.xhtml#leanpub-auto-related-beans "wikilink") -- [4. Vardefs](#chap03.xhtml#vardefs-chapter "wikilink") - - [What are Vardefs](#chap03.xhtml#leanpub-auto-what-are-vardefs "wikilink") - - [Defining Vardefs](#chap03.xhtml#leanpub-auto-defining-vardefs "wikilink") -- [5. Views](#chap04.xhtml#leanpub-auto-views "wikilink") - - [Location](#chap04.xhtml#leanpub-auto-location "wikilink") - - [Customising](#chap04.xhtml#leanpub-auto-customising "wikilink") -- [6. Metadata](#chap05.xhtml#metadata-chapter "wikilink") - - [Intro](#chap05.xhtml#leanpub-auto-intro "wikilink") - - [Location](#chap05.xhtml#leanpub-auto-location-1 "wikilink") - - [Customising](#chap05.xhtml#leanpub-auto-customising-1 "wikilink") - - [Different metadata](#chap05.xhtml#leanpub-auto-different-metadata "wikilink") -- [7. Controllers](#chap06.xhtml#leanpub-auto-controllers "wikilink") - - [Customising controllers](#chap06.xhtml#leanpub-auto-customising-controllers "wikilink") -- [8. Entry Points](#chap07.xhtml#entry-point-chapter "wikilink") - - [Creating an entry point](#chap07.xhtml#leanpub-auto-creating-an-entry-point "wikilink") -- [9. Language Strings](#chap08.xhtml#language-chapter "wikilink") - - [Module Strings](#chap08.xhtml#leanpub-auto-module-strings "wikilink") - - [Application Strings](#chap08.xhtml#leanpub-auto-application-strings "wikilink") - - [Application List Strings](#chap08.xhtml#leanpub-auto-application-list-strings "wikilink") - - [Why and when to customise](#chap08.xhtml#leanpub-auto-why-and-when-to-customise "wikilink") - - [Usage](#chap08.xhtml#leanpub-auto-usage "wikilink") -- [10. Config](#chap09.xhtml#config-chapter "wikilink") - - [The config files](#chap09.xhtml#leanpub-auto-the-config-files "wikilink") - - [Using config options](#chap09.xhtml#leanpub-auto-using-config-options "wikilink") -- [11. Logging](#chap10.xhtml#logging-chapter "wikilink") - - [Logging messages](#chap10.xhtml#leanpub-auto-logging-messages "wikilink") - - [Logging output](#chap10.xhtml#leanpub-auto-logging-output "wikilink") - - [Log levels](#chap10.xhtml#leanpub-auto-log-levels "wikilink") -- [12. Logic Hooks](#chap11.xhtml#logic-hooks-chapter "wikilink") - - [Intro](#chap11.xhtml#leanpub-auto-intro-1 "wikilink") - - [Types](#chap11.xhtml#leanpub-auto-types "wikilink") - - [Application Hooks](#chap11.xhtml#leanpub-auto-application-hooks "wikilink") - - [User Hooks](#chap11.xhtml#leanpub-auto-user-hooks "wikilink") - - [Module Hooks](#chap11.xhtml#leanpub-auto-module-hooks "wikilink") - - [Job Queue Hooks](#chap11.xhtml#leanpub-auto-job-queue-hooks "wikilink") - - [Implementing](#chap11.xhtml#leanpub-auto-implementing "wikilink") - - [Tips](#chap11.xhtml#leanpub-auto-tips "wikilink") -- [13. Scheduled Tasks](#chap12.xhtml#scheduled-tasks-chapter "wikilink") - - [Intro](#chap12.xhtml#leanpub-auto-intro-2 "wikilink") - - [Scheduler](#chap12.xhtml#leanpub-auto-scheduler "wikilink") - - [Job Queue](#chap12.xhtml#leanpub-auto-job-queue "wikilink") - - [Debugging](#chap12.xhtml#leanpub-auto-debugging "wikilink") -- [14. Extension Framework](#chap13.xhtml#extensions-chapter "wikilink") - - [Introduction](#chap13.xhtml#leanpub-auto-introduction-1 "wikilink") - - [Standard Extensions](#chap13.xhtml#leanpub-auto-standard-extensions "wikilink") - - [Custom Extensions](#chap13.xhtml#leanpub-auto-custom-extensions "wikilink") -- [15. Module Installer](#chap14.xhtml#module-installer-chapter "wikilink") - - [manifest.php](#chap14.xhtml#leanpub-auto-manifestphp "wikilink") - - [Types](#chap14.xhtml#leanpub-auto-types-1 "wikilink") -- [16. API](#chap15.xhtml#leanpub-auto-api "wikilink") - - [Using the API](#chap15.xhtml#leanpub-auto-using-the-api "wikilink") - - [Adding custom API methods](#chap15.xhtml#leanpub-auto-adding-custom-api-methods "wikilink") -- [17. Best Practices](#chap16.xhtml#leanpub-auto-best-practices "wikilink") - - [Development instances](#chap16.xhtml#leanpub-auto-development-instances "wikilink") - - [Version control](#chap16.xhtml#leanpub-auto-version-control "wikilink") - - [Backup](#chap16.xhtml#leanpub-auto-backup "wikilink") - - [Be upgrade safe](#chap16.xhtml#leanpub-auto-be-upgrade-safe "wikilink") - - [Use appropriate log levels](#chap16.xhtml#leanpub-auto-use-appropriate-log-levels "wikilink") - - [Long running logic hooks](#chap16.xhtml#leanpub-auto-long-running-logic-hooks "wikilink") - - [Minimise SQL](#chap16.xhtml#leanpub-auto-minimise-sql "wikilink") - - [SQL Use](#chap16.xhtml#leanpub-auto-sql-use "wikilink") - - [Entry check](#chap16.xhtml#leanpub-auto-entry-check "wikilink") - - [Redirect after post](#chap16.xhtml#leanpub-auto-redirect-after-post "wikilink") -- [18. Performance Tweaks](#chap17.xhtml#leanpub-auto-performance-tweaks "wikilink") - - [Server](#chap17.xhtml#leanpub-auto-server "wikilink") - - [Indexes](#chap17.xhtml#leanpub-auto-indexes "wikilink") - - [Config Changes](#chap17.xhtml#leanpub-auto-config-changes "wikilink") -- [19. Further Resources](#chap18.xhtml#leanpub-auto-further-resources "wikilink") - - [SuiteCRM Website](#chap18.xhtml#leanpub-auto-suitecrm-website "wikilink") - - [External SuiteCRM Resources](#chap18.xhtml#leanpub-auto-external-suitecrm-resources "wikilink") - - [SugarCRM Resources](#chap18.xhtml#leanpub-auto-sugarcrm-resources "wikilink") - - [Technical Links](#chap18.xhtml#leanpub-auto-technical-links "wikilink") - - [Other Links](#chap18.xhtml#leanpub-auto-other-links "wikilink") -- [20. Appendix A - Code Examples](#chap19.xhtml#appendix-a "wikilink") - - [Metadata](#chap19.xhtml#leanpub-auto-metadata "wikilink") - - [Module Installer](#chap19.xhtml#leanpub-auto-module-installer "wikilink") -- [21. Appendix B - API Methods](#chap20.xhtml#appendix-b "wikilink") - - [Methods](#chap20.xhtml#leanpub-auto-methods-1 "wikilink") - -
- - -
-1. Introduction ---------------------------------------------------- - -### What is SuiteCRM - -The story of [SuiteCRM](https://www.suitecrm.com) starts with SugarCRM. SugarCRM was founded in 2004 and consisted of an open source version (called Community Edition) and various paid for versions. However trouble started brewing when it appeared that SugarCRM would not be releasing a Community Edition of SugarCRM 7 and would be providing limited, if any, updates to the Community Edition. - -Enter SuiteCRM. SalesAgility forked Community Edition to create SuiteCRM and also added various open source plugins to add improved functionality. - -### This book - -This book is intended for developers who are familiar (or at least acquainted) with using SuiteCRM but want to perform their own customisations. SuiteCRM is a large and mature piece of software so it is impractical for a book to cover all aspects of the software. I’ve tried to add the most important parts which should allow you to make the changes you need in 99% of situations. There is a further resources chapter at the end of this book to help out in those 1% of cases. With that being said if you feel there is anything important I have left out (or worse, anything incorrect in the book) please let me know. I can be contacted at [JSMackin.co.uk](http://www.jsmackin.co.uk). - -### Reading this book - -Each chapter in this book is intended to be self contained so the reader can jump to interesting chapters. Where there is some overlap this is usually indicated with links to the relevant chapters. - -Some parts of this book may refer to file paths or other parts of code that can have a variable value, for example controller names contain the module name or a file with an arbitrary name. In this case these will be marked in the form ``, `` or something else suitable. In these cases you can substitute something appropriate (such as `Accounts` or `MyNewFile`). - -### Setting up SuiteCRM - -In this book we’ll be using SuiteCRM v7.1.5 which is the latest at time of writing. For up to date versions of the installation instructions see the SuiteCRM wiki at [suitecrm.com/wiki/index.php/Installation](https://suitecrm.com/wiki/index.php/Installation). - -#### Website - -The SuiteCRM installer can be found at [SuiteCRM.com](https://suitecrm.com/). I would recommend SuiteCRM MAX as I prefer to start with a full interface and customise it as needed. - -#### GitHub - -SuiteCRM is also available on [GitHub](http://github.com) at [github.com/salesagility/SuiteCRM](https://github.com/salesagility/SuiteCRM). Each SuiteCRM version is tagged so you can easily grab the version you need. - -### Initial Tweaks - -After the initial install there are a few tweaks you may want to make on an instance you are developing on. These changes should improve your development flow and productivity as well as help identify issues if they occur. - -#### Developer Mode - -SuiteCRM will cache various files that it processes, such as Smarty templates. Developer mode will turn off some of the caching so that changes to files will be seen immediately (though this isn’t always the case - as is the case with [extensions](#chap13.xhtml#extensions-chapter "wikilink")). This can be enabled either through the config file or via the General settings page inside admin. - -#### Log Level - -The default log level of SuiteCRM is `fatal`. This is a good default for production instances but you may want to increase the log level to `info` or `debug`. This will make the log output more verbose so, should anything go wrong, you’ll have something to refer to. See the [chapter on logging](#chap10.xhtml#logging-chapter "wikilink") for more information. - -#### Display errors - -You’ll also want to turn off display errors. Unfortunately at the moment SuiteCRM has various notices and warnings out of the box. With `display_errors` on this can sometimes cause AJAX pages and the link to break. - -With this being said you should be checking the PHP error logs or selectively enabling -`display_errors` to ensure that the code you are creating is not creating additional notices, warnings or errors. - -#### XDebug - -[XDebug](http://xdebug.org) is a PHP extension which provides profiling and debugging capabilities to PHP. This can massively improve developer productivity by simplifying development and, particularly, tracking down any issues. See the XDebug site for information on XDebug. - -
- - -
-2. SuiteCRM Directory Structure -------------------------------------------------------------------- - -`cache` -Contains cache files used by SuiteCRM including compiled smarty templates, grouped vardefs, minified and grouped JavaScript. Some modules and custom modules may also store (temporary) module specific info here. - -`custom` -Contains user and developer customisations to SuiteCRM. Also contains some SuiteCRM code to maintain compatibility with SugarCRM. However this is likely to change in the future. - -`data` -Stores the classes and files used to deal with SugarBeans and their relationships. - -`examples` -Contains a few basic examples of lead capture and API usage. However these are very outdated. - -`include` -Contains the bulk of non module and non data SuiteCRM code. - -`install` -Code used by the SuiteCRM installer. - -`jssource` -The `jssource` folder contains the unminified source of some of the JavaScript files used within SuiteCRM. - -`metadata` -Stores relationship metadata for the various stock SuiteCRM modules. This should not be confused with module metadata which contains information on view, dashlet and search definitions. - -`mobile` -Stores code for the [QuickCRM](http://www.quickcrm.fr) mobile app. - -`ModuleInstall` -Code for the module installer. - -`modules` -Contains the code for any stock or custom SuiteCRM modules. - -`service` -Code for the SuiteCRM Soap and REST APIs. - -`themes` -Code, data and images for the bundled SuiteCRM theme. - -`upload` -The `upload` folder contains documents that have been uploaded to SuiteCRM. The names of the files comes from the ID of the matching Document Revision/Note. `upload`/`upgrades` will also contain various upgrade files and the packages of installed modules. - -`log4php`, `soap`, `XTemplate`, `Zend` -Source code for various libraries used by SuiteCRM some of which are deprecated. - -
- - -
-3. Working with Beans ---------------------------------------------------------- - -Beans are the Model in SuiteCRM’s MVC (Model View Controller) architecture. They allow retrieving data from the database as objects and allow persisting and editing records. This section will go over the various ways of working with beans. - -### BeanFactory - -The BeanFactory allows dynamically loading bean instances or creating new records. For example to create a new bean you can use: - -
-Example 3.1: Creating a new Bean using the BeanFactory - ------------------------------------------------------------------------- - -
- 1 $bean = BeanFactory::newBean('<TheModule>'); - 2 //For example a new account bean: - 3 $accountBean = BeanFactory::newBean('Accounts'); - -
- ------------------------------------------------------------------------- - -
-Retrieving an existing bean can be achieved in a similar manner: - -
-Example 3.2: Retrieving a bean with the BeanFactory - ------------------------------------------------------------------------- - -
- 1 $bean = BeanFactory::getBean('<TheModule>', $beanId); - 2 //For example to retrieve an account id - 3 $bean = BeanFactory::getBean('Accounts', $beanId); - -
- ------------------------------------------------------------------------- - -
-`getBean` will return an unpopulated bean object if `$beanId` is not supplied or if there’s no such record. Retrieving an unpopulated bean can be useful if you wish to use the static methods of the bean (for example see the Searching for Beans section). To deliberately retrieve an unpopulated bean you can omit the second argument of the `getBean` call. I.e. - -
-Example 3.3: Retrieving an unpopulated bean - ------------------------------------------------------------------------- - -
- 1 $bean = BeanFactory::getBean('<TheModule>'); - -
- ------------------------------------------------------------------------- - -
- ---- - - - - - - -
-warning -

warning

-

BeanFactory::getBean caches ten results. This can cause odd behaviour if you call getBean again and get a cached copy. Any calls that return a cached copy will return the same instance. This means changes to one of the beans will be reflected in all the results.

- -Using BeanFactory ensures that the bean is correctly set up and the necessary files are included etc. - -### SugarBean - -The SugarBean is the parent bean class and all beans in SuiteCRM extend this class. It provides various ways of retrieving and interacting with records. - -### Searching for beans - -The following examples show how to search for beans using a bean class. The examples provided assume that an account bean is available names $accountBean. This may have been retrieved using the getBean call mentioned in the BeanFactory section e.g. - -
-Example 3.4: Retrieving an unpopulated account bean - ------------------------------------------------------------------------- - -
- $accountBean = BeanFactory::getBean('Accounts'); - -
- ------------------------------------------------------------------------- - -
-#### get\_list - -The get\_list method allows getting a list of matching beans and allows paginating the results. - -
-Example 3.5: get\_list method signature - ------------------------------------------------------------------------- - -
- 1 get_list( - 2 $order_by = "", - 3 $where = "", - 4 $row_offset = 0, - 5 $limit=-1, - 6 $max=-1, - 7 $show_deleted = 0) - -
- ------------------------------------------------------------------------- - -
-$order\_by -Controls the ordering of the returned list. `$order_by` is specified as a string that will be used in the SQL ORDER BY clause e.g. to sort by name you can simply pass `name`, to sort by date\_entered descending use `date_entered DESC`. You can also sort by multiple fields. For example sorting by date\_modified and id descending `date_modified, id DESC`. - -$where -Allows filtering the results using an SQL WHERE clause. `$where` should be a string containing the SQL conditions. For example in the contacts module searching for contacts with specific first names we might use `contacts.first_name='Jim'`. Note that we specify the table, the query may end up joining onto other tables so we want to ensure that there is no ambiguity in which field we target. - -$row\_offset -The row to start from. Can be used to paginate the results. - -$limit -The maximum number of records to be returned by the query. -1 means no limit. - -$max -The maximum number of entries to be returned per page. -1 means the default max (usually 20). - -$show\_deleted -Whether to include deleted results. - -##### Results - -get\_list will return an array. This will contain the paging information and will also contain the list of beans. This array will contain the following keys: - -list -An array of the beans returned by the list query - -row\_count -The total number of rows in the result - -next\_offset -The offset to be used for the next page or -1 if there are no further pages. - -previous\_offset -The offset to be used for the previous page or -1 if this is the first page. - -current\_offset -The offset used for the current results. - -##### Example - -Let’s look at a concrete example. We will return the third page of all accounts with the industry `Media` using 10 as a page size and ordered by name. - -
-Example 3.6: Example get\_list call - ------------------------------------------------------------------------- - -
- 1 $beanList = $accountBean->get_list( - 2 //Order by the accounts name - 3 'name', - 4 //Only accounts with industry 'Media' - 5 "accounts.industry = 'Media'", - 6 //Start with the 30th record (third page) - 7 30, - 8 //No limit - will default to max page size - 9 -1, - 10 //10 items per page - 11 10); - -
- ------------------------------------------------------------------------- - -
-This will return: - -
-Example 3.7: Example get\_list results - ------------------------------------------------------------------------- - -
- 1 Array - 2 ( - 3 //Snipped for brevity - the list of Account SugarBeans - 4 [list] => Array() - 5 //The total number of results - 6 [row_count] => 36 - 7 //This is the last page so the next offset is -1 - 8 [next_offset] => -1 - 9 //Previous page offset - 10 [previous_offset] => 20 - 11 //The offset used for these results - 12 [current_offset] => 30 - 13 ) - -
- ------------------------------------------------------------------------- - -
-#### get\_full\_list - -`get_list` is useful when you need paginated results. However if you are just interested in getting a list of all matching beans you can use `get_full_list`. The `get_full_list` method signature looks like this: - -
-Example 3.8: get\_full\_list method signature - ------------------------------------------------------------------------- - -
- 1 get_full_list( - 2 $order_by = "", - 3 $where = "", - 4 $check_dates=false, - 5 $show_deleted = 0 - -
- ------------------------------------------------------------------------- - -
-These arguments are identical to their usage in `get_list` the only difference is the `$check_dates` argument. This is used to indicate whether the date fields should be converted to their display values (i.e. converted to the users date format). - -##### Results - -The get\_full\_list call simply returns an array of the matching beans - -##### Example - -Let’s rework our `get_list` example to get the full list of matching accounts: - -
-Example 3.9: Example get\_full\_list call - ------------------------------------------------------------------------- - -
- 1 $beanList = $accountBean->get_full_list( - 2 //Order by the accounts name - 3 'name', - 4 //Only accounts with industry 'Media' - 5 "accounts.industry = 'Media'" - 6 ); - -
- ------------------------------------------------------------------------- - -
-#### retrieve\_by\_string\_fields - -Sometimes you only want to retrieve one row but may not have the id of the record. `retrieve_by_string_fields` allows retrieving a single record based on matching string fields. - -
-Example 3.10: retrieve\_by\_string\_fields method signature - ------------------------------------------------------------------------- - -
- 1 retrieve_by_string_fields( - 2 $fields_array, - 3 $encode=true, - 4 $deleted=true) - -
- ------------------------------------------------------------------------- - -
-$fields\_array -An array of field names to the desired value. - -$encode -Whether or not the results should be HTML encoded. - -$deleted -Whether or not to add the deleted filter. - - ---- - - - - - - -
-warning -

warning

-

Note here that, confusingly, the deleted flag works differently to the other methods we have looked at. It flags whether or not we should filter out deleted results. So if true is passed then the deleted results will not be included.

- -##### Results - -retrieve\_by\_string\_fields returns a single bean as it’s result or null if there was no matching bean. - -##### Example - -For example to retrieve the account with name `Tortoise Corp` and account\_type `Customer` we could use the following: - -
-Example 3.11: Example retrieve\_by\_string\_fields call - ------------------------------------------------------------------------- - -
- 1 $beanList = $accountBean->retrieve_by_string_fields( - 2 array( - 3 'name' => 'Tortoise Corp', - 4 'account_type' => 'Customer' - 5 ) - 6 ); - -
- ------------------------------------------------------------------------- - -
-### Accessing fields - -If you have used one of the above methods we now have a bean record. This bean represents the record that we have retrieved. We can access the fields of that record by simply accessing properties on the bean just like any other PHP object. Similarly we can use property access to set the values of beans. Some examples are as follows: - -
-Example 3.12: Accessing fields examples - ------------------------------------------------------------------------- - -
- 1 //Get the Name field on account bean - 2 $accountBean->name; - 3 - 4 //Get the Meeting start date - 5 $meetingBean->date_start; - 6 - 7 //Get a custom field on a case - 8 $caseBean->third_party_code_c; - 9 - 10 //Set the name of a case - 11 $caseBean->name = 'New Case name'; - 12 - 13 //Set the billing address post code of an account - 14 $accountBean->billing_address_postalcode = '12345'; - -
- ------------------------------------------------------------------------- - -
-When changes are made to a bean instance they are not immediately persisted. We can save the changes to the database with a call to the beans `save` method. Likewise a call to `save` on a brand new bean will add that record to the database: - -
-Example 3.13: Persisting bean changes - ------------------------------------------------------------------------- - -
- 1 //Get the Name field on account bean - 2 $accountBean->name = 'New account name'; - 3 //Set the billing address post code of an account - 4 $accountBean->billing_address_postalcode = '12345'; - 5 //Save both changes. - 6 $accountBean->save(); - 7 - 8 //Create a new case (see the BeanFactory section) - 9 $caseBean = BeanFactory::newBean('Cases'); - 10 //Give it a name and save - 11 $caseBean->name = 'New Case name'; - 12 $caseBean->save(); - -
- ------------------------------------------------------------------------- - -
- ---- - - - - - - -
-information -

information

-

Whether to save or update a bean is decided by checking the id field of the bean. If id is set then SuiteCRM will attempt to perform an update. If there is no id then one will be generated and a new record will be inserted into the database. If for some reason you have supplied an id but the record is new (perhaps in a custom import script) then you can set new_with_id to true on the bean to let SuiteCRM know that this record is new.

- -### Related beans - -We have seen how to save single records but, in a CRM system, relationships between records are as important as the records themselves. For example an account may have a list of cases associated with it, a contact will have an account that it falls under etc. We can get and set relationships between beans using several methods. - -#### get\_linked\_beans - -The `get_linked_beans` method allows retrieving a list of related beans for a given record. - -
-Example 3.14: get\_linked\_beans method signature - ------------------------------------------------------------------------- - -
- 1 get_linked_beans( - 2 $field_name, - 3 $bean_name, - 4 $sort_array = array(), - 5 $begin_index = 0, - 6 $end_index = -1, - 7 $deleted=0, - 8 $optional_where=""); - -
- ------------------------------------------------------------------------- - -
-$field\_name -The link field name for this link. Note that this is not the same as the name of the relationship. If you are unsure of what this should be you can take a look into the cached vardefs of a module in `cache/modules//Vardefs.php` for the link definition. - -$bean\_name -The name of the bean that we wish to retrieve. - -$sort\_array -This is a legacy parameter and is unused. - -$begin\_index -Skips the initial `$begin_index` results. Can be used to paginate. - -$end\_index -Return up to the `$end_index` result. Can be used to paginate. - -$deleted -Controls whether deleted or non deleted records are shown. If true only deleted records will be returned. If false only non deleted records will be returned. - -$optional\_where -Allows filtering the results using an SQL WHERE clause. See the `get_list` method for more details. - -##### Results - -`get_linked_beans` returns an array of the linked beans. - -##### Example - -
-Example 3.15: Example get\_linked\_beans call - ------------------------------------------------------------------------- - -
- 1 $accountBean->get_linked_beans( - 2 'contacts', - 3 'Contacts', - 4 array(), - 5 0, - 6 10, - 7 0, - 8 "contacts.primary_address_country = 'USA'"); - -
- ------------------------------------------------------------------------- - -
-#### relationships - -In addition to the `get_linked_beans` call you can also load and access the relationships more directly. - -##### Loading - -Before accessing a relationship you must use the `load_relationship` call to ensure it is available. This call takes the link name of the relationship (not the name of the relationship). As mentioned previously you can find the name of the link in `cache/modules//Vardefs.php` if you’re not sure. - -
-Example 3.16: Loading a relationship - ------------------------------------------------------------------------- - -
- 1 //Load the relationship - 2 $accountBean->load_relationship('contacts'); - 3 //Can now call methods on the relationship object: - 4 $contactIds = $accountBean->contacts->get(); - -
- ------------------------------------------------------------------------- - -
-##### Methods - -###### `get` - -Returns the ids of the related records in this relationship e.g for the account - contacts relationship in the example above it will return the list of ids for contacts associated with the account. - -###### `getBeans` - -Similar to `get` but returns an array of beans instead of just ids. - - ---- - - - - - - -
-warning -

warning

-

getBeans will load the full bean for each related record. This may cause poor performance for relationships with a large number of beans.

- -###### `add` - -Allows relating records to the current bean. `add` takes a single id or bean or an array of ids or beans. If the bean is available this should be used since it prevents reloading the bean. For example to add a contact to the relationship in our example we can do the following: - -
-Example 3.18: Adding a new contact to a relationship - ------------------------------------------------------------------------- - -
- 1 //Load the relationship - 2 $accountBean->load_relationship('contacts'); - 3 - 4 //Create a new demo contact - 5 $contactBean = BeanFactory::newBean(); - 6 $contactBean->first_name = 'Jim'; - 7 $contactBean->last_name = 'Mackin'; - 8 $contactBean->save(); - 9 - 10 //Link the bean to $accountBean - 11 $accountBean->contacts->add($contactBean); - -
- ------------------------------------------------------------------------- - -
-###### `delete` - -`delete` allows unrelating beans. Counter-intuitively it accepts the ids of both the bean and the related bean. For the related bean you should pass the bean if it is available e.g when unrelating an account and contact: - -
-Example 3.19: Removing a new contact from a relationship - ------------------------------------------------------------------------- - -
- 1 //Load the relationship - 2 $accountBean->load_relationship('contacts'); - 3 - 4 //Unlink the contact from the account - assumes $contactBean is a Contact SugarB\ - 5 ean - 6 $accountBean->contacts->delete($accountBean->id, $contactBean); - -
- ------------------------------------------------------------------------- - -
- ---- - - - - - - -
-warning -

warning

-

Be careful with the delete method. Omitting the second argument will cause all relationships for this link to be removed.

- -
- - -
-4. Vardefs ----------------------------------------------- - -### What are Vardefs - -The Vardefs are used to supply information to SuiteCRM about a particular bean. These generally specify the fields, relationships and indexes in a given module as well as additional information such as whether it is audited, the table name etc. - -### Defining Vardefs - -#### Module - -Vardefs are initially defined in their respective modules folder. For the Accounts module this will be in modules/Accounts/vardefs.php. The information is stored in an array named $dictionary using the module name as the key. For Accounts this will be `$dictionary['Account']`. Let’s look at the Account vardefs (which have been edited for brevity): - -
-Example 4.1: Account Vardefs - ------------------------------------------------------------------------- - -
- 1 $dictionary['Account'] = - 2 array( - 3 'table' => 'accounts', - 4 'audited'=>true, - 5 'unified_search' => true, - 6 'unified_search_default_enabled' => true, - 7 'duplicate_merge'=>true, - 8 'comment' => 'Accounts are organizations or entities that ...', - 9 'fields' => array ( - 10 //Snipped for brevity. See the fields section. - 11 ), - 12 'indices' => array ( - 13 //Snipped for brevity. See the indices section. - 14 ), - 15 'relationships' => array ( - 16 //Snipped for brevity. See the relationship section. - 17 ), - 18 //This enables optimistic locking for Saves From EditView - 19 'optimistic_locking'=>true, - 20 ); - 21 - 22 VardefManager::createVardef( - 23 'Accounts', - 24 'Account', - 25 array('default', 'assignable','company',) - 26 ); - -
- ------------------------------------------------------------------------- - -
-##### Keys - -The following are some of the keys that can be specified for the vardefs. Fields, indices and relationships are covered in their own sections. - -`table` -The database table name for this module. - -`audited` -Whether or not this module should be audited. Note that `audited` must also be set at the fields level for a field to be audited. - -`unified_search` -Whether this module can be searchable via the global search. - -`unified_search_default_enabled` -Whether this module is searchable via the global search by default. - -`duplicate_merge` -Whether or not duplicate merging functionality is enabled for this module. - -`comment` -A description of this module. - -`optimistic_locking` -Whether optimistic should be enabled for this module. Optimistic locking locks concurrent edits on a record by assuming that there will be no conflict. On save the last modified timestamp on the record will be checked. If it is different then an edit has occurred since this record was loaded. If this is the case then the user will be prompted with a page showing the differences in the two edits and asked to choose which edits are to be used. - -##### Fields - -The field defines the behaviour and attributes of each field in the module. - -`name` -The name of the field. - -`vname` -The name of the language label to be used for this field. - -`type` -The type of the field. See the field types section. - -`isnull` -Whether null values are allowed - -`len` -If the field is a string type, the max number of characters allowed. - -`options` -For enum fields the language label for the dropdown values for this field - -`dbtype` -The type to be used by the database to store this field. This is not required as the appropriate type is usually chosen. - -`default` -The default value of this field. - -`massupdate` -Whether or not this field should be mass updatable. Note that some field types are always restricted from mass updates. - -`rname` -For related fields only. The name of the field to be taken from the related module. - -`id_name` -For related fields only. The field in this bean which contains the related id. - -`source` -The source of this field. Can be set to ‘non-db’ if the field is not stored in the database - for example for link fields, fields populated by logic hooks or by other means. - -`sort_on` -For concatenated fields (i.e. name fields) the field which should be used to sort. - -`fields` -For concatenated fields (i.e. name fields) an array of the fields which should be concatenated. - -`db_concat_fields` -For concatenated fields (i.e. name fields) an array of the fields which should be concatenated in the database. Usually this is the same as fields. - -`unified_search` -True if this field should be searchable via the global search. - -`enable_range_search` -Whether the list view search should allow a range search of this field. This is used for date and numeric fields. - -`studio` -Whether the field should display in studio. - -`audited` -Whether or not changes to this field should be audited. - -##### Field types - -The following are common field types used: - -`id` -An id field. - -`name` -A name field. This is usually a concatenation of other fields. - -`bool` -A boolean field. - -`varchar` -A variable length string field. - -`char` -A character field. - -`text` -A text area field. - -`decimal` -A decimal field. - -`date` -A date field. - -`datetime` -A date and time field. - -`enum` -A dropdown field. - -`phone` -A phone number field. - -`link` -A link to another module via a relationship. - -`relate` -A related bean field. - -##### Indices - -The indices array allows defining any database indexes that should be in place on the database table for this module. Let’s look at an example: - -
-Example 4.2: Example indices definition - ------------------------------------------------------------------------- - -
- 1 'indices' => array ( - 2 array( - 3 'name' =>'idx_mymod_id_del', - 4 'type' =>'index', - 5 'fields'=>array('id', 'deleted')), - 6 array( - 7 'name' =>'idx_mymod_parent_id', - 8 'type' =>'index', - 9 'fields'=>array( 'parent_id')), - 10 array( - 11 'name' =>'idx_mymod_parent_id', - 12 'type' =>'unique', - 13 'fields'=>array( 'third_party_id')), - 14 ), - -
- ------------------------------------------------------------------------- - -
-Each array entry should have, at least, the following entries: - -name -The name of the index. This is usually used by the database to reference the index. Most databases require that these are unique. - -type -The type of the index to create. `index` will simply add an index on the fields, `unique` will add a unique constraint on the fields, `primary` will add the fields as a primary key. - -fields -An array of the fields to be indexed. The order of this array will be used as the order of the fields in the index. - -##### Relationships - -The Vardefs also specify the relationships within this module. Here’s an edited example from the Accounts module: - -
-Example 4.3: Example relationships definition - ------------------------------------------------------------------------- - -
- 1 'relationships' => array ( - 2 'account_cases' => array( - 3 'lhs_module'=> 'Accounts', - 4 'lhs_table'=> 'accounts', - 5 'lhs_key' => 'id', - 6 'rhs_module'=> 'Cases', - 7 'rhs_table'=> 'cases', - 8 'rhs_key' => 'account_id', - 9 'relationship_type' => 'one-to-many'), - 10 ), - -
- ------------------------------------------------------------------------- - -
-Here we see the link between accounts and cases. This is specified with the following keys: - -`lhs_module` -The module on the left hand side of this relationship. For a one to many relationship this will be the “One” side. - -`lhs_table` -The table for the left hand side module. If you are unsure the table for a module can be found in it’s vardefs. - -`lhs_key` -The field to use for the left hand side of this link. In this case it is the `id` of the account. - -`rhs_module` -The right hand side module. In this case the “many” side of the relationship. - -`rhs_table` -The table for the right hand side module. As stated previously you can find the table for a module can be found in it’s vardefs. - -`rhs_key` -The field to use on the right hand side. In this case the `account_id` field on cases. - -`relationship_type` -The type of relationship - “one-to-many” or “many-to-many”. Since this is a one to many relationship it means a case is related to a single account but a single account can have multiple cases. - -For many to many relationship fields the following keys are also available: - -`join_table` -The name of the join table for this relationship. - -`join_key_lhs` -The name of the field on the join table for the left hand side. - -`join_key_rhs` -The name of the field on the join table for the right hand side. - -#### Vardef templates - -Vardef templates provide a shortcut for defining common vardefs. This is done by calling `VardefManager::createVardef` and passing the module name, object name and an array of templates to be assigned. The following is an example from the accounts vardefs: - -
-Example 4.4: Example vardef template - ------------------------------------------------------------------------- - -
- 22 VardefManager::createVardef( - 23 'Accounts', - 24 'Account', - 25 array('default', 'assignable','company',) - 26 ); - -
- ------------------------------------------------------------------------- - -
-In this example the `default`, `assignable` and `company` templates are used. The following are some of the available templates: - -`basic` - - -`default` - - -Adds the common base fields such as `id`, `name`, `date_entered`, etc. - -`assignable` -Adds the fields and relationships necessary to assign a record to a user. - -`person` -Adds fields common to people records such as `first_name`, `last_name`, address, etc. - -`company` -Adds fields common to companies such as an industry dropdown, address, etc. - -#### Customising vardefs - -Vardefs can be customised by adding a file into - -
-Example 4.5: Custom vardef location - ------------------------------------------------------------------------- - -
- custom/Extension/modules/<TheModule>/Ext/SomeFile.php - -
- ------------------------------------------------------------------------- - -
-This file can then be used to add a new field definition or customise an existing one e.g changing a field type: - -
-Example 4.6: Example overriding an existing vardef - ------------------------------------------------------------------------- - -
- $dictionary["TheModule"]["fields"]["some_field"]['type'] = 'int'; - -
- ------------------------------------------------------------------------- - -
-
- - -
-5. Views --------------------------------------------- - -SuiteCRM follows the MVC (Model-View-Controller) pattern and as such has the concept of views. Views are responsible for gathering and displaying data . There are a number of default views in SuiteCRM. These include - -ListView -Displays a list of records and provides links to the EditViews and DetailViews of those records. The ListView also allows some operations such as deleting and mass updating records. This is (usually) the default view for a module. - -DetailView -Displays the details of a single record and also displays subpanels of related records. - -EditView -The EditView allows editing the various fields of a record and provides validation on these values. - -### Location - -Views can be found in `modules//views/` or, for custom views, -`custom/modules//views/`, and are named in the following format: `view..php`. For example, the Accounts DetailView can be found in `modules/Accounts/views/view.detail.php` with a customised version in `custom/modules/Accounts/views/view.detail.php`. The custom version is used if it exists. If it doesn’t then the module version is used. Finally, if neither of these exist then the SuiteCRM default is used in `include/MVC/View/views/`. - -### Customising - -In order to customise a View we first need to create the appropriate view file. This will vary depending on the module we wish to target. - -#### Custom module - -In this case we can place the file directly into our module. Create a new file (if it doesn’t exist) at `modules//views/view..php`. The contents will look similar to: - -
-Example 5.1: View for a custom module - ------------------------------------------------------------------------- - -
- 1 <?php - 2 - 3 require_once 'include/MVC/View/views/view.<viewname>.php'; - 4 - 5 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); - 6 class <TheModule>View<ViewName> extends View<ViewName> - 7 { - 8 - 9 } - -
- ------------------------------------------------------------------------- - -
-A more concrete example would be for the detail view for a custom module called ABC\_Vehicles: - -
-Example 5.2: Detail view for a custom module, ABC\_Vehicles - ------------------------------------------------------------------------- - -
- 1 <?php - 2 - 3 require_once 'include/MVC/View/views/view.detail.php'; - 4 - 5 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); - 6 class ABC_VehiclesViewDetail extends ViewDetail - 7 { - 8 - 9 } - -
- ------------------------------------------------------------------------- - -
-#### Preexisting modules - -For preexisting modules you will want to add the view to -`custom/modules//views/view..php`. - -The contents of this file will vary depending on whether you wish to extend the existing view (if it exists) or create your own version completely. It is usually best to extend the existing view, since this will retain important logic. Note the naming convention here. We name the class -`CustomView` (for example `CustomAccountsViewDetail`). - -Here we don’t extend the existing view or no such view exists: - -
-Example 5.3: Custom view for an existing module - ------------------------------------------------------------------------- - -
- 1 <?php - 2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); - 3 - 4 require_once 'include/MVC/View/views/view.<viewname>.php'; - 5 - 6 class Custom<TheModule>View<ViewName> extends ViewDetail - 7 { - 8 - 9 } - -
- ------------------------------------------------------------------------- - -
-Otherwise we extend the existing view. Note that we are requiring the existing view: - -
-Example 5.4: Overriding a view for an existing module - ------------------------------------------------------------------------- - -
- 1 <?php - 2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); - 3 - 4 require_once 'modules/<TheModule>/views/view.<viewname>.php'; - 5 - 6 class Custom<TheModule>View<ViewName> extends <TheModule>View<ViewName> - 7 { - 8 - 9 } - -
- ------------------------------------------------------------------------- - -
-For example, overriding the List View of Accounts: - -
-Example 5.5: Overriding the Accounts List View - ------------------------------------------------------------------------- - -
- 1 <?php - 2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); - 3 - 4 require_once 'modules/Accounts/views/view.list.php'; - 5 - 6 class CustomAccountsViewList extends AccountsViewList - 7 { - 8 - 9 } - -
- ------------------------------------------------------------------------- - -
-#### Making changes - -Now that we have a custom view what can we actually do? The views have various methods which we can now override to change/add behaviour. The most common ones to override are: - -preDisplay -Explicitly intended to allow logic to be called before display() is called. This can be used to alter arguments to the list view or to output anything to appear before the main display code (such as, for example, adding JavaScript). - -display -Does the actual work of displaying the view. Can be overridden to alter this behaviour or to output anything after the main display. You usually want to call parent::display(); to ensure that the display code is run (unless, of course, you are adding your own display logic). - -
- - -
-6. Metadata ------------------------------------------------ - -### Intro - -Module metadata are used to describe how various views behave in the module. The main use of this is providing field and layout information but this can also be used to filter subpanels and to describe what fields are used in the search. - -### Location - -Module metadata can be found in: - -
-Example 6.1: Module metadata location - ------------------------------------------------------------------------- - -
- modules/<TheModule>/metadata/ - -
- ------------------------------------------------------------------------- - -
-### Customising - -Usually studio is the best way of customising metadata. Even when you do wish to make customisations that are not possible through studio it can be simpler to set everything up in studio first. This is particularly true for layout based metadata. However if you are customising metadata it is as simple as placing, or editing, the file in the custom directory. For example to override the Accounts detailviewdefs (found in `modules/Accounts/metadata/detailviewdefs.php`) we would place (or edit) the file in `custom/modules/Accounts/metadata/detailviewdefs.php`. One exception to this rule is the studio.php file. The modules metadata folder is the only location checked - any version in `custom//metadata/studio.php` is ignored. - -### Different metadata - -#### detailviewdefs.php - -detailviewdefs.php provides information on the layout and fields of the detail view for this module. This file uses the same structure as editviewdefs.php. Let’s look at an example for a fictional module `ABC_Vehicles`: - -
-Example 6.2: DetailView metadata definition - ------------------------------------------------------------------------- - -
- 1 <?php - 2 $viewdefs ['ABC_Vehicles'] ['DetailView'] = array ( - 3 'templateMeta' => array ( - 4 'form' => array ( - 5 'buttons' => array ( - 6 'EDIT', - 7 'DUPLICATE', - 8 'DELETE', - 9 'FIND_DUPLICATES' - 10 ) - 11 ), - 12 'maxColumns' => '2', - 13 'widths' => array ( - 14 array ( - 15 'label' => '10', - 16 'field' => '30' - 17 ), - 18 array ( - 19 'label' => '10', - 20 'field' => '30' - 21 ) - 22 ), - 23 'includes' => array ( - 24 array ( - 25 'file' => 'modules/ABC_Vehicles/ABC_VehiclesDetail.js' - 26 ) - 27 ) - 28 ), - 29 'panels' => array ( - 30 'LBL_ABC_VEHICLES_INFO' => array ( - 31 array ( - 32 array ( - 33 'name' => 'name', - 34 'comment' => 'The Name of the Vehicle', - 35 'label' => 'LBL_NAME', - 36 ), - 37 'reg_number' - 38 ), - 39 array ( - 40 array ( - 41 'name' => 'type', - 42 'label' => 'LBL_TYPE', - 43 ), - 44 array ( - 45 'name' => 'phone_fax', - 46 'comment' => 'The fax phone number of this company', - 47 'label' => 'LBL_FAX' - 48 ) - 49 ), - 50 array ( - 51 array ( - 52 'name' => 'registered_address_street', - 53 'label' => 'LBL_REGISTERED_ADDRESS', - 54 'type' => 'address', - 55 'displayParams' => array ( - 56 'key' => 'registered' - 57 ) - 58 ), - 59 ), - 60 ), - 61 'LBL_PANEL_ADVANCED' => array ( - 62 array ( - 63 array ( - 64 'name' => 'assigned_user_name', - 65 'label' => 'LBL_ASSIGNED_TO' - 66 ), - 67 array ( - 68 'name' => 'date_modified', - 69 'label' => 'LBL_DATE_MODIFIED', - 70 'customCode' => '{$fields.date_modified.value} ' - 71 + '{$APP.LBL_BY} ' - 72 + '{$fields.modified_by_name.value}', - 73 ) - 74 ), - 75 ), - 76 ) - 77 ); - 78 ?> - -
- ------------------------------------------------------------------------- - -
-We see that line 2 defines an array `$viewdefs['ABC_Vehicles']['DetailView']` which places a DetailView entry for the module ABC\_Vehicles into `$viewdefs` (DetailView will be EditView or QuickCreateView as appropriate). This array has two main keys defined here: - -##### templateMeta - -The templateMeta key provides information about the view in general. The `['form']['buttons']` entries define the buttons that should appear in this view. - -`maxColumns` -Defines the number of columns to use for this view. It is unusual for this to be more than 2. - -`widths` -An array defining the width of the label and field for each column. - -`includes` -An array of additional JavaScript files to include. This is useful for adding custom JavaScript behaviour to the page. - -##### panels - -The panels entry defines the actual layout of the Detail (or Edit) view. Each entry is a new panel in the view with the key being the label for that panel. We can see in our example that we have 2 panels. One uses the label defined by the language string `LBL_ABC_VEHICLES_INFO`, the other uses `LBL_PANEL_ADVANCED`. - -Each panel has an array entry for each row, with each array containing an entry for each column. For example we can see that the first row has the following definition: - -
-Example 6.3: DetailView metadata row definition - ------------------------------------------------------------------------- - -
- 31 array( - 32 array ( - 33 'name' => 'name', - 34 'comment' => 'The Name of the Vehicle', - 35 'label' => 'LBL_NAME', - 36 ), - 37 'reg_number', - 38 ), - -
- ------------------------------------------------------------------------- - -
-This has an array definition for the first row, first column and a string definition for the first row, second column. The string definition is very straightforward and simply displays the detail (or edit, as appropriate) view for that field. It will use the default label, type, etc. In our example we are displaying the field named `reg_number`. - -The array definition for the first row, first column is a little more complex. Each array definition must have a `name` value. In our example we are displaying the `name` field. However we also supply some other values. Values most commonly used are: - -`comment` -Used to note the purpose of the field. - -`label` -The language key for this label. If the language key is not recognised then this value will be used instead (see the [chapter on language](#chap08.xhtml#language-chapter "wikilink")). - -`displayParams` -An array used to pass extra arguments for the field display. For the options and how they are used you can have a look into the appropriate field type in `include/SugarFields/Fields` or `custom/include/SugarFields/Fields`. An example is setting the size of a textarea: - -
-Example 6.4: DetailView metadata displayParams - ------------------------------------------------------------------------- - -
- 1 'displayParams' => array( - 2 'rows' => 2, - 3 'cols' => 30, - 4 ), - -
- ------------------------------------------------------------------------- - -
-customCode -Allows supplying custom smarty code to be used for the display. The code here can include any valid smarty code and this will also have access to the current fields in this view via `$fields`. An example of outputing the ID field would be `{$fields.id.value}`. Additionally the module labels and app labels can be accessed via `$MOD` and `$APP` respectively. Finally you can use `@@FIELD@@` to output the value of the field that would have been used. For example `{if $someCondition}@@FIELD@@{/if}` will conditionally show the field. - -#### editviewdefs.php - -`editviewdefs.php` provides information on the layout and fields of the edit view for this module. This file uses the same structure as detailviewdefs.php. Please see the information on detailviewdefs.php. - -#### listviewdefs.php - -The `listviewdefs.php` file for a module defines what fields the list view for that module will display. Let’s take a look at an example: - -
-Example 6.5: ListView metadata definition - ------------------------------------------------------------------------- - -
- 1 $listViewDefs ['AOR_Reports'] = - 2 array ( - 3 'NAME' => - 4 array ( - 5 'width' => '15%', - 6 'label' => 'LBL_NAME', - 7 'default' => true, - 8 'link' => true, - 9 ), - 10 'REPORT_MODULE' => - 11 array ( - 12 'type' => 'enum', - 13 'default' => true, - 14 'studio' => 'visible', - 15 'label' => 'LBL_REPORT_MODULE', - 16 'width' => '15%', - 17 ), - 18 'ASSIGNED_USER_NAME' => - 19 array ( - 20 'width' => '15%', - 21 'label' => 'LBL_ASSIGNED_TO_NAME', - 22 'module' => 'Employees', - 23 'id' => 'ASSIGNED_USER_ID', - 24 'default' => true, - 25 ), - 26 'DATE_ENTERED' => - 27 array ( - 28 'type' => 'datetime', - 29 'label' => 'LBL_DATE_ENTERED', - 30 'width' => '15%', - 31 'default' => true, - 32 ), - 33 'DATE_MODIFIED' => - 34 array ( - 35 'type' => 'datetime', - 36 'label' => 'LBL_DATE_MODIFIED', - 37 'width' => '15%', - 38 'default' => true, - 39 ), - 40 ); - -
- ------------------------------------------------------------------------- - -
-To define the list view defs we simply add a key to the `$listViewDefs` array. In this case we add an entry for `AOR_Reports` This array contains an entry for each field that we wish to show in the list view and is keyed by the upper case name of the field. For example, the `REPORT_MODULE` key refers to the `report_module` field of AOR\_Reports. - -type -The type of the field. This can be used to override how a field is displayed. - -default -Whether this field should be shown in the list view by default. If false then the field will appear in the available columns list in studio. - -studio -Whether or not this field should be displayed in studio. This can be useful to ensure that a critical field is not removed. - -label -The label to be used for this field. If this is not supplied then the default label for that field will be used. - -width -The width of the field in the list view. Note that, although this is usually given as a percentage it is treated as a proportion. The example above has five columns with a width of `15%` but these will actually be `20%` since this is a ratio. - -#### popupdefs.php - -popupdefs.php provides information on the layout, fields and search options of the module popup that is usually used when selecting a related record. - -Let’s look at the default popupdefs.php for the Accounts module: - -
-Example 6.6: PopupView metadata definition - ------------------------------------------------------------------------- - -
- 1 $popupMeta = array( - 2 'moduleMain' => 'Case', - 3 'varName' => 'CASE', - 4 'className' => 'aCase', - 5 'orderBy' => 'name', - 6 'whereClauses' => - 7 array('name' => 'cases.name', - 8 'case_number' => 'cases.case_number', - 9 'account_name' => 'accounts.name'), - 10 'listviewdefs' => array( - 11 'CASE_NUMBER' => array( - 12 'width' => '5', - 13 'label' => 'LBL_LIST_NUMBER', - 14 'default' => true), - 15 'NAME' => array( - 16 'width' => '35', - 17 'label' => 'LBL_LIST_SUBJECT', - 18 'link' => true, - 19 'default' => true), - 20 'ACCOUNT_NAME' => array( - 21 'width' => '25', - 22 'label' => 'LBL_LIST_ACCOUNT_NAME', - 23 'module' => 'Accounts', - 24 'id' => 'ACCOUNT_ID', - 25 'link' => true, - 26 'default' => true, - 27 'ACLTag' => 'ACCOUNT', - 28 'related_fields' => array('account_id')), - 29 'PRIORITY' => array( - 30 'width' => '8', - 31 'label' => 'LBL_LIST_PRIORITY', - 32 'default' => true), - 33 'STATUS' => array( - 34 'width' => '8', - 35 'label' => 'LBL_LIST_STATUS', - 36 'default' => true), - 37 'ASSIGNED_USER_NAME' => array( - 38 'width' => '2', - 39 'label' => 'LBL_LIST_ASSIGNED_USER', - 40 'default' => true, - 41 ), - 42 ), - 43 'searchdefs' => array( - 44 'case_number', - 45 'name', - 46 array( - 47 'name' => 'account_name', - 48 'displayParams' => array( - 49 'hideButtons'=>'true', - 50 'size'=>30, - 51 'class'=>'sqsEnabled sqsNoAutofill' - 52 ) - 53 ), - 54 'priority', - 55 'status', - 56 array( - 57 'name' => 'assigned_user_id', - 58 'type' => 'enum', - 59 'label' => 'LBL_ASSIGNED_TO', - 60 'function' => array( - 61 'name' => 'get_user_array', - 62 'params' => array(false)) - 63 ), - 64 ) - 65 ); - -
- ------------------------------------------------------------------------- - -
-The popupdefs.php specifies a `$popupMeta` array with the following keys: - -`moduleMain` -The module that will be displayed by this popup. - -`varName` -The variable name used to store the search preferences etc. This will usually simply the upper case module name. - -`className` -The class name of the SugarBean for this module. If this is not supplied then `moduleMain` will be used. This is only really required for classes where the class name and module name differ (such as Cases). - -`orderBy` -The default field the list of records will be sorted by. - -`whereClauses` -Legacy option. This is only used as a fallback when there are no searchdefs. Defines the names of fields to allow searching for and their database representation. - -`listviewdefs` -The list of fields displayed in the popup list view. See `listviewdefs.php`. - -`searchdefs` -An array of the fields that should be available for searching in the popup. See the individual search defs in the searchdefs.php section (for example the `basic_search` array). - -#### quickcreatedefs.php - -`quickcreatedefs.php` provides information on the layout and fields of the quick create view for this module (this is the view that appears when creating a record from a subpanel). This file uses the same structure as `detailviewdefs.php`. Please see the information on `detailviewdefs.php`. - -#### searchdefs.php - -The search defs of a module define how searching in that module looks and behaves. - -Let’s look at an example. - -
-Example 6.7: Search View metadata definition - ------------------------------------------------------------------------- - -
- 1 $searchdefs ['Accounts'] = array ( - 2 'templateMeta' => array ( - 3 'maxColumns' => '3', - 4 'maxColumnsBasic' => '4', - 5 'widths' => array ( - 6 'label' => '10', - 7 'field' => '30' - 8 ) - 9 ), - 10 'layout' => array ( - 11 'basic_search' => array ( - 12 'name' => array ( - 13 'name' => 'name', - 14 'default' => true, - 15 'width' => '10%' - 16 ), - 17 'current_user_only' => array ( - 18 'name' => 'current_user_only', - 19 'label' => 'LBL_CURRENT_USER_FILTER', - 20 'type' => 'bool', - 21 'default' => true, - 22 'width' => '10%' - 23 ) - 24 ) - 25 , - 26 'advanced_search' => array ( - 27 'name' => array ( - 28 'name' => 'name', - 29 'default' => true, - 30 'width' => '10%' - 31 ), - 32 'website' => array ( - 33 'name' => 'website', - 34 'default' => true, - 35 'width' => '10%' - 36 ), - 37 'phone' => array ( - 38 'name' => 'phone', - 39 'label' => 'LBL_ANY_PHONE', - 40 'type' => 'name', - 41 'default' => true, - 42 'width' => '10%' - 43 ), - 44 'email' => array ( - 45 'name' => 'email', - 46 'label' => 'LBL_ANY_EMAIL', - 47 'type' => 'name', - 48 'default' => true, - 49 'width' => '10%' - 50 ), - 51 'address_street' => array ( - 52 'name' => 'address_street', - 53 'label' => 'LBL_ANY_ADDRESS', - 54 'type' => 'name', - 55 'default' => true, - 56 'width' => '10%' - 57 ), - 58 'address_city' => array ( - 59 'name' => 'address_city', - 60 'label' => 'LBL_CITY', - 61 'type' => 'name', - 62 'default' => true, - 63 'width' => '10%' - 64 ), - 65 'address_state' => array ( - 66 'name' => 'address_state', - 67 'label' => 'LBL_STATE', - 68 'type' => 'name', - 69 'default' => true, - 70 'width' => '10%' - 71 ), - 72 'address_postalcode' => array ( - 73 'name' => 'address_postalcode', - 74 'label' => 'LBL_POSTAL_CODE', - 75 'type' => 'name', - 76 'default' => true, - 77 'width' => '10%' - 78 ), - 79 'billing_address_country' => array ( - 80 'name' => 'billing_address_country', - 81 'label' => 'LBL_COUNTRY', - 82 'type' => 'name', - 83 'options' => 'countries_dom', - 84 'default' => true, - 85 'width' => '10%' - 86 ), - 87 'account_type' => array ( - 88 'name' => 'account_type', - 89 'default' => true, - 90 'width' => '10%' - 91 ), - 92 'industry' => array ( - 93 'name' => 'industry', - 94 'default' => true, - 95 'width' => '10%' - 96 ), - 97 'assigned_user_id' => array ( - 98 'name' => 'assigned_user_id', - 99 'type' => 'enum', - 100 'label' => 'LBL_ASSIGNED_TO', - 101 'function' => array ( - 102 'name' => 'get_user_array', - 103 'params' => array ( - 104 0 => false - 105 ) - 106 ), - 107 'default' => true, - 108 'width' => '10%' - 109 ) - 110 ) - 111 ) - 112 ); - -
- ------------------------------------------------------------------------- - -
-Here we setup a new array for `Accounts` in the `$searchdefs` array. This has two keys: - -##### templateMeta - -The `templateMeta` key controls the basic look of the search forms. Here we define some overall layout info such as the maximum columns (3) and the maximum number of columns for the basic search (4). Finally we set the widths for the search fields and their labels. - -##### layout - -The `layout` key contains the layout definitions for the basic search and advanced search. This is simply a list of array definition of the fields. See the section on listviewdefs.php for a description of some of the options. - -#### `subpaneldefs.php` - -The subpaneldefs.php file provides definitions for the subpanels that appear in the detail view of a module. Let’s look at an example: - -
-Example 6.8: Subpanel metadata definition - ------------------------------------------------------------------------- - -
- 1 $layout_defs['AOS_Quotes'] = array ( - 2 'subpanel_setup' => array ( - 3 'aos_quotes_aos_contracts' => array ( - 4 'order' => 100, - 5 'module' => 'AOS_Contracts', - 6 'subpanel_name' => 'default', - 7 'sort_order' => 'asc', - 8 'sort_by' => 'id', - 9 'title_key' => 'AOS_Contracts', - 10 'get_subpanel_data' => 'aos_quotes_aos_contracts', - 11 'top_buttons' => array ( - 12 0 => array ( - 13 'widget_class' => 'SubPanelTopCreateButton' - 14 ), - 15 1 => array ( - 16 'widget_class' => 'SubPanelTopSelectButton', - 17 'popup_module' => 'AOS_Contracts', - 18 'mode' => 'MultiSelect' - 19 ) - 20 ) - 21 ), - 22 'aos_quotes_aos_invoices' => array ( - 23 'order' => 100, - 24 'module' => 'AOS_Invoices', - 25 'subpanel_name' => 'default', - 26 'sort_order' => 'asc', - 27 'sort_by' => 'id', - 28 'title_key' => 'AOS_Invoices', - 29 'get_subpanel_data' => 'aos_quotes_aos_invoices', - 30 'top_buttons' => array ( - 31 0 => array ( - 32 'widget_class' => 'SubPanelTopCreateButton' - 33 ), - 34 1 => array ( - 35 'widget_class' => 'SubPanelTopSelectButton', - 36 'popup_module' => 'AOS_Invoices', - 37 'mode' => 'MultiSelect' - 38 ) - 39 ) - 40 ), - 41 'aos_quotes_project' => array ( - 42 'order' => 100, - 43 'module' => 'Project', - 44 'subpanel_name' => 'default', - 45 'sort_order' => 'asc', - 46 'sort_by' => 'id', - 47 'title_key' => 'Project', - 48 'get_subpanel_data' => 'aos_quotes_project', - 49 'top_buttons' => array ( - 50 0 => array ( - 51 'widget_class' => 'SubPanelTopCreateButton' - 52 ), - 53 1 => array ( - 54 'widget_class' => 'SubPanelTopSelectButton', - 55 'popup_module' => 'Accounts', - 56 'mode' => 'MultiSelect' - 57 ) - 58 ) - 59 ) - 60 ) - 61 ); - -
- ------------------------------------------------------------------------- - -
-In the example above we set up a definition for a module (in this case `AOS_Quotes`) in the `$layout_defs` array. This has a single key `subpanel_setup` which is an array of each of the subpanel definitions keyed by a name. This name should be something recognisable. In the case above it is the name of the link field displayed by the subpanel. The entry for each subpanel usually has the following defined: - -order -A number used for sorting the subpanels. The values themselves are arbitrary and are only used relative to other subpanels. - -module -The module which will be displayed by this subpanel. For example the `aos_quotes_project` def in the example above will display a list of `Project` records. - -subpanel\_name -The subpanel from the displayed module which will be used. See the subpanels section of this chapter. - -sort\_by -The field to sort the records on. - -sort\_order -The order in which to sort the `sort_by` field. `asc` for ascending `desc` for descending. - -title\_key -The language key to be used for the label of this subpanel. - -get\_subpanel\_data -Used to specify where to retrieve the subpanel records. Usually this is just a link name for the current module. In this case the related records will be displayed in the subpanel. However, for more complex links, it is possible to specify a function to call. When specifying a function you should ensure that the `get_subpanel_data` entry is in the form `function:theFunctionName`. Additionally you can specify the location of the function and any additional parameters that are needed by using the `function_parameters` key. An example of a subpanel which uses a function can be found in [Appendix A](#chap19.xhtml#appendix-a "wikilink"). - -function\_parameters -Specifies the parameters for a subpanel which gets it’s information from a function (see - -`get_subpanel_data`). This is an array which allows specifying where the function is by using the `import_function_file` key (if this is absent but `get_subpanel_data` defines a function then the function will be called on the bean for the parent of the subpanel). Additionally this array will be passed as an argument to the function defined in `get_subpanel_data` which allows passing in arguments to the function. - -generate\_select -For function subpanels (see `get_subpanel_data`) whether or not the function will return an array representing the query to be used (for `generate_select = true`) or whether it will simply return the query to be used as a string. - -get\_distinct\_data -Whether or not to only return distinct rows. Relationships do not allow linking two records more than once therefore this only really applies if the subpanel source is a function. See - -`get_subpanel_data` for information on function subpanel sources. - -top\_buttons -Allows defining the buttons to appear on the subpanel. This is simply an array of the button definitions. These definitions have, at least, the `widget_class` defined which decides the button class to use in `include/generic/SugarWidgets`. Depending on the button this array may also be used to pass in extra arguments to the widget class. - -#### subpanels - -Inside the metadata folder is the `subpanels` folder. This allows creating different subpanel layouts for different parent modules. For example, the Contacts module will display differently in the subpanel on an account than it will in the subpanel of a case. The files inside the `subpanels` folder can be named anything. All that matters is that it can be referenced in the `subpanel_name` of the `subpaneldefs.php` of the parent module. The usual subpanel file is simply called `default.php`. Let’s look at the `modules/Accounts/metadata/subpanels/default.php` file: - -
-Example 6.8: Module Subpanels definition - ------------------------------------------------------------------------- - -
- 1 $subpanel_layout = array( - 2 'top_buttons' => array( - 3 array( - 4 'widget_class' => 'SubPanelTopCreateButton' - 5 ), - 6 array( - 7 'widget_class' => 'SubPanelTopSelectButton', - 8 'popup_module' => 'Accounts' - 9 ), - 10 ), - 11 'where' => '', - 12 'list_fields' => array ( - 13 'name' => - 14 array ( - 15 'vname' => 'LBL_LIST_ACCOUNT_NAME', - 16 'widget_class' => 'SubPanelDetailViewLink', - 17 'width' => '45%', - 18 'default' => true, - 19 ), - 20 'billing_address_city' => - 21 array ( - 22 'vname' => 'LBL_LIST_CITY', - 23 'width' => '20%', - 24 'default' => true, - 25 ), - 26 'billing_address_country' => - 27 array ( - 28 'type' => 'varchar', - 29 'vname' => 'LBL_BILLING_ADDRESS_COUNTRY', - 30 'width' => '7%', - 31 'default' => true, - 32 ), - 33 'phone_office' => - 34 array ( - 35 'vname' => 'LBL_LIST_PHONE', - 36 'width' => '20%', - 37 'default' => true, - 38 ), - 39 'edit_button' => - 40 array ( - 41 'vname' => 'LBL_EDIT_BUTTON', - 42 'widget_class' => 'SubPanelEditButton', - 43 'width' => '4%', - 44 'default' => true, - 45 ), - 46 'remove_button' => - 47 array ( - 48 'vname' => 'LBL_REMOVE', - 49 'widget_class' => 'SubPanelRemoveButtonAccount', - 50 'width' => '4%', - 51 'default' => true, - 52 ), - 53 ) - 54 ); - -
- ------------------------------------------------------------------------- - -
-There are three keys in the `$subpanel_layout` variable for this subpanel. These are: - -`top_buttons` -Defines the buttons that will appear at the top of the subpanel. See the `top_buttons` key in `subpaneldefs.php`. - -`where` -Allows the addition of conditions to the `where` clause. For example this could be used to exclude Cases that are closed (`cases.state != "Closed"`) or only include Accounts of a specific industry (`accounts.industry = "Media"`). Note that in these examples we specify the table to remove any ambiguity in the query. - -`list_fields` -Defines the list of fields to be displayed in this subpanel. See the section on `listviewdefs.php` for more information. - -#### studio.php - -studio.php is the simplest file in metadata and it’s existence is simply used to confirm if a module should be shown in studio for user tweaking. Note that, unlike other metadata files, the file in `modules//metadata/studio.php` will be the only one checked. A file in `custom/modules//metadata/studio.php` will have no effect. - -
- - -
-7. Controllers --------------------------------------------------- - -SuiteCRM follows the MVC (Model-View-Controller) pattern and as such has the concept of controllers. The controller is responsible for making changes to the Model as well as passing control to the view as appropriate. SuiteCRM has the concept of actions which are actions that will be taken by the controller. Let’s take a look at a SuiteCRM URL: - -
-Example 7.1: Example SuiteCRM URL - ------------------------------------------------------------------------- - -
- example.com/index.php?module=Accounts&action=index - -
- ------------------------------------------------------------------------- - -
-In this (rather boring) example we see that the module is Accounts. This will determine which controller to use and then call the index action on that controller. - -SuiteCRM will first look for the controller in `custom/module//controller.php`. If this is not found then next `module//controller.php` will be checked. Finally if neither of these controllers exist then the default controller will be used. The default controller can be found in `include/MVC/Controller/SugarController.php`. - -### Customising controllers - -Ordinarily the default controller handles the request and delegates to the appropriate views etc. However custom controllers can be used to add or alter functionality. Let’s look at adding a new action. - -In the first instance we will have to add our custom controller. This will vary slightly depending on the nature of the module. - -#### Custom module - -In this case we can place the file directly into our module. You should create a new file (if it doesn’t exist) at `modules//controller.php`. The contents will look similar to: - -
-Example 7.2: Creating a custom controller for a custom module - ------------------------------------------------------------------------- - -
- 1 <?php - 2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); - 3 class <TheModule>Controller extends SugarController - 4 { - 5 - 6 } - -
- ------------------------------------------------------------------------- - -
-#### Pre-existing modules - -For pre-existing modules you should add the controller to -`custom/modules//controller.php`. - -The contents of this file will vary depending on whether you wish to extend the existing controller (if it exists) or create your own version completely. It is usually best to extend the existing controller since this will retain important logic. You should note the naming convention here. We name the class -`CustomController`. - -Here we don’t extend the existing controller or no such controller exists: - -
-Example 7.3: Creating a custom controller for an existing module - ------------------------------------------------------------------------- - -
- 1 <?php - 2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); - 3 class Custom<TheModule>Controller extends SugarController - 4 { - 5 - 6 } - -
- ------------------------------------------------------------------------- - -
-Alternatively we extend the existing controller. Note that we are requiring the existing controller: - -
-Example 7.4: Creating a custom controller for an existing module with an existing controller - ------------------------------------------------------------------------- - -
- 1 <?php - 2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); - 3 - 4 require_once 'modules/<TheModule>/controller.php'; - 5 - 6 class Custom<TheModule>Controller extends <TheModule>Controller - 7 { - 8 - 9 } - -
- ------------------------------------------------------------------------- - -
-#### Adding the action - -Now we can add a new action to our controller. Actions are created as methods on the controller with the name `action_`. For example, to create a new action called ‘echo’ we could create the following method in one of the controllers we have created above. This can then perform whatever logic that is needed. In our example we will log the REQUEST and simply redirect: - -
-Example 7.5: Adding a custom controller action method - ------------------------------------------------------------------------- - -
- 1 public function action_echo(){ - 2 $GLOBALS['log']->debug("Echo called with request: ".print_r($_REQUEST,1)); - 3 SugarApplication::redirect('index.php'); - 4 } - -
- ------------------------------------------------------------------------- - -
-#### Legacy Style - -In previous versions of SugarCRM a new action was added by creating a file in either `modules//.php` or `custom/modules//.php`. Although this still works it is not recommended. - -
- - -
-8. Entry Points ---------------------------------------------------- - -Entry points are simply a page which provides access to SuiteCRM. These can be used for a variety of purposes such as allowing an external form simple access to SuiteCRM or, as is the case with the stock Events module, allowing an event invite to be responded to by clicking a link in an email. - -### Creating an entry point - -Let’s create a simple entry point to display the time. First we define this entry point in a new file in: - -
-Example 8.1: Entry point registry location - ------------------------------------------------------------------------- - -
- custom/Extension/application/Ext/EntryPointRegistry/ - -
- ------------------------------------------------------------------------- - -
-For our example we’ll call our new file MyTimeEntryPoint.php - -
-Example 8.2: Example entry point location - ------------------------------------------------------------------------- - -
- custom/Extension/application/Ext/EntryPointRegistry/MyTimeEntryPoint.php - -
- ------------------------------------------------------------------------- - -
-In this file we will add a new entry to the `$entry_point_registry`. We supply the file that should be called. Here we are simply placing the file in custom if the entry point is related to a specific module it is usually a good idea to place this somewhere inside `custom//`. - -In addition we supply an “auth” parameter. If “auth” is true then anyone accessing the entry point will need to be logged into SuiteCRM. - -
-Example 8.3: Adding an entry point entry - ------------------------------------------------------------------------- - -
- 1 <?php - 2 $entry_point_registry['MyTimeEntryPoint'] = array( - 3 'file' => 'custom/MyTimeEntryPoint.php', - 4 'auth' => true, - 5 ); - -
- ------------------------------------------------------------------------- - -
-Finally we add the actual logic itself inside custom/MyTimeEntryPoint.php: - -
-Example 8.4: Example entry point that outputs the current time - ------------------------------------------------------------------------- - -
- 1 <?php - 2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); - 3 $date = new DateTime(); - 4 echo $date->format('r'); - -
- ------------------------------------------------------------------------- - -
-After a Quick Repair and Rebuild we can access our entry point: - -
-Example 8.5: Custom entry point URL - ------------------------------------------------------------------------- - -
- example.com/index.php?entryPoint=MyTimeEntryPoint - -
- ------------------------------------------------------------------------- - -
-and we should see something similar to: - -
-Example 8.6: MyTimeEntryPoint - ------------------------------------------------------------------------- - -
- Sun, 15 Mar 2015 13:03:03 +0000 - -
- ------------------------------------------------------------------------- - -
-Obviously this is a contrived example but any logic that can be performed elsewhere in SuiteCRM can be performed in an entry point (for example creating or editing [SugarBeans](#chap02.xhtml#working-with-beans-chapter "wikilink")). - -
- - -
-9. Language Strings -------------------------------------------------------- - -Language strings provide an element of internationalisation to SuiteCRM. It allows specifying different strings to be used in different languages making it much easier to provide translations for modules and customisations. Even if you are only targeting a single language it is still worth using the language string functionality in SuiteCRM because it allows the simple changing of strings within SuiteCRM and it also allows users to customise the labels used in your customisations. There are three main types of language strings that we will cover here. - -At the core, the language strings are a key value store. The keys are used throughout SuiteCRM and the values are loaded based on the current language. - -Languages are handled in SuiteCRM by prefixing the file name with the IETF language code for the language that this file contains. Here are some examples of different language file names: - -
-Example 9.1: Example language file names - ------------------------------------------------------------------------- - -
- # Core Accounts language file for en_us (United States English) - modules/Accounts/language/en_us.lang.php - - # Core Cases language file for es_es (Spanish as spoken in Spain) - modules/Cases/language/es_es.lang.php - - # Custom language file for de_de (German) - custom/Extension/application/Ext/Language/de_de.SomeCustomPackage.php - -
- ------------------------------------------------------------------------- - -
-SuiteCRM will choose the language prefix to be used based on the language the user selected when logging in or the default language if none was selected. Generally when a language file is loaded the default language files and the `en_us` files will also be loaded. These files are then merged. This ensures that there will still be a definition if there are language keys in either `en_us` or the default language that don’t have definitions in the current language. In essence the language “falls back” to the default language and `en_us` if there are missing keys. - -### Module Strings - -#### Use - -Module strings are strings associated with a particular module. These are usually, for example, field labels and panel name labels, but they may be used for anything that is specific to a single module. - -#### Definition location - -Module strings are defined in the `$mod_strings` array. This is initially defined in -`modules//language/.lang.php`, for example -`modules/Accounts/language/en_us.lang.php`. - -#### Customisation location - -Customisations can be made to the module strings by adding a new file in -`custom/Extension/modules//Ext/Language/..php` (`` in this case should be used to give it a descriptive name). An example is `custom/Extension/modules/Accounts/Ext/Language/en_us.MyLanguageFile.php`. See the Extensions section for more information on the Extensions folder. - -### Application Strings - -#### Use - -Application strings are used for language strings and labels that are not specific to a single module. Examples of these may include labels that will appear in the headers or footers, labels that appear on search buttons throughout SuiteCRM or labels for pagination controls. - -#### Definition location - -The application strings are defined in the `$app_strings` array. This is initially defined in -`include/language/.lang.php`. - -#### Customisation location - -Customisations can be made to the application strings in two ways. Firstly you can edit the file -`custom/include/language/.lang.php`. However to promote modularity it is recommended that you add a new file in the location -`custom/Extension/application/Ext/Language/..php`. For example -`custom/Extension/application/Ext/Language/es_es.MyAppLanguageFile.php`. `` should be used to give the file a descriptive name. See the Extensions section for more information on the Extensions folder. - -### Application List Strings - -#### Use - -Application list strings are used to store the various dropdowns and lists used in SuiteCRM. Most of these are used as options for the various enum fields in SuiteCRM e.g the account type or the opportunity sales stage. - -#### Definition location - -The application list strings are defined in the `$app_list_strings` array. Similar to the `$app_strings` array this is initially defined in `include/language/en_us.lang.php`. - -#### Customisation location - -Customisations can be made to the application list strings in two ways. Firstly you can edit the file -`custom/include/language/.lang.php`. However to promote modularity it is recommended that you add a new file in the location -`custom/Extension/application/Ext/Language/..php` (`` should be used to give the file a descriptive name). For example -`custom/Extension/application/Ext/Language/es_es.MyAppListLanguageFile.php`. See the Extensions section for more information on the Extensions folder. - -### Why and when to customise - -Generally language strings should be changed from within SuiteCRM using the studio tool. However there are times when it can be simpler to add or modify language strings as described in the previous section. If you are importing a large number of language strings or dropdown options it can be simpler to create a new file to add these values. Similarly if you are adding entirely new functionality, it is usually best to simply add these language strings as new values. - -### Usage - -Language strings are used automatically throughout SuiteCRM. For example in metadata you can specify the language strings to display for fields. However in some cases you will want to access and use the language strings in custom code. There are several ways to do this. - -#### Globals - -The `$mod_strings`, `$app_strings` and `$app_list_strings` variables are all global and can be accessed as such. `$app_strings` and `$app_list_strings` will always be available. However `$mod_strings` will only contain the strings for the current module (see the next section for other ways of accessing `$mod_strings`). - -
-Example 9.2: Accessing language strings globally - ------------------------------------------------------------------------- - -
- 1 function someFunction(){ - 2 global $mod_strings, $app_strings, $app_list_strings; - 3 /* - 4 * Grab the label LBL_NAME for the current module - 5 * In most modules this will be the label for the - 6 * name field of the module. - 7 */ - 8 $modLabel = $mod_strings['LBL_NAME']; - 9 - 10 $appLabel = $app_strings['LBL_GENERATE_LETTER']; - 11 - 12 /* - 13 * Unlike the previous two examples $appListLabel will be an - 14 * array of the dropdowns keys to it's display labels. - 15 */ - 16 $appListLabel = $app_list_strings['aos_quotes_type_dom']; - 17 - 18 //Here we just log out the strings - 19 $GLOBALS['log']->debug("The module label is $modLabel"); - 20 $GLOBALS['log']->debug("The app label is $appLabel"); - 21 $GLOBALS['log']->debug("The app list label is ".print_r($appListLabel,1)); - 22 } - -
- ------------------------------------------------------------------------- - -
-#### Translate - -As an alternative to using globals or, if you are in a different module than the language string you wish to retrieve you can use the `translate` method. - -
-Example 9.3: `translate` method signature - ------------------------------------------------------------------------- - -
- 1 translate( - 2 $string, - 3 $mod='', - 4 $selectedValue='') - -
- ------------------------------------------------------------------------- - -
-$string -The language string to be translated. - -$mod -The module this string should come from. Defaults to the current module if empty. - -$selectedValue -For dropdown strings. This will return the label for the key `$selectedValue` - -Here is an example of the above in action. Note that we do not have to worry about whether the label is a Module string, an Application string or an Application list string, as all of these will be checked (in that order - the first matching value will be returned). - -
-Example 9.4: Example `translate` method calls - ------------------------------------------------------------------------- - -
- 1 function someFunction(){ - 2 //Grab the label LBL_NAME for the current module - 3 $modLabel = translate('LBL_NAME'); - 4 - 5 //Grab the label LBL_NAME for the AOS_Products module - 6 $productModLabel = translate('LBL_NAME','AOS_Products'); - 7 - 8 $appLabel = translate('LBL_GENERATE_LETTER'); - 9 - 10 /* - 11 * Return the label for the `Other` option of the `aos_quotes_type_dom` - 12 * We don't care about the module so this is left blank. - 13 */ - 14 $appListLabel = translate('aos_quotes_type_dom','','Other'); - 15 - 16 //Here we just log out the strings - 17 $GLOBALS['log']->debug("The module label is $modLabel"); - 18 $GLOBALS['log']->debug("The module label for Products is $productModLabel"); - 19 $GLOBALS['log']->debug("The app label is $appLabel"); - 20 $GLOBALS['log']->debug("The app list label is ".print_r($appListLabel,1)); - 21 } - -
- ------------------------------------------------------------------------- - -
-#### JavaScript - -Finally, you may be using JavaScript (for example in a view), and wish to display a language string. For this you can use the `SUGAR.language.get` method, which is similar to the `translate` method in example 9.3. - -
-Example 9.5: `SUGAR.language.get` method signature - ------------------------------------------------------------------------- - -
- 1 SUGAR.language.get( - 2 module, - 3 str - 4 ); - -
- ------------------------------------------------------------------------- - -
-module -The module a language string will be returned for. You should supply `app_strings` or - -`app_list_strings` if the label you wish to retrieve is not a module string. - -str -The key you want to retrieve a label for. - -
-Example 9.6: Example `SUGAR.language.get` method calls - ------------------------------------------------------------------------- - -
- 1 function someFunction(){ - 2 - 3 /* - 4 * Grab the label LBL_NAME for AOS_Products - 5 * Note that, unlike the translate function in example 9.3 - 6 * the module name is required. - 7 */ - 8 - 9 var modLabel = SUGAR.language.get('AOS_Products', 'LBL_NAME'); - 10 - 11 /* - 12 * As mentioned above we explicitly need to pass if we are retrieving - 13 * an app_string or app_list_string - 14 */ - 15 var appLabel = SUGAR.language.get('app_strings', 'LBL_GENERATE_LETTER'); - 16 var appListLabel = SUGAR.language.get('app_list_strings', - 17 'aos_quotes_type_dom'); - 18 - 19 //Here we just log out the strings - 20 console.log("The module label is "+modLabel); - 21 console.log("The app label is "+appLabel); - 22 console.log("The app list label is "+appListLabel); - 23 } - -
- ------------------------------------------------------------------------- - -
-
- - -
-10. Config ----------------------------------------------- - -### The config files - -There are two main config files in SuiteCRM, both of which are in the root SuiteCRM folder. These are `config.php` and `config_override.php`. The definitions in here provide various configuration options for SuiteCRM. All the way from the details used to access the database to how many entries to show per page in the list view. Most of these options are accessible from the SuiteCRM administration page. However some are only definable in the config files. - -#### config.php - -This is the main SuiteCRM config file and includes important information like the database settings and the current SuiteCRM version. - -Generally settings in this file wont be changed by hand. An exception to this is if SuiteCRM has been moved or migrated. In which case you may need to change the database settings and the site\_url. Let’s look at the database settings first: - -
-Example 10.1: Database config definition - ------------------------------------------------------------------------- - -
- 1 'dbconfig' => - 2 array ( - 3 'db_host_name' => 'localhost', - 4 'db_host_instance' => 'SQLEXPRESS', - 5 'db_user_name' => 'dbuser', - 6 'db_password' => 'dbpass', - 7 'db_name' => 'dbname', - 8 'db_type' => 'mysql', - 9 'db_port' => '', - 10 'db_manager' => 'MysqliManager', - 11 ), - -
- ------------------------------------------------------------------------- - -
-Here we can see this instance is setup to access a local MySQL instance using the username/password dbuser/dbpass and accessing the database named ‘dbname’. - -The site url settings are even simpler: - -
-Example 10.2: Setting the site URL - ------------------------------------------------------------------------- - -
- 'site_url' => 'http://example.com/suitecrm', - -
- ------------------------------------------------------------------------- - -
-The site url for the above is simply ‘http://example.com/suitecrm’ if we were moving this instance to, for example, suite.example.org, then we can simply place that value in the file. - -These are generally the only two instances where you would directly change `config.php`. For other changes you would either make the change through SuiteCRM itself or you would use the -`config_override.php` file. - -#### config\_override.php - -`config_override.php` allows you to make config changes without risking breaking the main config file. This is achieved quite simply by adding, editing or removing items from the $sugar\_config variable. The `config_override.php` file will be merged with the existing config allowing, as the name suggests, overriding the config. For example in config\_override.php we can add our own, new, config item: - -
-Example 10.3: Adding a custom config value - ------------------------------------------------------------------------- - -
- $sugar_config['enable_the_awesome'] = true; - -
- ------------------------------------------------------------------------- - -
-or we can edit an existing config option in a very similar manner by simply overwriting it: - -
-Example 10.4: Overwriting an existing config value - ------------------------------------------------------------------------- - -
- $sugar_config['logger']['level'] = 'debug'; - -
- ------------------------------------------------------------------------- - -
-### Using config options - -We may want to access config options in custom code (or as detailed above if we have created our own config setting we may want to use that). We can easily get the config using the php global keyword: - -
-Example 10.5: Accessing a config setting within SuiteCRM - ------------------------------------------------------------------------- - -
- 1 function myCustomLogic(){ - 2 //Get access to config - 3 global $sugar_config; - 4 //use the config values - 5 if(!empty($sugar_config['enable_the_awesome'])){ - 6 doTheAwesome(); - 7 } - 8 } - -
- ------------------------------------------------------------------------- - -
-
- - -
-11. Logging ------------------------------------------------ - -### Logging messages - -Logging in SuiteCRM is achieved by accessing the log global. Accessing an instance of the logger is as simple as - -
-Example 11.1: Accessing the log - ------------------------------------------------------------------------- - -
- $GLOBALS['log'] - -
- ------------------------------------------------------------------------- - -
-This can then be used to log a message. Each log level is available as a method. For example: - -
-Example 11.2: Logging messages - ------------------------------------------------------------------------- - -
- 1 $GLOBALS['log']->debug('This is a debug message'); - 2 $GLOBALS['log']->error('This is an error message'); - -
- ------------------------------------------------------------------------- - -
-This will produce the following output: - -
-Example 11.3: Logging messages example output - ------------------------------------------------------------------------- - -
- 1 Tue Apr 28 16:52:21 2015 [15006][1][DEBUG] This is a debug message - 2 Tue Apr 28 16:52:21 2015 [15006][1][ERROR] This is an error message - -
- ------------------------------------------------------------------------- - -
-### Logging output - -The logging output displays the following information by default: - -
-Example 11.4: Logging messages example output - ------------------------------------------------------------------------- - -
- <Date> [<ProcessId>][<UserId>][<LogLevel>] <LogMessage> - -
- ------------------------------------------------------------------------- - -
-`` -The date and time that the message was logged. - -`` -The PHP process id. - -`` -The ID of the user that is logged into SuiteCRM. - -`` -The log level for this log message. - -`` -The contents of the log message. - -### Log levels - -Depending on the level setting in admin some messages will not be added to the log e.g if your logger is set to `error` then you will only see log levels of `error` or higher (`error`, `fatal` and `security`). - -The default log levels (in order of verbosity) are: - -- `debug` -- `info` -- `warn` -- `deprecated` -- `error` -- `fatal` -- `security` - -Generally on a production instance you will use the less verbose levels (probably `error` or `fatal`). However whilst you are developing you can use whatever level you prefer. I prefer the most verbose level - `debug`. - -
- - -
-12. Logic Hooks ---------------------------------------------------- - -### Intro - -Logic hooks allow you to hook into various events in SuiteCRM to fire custom code. This can allow you to, for example, make a call to an external API, or to create a new record if certain events occur. - -### Types - -Logic hooks can occur in three contexts. These contexts are Application Hooks, Module Hooks and User Hooks. These are detailed below. - -### Application Hooks - -Application hooks are hooks which are fired in the application context (that is, they are not fired against a particular module). These hooks must be defined in the top level logic hook (i.e. `custom/modules/logic_hooks.php`). - -after\_entry\_point -Called after SuiteCRM has initialised but before any other processing is carried out. - -after\_ui\_footer -Called after the UI footer. - -after\_ui\_frame -Fired after the UI has been displayed but before the footer has been displayed. - -server\_round\_trip -Fired at the end of every page request. - -### User Hooks - -User hooks are fired for certain login/logout actions. Similar to Application Hooks, these hooks must be defined in the top level logic hook (i.e. custom/modules/logic\_hooks.php). - -after\_login -Fired after a user logs in to SuiteCRM . - -after\_logout -Fired when a user logs out of SuiteCRM. - -before\_logout -Fired before a user logs out of SuiteCRM. - -login\_failed -Fired when a user attempts to login to SuiteCRM but the login fails. - -### Module Hooks - -Module Hooks are called on various record actions for a specific module. - -after\_delete -Fired when a record is deleted. - -after\_relationship\_add -Fired after a relationship is added between two records. Note that this may be called twice, once for each side of the relationship. - -after\_relationship\_delete -Fired after a relationship between two records is deleted. - -after\_restore -Fired after a record is undeleted. - -after\_retrieve -Fired after a record is retrieved from the DB. - -after\_save -Fired after a record is saved. Note that due to some peculiarities some related modules may not be persisted to the database. The logic hook is fired within the SugarBean classes save method. Some implementing classes may save related beans after this method returns. A notable example of this is the saving of email addresses in Company modules. - -before\_delete -Fired before a record is deleted. - -before\_relationship\_add -Fired before a relationship is added between two records. Note that this may be called twice, once for each side of the relationship. - -before\_relationship\_delete -Fired before a relationship between two records is deleted. Note that this may be called twice, once for each side of the relationship. - -before\_restore -Fired before a record is undeleted. - -before\_save -Fired before a record is saved. - -handle\_exception -Fired when an exception occurs in a record. - -process\_record -Fired when a record is processed ready to be displayed in list views or dashlets. - -### Job Queue Hooks - -Job queue hooks are fired for scheduler jobs. Similar to application hooks these hooks must be defined in the top level logic hook (i.e. `custom/modules/logic_hooks.php`). - -job\_failure -Fired when a scheduled job either returns false to signify failure or throws an exception and it will not be retried. See the section on [Scheduled Tasks](#chap12.xhtml#scheduled-tasks-chapter "wikilink"). - -job\_failure\_retry -Fired when a scheduled job either returns false to signify failure or throws an exception but it will be retried. See the section on [Scheduled Tasks](#chap12.xhtml#scheduled-tasks-chapter "wikilink"). - -### Implementing - -Depending on the Logic Hook type logic hooks are either placed into -`custom/modules/Logic_Hooks.php` or `custom/modules//Logic_Hooks.php`. - -#### Logic\_Hooks.php - -The logic hook file itself specifies which logic hooks to fire on this event. It looks something like this: - -
-Example 12.1: Logic hook file - ------------------------------------------------------------------------- - -
- 1 <?php - 2 // Do not store anything in this file that is not part of the array or the hook - 3 //version. This file will be automatically rebuilt in the future. - 4 $hook_version = 1; - 5 $hook_array = Array(); - 6 // position, file, function - 7 $hook_array['before_save'] = Array(); - 8 $hook_array['before_save'][] = Array( - 9 77, - 10 'updateGeocodeInfo', - 11 'custom/modules/Cases/CasesJjwg_MapsLogicHook.php', - 12 'CasesJjwg_MapsLogicHook', - 13 'updateGeocodeInfo'); - 14 $hook_array['before_save'][] = Array( - 15 10, - 16 'Save case updates', - 17 'modules/AOP_Case_Updates/CaseUpdatesHook.php', - 18 'CaseUpdatesHook', - 19 'saveUpdate'); - 20 $hook_array['before_save'][] = Array( - 21 11, - 22 'Save case events', - 23 'modules/AOP_Case_Events/CaseEventsHook.php', - 24 'CaseEventsHook', - 25 'saveUpdate'); - 26 $hook_array['before_save'][] = Array( - 27 12, - 28 'Case closure prep', - 29 'modules/AOP_Case_Updates/CaseUpdatesHook.php', - 30 'CaseUpdatesHook', - 31 'closureNotifyPrep'); - 32 $hook_array['before_save'][] = Array( - 33 1, - 34 'Cases push feed', - 35 'custom/modules/Cases/SugarFeeds/CaseFeed.php', - 36 'CaseFeed', - 37 'pushFeed'); - 38 $hook_array['after_save'] = Array(); - 39 $hook_array['after_save'][] = Array( - 40 77, - 41 'updateRelatedMeetingsGeocodeInfo', - 42 'custom/modules/Cases/CasesJjwg_MapsLogicHook.php', - 43 'CasesJjwg_MapsLogicHook', - 44 'updateRelatedMeetingsGeocodeInfo'); - 45 $hook_array['after_save'][] = Array( - 46 10, - 47 'Send contact case closure email', - 48 'modules/AOP_Case_Updates/CaseUpdatesHook.php', - 49 'CaseUpdatesHook', - 50 'closureNotify'); - 51 $hook_array['after_relationship_add'] = Array(); - 52 $hook_array['after_relationship_add'][] = Array( - 53 77, - 54 'addRelationship', - 55 'custom/modules/Cases/CasesJjwg_MapsLogicHook.php', - 56 'CasesJjwg_MapsLogicHook', - 57 'addRelationship'); - 58 $hook_array['after_relationship_add'][] = Array( - 59 9, - 60 'Assign account', - 61 'modules/AOP_Case_Updates/CaseUpdatesHook.php', - 62 'CaseUpdatesHook', - 63 'assignAccount'); - 64 $hook_array['after_relationship_add'][] = Array( - 65 10, - 66 'Send contact case email', - 67 'modules/AOP_Case_Updates/CaseUpdatesHook.php', - 68 'CaseUpdatesHook', - 69 'creationNotify'); - 70 $hook_array['after_relationship_delete'] = Array(); - 71 $hook_array['after_relationship_delete'][] = Array( - 72 77, - 73 'deleteRelationship', - 74 'custom/modules/Cases/CasesJjwg_MapsLogicHook.php', - 75 'CasesJjwg_MapsLogicHook', - 76 'deleteRelationship'); - -
- ------------------------------------------------------------------------- - -
-Let’s go through each part of the file. - -
-
- 4 $hook_version = 1; - -
-
-This sets the hook version that we are using. Currently there is only one version so this line is unused. - -
-
- 5 $hook_array = Array(); - -
-
-Here we set up an empty array for our Logic Hooks. This should always be called $hook\_array. - -
-
- 7 $hook_array['before_save'] = Array(); - -
-
-Here we are going to be adding some before\_save hooks so we add an empty array for that key. - -
-
- 8 $hook_array['before_save'][] = Array( - 9 77, - 10 'updateGeocodeInfo', - 11 'custom/modules/Cases/CasesJjwg_MapsLogicHook.php', - 12 'CasesJjwg_MapsLogicHook', - 13 'updateGeocodeInfo'); - -
-
-Finally we reach an interesting line. This adds a new logic hook to the before\_save hooks. This array contains 5 entries which define this hook. These are: - -##### Sort order - -The first argument (77) is the sort order for this hook. The logic hook array is sorted by this value. If you wish for a hook to fire earlier you should use a lower number. If you wish for a hook to be fired later you should use a higher number. The numbers themselves are arbitrary. - -##### Hook label - -The second argument (‘updateGeocodeInfo’) is simply a label for the logic hook. This should be something short but descriptive. - -##### Hook file - -The third argument is where the actual class for this hook is. In this case it is in a file called `custom/modules/Cases/CasesJjwg_MapsLogicHook.php`. Generally you will want the files to be somewhere in custom and it is usual to have them in `custom/modules//.php` or `custom/modules/.php` for Logic Hooks not targeting a specific module. However the files can be placed anywhere. - -##### Hook class - -The fourth argument is the class name for the Logic Hook class. In this case -`CasesJjwg_MapsLogicHook`. It is usual for the class name to match the file name but this is not required. - -##### Hook method - -The fifth, and final, argument is the method that will be called on the class. In this case `updateGeocodeInfo`. - -#### Adding your own logic hooks - -When adding logic hooks you should make full use of the Extensions framework (see the section on Extensions). This involves creating a file in -`custom/Extension/application/Ext/LogicHooks/` for application hooks and -`custom/Extension/modules//Ext/LogicHooks/` for module specific hooks. These files can then add to/alter the `$hook_array` as appropriate. - - ---- - - - - - - -
-information -

information

-

After adding a new logic hook it is necessary to perform a quick repair and rebuild in the admin menu for this to be picked up.

- -#### Logic Hook function - -The logic hook function itself will vary slightly based on the logic hook type. For module hooks it will appear similar to: - -
-Example 12.2: Example logic hook method - ------------------------------------------------------------------------- - -
- 1 class SomeClass - 2 { - 3 function someMethod($bean, $event, $arguments) - 4 { - 5 //Custom Logic - 6 } - 7 } - -
- ------------------------------------------------------------------------- - -
-Application logic hooks omit the $bean argument: - -
-Example 12.3: Example logic hook method for application hooks - ------------------------------------------------------------------------- - -
- 1 class SomeClass - 2 { - 3 function someMethod($event, $arguments) - 4 { - 5 //Custom Logic - 6 } - 7 } - -
- ------------------------------------------------------------------------- - -
-##### $bean (`SugarBean`) - -The $bean argument passed to your logic hook is usually the bean that the logic hook is being performed on. For User Logic Hooks this will be the current User object. For module logic hooks (such as `before_save`) this will be the record that is being saved. For job queue logic hooks this will be the SchedulersJob bean. Note that for Application Logic Hook this argument is not present. - -##### $event (`string`) - -The $event argument contains the logic hook event e.g `process_record`, `before_save`, -`after_delete` etc. - -##### $arguments (`array`) - -The $arguments argument contains any additional details of the logic hook event. I.e. in the case of before\_relationship\_add this will contain details of the related modules. - -### Tips - - ---- - - - - - - -
-information -

information

-

Triggering extra logic hooks

-

If you are performing certain actions that may trigger another logic hook (such as saving a bean) then you need to be aware that this will trigger the logic hooks associated with that bean and action. This can be troublesome if this causes a logic hook loop of saves causing further saves. One way around this is to simply be careful of the hooks that you may trigger. If doing so is unavoidable you can usually set an appropriate flag on the bean and then check for that flag in subsequent hooks.

- - ---- - - - - - - -
-information -

information

-

Think of the user

-

Most logic hooks will cause additional code which can degrade the users experience. If you have long running code in the after_save the user will need to wait for that code to run. This can be avoided by either ensuring the code runs quickly or by using the Job Queue (see the Job Queue chapter for more information).

- -
- - -
-13. Scheduled Tasks -------------------------------------------------------- - -### Intro - -Scheduled tasks are performed in SuiteCRM by the scheduler module. Jobs are placed into the queue either through the defined scheduled tasks or, for one off tasks, by code creating job objects. Note that both scheduled tasks and using the job queue requires that you have the schedulers set up. This will vary depending on your system but usually requires adding an entry either to Cron (for Linux systems) or to the windows scheduled tasks (for windows). Opening the scheduled tasks page within SuiteCRM will let you know the format for the entry. - -### Scheduler - -Scheduled tasks allow SuiteCRM to perform recurring tasks. Examples of these which ship with SuiteCRM include checking for incoming mail, sending email reminder notifications and indexing the full text search. What if you want to create your own tasks? - -SuiteCRM lets you define your own Scheduler. We do this by creating a file in -`custom/Extension/modules/Schedulers/Ext/ScheduledTasks/`. You can give this file a name of your choice but it is more helpful to give it a descriptive name. Let’s create a simple file named -`custom/Extension/modules/Schedulers/Ext/ScheduledTasks/CleanMeetingsScheduler.php`. This will add a new job to the job strings and a new method that the scheduler will call: - -
-Example 13.1: Example Clean Meetings Scheduler - ------------------------------------------------------------------------- - -
- 1 <?php - 2 /* - 3 * We add the method name to the $job_strings array. - 4 * This is the method that jobs for this scheduler will call. - 5 */ - 6 $job_strings[] = 'cleanMeetingsScheduler'; - 7 - 8 /** - 9 * Example scheduled job to change any 'Planned' meetings older than a month - 10 * to 'Not Held'. - 11 * @return bool - 12 */ - 13 function cleanMeetingsScheduler(){ - 14 //Get the cutoff date for which meetings will be considered - 15 $cutOff = new DateTime('now - 1 month'); - 16 $cutOff = $cutOff->format('Y-m-d H:i:s'); - 17 - 18 //Get an instance of the meetings bean for querying - 19 //see the Working With Beans chapter. - 20 $bean = BeanFactory::getBean('Meetings'); - 21 - 22 //Get the list of meetings older than the cutoff that are marked as Planned - 23 $query = "meetings.date_start < '$cutOff' AND meetings.status = 'Planned'"; - 24 $meetings = $bean->get_full_list('',$query); - 25 - 26 foreach($meetings as $meeting){ - 27 //Mark each meeting as Not Held - 28 $meeting->status = 'Not Held'; - 29 //Save the meeting changes - 30 $meeting->save(); - 31 } - 32 //Signify we have successfully ran - 33 return true; - 34 } - -
- ------------------------------------------------------------------------- - -
-We also make sure that we add a language file in -`custom/Extension/modules/Schedulers/Ext/Language/en_us.cleanMeetingsScheduler.php` again, the name of the file doesn’t matter but it is helpful to use something descriptive. This will define the language string for our job so the user sees a nice label. See the section on language strings for more information. The key for the mod strings will be LBL\_UPPERMETHODNAME. In our case our method name is `cleanMeetingsScheduler` so our language label key will be `LBL_CLEANMEETINGSSCHEDULER`. - -
-Example 13.2: Example Language string for Clean Meetings Scheduler - ------------------------------------------------------------------------- - -
- 1 <?php - 2 //We add the mod string for our method here. - 3 $mod_strings['LBL_CLEANMEETINGSSCHEDULER'] = 'Mark old, planned meetings as Not \ - 4 Held'; - -
- ------------------------------------------------------------------------- - -
-If we perform a repair and rebuild our method will now be packaged up into the scheduler ext file (see the Extensions section for more information on this process) and will be available in the schedulers page. Note that for any changes to the scheduler method you will need to perform another quick repair and rebuild - even in developer mode. We can now create a new scheduler to call our new method: - -
-![Creating a scheduler that uses our new method](images/CreateMeetingsScheduler.png "fig:Creating a scheduler that uses our new method") Creating a scheduler that uses our new method - -
-This will now behave just like any other scheduler and we can have this run as often (or as rarely) as we would like. Take care here. The default frequency is every one minute. If your task is heavy duty or long running this may not be what you would prefer. Here we settle for once a day. - -### Job Queue - -Sometimes you will require code to perform a long running task but you do not need the user to wait for this to be completed. A good example of this is sending an email in a logic hook (see the Logic Hooks chapter for information on these). Assuming we have the following logic hook: - -
-Example 13.3: Example Email sending Logic Hook - ------------------------------------------------------------------------- - -
- 1 class SomeClass - 2 { - 3 function SomeMethod($bean, $event, $arguments) - 4 { - 5 - 6 //Perform some setup of the email class - 7 require_once "include/SugarPHPMailer.php"; - 8 $mailer=new SugarPHPMailer(); - 9 $admin = new Administration(); - 10 $admin->retrieveSettings(); - 11 $mailer->prepForOutbound(); - 12 $mailer->setMailerForSystem(); - 13 $admin = new Administration(); - 14 $admin->retrieveSettings(); - 15 $admin->settings['notify_fromname'] - 16 $mailer->From = $admin->settings['notify_fromaddress'] - 17 $mailer->FromName = $emailSettings['from_name']; - 18 $mailer->IsHTML(true); - 19 - 20 //Add message and recipient. - 21 //We could go all out here and load and populate an email template - 22 //or get the email address from the bean - 23 $mailer->Subject = 'My Email Notification! '.$bean->name; - 24 $mailer->Body = $event. ' fired for bean '.$bean->name; - 25 $mailer->AddAddress('Jim@example.com'); - 26 return $mailer->Send(); - 27 } - 28 } - -
- ------------------------------------------------------------------------- - -
-This will work fine. However you do not want the user to have to wait for the email to be sent out as this can cause the UI to feel sluggish. Instead you can create a Job and place it into the job queue and this will be picked by the scheduler. Let’s look at an example of how you would do this. - -First we want our Logic Hook class to create the scheduled job: - -
-Example 13.4: Example Scheduled Job Creation - ------------------------------------------------------------------------- - -
- 1 class SomeClass - 2 { - 3 function SomeMethod($bean, $event, $arguments) - 4 { - 5 require_once 'include/SugarQueue/SugarJobQueue.php'; - 6 $scheduledJob = new SchedulersJob(); - 7 - 8 //Give it a useful name - 9 $scheduledJob->name = "Email job for {$bean->module_name} {$bean->id}"; - 10 - 11 //Jobs need an assigned user in order to run. You can use the id - 12 //of the current user if you wish, grab the assigned user from the - 13 //current bean or anything you like. - 14 //Here we use the default admin user id for simplicity - 15 $scheduledJob->assigned_user_id = '1'; - 16 - 17 //Pass the information that our Email job will need - 18 $scheduledJob->data = json_encode(array( - 19 'id' => $bean->id, - 20 'module' => $bean->module_name) - 21 ); - 22 - 23 //Tell the scheduler what class to use - 24 $scheduledJob->target = "class::BeanEmailJob"; - 25 - 26 $queue = new SugarJobQueue(); - 27 $queue->submitJob($scheduledJob); - 28 } - 29 } - -
- ------------------------------------------------------------------------- - -
-Next we create the BeanEmailJob class. This is placed into the -`custom/Extensions/modules/Schedulers/Ext/ScheduledTasks/` directory with the same name as the class. So in our example we will have: -`custom/Extensions/modules/Schedulers/Ext/ScheduledTasks/BeanEmailJob.php` - -
-Example 13.5: Example Scheduler job - ------------------------------------------------------------------------- - -
- 1 class BeanEmailJob implements RunnableSchedulerJob - 2 { - 3 public function run($arguments) - 4 { - 5 - 6 //Only different part of the email code. - 7 //We grab the bean using the supplied arguments. - 8 $arguments = json_decode($arguments,1); - 9 $bean = BeanFactory::getBean($arguments['module'],$arguments['id']); - 10 - 11 //Perform some setup of the email class - 12 require_once "include/SugarPHPMailer.php"; - 13 $mailer=new SugarPHPMailer(); - 14 $admin = new Administration(); - 15 $admin->retrieveSettings(); - 16 $mailer->prepForOutbound(); - 17 $mailer->setMailerForSystem(); - 18 $admin = new Administration(); - 19 $admin->retrieveSettings(); - 20 $mailer->From = $admin->settings['notify_fromaddress']; - 21 $mailer->FromName = $emailSettings['from_name']; - 22 $mailer->IsHTML(true); - 23 - 24 //Add message and recipient. - 25 //We could go all out here and load and populate an email template - 26 //or get the email address from the bean - 27 $mailer->Subject = 'My Email Notification! '.$bean->name; - 28 $mailer->Body = $event. ' fired for bean '.$bean->name; - 29 $mailer->AddAddress('Jim@example.com'); - 30 return $mailer->Send(); - 31 } - 32 public function setJob(SchedulersJob $job) - 33 { - 34 $this->job = $job; - 35 } - 36 } - -
- ------------------------------------------------------------------------- - -
-Now whenever a user triggers the hook it will be much quicker since we are simply persisting a little info to the database. The scheduler will run this in the background. - -#### Retries - -Occasionally you may have scheduled jobs which could fail intermittently. Perhaps you have a job which calls an external API. If the API is unavailable it would be unfortunate if the job failed and was never retried. Fortunately the SchedulersJob class has two properties which govern how retries are handled. These are `requeue` and `retry_count`. - -`requeue` -Signifies that this job is eligible for retries. - -`retry_count` -Signifies how many retries remain for this job. If the job fails this value will be decremented. - -We can revisit our previous example and add two retries: - -
-Example 13.6: Setting the retry count on a scheduled job - ------------------------------------------------------------------------- - -
- 6 $scheduledJob = new SchedulersJob(); - 7 - 8 //Give it a useful name - 9 $scheduledJob->name = "Email job for {$bean->module_name} {$bean->id}"; - 10 - 11 //Jobs need an assigned user in order to run. You can use the id - 12 //of the current user if you wish, grab the assigned user from the - 13 //current bean or anything you like. - 14 //Here we use the default admin user id for simplicity - 15 $scheduledJob->assigned_user_id = '1'; - 16 - 17 //Pass the information that our Email job will need - 18 $scheduledJob->data = json_encode(array( - 19 'id' => $bean->id, - 20 'module' => $bean->module_name) - 21 ); - 22 - 23 //Tell the scheduler what class to use - 24 $scheduledJob->target = "class::BeanEmailJob"; - 25 - 26 //Mark this job for 2 retries. - 27 $scheduledJob->requeue = true; - 28 $scheduledJob->retry = 2; - -
- ------------------------------------------------------------------------- - -
-See the section on [logic hooks](#chap11.xhtml#logic-hooks-chapter "wikilink") for more information on how job failures can be handled. - -### Debugging - -With Scheduled tasks and jobs running in the background it can sometimes be difficult to determine what is going on when things go wrong. If you are debugging a scheduled task the the scheduled task page is a good place to start. For both scheduled tasks and job queue tasks you can also check the job\_queue table. For example, in MySQL we can check the last five scheduled jobs: - -
-Example 13.7: Example MySQL query for listing jobs - ------------------------------------------------------------------------- - -
- SELECT * FROM job_queue ORDER BY date_entered DESC LIMIT 5 - -
- ------------------------------------------------------------------------- - -
-This will give us information on the last five jobs. Alternatively we can check on specific jobs: - -
-Example 13.8: Example MySQL query for listing BeanEmailJobs - ------------------------------------------------------------------------- - -
- SELECT * FROM job_queue WHERE target = 'class::BeanEmailJob' - -
- ------------------------------------------------------------------------- - -
-In either case this will give details for the job(s): - -
-Example 13.9: Example MySQL list of jobs - ------------------------------------------------------------------------- - -
- *************************** 1. row *************************** - assigned_user_id: 1 - id: 6cdf13d5-55e9-946e-9c98-55044c5cecee - name: Email job for Accounts 103c4c9b-336f-0e87-782e-5501defb5900 - deleted: 0 - date_entered: 2015-03-14 14:58:15 - date_modified: 2015-03-14 14:58:25 - scheduler_id: - execute_time: 2015-03-14 14:58:00 - status: done - resolution: success - message: NULL - target: class::BeanEmailJob - data: {"id":"103c4c9b-336f-0e87-782e-5501defb5900","module":"Account\ - s"} - requeue: 0 - retry_count: NULL - failure_count: NULL - job_delay: 0 - client: CRON3b06401793b3975cd00c0447c071ef9a:7781 - percent_complete: NULL - 1 row in set (0.00 sec) - -
- ------------------------------------------------------------------------- - -
-Here we can check the status, resolution and message fields. If the status is `queued` then either the scheduler has not yet run or it isn’t running. Double check your Cron settings if this is the case. - -It may be the case that the job has ran but failed for some reason. In this case you will receive a message telling you to check the logs. Checking the logs usually provides enough information, particularly if you have made judicious use of logging (see the chapter on logging) in your job. - -It is possible that the job is failing outright, in which case your logging may not receive output before the scheduler exits. In this case you can usually check your PHP logs. - -As a last resort you can manually run the scheduler from the SuiteCRM directory using: - -
-Example 13.10: Running the scheduler manually - ------------------------------------------------------------------------- - -
- php -f cron.php - -
- ------------------------------------------------------------------------- - -
-Using this in addition to outputting any useful information should track down even the oddest of bugs. - -
- - -
-14. Extension Framework ------------------------------------------------------------ - -### Introduction - -The extension framework provides a means to modify various application data inside SuiteCRM. For example it provides a way to add or modify vardefs, scheduled tasks, language strings and more. In general a folder is provided in `custom/Extension` (the exact path depends on the extension). This folder is then scanned for files which will be consolidated into a single ext file which SuiteCRM will then read and use. In this way it is possible for developers to add a new file to affect the behaviour of SuiteCRM rather than altering existing files. This makes the changes more modular and allows the easy addition or removal of changes. Additionally, because these files are all consolidated it means that there is no affect on performance of checking a (possibly large) number of files. This is only done when performing a repair and rebuild in the admin menu. - -### Standard Extensions - -List of standard SuiteCRM extensions - -| Extension Directory | Compiled file | Module | Description | -|----------------------|---------------------------------------------------------|----------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| ActionViewMap | action\_view\_map.ext.php |   | Used to map actions for a module to a specified view. | -| ActionFileMap | action\_file\_map.ext.php |   | Used to map actions for a module to a specified file. | -| ActionReMap | action\_remap.ext.php |   | Used to map actions for a module to existing actions. | -| Administration | administration.ext.php | Administration | Used to add new sections to the administration panel. | -| EntryPointRegistry | entry\_point\_registry.ext.php | application | Used to add new entry points to SuiteCRM. See the chapter on [Entry Points](#chap07.xhtml#entry-point-chapter "wikilink"). | -| Extensions | extensions.ext.php | application | Used to add new extension types. | -| FileAccessControlMap | file\_access\_control\_map.ext.php |   | Used to add, update or delete entries in the access control lists for files. | -| Language | N/A[1](#chap13.xhtml#fn-langNote "wikilink") |   | Used to add, update or delete language strings for both modules and app strings. See the chapter on [Language Strings](#chap08.xhtml#language-chapter "wikilink"). | -| Layoutdefs | layoutdefs.ext.php |   | Used to add, update or delete subpanel definitions for a module. | -| GlobalLinks | links.ext.php | application | Used to add, update or delete global links (the list of links that appear in the top right of the SuiteCRM UI). | -| LogicHooks | logichooks.ext.php |   | Used to add, update or delete logic hooks. See the chapter on [Logic Hooks](#chap11.xhtml#logic-hooks-chapter "wikilink"). | -| Include | modules.ext.php | application | Used to register new beans and modules. | -| Menus | menu.ext.php |   | Used to add, update or delete the menu links for each module. | -| ScheduledTasks | scheduledtasks.ext.php | Schedulers | Used to add new scheduled tasks. See the chapter on [Scheduled Tasks](#chap12.xhtml#scheduled-tasks-chapter "wikilink"). | -| UserPage | userpage.ext.php | Users | Unused | -| Utils | custom\_utils.ext.php | application | Used to add new utility methods. | -| Vardefs | vardefs.ext.php |   | Used to add, update or delete vardefs for a module. See the section on [Vardefs](#chap03.xhtml#vardefs-chapter "wikilink"). | -| JSGroupings | jsgroups.ext.php |   | Used to add, update or delete JavaScript groupings. | -| Actions | actions.ext.php | AOW\_Actions | Used to add new WorkFlow actions. | - -### Custom Extensions - -Interestingly the extension framework can be used to add new extensions. This allows you to create customisations that are easily customised by others (in a similar manner to, for example, how vardefs can be added - see the chapter on [Vardefs](#chap03.xhtml#vardefs-chapter "wikilink")). - -To create a custom extension you simply add a new file in -`custom/Extension/application/Ext/Extensions`. This can be given a name of your choosing. Our example will use -`custom/Extension/application/Ext/Extensions/SportsList.php` and will look like: - -
-Example 14.1: Adding an entry point entry - ------------------------------------------------------------------------- - -
- 1 <?php - 2 $extensions["sports_list"] = array( - 3 "section" => "sports_list", - 4 "extdir" => "SportsList", - 5 "file" => 'sportslist.ext.php', - 6 "module" => ""); - -
- ------------------------------------------------------------------------- - -
-Now when a Quick Repair and rebuild is run any files in -`custom/Extension/application/Ext/SportsList/` will be consolidated into -`custom/application/Ext/SportsList/sportslist.ext.php`. On it’s own this file will not do anything but you are now able to write custom code that checks the consolidated file rather than having to worry about searching for customisations. - -
-1.
-
- The language extensions are treated specially and, as such, aren’t compiled to a single file.[↩](#chap13.xhtml#fnref-langNote "wikilink") - -
-
- - -
-15. Module Installer --------------------------------------------------------- - -As detailed in the other chapters of this book there are many ways to customise SuiteCRM. The module installer allows you to package these changes and install them onto other SuiteCRM instances. This is achieved by creating a package. - -At the minimum a package is a zip file that contains a `manifest.php` file in it’s root. The manifest file is responsible for providing information about the installer as well as providing information on how to install the package. - -### manifest.php - -The `manifest.php` file contains the definition of three arrays. Let’s look at each of these arrays in turn. See [Appendix A](#chap19.xhtml#appendix-a "wikilink") for the full sample `manifest.php` file. - - ---- - - - - - - -
-information -

information

-

Within path in the manifest file you can use <basepath> to refer to the base directory of the installer. For example <basepath>/Foo.txt will refer to the Foo.txt file in the root of the installer package.

- -#### `$manifest` - -The `$manifest` array provides information on the package itself such as it’s name, readme etc. (it also defines the `copy` array for `patch` packages). A sample definition of the manifest array will appear something like this: - -
-Example 15.1: Example `$manifest` array definition - ------------------------------------------------------------------------- - -
- 1 $manifest = array( - 2 'name' => 'My First Package', - 3 'description' => 'This is a simple package example manifest file', - 4 'version' => '1.5', - 5 'author' => 'Jim Mackin', - 6 'readme' => 'readme.txt', - 7 'acceptable_sugar_flavors' => array('CE'), - 8 'acceptable_sugar_versions' => array( - 9 'exact_matches' => array(), - 10 'regex_matches' => array('6\\.5\\.[0-9]$'), - 11 ), - 12 'copy_files' => array ( - 13 'from_dir' => '<basepath>/custom/', - 14 'to_dir' => 'custom', - 15 'force_copy' => array (), - 16 ), - 17 'dependencies' => array( - 18 array( - 19 'id_name' => 'example_dependency_package', - 20 'version' => '2.4', - 21 ), - 22 ), - 23 ); - -
- ------------------------------------------------------------------------- - -
-`name` -The name of the package. This is how the package will appear to the user during installation and in the Module Loader package list. The package name is required. - -`description` -A brief description of the package. - -`version` -The version of this package. This can be any string but is usually a traditional version number (such as `3.1.4`). - -`author` -The author of the package. - -`readme` -A brief readme string. Note that if a `README.txt` is found in the root of the package this will be used instead. - -`acceptable_sugar_flavors` -A remnant of the SugarCRM packages. This should always be an array with (at least) a `CE` entry. If you would like the installer to target both SuiteCRM and SugarCRM editions then this can contain one of the other SugarCRM flavours (`PRO`, `CORP` , `ULT` or `ENT`). - -`acceptable_sugar_versions` -An array detailing the matching SugarCRM versions. Note that the SugarCRM version is distinct from the SuiteCRM version. This array has two keys. `exact_matches` is simply an array of the allowed versions. `regex_matches` allows specifying regexes to match versions. For SuiteCRM you only need to worry about supporting the `6.5.*` versions which can be matched with the regex `6\\.5\\.[0-9]$`. At the time of writing the current SugarCRM version for SuiteCRM is `6.5.20`. - -`copy_files` -This is only used for `patch` installers and will copy files in the `from_dir` key to those in the `to_dir` key. Finally the `force_copy` key can be used to specify files that should be forcibly copied over. - -`dependencies` -An array of other packages that are relied on by this package. Each entry is an array with `id_name` - the id of the package and `version` - the required version of the package. - -`icon` -The path (within the installer) to an icon to be displayed during installation. - -`is_uninstallable` -Whether or not uninstalls should be allowed. - -`published_date` -The date that the package was published. There is no fixed format for the date, it is simply a string. - -`key` -Specifies a key to ensure that modules do not clash. This will prefix the installed modules and tables with `key`. This is used by the module builder when creating packages but can be specified if you wish. - -`remove_tables` -A string specifying whether module tables should be removed when uninstalling this package. Accepted values are `true`, `false` and `prompt`. The default is `true`. - -`type` -The type of the installer, one of `langpack`, `module`, `patch` or `theme`. See the types section. - -#### `$install_defs` - -Provides information on how the package is to be installed, which files go where and any additional information such as logic hooks, custom fields etc. - -##### `id` - -A unique identifier for the module. - -##### `connectors` - -An array of connectors to be installed. Each entry is an array with the following keys: - -| Key | Description | -|-------------|-----------------------------------------------------------| -| `name` | The name of the connector. | -| `connector` | The directory to copy the connector files from. | -| `formatter` | The directory to copy the connector formatter files from. | - -##### `copy` - -An array of files and directories to be copied on install. Each entry is an array with the following keys: - -| Key | Description | -|--------|-------------------------------------------| -| `from` | The source file/directory in the package. | -| `to` | The destination file/directory. | - - ---- - - - - - - -
-information -

information

-

In general if a file can be handled by one of the other keys then that key should be used. For example new admin entries should be copied using the administration key rather than using the copy key.

- -##### `dashlets` - -An array of dashlets to be installed. Each entry is an array with the following keys: - -| Key | Description | -|--------|------------------------------------------------------------------------------| -| `name` | The name of the new dashlet. | -| `from` | The path in the install package from which the dashlet files will be copied. | - -##### `language` - -An array of language files to be installed. Each entry is an array with the following keys: - -| Key | Description | -|-------------|----------------------------------------------------------------------------------------------------| -| `from` | The location of the language file inside the package. | -| `to_module` | The module this language file is intended for (or ‘application’ for application language strings). | -| `language` | The language that this file is for (i.e. en\_us or es\_es). | - -See the chapter on [Language Strings](#chap08.xhtml#language-chapter "wikilink") for more information. - -##### `layoutdefs` - -An array of layoutdef files which are used to add, remove or edit subpanels. Each entry is an array with the following keys: - -| Key | Description | -|-------------|------------------------------------------------------| -| `from` | The path in the package to the file to be installed. | -| `to_module` | The module that this file will be installed to. | - -##### `vardefs` - -An array of the vardefs to be added to specific modules. Each entry is an array with the following keys: - -| Key | Description | -|-------------|-------------------------------------------------| -| `from` | The location of the vardef file in the package. | -| `to_module` | The destination module. | - - ---- - - - - - - -
-information -

information

-

Generally you should install custom fields using the custom_fields key. However this key can be used to alter existing fields or add more complex fields.

- -##### `menu` - -An array of menus to be installed. Each entry is an array with the following keys: - -| Key | Description | -|-------------|-----------------------------------------------| -| `from` | The location of the menu file in the package. | -| `to_module` | The destination module for this menu. | - -##### `beans` - -An array of beans to be installed. Each entry is an array with the following keys: - -| Key | Description | -|----------|-------------------------------------------------------| -| `module` | The name of the module. | -| `class` | The name of the bean class. | -| `path` | The path (within the package) to the bean file. | -| `tab` | Whether or not a tab should be added for this module. | - -##### `relationships` - -An array detailing any new relationships added (in particular relationships where one side is an existing module). Each entry is an array with the following keys: - -| Key | Description | -|-------------|----------------------------------------------------------| -| `module` | The module that this relationship will be attached to. | -| `meta_data` | The location of the metadata file for this relationship. | - -##### `custom_fields` - -An array of new custom fields to be installed (See the [Vardefs](#chap03.xhtml#vardefs-chapter "wikilink") chapter for more information on this). Each entry is an array with the following keys: - -| Key | Description | -|------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `name` | The name of the new custom field. | -| `label` | The key for the language string which will act as the label for this custom field. | -| `type` | The type of this custom field. | -| `max_size` | For string field types, the maximum number of characters. | -| `require_option` | Whether or not the field is required. | -| `default_value` | The default value of this field. | -| `ext1` | Extended field information. Different field types will use this value differently. For example Enum fields will store the key for the options in this field, decimal and float fields will store the precision. | -| `ext2` | Extended field information. Different field types will use this value differently. For example, dynamic dropdowns will store the parent dropdown, text areas will store the number of rows. | -| `ext3` | Extended field information. Different field types will use this value differently. For example, text areas will store the number of columns. | -| `ext4` | Extended field information. Different field types will use this value differently. For HTML field types this will store the HTML. | -| `audited` | Whether or not changes to this field should be audited. | -| `module` | Used to specify the module where the custom field will be added. | - -##### `logic_hooks` - -An array of logic hooks to be installed. See the [Logic Hooks](#chap11.xhtml#logic-hooks-chapter "wikilink") chapter for more information. Each entry is an array with the following keys: - -| Key | Description | -|---------------|-------------------------------------------------------------------------------------------------------------------------| -| `module` | The module to where this logic hook should be installed. Leaving this empty will install into the top level logic hook. | -| `hook` | The logic hook type (i.e. `after_save`, `after_login`, etc.). | -| `order` | The sort order for this logic hook. | -| `description` | A description of the hook. | -| `file` | The file containing the class for this logic hook, relative to the SuiteCRM root. | -| `class` | The class that contains the logic hook function that should be called by this hook. | -| `function` | The function to be invoked when this hook is triggered. | - -##### `image_dir` - -A path to a directory of images to be included in the install. - -##### `schedulers` - -An array of schedulers to be installed. Each entry is an array with a single key: - -| Key | Description | -|--------|---------------------------------------------| -| `from` | The file containing the new scheduled task. | - -##### `administration` - -An array of admin panels to be installed. Each entry is an array with a single key: - -| Key | Description | -|--------|-----------------------------------------------------| -| `from` | The file containing the new admin panel definition. | - -##### `pre_execute` - -Defines an array of files to be executed before the package is installed. Each entry is a path to a file within the package. Any output will be displayed to the user in the install log. - -##### `post_execute` - -Defines an array of files to be executed after the package is installed. Each entry is a path to a file within the package. Any output will be displayed to the user in the install log. - -##### `pre_uninstall` - -Defines an array of files to be executed before the package is uninstalled. Each entry is a path to a file within the package. Any output will be displayed to the user in the uninstall log. - -##### `post_uninstall` - -Defines an array of files to be executed after the package is uninstalled. Each entry is a path to a file within the package. Any output will be displayed to the user in the uninstall log. - -#### `$upgrade_manifest` - -Provides a means of upgrading an already installed package by providing different `install_defs`. - -
-
-### Types - -| Type | Description | -|----------|------------------------------------------------------------------------| -| langpack | A language installer. This will add an entry to the language dropdown. | -| module | A module installer. Will install new modules and/or functionality. | -| patch | A patch installer. This is used to upgrade SuiteCRM. | -| theme | A theme installer. This will add a new option to the themes. | - -#### Other files - -`README.txt` -Contains the readme for this package. If `README.txt` and a readme entry in the `manifest.php` is defined then this file will be used. - -`LICENSE.txt` -Provides information on the license for this package. - -`scripts/pre_install.php` -A PHP script which defines a method `pre_install()`. This method will be called before the package is installed. Any output will be displayed to the user in the install log. - -`scripts/post_install.php` -A PHP script which defines a method `post_install()`. This method will be called after the package is installed. - -`scripts/pre_uninstall.php` -A PHP script which defines a method `pre_uninstall()`. This method will be called before the package is uninstalled. - -`scripts/post_uninstall.php` -A PHP script which defines a method `post_uninstall()`. This method will be called after the package is uninstalled. - -
- - -
-16. API -------------------------------------------- - -The SuiteCRM API allows third party code to access and edit SuiteCRM data and functionality. - -### Using the API - -SuiteCRM has both a REST and a SOAP API. Which API you want to use will largely come down to personal preference and the support for SOAP/REST libraries in whichever language you will be using. - -Both APIs will require a username and password. It is usual to create a user specifically for the API. - -#### SOAP - -The WSDL for the SOAP API can be found at: - -
-Example 16.1: SOAP API WSDL Location - ------------------------------------------------------------------------- - -
- example.com/suitecrm/service/v4_1/soap.php?wsdl - -
- ------------------------------------------------------------------------- - -
-Where `example.com/suitecrm` is the address of your SuiteCRM instance. `v4_1` is the version of the API and can be changed, `v4_1` is the latest version at the time of writing. - -##### SOAP Example - -The following PHP example uses the built in SoapClient class. - -
-Example 16.2: Accessing the SOAP API - ------------------------------------------------------------------------- - -
- 1 <?php - 2 //Create a new SoapClient - 3 $wsdlURL = "http://example.com/suitecrm/service/v4_1/soap.php?wsdl"; - 4 $client = new SoapClient($wsdlURL); - 5 - 6 //Login to the API and get the session id - 7 $userAuth = array( - 8 'user_name' => '<suitecrmuser>', - 9 'password' => md5('<suitecrmpassword>'), - 10 ); - 11 $appName = 'My SuiteCRM SOAP Client'; - 12 $nameValueList = array(); - 13 $loginResults = $client->login($userAuth, $appName, $nameValueList); - 14 - 15 //Get a list of at most 10 accounts with a billing address in Ohio. Along with - 16 //The first and last names of any contacts in that Account. - 17 $results = $client->get_entry_list( - 18 //Session id - retrieved from login call - 19 $loginResults->id, - 20 //Module to get_entry_list for - 21 'Accounts', - 22 //Filter query - Added to the SQL where clause - 23 "accounts.billing_address_city = 'Ohio'", - 24 //Order by - unused - 25 '', - 26 //Start with the first record - 27 0, - 28 //Return the id and name fields - 29 array('id','name'), - 30 //Link to the "contacts" relationship and retrieve the - 31 //First and last names. - 32 array( - 33 array( - 34 'name' => 'contacts', - 35 'value' => array( - 36 'first_name', - 37 'last_name', - 38 ), - 39 ), - 40 ), - 41 //Show 10 max results - 42 10, - 43 //Do not show deleted - 44 0 - 45 ); - 46 print_r($results); - -
- ------------------------------------------------------------------------- - -
-
-
-#### REST - -The SuiteCRM REST API can be found at: - -
-Example 16.3: REST API Endpoint Location - ------------------------------------------------------------------------- - -
- example.com/suitecrm/service/v4_1/rest.php - -
- ------------------------------------------------------------------------- - -
-Where example.com/suitecrm is the address of your SuiteCRM instance. v4\_1 is the version of the API and can be changed, v4\_1 is the latest version at the time of writing. - -The SuiteCRM REST API is not a true REST API - all calls are performed as POSTs and all calls are to the base URL with the method passed in as a post argument. - -The arguments to the REST API calls are: - - -method - - -The method which will be called, i.e. `login` or `get_entry_list`. See [Appendix B](#chap20.xhtml#appendix-b "wikilink") for a list of API methods. - -input\_type -The input type of the rest\_data. This is usually `JSON` but can also be `Serialize`. - -response\_type -How the response will be encoded. This is usually `JSON` but can also be `Serialize`. - -rest\_data -Any other arguments that are required by this method. This is passed as an encoded array. The encoding is determined by input\_type. - - ---- - - - - - - -
-warning -

warning

-

Note that, for REST requests it is the order of the arguments that matter in rest_data and not the name.

- -
-
-##### Examples - -
-Example 16.4: Accessing the REST API - ------------------------------------------------------------------------- - -
- 1 <?php - 2 - 3 $url = "http://example.com/suitecrm/service/v4_1/rest.php"; - 4 - 5 function restRequest($method, $arguments){ - 6 global $url; - 7 $curl = curl_init($url); - 8 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); - 9 $post = array( - 10 "method" => $method, - 11 "input_type" => "JSON", - 12 "response_type" => "JSON", - 13 "rest_data" => json_encode($arguments), - 14 ); - 15 - 16 curl_setopt($curl, CURLOPT_POSTFIELDS, $post); - 17 - 18 $result = curl_exec($curl); - 19 curl_close($curl); - 20 return json_decode($result,1); - 21 } - 22 - 23 - 24 $userAuth = array( - 25 'user_name' => 'suitecrmuser', - 26 'password' => md5('suitecrmpassword'), - 27 ); - 28 $appName = 'My SuiteCRM REST Client'; - 29 $nameValueList = array(); - 30 - 31 $args = array( - 32 'user_auth' => $userAuth, - 33 'application_name' => $appName, - 34 'name_value_list' => $nameValueList); - 35 - 36 $result = restRequest('login',$args); - 37 $sessId = $result['id']; - 38 - 39 $entryArgs = array( - 40 //Session id - retrieved from login call - 41 'session' => $sessId, - 42 //Module to get_entry_list for - 43 'module_name' => 'Accounts', - 44 //Filter query - Added to the SQL where clause, - 45 'query' => "accounts.billing_address_city = 'Ohio'", - 46 //Order by - unused - 47 'order_by' => '', - 48 //Start with the first record - 49 'offset' => 0, - 50 //Return the id and name fields - 51 'select_fields' => array('id','name',), - 52 //Link to the "contacts" relationship and retrieve the - 53 //First and last names. - 54 'link_name_to_fields_array' => array( - 55 array( - 56 'name' => 'contacts', - 57 'value' => array( - 58 'first_name', - 59 'last_name', - 60 ), - 61 ), - 62 ), - 63 //Show 10 max results - 64 'max_results' => 10, - 65 //Do not show deleted - 66 'deleted' => 0, - 67 ); - 68 $result = restRequest('get_entry_list',$entryArgs); - 69 - 70 print_r($result); - -
- ------------------------------------------------------------------------- - -
-For a full list of API methods and their arguments see [Appendix B](#chap20.xhtml#appendix-b "wikilink"). - -### Adding custom API methods - -Sometimes the existing API methods are not sufficient or using them for a task would be overly complex. SuiteCRM allows the web services to be extended with additional methods or overriding existing methods. - -The recommended path for custom entry points is the following -`custom/service/_custom/`. At the time of writing the latest web service version is `v4_1` so this would be `custom/service/v4_1_custom/`. - -Next we create the implementing class. This will create our new method. In our example we will simply create a new method which writes to the SuiteCRM log We will call this method -`write_log_message`. - -
-Example 16.5: Custom v4\_1 Web Service Implementation - ------------------------------------------------------------------------- - -
- 1 <?php - 2 if(!defined('sugarEntry')){ - 3 define('sugarEntry', true); - 4 } - 5 require_once 'service/v4_1/SugarWebServiceImplv4_1.php'; - 6 class SugarWebServiceImplv4_1_custom extends SugarWebServiceImplv4_1 - 7 { - 8 - 9 function write_log_message($session, $message) - 10 { - 11 $GLOBALS['log']->info('Begin: write_log_message'); - 12 - 13 //Here we check that $session represents a valid session - 14 if (!self::$helperObject->checkSessionAndModuleAccess( - 15 $session, - 16 'invalid_session', - 17 '', - 18 '', - 19 '', - 20 new SoapError())) - 21 { - 22 $GLOBALS['log']->info('End: write_log_message.'); - 23 return false; - 24 } - 25 $GLOBALS['log']->info($message); - 26 return true; - 27 } - 28 } - -
- ------------------------------------------------------------------------- - -
-Next we create the registry file which will register our new method. - -
-Example 16.6: Custom v4\_1 web service registry - ------------------------------------------------------------------------- - -
- 1 <?php - 2 require_once 'service/v4_1/registry.php'; - 3 class registry_v4_1_custom extends registry_v4_1 - 4 { - 5 protected function registerFunction() - 6 { - 7 parent::registerFunction(); - 8 $this->serviceClass->registerFunction('write_log_message', - 9 array( - 10 'session'=>'xsd:string', - 11 'message'=>'xsd:string'), - 12 array( - 13 'return'=>'xsd:boolean') - 14 ); - 15 } - 16 } - -
- ------------------------------------------------------------------------- - -
-Finally we create the entry point. This is the actual file that will be called by our API clients. This will reference the two files which we have created and will call the webservice implementation with our files. - -
-Example 16.7: Custom v4\_1 REST Entry point - ------------------------------------------------------------------------- - -
- 1 <?php - 2 chdir('../../..'); - 3 - 4 require_once 'SugarWebServiceImplv4_1_custom.php'; - 5 - 6 $webservice_path = 'service/core/SugarRestService.php'; - 7 $webservice_class = 'SugarRestService'; - 8 $webservice_impl_class = 'SugarWebServiceImplv4_1_custom'; - 9 $registry_path = 'custom/service/v4_1_custom/registry.php'; - 10 $registry_class = 'registry_v4_1_custom'; - 11 $location = 'custom/service/v4_1_custom/rest.php'; - 12 - 13 require_once 'service/core/webservice.php'; - -
- ------------------------------------------------------------------------- - -
-
-Example 16.8: Custom v4\_1 SOAP Entry point - ------------------------------------------------------------------------- - -
- 1 <?php - 2 chdir('../../..'); - 3 require_once('SugarWebServiceImplv4_1_custom.php'); - 4 $webservice_class = 'SugarSoapService2'; - 5 $webservice_path = 'service/v2/SugarSoapService2.php'; - 6 $webservice_impl_class = 'SugarWebServiceImplv4_1_custom'; - 7 $registry_class = 'registry_v4_1_custom'; - 8 $registry_path = 'custom/service/v4_1_custom/registry.php'; - 9 $location = 'custom/service/v4_1_custom/soap.php'; - 10 require_once('service/core/webservice.php'); - -
- ------------------------------------------------------------------------- - -
-#### Usage - -We can now use our custom endpoint. This is identical to using the API as detailed above, except that we use our custom entry point for either the SOAP WSDL or REST URL. For example using the same SuiteCRM location (`example.com/suitecrm`) as the above examples and using `v4_1`, we would use the following - -
-Example 16.9: Custom v4\_1 URLS - ------------------------------------------------------------------------- - -
- 1 //SOAP WSDL - 2 example.com/suitecrm/custom/service/v4_1_custom/soap.php?wsdl - 3 //REST URL - 4 example.com/suitecrm/custom/service/v4_1_custom/rest.php - -
- ------------------------------------------------------------------------- - -
-
- - -
-17. Best Practices ------------------------------------------------------- - -### Development instances - -When making changes you should always use a development or test instance first. This allows you to fully and safely test any changes. - -### Version control - -When developing customisations it is prudent to use some form of version control. Version control allows tracking changes to your codebase in addition to rolling back changes. There are many version control systems available. SuiteCRM uses [Git](http://git-scm.com/) although I also like [Mercurial](http://mercurial.selenic.com/). - -If you are using a development instance (as mentioned above) then Version Control usually allows you to push changes to other versions or to tag releases. This provides a way of pushing changes to live or test instances safely. Crucially it also means that, should there be major problems with a version then this can be easily rolled back. - -### Backup - -SuiteCRM has been developed to be customisable. However, mistakes, bugs and other unpleasantness can (and thanks to Murphy’s law, will) happen. You should always ensure, before making any changes, that you have a backup of all files and of the database. - -In order to back up files you can simply create a zip of the SuiteCRM directory and copy it to a safe place. On Linux systems this can be performed using the following: - -
-Example 17.1: File backup - ------------------------------------------------------------------------- - -
- tar -czvf suitecrmfilebackup.tar.gz /path/to/suitecrm - -
- ------------------------------------------------------------------------- - -
-Backing up the SuiteCRM database will vary depending on which database you are using. However MySQL backups can be performed using the `mysqldump` command on Linux as seen here: - -
-Example 17.2: MySQL Database backup - ------------------------------------------------------------------------- - -
- mysqldump suitecrmdatabase -u databaseuser -p | gzip -c | cat > suitecrm.sql.gz - -
- ------------------------------------------------------------------------- - -
-### Be upgrade safe - -Unless you are making changes to a custom module you should strive in all cases to use the custom framework and make changes in the custom folder. This ensures that, should you make a mistake, rectifying the mistake is as simple as removing the customisation. - -However the main advantage to using `custom` is that, when you upgrade SuiteCRM in the future you will not have your changes overwritten by the updated SuiteCRM files. See the [Extensions](#chap13.xhtml#extensions-chapter "wikilink") chapter for more information. - -### Use appropriate log levels - -Using appropriate log levels (See the chapter on [Logging](#chap10.xhtml#logging-chapter "wikilink")) makes it easier to track down issues. You do not want very important messages to be logged as `debug` since this will make them difficult to find. Likewise you don’t want unimportant log messages cluttering up the `fatal` log output. - -### Long running logic hooks - -If a logic hook task is long running then you should place it into the job queue (see the [Logic Hook](#chap11.xhtml#logic-hooks-chapter "wikilink") and [Scheduled Tasks](#chap12.xhtml#scheduled-tasks-chapter "wikilink") chapters). - -### Minimise SQL - -Where possible you should strive to use the SuiteCRM supplied methods of accessing data. This includes using beans and the BeanFactory where possible (see the chapter on [Working with beans](#chap02.xhtml#working-with-beans-chapter "wikilink")). There are a few reasons for this. The first is that SQL is usually either hardcoded or has to be dynamically built. In the case where the SQL is hardcoded this means that changes to fields will not be reflected thereby making your code more brittle. - -Dynamic SQL is better because it can react to field changes and generally be tailored to fit the situation. However this requires adding extra, often complex, code. It can be hard to account for all situations (this can be especially problematic when attempting to traverse relationships dynamically). - -Another issue is that, usually SQL will end up being Database specific (see the next point for mitigating this however). - -Finally any custom logic (such as Logic Hooks) which would usually be fired for saving beans or relationships will not be fired for SQL queries. - -### SQL Use - -In some cases using raw SQL is unavoidable. If that is the case then you should strive to use standard compliant SQL. If database engine specific features need to be used, and you wish to target other database engines, you can check for the DB type. For example: - -
-Example 17.1: Checking for the database engine - ------------------------------------------------------------------------- - -
- 1 function getSomeSQLQuery(){ - 2 global $sugar_config; - 3 switch($sugar_config['dbconfig']['db_type']){ - 4 case 'mssql': - 5 $sql = 'MSSQL specific SQL'; - 6 break; - 7 case 'mysql': - 8 default: - 9 $sql = 'MySQL specific SQL'; - 10 break; - 11 } - 12 return $sql; - 13 } - -
- ------------------------------------------------------------------------- - -
-### Entry check - -The majority of SuiteCRM files will start with some variation of the following line: - -
-Example 17.2: Entry check - ------------------------------------------------------------------------- - -
- if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); - -
- ------------------------------------------------------------------------- - -
-This prevents direct access to the file by ensuring that SuiteCRM has been loaded through a valid entry point (i.e. it has been loaded through index.php, cron.php or a custom entry point). - -### Redirect after post - -Sometimes you may have custom controller actions (see the controller section) or custom entry points (see the [Entry Points](#chap07.xhtml#entry-point-chapter "wikilink") chapter). These actions and entry points or other pages are usually accessed using POST. After a POST request it is a web best practice to redirect to a different page, especially if your page makes any changes. This prevents the user from refreshing the page and causing a duplicate action. Within SuiteCRM it is best to use the `SugarApplication::redirect` method to redirect. This simply accepts a URL. As follows: - -
-Example 17.3: Redirecting within SuiteCRM - ------------------------------------------------------------------------- - -
- SugarApplication::redirect('index.php?module=<TheModule>'); - -
- ------------------------------------------------------------------------- - -
-
- - -
-18. Performance Tweaks ----------------------------------------------------------- - -In most cases the performance of SuiteCRM should not be an issue. However in the case of large datasets or systems with many users you may notice some performance degradation. These changes can help improve performance. - -### Server - -The server that SuiteCRM runs on is, of course, very important when it comes to the kind of performance you can expect. A full guide on server setup is outside the scope of this book. However there are some things you can do to ensure that you get the best performance out of SuiteCRM. - -#### PHP - -Installing a PHP opcode cache will increase the performance of all PHP files. These work by caching the compilation of PHP files resulting in less work on each request. Furthermore SuiteCRM will use the caching API of some PHP accelerators which will further increase performance. If you are using Linux then [APC](http://php.net/manual/en/book.apc.php) is the usual choice. Windows users should check out [WinCache](http://php.net/manual/en/book.wincache.php). - -#### MySQL - -MySQL is notorious for having small default settings. Fully optimising MySQL is outside the scope of this book (however checkout [mysqltuner.pl](http://mysqltuner.pl) for a helpful Perl script which will provide setting recommendations - note that you should be careful when running files from an unknown source). One small change that can make a big difference is increasing the `innodb_buffer_pool_size`. - -If you have migrated or imported a significant amount of data it is possible that some tables will be fragmented. Running `OPTIMIZE TABLE tablename` can increase performance. - -### Indexes - -Adding indexes on the fields of modules can improve database performance. The core modules usually have important fields indexed. However if you have created a new module or added new, often searched fields to a module then these fields may benefit from being indexed. See the [Vardef](#chap03.xhtml#vardefs-chapter "wikilink") chapter for adding indexes. - -### Config Changes - -The following are some config settings that can be used to improve performance. Please note that in most cases you will have better performance gains by first following the steps in previous sections. These settings should be set in the config\_override.php file. See the chapter on the [Config](#chap09.xhtml#config-chapter "wikilink") files for more information. - -
-
- $sugar_config['developerMode'] = false; - -
-
-Unless you are actively developing on an instance developerMode should be off. Otherwise each page request will cause cached files to be reloaded. - -
-
- $sugar_config['disable_count_query'] = true; - -
-
-For systems with large amounts of data the count queries on subpanels used for the pagination controls can become slow thereby causing the page to be sluggish or outright slow to load. Disabling these queries can improve performance dramatically on some pages. - -
-
- $sugar_config['disable_vcr'] = true; - -
-
-By default opening the detail view of a record from the list view will also load the other records in the list to allow for easy moving through records. If you do not use this feature, or, if loading the detail view for some records has become slow, you can disable this feature. - -
-
- $sugar_config['list_max_entries_per_page'] = '10'; - -
-
-The number of records shown in each page of the list view can be decreased. This will result in a slight increase in performance on list view pages. - -
-
- $sugar_config['logger']['level'] = 'fatal'; - -
-
-Lowering the log level means that there will be less log messages to write to disk on each request. This will slightly (very slightly) increase performance. - -
- - -
-19. Further Resources ---------------------------------------------------------- - -Although this book has aimed to be a thorough resource, SuiteCRM is large and feature rich. Therefore it is not possible to include all the information you may require. Here are some extra resources for developing with SuiteCRM. - -### SuiteCRM Website - -The SuiteCRM website ([SuiteCRM.com](http://suitecrm.com) has many excellent resources including: - -- [SuiteCRM forums](https://suitecrm.com/forum/index) - come and say hi! -- [SuiteCRM Blog](https://suitecrm.com/suitecrm/blog) -- [SuiteCRM Wiki](https://suitecrm.com/wiki/index.php/Main_Page) - -### External SuiteCRM Resources - -[SuiteCRM GitHub](https://github.com/salesagility/SuiteCRM) -The SuiteCRM source code is hosted on GitHub. Here you can get bleeding edge code changes and even contribute code. - -### SugarCRM Resources - -SuiteCRM has strived to remain compatible with the SugarCRM community edition and much of the documentation is still valid. The appropriate version for SuiteCRM information is 6.5. Versions of documentation higher than this (i.e. 7) will probably not be relevant. - -- [SugarCRM Developer docs](http://support.sugarcrm.com/02_Documentation/04_Sugar_Developer/) -- [SugarCRM Developer Blog](http://developer.sugarcrm.com/) - -### Technical Links - -- [PHP](http://php.net/) - The main language used by SuiteCRM -- [Smarty](http://www.smarty.net/) - The templating language used throughout SuiteCRM. -- [XDebug](http://xdebug.org) - Debugging/profiling extension for PHP -- [Git](http://git-scm.com/) - Distributed version control system -- [YUI](http://yuilibrary.com/) - Legacy Javascript library used in SuiteCRM -- [JQuery](https://jquery.com/) - Javascript library used in SuiteCRM - to be preferred over YUI. -- [PHPMailer](https://github.com/PHPMailer/PHPMailer) Email library used in SuiteCRM -- [APC](http://php.net/manual/en/book.apc.php) - Alternative PHP Cache. PHP Opcode cache supported by SuiteCRM -- [WinCache](http://php.net/manual/en/book.wincache.php) - Windows PHP cache. PHP Opcode cache supported by SuiteCRM -- [PHPStorm](https://www.jetbrains.com/phpstorm/) - PHP IDE (Paid) -- [Eclipse PHP Development Tools](https://eclipse.org/pdt/) - PHP IDE (Free and Open Source) - -### Other Links - -- [SalesAgility](https://salesagility.com/) - The company behind SuiteCRM. -- [Jim Mackin](http://www.jsmackin.co.uk) - Me :) - -
- - -
-20. Appendix A - Code Examples ------------------------------------------------------------------- - -### Metadata - -This is an example of setting up a function subpanel (see the [Metadata](#chap05.xhtml#metadata-chapter "wikilink") chapter for more information). - -In this example the cases module has a custom field `incident_code_c` which is used to track cases with the same root cause. We’ll add a subpanel to show all cases that have the same `incident_code_c`. - -Initially we add to the `subpanel_setup` section of Cases by creating the following file in `custom/Extension/modules/Cases/Ext/Layoutdefs/IncidentLayoutdefs.php` - -
-Example A.1: `IncidentLayoutdefs.php` - ------------------------------------------------------------------------- - -
- 1 <?php - 2 $layout_defs["Cases"]["subpanel_setup"]['incident_cases'] = array( - 3 'module' => 'Cases', - 4 'title_key' => 'LBL_INCIDENT_CASES', - 5 'subpanel_name' => 'default', - 6 'get_subpanel_data' => 'function:get_cases_by_incident', - 7 'function_parameters' => - 8 array('import_function_file' => 'custom/modules/Cases/IncidentUtils.ph\ - 9 p',), - 10 ); - -
- ------------------------------------------------------------------------- - -
-Next we create the file which will define our `get_cases_by_incident` function `custom/modules/Cases/IncidentUtils.php`. - -
-Example A.2: `IncidentUtils.php` - ------------------------------------------------------------------------- - -
- 1 <?php - 2 function get_cases_by_incident(){ - 3 global $db; - 4 //Get the current bean - 5 $bean = $GLOBALS['app']->controller->bean; - 6 $incidentCode = $db->quote($bean->incident_code_c); - 7 //Create the SQL array - 8 $ret = array(); - 9 $ret['select'] = ' SELECT id FROM cases '; - 10 $ret['from'] = ' FROM cases '; - 11 $ret['join'] = ""; - 12 //Get all cases where the incident code matches but exclude the current \ - 13 case. - 14 $ret['where']="WHERE cases.deleted = 0 AND cases_cstm.incident_code_c = \ - 15 '{$incidentCode}' AND cases.id != '{$bean->id}'"; - 16 return $ret; - 17 } - -
- ------------------------------------------------------------------------- - -
-### Module Installer - -The following is a basic example manifest file. See the [Module Installer](#chap14.xhtml#module-installer-chapter "wikilink") chapter. - -
-Example A.3: Example manifest file - ------------------------------------------------------------------------- - -
- 1 $manifest = array( - 2 'name' => 'Example manifest', - 3 'description' => 'A basic manifest example', - 4 'version' => '1.2.3', - 5 'author' => 'Jim Mackin', - 6 'readme' => 'This is a manifest example for the SuiteCRM for Developers book', - 7 'acceptable_sugar_flavors' => array('CE'), - 8 'acceptable_sugar_versions' => array( - 9 'exact_matches' => array('6.5.20',), - 10 ), - 11 'dependencies' => array( - 12 array( - 13 'id_name' => 'hello_world', - 14 'version' => '3.2.1' - 15 ), - 16 ), - 17 'icon' => 'ManifestExample.png', - 18 'is_uninstallable' => true, - 19 'published_date' => '2015-05-05', - 20 'type' => 'module', - 21 'remove_tables' => 'prompt', - 22 ); - 23 $installdefs = array( - 24 'id' => 'suitecrmfordevelopers_example_manifest', - 25 'image_dir' => '/images/', - 26 'copy' => array( - 27 array( - 28 'from' => '/modules/ExampleModule', - 29 'to' => 'modules/ExampleModule', - 30 ), - 31 ), - 32 'dashlets' => array( - 33 array( - 34 'from' => '/modules/ExampleModule/Dashlets/', - 35 'name' => 'ExampleModuleDashlet' - 36 ) - 37 ), - 38 'language' => array( - 39 array( - 40 'from' => 'application/language/en_us.examplemoduleadmin.php', - 41 'to_module' => 'application', - 42 'language' => 'en_us' - 43 ), - 44 array( - 45 'from' => '/modules/Accounts/language/en_us.examplemodule.php', - 46 'to_module' => 'Accounts', - 47 'language' => 'en_us' - 48 ), - 49 array( - 50 'from' => '/application/language/es_es.examplemoduleadmin.php', - 51 'to_module' => 'application', - 52 'language' => 'es_es' - 53 ), - 54 array( - 55 'from' => '/modules/Accounts/language/es_es.examplemodule.php', - 56 'to_module' => 'Accounts', - 57 'language' => 'es_es' - 58 ), - 59 ), - 60 'custom_fields' => array( - 61 array( - 62 'name' => 'example_field', - 63 'label' => 'Example Field', - 64 'type' => 'varchar', - 65 'max_size' => 100, - 66 'module' => 'Accounts', - 67 ), - 68 ), - 69 'vardefs' => array( - 70 array( - 71 'from' => 'modules/Accounts/vardefs/examplemodule_vardefs.php', - 72 'to_module' => 'Accounts', - 73 ), - 74 ), - 75 'beans' => array( - 76 array( - 77 'module' => 'ExampleModule', - 78 'class' => 'ExampleModule', - 79 'path' => 'modules/ExampleModule/ExampleModule.php', - 80 ), - 81 ), - 82 'logic_hooks' => array( - 83 array( - 84 'module' => 'Accounts', - 85 'hook' => 'before_save', - 86 'order' => 100, - 87 'description' => 'Example module before save hook', - 88 'file' => 'modules/ExampleModule/ExampleModuleHook.php', - 89 'class' => 'ExampleModuleLogicHooks', - 90 'function' => 'accounts_before_save', - 91 ), - 92 ), - 93 'administration' => array( - 94 array( - 95 'from' => 'modules/administration/examplemodule_admin.php', - 96 ), - 97 ), - 98 ); - 99 $upgrade_manifest = array( - 100 ); - -
- ------------------------------------------------------------------------- - -
-
- - -
-21. Appendix B - API Methods ----------------------------------------------------------------- - -### Methods - -#### login - -Logs into SuiteCRM and returns a session id used for subsequent API calls. - -##### Arguments - -login arguments - -| Name | Type | Desc | -|-----------------------------------|-------------------|----------------------------------------------------------------------------| -| user\_auth | array | Authentication details for the API User | -| user\_auth\[user\_name\] | string | The user name of the SuiteCRM user. Required. | -| user\_auth\[password\] | string | The MD5 hash of the password for user\_name. Required. | -| application\_name | string | An identifier for the application accessing the API | -| name\_value\_list | name\_value\_list | An array of login options | -| name\_value\_list\[language\] | string | The language for this user | -| name\_value\_list\[notifyonsave\] | bool | Send email notifications when a new record is saved and assigned to a user | - -##### Response - -login response - -| Name | Type | Desc | -|-----------------------------------------------------|-------------------|----------------------------------------------------------------------------------------------------------------| -| id | string | The session id for this login. Required for all other API calls. | -| name\_value\_list | name\_value\_list | An array containing information about this user. | -| name\_value\_list\[user\_id\] | string | The id of the logged in user. | -| name\_value\_list\[user\_name\] | string | The user\_name of the logged in user | -| name\_value\_list\[user\_language\] | string | The language setting of the logged in user | -| name\_value\_list\[user\_currency\_id\] | string | The id of the currency of the logged in user. -99 is the default currency. | -| name\_value\_list\[user\_currency\_name\] | string | The name of the currency of the logged in user. | -| name\_value\_list\[user\_is\_admin\] | bool | Whether the logged in user is an admin | -| name\_value\_list\[user\_default\_team\_id\] | string | The default team of the logged in user. This value comes from before the fork of SuiteCRM and isn’t used. | -| name\_value\_list\[user\_default\_dateformat\] | string | The default date format of the logged in user. | -| name\_value\_list\[user\_default\_timeformat\] | string | The default time format of the logged in user | -| name\_value\_list\[user\_number\_seperator\] | string | The number separator of the logged in user. (I.e. comma for numbers in the 1,000.00 format) | -| name\_value\_list\[user\_decimal\_seperator\] | string | The decimal separator of the logged in user. (I.e. period for numbers in the 1,000.00 format) | -| name\_value\_list\[mobile\_max\_list\_entries\] | int | Max list entries for the logged in user (simply grabs the wl\_list\_max\_entries\_per\_subpanel config key) | -| name\_value\_list\[mobile\_max\_subpanel\_entries\] | int | Max subpanel entries for the logged in user(simply grabs the wl\_list\_max\_entries\_per\_subpanel config key) | - -#### logout - -Logs the web user out of SuiteCRM and destroys the session. - -##### Arguments - -logout arguments - -| Name | Type | Desc | -|---------|--------|----------------------------| -| session | string | The session id. See login. | - -##### Response - -No response. - -#### get\_available\_modules - -Returns a list of the modules available for use. Also returns the ACL (Access Control List) for each module. - -##### Arguments - -get\_available\_modules arguments - -| Name | Type | Desc | -|---------|--------|-------------------------------------------------------------------| -| session | string | The session id. See login. | -| filter | string | Filter the modules returned. Either ‘default’, ‘mobile’ or ‘all’. | - -##### Response - -get\_available\_modules response - -| Name | Type | Desc | -|-----------------------------------|--------|---------------------------------------------------------------------------| -| modules | array | An array containing the module details. | -| modules\[\]\[module\_key\] | string | The key for this module | -| modules\[\]\[module\_label\] | string | The label for this module | -| modules\[\]\[favorite\_enabled\] | bool | Favorites were SugarCRM Professional functionality. This is always empty. | -| modules\[\]\[acls\] | array | An array containing the ACL list - that is what actions are allowed. | -| modules\[\]\[acls\]\[\]\[action\] | string | The action i.e. edit, delete, list etc. | -| modules\[\]\[acls\]\[\]\[access\] | bool | Whether or not access is allowed. | - -#### get\_document\_revision - -Returns the details for a specific document revision. - -##### Arguments - -get\_document\_revision arguments - -| Name | Type | Desc | -|---------|--------|---------------------------------------------| -| session | string | The session id. See login. | -| i | string | The id of the document revision to retrieve | - -##### Response - -get\_document\_revision response - -| Name | Type | Desc | -|--------------------------------------|---------------|---------------------------------------------------| -| document\_revision | array | An array containing the document revision details | -| document\_revision\[id\] | string | The id of the document revision. | -| document\_revision\[document\_name\] | string | The name of the document revision | -| document\_revision\[revision\] | int | The revision number of the document revision. | -| document\_revision\[filename\] | string | The filename of the file | -| document\_revision\[file\] | binary string | The full contents of the file | - -#### get\_entries - -Gets a list of entries for a specific module and list of module ids. Optionally allows returning related records. - -##### Arguments - -get\_entries arguments - -| Name | Type | Desc | -|------------------------------------------------|-------------------|----------------------------------------------------------------------| -| session | string | The session id. See login. | -| module\_name | string | The name of the module to display entries for. | -| ids | array | An array of record ids to fetch | -| ids\[\] | string | An individual id | -| select\_fields | array | An array of fields to return. An empty array will return all fields. | -| select\_fields\[\] | string | The name of a field to return | -| link\_name\_to\_fields\_array | name\_value\_list | An array of relationships to retrieved. | -| link\_name\_to\_fields\_array\[\]\[name\] | string | The name of the link to follow (as defined in `module_name`). | -| link\_name\_to\_fields\_array\[\]\[value\] | array | An array of the fields to return for this related module. | -| link\_name\_to\_fields\_array\[\]\[value\]\[\] | string | The field name | -| track\_view | bool | Whether to mark these records as recently viewed. | - -##### Response - -get\_entries response - -| Name | Type | Desc | -|-----------------------------------------------------------------------------|-------------------|-------------------------------------------------------------------------------| -| entry\_list | array | An array of records. | -| entry\_list\[\] | array | Details for an individual record. | -| entry\_list\[\]\[id\] | string | The id of this record. | -| entry\_list\[\]\[module\_name\] | string | The name of the module this record belongs to. | -| entry\_list\[\]\[name\_value\_list\] | name\_value\_list | An array containing each returned field. | -| entry\_list\[\]\[name\_value\_list\]\[\] | array | Details for an individual field. | -| entry\_list\[\]\[name\_value\_list\]\[\]\[name\] | string | The name of the field. | -| entry\_list\[\]\[name\_value\_list\]\[\]\[value\] | string | The value of the field. | -| relationship\_list | array | An array of arrays containing the relationships for the corresponding record. | -| relationship\_list\[\] | array | The relationships for the corresponding record. | -| relationship\_list\[link\_list\] | array | The list of relationships for this record. | -| relationship\_list\[link\_list\]\[\] | array | Details of a single relationship. | -| relationship\_list\[link\_list\]\[\]\[name\] | string | The name of this relationship. | -| relationship\_list\[link\_list\]\[\]\[records\] | array | The related records for this relationship. | -| relationship\_list\[link\_list\]\[\]\[records\]\[\] | array | Details of a single related record. | -| relationship\_list\[link\_list\]\[\]\[records\]\[\]\[link\_value\] | name\_value\_list | An array of the requested fields for this relationship. | -| relationship\_list\[link\_list\]\[\]\[records\]\[\]\[link\_value\]\[\] | array | A name value pair for this particular field. | -| relationship\_list\[link\_list\]\[\]\[records\]\[\]\[link\_value\]\[name\] | string | The name of the field. | -| relationship\_list\[link\_list\]\[\]\[records\]\[\]\[link\_value\]\[value\] | string | The value of the field. | - -#### get\_entries\_count - -Returns a count of entries matching the given query. - -##### Arguments - -get\_entries\_count arguments - -| Name | Type | Desc | -|--------------|--------|------------------------------------------------| -| session | string | The session id. See login. | -| module\_name | string | The name of the module to display entries for. | -| query | string | An SQL WHERE clause to apply to the query. | -| deleted | bool | Whether to include deleted records | - -##### Response - -get\_entries\_count response - -| Name | Type | Desc | -|---------------|------|--------------------------------| -| result\_count | int | The count of matching entries. | - -#### get\_entry - -Returns the details for a single record. Optionally allows returning related records. - -##### Arguments - -get\_entry arguments - -| Name | Type | Desc | -|------------------------------------------------|-------------------|----------------------------------------------------------------------| -| session | string | The session id. See login. | -| module\_name | string | The name of the module to fetch the entry for. | -| id | string | The id of the record to fetch | -| select\_fields | array | An array of fields to return. An empty array will return all fields. | -| select\_fields\[\] | string | The name of a field to return | -| link\_name\_to\_fields\_array | name\_value\_list | An array of relationships to retrieved. | -| link\_name\_to\_fields\_array\[\]\[name\] | string | The name of the link to follow (as defined in `module_name`). | -| link\_name\_to\_fields\_array\[\]\[value\] | array | An array of the fields to return for this related module. | -| link\_name\_to\_fields\_array\[\]\[value\]\[\] | string | The field name | -| track\_view | bool | Whether to mark these records as recently viewed. | - -##### Response - -Identical to the response by `get_entries` except only one record will be returned. - -#### `get_entry_list` - -##### Arguments - -get\_entry\_list arguments - -| Name | Type | Desc | -|------------------------------------------------|-------------------|----------------------------------------------------------------------| -| session | string | The session id. See login. | -| module\_name | string | The name of the module to fetch the entry for. | -| query | string | An SQL WHERE clause to apply to the query. | -| order\_by | string | In theory for ordering results but this is unused. | -| offset | int | The result offset. Useful for pagination. | -| select\_fields | array | An array of fields to return. An empty array will return all fields. | -| select\_fields\[\] | string | The name of a field to return | -| link\_name\_to\_fields\_array | name\_value\_list | An array of relationships to retrieved. | -| link\_name\_to\_fields\_array\[\]\[name\] | string | The name of the link to follow (as defined in `module_name`). | -| link\_name\_to\_fields\_array\[\]\[value\] | array | An array of the fields to return for this related module. | -| link\_name\_to\_fields\_array\[\]\[value\]\[\] | string | The field name | -| max\_results | int | The maximum number of results to return. Useful for pagination. | -| deleted | bool | Whether to include deleted records. | -| favorites | bool | Favorites were SugarCRM Professional functionality. This is unused. | - -##### Response - -get\_entry\_list response - -| Name | Type | Desc | -|-----------------------------------------------------------------------------|-------------------|-------------------------------------------------------------------------------| -| result\_count | int | The number of returned records. | -| total\_count | int | The total number of records matching the query. | -| next\_offset | int | The offset of the next set of records. | -| entry\_list | array | An array of records. | -| entry\_list\[\] | array | Details for an individual record. | -| entry\_list\[\]\[id\] | string | The id of this record. | -| entry\_list\[\]\[module\_name\] | string | The name of the module this record belongs to. | -| entry\_list\[\]\[name\_value\_list\] | name\_value\_list | An array containing each returned field. | -| entry\_list\[\]\[name\_value\_list\]\[\] | array | Details for an individual field. | -| entry\_list\[\]\[name\_value\_list\]\[\]\[name\] | string | The name of the field. | -| entry\_list\[\]\[name\_value\_list\]\[\]\[value\] | string | The value of the field. | -| relationship\_list | array | An array of arrays containing the relationships for the corresponding record. | -| relationship\_list\[\] | array | The relationships for the corresponding record. | -| relationship\_list\[link\_list\] | array | The list of relationships for this record. | -| relationship\_list\[link\_list\]\[\] | array | Details of a single relationship. | -| relationship\_list\[link\_list\]\[\]\[name\] | string | The name of this relationship. | -| relationship\_list\[link\_list\]\[\]\[records\] | array | The related records for this relationship. | -| relationship\_list\[link\_list\]\[\]\[records\]\[\] | array | Details of a single related record. | -| relationship\_list\[link\_list\]\[\]\[records\]\[\]\[link\_value\] | name\_value\_list | An array of the requested fields for this relationship. | -| relationship\_list\[link\_list\]\[\]\[records\]\[\]\[link\_value\]\[\] | array | A name value pair for this particular field. | -| relationship\_list\[link\_list\]\[\]\[records\]\[\]\[link\_value\]\[name\] | string | The name of the field. | -| relationship\_list\[link\_list\]\[\]\[records\]\[\]\[link\_value\]\[value\] | string | The value of the field. | - -#### get\_language\_definition - -Returns - -##### Arguments - -get\_language\_definition arguments - -| Name | Type | Desc | -|-------------|--------|---------------------------------------------------------------------------------| -| session | string | The session id. See login. | -| modules | array | An array of the modules to return language labels for | -| modules\[\] | string | The modules name. | -| md5 | bool | Whether to return the md5 for each module. Can be useful for caching responses. | - -##### Response - -get\_language\_definition response - -| Name | Type | Desc | -|-------------------------------------------------|--------------|------------------------------------------------------------------| -| result\[<modulename>\]</modulename> | string/array | An array of the labels or an md5 string for <modulename /> | - -#### `get_last_viewed` - -Returns a list of the most recently viewed modules for the current user. - -##### Arguments - -get\_last\_viewed arguments - -| Name | Type | Desc | -|-------------------|--------|----------------------------------------------------------------| -| session | string | The session id. See login. | -| module\_names | array | An array of the modules to return the last viewed records for. | -| module\_names\[\] | string | The modules name. | - -##### Response - -get\_last\_viewed response - -| Name | Type | Desc | -|------------------------------|--------|-------------------------------------------------------| -| result\[\] | array | An array of the details of recently viewed records | -| result\[\]\[id\] | int | The id of the tracker row for this viewing | -| result\[\]\[item\_id\] | string | The id of the viewed record. | -| result\[\]\[item\_summary\] | string | The summary of the record. This is usually it’s name. | -| result\[\]\[module\_name\] | string | The module for this record. | -| result\[\]\[monitor\_id\] | string | The monitor id for this viewing. Legacy and unused. | -| result\[\]\[date\_modified\] | string | The date that this record was viewed. | - -#### `get_modified_relationships` - -Returns a list of the modified relationships for the current user between one of the Calls, Meetings or Contacts modules. - -##### Arguments - -get\_modified\_relationships arguments - -| Name | Type | Desc | -|--------------------|--------|------------------------------------------------------------------------------------------------------| -| session | string | The session id. See login. | -| module\_name | string | The name of the module to retrieve relationships for. Always `Users`. | -| related\_module | string | The related module to retrieve records for. One of `Meetings`, `Calls` or `Contacts`. | -| from\_date | string | The start date of the range to search. In the format `Y-m-d H:i:s`. | -| to\_date | string | The end date of the range to search. In the format `Y-m-d H:i:s`. | -| offset | int | The record offset to start with. | -| max\_results | int | The maximum number of results to return. | -| deleted | bool | Whether to include deleted records. | -| module\_user\_id | string | In theory the id of the user to return relationships for. However the current user is always used. | -| select\_fields | array | An array of the fields to return for the relationship record. An empty array will return all fields. | -| select\_fields\[\] | string | The name of the field to return. | -| relationship\_name | string | The name of the relationship between `module_name` and `related_module`. | -| deletion\_date | string | A start date for the range in which to return deleted records. In the format `Y-m-d H:i:s`. | - -##### Response - -get\_modified\_relationships response - -| Name | Type | Desc | -|---------------------------------------------------|-------------------|------------------------------------------------| -| result\_count | int | The number of returned records. | -| next\_offset | int | The offset of the next set of records. | -| entry\_list | array | An array of the returned records. | -| entry\_list\[\] | array | Details for an individual record. | -| entry\_list\[\]\[id\] | string | The id of this record. | -| entry\_list\[\]\[module\_name\] | string | The name of the module this record belongs to. | -| entry\_list\[\]\[name\_value\_list\] | name\_value\_list | An array containing each returned field. | -| entry\_list\[\]\[name\_value\_list\]\[\] | array | A name value pair of the field information. | -| entry\_list\[\]\[name\_value\_list\]\[\]\[name\] | string | The name of the field. | -| entry\_list\[\]\[name\_value\_list\]\[\]\[value\] | string | The value of the field. | -| error | array | An array containing the error details. | -| error\[number\] | int | The error number of the error that occurred. | -| error\[name\] | string | The name of the error that occurred. | -| error\[description\] | string | A description of the error that occurred. | - -#### `get_module_fields` - -Returns the field definitions for a given module. - -##### Arguments - -get\_module\_fields arguments - -| Name | Type | Desc | -|--------------|--------|--------------------------------------------------------------------------------------| -| session | string | The session id. See login. | -| module\_name | string | The name of the module to return field definitions for. | -| fields | array | An array of fields to return definitions for. An empty array will return all fields. | -| fields\[\] | string | The name of the field. | - -##### Response - -get\_module\_fields response - -| Name | Type | Desc | -|----------------------------------------|-------------------|-----------------------------------------------------------------------------------------------------------------| -| module\_name | string | The name of the module. | -| table\_name | string | The name of the database table for this module. | -| module\_fields | array | An array of the requested fields for this module. | -| module\_fields\[\] | array | The details of a specific field. | -| module\_fields\[name\] | string | The name of the field. | -| module\_fields\[type\] | string | The type of the field. | -| module\_fields\[group\] | string | The group of fields that this field belongs to. Used for addresses or link definitions. | -| module\_fields\[id\_name\] | string | The name of the id field on this module for this link if appropriate. | -| module\_fields\[label\] | string | The display label for this field. | -| module\_fields\[required\] | bool | Whether this field is required or not. | -| module\_fields\[options\] | name\_value\_list | An array of possible options for this field. An empty array if options are not appropriate for this field type. | -| module\_fields\[options\]\[\] | array | A name value pair of a single option. | -| module\_fields\[options\]\[\]\[name\] | string | The options key. | -| module\_fields\[options\]\[\]\[value\] | string | The options display value. | -| module\_fields\[related\_module\] | string | The related module for this field if it is a related type. Empty otherwise. | -| module\_fields\[calculated\] | string | Calculated fields were a SugarCRM professional feature. Will be empty. | -| module\_fields\[len\] | int | The length of this field or an empty string if this is not appropriate for this field type. | -| link\_fields | array | An array of the requested link fields for this module. | -| link\_fields\[\] | array | The details of a specific field. | -| link\_fields\[name\] | string | The name of the field. | -| link\_fields\[type\] | string | The type of the field. Will always be link. | -| link\_fields\[group\] | string | The group of fields that this field belongs to. Will be empty for links. | -| link\_fields\[id\_name\] | string | The name of the id field on this module for this link if appropriate. | -| link\_fields\[relationship\] | string | The relationship name for this link. | -| link\_fields\[module\] | string | The module this field links to. | -| link\_fields\[bean\_name\] | string | The bean that this field links to. | - -#### `get_module_fields_md5` - -Returns an md5 of the a modules field definitions. Useful for caching. - -##### Arguments - -get\_module\_fields\_md5 arguments - -| Name | Type | Desc | -|-------------------|--------|-----------------------------------------------------------------| -| session | string | The session id. See login. | -| module\_names | array | An array of modules to return the md5 for. | -| module\_names\[\] | string | The name of the module to return the field definitions md5 for. | - -##### Response - -get\_module\_fields\_md5 response - -| Name | Type | Desc | -|-------------------------------------------------|--------|-------------------------------------------------| -| result\[\] | array | An array of the md5’s keyed by the module name. | -| result\[<modulename>\]</modulename> | string | The md5 string for <modulename /> | - -#### `get_module_layout` - -Returns the layout for specified modules and views. Optionally returns an md5 of the layouts. - -##### Arguments - -get\_module\_layout arguments - -| Name | Type | Desc | -|-------------|--------|-----------------------------------------------------------------------------------| -| session | string | The session id. See login. | -| modules | array | An array of the modules to return layouts for. | -| modules\[\] | string | The name of the module. | -| types | array | An array of the types of views to return. Only `default` is supported. | -| types\[\] | string | The type of the views. | -| views | array | An array of the views to return. One of `edit`, `detail`, `list` and `subpanel`. | -| views\[\] | string | The name of the view. | -| acl\_check | bool | Whether or not to check that the current user has access to this module and view. | -| md5 | bool | Whether or not to return the view as an md5 string. Useful for caching. | - -##### Response - -get\_module\_layout response - -| Name | Type | Desc | -|-------------------------------------------------------------------------------------------------|--------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| result | array | The array of results keyed by module name. | -| result\[<modulename>\]</modulename> | array | An array of layouts for <modulename>.</modulename> | -| result\[<modulename>\]\[default\]</modulename> | array | An array of the layouts keyed by the view name. | -| result\[<modulename>\]\[default\]\[<viewname>\]</viewname></modulename> | array/string | The layout of the view <viewname> for the module <modulename> or an md5 of the layout. See the section on metadata for the layout format.</modulename></viewname> | - -#### `get_module_layout_md5` - -Returns the md5 of the specified views for the specified modules. Behaves identically to get\_module\_layout with the md5 parameter set to true. - -##### Arguments - -get\_module\_layout arguments - -| Name | Type | Desc | -|-------------|--------|-----------------------------------------------------------------------------------| -| session | string | The session id. See login. | -| modules | array | An array of the modules to return layouts for. | -| modules\[\] | string | The name of the module. | -| types | array | An array of the types of views to return. Only `default` is supported. | -| types\[\] | string | The type of the views. | -| views | array | An array of the views to return. One of `edit`, `detail`, `list` and `subpanel`. | -| views\[\] | string | The name of the view. | -| acl\_check | bool | Whether or not to check that the current user has access to this module and view. | - -##### Response - -get\_module\_layout\_md5 response - -| Name | Type | Desc | -|----------------------------------------------------------------------------------------------|--------|----------------------------------------------------------------------------------------------------------------------------------| -| md5 | array | The array of results keyed by module name. | -| md5\[<modulename>\]</modulename> | array | An array of layouts for <modulename>.</modulename> | -| md5\[<modulename>\]\[default\]</modulename> | array | An array of the layouts keyed by the view name. | -| md5\[<modulename>\]\[default\]\[<viewname>\]</viewname></modulename> | string | The md5 of the layout layout of the view <viewname> for the module <modulename>.</modulename></viewname> | - -#### `get_relationships` - -Returns related records given a specific module, record and list of links. \#\#\#\#Arguments - -get\_relationships arguments - -| Name | Type | Desc |   | -|-----------------------------------------------------------------|-------------------|------------------------------------------------------------|-----| -| session | string | The session id. See login. |   | -| module\_name | string | The module to return relationships for. |   | -| module\_id | string | The record to return relationships for. |   | -| link\_field\_name | string | The link field to follow for this record. |   | -| related\_module\_query | string | A WHERE clause to use to filter the related modules by. |   | -| related\_fields | array | An array of the fields to return for matching records. |   | -| related\_fields\[\] | string | The name of the field. |   | -| related\_module\_link\_name\_to\_fields\_array | name\_value\_list | An array of related fields to return for matching records. |   | -| related\_module\_link\_name\_to\_fields\_array\[\] | array | Details for a specific link. |   | -| related\_module\_link\_name\_to\_fields\_array\[\]\[name\] | string | The name of the link to follow for matching records. |   | -| related\_module\_link\_name\_to\_fields\_array\[\]\[value\] | array | An array of fields to return for this link. |   | -| related\_module\_link\_name\_to\_fields\_array\[\]\[value\]\[\] | string | The field name. |   | -| deleted | bool | Whether to include deleted records. |   | -| order\_by | string | In theory for ordering results but this is unused. |   | -| offset | int | The record offset to start with. |   | -| limit | int | The maximum number of results to return. |   | - -##### Response - -Identical to the response by `get_entries`. - -#### `get_server_info` - -Returns information about the SuiteCRM server. Currently still returns information about the SugarCRM flavor and versions. - -##### Arguments - -No arguments. - -##### Response - -get\_server\_info response - -| Name | Type | Desc | -|-----------|--------|----------------------------------------------------------------------------| -| flavor | string | The SugarCRM flavor. For SuiteCRM will always be ‘CE’. | -| version | string | The SugarCRM version. Note this this is distinct from the SuiteCRM version | -| gmt\_time | string | The server time in UTC. | - -#### `get_upcoming_activities` - -Returns a list of the 10 upcoming activities (Meetings, Calls and Tasks - also includes Opportunities) for the currently logged in user. - -##### Arguments - -get\_upcoming\_activities arguments - -| Name | Type | Desc | -|---------|--------|----------------------------| -| session | string | The session id. See login. | - -##### Response - -get\_upcoming\_activities response - -| Name | Type | Desc | -|-------------------------|--------|---------------------------------------------------------| -| result | array | An array of the upcoming activities. | -| result\[\] | array | The details of a single activity. | -| result\[\]\[id\] | string | The id of this activity. | -| result\[\]\[module\] | string | The module for this activity. | -| result\[\]\[date\_due\] | string | The due date for this activity. | -| result\[\]\[summary\] | string | The summary of this activity. Usually simply it’s name. | - -#### `get_user_id` - -Returns the id of the currently logged in user. - -##### Arguments - -get\_user\_id arguments - -| Name | Type | Desc | -|---------|--------|----------------------------| -| session | string | The session id. See login. | - -##### Response - -get\_user\_id response - -| Name | Type | Desc | -|------|--------|-----------------------------| -| id | string | The id of the current user. | - -#### `seamless_login` - -Marks a session as allowing a seamless login. If successful then the session id (see the login call) can be used in a URL (as MSID) to log the user into SuiteCRM in the browser seamlessly. For example if you have the session id `1234` then accessing the URL `example.com/index.php?MSID=1234`. The MSID parameter can be used in any valid SuiteCRM URL. - -##### Arguments - -seamless\_login arguments - -| Name | Type | Desc | -|---------|--------|----------------------------| -| session | string | The session id. See login. | - -##### Response - -seamless\_login response - -| Name | Type | Desc | -|--------|------|----------------------------| -| result | bool | Boolean indicating success | - -#### `search_by_module` - -Allows searching for records that contain a specific search string. - -##### Arguments - -search\_by\_module arguments - -| Name | Type | Desc | -|-----------------------|--------|------------------------------------------------------------------------------------------------| -| session | string | The session id. See login. | -| search\_string | string | The string to search for. | -| modules | array | An array of the modules to include in the search. | -| modules\[\] | string | The modules name. | -| offset | int | The result offset. Useful for pagination. | -| max\_results | int | The maximum number of results to return. Useful for pagination. | -| assigned\_user\_id | string | Filter by the given assigned user. Leave blank to do no user filtering. | -| select\_fields | array | An array of the fields to return for the found records. An empty array will return all fields. | -| select\_fields\[\] | string | The name of the field to return. | -| unified\_search\_only | bool | Whether to only return records for modules that participate in the global search. | -| favorites | bool | Favorites were SugarCRM Professional functionality. This is unused. | - -##### Response - -search\_by\_module response - -| Name | Type | Desc | -|----------------------------------------|-------------------|--------------------------------------------------------------| -| entry\_list | array | An array of the results for each module. | -| entry\_list\[\] | array | Results for a specific module. | -| entry\_list\[\]\[name\] | string | The name of the module that this entry contains results for. | -| entry\_list\[\]\[records\] | array | An array of the record results. | -| entry\_list\[\]\[records\]\[\] | name\_value\_list | A name value list of records id and name. | -| entry\_list\[\]\[records\]\[\]\[id\] | array | A name value pair containing the id of this record. | -| entry\_list\[\]\[records\]\[\]\[name\] | array | A name value pair containing the name of this record. | - -#### `set_document_revision` - -Creates a new document revision for a document. - -##### Arguments - -set\_document\_revision arguments - -| Name | Type | Desc | -|------------------|---------------|----------------------------------------------------| -| session | string | The session id. See login. | -| note | array | An array containing the document revision details. | -| note\[id\] | string | The id of the document to add this revision to. | -| note\[file\] | binary string | The binary contents of the file, base 64 encoded. | -| note\[filename\] | string | The name of the file. | -| note\[revision\] | int | The revision number for this revision. | - -##### Response - -set\_document\_revision response - -| Name | Type | Desc | -|------|--------|------------------------------------------------| -| id | string | The id of the newly created document revision. | - -#### `set_entries` - -Creates or updates a list of records. - -##### Arguments - -Note: Supplying a value for the id field will perform an update for that record. - -set\_entries arguments - -| Name | Type | Desc | -|-------------------------------------|-------------------|-----------------------------------------------------------| -| session | string | The session id. See login. | -| module\_name | string | The name of the module to create/update records for. | -| name\_value\_lists | name\_value\_list | An array of the details for each record to create/update. | -| name\_value\_lists\[\] | array | Details of an individual record. | -| name\_value\_lists\[\]\[\] | array | A name value pair for each field value. | -| name\_value\_lists\[\]\[\]\[name\] | array | The name of the field. | -| name\_value\_lists\[\]\[\]\[value\] | array | The value for the field. | - -##### Response - -set\_entries response - -| Name | Type | Desc | -|---------|-------|------------------------------------------------------------------------------------------------------| -| ids | array | An array of the resulting ids. Returned in the same order as specified in the call to `set_entries`. | -| ids\[\] | array | The id for this record. | - -#### `set_entry` - -Creates or updates a single record. - -##### Arguments - -Note: Supplying a value for the id field will perform an update for that record. - -set\_entries arguments - -| Name | Type | Desc | -|---------------------------------|-------------------|-------------------------------------------------------| -| session | string | The session id. See login. | -| module\_name | string | The name of the module to create/update a record for. | -| name\_value\_list | name\_value\_list | An array of the fields for the new/updated record. | -| name\_value\_lists\[\] | array | A name value pair for each field value. | -| name\_value\_lists\[\]\[name\] | array | The name of the field. | -| name\_value\_lists\[\]\[value\] | array | The value for the field. | - -##### Response - -set\_entries response - -| Name | Type | Desc | -|------|--------|------------------------------------------------| -| id | string | The id of the newly created or updated record. | - -#### `get_note_attachment` - -Returns the details of a given note attachment. - -##### Arguments - -get\_note\_attachment arguments - -| Name | Type | Desc | -|---------|--------|-------------------------------------------------| -| session | string | The session id. See login. | -| id | string | The id of the note to retrieve information for. | - -##### Response - -get\_note\_attachment response - -| Name | Type | Desc | -|-------------------------------------------|---------------|--------------------------------------------------------------| -| note\_attachment | array | The details for the note attachment. | -| note\_attachment\[id\] | string | The id of the note to retrieve information for. | -| note\_attachment\[filename\] | string | The filename of the file | -| note\_attachment\[file\] | binary string | The full contents of the file | -| note\_attachment\[related\_module\_id\] | string | The id of the record that this attachment is related to. | -| note\_attachment\[related\_module\_name\] | string | The module of the record that this attachment is related to. | - -#### `set_note_attachment` - -Creates a not attachment for a specified record. - -##### Arguments - -set\_note\_attachment arguments - -| Name | Type | Desc | -|------------------|---------------|------------------------------------------------| -| session | string | The session id. See login. | -| note | array | The details for the note attachment. | -| note\[id\] | string | The id of the note to add an attachment for. | -| note\[filename\] | string | The filename of the file | -| note\[file\] | binary string | The full contents of the file base 64 encoded. | - -##### Response - -set\_entries response - -| Name | Type | Desc | -|------|--------|-----------------------------------------| -| id | string | The id of the note for this attachment. | - -#### `set_relationship` - -Sets a relationship between a record and other records. - -##### Arguments - -set\_relationship arguments - -| Name | Type | Desc | -|--------------------------------|-------------------|--------------------------------------------------------------------------------------| -| session | string | The session id. See login. | -| module\_name | string | The name of the module to relate records to. | -| module\_id | string | The id of the record to relate records to. | -| link\_field\_name | string | The name of the link field on the module through which records will be related. | -| related\_ids | array | An array of record ids to relate. | -| related\_ids\[\] | string | The id of a record to relate. | -| name\_value\_list | name\_value\_list | A name value list of additional relationship fields to set. | -| name\_value\_list\[\] | array | A name value pair for a relationship field to set. | -| name\_value\_list\[\]\[name\] | string | The name of the field to set. | -| name\_value\_list\[\]\[value\] | string | The value of the field to set. | -| delete | bool | Whether or not to delete the specified relationship instead of creating/updating it. | - -##### Response - -set\_relationship response - -| Name | Type | Desc | -|---------|------|----------------------------------------------------------------| -| created | int | The number of relationships created. | -| failed | int | The number of relationships that failed to be created/deleted. | -| deleted | int | The number of relationships deleted. | - -#### `set_relationships` - -Sets relationships between multiple records. - -##### Arguments - -set\_relationships arguments - -| Name | Type | Desc |   | -|---------------------------------|-------------------|----------------------------------------------------------------------------------------------------|-----| -| session | string | The session id. See login. |   | -| module\_names | array | An array of modules to relate records to. |   | -| module\_names\[\] | string | The name of the module to relate records to. |   | -| module\_ids | array | An array of the ids of records to relate records to. |   | -| module\_ids\[\] | string | The id of the record to relate records to. |   | -| link\_field\_names | string | An array of the link names through which records will be related. |   | -| link\_field\_names\[\] | string | The name of the link field on the module through which records will be related. |   | -| related\_ids | array | An array of an array of record ids for each module specified. |   | -| related\_ids\[\] | array | An array of record ids for the corresponding module. |   | -| related\_ids\[\]\[\] | string | The record id. |   | -| name\_value\_lists | array | An array of an array of name value list of additional relationship fields to set. |   | -| name\_value\_lists\[\] | name\_value\_list | An array of name value pairs for the relationship fields of the corresponding module. |   | -| name\_value\_lists\[\]\[name\] | string | The name of the field to set. |   | -| name\_value\_lists\[\]\[value\] | string | The value of the field to set. |   | -| delete\_array | array | An array of booleans indicating whether or not the relationship should be deleted for each module. |   | -| delete\_array\[\] | bool | Whether or not to delete the specified relationship instead of creating/updating it. |   | - -##### Response - -set\_relationships response - -| Name | Type | Desc | -|---------|------|----------------------------------------------------------------| -| created | int | The number of relationships created. | -| failed | int | The number of relationships that failed to be created/deleted. | -| deleted | int | The number of relationships deleted. | - -
diff --git a/_source/suitecrm_developer_book.wiki b/_source/suitecrm_developer_book.wiki deleted file mode 100644 index fa1a7259b..000000000 --- a/_source/suitecrm_developer_book.wiki +++ /dev/null @@ -1,7222 +0,0 @@ - - -
- -[[File:images/title_page.jpg|SuiteCRM for Developers]] - -
- - -== SuiteCRM for Developers == - -=== Getting started with developing for SuiteCRM === - -  - -==== Jim Mackin ==== - -  - -This book is for sale at http://leanpub.com/suitecrmfordevelopers - -This version was published on 2015-05-22 - -[[File:images/leanpub-logo.png|publisher's logo]] - -*   *   *   *   * - -This is a [http://leanpub.com Leanpub] book. Leanpub empowers authors and publishers with the Lean Publishing process. [http://leanpub.com/manifesto Lean Publishing] is the act of publishing an in-progress ebook using lightweight tools and many iterations to get reader feedback, pivot until you have the right book and build traction once you do. - -*   *   *   *   * - - - -
- -© 2015 Jim Mackin - -
- - -
- -== Table of Contents == - -* [[#chap00.xhtml#leanpub-auto-introduction|1. Introduction]] -** [[#chap00.xhtml#leanpub-auto-what-is-suitecrm|What is SuiteCRM]] -** [[#chap00.xhtml#leanpub-auto-this-book|This book]] -** [[#chap00.xhtml#leanpub-auto-reading-this-book|Reading this book]] -** [[#chap00.xhtml#leanpub-auto-setting-up-suitecrm|Setting up SuiteCRM]] -** [[#chap00.xhtml#leanpub-auto-initial-tweaks|Initial Tweaks]] -* [[#chap01.xhtml#leanpub-auto-suitecrm-directory-structure|2. SuiteCRM Directory Structure]] -* [[#chap02.xhtml#working-with-beans-chapter|3. Working with Beans]] -** [[#chap02.xhtml#leanpub-auto-beanfactory|BeanFactory]] -** [[#chap02.xhtml#leanpub-auto-sugarbean|SugarBean]] -** [[#chap02.xhtml#leanpub-auto-searching-for-beans|Searching for beans]] -** [[#chap02.xhtml#leanpub-auto-accessing-fields|Accessing fields]] -** [[#chap02.xhtml#leanpub-auto-related-beans|Related beans]] -* [[#chap03.xhtml#vardefs-chapter|4. Vardefs]] -** [[#chap03.xhtml#leanpub-auto-what-are-vardefs|What are Vardefs]] -** [[#chap03.xhtml#leanpub-auto-defining-vardefs|Defining Vardefs]] -* [[#chap04.xhtml#leanpub-auto-views|5. Views]] -** [[#chap04.xhtml#leanpub-auto-location|Location]] -** [[#chap04.xhtml#leanpub-auto-customising|Customising]] -* [[#chap05.xhtml#metadata-chapter|6. Metadata]] -** [[#chap05.xhtml#leanpub-auto-intro|Intro]] -** [[#chap05.xhtml#leanpub-auto-location-1|Location]] -** [[#chap05.xhtml#leanpub-auto-customising-1|Customising]] -** [[#chap05.xhtml#leanpub-auto-different-metadata|Different metadata]] -* [[#chap06.xhtml#leanpub-auto-controllers|7. Controllers]] -** [[#chap06.xhtml#leanpub-auto-customising-controllers|Customising controllers]] -* [[#chap07.xhtml#entry-point-chapter|8. Entry Points]] -** [[#chap07.xhtml#leanpub-auto-creating-an-entry-point|Creating an entry point]] -* [[#chap08.xhtml#language-chapter|9. Language Strings]] -** [[#chap08.xhtml#leanpub-auto-module-strings|Module Strings]] -** [[#chap08.xhtml#leanpub-auto-application-strings|Application Strings]] -** [[#chap08.xhtml#leanpub-auto-application-list-strings|Application List Strings]] -** [[#chap08.xhtml#leanpub-auto-why-and-when-to-customise|Why and when to customise]] -** [[#chap08.xhtml#leanpub-auto-usage|Usage]] -* [[#chap09.xhtml#config-chapter|10. Config]] -** [[#chap09.xhtml#leanpub-auto-the-config-files|The config files]] -** [[#chap09.xhtml#leanpub-auto-using-config-options|Using config options]] -* [[#chap10.xhtml#logging-chapter|11. Logging]] -** [[#chap10.xhtml#leanpub-auto-logging-messages|Logging messages]] -** [[#chap10.xhtml#leanpub-auto-logging-output|Logging output]] -** [[#chap10.xhtml#leanpub-auto-log-levels|Log levels]] -* [[#chap11.xhtml#logic-hooks-chapter|12. Logic Hooks]] -** [[#chap11.xhtml#leanpub-auto-intro-1|Intro]] -** [[#chap11.xhtml#leanpub-auto-types|Types]] -** [[#chap11.xhtml#leanpub-auto-application-hooks|Application Hooks]] -** [[#chap11.xhtml#leanpub-auto-user-hooks|User Hooks]] -** [[#chap11.xhtml#leanpub-auto-module-hooks|Module Hooks]] -** [[#chap11.xhtml#leanpub-auto-job-queue-hooks|Job Queue Hooks]] -** [[#chap11.xhtml#leanpub-auto-implementing|Implementing]] -** [[#chap11.xhtml#leanpub-auto-tips|Tips]] -* [[#chap12.xhtml#scheduled-tasks-chapter|13. Scheduled Tasks]] -** [[#chap12.xhtml#leanpub-auto-intro-2|Intro]] -** [[#chap12.xhtml#leanpub-auto-scheduler|Scheduler]] -** [[#chap12.xhtml#leanpub-auto-job-queue|Job Queue]] -** [[#chap12.xhtml#leanpub-auto-debugging|Debugging]] -* [[#chap13.xhtml#extensions-chapter|14. Extension Framework]] -** [[#chap13.xhtml#leanpub-auto-introduction-1|Introduction]] -** [[#chap13.xhtml#leanpub-auto-standard-extensions|Standard Extensions]] -** [[#chap13.xhtml#leanpub-auto-custom-extensions|Custom Extensions]] -* [[#chap14.xhtml#module-installer-chapter|15. Module Installer]] -** [[#chap14.xhtml#leanpub-auto-manifestphp|manifest.php]] -** [[#chap14.xhtml#leanpub-auto-types-1|Types]] -* [[#chap15.xhtml#leanpub-auto-api|16. API]] -** [[#chap15.xhtml#leanpub-auto-using-the-api|Using the API]] -** [[#chap15.xhtml#leanpub-auto-adding-custom-api-methods|Adding custom API methods]] -* [[#chap16.xhtml#leanpub-auto-best-practices|17. Best Practices]] -** [[#chap16.xhtml#leanpub-auto-development-instances|Development instances]] -** [[#chap16.xhtml#leanpub-auto-version-control|Version control]] -** [[#chap16.xhtml#leanpub-auto-backup|Backup]] -** [[#chap16.xhtml#leanpub-auto-be-upgrade-safe|Be upgrade safe]] -** [[#chap16.xhtml#leanpub-auto-use-appropriate-log-levels|Use appropriate log levels]] -** [[#chap16.xhtml#leanpub-auto-long-running-logic-hooks|Long running logic hooks]] -** [[#chap16.xhtml#leanpub-auto-minimise-sql|Minimise SQL]] -** [[#chap16.xhtml#leanpub-auto-sql-use|SQL Use]] -** [[#chap16.xhtml#leanpub-auto-entry-check|Entry check]] -** [[#chap16.xhtml#leanpub-auto-redirect-after-post|Redirect after post]] -* [[#chap17.xhtml#leanpub-auto-performance-tweaks|18. Performance Tweaks]] -** [[#chap17.xhtml#leanpub-auto-server|Server]] -** [[#chap17.xhtml#leanpub-auto-indexes|Indexes]] -** [[#chap17.xhtml#leanpub-auto-config-changes|Config Changes]] -* [[#chap18.xhtml#leanpub-auto-further-resources|19. Further Resources]] -** [[#chap18.xhtml#leanpub-auto-suitecrm-website|SuiteCRM Website]] -** [[#chap18.xhtml#leanpub-auto-external-suitecrm-resources|External SuiteCRM Resources]] -** [[#chap18.xhtml#leanpub-auto-sugarcrm-resources|SugarCRM Resources]] -** [[#chap18.xhtml#leanpub-auto-technical-links|Technical Links]] -** [[#chap18.xhtml#leanpub-auto-other-links|Other Links]] -* [[#chap19.xhtml#appendix-a|20. Appendix A - Code Examples]] -** [[#chap19.xhtml#leanpub-auto-metadata|Metadata]] -** [[#chap19.xhtml#leanpub-auto-module-installer|Module Installer]] -* [[#chap20.xhtml#appendix-b|21. Appendix B - API Methods]] -** [[#chap20.xhtml#leanpub-auto-methods-1|Methods]] - - -
- - -
- -== 1. Introduction == - -=== What is SuiteCRM === - -The story of [https://www.suitecrm.com SuiteCRM] starts with SugarCRM. SugarCRM was founded in 2004 and consisted of an open source version (called Community Edition) and various paid for versions. However trouble started brewing when it appeared that SugarCRM would not be releasing a Community Edition of SugarCRM 7 and would be providing limited, if any, updates to the Community Edition. - -Enter SuiteCRM. SalesAgility forked Community Edition to create SuiteCRM and also added various open source plugins to add improved functionality. - -=== This book === - -This book is intended for developers who are familiar (or at least acquainted) with using SuiteCRM but want to perform their own customisations. SuiteCRM is a large and mature piece of software so it is impractical for a book to cover all aspects of the software. I’ve tried to add the most important parts which should allow you to make the changes you need in 99% of situations. There is a further resources chapter at the end of this book to help out in those 1% of cases. With that being said if you feel there is anything important I have left out (or worse, anything incorrect in the book) please let me know. I can be contacted at [http://www.jsmackin.co.uk JSMackin.co.uk]. - -=== Reading this book === - -Each chapter in this book is intended to be self contained so the reader can jump to interesting chapters. Where there is some overlap this is usually indicated with links to the relevant chapters. - -Some parts of this book may refer to file paths or other parts of code that can have a variable value, for example controller names contain the module name or a file with an arbitrary name. In this case these will be marked in the form <TheModuleName>, <TheFileName> or something else suitable. In these cases you can substitute something appropriate (such as Accounts or MyNewFile). - -=== Setting up SuiteCRM === - -In this book we’ll be using SuiteCRM v7.1.5 which is the latest at time of writing. For up to date versions of the installation instructions see the SuiteCRM wiki at [https://suitecrm.com/wiki/index.php/Installation suitecrm.com/wiki/index.php/Installation]. - -==== Website ==== - -The SuiteCRM installer can be found at [https://suitecrm.com/ SuiteCRM.com]. I would recommend SuiteCRM MAX as I prefer to start with a full interface and customise it as needed. - -==== GitHub ==== - -SuiteCRM is also available on [http://github.com GitHub] at [https://github.com/salesagility/SuiteCRM github.com/salesagility/SuiteCRM]. Each SuiteCRM version is tagged so you can easily grab the version you need. - -=== Initial Tweaks === - -After the initial install there are a few tweaks you may want to make on an instance you are developing on. These changes should improve your development flow and productivity as well as help identify issues if they occur. - -==== Developer Mode ==== - -SuiteCRM will cache various files that it processes, such as Smarty templates. Developer mode will turn off some of the caching so that changes to files will be seen immediately (though this isn’t always the case - as is the case with [[#chap13.xhtml#extensions-chapter|extensions]]). This can be enabled either through the config file or via the General settings page inside admin. - -==== Log Level ==== - -The default log level of SuiteCRM is fatal. This is a good default for production instances but you may want to increase the log level to info or debug. This will make the log output more verbose so, should anything go wrong, you’ll have something to refer to. See the [[#chap10.xhtml#logging-chapter|chapter on logging]] for more information. - -==== Display errors ==== - -You’ll also want to turn off display errors. Unfortunately at the moment SuiteCRM has various notices and warnings out of the box. With display_errors on this can sometimes cause AJAX pages and the link to break. - -With this being said you should be checking the PHP error logs or selectively enabling
-display_errors to ensure that the code you are creating is not creating additional notices, warnings or errors. - -==== XDebug ==== - -[http://xdebug.org XDebug] is a PHP extension which provides profiling and debugging capabilities to PHP. This can massively improve developer productivity by simplifying development and, particularly, tracking down any issues. See the XDebug site for information on XDebug. - - -
- - -
- -== 2. SuiteCRM Directory Structure == - -; cache -: Contains cache files used by SuiteCRM including compiled smarty templates, grouped vardefs, minified and grouped JavaScript. Some modules and custom modules may also store (temporary) module specific info here. -; custom -: Contains user and developer customisations to SuiteCRM. Also contains some SuiteCRM code to maintain compatibility with SugarCRM. However this is likely to change in the future. -; data -: Stores the classes and files used to deal with SugarBeans and their relationships. -; examples -: Contains a few basic examples of lead capture and API usage. However these are very outdated. -; include -: Contains the bulk of non module and non data SuiteCRM code. -; install -: Code used by the SuiteCRM installer. -; jssource -: The jssource folder contains the unminified source of some of the JavaScript files used within SuiteCRM. -; metadata -: Stores relationship metadata for the various stock SuiteCRM modules. This should not be confused with module metadata which contains information on view, dashlet and search definitions. -; mobile -: Stores code for the [http://www.quickcrm.fr QuickCRM] mobile app. -; ModuleInstall -: Code for the module installer. -; modules -: Contains the code for any stock or custom SuiteCRM modules. -; service -: Code for the SuiteCRM Soap and REST APIs. -; themes -: Code, data and images for the bundled SuiteCRM theme. -; upload -: The upload folder contains documents that have been uploaded to SuiteCRM. The names of the files comes from the ID of the matching Document Revision/Note. upload/upgrades will also contain various upgrade files and the packages of installed modules. -; log4php, soap, XTemplate, Zend -: Source code for various libraries used by SuiteCRM some of which are deprecated. - - -
- - -
- -== 3. Working with Beans == - -Beans are the Model in SuiteCRM’s MVC (Model View Controller) architecture. They allow retrieving data from the database as objects and allow persisting and editing records. This section will go over the various ways of working with beans. - -=== BeanFactory === - -The BeanFactory allows dynamically loading bean instances or creating new records. For example to create a new bean you can use: - -
- -Example 3.1: Creating a new Bean using the BeanFactory - - ------ - -
- -
1 $bean = BeanFactory::newBean('<TheModule>');
-2 //For example a new account bean:
-3 $accountBean = BeanFactory::newBean('Accounts');
- -
- ------ - - -
-Retrieving an existing bean can be achieved in a similar manner: - -
- -Example 3.2: Retrieving a bean with the BeanFactory - - ------ - -
- -
1 $bean = BeanFactory::getBean('<TheModule>', $beanId);
-2 //For example to retrieve an account id
-3 $bean = BeanFactory::getBean('Accounts', $beanId);
- -
- ------ - - -
-getBean will return an unpopulated bean object if $beanId is not supplied or if there’s no such record. Retrieving an unpopulated bean can be useful if you wish to use the static methods of the bean (for example see the Searching for Beans section). To deliberately retrieve an unpopulated bean you can omit the second argument of the getBean call. I.e. - -
- -Example 3.3: Retrieving an unpopulated bean - - ------ - -
- -
1 $bean = BeanFactory::getBean('<TheModule>');
- -
- ------ - - -
-{| -|width="50%"| [[File:images/leanpub_warning.png|50px|class=sidebar-image|warning]] -|width="50%"| BeanFactory::getBean caches ten results. This can cause odd behaviour if you call getBean again and get a cached copy. Any calls that return a cached copy will return the same instance. This means changes to one of the beans will be reflected in all the results. -|} - -Using BeanFactory ensures that the bean is correctly set up and the necessary files are included etc. - -=== SugarBean === - -The SugarBean is the parent bean class and all beans in SuiteCRM extend this class. It provides various ways of retrieving and interacting with records. - -=== Searching for beans === - -The following examples show how to search for beans using a bean class. The examples provided assume that an account bean is available names $accountBean. This may have been retrieved using the getBean call mentioned in the BeanFactory section e.g. - -
- -Example 3.4: Retrieving an unpopulated account bean - - ------ - -
- -
$accountBean = BeanFactory::getBean('Accounts');
- -
- ------ - - -
-==== get_list ==== - -The get_list method allows getting a list of matching beans and allows paginating the results. - -
- -Example 3.5: get_list method signature - - ------ - -
- -
1 get_list(
-2     $order_by = "",
-3     $where = "",
-4     $row_offset = 0,
-5     $limit=-1,
-6     $max=-1,
-7     $show_deleted = 0)
- -
- ------ - - -
-; $order_by -: Controls the ordering of the returned list. $order_by is specified as a string that will be used in the SQL ORDER BY clause e.g. to sort by name you can simply pass name, to sort by date_entered descending use date_entered DESC. You can also sort by multiple fields. For example sorting by date_modified and id descending date_modified, id DESC. -; $where -: Allows filtering the results using an SQL WHERE clause. $where should be a string containing the SQL conditions. For example in the contacts module searching for contacts with specific first names we might use contacts.first_name='Jim'. Note that we specify the table, the query may end up joining onto other tables so we want to ensure that there is no ambiguity in which field we target. -; $row_offset -: The row to start from. Can be used to paginate the results. -; $limit -: The maximum number of records to be returned by the query. -1 means no limit. -; $max -: The maximum number of entries to be returned per page. -1 means the default max (usually 20). -; $show_deleted -: Whether to include deleted results. - -===== Results ===== - -get_list will return an array. This will contain the paging information and will also contain the list of beans. This array will contain the following keys: - -; list -: An array of the beans returned by the list query -; row_count -: The total number of rows in the result -; next_offset -: The offset to be used for the next page or -1 if there are no further pages. -; previous_offset -: The offset to be used for the previous page or -1 if this is the first page. -; current_offset -: The offset used for the current results. - -===== Example ===== - -Let’s look at a concrete example. We will return the third page of all accounts with the industry Media using 10 as a page size and ordered by name. - -
- -Example 3.6: Example get_list call - - ------ - -
- -
 1 $beanList = $accountBean->get_list(
- 2                                 //Order by the accounts name
- 3                                 'name',
- 4                                 //Only accounts with industry 'Media'
- 5                                 "accounts.industry = 'Media'",
- 6                                 //Start with the 30th record (third page)
- 7                                 30,
- 8                                 //No limit - will default to max page size
- 9                                 -1,
-10                                 //10 items per page
-11                                 10);
- -
- ------ - - -
-This will return: - -
- -Example 3.7: Example get_list results - - ------ - -
- -
 1 Array
- 2 (
- 3     //Snipped for brevity - the list of Account SugarBeans
- 4     [list] => Array()
- 5     //The total number of results
- 6     [row_count] => 36
- 7     //This is the last page so the next offset is -1
- 8     [next_offset] => -1
- 9     //Previous page offset
-10     [previous_offset] => 20
-11     //The offset used for these results
-12     [current_offset] => 30
-13 )
- -
- ------ - - -
-==== get_full_list ==== - -get_list is useful when you need paginated results. However if you are just interested in getting a list of all matching beans you can use get_full_list. The get_full_list method signature looks like this: - -
- -Example 3.8: get_full_list method signature - - ------ - -
- -
1 get_full_list(
-2             $order_by = "",
-3             $where = "",
-4             $check_dates=false,
-5             $show_deleted = 0
- -
- ------ - - -
-These arguments are identical to their usage in get_list the only difference is the $check_dates argument. This is used to indicate whether the date fields should be converted to their display values (i.e. converted to the users date format). - -===== Results ===== - -The get_full_list call simply returns an array of the matching beans - -===== Example ===== - -Let’s rework our get_list example to get the full list of matching accounts: - -
- -Example 3.9: Example get_full_list call - - ------ - -
- -
1 $beanList = $accountBean->get_full_list(
-2                                 //Order by the accounts name
-3                                 'name',
-4                                 //Only accounts with industry 'Media'
-5                                 "accounts.industry = 'Media'"
-6                                 );
- -
- ------ - - -
-==== retrieve_by_string_fields ==== - -Sometimes you only want to retrieve one row but may not have the id of the record. retrieve_by_string_fields allows retrieving a single record based on matching string fields. - -
- -Example 3.10: retrieve_by_string_fields method signature - - ------ - -
- -
1 retrieve_by_string_fields(
-2                           $fields_array,
-3                           $encode=true,
-4                           $deleted=true)
- -
- ------ - - -
-; $fields_array -: An array of field names to the desired value. -; $encode -: Whether or not the results should be HTML encoded. -; $deleted -: Whether or not to add the deleted filter. - -{| -|width="50%"| [[File:images/leanpub_warning.png|50px|class=sidebar-image|warning]] -|width="50%"| Note here that, confusingly, the deleted flag works differently to the other methods we have looked at. It flags whether or not we should filter out deleted results. So if true is passed then the deleted results will ''not'' be included. -|} - -===== Results ===== - -retrieve_by_string_fields returns a single bean as it’s result or null if there was no matching bean. - -===== Example ===== - -For example to retrieve the account with name Tortoise Corp and account_type Customer we could use the following: - -
- -Example 3.11: Example retrieve_by_string_fields call - - ------ - -
- -
1 $beanList = $accountBean->retrieve_by_string_fields(
-2                                 array(
-3                                   'name' => 'Tortoise Corp',
-4                                   'account_type' => 'Customer'
-5                                 )
-6                               );
- -
- ------ - - -
-=== Accessing fields === - -If you have used one of the above methods we now have a bean record. This bean represents the record that we have retrieved. We can access the fields of that record by simply accessing properties on the bean just like any other PHP object. Similarly we can use property access to set the values of beans. Some examples are as follows: - -
- -Example 3.12: Accessing fields examples - - ------ - -
- -
 1 //Get the Name field on account bean
- 2 $accountBean->name;
- 3 
- 4 //Get the Meeting start date
- 5 $meetingBean->date_start;
- 6 
- 7 //Get a custom field on a case
- 8 $caseBean->third_party_code_c;
- 9 
-10 //Set the name of a case
-11 $caseBean->name = 'New Case name';
-12 
-13 //Set the billing address post code of an account
-14 $accountBean->billing_address_postalcode = '12345';
- -
- ------ - - -
-When changes are made to a bean instance they are not immediately persisted. We can save the changes to the database with a call to the beans save method. Likewise a call to save on a brand new bean will add that record to the database: - -
- -Example 3.13: Persisting bean changes - - ------ - -
- -
 1 //Get the Name field on account bean
- 2 $accountBean->name = 'New account name';
- 3 //Set the billing address post code of an account
- 4 $accountBean->billing_address_postalcode = '12345';
- 5 //Save both changes.
- 6 $accountBean->save();
- 7 
- 8 //Create a new case (see the BeanFactory section)
- 9 $caseBean = BeanFactory::newBean('Cases');
-10 //Give it a name and save
-11 $caseBean->name = 'New Case name';
-12 $caseBean->save();
- -
- ------ - - -
-{| -|width="50%"| [[File:images/leanpub_info-circle.png|50px|class=sidebar-image|information]] -|width="50%"| Whether to save or update a bean is decided by checking the id field of the bean. If id is set then SuiteCRM will attempt to perform an update. If there is no id then one will be generated and a new record will be inserted into the database. If for some reason you have supplied an id but the record is new (perhaps in a custom import script) then you can set new_with_id to true on the bean to let SuiteCRM know that this record is new. -|} - -=== Related beans === - -We have seen how to save single records but, in a CRM system, relationships between records are as important as the records themselves. For example an account may have a list of cases associated with it, a contact will have an account that it falls under etc. We can get and set relationships between beans using several methods. - -==== get_linked_beans ==== - -The get_linked_beans method allows retrieving a list of related beans for a given record. - -
- -Example 3.14: get_linked_beans method signature - - ------ - -
- -
1 get_linked_beans(
-2                 $field_name,
-3                 $bean_name,
-4                 $sort_array = array(),
-5                 $begin_index = 0,
-6                 $end_index = -1,
-7                 $deleted=0,
-8                 $optional_where="");
- -
- ------ - - -
-; $field_name -: The link field name for this link. Note that this is not the same as the name of the relationship. If you are unsure of what this should be you can take a look into the cached vardefs of a module in cache/modules/<TheModule>/<TheModule>Vardefs.php for the link definition. -; $bean_name -: The name of the bean that we wish to retrieve. -; $sort_array -: This is a legacy parameter and is unused. -; $begin_index -: Skips the initial $begin_index results. Can be used to paginate. -; $end_index -: Return up to the $end_index result. Can be used to paginate. -; $deleted -: Controls whether deleted or non deleted records are shown. If true only deleted records will be returned. If false only non deleted records will be returned. -; $optional_where -: Allows filtering the results using an SQL WHERE clause. See the get_list method for more details. - -===== Results ===== - -get_linked_beans returns an array of the linked beans. - -===== Example ===== - -
- -Example 3.15: Example get_linked_beans call - - ------ - -
- -
1 $accountBean->get_linked_beans(
-2                 'contacts',
-3                 'Contacts',
-4                 array(),
-5                 0,
-6                 10,
-7                 0,
-8                 "contacts.primary_address_country = 'USA'");
- -
- ------ - - -
-==== relationships ==== - -In addition to the get_linked_beans call you can also load and access the relationships more directly. - -===== Loading ===== - -Before accessing a relationship you must use the load_relationship call to ensure it is available. This call takes the link name of the relationship (not the name of the relationship). As mentioned previously you can find the name of the link in cache/modules/<TheModule>/<TheModule>Vardefs.php if you’re not sure. - -
- -Example 3.16: Loading a relationship - - ------ - -
- -
1 //Load the relationship
-2 $accountBean->load_relationship('contacts');
-3 //Can now call methods on the relationship object:
-4 $contactIds = $accountBean->contacts->get();
- -
- ------ - - -
-===== Methods ===== - -====== get ====== - -Returns the ids of the related records in this relationship e.g for the account - contacts relationship in the example above it will return the list of ids for contacts associated with the account. - -====== getBeans ====== - -Similar to get but returns an array of beans instead of just ids. - -{| -|width="50%"| [[File:images/leanpub_warning.png|50px|class=sidebar-image|warning]] -|width="50%"| getBeans will load the full bean for each related record. This may cause poor performance for relationships with a large number of beans. -|} - -====== add ====== - -Allows relating records to the current bean. add takes a single id or bean or an array of ids or beans. If the bean is available this should be used since it prevents reloading the bean. For example to add a contact to the relationship in our example we can do the following: - -
- -Example 3.18: Adding a new contact to a relationship - - ------ - -
- -
 1 //Load the relationship
- 2 $accountBean->load_relationship('contacts');
- 3 
- 4 //Create a new demo contact
- 5 $contactBean = BeanFactory::newBean();
- 6 $contactBean->first_name = 'Jim';
- 7 $contactBean->last_name = 'Mackin';
- 8 $contactBean->save();
- 9 
-10 //Link the bean to $accountBean
-11 $accountBean->contacts->add($contactBean);
- -
- ------ - - -
-====== delete ====== - -delete allows unrelating beans. Counter-intuitively it accepts the ids of both the bean and the related bean. For the related bean you should pass the bean if it is available e.g when unrelating an account and contact: - -
- -Example 3.19: Removing a new contact from a relationship - - ------ - -
- -
1 //Load the relationship
-2 $accountBean->load_relationship('contacts');
-3 
-4 //Unlink the contact from the account - assumes $contactBean is a Contact SugarB\
-5 ean
-6 $accountBean->contacts->delete($accountBean->id, $contactBean);
- -
- ------ - - -
-{| -|width="50%"| [[File:images/leanpub_warning.png|50px|class=sidebar-image|warning]] -|width="50%"| Be careful with the delete method. Omitting the second argument will cause all relationships for this link to be removed. -|} - - -
- - -
- -== 4. Vardefs == - -=== What are Vardefs === - -The Vardefs are used to supply information to SuiteCRM about a particular bean. These generally specify the fields, relationships and indexes in a given module as well as additional information such as whether it is audited, the table name etc. - -=== Defining Vardefs === - -==== Module ==== - -Vardefs are initially defined in their respective modules folder. For the Accounts module this will be in modules/Accounts/vardefs.php. The information is stored in an array named $dictionary using the module name as the key. For Accounts this will be $dictionary['Account']. Let’s look at the Account vardefs (which have been edited for brevity): - -
- -Example 4.1: Account Vardefs - - ------ - -
- -
 1 $dictionary['Account'] =
- 2 array(
- 3 	'table' => 'accounts',
- 4 	'audited'=>true,
- 5 	'unified_search' => true,
- 6 	'unified_search_default_enabled' => true,
- 7 	'duplicate_merge'=>true,
- 8 	'comment' => 'Accounts are organizations or entities that ...',
- 9 	'fields' => array (
-10 	  //Snipped for brevity. See the fields section.
-11 	),
-12 	'indices' => array (
-13 	  //Snipped for brevity. See the indices section.
-14 	),
-15 	'relationships' => array (
-16 	  //Snipped for brevity. See the relationship section.
-17 	),
-18 	//This enables optimistic locking for Saves From EditView
-19 	'optimistic_locking'=>true,
-20 );
-21 
-22 VardefManager::createVardef(
-23 	'Accounts',
-24 	'Account',
-25 	array('default', 'assignable','company',)
-26 );
- -
- ------ - - -
-===== Keys ===== - -The following are some of the keys that can be specified for the vardefs. Fields, indices and relationships are covered in their own sections. - -; table -: The database table name for this module. -; audited -: Whether or not this module should be audited. Note that audited must also be set at the fields level for a field to be audited. -; unified_search -: Whether this module can be searchable via the global search. -; unified_search_default_enabled -: Whether this module is searchable via the global search by default. -; duplicate_merge -: Whether or not duplicate merging functionality is enabled for this module. -; comment -: A description of this module. -; optimistic_locking -: Whether optimistic should be enabled for this module. Optimistic locking locks concurrent edits on a record by assuming that there will be no conflict. On save the last modified timestamp on the record will be checked. If it is different then an edit has occurred since this record was loaded. If this is the case then the user will be prompted with a page showing the differences in the two edits and asked to choose which edits are to be used. - -===== Fields ===== - -The field defines the behaviour and attributes of each field in the module. - -; name -: The name of the field. -; vname -: The name of the language label to be used for this field. -; type -: The type of the field. See the field types section. -; isnull -: Whether null values are allowed -; len -: If the field is a string type, the max number of characters allowed. -; options -: For enum fields the language label for the dropdown values for this field -; dbtype -: The type to be used by the database to store this field. This is not required as the appropriate type is usually chosen. -; default -: The default value of this field. -; massupdate -: Whether or not this field should be mass updatable. Note that some field types are always restricted from mass updates. -; rname -: For related fields only. The name of the field to be taken from the related module. -; id_name -: For related fields only. The field in this bean which contains the related id. -; source -: The source of this field. Can be set to ‘non-db’ if the field is not stored in the database - for example for link fields, fields populated by logic hooks or by other means. -; sort_on -: For concatenated fields (i.e. name fields) the field which should be used to sort. -; fields -: For concatenated fields (i.e. name fields) an array of the fields which should be concatenated. -; db_concat_fields -: For concatenated fields (i.e. name fields) an array of the fields which should be concatenated in the database. Usually this is the same as fields. -; unified_search -: True if this field should be searchable via the global search. -; enable_range_search -: Whether the list view search should allow a range search of this field. This is used for date and numeric fields. -; studio -: Whether the field should display in studio. -; audited -: Whether or not changes to this field should be audited. - -===== Field types ===== - -The following are common field types used: - -; id -: An id field. -; name -: A name field. This is usually a concatenation of other fields. -; bool -: A boolean field. -; varchar -: A variable length string field. -; char -: A character field. -; text -: A text area field. -; decimal -: A decimal field. -; date -: A date field. -; datetime -: A date and time field. -; enum -: A dropdown field. -; phone -: A phone number field. -; link -: A link to another module via a relationship. -; relate -: A related bean field. - -===== Indices ===== - -The indices array allows defining any database indexes that should be in place on the database table for this module. Let’s look at an example: - -
- -Example 4.2: Example indices definition - - ------ - -
- -
 1 'indices' => array (
- 2 	array(
- 3 		'name' =>'idx_mymod_id_del',
- 4 		'type' =>'index',
- 5 		'fields'=>array('id', 'deleted')),
- 6 	array(
- 7 		'name' =>'idx_mymod_parent_id',
- 8 		'type' =>'index',
- 9 		'fields'=>array( 'parent_id')),
-10 	array(
-11 		'name' =>'idx_mymod_parent_id',
-12 		'type' =>'unique',
-13 		'fields'=>array( 'third_party_id')),
-14 	),
- -
- ------ - - -
-Each array entry should have, at least, the following entries: - -; name -: The name of the index. This is usually used by the database to reference the index. Most databases require that these are unique. -; type -: The type of the index to create. index will simply add an index on the fields, unique will add a unique constraint on the fields, primary will add the fields as a primary key. -; fields -: An array of the fields to be indexed. The order of this array will be used as the order of the fields in the index. - -===== Relationships ===== - -The Vardefs also specify the relationships within this module. Here’s an edited example from the Accounts module: - -
- -Example 4.3: Example relationships definition - - ------ - -
- -
 1 'relationships' => array (
- 2 	'account_cases' => array(
- 3 		'lhs_module'=> 'Accounts',
- 4 		'lhs_table'=> 'accounts',
- 5 		'lhs_key' => 'id',
- 6 		'rhs_module'=> 'Cases',
- 7 		'rhs_table'=> 'cases',
- 8 		'rhs_key' => 'account_id',
- 9 		'relationship_type' => 'one-to-many'),
-10 ),
- -
- ------ - - -
-Here we see the link between accounts and cases. This is specified with the following keys: - -; lhs_module -: The module on the left hand side of this relationship. For a one to many relationship this will be the “One” side. -; lhs_table -: The table for the left hand side module. If you are unsure the table for a module can be found in it’s vardefs. -; lhs_key -: The field to use for the left hand side of this link. In this case it is the id of the account. -; rhs_module -: The right hand side module. In this case the “many” side of the relationship. -; rhs_table -: The table for the right hand side module. As stated previously you can find the table for a module can be found in it’s vardefs. -; rhs_key -: The field to use on the right hand side. In this case the account_id field on cases. -; relationship_type -: The type of relationship - “one-to-many” or “many-to-many”. Since this is a one to many relationship it means a case is related to a single account but a single account can have multiple cases. - -For many to many relationship fields the following keys are also available: - -; join_table -: The name of the join table for this relationship. -; join_key_lhs -: The name of the field on the join table for the left hand side. -; join_key_rhs -: The name of the field on the join table for the right hand side. - -==== Vardef templates ==== - -Vardef templates provide a shortcut for defining common vardefs. This is done by calling VardefManager::createVardef and passing the module name, object name and an array of templates to be assigned. The following is an example from the accounts vardefs: - -
- -Example 4.4: Example vardef template - - ------ - -
- -
22 VardefManager::createVardef(
-23 		'Accounts',
-24 		'Account',
-25 		array('default', 'assignable','company',)
-26 		);
- -
- ------ - - -
-In this example the default, assignable and company templates are used. The following are some of the available templates: - -; basic
-default -: Adds the common base fields such as id, name, date_entered, etc. -; assignable -: Adds the fields and relationships necessary to assign a record to a user. -; person -: Adds fields common to people records such as first_name, last_name, address, etc. -; company -: Adds fields common to companies such as an industry dropdown, address, etc. - -==== Customising vardefs ==== - -Vardefs can be customised by adding a file into - -
- -Example 4.5: Custom vardef location - - ------ - -
- -
custom/Extension/modules/<TheModule>/Ext/SomeFile.php
- -
- ------ - - -
-This file can then be used to add a new field definition or customise an existing one e.g changing a field type: - -
- -Example 4.6: Example overriding an existing vardef - - ------ - -
- -
$dictionary["TheModule"]["fields"]["some_field"]['type'] = 'int';
- -
- ------ - - -
- -
- - -
- -== 5. Views == - -SuiteCRM follows the MVC (Model-View-Controller) pattern and as such has the concept of views. Views are responsible for gathering and displaying data . There are a number of default views in SuiteCRM. These include - -; ListView -: Displays a list of records and provides links to the EditViews and DetailViews of those records. The ListView also allows some operations such as deleting and mass updating records. This is (usually) the default view for a module. -; DetailView -: Displays the details of a single record and also displays subpanels of related records. -; EditView -: The EditView allows editing the various fields of a record and provides validation on these values. - -=== Location === - -Views can be found in modules/<TheModule>/views/ or, for custom views,
-custom/modules/<TheModule>/views/, and are named in the following format: view.<viewname>.php. For example, the Accounts DetailView can be found in modules/Accounts/views/view.detail.php with a customised version in custom/modules/Accounts/views/view.detail.php. The custom version is used if it exists. If it doesn’t then the module version is used. Finally, if neither of these exist then the SuiteCRM default is used in include/MVC/View/views/. - -=== Customising === - -In order to customise a View we first need to create the appropriate view file. This will vary depending on the module we wish to target. - -==== Custom module ==== - -In this case we can place the file directly into our module. Create a new file (if it doesn’t exist) at modules/<TheModule>/views/view.<viewname>.php. The contents will look similar to: - -
- -Example 5.1: View for a custom module - - ------ - -
- -
1 <?php
-2 
-3 require_once 'include/MVC/View/views/view.<viewname>.php';
-4 
-5 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-6 class <TheModule>View<ViewName> extends View<ViewName>
-7 {
-8 
-9 }
- -
- ------ - - -
-A more concrete example would be for the detail view for a custom module called ABC_Vehicles: - -
- -Example 5.2: Detail view for a custom module, ABC_Vehicles - - ------ - -
- -
1 <?php
-2 
-3 require_once 'include/MVC/View/views/view.detail.php';
-4 
-5 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-6 class ABC_VehiclesViewDetail extends ViewDetail
-7 {
-8 
-9 }
- -
- ------ - - -
-==== Preexisting modules ==== - -For preexisting modules you will want to add the view to
-custom/modules/<TheModule>/views/view.<viewname>.php. - -The contents of this file will vary depending on whether you wish to extend the existing view (if it exists) or create your own version completely. It is usually best to extend the existing view, since this will retain important logic. Note the naming convention here. We name the class
-Custom<TheModule>View<ViewName> (for example CustomAccountsViewDetail). - -Here we don’t extend the existing view or no such view exists: - -
- -Example 5.3: Custom view for an existing module - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 
-4 require_once 'include/MVC/View/views/view.<viewname>.php';
-5 
-6 class Custom<TheModule>View<ViewName> extends ViewDetail
-7 {
-8 
-9 }
- -
- ------ - - -
-Otherwise we extend the existing view. Note that we are requiring the existing view: - -
- -Example 5.4: Overriding a view for an existing module - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 
-4 require_once 'modules/<TheModule>/views/view.<viewname>.php';
-5 
-6 class Custom<TheModule>View<ViewName> extends <TheModule>View<ViewName>
-7 {
-8 
-9 }
- -
- ------ - - -
-For example, overriding the List View of Accounts: - -
- -Example 5.5: Overriding the Accounts List View - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 
-4 require_once 'modules/Accounts/views/view.list.php';
-5 
-6 class CustomAccountsViewList extends AccountsViewList
-7 {
-8 
-9 }
- -
- ------ - - -
-==== Making changes ==== - -Now that we have a custom view what can we actually do? The views have various methods which we can now override to change/add behaviour. The most common ones to override are: - -; preDisplay -: Explicitly intended to allow logic to be called before display() is called. This can be used to alter arguments to the list view or to output anything to appear before the main display code (such as, for example, adding JavaScript). -; display -: Does the actual work of displaying the view. Can be overridden to alter this behaviour or to output anything after the main display. You usually want to call parent::display(); to ensure that the display code is run (unless, of course, you are adding your own display logic). - - -
- - -
- -== 6. Metadata == - -=== Intro === - -Module metadata are used to describe how various views behave in the module. The main use of this is providing field and layout information but this can also be used to filter subpanels and to describe what fields are used in the search. - -=== Location === - -Module metadata can be found in: - -
- -Example 6.1: Module metadata location - - ------ - -
- -
modules/<TheModule>/metadata/
- -
- ------ - - -
-=== Customising === - -Usually studio is the best way of customising metadata. Even when you do wish to make customisations that are not possible through studio it can be simpler to set everything up in studio first. This is particularly true for layout based metadata. However if you are customising metadata it is as simple as placing, or editing, the file in the custom directory. For example to override the Accounts detailviewdefs (found in modules/Accounts/metadata/detailviewdefs.php) we would place (or edit) the file in custom/modules/Accounts/metadata/detailviewdefs.php. One exception to this rule is the studio.php file. The modules metadata folder is the only location checked - any version in custom/<TheModule>/metadata/studio.php is ignored. - -=== Different metadata === - -==== detailviewdefs.php ==== - -detailviewdefs.php provides information on the layout and fields of the detail view for this module. This file uses the same structure as editviewdefs.php. Let’s look at an example for a fictional module ABC_Vehicles: - -
- -Example 6.2: DetailView metadata definition - - ------ - -
- -
 1 <?php
- 2 $viewdefs ['ABC_Vehicles'] ['DetailView'] = array (
- 3 	'templateMeta' => array (
- 4 		'form' => array (
- 5 			'buttons' => array (
- 6 				'EDIT',
- 7 				'DUPLICATE',
- 8 				'DELETE',
- 9 				'FIND_DUPLICATES'
-10 			)
-11 		),
-12 		'maxColumns' => '2',
-13 		'widths' => array (
-14 			array (
-15 				'label' => '10',
-16 				'field' => '30'
-17 			),
-18 			array (
-19 				'label' => '10',
-20 				'field' => '30'
-21 			)
-22 		),
-23 		'includes' => array (
-24 			array (
-25 				'file' => 'modules/ABC_Vehicles/ABC_VehiclesDetail.js'
-26 			)
-27 		)
-28 	),
-29 	'panels' => array (
-30 		'LBL_ABC_VEHICLES_INFO' => array (
-31 			array (
-32 				array (
-33 					'name' => 'name',
-34 					'comment' => 'The Name of the Vehicle',
-35 					'label' => 'LBL_NAME',
-36 				),
-37 				'reg_number'
-38 			),
-39 			array (
-40 				array (
-41 					'name' => 'type',
-42 					'label' => 'LBL_TYPE',
-43 				),
-44 				array (
-45 					'name' => 'phone_fax',
-46 					'comment' => 'The fax phone number of this company',
-47 					'label' => 'LBL_FAX'
-48 				)
-49 			),
-50 			array (
-51 				array (
-52 					'name' => 'registered_address_street',
-53 					'label' => 'LBL_REGISTERED_ADDRESS',
-54 					'type' => 'address',
-55 					'displayParams' => array (
-56 						'key' => 'registered'
-57 					)
-58 				),
-59 			),
-60 		),
-61 		'LBL_PANEL_ADVANCED' => array (
-62       array (
-63 				array (
-64 					'name' => 'assigned_user_name',
-65 					'label' => 'LBL_ASSIGNED_TO'
-66 				),
-67 				array (
-68 					'name' => 'date_modified',
-69 					'label' => 'LBL_DATE_MODIFIED',
-70 					'customCode' => '{$fields.date_modified.value} '
-71 							+ '{$APP.LBL_BY} '
-72 							+ '{$fields.modified_by_name.value}',
-73 				)
-74 			),
-75 		),
-76 	)
-77 );
-78 ?>
- -
- ------ - - -
-We see that line 2 defines an array $viewdefs['ABC_Vehicles']['DetailView'] which places a DetailView entry for the module ABC_Vehicles into $viewdefs (DetailView will be EditView or QuickCreateView as appropriate). This array has two main keys defined here: - -===== templateMeta ===== - -The templateMeta key provides information about the view in general. The ['form']['buttons'] entries define the buttons that should appear in this view. - -; maxColumns -: Defines the number of columns to use for this view. It is unusual for this to be more than 2. -; widths -: An array defining the width of the label and field for each column. -; includes -: An array of additional JavaScript files to include. This is useful for adding custom JavaScript behaviour to the page. - -===== panels ===== - -The panels entry defines the actual layout of the Detail (or Edit) view. Each entry is a new panel in the view with the key being the label for that panel. We can see in our example that we have 2 panels. One uses the label defined by the language string LBL_ABC_VEHICLES_INFO, the other uses LBL_PANEL_ADVANCED. - -Each panel has an array entry for each row, with each array containing an entry for each column. For example we can see that the first row has the following definition: - -
- -Example 6.3: DetailView metadata row definition - - ------ - -
- -
31 array(
-32 	array (
-33 		'name' => 'name',
-34 		'comment' => 'The Name of the Vehicle',
-35 		'label' => 'LBL_NAME',
-36 	),
-37 	'reg_number',
-38 ),
- -
- ------ - - -
-This has an array definition for the first row, first column and a string definition for the first row, second column. The string definition is very straightforward and simply displays the detail (or edit, as appropriate) view for that field. It will use the default label, type, etc. In our example we are displaying the field named reg_number. - -The array definition for the first row, first column is a little more complex. Each array definition must have a name value. In our example we are displaying the name field. However we also supply some other values. Values most commonly used are: - -; comment -: Used to note the purpose of the field. -; label -: The language key for this label. If the language key is not recognised then this value will be used instead (see the [[#chap08.xhtml#language-chapter|chapter on language]]). -; displayParams -: An array used to pass extra arguments for the field display. For the options and how they are used you can have a look into the appropriate field type in include/SugarFields/Fields or custom/include/SugarFields/Fields. An example is setting the size of a textarea: - -
- -Example 6.4: DetailView metadata displayParams - - ------ - -
- -
1 'displayParams' => array(
-2     'rows' => 2,
-3     'cols' => 30,
-4 ),
- -
- ------ - - -
-; customCode -: Allows supplying custom smarty code to be used for the display. The code here can include any valid smarty code and this will also have access to the current fields in this view via $fields. An example of outputing the ID field would be {$fields.id.value}. Additionally the module labels and app labels can be accessed via $MOD and $APP respectively. Finally you can use @@FIELD@@ to output the value of the field that would have been used. For example {if $someCondition}@@FIELD@@{/if} will conditionally show the field. - -==== editviewdefs.php ==== - -editviewdefs.php provides information on the layout and fields of the edit view for this module. This file uses the same structure as detailviewdefs.php. Please see the information on detailviewdefs.php. - -==== listviewdefs.php ==== - -The listviewdefs.php file for a module defines what fields the list view for that module will display. Let’s take a look at an example: - -
- -Example 6.5: ListView metadata definition - - ------ - -
- -
 1 $listViewDefs ['AOR_Reports'] =
- 2 array (
- 3   'NAME' =>
- 4   array (
- 5     'width' => '15%',
- 6     'label' => 'LBL_NAME',
- 7     'default' => true,
- 8     'link' => true,
- 9   ),
-10   'REPORT_MODULE' =>
-11   array (
-12     'type' => 'enum',
-13     'default' => true,
-14     'studio' => 'visible',
-15     'label' => 'LBL_REPORT_MODULE',
-16     'width' => '15%',
-17   ),
-18   'ASSIGNED_USER_NAME' =>
-19   array (
-20     'width' => '15%',
-21     'label' => 'LBL_ASSIGNED_TO_NAME',
-22     'module' => 'Employees',
-23     'id' => 'ASSIGNED_USER_ID',
-24     'default' => true,
-25   ),
-26   'DATE_ENTERED' =>
-27   array (
-28     'type' => 'datetime',
-29     'label' => 'LBL_DATE_ENTERED',
-30     'width' => '15%',
-31     'default' => true,
-32   ),
-33   'DATE_MODIFIED' =>
-34   array (
-35     'type' => 'datetime',
-36     'label' => 'LBL_DATE_MODIFIED',
-37     'width' => '15%',
-38     'default' => true,
-39   ),
-40 );
- -
- ------ - - -
-To define the list view defs we simply add a key to the $listViewDefs array. In this case we add an entry for AOR_Reports This array contains an entry for each field that we wish to show in the list view and is keyed by the upper case name of the field. For example, the REPORT_MODULE key refers to the report_module field of AOR_Reports. - -; type -: The type of the field. This can be used to override how a field is displayed. -; default -: Whether this field should be shown in the list view by default. If false then the field will appear in the available columns list in studio. -; studio -: Whether or not this field should be displayed in studio. This can be useful to ensure that a critical field is not removed. -; label -: The label to be used for this field. If this is not supplied then the default label for that field will be used. -; width -: The width of the field in the list view. Note that, although this is usually given as a percentage it is treated as a proportion. The example above has five columns with a width of 15% but these will actually be 20% since this is a ratio. - -==== popupdefs.php ==== - -popupdefs.php provides information on the layout, fields and search options of the module popup that is usually used when selecting a related record. - -Let’s look at the default popupdefs.php for the Accounts module: - -
- -Example 6.6: PopupView metadata definition - - ------ - -
- -
 1 $popupMeta = array(
- 2 	'moduleMain' => 'Case',
- 3 	'varName' => 'CASE',
- 4 	'className' => 'aCase',
- 5 	'orderBy' => 'name',
- 6 	'whereClauses' =>
- 7 		array('name' => 'cases.name',
- 8 				'case_number' => 'cases.case_number',
- 9 				'account_name' => 'accounts.name'),
-10 	'listviewdefs' => array(
-11 		'CASE_NUMBER' => array(
-12 			'width' => '5',
-13 			'label' => 'LBL_LIST_NUMBER',
-14 	        'default' => true),
-15 		'NAME' => array(
-16 			'width' => '35',
-17 			'label' => 'LBL_LIST_SUBJECT',
-18 			'link' => true,
-19 	        'default' => true),
-20 		'ACCOUNT_NAME' => array(
-21 			'width' => '25',
-22 			'label' => 'LBL_LIST_ACCOUNT_NAME',
-23 			'module' => 'Accounts',
-24 			'id' => 'ACCOUNT_ID',
-25 			'link' => true,
-26 	        'default' => true,
-27 	        'ACLTag' => 'ACCOUNT',
-28 	        'related_fields' => array('account_id')),
-29 		'PRIORITY' => array(
-30 			'width' => '8',
-31 			'label' => 'LBL_LIST_PRIORITY',
-32 	        'default' => true),
-33 		'STATUS' => array(
-34 			'width' => '8',
-35 			'label' => 'LBL_LIST_STATUS',
-36 	        'default' => true),
-37 	    'ASSIGNED_USER_NAME' => array(
-38 	        'width' => '2',
-39 	        'label' => 'LBL_LIST_ASSIGNED_USER',
-40 	        'default' => true,
-41 	       ),
-42 		),
-43 	'searchdefs'   => array(
-44 	 	'case_number',
-45 		'name',
-46 		array(
-47 			'name' => 'account_name',
-48 			'displayParams' => array(
-49 				'hideButtons'=>'true',
-50 				'size'=>30,
-51 				'class'=>'sqsEnabled sqsNoAutofill'
-52 			)
-53 		),
-54 		'priority',
-55 		'status',
-56 		array(
-57 			'name' => 'assigned_user_id',
-58 			'type' => 'enum',
-59 			'label' => 'LBL_ASSIGNED_TO',
-60 			'function' => array(
-61 				'name' => 'get_user_array',
-62 				'params' => array(false))
-63 			),
-64 	  )
-65 );
- -
- ------ - - -
-The popupdefs.php specifies a $popupMeta array with the following keys: - -; moduleMain -: The module that will be displayed by this popup. -; varName -: The variable name used to store the search preferences etc. This will usually simply the upper case module name. -; className -: The class name of the SugarBean for this module. If this is not supplied then moduleMain will be used. This is only really required for classes where the class name and module name differ (such as Cases). -; orderBy -: The default field the list of records will be sorted by. -; whereClauses -: Legacy option. This is only used as a fallback when there are no searchdefs. Defines the names of fields to allow searching for and their database representation. -; listviewdefs -: The list of fields displayed in the popup list view. See listviewdefs.php. -; searchdefs -: An array of the fields that should be available for searching in the popup. See the individual search defs in the searchdefs.php section (for example the basic_search array). - -==== quickcreatedefs.php ==== - -quickcreatedefs.php provides information on the layout and fields of the quick create view for this module (this is the view that appears when creating a record from a subpanel). This file uses the same structure as detailviewdefs.php. Please see the information on detailviewdefs.php. - -==== searchdefs.php ==== - -The search defs of a module define how searching in that module looks and behaves. - -Let’s look at an example. - -
- -Example 6.7: Search View metadata definition - - ------ - -
- -
  1 $searchdefs ['Accounts'] = array (
-  2 	'templateMeta' => array (
-  3 		'maxColumns' => '3',
-  4 		'maxColumnsBasic' => '4',
-  5 		'widths' => array (
-  6 			'label' => '10',
-  7 			'field' => '30'
-  8 		)
-  9 	),
- 10 	'layout' => array (
- 11 		'basic_search' => array (
- 12 			'name' => array (
- 13 				'name' => 'name',
- 14 				'default' => true,
- 15 				'width' => '10%'
- 16 			),
- 17 			'current_user_only' => array (
- 18 				'name' => 'current_user_only',
- 19 				'label' => 'LBL_CURRENT_USER_FILTER',
- 20 				'type' => 'bool',
- 21 				'default' => true,
- 22 				'width' => '10%'
- 23 			)
- 24 		)
- 25 		,
- 26 		'advanced_search' => array (
- 27 			'name' => array (
- 28 				'name' => 'name',
- 29 				'default' => true,
- 30 				'width' => '10%'
- 31 			),
- 32 			'website' => array (
- 33 				'name' => 'website',
- 34 				'default' => true,
- 35 				'width' => '10%'
- 36 			),
- 37 			'phone' => array (
- 38 				'name' => 'phone',
- 39 				'label' => 'LBL_ANY_PHONE',
- 40 				'type' => 'name',
- 41 				'default' => true,
- 42 				'width' => '10%'
- 43 			),
- 44 			'email' => array (
- 45 				'name' => 'email',
- 46 				'label' => 'LBL_ANY_EMAIL',
- 47 				'type' => 'name',
- 48 				'default' => true,
- 49 				'width' => '10%'
- 50 			),
- 51 			'address_street' => array (
- 52 				'name' => 'address_street',
- 53 				'label' => 'LBL_ANY_ADDRESS',
- 54 				'type' => 'name',
- 55 				'default' => true,
- 56 				'width' => '10%'
- 57 			),
- 58 			'address_city' => array (
- 59 				'name' => 'address_city',
- 60 				'label' => 'LBL_CITY',
- 61 				'type' => 'name',
- 62 				'default' => true,
- 63 				'width' => '10%'
- 64 			),
- 65 			'address_state' => array (
- 66 				'name' => 'address_state',
- 67 				'label' => 'LBL_STATE',
- 68 				'type' => 'name',
- 69 				'default' => true,
- 70 				'width' => '10%'
- 71 			),
- 72 			'address_postalcode' => array (
- 73 				'name' => 'address_postalcode',
- 74 				'label' => 'LBL_POSTAL_CODE',
- 75 				'type' => 'name',
- 76 				'default' => true,
- 77 				'width' => '10%'
- 78 			),
- 79 			'billing_address_country' => array (
- 80 				'name' => 'billing_address_country',
- 81 				'label' => 'LBL_COUNTRY',
- 82 				'type' => 'name',
- 83 				'options' => 'countries_dom',
- 84 				'default' => true,
- 85 				'width' => '10%'
- 86 			),
- 87 			'account_type' => array (
- 88 				'name' => 'account_type',
- 89 				'default' => true,
- 90 				'width' => '10%'
- 91 			),
- 92 			'industry' => array (
- 93 				'name' => 'industry',
- 94 				'default' => true,
- 95 				'width' => '10%'
- 96 			),
- 97 			'assigned_user_id' => array (
- 98 				'name' => 'assigned_user_id',
- 99 				'type' => 'enum',
-100 				'label' => 'LBL_ASSIGNED_TO',
-101 				'function' => array (
-102 					'name' => 'get_user_array',
-103 					'params' => array (
-104 							0 => false
-105 					)
-106 				),
-107 				'default' => true,
-108 				'width' => '10%'
-109 			)
-110 		)
-111 	)
-112 );
- -
- ------ - - -
-Here we setup a new array for Accounts in the $searchdefs array. This has two keys: - -===== templateMeta ===== - -The templateMeta key controls the basic look of the search forms. Here we define some overall layout info such as the maximum columns (3) and the maximum number of columns for the basic search (4). Finally we set the widths for the search fields and their labels. - -===== layout ===== - -The layout key contains the layout definitions for the basic search and advanced search. This is simply a list of array definition of the fields. See the section on listviewdefs.php for a description of some of the options. - -==== subpaneldefs.php ==== - -The subpaneldefs.php file provides definitions for the subpanels that appear in the detail view of a module. Let’s look at an example: - -
- -Example 6.8: Subpanel metadata definition - - ------ - -
- -
 1 $layout_defs['AOS_Quotes'] = array (
- 2 	'subpanel_setup' => array (
- 3 		'aos_quotes_aos_contracts' => array (
- 4 			'order' => 100,
- 5 			'module' => 'AOS_Contracts',
- 6 			'subpanel_name' => 'default',
- 7 			'sort_order' => 'asc',
- 8 			'sort_by' => 'id',
- 9 			'title_key' => 'AOS_Contracts',
-10 			'get_subpanel_data' => 'aos_quotes_aos_contracts',
-11 			'top_buttons' => array (
-12 				0 => array (
-13 					'widget_class' => 'SubPanelTopCreateButton'
-14 				),
-15 				1 => array (
-16 					'widget_class' => 'SubPanelTopSelectButton',
-17 					'popup_module' => 'AOS_Contracts',
-18 					'mode' => 'MultiSelect'
-19 				)
-20 			)
-21 		),
-22 		'aos_quotes_aos_invoices' => array (
-23 			'order' => 100,
-24 			'module' => 'AOS_Invoices',
-25 			'subpanel_name' => 'default',
-26 			'sort_order' => 'asc',
-27 			'sort_by' => 'id',
-28 			'title_key' => 'AOS_Invoices',
-29 			'get_subpanel_data' => 'aos_quotes_aos_invoices',
-30 			'top_buttons' => array (
-31 				0 => array (
-32 					'widget_class' => 'SubPanelTopCreateButton'
-33 				),
-34 				1 => array (
-35 					'widget_class' => 'SubPanelTopSelectButton',
-36 					'popup_module' => 'AOS_Invoices',
-37 					'mode' => 'MultiSelect'
-38 				)
-39 			)
-40 		),
-41 		'aos_quotes_project' => array (
-42 			'order' => 100,
-43 			'module' => 'Project',
-44 			'subpanel_name' => 'default',
-45 			'sort_order' => 'asc',
-46 			'sort_by' => 'id',
-47 			'title_key' => 'Project',
-48 			'get_subpanel_data' => 'aos_quotes_project',
-49 			'top_buttons' => array (
-50 				0 => array (
-51 					'widget_class' => 'SubPanelTopCreateButton'
-52 				),
-53 				1 => array (
-54 					'widget_class' => 'SubPanelTopSelectButton',
-55 					'popup_module' => 'Accounts',
-56 					'mode' => 'MultiSelect'
-57 				)
-58 			)
-59 		)
-60 	)
-61 );
- -
- ------ - - -
-In the example above we set up a definition for a module (in this case AOS_Quotes) in the $layout_defs array. This has a single key subpanel_setup which is an array of each of the subpanel definitions keyed by a name. This name should be something recognisable. In the case above it is the name of the link field displayed by the subpanel. The entry for each subpanel usually has the following defined: - -; order -: A number used for sorting the subpanels. The values themselves are arbitrary and are only used relative to other subpanels. -; module -: The module which will be displayed by this subpanel. For example the aos_quotes_project def in the example above will display a list of Project records. -; subpanel_name -: The subpanel from the displayed module which will be used. See the subpanels section of this chapter. -; sort_by -: The field to sort the records on. -; sort_order -: The order in which to sort the sort_by field. asc for ascending desc for descending. -; title_key -: The language key to be used for the label of this subpanel. -; get_subpanel_data -: Used to specify where to retrieve the subpanel records. Usually this is just a link name for the current module. In this case the related records will be displayed in the subpanel. However, for more complex links, it is possible to specify a function to call. When specifying a function you should ensure that the get_subpanel_data entry is in the form function:theFunctionName. Additionally you can specify the location of the function and any additional parameters that are needed by using the function_parameters key. An example of a subpanel which uses a function can be found in [[#chap19.xhtml#appendix-a|Appendix A]]. -; function_parameters -: Specifies the parameters for a subpanel which gets it’s information from a function (see
-get_subpanel_data). This is an array which allows specifying where the function is by using the import_function_file key (if this is absent but get_subpanel_data defines a function then the function will be called on the bean for the parent of the subpanel). Additionally this array will be passed as an argument to the function defined in get_subpanel_data which allows passing in arguments to the function. -; generate_select -: For function subpanels (see get_subpanel_data) whether or not the function will return an array representing the query to be used (for generate_select = true) or whether it will simply return the query to be used as a string. -; get_distinct_data -: Whether or not to only return distinct rows. Relationships do not allow linking two records more than once therefore this only really applies if the subpanel source is a function. See
-get_subpanel_data for information on function subpanel sources. -; top_buttons -: Allows defining the buttons to appear on the subpanel. This is simply an array of the button definitions. These definitions have, at least, the widget_class defined which decides the button class to use in include/generic/SugarWidgets. Depending on the button this array may also be used to pass in extra arguments to the widget class. - -==== subpanels ==== - -Inside the metadata folder is the subpanels folder. This allows creating different subpanel layouts for different parent modules. For example, the Contacts module will display differently in the subpanel on an account than it will in the subpanel of a case. The files inside the subpanels folder can be named anything. All that matters is that it can be referenced in the subpanel_name of the subpaneldefs.php of the parent module. The usual subpanel file is simply called default.php. Let’s look at the modules/Accounts/metadata/subpanels/default.php file: - -
- -Example 6.8: Module Subpanels definition - - ------ - -
- -
 1 $subpanel_layout = array(
- 2 	'top_buttons' => array(
- 3 		array(
- 4 			'widget_class' => 'SubPanelTopCreateButton'
- 5 		),
- 6 		array(
- 7 			'widget_class' => 'SubPanelTopSelectButton', 
- 8 			'popup_module' => 'Accounts'
- 9 		),
-10 	),
-11 	'where' => '',
-12 	'list_fields' => array (
-13 	  'name' =>
-14 	  array (
-15 	   'vname' => 'LBL_LIST_ACCOUNT_NAME',
-16 	   'widget_class' => 'SubPanelDetailViewLink',
-17 	   'width' => '45%',
-18 	   'default' => true,
-19 	  ),
-20 	  'billing_address_city' =>
-21 	  array (
-22     	'vname' => 'LBL_LIST_CITY',
-23     	'width' => '20%',
-24     	'default' => true,
-25 	  ),
-26 	  'billing_address_country' =>
-27 	  array (
-28 	  	'type' => 'varchar',
-29     	'vname' => 'LBL_BILLING_ADDRESS_COUNTRY',
-30     	'width' => '7%',
-31     	'default' => true,
-32 	  ),
-33 	  'phone_office' =>
-34 	  array (
-35 	  	'vname' => 'LBL_LIST_PHONE',
-36 	  	'width' => '20%',
-37 	  	'default' => true,
-38 	  ),
-39 	  'edit_button' =>
-40 	  array (
-41 	  	'vname' => 'LBL_EDIT_BUTTON',
-42 	  	'widget_class' => 'SubPanelEditButton',
-43 	  	'width' => '4%',
-44 	  	'default' => true,
-45 	  ),
-46 	  'remove_button' =>
-47 	  array (
-48 	    'vname' => 'LBL_REMOVE',
-49 	    'widget_class' => 'SubPanelRemoveButtonAccount',
-50 	    'width' => '4%',
-51 	    'default' => true,
-52 	  ),
-53    )
-54 );
- -
- ------ - - -
-There are three keys in the $subpanel_layout variable for this subpanel. These are: - -; top_buttons -: Defines the buttons that will appear at the top of the subpanel. See the top_buttons key in subpaneldefs.php. -; where -: Allows the addition of conditions to the where clause. For example this could be used to exclude Cases that are closed (cases.state != "Closed") or only include Accounts of a specific industry (accounts.industry = "Media"). Note that in these examples we specify the table to remove any ambiguity in the query. -; list_fields -: Defines the list of fields to be displayed in this subpanel. See the section on listviewdefs.php for more information. - -==== studio.php ==== - -studio.php is the simplest file in metadata and it’s existence is simply used to confirm if a module should be shown in studio for user tweaking. Note that, unlike other metadata files, the file in modules/<TheModule>/metadata/studio.php will be the only one checked. A file in custom/modules/<TheModule>/metadata/studio.php will have no effect. - - -
- - -
- -== 7. Controllers == - -SuiteCRM follows the MVC (Model-View-Controller) pattern and as such has the concept of controllers. The controller is responsible for making changes to the Model as well as passing control to the view as appropriate. SuiteCRM has the concept of actions which are actions that will be taken by the controller. Let’s take a look at a SuiteCRM URL: - -
- -Example 7.1: Example SuiteCRM URL - - ------ - -
- -
example.com/index.php?module=Accounts&action=index
- -
- ------ - - -
-In this (rather boring) example we see that the module is Accounts. This will determine which controller to use and then call the index action on that controller. - -SuiteCRM will first look for the controller in custom/module/<TheModule>/controller.php. If this is not found then next module/<TheModule>/controller.php will be checked. Finally if neither of these controllers exist then the default controller will be used. The default controller can be found in include/MVC/Controller/SugarController.php. - -=== Customising controllers === - -Ordinarily the default controller handles the request and delegates to the appropriate views etc. However custom controllers can be used to add or alter functionality. Let’s look at adding a new action. - -In the first instance we will have to add our custom controller. This will vary slightly depending on the nature of the module. - -==== Custom module ==== - -In this case we can place the file directly into our module. You should create a new file (if it doesn’t exist) at modules/<TheModule>/controller.php. The contents will look similar to: - -
- -Example 7.2: Creating a custom controller for a custom module - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 class <TheModule>Controller extends SugarController
-4 {
-5 
-6 }
- -
- ------ - - -
-==== Pre-existing modules ==== - -For pre-existing modules you should add the controller to
-custom/modules/<TheModule>/controller.php. - -The contents of this file will vary depending on whether you wish to extend the existing controller (if it exists) or create your own version completely. It is usually best to extend the existing controller since this will retain important logic. You should note the naming convention here. We name the class
-Custom<TheModule>Controller. - -Here we don’t extend the existing controller or no such controller exists: - -
- -Example 7.3: Creating a custom controller for an existing module - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 class Custom<TheModule>Controller extends SugarController
-4 {
-5 
-6 }
- -
- ------ - - -
-Alternatively we extend the existing controller. Note that we are requiring the existing controller: - -
- -Example 7.4: Creating a custom controller for an existing module with an existing controller - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 
-4 require_once 'modules/<TheModule>/controller.php';
-5 
-6 class Custom<TheModule>Controller extends <TheModule>Controller
-7 {
-8 
-9 }
- -
- ------ - - -
-==== Adding the action ==== - -Now we can add a new action to our controller. Actions are created as methods on the controller with the name action_<actionName>. For example, to create a new action called ‘echo’ we could create the following method in one of the controllers we have created above. This can then perform whatever logic that is needed. In our example we will log the REQUEST and simply redirect: - -
- -Example 7.5: Adding a custom controller action method - - ------ - -
- -
1 public function action_echo(){
-2   $GLOBALS['log']->debug("Echo called with request: ".print_r($_REQUEST,1));
-3   SugarApplication::redirect('index.php');
-4 }
- -
- ------ - - -
-==== Legacy Style ==== - -In previous versions of SugarCRM a new action was added by creating a file in either modules/<TheModule>/<actionname>.php or custom/modules/<TheModule>/<actionname>.php. Although this still works it is not recommended. - - -
- - -
- -== 8. Entry Points == - -Entry points are simply a page which provides access to SuiteCRM. These can be used for a variety of purposes such as allowing an external form simple access to SuiteCRM or, as is the case with the stock Events module, allowing an event invite to be responded to by clicking a link in an email. - -=== Creating an entry point === - -Let’s create a simple entry point to display the time. First we define this entry point in a new file in: - -
- -Example 8.1: Entry point registry location - - ------ - -
- -
custom/Extension/application/Ext/EntryPointRegistry/
- -
- ------ - - -
-For our example we’ll call our new file MyTimeEntryPoint.php - -
- -Example 8.2: Example entry point location - - ------ - -
- -
custom/Extension/application/Ext/EntryPointRegistry/MyTimeEntryPoint.php
- -
- ------ - - -
-In this file we will add a new entry to the $entry_point_registry. We supply the file that should be called. Here we are simply placing the file in custom if the entry point is related to a specific module it is usually a good idea to place this somewhere inside custom/<TheModule>/. - -In addition we supply an “auth” parameter. If “auth” is true then anyone accessing the entry point will need to be logged into SuiteCRM. - -
- -Example 8.3: Adding an entry point entry - - ------ - -
- -
1 <?php
-2 	$entry_point_registry['MyTimeEntryPoint'] = array(
-3 	    'file' => 'custom/MyTimeEntryPoint.php',
-4 	    'auth' => true,
-5 	);
- -
- ------ - - -
-Finally we add the actual logic itself inside custom/MyTimeEntryPoint.php: - -
- -Example 8.4: Example entry point that outputs the current time - - ------ - -
- -
1 <?php
-2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
-3 $date = new DateTime();
-4 echo $date->format('r');
- -
- ------ - - -
-After a Quick Repair and Rebuild we can access our entry point: - -
- -Example 8.5: Custom entry point URL - - ------ - -
- -
example.com/index.php?entryPoint=MyTimeEntryPoint
- -
- ------ - - -
-and we should see something similar to: - -
- -Example 8.6: MyTimeEntryPoint - - ------ - -
- -
Sun, 15 Mar 2015 13:03:03 +0000
- -
- ------ - - -
-Obviously this is a contrived example but any logic that can be performed elsewhere in SuiteCRM can be performed in an entry point (for example creating or editing [[#chap02.xhtml#working-with-beans-chapter|SugarBeans]]). - - -
- - -
- -== 9. Language Strings == - -Language strings provide an element of internationalisation to SuiteCRM. It allows specifying different strings to be used in different languages making it much easier to provide translations for modules and customisations. Even if you are only targeting a single language it is still worth using the language string functionality in SuiteCRM because it allows the simple changing of strings within SuiteCRM and it also allows users to customise the labels used in your customisations. There are three main types of language strings that we will cover here. - -At the core, the language strings are a key value store. The keys are used throughout SuiteCRM and the values are loaded based on the current language. - -Languages are handled in SuiteCRM by prefixing the file name with the IETF language code for the language that this file contains. Here are some examples of different language file names: - -
- -Example 9.1: Example language file names - - ------ - -
- -
# Core Accounts language file for en_us (United States English)
-modules/Accounts/language/en_us.lang.php
-
-# Core Cases language file for es_es (Spanish as spoken in Spain)
-modules/Cases/language/es_es.lang.php
-
-# Custom language file for de_de (German)
-custom/Extension/application/Ext/Language/de_de.SomeCustomPackage.php
- -
- ------ - - -
-SuiteCRM will choose the language prefix to be used based on the language the user selected when logging in or the default language if none was selected. Generally when a language file is loaded the default language files and the en_us files will also be loaded. These files are then merged. This ensures that there will still be a definition if there are language keys in either en_us or the default language that don’t have definitions in the current language. In essence the language “falls back” to the default language and en_us if there are missing keys. - -=== Module Strings === - -==== Use ==== - -Module strings are strings associated with a particular module. These are usually, for example, field labels and panel name labels, but they may be used for anything that is specific to a single module. - -==== Definition location ==== - -Module strings are defined in the $mod_strings array. This is initially defined in
-modules/<TheModule>/language/<LanguageTag>.lang.php, for example
-modules/Accounts/language/en_us.lang.php. - -==== Customisation location ==== - -Customisations can be made to the module strings by adding a new file in
-custom/Extension/modules/<TheModule>/Ext/Language/<LanguageTag>.<Name>.php (<Name> in this case should be used to give it a descriptive name). An example is custom/Extension/modules/Accounts/Ext/Language/en_us.MyLanguageFile.php. See the Extensions section for more information on the Extensions folder. - -=== Application Strings === - -==== Use ==== - -Application strings are used for language strings and labels that are not specific to a single module. Examples of these may include labels that will appear in the headers or footers, labels that appear on search buttons throughout SuiteCRM or labels for pagination controls. - -==== Definition location ==== - -The application strings are defined in the $app_strings array. This is initially defined in
-include/language/<LanguageTag>.lang.php. - -==== Customisation location ==== - -Customisations can be made to the application strings in two ways. Firstly you can edit the file
-custom/include/language/<LanguageTag>.lang.php. However to promote modularity it is recommended that you add a new file in the location
-custom/Extension/application/Ext/Language/<LanguageTag>.<Name>.php. For example
-custom/Extension/application/Ext/Language/es_es.MyAppLanguageFile.php. <Name> should be used to give the file a descriptive name. See the Extensions section for more information on the Extensions folder. - -=== Application List Strings === - -==== Use ==== - -Application list strings are used to store the various dropdowns and lists used in SuiteCRM. Most of these are used as options for the various enum fields in SuiteCRM e.g the account type or the opportunity sales stage. - -==== Definition location ==== - -The application list strings are defined in the $app_list_strings array. Similar to the $app_strings array this is initially defined in include/language/en_us.lang.php. - -==== Customisation location ==== - -Customisations can be made to the application list strings in two ways. Firstly you can edit the file
-custom/include/language/<LanguageTag>.lang.php. However to promote modularity it is recommended that you add a new file in the location
-custom/Extension/application/Ext/Language/<LanguageTag>.<Name>.php (<Name> should be used to give the file a descriptive name). For example
-custom/Extension/application/Ext/Language/es_es.MyAppListLanguageFile.php. See the Extensions section for more information on the Extensions folder. - -=== Why and when to customise === - -Generally language strings should be changed from within SuiteCRM using the studio tool. However there are times when it can be simpler to add or modify language strings as described in the previous section. If you are importing a large number of language strings or dropdown options it can be simpler to create a new file to add these values. Similarly if you are adding entirely new functionality, it is usually best to simply add these language strings as new values. - -=== Usage === - -Language strings are used automatically throughout SuiteCRM. For example in metadata you can specify the language strings to display for fields. However in some cases you will want to access and use the language strings in custom code. There are several ways to do this. - -==== Globals ==== - -The $mod_strings, $app_strings and $app_list_strings variables are all global and can be accessed as such. $app_strings and $app_list_strings will always be available. However $mod_strings will only contain the strings for the current module (see the next section for other ways of accessing $mod_strings). - -
- -Example 9.2: Accessing language strings globally - - ------ - -
- -
 1 function someFunction(){
- 2     global $mod_strings, $app_strings, $app_list_strings;
- 3     /*
- 4      * Grab the label LBL_NAME for the current module
- 5      * In most modules this will be the label for the
- 6      * name field of the module.
- 7      */
- 8     $modLabel = $mod_strings['LBL_NAME'];
- 9 
-10     $appLabel = $app_strings['LBL_GENERATE_LETTER'];
-11 
-12     /*
-13      * Unlike the previous two examples $appListLabel will be an
-14      * array of the dropdowns keys to it's display labels.
-15      */
-16     $appListLabel = $app_list_strings['aos_quotes_type_dom'];
-17 
-18     //Here we just log out the strings
-19     $GLOBALS['log']->debug("The module label is $modLabel");
-20     $GLOBALS['log']->debug("The app label is $appLabel");
-21     $GLOBALS['log']->debug("The app list label is ".print_r($appListLabel,1));
-22 }
- -
- ------ - - -
-==== Translate ==== - -As an alternative to using globals or, if you are in a different module than the language string you wish to retrieve you can use the translate method. - -
- -Example 9.3: translate method signature - - ------ - -
- -
1 translate(
-2         $string,
-3         $mod='',
-4         $selectedValue='')
- -
- ------ - - -
-; $string -: The language string to be translated. -; $mod -: The module this string should come from. Defaults to the current module if empty. -; $selectedValue -: For dropdown strings. This will return the label for the key $selectedValue - -Here is an example of the above in action. Note that we do not have to worry about whether the label is a Module string, an Application string or an Application list string, as all of these will be checked (in that order - the first matching value will be returned). - -
- -Example 9.4: Example translate method calls - - ------ - -
- -
 1 function someFunction(){
- 2   //Grab the label LBL_NAME for the current module
- 3   $modLabel = translate('LBL_NAME');
- 4 
- 5   //Grab the label LBL_NAME for the AOS_Products module
- 6   $productModLabel = translate('LBL_NAME','AOS_Products');
- 7 
- 8   $appLabel = translate('LBL_GENERATE_LETTER');
- 9 
-10   /*
-11    * Return the label for the `Other` option of the `aos_quotes_type_dom`
-12    * We don't care about the module so this is left blank.
-13    */
-14   $appListLabel = translate('aos_quotes_type_dom','','Other');
-15 
-16   //Here we just log out the strings
-17   $GLOBALS['log']->debug("The module label is $modLabel");
-18   $GLOBALS['log']->debug("The module label for Products is $productModLabel");
-19   $GLOBALS['log']->debug("The app label is $appLabel");
-20   $GLOBALS['log']->debug("The app list label is ".print_r($appListLabel,1));
-21 }
- -
- ------ - - -
-==== JavaScript ==== - -Finally, you may be using JavaScript (for example in a view), and wish to display a language string. For this you can use the SUGAR.language.get method, which is similar to the translate method in example 9.3. - -
- -Example 9.5: SUGAR.language.get method signature - - ------ - -
- -
1 SUGAR.language.get(
-2               module,
-3               str
-4 );
- -
- ------ - - -
-; module -: The module a language string will be returned for. You should supply app_strings or
-app_list_strings if the label you wish to retrieve is not a module string. -; str -: The key you want to retrieve a label for. - -
- -Example 9.6: Example SUGAR.language.get method calls - - ------ - -
- -
 1 function someFunction(){
- 2 
- 3   /*
- 4    * Grab the label LBL_NAME for AOS_Products
- 5    * Note that, unlike the translate function in example 9.3
- 6    * the module name is required.
- 7    */
- 8 
- 9   var modLabel = SUGAR.language.get('AOS_Products', 'LBL_NAME');
-10 
-11   /*
-12    * As mentioned above we explicitly need to pass if we are retrieving
-13    * an app_string or app_list_string
-14    */
-15   var appLabel = SUGAR.language.get('app_strings', 'LBL_GENERATE_LETTER');
-16   var appListLabel = SUGAR.language.get('app_list_strings',
-17                                         'aos_quotes_type_dom');
-18 
-19   //Here we just log out the strings
-20   console.log("The module label is "+modLabel);
-21   console.log("The app label is "+appLabel);
-22   console.log("The app list label is "+appListLabel);
-23 }
- -
- ------ - - -
- -
- - -
- -== 10. Config == - -=== The config files === - -There are two main config files in SuiteCRM, both of which are in the root SuiteCRM folder. These are config.php and config_override.php. The definitions in here provide various configuration options for SuiteCRM. All the way from the details used to access the database to how many entries to show per page in the list view. Most of these options are accessible from the SuiteCRM administration page. However some are only definable in the config files. - -==== config.php ==== - -This is the main SuiteCRM config file and includes important information like the database settings and the current SuiteCRM version. - -Generally settings in this file wont be changed by hand. An exception to this is if SuiteCRM has been moved or migrated. In which case you may need to change the database settings and the site_url. Let’s look at the database settings first: - -
- -Example 10.1: Database config definition - - ------ - -
- -
 1 'dbconfig' =>
- 2 array (
- 3   'db_host_name' => 'localhost',
- 4   'db_host_instance' => 'SQLEXPRESS',
- 5   'db_user_name' => 'dbuser',
- 6   'db_password' => 'dbpass',
- 7   'db_name' => 'dbname',
- 8   'db_type' => 'mysql',
- 9   'db_port' => '',
-10   'db_manager' => 'MysqliManager',
-11 ),
- -
- ------ - - -
-Here we can see this instance is setup to access a local MySQL instance using the username/password dbuser/dbpass and accessing the database named ‘dbname’. - -The site url settings are even simpler: - -
- -Example 10.2: Setting the site URL - - ------ - -
- -
  'site_url' => 'http://example.com/suitecrm',
- -
- ------ - - -
-The site url for the above is simply ‘http://example.com/suitecrm’ if we were moving this instance to, for example, suite.example.org, then we can simply place that value in the file. - -These are generally the only two instances where you would directly change config.php. For other changes you would either make the change through SuiteCRM itself or you would use the
-config_override.php file. - -==== config_override.php ==== - -config_override.php allows you to make config changes without risking breaking the main config file. This is achieved quite simply by adding, editing or removing items from the $sugar_config variable. The config_override.php file will be merged with the existing config allowing, as the name suggests, overriding the config. For example in config_override.php we can add our own, new, config item: - -
- -Example 10.3: Adding a custom config value - - ------ - -
- -
$sugar_config['enable_the_awesome'] = true;
- -
- ------ - - -
-or we can edit an existing config option in a very similar manner by simply overwriting it: - -
- -Example 10.4: Overwriting an existing config value - - ------ - -
- -
$sugar_config['logger']['level'] = 'debug';
- -
- ------ - - -
-=== Using config options === - -We may want to access config options in custom code (or as detailed above if we have created our own config setting we may want to use that). We can easily get the config using the php global keyword: - -
- -Example 10.5: Accessing a config setting within SuiteCRM - - ------ - -
- -
1 function myCustomLogic(){
-2   //Get access to config
-3   global $sugar_config;
-4   //use the config values
-5   if(!empty($sugar_config['enable_the_awesome'])){
-6     doTheAwesome();
-7   }
-8 }
- -
- ------ - - -
- -
- - -
- -== 11. Logging == - -=== Logging messages === - -Logging in SuiteCRM is achieved by accessing the log global. Accessing an instance of the logger is as simple as - -
- -Example 11.1: Accessing the log - - ------ - -
- -
$GLOBALS['log']
- -
- ------ - - -
-This can then be used to log a message. Each log level is available as a method. For example: - -
- -Example 11.2: Logging messages - - ------ - -
- -
1 $GLOBALS['log']->debug('This is a debug message');
-2 $GLOBALS['log']->error('This is an error message');
- -
- ------ - - -
-This will produce the following output: - -
- -Example 11.3: Logging messages example output - - ------ - -
- -
1 Tue Apr 28 16:52:21 2015 [15006][1][DEBUG] This is a debug message
-2 Tue Apr 28 16:52:21 2015 [15006][1][ERROR] This is an error message
- -
- ------ - - -
-=== Logging output === - -The logging output displays the following information by default: - -
- -Example 11.4: Logging messages example output - - ------ - -
- -
<Date> [<ProcessId>][<UserId>][<LogLevel>] <LogMessage>
- -
- ------ - - -
-; <Date> -: The date and time that the message was logged. -; <ProcessId> -: The PHP process id. -; <UserId> -: The ID of the user that is logged into SuiteCRM. -; <LogLevel> -: The log level for this log message. -; <LogMessage> -: The contents of the log message. - -=== Log levels === - -Depending on the level setting in admin some messages will not be added to the log e.g if your logger is set to error then you will only see log levels of error or higher (error, fatal and security). - -The default log levels (in order of verbosity) are: - -* debug -* info -* warn -* deprecated -* error -* fatal -* security - -Generally on a production instance you will use the less verbose levels (probably error or fatal). However whilst you are developing you can use whatever level you prefer. I prefer the most verbose level - debug. - - -
- - -
- -== 12. Logic Hooks == - -=== Intro === - -Logic hooks allow you to hook into various events in SuiteCRM to fire custom code. This can allow you to, for example, make a call to an external API, or to create a new record if certain events occur. - -=== Types === - -Logic hooks can occur in three contexts. These contexts are Application Hooks, Module Hooks and User Hooks. These are detailed below. - -=== Application Hooks === - -Application hooks are hooks which are fired in the application context (that is, they are not fired against a particular module). These hooks must be defined in the top level logic hook (i.e. custom/modules/logic_hooks.php). - -; after_entry_point -: Called after SuiteCRM has initialised but before any other processing is carried out. -; after_ui_footer -: Called after the UI footer. -; after_ui_frame -: Fired after the UI has been displayed but before the footer has been displayed. -; server_round_trip -: Fired at the end of every page request. - -=== User Hooks === - -User hooks are fired for certain login/logout actions. Similar to Application Hooks, these hooks must be defined in the top level logic hook (i.e. custom/modules/logic_hooks.php). - -; after_login -: Fired after a user logs in to SuiteCRM . -; after_logout -: Fired when a user logs out of SuiteCRM. -; before_logout -: Fired before a user logs out of SuiteCRM. -; login_failed -: Fired when a user attempts to login to SuiteCRM but the login fails. - -=== Module Hooks === - -Module Hooks are called on various record actions for a specific module. - -; after_delete -: Fired when a record is deleted. -; after_relationship_add -: Fired after a relationship is added between two records. Note that this may be called twice, once for each side of the relationship. -; after_relationship_delete -: Fired after a relationship between two records is deleted. -; after_restore -: Fired after a record is undeleted. -; after_retrieve -: Fired after a record is retrieved from the DB. -; after_save -: Fired after a record is saved. Note that due to some peculiarities some related modules may not be persisted to the database. The logic hook is fired within the SugarBean classes save method. Some implementing classes may save related beans after this method returns. A notable example of this is the saving of email addresses in Company modules. -; before_delete -: Fired before a record is deleted. -; before_relationship_add -: Fired before a relationship is added between two records. Note that this may be called twice, once for each side of the relationship. -; before_relationship_delete -: Fired before a relationship between two records is deleted. Note that this may be called twice, once for each side of the relationship. -; before_restore -: Fired before a record is undeleted. -; before_save -: Fired before a record is saved. -; handle_exception -: Fired when an exception occurs in a record. -; process_record -: Fired when a record is processed ready to be displayed in list views or dashlets. - -=== Job Queue Hooks === - -Job queue hooks are fired for scheduler jobs. Similar to application hooks these hooks must be defined in the top level logic hook (i.e. custom/modules/logic_hooks.php). - -; job_failure -: Fired when a scheduled job either returns false to signify failure or throws an exception and it will not be retried. See the section on [[#chap12.xhtml#scheduled-tasks-chapter|Scheduled Tasks]]. -; job_failure_retry -: Fired when a scheduled job either returns false to signify failure or throws an exception but it will be retried. See the section on [[#chap12.xhtml#scheduled-tasks-chapter|Scheduled Tasks]]. - -=== Implementing === - -Depending on the Logic Hook type logic hooks are either placed into
-custom/modules/Logic_Hooks.php or custom/modules/<TargetModule>/Logic_Hooks.php. - -==== Logic_Hooks.php ==== - -The logic hook file itself specifies which logic hooks to fire on this event. It looks something like this: - -
- -Example 12.1: Logic hook file - - ------ - -
- -
 1 <?php
- 2 // Do not store anything in this file that is not part of the array or the hook
- 3 //version.  This file will be automatically rebuilt in the future.
- 4  $hook_version = 1;
- 5 $hook_array = Array();
- 6 // position, file, function
- 7 $hook_array['before_save'] = Array();
- 8 $hook_array['before_save'][] = Array(
- 9                               77,
-10                               'updateGeocodeInfo',
-11                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-12                               'CasesJjwg_MapsLogicHook',
-13                               'updateGeocodeInfo');
-14 $hook_array['before_save'][] = Array(
-15                               10,
-16                               'Save case updates',
-17                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-18                               'CaseUpdatesHook',
-19                               'saveUpdate');
-20 $hook_array['before_save'][] = Array(
-21                               11,
-22                               'Save case events',
-23                               'modules/AOP_Case_Events/CaseEventsHook.php',
-24                               'CaseEventsHook',
-25                               'saveUpdate');
-26 $hook_array['before_save'][] = Array(
-27                               12,
-28                               'Case closure prep',
-29                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-30                               'CaseUpdatesHook',
-31                               'closureNotifyPrep');
-32 $hook_array['before_save'][] = Array(
-33                               1,
-34                               'Cases push feed',
-35                               'custom/modules/Cases/SugarFeeds/CaseFeed.php',
-36                               'CaseFeed',
-37                               'pushFeed');
-38 $hook_array['after_save'] = Array();
-39 $hook_array['after_save'][] = Array(
-40                               77,
-41                               'updateRelatedMeetingsGeocodeInfo',
-42                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-43                               'CasesJjwg_MapsLogicHook',
-44                               'updateRelatedMeetingsGeocodeInfo');
-45 $hook_array['after_save'][] = Array(
-46                               10,
-47                               'Send contact case closure email',
-48                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-49                               'CaseUpdatesHook',
-50                               'closureNotify');
-51 $hook_array['after_relationship_add'] = Array();
-52 $hook_array['after_relationship_add'][] = Array(
-53                               77,
-54                               'addRelationship',
-55                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-56                               'CasesJjwg_MapsLogicHook',
-57                               'addRelationship');
-58 $hook_array['after_relationship_add'][] = Array(
-59                               9,
-60                               'Assign account',
-61                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-62                               'CaseUpdatesHook',
-63                               'assignAccount');
-64 $hook_array['after_relationship_add'][] = Array(
-65                               10,
-66                               'Send contact case email',
-67                               'modules/AOP_Case_Updates/CaseUpdatesHook.php',
-68                               'CaseUpdatesHook',
-69                               'creationNotify');
-70 $hook_array['after_relationship_delete'] = Array();
-71 $hook_array['after_relationship_delete'][] = Array(
-72                               77,
-73                               'deleteRelationship',
-74                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-75                               'CasesJjwg_MapsLogicHook',
-76                               'deleteRelationship');
- -
- ------ - - -
-Let’s go through each part of the file. - -
- -
- -
4 $hook_version = 1;
- -
- -
-This sets the hook version that we are using. Currently there is only one version so this line is unused. - -
- -
- -
5 $hook_array = Array();
- -
- -
-Here we set up an empty array for our Logic Hooks. This should always be called $hook_array. - -
- -
- -
7 $hook_array['before_save'] = Array();
- -
- -
-Here we are going to be adding some before_save hooks so we add an empty array for that key. - -
- -
- -
 8 $hook_array['before_save'][] = Array(
- 9                               77,
-10                               'updateGeocodeInfo',
-11                               'custom/modules/Cases/CasesJjwg_MapsLogicHook.php',
-12                               'CasesJjwg_MapsLogicHook',
-13                               'updateGeocodeInfo');
- -
- -
-Finally we reach an interesting line. This adds a new logic hook to the before_save hooks. This array contains 5 entries which define this hook. These are: - -===== Sort order ===== - -The first argument (77) is the sort order for this hook. The logic hook array is sorted by this value. If you wish for a hook to fire earlier you should use a lower number. If you wish for a hook to be fired later you should use a higher number. The numbers themselves are arbitrary. - -===== Hook label ===== - -The second argument (‘updateGeocodeInfo’) is simply a label for the logic hook. This should be something short but descriptive. - -===== Hook file ===== - -The third argument is where the actual class for this hook is. In this case it is in a file called custom/modules/Cases/CasesJjwg_MapsLogicHook.php. Generally you will want the files to be somewhere in custom and it is usual to have them in custom/modules/<TheModule>/<SomeDescriptiveName>.php or custom/modules/<SomeDescriptiveName>.php for Logic Hooks not targeting a specific module. However the files can be placed anywhere. - -===== Hook class ===== - -The fourth argument is the class name for the Logic Hook class. In this case
-CasesJjwg_MapsLogicHook. It is usual for the class name to match the file name but this is not required. - -===== Hook method ===== - -The fifth, and final, argument is the method that will be called on the class. In this case updateGeocodeInfo. - -==== Adding your own logic hooks ==== - -When adding logic hooks you should make full use of the Extensions framework (see the section on Extensions). This involves creating a file in
-custom/Extension/application/Ext/LogicHooks/ for application hooks and
-custom/Extension/modules/<TheModule>/Ext/LogicHooks/ for module specific hooks. These files can then add to/alter the $hook_array as appropriate. - -{| -|width="50%"| [[File:images/leanpub_info-circle.png|50px|class=sidebar-image|information]] -|width="50%"| After adding a new logic hook it is necessary to perform a quick repair and rebuild in the admin menu for this to be picked up. -|} - -==== Logic Hook function ==== - -The logic hook function itself will vary slightly based on the logic hook type. For module hooks it will appear similar to: - -
- -Example 12.2: Example logic hook method - - ------ - -
- -
1     class SomeClass
-2     {
-3         function someMethod($bean, $event, $arguments)
-4         {
-5           //Custom Logic
-6         }
-7     }
- -
- ------ - - -
-Application logic hooks omit the $bean argument: - -
- -Example 12.3: Example logic hook method for application hooks - - ------ - -
- -
1     class SomeClass
-2     {
-3         function someMethod($event, $arguments)
-4         {
-5           //Custom Logic
-6         }
-7     }
- -
- ------ - - -
-===== $bean (SugarBean) ===== - -The $bean argument passed to your logic hook is usually the bean that the logic hook is being performed on. For User Logic Hooks this will be the current User object. For module logic hooks (such as before_save) this will be the record that is being saved. For job queue logic hooks this will be the SchedulersJob bean. Note that for Application Logic Hook this argument is not present. - -===== $event (string) ===== - -The $event argument contains the logic hook event e.g process_record, before_save,
-after_delete etc. - -===== $arguments (array) ===== - -The $arguments argument contains any additional details of the logic hook event. I.e. in the case of before_relationship_add this will contain details of the related modules. - -=== Tips === - -{| -|width="50%"| [[File:images/leanpub_info-circle.png|50px|class=sidebar-image|information]] -|width="50%"| -==== Triggering extra logic hooks ==== - -If you are performing certain actions that may trigger another logic hook (such as saving a bean) then you need to be aware that this will trigger the logic hooks associated with that bean and action. This can be troublesome if this causes a logic hook loop of saves causing further saves. One way around this is to simply be careful of the hooks that you may trigger. If doing so is unavoidable you can usually set an appropriate flag on the bean and then check for that flag in subsequent hooks. -|} - -{| -|width="50%"| [[File:images/leanpub_info-circle.png|50px|class=sidebar-image|information]] -|width="50%"| -==== Think of the user ==== - -Most logic hooks will cause additional code which can degrade the users experience. If you have long running code in the after_save the user will need to wait for that code to run. This can be avoided by either ensuring the code runs quickly or by using the Job Queue (see the Job Queue chapter for more information). -|} - - -
- - -
- -== 13. Scheduled Tasks == - -=== Intro === - -Scheduled tasks are performed in SuiteCRM by the scheduler module. Jobs are placed into the queue either through the defined scheduled tasks or, for one off tasks, by code creating job objects. Note that both scheduled tasks and using the job queue requires that you have the schedulers set up. This will vary depending on your system but usually requires adding an entry either to Cron (for Linux systems) or to the windows scheduled tasks (for windows). Opening the scheduled tasks page within SuiteCRM will let you know the format for the entry. - -=== Scheduler === - -Scheduled tasks allow SuiteCRM to perform recurring tasks. Examples of these which ship with SuiteCRM include checking for incoming mail, sending email reminder notifications and indexing the full text search. What if you want to create your own tasks? - -SuiteCRM lets you define your own Scheduler. We do this by creating a file in
-custom/Extension/modules/Schedulers/Ext/ScheduledTasks/. You can give this file a name of your choice but it is more helpful to give it a descriptive name. Let’s create a simple file named
-custom/Extension/modules/Schedulers/Ext/ScheduledTasks/CleanMeetingsScheduler.php. This will add a new job to the job strings and a new method that the scheduler will call: - -
- -Example 13.1: Example Clean Meetings Scheduler - - ------ - -
- -
 1 <?php
- 2 /*
- 3  * We add the method name to the $job_strings array.
- 4  * This is the method that jobs for this scheduler will call.
- 5  */
- 6 $job_strings[] = 'cleanMeetingsScheduler';
- 7 
- 8 /**
- 9  * Example scheduled job to change any 'Planned' meetings older than a month
-10  * to 'Not Held'.
-11  * @return bool
-12  */
-13 function cleanMeetingsScheduler(){
-14   //Get the cutoff date for which meetings will be considered
-15 	$cutOff = new DateTime('now - 1 month');
-16 	$cutOff = $cutOff->format('Y-m-d H:i:s');
-17 
-18 	//Get an instance of the meetings bean for querying
-19   //see the Working With Beans chapter.
-20   $bean = BeanFactory::getBean('Meetings');
-21 
-22   //Get the list of meetings older than the cutoff that are marked as Planned
-23   $query = "meetings.date_start < '$cutOff' AND meetings.status = 'Planned'";
-24   $meetings = $bean->get_full_list('',$query);
-25 
-26   foreach($meetings as $meeting){
-27     //Mark each meeting as Not Held
-28     $meeting->status = 'Not Held';
-29     //Save the meeting changes
-30     $meeting->save();
-31   }
-32   //Signify we have successfully ran
-33   return true;
-34 }
- -
- ------ - - -
-We also make sure that we add a language file in
-custom/Extension/modules/Schedulers/Ext/Language/en_us.cleanMeetingsScheduler.php again, the name of the file doesn’t matter but it is helpful to use something descriptive. This will define the language string for our job so the user sees a nice label. See the section on language strings for more information. The key for the mod strings will be LBL_UPPERMETHODNAME. In our case our method name is cleanMeetingsScheduler so our language label key will be LBL_CLEANMEETINGSSCHEDULER. - -
- -Example 13.2: Example Language string for Clean Meetings Scheduler - - ------ - -
- -
1 <?php
-2 //We add the mod string for our method here.
-3 $mod_strings['LBL_CLEANMEETINGSSCHEDULER'] = 'Mark old, planned meetings as Not \
-4 Held';
- -
- ------ - - -
-If we perform a repair and rebuild our method will now be packaged up into the scheduler ext file (see the Extensions section for more information on this process) and will be available in the schedulers page. Note that for any changes to the scheduler method you will need to perform another quick repair and rebuild - even in developer mode. We can now create a new scheduler to call our new method: - -
- -[[File:images/CreateMeetingsScheduler.png|Creating a scheduler that uses our new method]] -Creating a scheduler that uses our new method - - -
-This will now behave just like any other scheduler and we can have this run as often (or as rarely) as we would like. Take care here. The default frequency is every one minute. If your task is heavy duty or long running this may not be what you would prefer. Here we settle for once a day. - -=== Job Queue === - -Sometimes you will require code to perform a long running task but you do not need the user to wait for this to be completed. A good example of this is sending an email in a logic hook (see the Logic Hooks chapter for information on these). Assuming we have the following logic hook: - -
- -Example 13.3: Example Email sending Logic Hook - - ------ - -
- -
 1 class SomeClass
- 2 {
- 3     function SomeMethod($bean, $event, $arguments)
- 4     {
- 5 
- 6         //Perform some setup of the email class
- 7         require_once "include/SugarPHPMailer.php";
- 8         $mailer=new SugarPHPMailer();
- 9         $admin = new Administration();
-10         $admin->retrieveSettings();
-11         $mailer->prepForOutbound();
-12         $mailer->setMailerForSystem();
-13         $admin = new Administration();
-14         $admin->retrieveSettings();
-15         $admin->settings['notify_fromname']
-16         $mailer->From     = $admin->settings['notify_fromaddress']
-17         $mailer->FromName = $emailSettings['from_name'];
-18         $mailer->IsHTML(true);
-19 
-20         //Add message and recipient.
-21         //We could go all out here and load and populate an email template
-22         //or get the email address from the bean
-23         $mailer->Subject = 'My Email Notification! '.$bean->name;
-24         $mailer->Body = $event. ' fired for bean '.$bean->name;
-25         $mailer->AddAddress('Jim@example.com');
-26         return $mailer->Send();
-27     }
-28 }
- -
- ------ - - -
-This will work fine. However you do not want the user to have to wait for the email to be sent out as this can cause the UI to feel sluggish. Instead you can create a Job and place it into the job queue and this will be picked by the scheduler. Let’s look at an example of how you would do this. - -First we want our Logic Hook class to create the scheduled job: - -
- -Example 13.4: Example Scheduled Job Creation - - ------ - -
- -
 1 class SomeClass
- 2 {
- 3     function SomeMethod($bean, $event, $arguments)
- 4     {
- 5       require_once 'include/SugarQueue/SugarJobQueue.php';
- 6       $scheduledJob = new SchedulersJob();
- 7 
- 8       //Give it a useful name
- 9       $scheduledJob->name = "Email job for {$bean->module_name} {$bean->id}";
-10 
-11       //Jobs need an assigned user in order to run. You can use the id
-12       //of the current user if you wish, grab the assigned user from the
-13       //current bean or anything you like.
-14       //Here we use the default admin user id for simplicity
-15       $scheduledJob->assigned_user_id = '1';
-16 
-17       //Pass the information that our Email job will need
-18       $scheduledJob->data = json_encode(array(
-19                                             'id' => $bean->id,
-20                                             'module' => $bean->module_name)
-21                                         );
-22 
-23       //Tell the scheduler what class to use
-24       $scheduledJob->target = "class::BeanEmailJob";
-25 
-26       $queue = new SugarJobQueue();
-27       $queue->submitJob($scheduledJob);
-28     }
-29 }
- -
- ------ - - -
-Next we create the BeanEmailJob class. This is placed into the
-custom/Extensions/modules/Schedulers/Ext/ScheduledTasks/ directory with the same name as the class. So in our example we will have:
-custom/Extensions/modules/Schedulers/Ext/ScheduledTasks/BeanEmailJob.php - -
- -Example 13.5: Example Scheduler job - - ------ - -
- -
 1 class BeanEmailJob implements RunnableSchedulerJob
- 2 {
- 3   public function run($arguments)
- 4   {
- 5 
- 6     //Only different part of the email code.
- 7     //We grab the bean using the supplied arguments.
- 8     $arguments = json_decode($arguments,1);
- 9     $bean = BeanFactory::getBean($arguments['module'],$arguments['id']);
-10 
-11     //Perform some setup of the email class
-12     require_once "include/SugarPHPMailer.php";
-13     $mailer=new SugarPHPMailer();
-14     $admin = new Administration();
-15     $admin->retrieveSettings();
-16     $mailer->prepForOutbound();
-17     $mailer->setMailerForSystem();
-18     $admin = new Administration();
-19     $admin->retrieveSettings();
-20     $mailer->From     = $admin->settings['notify_fromaddress'];
-21     $mailer->FromName = $emailSettings['from_name'];
-22     $mailer->IsHTML(true);
-23 
-24     //Add message and recipient.
-25     //We could go all out here and load and populate an email template
-26     //or get the email address from the bean
-27     $mailer->Subject = 'My Email Notification! '.$bean->name;
-28     $mailer->Body = $event. ' fired for bean '.$bean->name;
-29     $mailer->AddAddress('Jim@example.com');
-30     return $mailer->Send();
-31   }
-32   public function setJob(SchedulersJob $job)
-33   {
-34     $this->job = $job;
-35   }
-36 }
- -
- ------ - - -
-Now whenever a user triggers the hook it will be much quicker since we are simply persisting a little info to the database. The scheduler will run this in the background. - -==== Retries ==== - -Occasionally you may have scheduled jobs which could fail intermittently. Perhaps you have a job which calls an external API. If the API is unavailable it would be unfortunate if the job failed and was never retried. Fortunately the SchedulersJob class has two properties which govern how retries are handled. These are requeue and retry_count. - -; requeue -: Signifies that this job is eligible for retries. -; retry_count -: Signifies how many retries remain for this job. If the job fails this value will be decremented. - -We can revisit our previous example and add two retries: - -
- -Example 13.6: Setting the retry count on a scheduled job - - ------ - -
- -
 6       $scheduledJob = new SchedulersJob();
- 7 
- 8       //Give it a useful name
- 9       $scheduledJob->name = "Email job for {$bean->module_name} {$bean->id}";
-10 
-11       //Jobs need an assigned user in order to run. You can use the id
-12       //of the current user if you wish, grab the assigned user from the
-13       //current bean or anything you like.
-14       //Here we use the default admin user id for simplicity
-15       $scheduledJob->assigned_user_id = '1';
-16 
-17       //Pass the information that our Email job will need
-18       $scheduledJob->data = json_encode(array(
-19                                             'id' => $bean->id,
-20                                             'module' => $bean->module_name)
-21                                         );
-22 
-23       //Tell the scheduler what class to use
-24       $scheduledJob->target = "class::BeanEmailJob";
-25 
-26       //Mark this job for 2 retries.
-27       $scheduledJob->requeue = true;
-28       $scheduledJob->retry = 2;
- -
- ------ - - -
-See the section on [[#chap11.xhtml#logic-hooks-chapter|logic hooks]] for more information on how job failures can be handled. - -=== Debugging === - -With Scheduled tasks and jobs running in the background it can sometimes be difficult to determine what is going on when things go wrong. If you are debugging a scheduled task the the scheduled task page is a good place to start. For both scheduled tasks and job queue tasks you can also check the job_queue table. For example, in MySQL we can check the last five scheduled jobs: - -
- -Example 13.7: Example MySQL query for listing jobs - - ------ - -
- -
SELECT * FROM job_queue ORDER BY date_entered DESC LIMIT 5
- -
- ------ - - -
-This will give us information on the last five jobs. Alternatively we can check on specific jobs: - -
- -Example 13.8: Example MySQL query for listing BeanEmailJobs - - ------ - -
- -
SELECT * FROM job_queue WHERE target = 'class::BeanEmailJob'
- -
- ------ - - -
-In either case this will give details for the job(s): - -
- -Example 13.9: Example MySQL list of jobs - - ------ - -
- -
*************************** 1. row ***************************
-assigned_user_id: 1
-              id: 6cdf13d5-55e9-946e-9c98-55044c5cecee
-            name: Email job for Accounts 103c4c9b-336f-0e87-782e-5501defb5900
-         deleted: 0
-    date_entered: 2015-03-14 14:58:15
-   date_modified: 2015-03-14 14:58:25
-    scheduler_id:
-    execute_time: 2015-03-14 14:58:00
-          status: done
-      resolution: success
-         message: NULL
-          target: class::BeanEmailJob
-            data: {"id":"103c4c9b-336f-0e87-782e-5501defb5900","module":"Account\
-s"}
-         requeue: 0
-     retry_count: NULL
-   failure_count: NULL
-       job_delay: 0
-          client: CRON3b06401793b3975cd00c0447c071ef9a:7781
-percent_complete: NULL
-1 row in set (0.00 sec)
- -
- ------ - - -
-Here we can check the status, resolution and message fields. If the status is queued then either the scheduler has not yet run or it isn’t running. Double check your Cron settings if this is the case. - -It may be the case that the job has ran but failed for some reason. In this case you will receive a message telling you to check the logs. Checking the logs usually provides enough information, particularly if you have made judicious use of logging (see the chapter on logging) in your job. - -It is possible that the job is failing outright, in which case your logging may not receive output before the scheduler exits. In this case you can usually check your PHP logs. - -As a last resort you can manually run the scheduler from the SuiteCRM directory using: - -
- -Example 13.10: Running the scheduler manually - - ------ - -
- -
php -f cron.php
- -
- ------ - - -
-Using this in addition to outputting any useful information should track down even the oddest of bugs. - - -
- - -
- -== 14. Extension Framework == - -=== Introduction === - -The extension framework provides a means to modify various application data inside SuiteCRM. For example it provides a way to add or modify vardefs, scheduled tasks, language strings and more. In general a folder is provided in custom/Extension (the exact path depends on the extension). This folder is then scanned for files which will be consolidated into a single ext file which SuiteCRM will then read and use. In this way it is possible for developers to add a new file to affect the behaviour of SuiteCRM rather than altering existing files. This makes the changes more modular and allows the easy addition or removal of changes. Additionally, because these files are all consolidated it means that there is no affect on performance of checking a (possibly large) number of files. This is only done when performing a repair and rebuild in the admin menu. - -=== Standard Extensions === - -List of standard SuiteCRM extensions - -{| -! Extension Directory -! Compiled file -! Module -! Description -|- -| ActionViewMap -| action_view_map.ext.php -|   -| Used to map actions for a module to a specified view. -|- -| ActionFileMap -| action_file_map.ext.php -|   -| Used to map actions for a module to a specified file. -|- -| ActionReMap -| action_remap.ext.php -|   -| Used to map actions for a module to existing actions. -|- -| Administration -| administration.ext.php -| Administration -| Used to add new sections to the administration panel. -|- -| EntryPointRegistry -| entry_point_registry.ext.php -| application -| Used to add new entry points to SuiteCRM. See the chapter on [[#chap07.xhtml#entry-point-chapter|Entry Points]]. -|- -| Extensions -| extensions.ext.php -| application -| Used to add new extension types. -|- -| FileAccessControlMap -| file_access_control_map.ext.php -|   -| Used to add, update or delete entries in the access control lists for files. -|- -| Language -| N/A[[#chap13.xhtml#fn-langNote|1]] -|   -| Used to add, update or delete language strings for both modules and app strings. See the chapter on [[#chap08.xhtml#language-chapter|Language Strings]]. -|- -| Layoutdefs -| layoutdefs.ext.php -|   -| Used to add, update or delete subpanel definitions for a module. -|- -| GlobalLinks -| links.ext.php -| application -| Used to add, update or delete global links (the list of links that appear in the top right of the SuiteCRM UI). -|- -| LogicHooks -| logichooks.ext.php -|   -| Used to add, update or delete logic hooks. See the chapter on [[#chap11.xhtml#logic-hooks-chapter|Logic Hooks]]. -|- -| Include -| modules.ext.php -| application -| Used to register new beans and modules. -|- -| Menus -| menu.ext.php -|   -| Used to add, update or delete the menu links for each module. -|- -| ScheduledTasks -| scheduledtasks.ext.php -| Schedulers -| Used to add new scheduled tasks. See the chapter on [[#chap12.xhtml#scheduled-tasks-chapter|Scheduled Tasks]]. -|- -| UserPage -| userpage.ext.php -| Users -| Unused -|- -| Utils -| custom_utils.ext.php -| application -| Used to add new utility methods. -|- -| Vardefs -| vardefs.ext.php -|   -| Used to add, update or delete vardefs for a module. See the section on [[#chap03.xhtml#vardefs-chapter|Vardefs]]. -|- -| JSGroupings -| jsgroups.ext.php -|   -| Used to add, update or delete JavaScript groupings. -|- -| Actions -| actions.ext.php -| AOW_Actions -| Used to add new WorkFlow actions. -|} - -=== Custom Extensions === - -Interestingly the extension framework can be used to add new extensions. This allows you to create customisations that are easily customised by others (in a similar manner to, for example, how vardefs can be added - see the chapter on [[#chap03.xhtml#vardefs-chapter|Vardefs]]). - -To create a custom extension you simply add a new file in
-custom/Extension/application/Ext/Extensions. This can be given a name of your choosing. Our example will use
-custom/Extension/application/Ext/Extensions/SportsList.php and will look like: - -
- -Example 14.1: Adding an entry point entry - - ------ - -
- -
1 <?php
-2 $extensions["sports_list"] =  array(
-3                 "section" => "sports_list",
-4                 "extdir" => "SportsList",
-5                 "file" => 'sportslist.ext.php',
-6                 "module" => "");
- -
- ------ - - -
-Now when a Quick Repair and rebuild is run any files in
-custom/Extension/application/Ext/SportsList/ will be consolidated into
-custom/application/Ext/SportsList/sportslist.ext.php. On it’s own this file will not do anything but you are now able to write custom code that checks the consolidated file rather than having to worry about searching for customisations. - -
- -
    -
  1. - - - -
    -The language extensions are treated specially and, as such, aren’t compiled to a single file.[[#chap13.xhtml#fnref-langNote|↩]]
- - -
- -
- - -
- -== 15. Module Installer == - -As detailed in the other chapters of this book there are many ways to customise SuiteCRM. The module installer allows you to package these changes and install them onto other SuiteCRM instances. This is achieved by creating a package. - -At the minimum a package is a zip file that contains a manifest.php file in it’s root. The manifest file is responsible for providing information about the installer as well as providing information on how to install the package. - -=== manifest.php === - -The manifest.php file contains the definition of three arrays. Let’s look at each of these arrays in turn. See [[#chap19.xhtml#appendix-a|Appendix A]] for the full sample manifest.php file. - -{| -|width="50%"| [[File:images/leanpub_info-circle.png|50px|class=sidebar-image|information]] -|width="50%"| Within path in the manifest file you can use <basepath> to refer to the base directory of the installer. For example <basepath>/Foo.txt will refer to the Foo.txt file in the root of the installer package. -|} - -==== $manifest ==== - -The $manifest array provides information on the package itself such as it’s name, readme etc. (it also defines the copy array for patch packages). A sample definition of the manifest array will appear something like this: - -
- -Example 15.1: Example $manifest array definition - - ------ - -
- -
 1 $manifest = array(
- 2   'name' => 'My First Package',
- 3   'description' => 'This is a simple package example manifest file',
- 4   'version' => '1.5',
- 5   'author' => 'Jim Mackin',
- 6   'readme' => 'readme.txt',
- 7   'acceptable_sugar_flavors' => array('CE'),
- 8   'acceptable_sugar_versions' => array(
- 9     'exact_matches' => array(),
-10     'regex_matches' => array('6\\.5\\.[0-9]$'),
-11   ),
-12   'copy_files' => array (
-13     'from_dir' => '<basepath>/custom/',    
-14     'to_dir' => 'custom',     
-15     'force_copy' => array (),
-16   ),
-17   'dependencies' => array(
-18     array(
-19       'id_name' => 'example_dependency_package',
-20       'version' => '2.4',
-21     ),
-22   ),
-23 );
- -
- ------ - - -
-; name -: The name of the package. This is how the package will appear to the user during installation and in the Module Loader package list. The package name is required. -; description -: A brief description of the package. -; version -: The version of this package. This can be any string but is usually a traditional version number (such as 3.1.4). -; author -: The author of the package. -; readme -: A brief readme string. Note that if a README.txt is found in the root of the package this will be used instead. -; acceptable_sugar_flavors -: A remnant of the SugarCRM packages. This should always be an array with (at least) a CE entry. If you would like the installer to target both SuiteCRM and SugarCRM editions then this can contain one of the other SugarCRM flavours (PRO, CORP , ULT or ENT). -; acceptable_sugar_versions -: An array detailing the matching SugarCRM versions. Note that the SugarCRM version is distinct from the SuiteCRM version. This array has two keys. exact_matches is simply an array of the allowed versions. regex_matches allows specifying regexes to match versions. For SuiteCRM you only need to worry about supporting the 6.5.* versions which can be matched with the regex 6\\.5\\.[0-9]$. At the time of writing the current SugarCRM version for SuiteCRM is 6.5.20. -; copy_files -: This is only used for patch installers and will copy files in the from_dir key to those in the to_dir key. Finally the force_copy key can be used to specify files that should be forcibly copied over. -; dependencies -: An array of other packages that are relied on by this package. Each entry is an array with id_name - the id of the package and version - the required version of the package. -; icon -: The path (within the installer) to an icon to be displayed during installation. -; is_uninstallable -: Whether or not uninstalls should be allowed. -; published_date -: The date that the package was published. There is no fixed format for the date, it is simply a string. -; key -: Specifies a key to ensure that modules do not clash. This will prefix the installed modules and tables with key. This is used by the module builder when creating packages but can be specified if you wish. -; remove_tables -: A string specifying whether module tables should be removed when uninstalling this package. Accepted values are true, false and prompt. The default is true. -; type -: The type of the installer, one of langpack, module, patch or theme. See the types section. - -==== $install_defs ==== - -Provides information on how the package is to be installed, which files go where and any additional information such as logic hooks, custom fields etc. - -===== id ===== - -A unique identifier for the module. - -===== connectors ===== - -An array of connectors to be installed. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| name -| The name of the connector. -|- -| connector -| The directory to copy the connector files from. -|- -| formatter -| The directory to copy the connector formatter files from. -|} - -===== copy ===== - -An array of files and directories to be copied on install. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| from -| The source file/directory in the package. -|- -| to -| The destination file/directory. -|} - -{| -|width="50%"| [[File:images/leanpub_info-circle.png|50px|class=sidebar-image|information]] -|width="50%"| In general if a file can be handled by one of the other keys then that key should be used. For example new admin entries should be copied using the administration key rather than using the copy key. -|} - -===== dashlets ===== - -An array of dashlets to be installed. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| name -| The name of the new dashlet. -|- -| from -| The path in the install package from which the dashlet files will be copied. -|} - -===== language ===== - -An array of language files to be installed. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| from -| The location of the language file inside the package. -|- -| to_module -| The module this language file is intended for (or ‘application’ for application language strings). -|- -| language -| The language that this file is for (i.e. en_us or es_es). -|} - -See the chapter on [[#chap08.xhtml#language-chapter|Language Strings]] for more information. - -===== layoutdefs ===== - -An array of layoutdef files which are used to add, remove or edit subpanels. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| from -| The path in the package to the file to be installed. -|- -| to_module -| The module that this file will be installed to. -|} - -===== vardefs ===== - -An array of the vardefs to be added to specific modules. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| from -| The location of the vardef file in the package. -|- -| to_module -| The destination module. -|} - -{| -|width="50%"| [[File:images/leanpub_info-circle.png|50px|class=sidebar-image|information]] -|width="50%"| Generally you should install custom fields using the custom_fields key. However this key can be used to alter existing fields or add more complex fields. -|} - -===== menu ===== - -An array of menus to be installed. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| from -| The location of the menu file in the package. -|- -| to_module -| The destination module for this menu. -|} - -===== beans ===== - -An array of beans to be installed. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| module -| The name of the module. -|- -| class -| The name of the bean class. -|- -| path -| The path (within the package) to the bean file. -|- -| tab -| Whether or not a tab should be added for this module. -|} - -===== relationships ===== - -An array detailing any new relationships added (in particular relationships where one side is an existing module). Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| module -| The module that this relationship will be attached to. -|- -| meta_data -| The location of the metadata file for this relationship. -|} - -===== custom_fields ===== - -An array of new custom fields to be installed (See the [[#chap03.xhtml#vardefs-chapter|Vardefs]] chapter for more information on this). Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| name -| The name of the new custom field. -|- -| label -| The key for the language string which will act as the label for this custom field. -|- -| type -| The type of this custom field. -|- -| max_size -| For string field types, the maximum number of characters. -|- -| require_option -| Whether or not the field is required. -|- -| default_value -| The default value of this field. -|- -| ext1 -| Extended field information. Different field types will use this value differently. For example Enum fields will store the key for the options in this field, decimal and float fields will store the precision. -|- -| ext2 -| Extended field information. Different field types will use this value differently. For example, dynamic dropdowns will store the parent dropdown, text areas will store the number of rows. -|- -| ext3 -| Extended field information. Different field types will use this value differently. For example, text areas will store the number of columns. -|- -| ext4 -| Extended field information. Different field types will use this value differently. For HTML field types this will store the HTML. -|- -| audited -| Whether or not changes to this field should be audited. -|- -| module -| Used to specify the module where the custom field will be added. -|} - -===== logic_hooks ===== - -An array of logic hooks to be installed. See the [[#chap11.xhtml#logic-hooks-chapter|Logic Hooks]] chapter for more information. Each entry is an array with the following keys: - -{| -! Key -! Description -|- -| module -| The module to where this logic hook should be installed. Leaving this empty will install into the top level logic hook. -|- -| hook -| The logic hook type (i.e. after_save, after_login, etc.). -|- -| order -| The sort order for this logic hook. -|- -| description -| A description of the hook. -|- -| file -| The file containing the class for this logic hook, relative to the SuiteCRM root. -|- -| class -| The class that contains the logic hook function that should be called by this hook. -|- -| function -| The function to be invoked when this hook is triggered. -|} - -===== image_dir ===== - -A path to a directory of images to be included in the install. - -===== schedulers ===== - -An array of schedulers to be installed. Each entry is an array with a single key: - -{| -! Key -! Description -|- -| from -| The file containing the new scheduled task. -|} - -===== administration ===== - -An array of admin panels to be installed. Each entry is an array with a single key: - -{| -! Key -! Description -|- -| from -| The file containing the new admin panel definition. -|} - -===== pre_execute ===== - -Defines an array of files to be executed before the package is installed. Each entry is a path to a file within the package. Any output will be displayed to the user in the install log. - -===== post_execute ===== - -Defines an array of files to be executed after the package is installed. Each entry is a path to a file within the package. Any output will be displayed to the user in the install log. - -===== pre_uninstall ===== - -Defines an array of files to be executed before the package is uninstalled. Each entry is a path to a file within the package. Any output will be displayed to the user in the uninstall log. - -===== post_uninstall ===== - -Defines an array of files to be executed after the package is uninstalled. Each entry is a path to a file within the package. Any output will be displayed to the user in the uninstall log. - -==== $upgrade_manifest ==== - -Provides a means of upgrading an already installed package by providing different install_defs. - -
- - - -
-=== Types === - -{| -! Type -! Description -|- -| langpack -| A language installer. This will add an entry to the language dropdown. -|- -| module -| A module installer. Will install new modules and/or functionality. -|- -| patch -| A patch installer. This is used to upgrade SuiteCRM. -|- -| theme -| A theme installer. This will add a new option to the themes. -|} - -==== Other files ==== - -; README.txt -: Contains the readme for this package. If README.txt and a readme entry in the manifest.php is defined then this file will be used. -; LICENSE.txt -: Provides information on the license for this package. -; scripts/pre_install.php -: A PHP script which defines a method pre_install(). This method will be called before the package is installed. Any output will be displayed to the user in the install log. -; scripts/post_install.php -: A PHP script which defines a method post_install(). This method will be called after the package is installed. -; scripts/pre_uninstall.php -: A PHP script which defines a method pre_uninstall(). This method will be called before the package is uninstalled. -; scripts/post_uninstall.php -: A PHP script which defines a method post_uninstall(). This method will be called after the package is uninstalled. - - -
- - -
- -== 16. API == - -The SuiteCRM API allows third party code to access and edit SuiteCRM data and functionality. - -=== Using the API === - -SuiteCRM has both a REST and a SOAP API. Which API you want to use will largely come down to personal preference and the support for SOAP/REST libraries in whichever language you will be using. - -Both APIs will require a username and password. It is usual to create a user specifically for the API. - -==== SOAP ==== - -The WSDL for the SOAP API can be found at: - -
- -Example 16.1: SOAP API WSDL Location - - ------ - -
- -
example.com/suitecrm/service/v4_1/soap.php?wsdl
- -
- ------ - - -
-Where example.com/suitecrm is the address of your SuiteCRM instance. v4_1 is the version of the API and can be changed, v4_1 is the latest version at the time of writing. - -===== SOAP Example ===== - -The following PHP example uses the built in SoapClient class. - -
- -Example 16.2: Accessing the SOAP API - - ------ - -
- -
 1 <?php
- 2 //Create a new SoapClient
- 3 $wsdlURL = "http://example.com/suitecrm/service/v4_1/soap.php?wsdl";
- 4 $client = new SoapClient($wsdlURL);
- 5 
- 6 //Login to the API and get the session id
- 7 $userAuth = array(
- 8         'user_name' => '<suitecrmuser>',
- 9         'password' => md5('<suitecrmpassword>'),
-10 );
-11 $appName = 'My SuiteCRM SOAP Client';
-12 $nameValueList = array();
-13 $loginResults = $client->login($userAuth, $appName, $nameValueList);
-14 
-15 //Get a list of at most 10 accounts with a billing address in Ohio. Along with
-16 //The first and last names of any contacts in that Account.
-17 $results = $client->get_entry_list(
-18         //Session id - retrieved from login call
-19         $loginResults->id,
-20         //Module to get_entry_list for
-21         'Accounts',
-22         //Filter query - Added to the SQL where clause
-23         "accounts.billing_address_city = 'Ohio'",
-24         //Order by - unused
-25         '',
-26         //Start with the first record
-27         0,
-28         //Return the id and name fields
-29         array('id','name'),
-30         //Link to the "contacts" relationship and retrieve the
-31         //First and last names.
-32         array(
-33                 array(
-34                         'name' => 'contacts',
-35                         'value' => array(
-36                                 'first_name',
-37                                 'last_name',
-38                         ),
-39                 ),
-40         ),
-41         //Show 10 max results
-42         10,
-43         //Do not show deleted
-44         0
-45 );
-46 print_r($results);
- -
- ------ - - -
-
- - - -
-==== REST ==== - -The SuiteCRM REST API can be found at: - -
- -Example 16.3: REST API Endpoint Location - - ------ - -
- -
example.com/suitecrm/service/v4_1/rest.php
- -
- ------ - - -
-Where example.com/suitecrm is the address of your SuiteCRM instance. v4_1 is the version of the API and can be changed, v4_1 is the latest version at the time of writing. - -The SuiteCRM REST API is not a true REST API - all calls are performed as POSTs and all calls are to the base URL with the method passed in as a post argument. - -; The arguments to the REST API calls are:
-method -: The method which will be called, i.e. login or get_entry_list. See [[#chap20.xhtml#appendix-b|Appendix B]] for a list of API methods. -; input_type -: The input type of the rest_data. This is usually JSON but can also be Serialize. -; response_type -: How the response will be encoded. This is usually JSON but can also be Serialize. -; rest_data -: Any other arguments that are required by this method. This is passed as an encoded array. The encoding is determined by input_type. - -{| -|width="50%"| [[File:images/leanpub_warning.png|50px|class=sidebar-image|warning]] -|width="50%"| Note that, for REST requests it is the order of the arguments that matter in rest_data and not the name. -|} - -
- - - -
-===== Examples ===== - -
- -Example 16.4: Accessing the REST API - - ------ - -
- -
 1 <?php
- 2 
- 3 $url = "http://example.com/suitecrm/service/v4_1/rest.php";
- 4 
- 5 function restRequest($method, $arguments){
- 6 	global $url;
- 7 	$curl = curl_init($url);
- 8 	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
- 9 	$post = array(
-10 			"method" => $method,
-11 			"input_type" => "JSON",
-12 			"response_type" => "JSON",
-13 			"rest_data" => json_encode($arguments),
-14 	);
-15 
-16 	curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
-17 
-18 	$result = curl_exec($curl);
-19 	curl_close($curl);
-20 	return json_decode($result,1);
-21 }
-22 
-23 
-24 $userAuth = array(
-25         'user_name' => 'suitecrmuser',
-26         'password' => md5('suitecrmpassword'),
-27 );
-28 $appName = 'My SuiteCRM REST Client';
-29 $nameValueList = array();
-30 
-31 $args = array(
-32             'user_auth' => $userAuth,
-33             'application_name' => $appName,
-34             'name_value_list' => $nameValueList);
-35 
-36 $result = restRequest('login',$args);
-37 $sessId = $result['id'];
-38 
-39 $entryArgs = array(
-40   //Session id - retrieved from login call
-41 	'session' => $sessId,
-42   //Module to get_entry_list for
-43 	'module_name' => 'Accounts',
-44   //Filter query - Added to the SQL where clause,
-45 	'query' => "accounts.billing_address_city = 'Ohio'",
-46   //Order by - unused
-47 	'order_by' => '',
-48   //Start with the first record
-49 	'offset' => 0,
-50   //Return the id and name fields
-51 	'select_fields' => array('id','name',),
-52 	//Link to the "contacts" relationship and retrieve the
-53 	//First and last names.
-54 	'link_name_to_fields_array' => array(
-55 			array(
-56 					'name' => 'contacts',
-57 					'value' => array(
-58 							'first_name',
-59 							'last_name',
-60 					),
-61 			),
-62 	),
-63   //Show 10 max results
-64 	'max_results' => 10,
-65   //Do not show deleted
-66 	'deleted' => 0,
-67 );
-68 $result = restRequest('get_entry_list',$entryArgs);
-69 
-70 print_r($result);
- -
- ------ - - -
-For a full list of API methods and their arguments see [[#chap20.xhtml#appendix-b|Appendix B]]. - -=== Adding custom API methods === - -Sometimes the existing API methods are not sufficient or using them for a task would be overly complex. SuiteCRM allows the web services to be extended with additional methods or overriding existing methods. - -The recommended path for custom entry points is the following
-custom/service/<version>_custom/. At the time of writing the latest web service version is v4_1 so this would be custom/service/v4_1_custom/. - -Next we create the implementing class. This will create our new method. In our example we will simply create a new method which writes to the SuiteCRM log We will call this method
-write_log_message. - -
- -Example 16.5: Custom v4_1 Web Service Implementation - - ------ - -
- -
 1 <?php
- 2 if(!defined('sugarEntry')){
- 3   define('sugarEntry', true);
- 4 }
- 5 require_once 'service/v4_1/SugarWebServiceImplv4_1.php';
- 6 class SugarWebServiceImplv4_1_custom extends SugarWebServiceImplv4_1
- 7 {
- 8 
- 9   function write_log_message($session, $message)
-10   {
-11     $GLOBALS['log']->info('Begin: write_log_message');
-12 
-13     //Here we check that $session represents a valid session
-14     if (!self::$helperObject->checkSessionAndModuleAccess(
-15                                                     $session, 
-16                                                     'invalid_session', 
-17                                                     '', 
-18                                                     '', 
-19                                                     '',  
-20                                                     new SoapError()))
-21     {
-22       $GLOBALS['log']->info('End: write_log_message.');
-23       return false;
-24     }
-25     $GLOBALS['log']->info($message);
-26     return true;
-27   }
-28 }
- -
- ------ - - -
-Next we create the registry file which will register our new method. - -
- -Example 16.6: Custom v4_1 web service registry - - ------ - -
- -
 1 <?php
- 2     require_once 'service/v4_1/registry.php';
- 3     class registry_v4_1_custom extends registry_v4_1
- 4     {
- 5         protected function registerFunction()
- 6         {
- 7             parent::registerFunction();
- 8             $this->serviceClass->registerFunction('write_log_message', 
- 9                                                   array(
-10                                                     'session'=>'xsd:string',
-11                                                     'message'=>'xsd:string'), 
-12                                                   array(
-13                                                     'return'=>'xsd:boolean')
-14                                                   );
-15         }
-16     }
- -
- ------ - - -
-Finally we create the entry point. This is the actual file that will be called by our API clients. This will reference the two files which we have created and will call the webservice implementation with our files. - -
- -Example 16.7: Custom v4_1 REST Entry point - - ------ - -
- -
 1 <?php
- 2 chdir('../../..');
- 3 
- 4 require_once 'SugarWebServiceImplv4_1_custom.php';
- 5 
- 6 $webservice_path = 'service/core/SugarRestService.php';
- 7 $webservice_class = 'SugarRestService';
- 8 $webservice_impl_class = 'SugarWebServiceImplv4_1_custom';
- 9 $registry_path = 'custom/service/v4_1_custom/registry.php';
-10 $registry_class = 'registry_v4_1_custom';
-11 $location = 'custom/service/v4_1_custom/rest.php';
-12 
-13 require_once 'service/core/webservice.php';
- -
- ------ - - -
-
- -Example 16.8: Custom v4_1 SOAP Entry point - - ------ - -
- -
 1 <?php
- 2 chdir('../../..');
- 3 require_once('SugarWebServiceImplv4_1_custom.php');
- 4 $webservice_class = 'SugarSoapService2';
- 5 $webservice_path = 'service/v2/SugarSoapService2.php';
- 6 $webservice_impl_class = 'SugarWebServiceImplv4_1_custom';
- 7 $registry_class = 'registry_v4_1_custom';
- 8 $registry_path = 'custom/service/v4_1_custom/registry.php';
- 9 $location = 'custom/service/v4_1_custom/soap.php';
-10 require_once('service/core/webservice.php');
- -
- ------ - - -
-==== Usage ==== - -We can now use our custom endpoint. This is identical to using the API as detailed above, except that we use our custom entry point for either the SOAP WSDL or REST URL. For example using the same SuiteCRM location (example.com/suitecrm) as the above examples and using v4_1, we would use the following - -
- -Example 16.9: Custom v4_1 URLS - - ------ - -
- -
1 //SOAP WSDL
-2 example.com/suitecrm/custom/service/v4_1_custom/soap.php?wsdl
-3 //REST URL
-4 example.com/suitecrm/custom/service/v4_1_custom/rest.php
- -
- ------ - - -
- -
- - -
- -== 17. Best Practices == - -=== Development instances === - -When making changes you should always use a development or test instance first. This allows you to fully and safely test any changes. - -=== Version control === - -When developing customisations it is prudent to use some form of version control. Version control allows tracking changes to your codebase in addition to rolling back changes. There are many version control systems available. SuiteCRM uses [http://git-scm.com/ Git] although I also like [http://mercurial.selenic.com/ Mercurial]. - -If you are using a development instance (as mentioned above) then Version Control usually allows you to push changes to other versions or to tag releases. This provides a way of pushing changes to live or test instances safely. Crucially it also means that, should there be major problems with a version then this can be easily rolled back. - -=== Backup === - -SuiteCRM has been developed to be customisable. However, mistakes, bugs and other unpleasantness can (and thanks to Murphy’s law, will) happen. You should always ensure, before making any changes, that you have a backup of all files and of the database. - -In order to back up files you can simply create a zip of the SuiteCRM directory and copy it to a safe place. On Linux systems this can be performed using the following: - -
- -Example 17.1: File backup - - ------ - -
- -
tar -czvf suitecrmfilebackup.tar.gz /path/to/suitecrm
- -
- ------ - - -
-Backing up the SuiteCRM database will vary depending on which database you are using. However MySQL backups can be performed using the mysqldump command on Linux as seen here: - -
- -Example 17.2: MySQL Database backup - - ------ - -
- -
mysqldump suitecrmdatabase -u databaseuser -p | gzip -c | cat > suitecrm.sql.gz
- -
- ------ - - -
-=== Be upgrade safe === - -Unless you are making changes to a custom module you should strive in all cases to use the custom framework and make changes in the custom folder. This ensures that, should you make a mistake, rectifying the mistake is as simple as removing the customisation. - -However the main advantage to using custom is that, when you upgrade SuiteCRM in the future you will not have your changes overwritten by the updated SuiteCRM files. See the [[#chap13.xhtml#extensions-chapter|Extensions]] chapter for more information. - -=== Use appropriate log levels === - -Using appropriate log levels (See the chapter on [[#chap10.xhtml#logging-chapter|Logging]]) makes it easier to track down issues. You do not want very important messages to be logged as debug since this will make them difficult to find. Likewise you don’t want unimportant log messages cluttering up the fatal log output. - -=== Long running logic hooks === - -If a logic hook task is long running then you should place it into the job queue (see the [[#chap11.xhtml#logic-hooks-chapter|Logic Hook]] and [[#chap12.xhtml#scheduled-tasks-chapter|Scheduled Tasks]] chapters). - -=== Minimise SQL === - -Where possible you should strive to use the SuiteCRM supplied methods of accessing data. This includes using beans and the BeanFactory where possible (see the chapter on [[#chap02.xhtml#working-with-beans-chapter|Working with beans]]). There are a few reasons for this. The first is that SQL is usually either hardcoded or has to be dynamically built. In the case where the SQL is hardcoded this means that changes to fields will not be reflected thereby making your code more brittle. - -Dynamic SQL is better because it can react to field changes and generally be tailored to fit the situation. However this requires adding extra, often complex, code. It can be hard to account for all situations (this can be especially problematic when attempting to traverse relationships dynamically). - -Another issue is that, usually SQL will end up being Database specific (see the next point for mitigating this however). - -Finally any custom logic (such as Logic Hooks) which would usually be fired for saving beans or relationships will not be fired for SQL queries. - -=== SQL Use === - -In some cases using raw SQL is unavoidable. If that is the case then you should strive to use standard compliant SQL. If database engine specific features need to be used, and you wish to target other database engines, you can check for the DB type. For example: - -
- -Example 17.1: Checking for the database engine - - ------ - -
- -
 1 function getSomeSQLQuery(){
- 2     global $sugar_config;
- 3     switch($sugar_config['dbconfig']['db_type']){
- 4         case 'mssql':
- 5             $sql = 'MSSQL specific SQL';
- 6             break;
- 7         case 'mysql':
- 8         default:
- 9             $sql = 'MySQL specific SQL';
-10             break;
-11     }
-12     return $sql;
-13 }
- -
- ------ - - -
-=== Entry check === - -The majority of SuiteCRM files will start with some variation of the following line: - -
- -Example 17.2: Entry check - - ------ - -
- -
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
- -
- ------ - - -
-This prevents direct access to the file by ensuring that SuiteCRM has been loaded through a valid entry point (i.e. it has been loaded through index.php, cron.php or a custom entry point). - -=== Redirect after post === - -Sometimes you may have custom controller actions (see the controller section) or custom entry points (see the [[#chap07.xhtml#entry-point-chapter|Entry Points]] chapter). These actions and entry points or other pages are usually accessed using POST. After a POST request it is a web best practice to redirect to a different page, especially if your page makes any changes. This prevents the user from refreshing the page and causing a duplicate action. Within SuiteCRM it is best to use the SugarApplication::redirect method to redirect. This simply accepts a URL. As follows: - -
- -Example 17.3: Redirecting within SuiteCRM - - ------ - -
- -
SugarApplication::redirect('index.php?module=<TheModule>');
- -
- ------ - - -
- -
- - -
- -== 18. Performance Tweaks == - -In most cases the performance of SuiteCRM should not be an issue. However in the case of large datasets or systems with many users you may notice some performance degradation. These changes can help improve performance. - -=== Server === - -The server that SuiteCRM runs on is, of course, very important when it comes to the kind of performance you can expect. A full guide on server setup is outside the scope of this book. However there are some things you can do to ensure that you get the best performance out of SuiteCRM. - -==== PHP ==== - -Installing a PHP opcode cache will increase the performance of all PHP files. These work by caching the compilation of PHP files resulting in less work on each request. Furthermore SuiteCRM will use the caching API of some PHP accelerators which will further increase performance. If you are using Linux then [http://php.net/manual/en/book.apc.php APC] is the usual choice. Windows users should check out [http://php.net/manual/en/book.wincache.php WinCache]. - -==== MySQL ==== - -MySQL is notorious for having small default settings. Fully optimising MySQL is outside the scope of this book (however checkout [http://mysqltuner.pl mysqltuner.pl] for a helpful Perl script which will provide setting recommendations - note that you should be careful when running files from an unknown source). One small change that can make a big difference is increasing the innodb_buffer_pool_size. - -If you have migrated or imported a significant amount of data it is possible that some tables will be fragmented. Running OPTIMIZE TABLE tablename can increase performance. - -=== Indexes === - -Adding indexes on the fields of modules can improve database performance. The core modules usually have important fields indexed. However if you have created a new module or added new, often searched fields to a module then these fields may benefit from being indexed. See the [[#chap03.xhtml#vardefs-chapter|Vardef]] chapter for adding indexes. - -=== Config Changes === - -The following are some config settings that can be used to improve performance. Please note that in most cases you will have better performance gains by first following the steps in previous sections. These settings should be set in the config_override.php file. See the chapter on the [[#chap09.xhtml#config-chapter|Config]] files for more information. - -
- -
- -
$sugar_config['developerMode'] = false;
- -
- -
-Unless you are actively developing on an instance developerMode should be off. Otherwise each page request will cause cached files to be reloaded. - -
- -
- -
$sugar_config['disable_count_query'] = true;
- -
- -
-For systems with large amounts of data the count queries on subpanels used for the pagination controls can become slow thereby causing the page to be sluggish or outright slow to load. Disabling these queries can improve performance dramatically on some pages. - -
- -
- -
$sugar_config['disable_vcr'] = true;
- -
- -
-By default opening the detail view of a record from the list view will also load the other records in the list to allow for easy moving through records. If you do not use this feature, or, if loading the detail view for some records has become slow, you can disable this feature. - -
- -
- -
$sugar_config['list_max_entries_per_page'] = '10';
- -
- -
-The number of records shown in each page of the list view can be decreased. This will result in a slight increase in performance on list view pages. - -
- -
- -
$sugar_config['logger']['level'] = 'fatal';
- -
- -
-Lowering the log level means that there will be less log messages to write to disk on each request. This will slightly (very slightly) increase performance. - - -
- - -
- -== 19. Further Resources == - -Although this book has aimed to be a thorough resource, SuiteCRM is large and feature rich. Therefore it is not possible to include all the information you may require. Here are some extra resources for developing with SuiteCRM. - -=== SuiteCRM Website === - -The SuiteCRM website ([http://suitecrm.com SuiteCRM.com] has many excellent resources including: - -* [https://suitecrm.com/forum/index SuiteCRM forums] - come and say hi! -* [https://suitecrm.com/suitecrm/blog SuiteCRM Blog] -* [https://suitecrm.com/wiki/index.php/Main_Page SuiteCRM Wiki] - -=== External SuiteCRM Resources === - -; [https://github.com/salesagility/SuiteCRM SuiteCRM GitHub] -: The SuiteCRM source code is hosted on GitHub. Here you can get bleeding edge code changes and even contribute code. - -=== SugarCRM Resources === - -SuiteCRM has strived to remain compatible with the SugarCRM community edition and much of the documentation is still valid. The appropriate version for SuiteCRM information is 6.5. Versions of documentation higher than this (i.e. 7) will probably not be relevant. - -* [http://support.sugarcrm.com/02_Documentation/04_Sugar_Developer/ SugarCRM Developer docs] -* [http://developer.sugarcrm.com/ SugarCRM Developer Blog] - -=== Technical Links === - -* [http://php.net/ PHP] - The main language used by SuiteCRM -* [http://www.smarty.net/ Smarty] - The templating language used throughout SuiteCRM. -* [http://xdebug.org XDebug] - Debugging/profiling extension for PHP -* [http://git-scm.com/ Git] - Distributed version control system -* [http://yuilibrary.com/ YUI] - Legacy Javascript library used in SuiteCRM -* [https://jquery.com/ JQuery] - Javascript library used in SuiteCRM - to be preferred over YUI. -* [https://github.com/PHPMailer/PHPMailer PHPMailer] Email library used in SuiteCRM -* [http://php.net/manual/en/book.apc.php APC] - Alternative PHP Cache. PHP Opcode cache supported by SuiteCRM -* [http://php.net/manual/en/book.wincache.php WinCache] - Windows PHP cache. PHP Opcode cache supported by SuiteCRM -* [https://www.jetbrains.com/phpstorm/ PHPStorm] - PHP IDE (Paid) -* [https://eclipse.org/pdt/ Eclipse PHP Development Tools] - PHP IDE (Free and Open Source) - -=== Other Links === - -* [https://salesagility.com/ SalesAgility] - The company behind SuiteCRM. -* [http://www.jsmackin.co.uk Jim Mackin] - Me :) - - -
- - -
- -== 20. Appendix A - Code Examples == - -=== Metadata === - -This is an example of setting up a function subpanel (see the [[#chap05.xhtml#metadata-chapter|Metadata]] chapter for more information). - -In this example the cases module has a custom field incident_code_c which is used to track cases with the same root cause. We’ll add a subpanel to show all cases that have the same incident_code_c. - -Initially we add to the subpanel_setup section of Cases by creating the following file in custom/Extension/modules/Cases/Ext/Layoutdefs/IncidentLayoutdefs.php - -
- -Example A.1: IncidentLayoutdefs.php - - ------ - -
- -
 1 <?php
- 2 $layout_defs["Cases"]["subpanel_setup"]['incident_cases'] = array(
- 3   'module' => 'Cases',
- 4   'title_key' => 'LBL_INCIDENT_CASES',
- 5   'subpanel_name' => 'default',
- 6   'get_subpanel_data' => 'function:get_cases_by_incident',
- 7   'function_parameters' => 
- 8           array('import_function_file' => 'custom/modules/Cases/IncidentUtils.ph\
- 9 p',),
-10 );
- -
- ------ - - -
-Next we create the file which will define our get_cases_by_incident function custom/modules/Cases/IncidentUtils.php. - -
- -Example A.2: IncidentUtils.php - - ------ - -
- -
 1 <?php
- 2 function get_cases_by_incident(){
- 3         global $db;
- 4         //Get the current bean
- 5         $bean = $GLOBALS['app']->controller->bean;
- 6         $incidentCode = $db->quote($bean->incident_code_c);
- 7         //Create the SQL array
- 8         $ret = array();
- 9         $ret['select'] = ' SELECT id FROM cases ';
-10         $ret['from'] = ' FROM cases ';
-11         $ret['join'] = "";
-12         //Get all cases where the incident code matches but exclude the current \
-13 case.
-14         $ret['where']="WHERE cases.deleted = 0 AND cases_cstm.incident_code_c = \
-15 '{$incidentCode}' AND cases.id != '{$bean->id}'";
-16         return $ret;
-17 }
- -
- ------ - - -
-=== Module Installer === - -The following is a basic example manifest file. See the [[#chap14.xhtml#module-installer-chapter|Module Installer]] chapter. - -
- -Example A.3: Example manifest file - - ------ - -
- -
  1 $manifest = array(
-  2   'name' => 'Example manifest',
-  3   'description' => 'A basic manifest example',
-  4   'version' => '1.2.3',
-  5   'author' => 'Jim Mackin',
-  6   'readme' => 'This is a manifest example for the SuiteCRM for Developers book',
-  7   'acceptable_sugar_flavors' => array('CE'),
-  8   'acceptable_sugar_versions' => array(
-  9       'exact_matches' => array('6.5.20',),
- 10   ),
- 11   'dependencies' => array(
- 12     array(
- 13       'id_name' => 'hello_world',
- 14       'version' => '3.2.1'
- 15     ),
- 16   ),
- 17   'icon' => 'ManifestExample.png',
- 18   'is_uninstallable' => true,
- 19   'published_date' => '2015-05-05',
- 20   'type' => 'module',
- 21   'remove_tables' => 'prompt',
- 22 );
- 23 $installdefs = array(
- 24   'id' => 'suitecrmfordevelopers_example_manifest',
- 25   'image_dir' => '/images/',
- 26   'copy' => array(
- 27     array(
- 28       'from' => '/modules/ExampleModule',
- 29       'to' => 'modules/ExampleModule',
- 30     ),
- 31   ),
- 32   'dashlets' => array(  
- 33     array(
- 34       'from' => '/modules/ExampleModule/Dashlets/',  
- 35       'name' => 'ExampleModuleDashlet'  
- 36     )
- 37   ),
- 38   'language' => array(
- 39     array(
- 40       'from' => 'application/language/en_us.examplemoduleadmin.php',  
- 41       'to_module' => 'application',  
- 42       'language' => 'en_us'
- 43     ),
- 44     array(    
- 45       'from' => '/modules/Accounts/language/en_us.examplemodule.php',
- 46       'to_module' => 'Accounts',
- 47       'language' => 'en_us'
- 48     ),
- 49     array(
- 50       'from' => '/application/language/es_es.examplemoduleadmin.php',  
- 51       'to_module' => 'application',
- 52       'language' => 'es_es'
- 53     ),  
- 54     array(    
- 55       'from' => '/modules/Accounts/language/es_es.examplemodule.php',  
- 56       'to_module' => 'Accounts',
- 57       'language' => 'es_es'
- 58     ),  
- 59   ),
- 60   'custom_fields' => array(  
- 61     array(
- 62       'name' => 'example_field',
- 63       'label' => 'Example Field',
- 64       'type' => 'varchar',
- 65       'max_size' =>  100,
- 66       'module' => 'Accounts',  
- 67     ),
- 68   ),
- 69   'vardefs' => array(  
- 70     array(  
- 71       'from' => 'modules/Accounts/vardefs/examplemodule_vardefs.php',  
- 72       'to_module' => 'Accounts',  
- 73     ),
- 74   ),
- 75   'beans' => array(
- 76     array(
- 77       'module' => 'ExampleModule',  
- 78       'class' => 'ExampleModule',
- 79       'path' => 'modules/ExampleModule/ExampleModule.php',  
- 80     ),
- 81   ),
- 82   'logic_hooks' => array(
- 83     array(  
- 84       'module' => 'Accounts',
- 85       'hook' => 'before_save',  
- 86       'order' => 100,  
- 87       'description'  => 'Example module before save hook',  
- 88       'file' => 'modules/ExampleModule/ExampleModuleHook.php',
- 89       'class' => 'ExampleModuleLogicHooks',
- 90       'function' => 'accounts_before_save',  
- 91     ),
- 92   ),  
- 93   'administration' => array(  
- 94     array(  
- 95       'from' => 'modules/administration/examplemodule_admin.php',  
- 96     ),
- 97   ),
- 98 );
- 99 $upgrade_manifest = array(
-100 );
- -
- ------ - - -
- -
- - -
- -== 21. Appendix B - API Methods == - -=== Methods === - -==== login ==== - -Logs into SuiteCRM and returns a session id used for subsequent API calls. - -===== Arguments ===== - -login arguments - -{| -! Name -! Type -! Desc -|- -| user_auth -| array -| Authentication details for the API User -|- -| user_auth[user_name] -| string -| The user name of the SuiteCRM user. Required. -|- -| user_auth[password] -| string -| The MD5 hash of the password for user_name. Required. -|- -| application_name -| string -| An identifier for the application accessing the API -|- -| name_value_list -| name_value_list -| An array of login options -|- -| name_value_list[language] -| string -| The language for this user -|- -| name_value_list[notifyonsave] -| bool -| Send email notifications when a new record is saved and assigned to a user -|} - -===== Response ===== - -login response - -{| -! Name -! Type -! Desc -|- -| id -| string -| The session id for this login. Required for all other API calls. -|- -| name_value_list -| name_value_list -| An array containing information about this user. -|- -| name_value_list[user_id] -| string -| The id of the logged in user. -|- -| name_value_list[user_name] -| string -| The user_name of the logged in user -|- -| name_value_list[user_language] -| string -| The language setting of the logged in user -|- -| name_value_list[user_currency_id] -| string -| The id of the currency of the logged in user. -99 is the default currency. -|- -| name_value_list[user_currency_name] -| string -| The name of the currency of the logged in user. -|- -| name_value_list[user_is_admin] -| bool -| Whether the logged in user is an admin -|- -| name_value_list[user_default_team_id] -| string -| The default team of the logged in user. This value comes from before the fork of SuiteCRM and isn’t used. -|- -| name_value_list[user_default_dateformat] -| string -| The default date format of the logged in user. -|- -| name_value_list[user_default_timeformat] -| string -| The default time format of the logged in user -|- -| name_value_list[user_number_seperator] -| string -| The number separator of the logged in user. (I.e. comma for numbers in the 1,000.00 format) -|- -| name_value_list[user_decimal_seperator] -| string -| The decimal separator of the logged in user. (I.e. period for numbers in the 1,000.00 format) -|- -| name_value_list[mobile_max_list_entries] -| int -| Max list entries for the logged in user (simply grabs the wl_list_max_entries_per_subpanel config key) -|- -| name_value_list[mobile_max_subpanel_entries] -| int -| Max subpanel entries for the logged in user(simply grabs the wl_list_max_entries_per_subpanel config key) -|} - -==== logout ==== - -Logs the web user out of SuiteCRM and destroys the session. - -===== Arguments ===== - -logout arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|} - -===== Response ===== - -No response. - -==== get_available_modules ==== - -Returns a list of the modules available for use. Also returns the ACL (Access Control List) for each module. - -===== Arguments ===== - -get_available_modules arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|- -| filter -| string -| Filter the modules returned. Either ‘default’, ‘mobile’ or ‘all’. -|} - -===== Response ===== - -get_available_modules response - -{| -! Name -! Type -! Desc -|- -| modules -| array -| An array containing the module details. -|- -| modules[][module_key] -| string -| The key for this module -|- -| modules[][module_label] -| string -| The label for this module -|- -| modules[][favorite_enabled] -| bool -| Favorites were SugarCRM Professional functionality. This is always empty. -|- -| modules[][acls] -| array -| An array containing the ACL list - that is what actions are allowed. -|- -| modules[][acls][][action] -| string -| The action i.e. edit, delete, list etc. -|- -| modules[][acls][][access] -| bool -| Whether or not access is allowed. -|} - -==== get_document_revision ==== - -Returns the details for a specific document revision. - -===== Arguments ===== - -get_document_revision arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|- -| i -| string -| The id of the document revision to retrieve -|} - -===== Response ===== - -get_document_revision response - -{| -! Name -! Type -! Desc -|- -| document_revision -| array -| An array containing the document revision details -|- -| document_revision[id] -| string -| The id of the document revision. -|- -| document_revision[document_name] -| string -| The name of the document revision -|- -| document_revision[revision] -| int -| The revision number of the document revision. -|- -| document_revision[filename] -| string -| The filename of the file -|- -| document_revision[file] -| binary string -| The full contents of the file -|} - -==== get_entries ==== - -Gets a list of entries for a specific module and list of module ids. Optionally allows returning related records. - -===== Arguments ===== - -get_entries arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|- -| module_name -| string -| The name of the module to display entries for. -|- -| ids -| array -| An array of record ids to fetch -|- -| ids[] -| string -| An individual id -|- -| select_fields -| array -| An array of fields to return. An empty array will return all fields. -|- -| select_fields[] -| string -| The name of a field to return -|- -| link_name_to_fields_array -| name_value_list -| An array of relationships to retrieved. -|- -| link_name_to_fields_array[][name] -| string -| The name of the link to follow (as defined in module_name). -|- -| link_name_to_fields_array[][value] -| array -| An array of the fields to return for this related module. -|- -| link_name_to_fields_array[][value][] -| string -| The field name -|- -| track_view -| bool -| Whether to mark these records as recently viewed. -|} - -===== Response ===== - -get_entries response - -{| -! Name -! Type -! Desc -|- -| entry_list -| array -| An array of records. -|- -| entry_list[] -| array -| Details for an individual record. -|- -| entry_list[][id] -| string -| The id of this record. -|- -| entry_list[][module_name] -| string -| The name of the module this record belongs to. -|- -| entry_list[][name_value_list] -| name_value_list -| An array containing each returned field. -|- -| entry_list[][name_value_list][] -| array -| Details for an individual field. -|- -| entry_list[][name_value_list][][name] -| string -| The name of the field. -|- -| entry_list[][name_value_list][][value] -| string -| The value of the field. -|- -| relationship_list -| array -| An array of arrays containing the relationships for the corresponding record. -|- -| relationship_list[] -| array -| The relationships for the corresponding record. -|- -| relationship_list[link_list] -| array -| The list of relationships for this record. -|- -| relationship_list[link_list][] -| array -| Details of a single relationship. -|- -| relationship_list[link_list][][name] -| string -| The name of this relationship. -|- -| relationship_list[link_list][][records] -| array -| The related records for this relationship. -|- -| relationship_list[link_list][][records][] -| array -| Details of a single related record. -|- -| relationship_list[link_list][][records][][link_value] -| name_value_list -| An array of the requested fields for this relationship. -|- -| relationship_list[link_list][][records][][link_value][] -| array -| A name value pair for this particular field. -|- -| relationship_list[link_list][][records][][link_value][name] -| string -| The name of the field. -|- -| relationship_list[link_list][][records][][link_value][value] -| string -| The value of the field. -|} - -==== get_entries_count ==== - -Returns a count of entries matching the given query. - -===== Arguments ===== - -get_entries_count arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|- -| module_name -| string -| The name of the module to display entries for. -|- -| query -| string -| An SQL WHERE clause to apply to the query. -|- -| deleted -| bool -| Whether to include deleted records -|} - -===== Response ===== - -get_entries_count response - -{| -! Name -! Type -! Desc -|- -| result_count -| int -| The count of matching entries. -|} - -==== get_entry ==== - -Returns the details for a single record. Optionally allows returning related records. - -===== Arguments ===== - -get_entry arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|- -| module_name -| string -| The name of the module to fetch the entry for. -|- -| id -| string -| The id of the record to fetch -|- -| select_fields -| array -| An array of fields to return. An empty array will return all fields. -|- -| select_fields[] -| string -| The name of a field to return -|- -| link_name_to_fields_array -| name_value_list -| An array of relationships to retrieved. -|- -| link_name_to_fields_array[][name] -| string -| The name of the link to follow (as defined in module_name). -|- -| link_name_to_fields_array[][value] -| array -| An array of the fields to return for this related module. -|- -| link_name_to_fields_array[][value][] -| string -| The field name -|- -| track_view -| bool -| Whether to mark these records as recently viewed. -|} - -===== Response ===== - -Identical to the response by get_entries except only one record will be returned. - -==== get_entry_list ==== - -===== Arguments ===== - -get_entry_list arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|- -| module_name -| string -| The name of the module to fetch the entry for. -|- -| query -| string -| An SQL WHERE clause to apply to the query. -|- -| order_by -| string -| In theory for ordering results but this is unused. -|- -| offset -| int -| The result offset. Useful for pagination. -|- -| select_fields -| array -| An array of fields to return. An empty array will return all fields. -|- -| select_fields[] -| string -| The name of a field to return -|- -| link_name_to_fields_array -| name_value_list -| An array of relationships to retrieved. -|- -| link_name_to_fields_array[][name] -| string -| The name of the link to follow (as defined in module_name). -|- -| link_name_to_fields_array[][value] -| array -| An array of the fields to return for this related module. -|- -| link_name_to_fields_array[][value][] -| string -| The field name -|- -| max_results -| int -| The maximum number of results to return. Useful for pagination. -|- -| deleted -| bool -| Whether to include deleted records. -|- -| favorites -| bool -| Favorites were SugarCRM Professional functionality. This is unused. -|} - -===== Response ===== - -get_entry_list response - -{| -! Name -! Type -! Desc -|- -| result_count -| int -| The number of returned records. -|- -| total_count -| int -| The total number of records matching the query. -|- -| next_offset -| int -| The offset of the next set of records. -|- -| entry_list -| array -| An array of records. -|- -| entry_list[] -| array -| Details for an individual record. -|- -| entry_list[][id] -| string -| The id of this record. -|- -| entry_list[][module_name] -| string -| The name of the module this record belongs to. -|- -| entry_list[][name_value_list] -| name_value_list -| An array containing each returned field. -|- -| entry_list[][name_value_list][] -| array -| Details for an individual field. -|- -| entry_list[][name_value_list][][name] -| string -| The name of the field. -|- -| entry_list[][name_value_list][][value] -| string -| The value of the field. -|- -| relationship_list -| array -| An array of arrays containing the relationships for the corresponding record. -|- -| relationship_list[] -| array -| The relationships for the corresponding record. -|- -| relationship_list[link_list] -| array -| The list of relationships for this record. -|- -| relationship_list[link_list][] -| array -| Details of a single relationship. -|- -| relationship_list[link_list][][name] -| string -| The name of this relationship. -|- -| relationship_list[link_list][][records] -| array -| The related records for this relationship. -|- -| relationship_list[link_list][][records][] -| array -| Details of a single related record. -|- -| relationship_list[link_list][][records][][link_value] -| name_value_list -| An array of the requested fields for this relationship. -|- -| relationship_list[link_list][][records][][link_value][] -| array -| A name value pair for this particular field. -|- -| relationship_list[link_list][][records][][link_value][name] -| string -| The name of the field. -|- -| relationship_list[link_list][][records][][link_value][value] -| string -| The value of the field. -|} - -==== get_language_definition ==== - -Returns - -===== Arguments ===== - -get_language_definition arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|- -| modules -| array -| An array of the modules to return language labels for -|- -| modules[] -| string -| The modules name. -|- -| md5 -| bool -| Whether to return the md5 for each module. Can be useful for caching responses. -|} - -===== Response ===== - -get_language_definition response - -{| -! Name -! Type -! Desc -|- -| result[<modulename>]</modulename> -| string/array -| An array of the labels or an md5 string for <modulename /> -|} - -==== get_last_viewed ==== - -Returns a list of the most recently viewed modules for the current user. - -===== Arguments ===== - -get_last_viewed arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|- -| module_names -| array -| An array of the modules to return the last viewed records for. -|- -| module_names[] -| string -| The modules name. -|} - -===== Response ===== - -get_last_viewed response - -{| -! Name -! Type -! Desc -|- -| result[] -| array -| An array of the details of recently viewed records -|- -| result[][id] -| int -| The id of the tracker row for this viewing -|- -| result[][item_id] -| string -| The id of the viewed record. -|- -| result[][item_summary] -| string -| The summary of the record. This is usually it’s name. -|- -| result[][module_name] -| string -| The module for this record. -|- -| result[][monitor_id] -| string -| The monitor id for this viewing. Legacy and unused. -|- -| result[][date_modified] -| string -| The date that this record was viewed. -|} - -==== get_modified_relationships ==== - -Returns a list of the modified relationships for the current user between one of the Calls, Meetings or Contacts modules. - -===== Arguments ===== - -get_modified_relationships arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|- -| module_name -| string -| The name of the module to retrieve relationships for. Always Users. -|- -| related_module -| string -| The related module to retrieve records for. One of Meetings, Calls or Contacts. -|- -| from_date -| string -| The start date of the range to search. In the format Y-m-d H:i:s. -|- -| to_date -| string -| The end date of the range to search. In the format Y-m-d H:i:s. -|- -| offset -| int -| The record offset to start with. -|- -| max_results -| int -| The maximum number of results to return. -|- -| deleted -| bool -| Whether to include deleted records. -|- -| module_user_id -| string -| In theory the id of the user to return relationships for. However the current user is always used. -|- -| select_fields -| array -| An array of the fields to return for the relationship record. An empty array will return all fields. -|- -| select_fields[] -| string -| The name of the field to return. -|- -| relationship_name -| string -| The name of the relationship between module_name and related_module. -|- -| deletion_date -| string -| A start date for the range in which to return deleted records. In the format Y-m-d H:i:s. -|} - -===== Response ===== - -get_modified_relationships response - -{| -! Name -! Type -! Desc -|- -| result_count -| int -| The number of returned records. -|- -| next_offset -| int -| The offset of the next set of records. -|- -| entry_list -| array -| An array of the returned records. -|- -| entry_list[] -| array -| Details for an individual record. -|- -| entry_list[][id] -| string -| The id of this record. -|- -| entry_list[][module_name] -| string -| The name of the module this record belongs to. -|- -| entry_list[][name_value_list] -| name_value_list -| An array containing each returned field. -|- -| entry_list[][name_value_list][] -| array -| A name value pair of the field information. -|- -| entry_list[][name_value_list][][name] -| string -| The name of the field. -|- -| entry_list[][name_value_list][][value] -| string -| The value of the field. -|- -| error -| array -| An array containing the error details. -|- -| error[number] -| int -| The error number of the error that occurred. -|- -| error[name] -| string -| The name of the error that occurred. -|- -| error[description] -| string -| A description of the error that occurred. -|} - -==== get_module_fields ==== - -Returns the field definitions for a given module. - -===== Arguments ===== - -get_module_fields arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|- -| module_name -| string -| The name of the module to return field definitions for. -|- -| fields -| array -| An array of fields to return definitions for. An empty array will return all fields. -|- -| fields[] -| string -| The name of the field. -|} - -===== Response ===== - -get_module_fields response - -{| -! Name -! Type -! Desc -|- -| module_name -| string -| The name of the module. -|- -| table_name -| string -| The name of the database table for this module. -|- -| module_fields -| array -| An array of the requested fields for this module. -|- -| module_fields[] -| array -| The details of a specific field. -|- -| module_fields[name] -| string -| The name of the field. -|- -| module_fields[type] -| string -| The type of the field. -|- -| module_fields[group] -| string -| The group of fields that this field belongs to. Used for addresses or link definitions. -|- -| module_fields[id_name] -| string -| The name of the id field on this module for this link if appropriate. -|- -| module_fields[label] -| string -| The display label for this field. -|- -| module_fields[required] -| bool -| Whether this field is required or not. -|- -| module_fields[options] -| name_value_list -| An array of possible options for this field. An empty array if options are not appropriate for this field type. -|- -| module_fields[options][] -| array -| A name value pair of a single option. -|- -| module_fields[options][][name] -| string -| The options key. -|- -| module_fields[options][][value] -| string -| The options display value. -|- -| module_fields[related_module] -| string -| The related module for this field if it is a related type. Empty otherwise. -|- -| module_fields[calculated] -| string -| Calculated fields were a SugarCRM professional feature. Will be empty. -|- -| module_fields[len] -| int -| The length of this field or an empty string if this is not appropriate for this field type. -|- -| link_fields -| array -| An array of the requested link fields for this module. -|- -| link_fields[] -| array -| The details of a specific field. -|- -| link_fields[name] -| string -| The name of the field. -|- -| link_fields[type] -| string -| The type of the field. Will always be link. -|- -| link_fields[group] -| string -| The group of fields that this field belongs to. Will be empty for links. -|- -| link_fields[id_name] -| string -| The name of the id field on this module for this link if appropriate. -|- -| link_fields[relationship] -| string -| The relationship name for this link. -|- -| link_fields[module] -| string -| The module this field links to. -|- -| link_fields[bean_name] -| string -| The bean that this field links to. -|} - -==== get_module_fields_md5 ==== - -Returns an md5 of the a modules field definitions. Useful for caching. - -===== Arguments ===== - -get_module_fields_md5 arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|- -| module_names -| array -| An array of modules to return the md5 for. -|- -| module_names[] -| string -| The name of the module to return the field definitions md5 for. -|} - -===== Response ===== - -get_module_fields_md5 response - -{| -! Name -! Type -! Desc -|- -| result[] -| array -| An array of the md5’s keyed by the module name. -|- -| result[<modulename>]</modulename> -| string -| The md5 string for <modulename /> -|} - -==== get_module_layout ==== - -Returns the layout for specified modules and views. Optionally returns an md5 of the layouts. - -===== Arguments ===== - -get_module_layout arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|- -| modules -| array -| An array of the modules to return layouts for. -|- -| modules[] -| string -| The name of the module. -|- -| types -| array -| An array of the types of views to return. Only default is supported. -|- -| types[] -| string -| The type of the views. -|- -| views -| array -| An array of the views to return. One of edit, detail, list and subpanel. -|- -| views[] -| string -| The name of the view. -|- -| acl_check -| bool -| Whether or not to check that the current user has access to this module and view. -|- -| md5 -| bool -| Whether or not to return the view as an md5 string. Useful for caching. -|} - -===== Response ===== - -get_module_layout response - -{| -! Name -! Type -! Desc -|- -| result -| array -| The array of results keyed by module name. -|- -| result[<modulename>]</modulename> -| array -| An array of layouts for <modulename>.</modulename> -|- -| result[<modulename>][default]</modulename> -| array -| An array of the layouts keyed by the view name. -|- -| result[<modulename>][default][<viewname>]</viewname></modulename> -| array/string -| The layout of the view <viewname> for the module <modulename> or an md5 of the layout. See the section on metadata for the layout format.</modulename></viewname> -|} - -==== get_module_layout_md5 ==== - -Returns the md5 of the specified views for the specified modules. Behaves identically to get_module_layout with the md5 parameter set to true. - -===== Arguments ===== - -get_module_layout arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|- -| modules -| array -| An array of the modules to return layouts for. -|- -| modules[] -| string -| The name of the module. -|- -| types -| array -| An array of the types of views to return. Only default is supported. -|- -| types[] -| string -| The type of the views. -|- -| views -| array -| An array of the views to return. One of edit, detail, list and subpanel. -|- -| views[] -| string -| The name of the view. -|- -| acl_check -| bool -| Whether or not to check that the current user has access to this module and view. -|} - -===== Response ===== - -get_module_layout_md5 response - -{| -! Name -! Type -! Desc -|- -| md5 -| array -| The array of results keyed by module name. -|- -| md5[<modulename>]</modulename> -| array -| An array of layouts for <modulename>.</modulename> -|- -| md5[<modulename>][default]</modulename> -| array -| An array of the layouts keyed by the view name. -|- -| md5[<modulename>][default][<viewname>]</viewname></modulename> -| string -| The md5 of the layout layout of the view <viewname> for the module <modulename>.</modulename></viewname> -|} - -==== get_relationships ==== - -Returns related records given a specific module, record and list of links. ####Arguments - -get_relationships arguments - -{| -! Name -! Type -! Desc -!   -|- -| session -| string -| The session id. See login. -|   -|- -| module_name -| string -| The module to return relationships for. -|   -|- -| module_id -| string -| The record to return relationships for. -|   -|- -| link_field_name -| string -| The link field to follow for this record. -|   -|- -| related_module_query -| string -| A WHERE clause to use to filter the related modules by. -|   -|- -| related_fields -| array -| An array of the fields to return for matching records. -|   -|- -| related_fields[] -| string -| The name of the field. -|   -|- -| related_module_link_name_to_fields_array -| name_value_list -| An array of related fields to return for matching records. -|   -|- -| related_module_link_name_to_fields_array[] -| array -| Details for a specific link. -|   -|- -| related_module_link_name_to_fields_array[][name] -| string -| The name of the link to follow for matching records. -|   -|- -| related_module_link_name_to_fields_array[][value] -| array -| An array of fields to return for this link. -|   -|- -| related_module_link_name_to_fields_array[][value][] -| string -| The field name. -|   -|- -| deleted -| bool -| Whether to include deleted records. -|   -|- -| order_by -| string -| In theory for ordering results but this is unused. -|   -|- -| offset -| int -| The record offset to start with. -|   -|- -| limit -| int -| The maximum number of results to return. -|   -|} - -===== Response ===== - -Identical to the response by get_entries. - -==== get_server_info ==== - -Returns information about the SuiteCRM server. Currently still returns information about the SugarCRM flavor and versions. - -===== Arguments ===== - -No arguments. - -===== Response ===== - -get_server_info response - -{| -! Name -! Type -! Desc -|- -| flavor -| string -| The SugarCRM flavor. For SuiteCRM will always be ‘CE’. -|- -| version -| string -| The SugarCRM version. Note this this is distinct from the SuiteCRM version -|- -| gmt_time -| string -| The server time in UTC. -|} - -==== get_upcoming_activities ==== - -Returns a list of the 10 upcoming activities (Meetings, Calls and Tasks - also includes Opportunities) for the currently logged in user. - -===== Arguments ===== - -get_upcoming_activities arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|} - -===== Response ===== - -get_upcoming_activities response - -{| -! Name -! Type -! Desc -|- -| result -| array -| An array of the upcoming activities. -|- -| result[] -| array -| The details of a single activity. -|- -| result[][id] -| string -| The id of this activity. -|- -| result[][module] -| string -| The module for this activity. -|- -| result[][date_due] -| string -| The due date for this activity. -|- -| result[][summary] -| string -| The summary of this activity. Usually simply it’s name. -|} - -==== get_user_id ==== - -Returns the id of the currently logged in user. - -===== Arguments ===== - -get_user_id arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|} - -===== Response ===== - -get_user_id response - -{| -! Name -! Type -! Desc -|- -| id -| string -| The id of the current user. -|} - -==== seamless_login ==== - -Marks a session as allowing a seamless login. If successful then the session id (see the login call) can be used in a URL (as MSID) to log the user into SuiteCRM in the browser seamlessly. For example if you have the session id 1234 then accessing the URL example.com/index.php?MSID=1234. The MSID parameter can be used in any valid SuiteCRM URL. - -===== Arguments ===== - -seamless_login arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|} - -===== Response ===== - -seamless_login response - -{| -! Name -! Type -! Desc -|- -| result -| bool -| Boolean indicating success -|} - -==== search_by_module ==== - -Allows searching for records that contain a specific search string. - -===== Arguments ===== - -search_by_module arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|- -| search_string -| string -| The string to search for. -|- -| modules -| array -| An array of the modules to include in the search. -|- -| modules[] -| string -| The modules name. -|- -| offset -| int -| The result offset. Useful for pagination. -|- -| max_results -| int -| The maximum number of results to return. Useful for pagination. -|- -| assigned_user_id -| string -| Filter by the given assigned user. Leave blank to do no user filtering. -|- -| select_fields -| array -| An array of the fields to return for the found records. An empty array will return all fields. -|- -| select_fields[] -| string -| The name of the field to return. -|- -| unified_search_only -| bool -| Whether to only return records for modules that participate in the global search. -|- -| favorites -| bool -| Favorites were SugarCRM Professional functionality. This is unused. -|} - -===== Response ===== - -search_by_module response - -{| -! Name -! Type -! Desc -|- -| entry_list -| array -| An array of the results for each module. -|- -| entry_list[] -| array -| Results for a specific module. -|- -| entry_list[][name] -| string -| The name of the module that this entry contains results for. -|- -| entry_list[][records] -| array -| An array of the record results. -|- -| entry_list[][records][] -| name_value_list -| A name value list of records id and name. -|- -| entry_list[][records][][id] -| array -| A name value pair containing the id of this record. -|- -| entry_list[][records][][name] -| array -| A name value pair containing the name of this record. -|} - -==== set_document_revision ==== - -Creates a new document revision for a document. - -===== Arguments ===== - -set_document_revision arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|- -| note -| array -| An array containing the document revision details. -|- -| note[id] -| string -| The id of the document to add this revision to. -|- -| note[file] -| binary string -| The binary contents of the file, base 64 encoded. -|- -| note[filename] -| string -| The name of the file. -|- -| note[revision] -| int -| The revision number for this revision. -|} - -===== Response ===== - -set_document_revision response - -{| -! Name -! Type -! Desc -|- -| id -| string -| The id of the newly created document revision. -|} - -==== set_entries ==== - -Creates or updates a list of records. - -===== Arguments ===== - -Note: Supplying a value for the id field will perform an update for that record. - -set_entries arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|- -| module_name -| string -| The name of the module to create/update records for. -|- -| name_value_lists -| name_value_list -| An array of the details for each record to create/update. -|- -| name_value_lists[] -| array -| Details of an individual record. -|- -| name_value_lists[][] -| array -| A name value pair for each field value. -|- -| name_value_lists[][][name] -| array -| The name of the field. -|- -| name_value_lists[][][value] -| array -| The value for the field. -|} - -===== Response ===== - -set_entries response - -{| -! Name -! Type -! Desc -|- -| ids -| array -| An array of the resulting ids. Returned in the same order as specified in the call to set_entries. -|- -| ids[] -| array -| The id for this record. -|} - -==== set_entry ==== - -Creates or updates a single record. - -===== Arguments ===== - -Note: Supplying a value for the id field will perform an update for that record. - -set_entries arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|- -| module_name -| string -| The name of the module to create/update a record for. -|- -| name_value_list -| name_value_list -| An array of the fields for the new/updated record. -|- -| name_value_lists[] -| array -| A name value pair for each field value. -|- -| name_value_lists[][name] -| array -| The name of the field. -|- -| name_value_lists[][value] -| array -| The value for the field. -|} - -===== Response ===== - -set_entries response - -{| -! Name -! Type -! Desc -|- -| id -| string -| The id of the newly created or updated record. -|} - -==== get_note_attachment ==== - -Returns the details of a given note attachment. - -===== Arguments ===== - -get_note_attachment arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|- -| id -| string -| The id of the note to retrieve information for. -|} - -===== Response ===== - -get_note_attachment response - -{| -! Name -! Type -! Desc -|- -| note_attachment -| array -| The details for the note attachment. -|- -| note_attachment[id] -| string -| The id of the note to retrieve information for. -|- -| note_attachment[filename] -| string -| The filename of the file -|- -| note_attachment[file] -| binary string -| The full contents of the file -|- -| note_attachment[related_module_id] -| string -| The id of the record that this attachment is related to. -|- -| note_attachment[related_module_name] -| string -| The module of the record that this attachment is related to. -|} - -==== set_note_attachment ==== - -Creates a not attachment for a specified record. - -===== Arguments ===== - -set_note_attachment arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|- -| note -| array -| The details for the note attachment. -|- -| note[id] -| string -| The id of the note to add an attachment for. -|- -| note[filename] -| string -| The filename of the file -|- -| note[file] -| binary string -| The full contents of the file base 64 encoded. -|} - -===== Response ===== - -set_entries response - -{| -! Name -! Type -! Desc -|- -| id -| string -| The id of the note for this attachment. -|} - -==== set_relationship ==== - -Sets a relationship between a record and other records. - -===== Arguments ===== - -set_relationship arguments - -{| -! Name -! Type -! Desc -|- -| session -| string -| The session id. See login. -|- -| module_name -| string -| The name of the module to relate records to. -|- -| module_id -| string -| The id of the record to relate records to. -|- -| link_field_name -| string -| The name of the link field on the module through which records will be related. -|- -| related_ids -| array -| An array of record ids to relate. -|- -| related_ids[] -| string -| The id of a record to relate. -|- -| name_value_list -| name_value_list -| A name value list of additional relationship fields to set. -|- -| name_value_list[] -| array -| A name value pair for a relationship field to set. -|- -| name_value_list[][name] -| string -| The name of the field to set. -|- -| name_value_list[][value] -| string -| The value of the field to set. -|- -| delete -| bool -| Whether or not to delete the specified relationship instead of creating/updating it. -|} - -===== Response ===== - -set_relationship response - -{| -! Name -! Type -! Desc -|- -| created -| int -| The number of relationships created. -|- -| failed -| int -| The number of relationships that failed to be created/deleted. -|- -| deleted -| int -| The number of relationships deleted. -|} - -==== set_relationships ==== - -Sets relationships between multiple records. - -===== Arguments ===== - -set_relationships arguments - -{| -! Name -! Type -! Desc -!   -|- -| session -| string -| The session id. See login. -|   -|- -| module_names -| array -| An array of modules to relate records to. -|   -|- -| module_names[] -| string -| The name of the module to relate records to. -|   -|- -| module_ids -| array -| An array of the ids of records to relate records to. -|   -|- -| module_ids[] -| string -| The id of the record to relate records to. -|   -|- -| link_field_names -| string -| An array of the link names through which records will be related. -|   -|- -| link_field_names[] -| string -| The name of the link field on the module through which records will be related. -|   -|- -| related_ids -| array -| An array of an array of record ids for each module specified. -|   -|- -| related_ids[] -| array -| An array of record ids for the corresponding module. -|   -|- -| related_ids[][] -| string -| The record id. -|   -|- -| name_value_lists -| array -| An array of an array of name value list of additional relationship fields to set. -|   -|- -| name_value_lists[] -| name_value_list -| An array of name value pairs for the relationship fields of the corresponding module. -|   -|- -| name_value_lists[][name] -| string -| The name of the field to set. -|   -|- -| name_value_lists[][value] -| string -| The value of the field to set. -|   -|- -| delete_array -| array -| An array of booleans indicating whether or not the relationship should be deleted for each module. -|   -|- -| delete_array[] -| bool -| Whether or not to delete the specified relationship instead of creating/updating it. -|   -|} - -===== Response ===== - -set_relationships response - -{| -! Name -! Type -! Desc -|- -| created -| int -| The number of relationships created. -|- -| failed -| int -| The number of relationships that failed to be created/deleted. -|- -| deleted -| int -| The number of relationships deleted. -|} - - -
diff --git a/_source/userguide.adoc b/_source/userguide.adoc deleted file mode 100644 index 908b94b79..000000000 --- a/_source/userguide.adoc +++ /dev/null @@ -1,5748 +0,0 @@ - -Title: User guide - - - -[[the-suitecrm-team-and-community]] -The SuiteCRM Team and Community -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -It is safe to say without the constant work from the SuiteCRM Team and -Community, I would not have had the drive and commitment to sit down and -write this user guide. New functionality and improvements to the core -product are constantly added to make SuiteCRM the best Open Source CRM -product in the world, and to compete with proprietary CRM vendors such -as SugarCRM, Salesforce and Microsoft. - -As for The SuiteCRM Community - they provide bug reports, bug fixes and -bug testing. The Community is at the heart of any Open Source project -and this is no different with SuiteCRM. With each new release the -community grows and with it grow the benefits of the Open Source -ecosystem. - -[[what-is-suitecrm]] -What is SuiteCRM? ------------------ - -SuiteCRM is a software fork of the popular -https://en.wikipedia.org/wiki/Customer_relationship_management[Customer -Relationship Management] (CRM) system -https://en.wikipedia.org/wiki/SugarCRM[SugarCRM], developed and -maintained by SalesAgility. It is a free and open source alternative -application. It was released on October 21, 2013 as version 7.0. The -latest production version at the time of publishing this User Guide is -SuiteCRM 7.6.3. - -SuiteCRM has been downloaded more than 500,000 times since the original -release. It has been adopted by NHS (National Health Service) England's -Code for Health programme which seeks to foster open source in the NHS -in England. - -The SuiteCRM project has stated that the every line of code released by -the project will be open source. SuiteCRM project is intended to be an -enterprise-class open source alternative to proprietary products. - -A project Roadmap is available that details planned enhancements. - -An active public support forum with more than 25,000 members is -available for free support and is regularly monitored and updated by the -Project team. - -A directory of extensions is available where both free and paid-for -enhancements are available. - -The project maintains https://suitecrmondemand.com/[SuiteCRM:OnDemand], -a Software As A Service facility for users who seek a rapid deployment -and maintenance free service. - -There will be no licensed software as part of the project managed by -SalesAgility. All the code is free. All the code is available for free -download. There is no hidden agenda to charge for access to the code. It -is and always will be free and open source. There will be no paid-for -versions. - -[[who-is-salesagility]] -Who is SalesAgility? --------------------- - -SalesAgility is an ISO-accredited open source consultancy focused on -Customer Relationship Management (CRM). An early adopter of SugarCRM -Community Edition, SalesAgility are the creators and maintainers behind -the SugarCRM fork – SuiteCRM. - -SalesAgility have delivered more than 300 SuiteCRM and SugarCRM -projects, and are known as a world class knowledge and expertise -resource for open source CRM. Customers include governments, enterprises -and small and medium sized business globally. - -SalesAgility has a clear mission statement: - -_"Our goal is to innovate and provide advanced SuiteCRM and SugarCRM -solutions along with the industry’s leading customer service and -support._ - -_We believe that open source is in the best interest of our clients and -we will continue to build, innovate, evangelise and provide best -practice working models for the open source community."_ - -[[what-is-in-the-user-guide]] -What is in the User Guide? --------------------------- - -The SuiteCRM User Guide has been written for the end user. This guide -covers the SuiteCRM User Journey from end-to-end. We will explore all -areas from the basics of logging into the system to creating complex -automated workflows and reports. - -The SuiteCRM User Guide is split into various chapters. These chapters -are ordered so that you progress through you guide as you would -logically in day to day CRM use. The chapters contain sub-sections which -break down barriers for you, explaining how to optimise the use of the -customer relationship management system to effectively manage sales -data. - -Readers of the SuiteCRM User Guide do not need to have development -knowledge or prior knowledge of SuiteCRM. It is advised that you are -computer literate, that you are familiar with using your chosen web -browser and that SuiteCRM has already been installed and configured. - -[[getting-started]] -Getting Started ---------------- - -[[logging-into-suitecrm]] -Logging Into SuiteCRM -~~~~~~~~~~~~~~~~~~~~~ - -SuiteCRM allows users to log in using your Username and Password, -provided to you by the System Administrator. - -image:190Home_screen.png[190Home_screen.png,title="190Home_screen.png"] - -image:02Login_with_language.png[02Login_with_language.png,title="02Login_with_language.png"] - -Before logging into SuiteCRM, you can select the language you wish to -use. There are many default languages for SuiteCRM and there are also -additional language packs available for other languages around the -world. - -Once you have chosen your language and have entered your user -credentials, you will be able to click the Login button to access the -CRM. - -image:191Log_in.png[191Log_in.png,title="191Log_in.png"] - -[[forgotten-password]] -Forgotten Password -~~~~~~~~~~~~~~~~~~ - -If you forget your CRM password and cannot access your CRM user account, -you can use the 'Forgotten Password' feature to re-send your password to -the email address associated to your user account. Clicking the 'Forgot -Password?' link on the login form will display the forgotten password -form. - -image:179Forgot_password.png[179Forgot_password.png,title="179Forgot_password.png"] - -[[summary]] -Summary -~~~~~~~ - -In this chapter we have demonstrated how to access SuiteCRM using the -login form. We have also established how to use the forgotten password -functionality to retrieve a users password in the event of the password -being lost or forgotten. - -In the next chapter we will cover the User Wizard, which allows you to -set your preferences when using SuiteCRM. - -[[user-wizard]] -User Wizard ------------ - -The User Wizard guides you through the configuration options available -to you post login. This allows you to select many formats for data that -will display in SuiteCRM, and these are specific to your user. - -[[welcome-to-suitecrm]] -Welcome to SuiteCRM -~~~~~~~~~~~~~~~~~~~ - -The first step you will see is a simple welcome page that displays once -you have logged in. Click 'Next' on this page to progress to configure -your user preferences. - -image:04SuiteCRM_welcome.png[04SuiteCRM_welcome.png,title="04SuiteCRM_welcome.png"] - -[[your-information]] -Your Information -~~~~~~~~~~~~~~~~ - -On this screen you are able to provide information about yourself. When -you provide this information, other users can view this information such -as your Full Name, Email Address and Contact details. Fields marked with -a red star(*) are required fields, and as such need to be filled in with -valid data before you can progress. - -image:05Welcome_info.png[05Welcome_info.png,title="05Welcome_info.png"] - -Once you have filled in all information on this page, click 'Next' to -progress to the next step in the wizard. - -[[your-locale]] -Your Locale -~~~~~~~~~~~ - -On this screen, you are able to specify your preferred Locale settings. - -image:06SuiteCRM_Locale.png[06SuiteCRM_Locale.png,title="06SuiteCRM_Locale.png"] - -[[currency-selection]] -Currency Selection -~~~~~~~~~~~~~~~~~~ - -Select the Currency you wish to be displayed for all Currency fields -within SuiteCRM. The Currency options are populated from the options -added by the System Administrator. If there are Currency options you -require but do not see, please contact your System Administrator. - -image:180Currency_selection.png[180Currency_selection.png,title="180Currency_selection.png"] - -[[date-format]] -Date Format -~~~~~~~~~~~ - -Select the Date Format you wish to be displayed for all Date fields -within SuiteCRM. There are many different date format options to select -from, all of which are specific to your user. This date format will also -apply to Date Time fields. - -image:08Date_format.png[08Date_format.png,title="08Date_format.png"] - -[[time-zone]] -Time Zone -~~~~~~~~~ - -Select the Time Zone you wish to use within SuiteCRM. This allows you to -tailor your use of SuiteCRM specific to where you are located globally. -If you are travelling between various countries, you can change the Time -Zone at any time in your User Preferences after you Wizard set-up, to -allow you to view records in that Time Zone. - -image:09Time_zone.png[09Time_zone.png,title="09Time_zone.png"] - -[[name-format]] -Name Format -~~~~~~~~~~~ - -Select the Name Format you wish to be displayed for all Name fields -within SuiteCRM. This is applicable to the various 'Person' modules -within SuiteCRM, and allows you to set your preferred name format -dependent on your requirement. - -image:181Name_format.png[181Name_format.png,title="181Name_format.png"] - -Once you have specified all of your Locale preferences, click 'Next' to -progress to the final step/confirmation page of the User Wizard. - -[[final-step]] -Final Step -~~~~~~~~~~ - -The final step of the User Wizard provides you with multiple useful -links for learning more and obtaining further support from the SuiteCRM -website and dedicated team. There is a 'Back' button if you have made -any mistakes you wish to amend in previous steps. - -image:image12.png[image12.png,title="image12.png"] - -Clicking 'Finish' will complete the User Wizard and will present you -with SuiteCRM login form. - -[[summary-1]] -Summary -~~~~~~~ - -In this chapter, we progressed through the User Wizard. This allows you -to set your preferences when using SuiteCRM. - -In the next chapter, we will cover managing user accounts, which will -discuss how to update user details, select themes, change passwords and -more. - -[[managing-user-accounts]] -Managing User Accounts ----------------------- - -There are many configuration options available to users once logged into -the system. You can view/modify your preferences by clicking on your -name in the top right section of the navigation menu. - -image:11User_select.png[11User_select.png,title="11User_select.png"] - -[[user-profile-tab]] -User Profile Tab -~~~~~~~~~~~~~~~~ - -Once you have clicked to access your preferences, you will be taken to -the 'User Profile' tab which gives an overview of you credentials such -as Username, First Name, Last Name, Title etc. - -image:12User_profile.png[12User_profile.png,title="12User_profile.png"] - -[[password-tab]] -Password Tab -~~~~~~~~~~~~ - -Clicking on the 'Password' tab will navigate you to allow you to change -your user account password. To change your password, specify a new -password and confirm the new password. It is recommended that passwords -are secure. The recommended minimum requirement is one upper case -character, one lower case character, one numerical character and a -minimum password length of 8 characters. - -image:13Password_tab.png[13Password_tab.png,title="13Password_tab.png"] - -If you have forgotten your password and cannot login, you can use the -forgotten password functionality detailed in the -link:#Getting_Started[Getting Started] section of this User Guide. - -[[themes-tab]] -Themes Tab -~~~~~~~~~~ - -You can easily manage the theme you are using to view SuiteCRM by -navigating to the Themes Tab. This tab allows you to easily select the -desired theme, and also shows a theme preview image (assuming this has -also been provided with any third party or additional themes). - -image:image16.png[image16.png,title="image16.png"] - -[[advanced-tab]] -Advanced Tab -~~~~~~~~~~~~ - -The Advanced tab provides you with you preferences that you set during -the User Wizard process. This gives you the ability to change any of -your user preferences, if there were any mistakes or if you require to -amend these at a later date. - -image:14Advanced_tab.png[14Advanced_tab.png,title="14Advanced_tab.png"] - -[[resetting-a-users-preferences]] -Resetting a Users Preferences -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You can reset your user preferences to the system default by clicking -the 'Reset User Preferences' button on your profile. - -image:15User_preference.png[15User_preference.png,title="15User_preference.png"] - -Clicking the button will prompt you to ensure you wish to reset your -user preferences, with the following message: “Are you sure you want -reset all of your user preferences? Warning: This will also log you out -of the application.”. you can then click 'OK' or 'Cancel' to action -appropriately. If you select 'OK' you will be logged out and will need -to re-login to SuiteCRM application. - -[[resetting-a-users-home-page]] -Resetting a Users home page -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You can reset your home page to the system default by clicking the -'Reset home page' button on your profile. This will reset both dashlet -and dashboard preferences/layouts to the system default. - -image:16Reset_homepage.png[16Reset_homepage.png,title="16Reset_homepage.png"] - -Clicking the button will prompt you to ensure you wish to reset your -home page, with the following message: “Are you sure you want reset your -home page?”. you can then click 'OK' or 'Cancel' to action -appropriately. - -[[summary-2]] -Summary -~~~~~~~ - -In this chapter, we covered managing a user account. This allows you to -manage your information, modify/reset user preferences and more. - -In the next chapter, we will cover the Interface. The Interface is an -integral part of SuiteCRM. With the knowledge of your Interface, you can -progress to learning more about SuiteCRM functionality and processes. - -[[user-interface]] -User Interface --------------- - -Before we progress to understanding the structure and functionality of -SuiteCRM, we will cover the areas of the User Interface so that you are -familiar with terminology used when describing navigating SuiteCRM. -There are many elements to the User Interface, so we have broken these -down into various sections below. - -[[navigation-elements]] -Navigation Elements -~~~~~~~~~~~~~~~~~~~ - -The ability to easily view and navigate to areas of the CRM is key to -improved productivity and user adoption. SuiteCRM has a clear UI which -has various elements we will cover in this section. - -[[top-navigation-menu]] -Top navigation menu -^^^^^^^^^^^^^^^^^^^ - -The top navigation menu is the main menu users will use to navigate to -modules to create and manage records. The standard layout for the top -navigation is a list of 10 modules. The ordering for this menu is -determined by the order of the modules in Admin → Display Modules and -Subpanels. The top navigation menu has six elements. These are: - -* CRM Name – This is the name for the CRM which is specified on -installation. This defaults to SuiteCRM. -* Module Menu – This lists or groups the modules, dependent on the user -preference. This provides the ability for users to navigate to modules -within the CRM. -* Desktop Notification Count – This shows the number of desktop -notifications the user has not yet read. These can be managed by the -user. For full details on Desktop Notifications, see the -link:#Desktop_Notifications[Desktop Notifications] section within this -user guide. -* Quick Create – Quick create allows the quick creation of key module -records globally within the CRM. -* Global/Full Text Search – Allows users to search the CRM globally for -records/data. -* User menu – This displays the user name for the user currently logged -in. There is a drop down menu which gives users access to Employees, -their profile, the about page and a link to logout. - -image:17Navigation_menu.png[17Navigation_menu.png,title="17Navigation_menu.png"] - -To view a module, you can click on the module name. This will take you -to the List View of that module. For full details on views, read the -link:#Views[Views] section of this user guide. - -Hovering over a module name will produce a drop down menu. This drop -down menu displays the Actions and Recently Viewed records for that -module. - -image:18Dropdown_menu.png[18Dropdown_menu.png,title="18Dropdown_menu.png"] - -You can edit records displayed in the Recently Viewed section of the -drop down menu by clicking the pencil icon. This will direct you to the -Edit View for that record. - -image:19Recently_viewed.png[19Recently_viewed.png,title="19Recently_viewed.png"] - -There is also a grouped tab navigation structure for SuiteCRM. Users can -set this option in their user preferences. For full details on modifying -user preferences, see the link:#Managing_User_Accounts[Managing User -Accounts] section of this user guide. - -image:20.png[20.png,title="20.png"] - -The grouped tab navigation menu gives the user the ability to group -modules within a tab such as the Sales Tab. - -image:21Grouped_tab.png[21Grouped_tab.png,title="21Grouped_tab.png"] - -[[quick-create]] -Quick Create -^^^^^^^^^^^^ - -You can click the 'create' icon in the top navigation menu to access the -Quick Create options. This is a list of commonly used modules with the -ability to create new records within these modules from any location. - -image:22Quick_create.png[22Quick_create.png,title="22Quick_create.png"] - -[[sidebar]] -Sidebar -^^^^^^^ - -The sidebar is part of the responsive theme and is a user configurable -option. The sidebar can be expanded and collapsed by clicking on the -button highlighted below. - -image:23Sidebar.png[23Sidebar.png,title="23Sidebar.png"] - -*Actions* - -This displays the Actions for the module you are currently viewing. For -example, if you are viewing the Accounts module, the actions that -display are: Create Account, View Accounts, Import Accounts. This -provides you with one-click access to module actions. - -*Recently Viewed* - -This section displays the last 10 records you have viewed. This leaves a -breadcrumbs trail so that previously viewed records can be quickly and -easily accessed via the sidebar. There is also the option to click the -pencil icon, which will take you directly to the Edit View of the -record. - -[[home-page]] -Home Page -~~~~~~~~~ - -The home page is the first page that is displayed to you -post-authentication. The home page has various elements that can be used -and configured such as Dashlets, Dashboards and the Sidebar. - -[[dashlets]] -Dashlets -^^^^^^^^ - -Dashlets are user-configurable sections displayed on the home page that -give you a quick overview of your records and activity immediately after -login. This is particularly useful for sales and support led teams as -this reduces the number of clicks required to view/modify data. - -Dashlets can be dragged/dropped within the home page. You can add -dashlets by clicking the 'Add Dashlets' link on the home page. - -image:24Add_dashlets.png[24Add_dashlets.png,title="24Add_dashlets.png"] - -Clicking on the 'Add Dashlets' link on the home page will open up the -Add Dashlets popup which allows users to select from a multitude of out -of the box dashlets. - -image:25Add_dashlets.png[25Add_dashlets.png,title="25Add_dashlets.png"] - -To add one of the dashlets, simply click on the dashlet link. This will -add the dashlet to the user home page. The popup will remain if you add -a dashlet, to allow users to add multiple dashlets. Once you have added -your required dashlets, you can close the popup. - -image:26Dashlet.png[26Dashlet.png,title="26Dashlet.png"] - -You can modify dashlets by clicking the pencil icon on the desired -dashlet. - -image:27Modify_dashlet.png[27Modify_dashlet.png,title="27Modify_dashlet.png"] - -Clicking the pencil icon will display a popup. This popup will contain -all of the options that are configurable for the dashlet. - -image:28Configure_dashlet.png[28Configure_dashlet.png,title="28Configure_dashlet.png"] - -Once you have made the required changes in the dashlet configuration -popup, you can click 'Save' to apply the changes, or cancel if you wish -to revert to the current configuration. - -_Note: Some dashlets require the home page to be reloaded. For dashlets -that require this, you will be notified._ - -[[dashboards]] -Dashboards -^^^^^^^^^^ - -Dashboards are new in SuiteCRM. These are configurable per user and can -be added/removed similar to dashlets. To add a dashboard tab, you can -click the 'Add Tab' link on the homepage. - -image:29Add_tab.png[29Add_tab.png,title="29Add_tab.png"] - -Clicking on the 'Add Tab' link on the home page will open up the Add Tab -popup which allows users to specify a name for the tab and also how many -dashlet columns are required. You can opt for one, two or three columns. - -image:192Add_tab.png[192Add_tab.png,title="192Add_tab.png"] - -Once you have specified the details for the dashboard tab, you can click -'Save'. You can also click 'Cancel' to undo any changes. Once you have -saved your changes, the Dashboard Tab will be added and will display on -the tab list on user Homepage. You can then add Dashlets to your new -dashboard tab. - -image:31New_tab.png[31New_tab.png,title="31New_tab.png"] - -If you wish to delete the dashboard tab, you can click the 'x' icon. -This will prompt you to confirm the deletion and then subsequently -remove the dashboard tab from your profile only. Note: 'Suite Dashboard' -is the standard dashboard tab which cannot be removed. You can however -configure the dashlets that display on that dashboard tab. - -[[activity-stream]] -Activity Stream -^^^^^^^^^^^^^^^ - -The Activity Stream is an excellent way of keeping track of your -colleague's interactions with SuiteCRM. By default the Activity Stream -displays recent updates for the Opportunities, Contacts, Leads and Cases -modules. Your organisation's Facebook and Twitter feeds can also be -included in your Activity Steam dashlets if desired and this can be -configurable by an Admin user. - -image:32Activity_stream.png[32Activity_stream.png,title="32Activity_stream.png"] - -You can also comment about an update within the Activity Stream by -clicking on the Reply button on the right side of the post. - -image:33Reply.png[33Reply.png,title="33Reply.png"] - -Your posts can also be deleted from the Activity Stream by clicking on -the Delete button. - -image:34Delet3.png[34Delet3.png,title="34Delet3.png"] - -Your comment will appear under the original post and will also be -timestamped. - -The Activity Stream is also a useful tool for internal messaging within -your organisation, it is possible to send a message that will be -broadcast to all users in your network. To do this type your message in -the text field and click post. - -image:35Activity_post.png[35Activity_post.png,title="35Activity_post.png"] - -Your colleagues will see this message and will be able to respond by -clicking on the Reply button on the right side of the post. - -image:36Reply.png[36Reply.png,title="36Reply.png"] - -Their response will appear under your post, again with a timestamp. - -image:37Reply_view.png[37Reply_view.png,title="37Reply_view.png"] - -[[search]] -Search -~~~~~~ - -Searching is a vital aspect within the CRM as this allows you to quickly -define what it is you want to see. Many CRM's will have large data sets -so it is vital to you that you have a way to refine your search. In the -following sub-sections we will cover the various searching options -available to you. - -[[global-search]] -Global Search -^^^^^^^^^^^^^ - -You can search all records within the CRM using the global search -functionality. You can search for records via global search by using the -search bar in the main navigation menu. - -image:38Search.png[38Search.png,title="38Search.png"] - -Once you have entered your search term, you can press the return key or -click the magnifying glass/search icon. This will return records that -match the search criteria and categorise them by the modules available. - -image:39Search.png[39Search.png,title="39Search.png"] - -Modules can be added to the global search functionality by the System -Administrator. - -[[full-text-search]] -Full Text Search -^^^^^^^^^^^^^^^^ - -SuiteCRM has an option to enable or disable a full text global search. -The full text global search is powered by -http://framework.zend.com/manual/1.12/en/zend.search.lucene.overview.html[Zend -Lucene] search framework. The search works very similar to the standard -global search, but provides the enhanced functionality of searching text -in documents and other files, compared to the record-level search -provided by the standard global search. - -_Note: System Administrators can enable/disable the full text search by -clicking on the AOD Settings link within the admin panel._ - -image:169AOD_Settings.png[169AOD_Settings.png,title="169AOD_Settings.png"] - -This will display the AOD option to enable/disable the full text search. - -image:170Enable_AOD.png[170Enable_AOD.png,title="170Enable_AOD.png"] - -The search returns results slightly different to global search. Results -are returned in order of score. Records are scored dependent on how well -you match the search criteria provided by you – from 0-100%. - -image:171Search_results.png[171Search_results.png,title="171Search_results.png"] - -[[basic-module-search]] -Basic Module Search -^^^^^^^^^^^^^^^^^^^ - -Basic search is available on all modules within the CRM. Basic search, -as standard, allows users to search on the record name. - -image:193Search_button.png[193Search_button.png,title="193Search_button.png"] - -image:194Search_box.png[194Search_box.png,title="fig:194Search_box.png"]]] - -Basic search also allows users to check the 'My Items' check box. -Enabling this option will only return records that are assigned to you. - -image:195Search_my_items.png[195Search_my_items.png,title="195Search_my_items.png"] - -Once a user has searched for a record, the search will be saved. This -means that you can navigate to records and other modules within the CRM -but the search will not be cleared. If you wish to clear your search, -you can click 'Clear' and then click 'Search'. This will clear any saved -searches and return to the default result set for that module. - -_Note: System Administrators can modify which fields are searchable in -Basic Search within Studio._ - -[[advanced-module-search]] -Advanced Module Search -^^^^^^^^^^^^^^^^^^^^^^ - -Advanced Search is available on all modules within the CRM. Advanced -Search provides you with a more detailed module search functionality. As -standard, there are more fields available to you via Advanced Search. - -image:196Advanced_search.png[196Advanced_search.png,title="196Advanced_search.png"] - -You can add further fields to the Advanced Search section by expanding -the 'Layout Options' panel. - -image:image43.png[image43.png,title="image43.png"] - -You can click the field you wish to display/hide and click the arrows to -move these fields between sections. This allows users to display/hide -columns to further customise the Advanced Search section. - -Advanced Searches may have many fields and specific criteria. For this -reason, You can save your advanced search criteria to easily populate -this in future. - -image:197Save_search.png[197Save_search.png,title="197Save_search.png"] - -To load a saved search, you can select the saved search from the 'My -Filters' drop down. This will return results that match the criteria -specified in the saved search. - -image:198Saved_search.png[198Saved_search.png,title="198Saved_search.png"] - -_Note: System Administrators can modify which fields are searchable in -Advanced Search within Studio._ - -[[views]] -Views -~~~~~ - -Within the CRM you will be presented with various views. These views are -structured to present you with key information through the record -management process. There are three main views: - -* List View -* Detail View -* Edit View - -All of these views have specific purposes and these are described in the -sub-sections below. - -[[list-view]] -List View -^^^^^^^^^ - -This is the view that you are presented with when you navigate to your -desired module. - -image:40List_view.png[40List_view.png,title="40List_view.png"] - -The List View compromises of many actions that you can carry out to -manage records. These are: - -* Search Records – provides you with the ability to perform basic and -advanced searches, as covered previously in the link:#Search[Search] -section of this chapter. -* Sort Records – clicking on the column name will sort the record list -by that column either ascending or descending, if sorting is enabled. -* View Records – clicking on any hyperlinked data will take you to the -Detail View of the record. -* Edit Records – clicking the pencil icon will navigate you to the Edit -View for that record. -* Delete Records – you can select records and then select the delete -option to delete records from the module. -* Mass Update Records – you can select records and then select the mass -update option to update data on all selected records. -* Merge Records – you can select records and select the merge option. -This will begin the merge records processes. You can select a primary -record and then can merge the data from the duplicate records into the -primary record. Once saved, the duplicate records will be deleted and -all data/history merged to the primary record. - -[[detail-view]] -Detail View -^^^^^^^^^^^ - -This is the view that you are presented with when you view a record. - -image:41Detail_view.png[41Detail_view.png,title="41Detail_view.png"] - -The Detail View compromises of many actions that you can use to -view/manage your data. These are specific to the Detail View of the -module that you are viewing. There are standard actions on the Detail -View for most modules. These are: - -* Edit – allows you to edit the record you are viewing. -* Duplicate – allows you to duplicate the record the are viewing. -* Delete – allows you to delete the record you are viewing. If a record -is deleted, you will be redirected to the List View. -* Find Duplicates – allows you to begin the find duplicates process -where you can use system functionality to find duplicate records. -* View Change Log – allows you to view changes to audited fields. - -_Note: To set fields as audited and for any changes to find duplicates, -contact your System Administrator._ - -Hyperlinked fields can be clicked on. This will navigate you to that -record. - -The Detail View is tabbed in SuiteCRM. This means there is minimal -scrolling and data is categorised for each module in the appropriate -tab. - -_Note: System Administrators can select to display data in either tabs -or panels. You can contact your system administrator for more -information on managing layouts and views._ - -[[edit-view]] -Edit View -^^^^^^^^^ - -This is the view that you are presented with when you edit a record. - -image:42Edit_view.png[42Edit_view.png,title="42Edit_view.png"] - -The Edit View allows you to modify record information that is displayed -on the view. This allows users to update existing data and also -add/remove data. Once you have made changes on the Edit View, you can -click 'Save' to apply to changes or click 'Cancel'. Clicking either -options will redirect you to the Detail View of the record you are -editing. You can click the 'View Change Log' button. This allows users -to view changes to audited fields which can be useful before making your -intended changes. - -[[record-management]] -Record Management -~~~~~~~~~~~~~~~~~ - -We have covered the several views that you are presented with so we will -now move onto record management. In this section we will cover all areas -of record management so that you can efficiently store and manage -customer data. - -[[creating-records]] -Creating Records -^^^^^^^^^^^^^^^^ - -You can create records within modules from various different areas of -your Interface. Detailed below are screen shots of record creation -points. - -image:43Create_record1.png[43Create_record1.png,title="43Create_record1.png"] - -image:44Create_record2.png[44Create_record2.png,title="44Create_record2.png"] - -image:45Create_record_3.png[45Create_record_3.png,title="45Create_record_3.png"] - -Once you click the create button, you will be taken to the creation -screen. This is essentially the Edit View that we have covered -previously in the link:#User_Interface[User Interface] section. This -allows you to fill in the appropriate data for that record. Fields with -the red star(*) are required fields. Validation is performed so that a -record cannot be saved within the CRM unless data is valid for required -fields. - -image:46Create_contact.png[46Create_contact.png,title="46Create_contact.png"] - -Once you have populated all data for the record, you can save the record -which will create the record within the module in the CRM. Once saved, -you will be redirected to the Detail View of the record you have -created. - -[[editing-records]] -Editing Records -^^^^^^^^^^^^^^^ - -You can edit records within modules from various different areas of your -Interface. Detailed below are screen shots of record editing points. - -image:47Edit_contact.png[47Edit_contact.png,title="47Edit_contact.png"] - -image:48Edit_contact.png[48Edit_contact.png,title="48Edit_contact.png"] - -Once you click the edit button(or pencil), you will be taken to the Edit -View. This allows you to edit/populate the appropriate data for that -record. Fields with the red star(*) are required fields. Validation is -performed so that a record cannot be saved within the CRM unless data is -valid for required fields. - -Once you have edited/populated the record data, you can save the record -which will update the existing record with the new data populated when -editing. Once saved, you will be redirected to the Detail View of the -record you have edited. - -[[deleting-records]] -Deleting Records -^^^^^^^^^^^^^^^^ - -You can delete records within modules from both the List View and Detail -View. Detailed below are screen shots of record editing points: - -*Detail View Deletion method* - -Deleting records from the Detail View is a simple process. You simply -have to click the 'Delete' button. - -image:49Delete_contact.png[49Delete_contact.png,title="49Delete_contact.png"] - -When you click the delete button on a record, you will receive a popup -which will ask you to confirm that you want to delete the record. - -image:50Delete_contact.png[50Delete_contact.png,title="50Delete_contact.png"] - -You can either click Cancel or OK. Clicking Cancel will revert you back -to the Detail View of the record and will not delete it. Clicking OK -will action the record deletion. If you choose to delete the record, the -record will be deleted and you will be redirected to the module List -View. - -*List View Deletion method* - -To delete records from the List View, you can select records using the -checkbox option on the left hand side of the view. It is possible to -select single records or use the 'Select this Page' or 'Select All' -options, to select all records from the page or all records within the -module. - -image:51ListView_deletion.png[51ListView_deletion.png,title="51ListView_deletion.png"] - -Once the records are selected to delete, you can click the 'Delete' -button. When you click the delete button on a record, you will receive a -popup which will display the number of records being deleted and ask you -to confirm that you want to delete the record. - -image:image59.png[image59.png,title="image59.png"] - -You can either click Cancel or OK. Clicking Cancel will revert you back -to the Detail View of the record and will not delete it. Clicking OK -will action the record deletion. If you choose to delete the record, the -record will be deleted and you will be redirected to the module List -View. - -[[mass-updating-records]] -Mass Updating Records -^^^^^^^^^^^^^^^^^^^^^ - -You can mass update records from the List View of any module, given this -option is made available to you. To mass update records, you have to -check the records in the List View and then select the 'Mass Update' -option from the dropdown menu (next to the delete link). - -image:52Mass_update_records.png[52Mass_update_records.png,title="52Mass_update_records.png"] - -Clicking the mass update option will display a screen at the bottom of -the List View. This will list all fields that can be mass updated by -you. - -image:53Mass_update.png[53Mass_update.png,title="53Mass_update.png"] - -Once you have populated the fields you wish to mass update, you can -either click 'Update' or 'Cancel'. Cancelling the mass update will -cancel any changes and redirect you to the List View of the module. -Clicking update will update all selected records with the changes -specified in the link:#Mass_Updating_Records[Mass Updating Records] -section. - -image:54Mass_update.png[54Mass_update.png,title="54Mass_update.png"] - -[[merging-records]] -Merging Records -^^^^^^^^^^^^^^^ - -You can merge records from the List View of any module, given this -option is made available to you, or via the Detail View if you follow -the 'Find Duplicates' process. - -To merge records, you have to check the records in the List View and -then select the 'Merge' option from the dropdown menu (next to the -delete link). - -image:55Merge.png[55Merge.png,title="55Merge.png"] - -Once you have clicked on the 'Merge' option, you will be presented with -a merge screen. This will show the primary record and the duplicates -that you wish to merge with that primary record. - -image:182Merging_records.png[182Merging_records.png,title="182Merging_records.png"] - -You can select which record is primary using the 'Set as primary' button -on the right of the merge view. You can move data from the duplicate -records to the primary record using the '<<' buttons. In this example, -we have moved the First Name and Last Name from the duplicate record to -the primary record. - -image:183Merging_records.png[183Merging_records.png,title="183Merging_records.png"] - -Once you have made the required changes on the merge screen, you can -click 'Save Merge' or 'Cancel'. Clicking cancel will discard the merge -changes and will revert you to the List View for that module. Clicking -'Save Merge' will continue the Merge process and will prompt you to -inform you that the duplicate record will be deleted. - -image:184Save_merge.png[184Save_merge.png,title="184Save_merge.png"] - -You can click 'OK' or 'Cancel'. Clicking Cancel will discard the merge -changes and will revert you to the List View for that module. Clicking -'OK' will save the merge and will redirect you to the Detail View for -the merged record. - -image:185Saved_merge.png[185Saved_merge.png,title="185Saved_merge.png"] - -As can be seen from the example, the merge has completed successfully. -The First Name and Last Name have been updated, and all other data has -been retained. - -[[importing-records]] -Importing Records -^^^^^^^^^^^^^^^^^ - -It is possible to import data easily by using SuiteCRM's easy-to-use -User Import Wizard. There are many hints and tips as you progress -through the Import Wizard on the requirements of importing data and for -further steps in the Wizard. - -*User Import Wizard features* - -There are many features of the Import Wizard which make it easier for -you to map data to CRM fields and also for future imports. These are: - -* Sample .csv file for easier import of data — Use the available sample -.csv file as a template for import of files -* Retain settings from previous imports — Save/preserve import file -properties, mappings, and duplicate check indexes from previous imports -for ease of current data import process -* Ability to accept both database name and display labels of drop-down -and multi-select field items — Field labels as well as database names -are accepted and mapped during import, but only the field labels are -displayed for ease of use -* Ability to accept both usernames and full names in user fields during -import and export of data — Full names of Users displayed for Assigned -To and other User-related fields in exported .csv file for easier -identification of user records -* Ability to auto-detect file properties in import file — Upload import -files without specifying file properties such as tab, comma, double and -single quotes, date and time formats, making the process simpler and -faster -* Ability to import contacts from external sources such as Google — -Ability to import Google Contacts for person-type modules such as -Contacts, Leads, and Targets, relate SuiteCRM records to Google -Contacts, and communicate with Google Contacts from within SuiteCRM - -*Steps to Import data* - -_Note: Always import the Account data first and then import Contacts and -other data related to Accounts (such as Meetings, Calls, Notes) to -automatically create a relationship between the imported Account and -Contacts and activity records related to the Account._ - -Follow the steps listed below to import data for a module, such as -Accounts: - -1. Select Import from the Actions drop-down list in the module menu -options. -2. This displays Step 1 of the import process with a link to a sample -Import File Template. -3. Upload your import file to this page using the Browse button in the -Select File field or, -4. Optionally, download the available template, delete the existing -data, input your data and upload to this page using the Browse button. -5. Click Next. -6. This displays Step 2 (Confirm Import File Properties). -7. Auto-detection of imported data takes place at this step. -8. Click View Import File Properties button to verify and change the -data as needed, if you notice irregularities in the Confirm Import File -Properties table. -9. Click the Hide Import File Properties to collapse the panel. -10. Click Next. -11. This displays Step 3: Confirm Field Mappings. -12. The table in this page displays all the fields in the module that -can be mapped to the data in the import file. If the file contains a -header row, the columns in the file map to matching fields. -13. Check for correct mapping and modify if necessary. -14. Map to all of the required fields (indicated by an asterisk). -15. Click Next. -16. This displays Step 4: Check for Possible Duplicates. -17. Follow the instructions on this page. -18. Step 4 also provides the option of saving the current import file -properties, mappings, and duplicate check indexes for future imports. -19. (Optionally) Save the import settings. -20. Click Import Now. -21. Click the Errors tab to check for errors in the process. Follow the -instructions to fix problems (if any) and Click Import Again. -22. This displays Step 1 of the import process. -23. Follow all the steps in the wizard through Step 5. -24. If the import was successful, you can to view all the imported -records at Step 5. -25. Click Undo Import if you are not satisfied with the imported -records, -26. Or, click Import Again to import more data -27. Or, click Exit to navigate to the List View page of the module that -you imported your records into. - -[[exporting-records]] -Exporting Records -^^^^^^^^^^^^^^^^^ - -You can export SuiteCRM records in .csv format. When you exports records -from the CRM, you will be provided with the .csv file to download when -the export has finished executing. You can save and open this file in -applications such as Libre Office Calc or Microsoft Office Excel. - -The .csv file displays in a tabular format with columns and rows. When -data is exported from the CRM, the record ID is included with all other -fields that are specified in the export list for that module. You can -then use the record ID as a reference for performing a 'Create new -records and update existing records' import, as detailed in the -link:#Importing_Records[Importing Records] section of the user guide. - -_Note: When exporting values from drop-down lists, SuiteCRM exports the -ID associated with each option and not the display labels. For example, -if a drop down list has options labelled High, Medium and Low with an ID -of 1, 2 and 3 – the .csv file will show the drop down options as 1, 2 or -3._ - -*Steps to Export Records* - -1. Select the records from the List View on the module's home page. -2. Select Export from the Actions drop-down menu in the List View. -3. To export all records listed on the page, click Select located above -the item list and select one of the following options: -4. This Page. To export all the records listed on the page, select this -option. -5. All Records. To export all records on the list (if it is more than a -page long), select this option. -6. This displays an Opening.csv dialog box. -7. Select Open to open the export file in .csv format or select Save to -Disk to save the .csv file to your local machine. -8. Click OK to execute the operation. If you chose to open the file, -the csv file opens in Microsoft Excel. -9. The file contains all the fields in the module from which you are -exporting the data. - -[[in-line-editing]] -In-line Editing -~~~~~~~~~~~~~~~ - -In-line editing gives you the ability to change values “on the fly”. -In-line editing has been implemented on both List View and Detail View, -providing an advantage to users wishing to change field values quickly, -reducing the number of clicks/processes that would normally be taken to -edit the full record. - -_Note: In-line editing can be enabled/disabled for both List View and -Detail View. This can be done in the main System Settings for the CRM, -by the System Administrator._ - -image:186In-line_editing.png[186In-line_editing.png,title="186In-line_editing.png"] - -[[list-view-in-line-editing]] -List View In-line Editing -^^^^^^^^^^^^^^^^^^^^^^^^^ - -You can edit record information on the List View of a module using -in-line editing by clicking on a field where the pencil icon is shown. - -image:60ListView_editing.png[60ListView_editing.png,title="60ListView_editing.png"] - -You can either click on the pencil icon, or double click on the field to -edit the value. - -image:61ListView_editing.png[61ListView_editing.png,title="61ListView_editing.png"] - -Once you have made the required change to the field value, you can -either press Return or click on the 'tick'. This will save your changes. -If you navigate away without making any changes, you will see a prompt -warning you that you have made unsaved changes to the field being -edited. - -image:image71.png[image71.png,title="image71.png"] - -You can either click cancel and continue editing and saving your change, -or you can click OK which will discard the changes made. - -[[detail-view-in-line-editing]] -Detail View In-line Editing -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Similar to List View, you can edit record information on the Detail View -of a module using in-line editing by clicking on a field where the -pencil icon is shown. - -image:62DetailView_Editing.png[62DetailView_Editing.png,title="62DetailView_Editing.png"] - -You can either click on the pencil icon, or double click on the field to -edit the value. - -image:63DetailView_editing.png[63DetailView_editing.png,title="63DetailView_editing.png"] - -Once you have made the required change to the field value, you can -either press Return or click on the 'tick'. This will save user changes. -If you navigate away without making any changes, you will see a prompt -warning you that you have made unsaved changes to the field being -edited. - -image:image74.png[image74.png,title="image74.png"] - -You can either click cancel and continue editing and saving your change, -or you can click OK which will discard the changes made. - -[[desktop-notifications]] -Desktop Notifications -~~~~~~~~~~~~~~~~~~~~~ - -[[enabling-desktop-notifications]] -Enabling Desktop Notifications -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You can enable desktop notifications by accessing the 'Advanced' tab -within your user preferences. This will enable desktop notifications -only for that browser on that computer. you can choose to enable the -desktop notifications just for that browser session, or to always enable -desktop notifications. - -_Note: Users will have to enable desktop notifications on all browsers -and computers if you use more than one._ - -image:199Enable_desktop_notifications.png[199Enable_desktop_notifications.png,title="199Enable_desktop_notifications.png"] - -Once desktop notifications have been enabled, users will receive -notifications for any Calendar events such as: - -* Meetings – Meetings you have been invited to that have popup reminders -set. -* Calls – Calls you have been invited to that have popup reminders set. - -[[managing-desktop-notifications]] -Managing Desktop Notifications -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -If you have no notifications, the notification count will show '0' to -tell you you currently have no notifications to check. - -image:65Managing_notifications.png[65Managing_notifications.png,title="65Managing_notifications.png"] - -If you do not click on a desktop notification when it is displayed in -the browser, for example you are AFK(Away From Keyboard) your -notifications will be added to the notification list which shows as a -count on the main navigation bar. - -image:66Managing_notifications.png[66Managing_notifications.png,title="66Managing_notifications.png"] - -You can manage your desktop notifications by clicking the icon which -will show any existing notifications. - -image:67Managing_notifications.png[67Managing_notifications.png,title="67Managing_notifications.png"] - -You can either click the notification which will take you to the record -the notification is related to or you can click the small 'x' icon to -clear you immediately. - -[[summary-3]] -Summary -~~~~~~~ - -In this chapter, we covered all elements of the SuiteCRM user interface. -There are many elements which you can use to optimise your navigation -and data management, to increase productivity. - -In the next chapter, we will look at modules. Modules are the data -entities within SuiteCRM which can be standalone, or related to one or -many other modules. Each module has a different function but many -modules work together to structure and automate day to day business -processes. - -[[core-modules]] -Core Modules ------------- - -[[accounts]] -Accounts -~~~~~~~~ - -The Accounts module is the centralised base from which you can create an -association with most records in SuiteCRM. It is possible to create a -relationship with Contacts, Converted Leads, Opportunities, any Activity -such as Emails or Meetings and Cases. Accounts in SuiteCRM will -typically hold all information specific to a company that your -organisation will have a relationship with. In real world terms an -Account may be a business entity that is a qualified Sales Prospect, -Customer, Supplier or Re-seller and can be used to track all -interactions that take place between these entities and your -organisation. - -[[accounts-actions]] -Accounts Actions -^^^^^^^^^^^^^^^^ - -You can access the accounts actions from the Accounts module menu drop -down or via the Sidebar. The Accounts actions are as follows: - -* Create Account – Once clicked, a new form is opened in Edit View to -allow you to create a new Account record. -* View Accounts – Once clicked, you will be redirected to the List View -for the Accounts module. This allows you to search and list Accounts -records. -* Import Accounts – Redirects you to the Import Wizard for the Accounts -module. For more information, see link:#Importing_Records[Importing -Records]. - -To view the full list of fields available when creating an Account, See -link:#Accounts_Field_List[Accounts Field List]. - -[[managing-accounts]] -Managing Accounts -^^^^^^^^^^^^^^^^^ - -* To sort records on the Accounts List View, click any column title -which is sortable. This will sort the column either ascending or -descending. -* To search for a Account, see the link:#Search[Search] section of this -user guide. -* To update some or all the Accounts on the List View, use the Mass -Update panel as described in the link:#Mass_Updating_Records[Mass -Updating Records] section of this user guide. -* To duplicate a Account, you can click the Duplicate button on the -Detail View and then save the duplicate record. -* To merge duplicate Accounts, select the records from the Accounts List -View, click the Merge link in the Actions drop-down list, and progress -through the merge process. For more information on Merging Duplicates, -see the link:#Merging_Records[Merging Records] section of this user -guide. -* To delete one or multiple Accounts, you can select multiple records -from the List View and click delete. you can also delete a Account from -the Detail View by clicking the Delete button. For a more detailed guide -on deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Account, click the Account Name in the List -View. This will open the record in Detail View. -* To edit the Account details, click Edit icon within the List View or -click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Accounts, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Account record, you can -click the View Change Log button on the Account's Detail View or Edit -View. - -[[contacts]] -Contacts -~~~~~~~~ - -In SuiteCRM a Contact is an individual who is typically associated with -an Account (organisation) or Opportunity (qualified prospect). For -example if Techco is the Account, then John Smith, Sales Manager of -Techco is the Contact. This module holds all information relating to -these individuals and also provides a vantage point for any history -relating to a Contact record, for example if they were involved in a -Meeting, raised a Case or sent an Email. - -[[contacts-actions]] -Contacts Actions -^^^^^^^^^^^^^^^^ - -You can access the Contacts actions from the Contacts module menu drop -down or via the Sidebar. The Contacts actions are as follows: - -* Create Contact – A new form is opened in Edit View to allow you to -create a new Contact record. -* View Contacts – Redirects you to the List View for the Contacts -module. This allows you to search and list Contact records. -* Import Contacts – Redirects you to the Import Wizard for the Contacts -module. For more information, see link:#Importing_Records[Importing -Records]. - -To view the full list of fields available when creating an Contact, See -link:#Contacts_Field_List[ Contacts Field List]. - -[[managing-contacts]] -Managing Contacts -^^^^^^^^^^^^^^^^^ - -* To sort records on the Contacts List View, click any column title -which is sortable. This will sort the column either ascending or -descending. -* To search for a Contact, see the link:#Search[Search] section of this -user guide. -* To update some or all the Contacts on the List View, use the Mass -Update panel as described in the link:#Mass_Updating_Records[Mass -Updating Records] section of this user guide. -* To duplicate a Contact, you can click the Duplicate button on the -Detail View and then save the duplicate record. -* To merge duplicate Contacts, select the records from the Contacts List -View, click the Merge link in the Actions drop-down list, and progress -through the merge process. For more information on Merging Duplicates, -see the link:#Merging_Records[Merging Records] section of this user -guide. -* To delete one or multiple Contacts, you can select multiple records -from the List View and click delete. You can also delete a Contact from -the Detail View by clicking the Delete button. For a more detailed guide -on deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Contact, click the Contact Name in the List -View. This will open the record in Detail View. -* To edit the Contact details, click Edit icon within the List View or -click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Contacts, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Contact record, you can -click the View Change Log button on the Contact's Detail View or Edit -View. - -[[opportunities]] -Opportunities -~~~~~~~~~~~~~ - -An Opportunity is a qualified Sales prospect with a likely chance that -they will be able to do business with your company. You have established -that they have buying power and have entered into the buying cycle. This -module allows you to track your Opportunities throughout the Sales -Pipeline until the deal is 'Closed Lost or 'Closed Won'. - -[[opportunities-actions]] -Opportunities Actions -^^^^^^^^^^^^^^^^^^^^^ - -You can access the Opportunities actions from the Opportunities module -menu drop down or via the Sidebar. The Opportunities actions are as -follows: - -* Create Opportunity – A new form is opened in Edit View to allow you to -create a new Account record. -* View Opportunities – Redirects you to the List View for the -Opportunities module. This allows you to search and list Opportunity -records. -* Import Opportunities – Redirects you to the Import Wizard for the -Opportunities module. For more information, see -link:#Importing_Records[Importing Records]. - -To view the full list of fields available when creating an Opportunity, -See link:#Opportunities_Field_List[Opportunities Field List]. - -[[managing-opportunities]] -Managing Opportunities -^^^^^^^^^^^^^^^^^^^^^^ - -* To sort records on the Opportunities List View, click any column title -which is sortable. This will sort the column either ascending or -descending. -* To search for a Opportunity, see the link:#Search[Search] section of -this user guide. -* To update some or all the Opportunities on the List View, use the Mass -Update panel as described in the link:#Mass_Updating_Records[Mass -Updating Records] section of this user guide. -* To duplicate a Opportunity, you can click the Duplicate button on the -Detail View and then save the duplicate record. -* To merge duplicate Opportunities, select the records from the -Opportunities List View, click the Merge link in the Actions drop-down -list, and progress through the merge process. For more information on -Merging Duplicates, see the link:#Merging_Records[Merging Records] -section of this user guide. -* To delete one or multiple Opportunities, you can select multiple -records from the List View and click delete. You can also delete a -Opportunity from the Detail View by clicking the delete button. For a -more detailed guide on deleting records, see the -link:#Deleting_Records[Deleting Records] section of this user guide. -* To view the details of a Opportunity, click the Opportunity Name in -the List View. This will open the record in Detail View. -* To edit the Opportunity details, click the Edit icon within the List -View or click the edit button on the Detail View, make the necessary -changes, and click Save. -* For a detailed guide on importing and exporting Opportunities, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Opportunity record, you -can click the View Change Log button on the Opportunities Detail View or -Edit View. - -[[leads]] -Leads -~~~~~ - -In SuiteCRM a Lead is an unqualified contact usually generated from some -form of marketing related event, for example it could be a person that -has filled out a form on your website or someone that you met at a trade -show and you are not sure yet if they have buying authority. Once a Lead -is qualified and converted then it can be split into three parts; a -Contact once you have established 'Who' it is, an Account when you know -'Where' they work and an Opportunity once it is known 'What' they might -buy. - -[[leads-actions]] -Leads Actions -^^^^^^^^^^^^^ - -You can access the Leads actions from the Leads module menu drop down or -via the Sidebar. The Leads actions are as follows: - -* Create Lead – A new form is opened in Edit View to allow you to create -a new Account record. -* View Leads – Redirects you to the List View for the Leads module. This -allows you to search and list Lead records. -* Import Leads – Redirects you to the Import Wizard for the Leads -module. For more information, see link:#Importing_Records[Importing -Records]. - -To view the full list of fields available when creating a Lead, See -link:#Leads_Field_List[Leads Field List]. - -[[managing-leads]] -Managing Leads -^^^^^^^^^^^^^^ - -* To sort records on the Leads List View, click any column title which -is sortable. This will sort the column either ascending or descending. -* To search for a Leads, see the link:#Search[Search] section of this -user guide. -* To update some or all the Leads on the List View, use the Mass Update -panel as described in the link:#Mass_Updating_Records[Mass Updating -Records] section of this user guide. -* To duplicate a Lead, you can click the Duplicate button on the Detail -View and then save the duplicate record. -* To merge duplicate Leads, select the records from the Leads List View, -click the Merge link in the Actions drop-down list, and progress through -the merge process. For more information on Merging Duplicates, see the -link:#Merging_Records[Merging Records] section of this user guide. -* To delete one or multiple Leads, you can select multiple records from -the List View and click delete. you can also delete a Lead from the -Detail View by clicking the Delete button. For a more detailed guide on -deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Lead, click the Lead Name in the List View. -This will open the record in Detail View. -* To edit the Lead details, click Edit icon within the List View or -click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Leads, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Lead record, you can -click the View Change Log button on the Lead Detail View or Edit View. - -[[converting-a-lead]] -Converting a Lead -^^^^^^^^^^^^^^^^^ - -Once enough information is gathered about a Lead, then the Lead can be -progressed to the next Sales stage and the Lead can be converted into a -Contact, Account and Opportunity. The way in which a Lead is converted -depends on how the System Administrator has set up SuiteCRM. To convert -a Lead with the default SuiteCRM setup you have to click on an -individual Lead record to access the Detail View of the Lead and click -on the arrow next to the Other button, then click on 'Convert Lead' from -the drop-down menu shown in the image below: - -image:68Converting_a_lead.png[68Converting_a_lead.png,title="68Converting_a_lead.png"] - -Once you have clicked on 'Convert Lead' button then you will be taken to -the Convert Lead page. - -[[convert-lead-to-contact]] -Convert Lead to Contact -^^^^^^^^^^^^^^^^^^^^^^^ - -On this page you will be able to Create or Select Contact: - -image:69Convert_lead_to_contact.png[69Convert_lead_to_contact.png,title="69Convert_lead_to_contact.png"] - -By deselecting the checkbox next to 'Create Contact' you will be able to -associate the Lead to an existing Contact. However, in most cases when -converting a Lead there will be no existing Contact. Make sure the -Create Contact checkbox is selected. Some of the fields will -automatically be populated using the Lead information. Fill out the -remaining relevant fields and move to the next Stage below: - -[[convert-lead-to-account]] -Convert Lead to Account -^^^^^^^^^^^^^^^^^^^^^^^ - -image:70Convert_lead_to_account.png[70Convert_lead_to_account.png,title="70Convert_lead_to_account.png"] - -To create an Account from a converted Lead you will follow the same -process as with a Contact, some information will populate from the Lead -automatically, just complete the rest. - -[[convert-lead-to-opportunity]] -Convert Lead to Opportunity -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -image:71Convert_lead_to_opportunity.png[71Convert_lead_to_opportunity.png,title="71Convert_lead_to_opportunity.png"] - -To create an Opportunity from a converted Lead you will follow the same -process as with a Contact, some information will populate from the Lead -automatically, just complete the rest. - -[[other-lead-conversion-options]] -Other Lead Conversion Options -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Other records can be created when converting a Lead in the same way as -Contacts/Accounts and Opportunities. - -image:72Convert_lead_options.png[72Convert_lead_options.png,title="72Convert_lead_options.png"] - -After you have completed the relevant sections click the Save button to -confirm the changes. - -[[duplicate-record-check]] -Duplicate Record Check -^^^^^^^^^^^^^^^^^^^^^^ - -When converting a Lead SuiteCRM will automatically check for any -duplicate records and will return a warning if a matching record is -found. - -image:73Duplicate_record_check.png[73Duplicate_record_check.png,title="73Duplicate_record_check.png"] - -If you find that the duplicate warning is not valid and you still wish -to create a new record, then click the Create button. Otherwise if you -decide that the warning is correct and the record does already exist in -the CRM then you should click on the Select button. - -[[calendar]] -Calendar -~~~~~~~~ - -The Calendar module in SuiteCRM allows you to manage your time by -scheduling Meetings, Calls and Tasks. Users may share their Calendar so -they can allow others to view their upcoming activities. These -activities will be displayed in the Calendar module given that the User -concerned is a participant or the task has been assigned to them. - -[[calendar-actions]] -Calendar Actions -^^^^^^^^^^^^^^^^ - -You can access the Calendar actions from the Calendar module menu drop -down or via the Sidebar. The Calendar actions are as follows: - -* Schedule Meetings – A new form is opened in the Edit View of the -Meetings module to allow you to create a new Meeting record. This record -will display on the Calendar. -* Schedule Calls – A new form is opened in the Edit View of the Call -module to allow you to create a new Call record. This record will -display on the Calendar. -* Create Task – A new form is opened in the Edit View of the Tasks -module to allow you to create a new Task record. This record will -display on the Calendar. -* Today – Redirects you to the Day format of the Calendar for the -current day. - -[[calls]] -Calls -~~~~~ - -The Calls module in SuiteCRM allows Users to schedule and log a record -of inbound and outbound calls that they may be a participant of. - -[[calls-actions]] -Calls Actions -^^^^^^^^^^^^^ - -You can access the Calls actions from the Calls module menu drop down or -via the Sidebar. The Calls actions are as follows: - -* Log Call – A new form is opened in Edit View to allow you to create a -new Call record. -* View Calls – Redirects you to the List View for the Calls module. This -allows you to search and list Call records. -* Import Calls – Redirects you to the Import Wizard for the Calls -module. For more information, see link:#Importing_Records[Importing -Records]. - -To view the full list of fields available when logging a Call, See -link:#Calls_Field_List[Calls Field List]. - -[[managing-calls]] -Managing Calls -^^^^^^^^^^^^^^ - -* To sort records on the Calls List View, click any column title which -is sortable. This will sort the column either ascending or descending. -* To search for a Call, see the link:#Search[Search] section of this -user guide. -* To update some or all of the Calls on the List View, use the Mass -Update panel as described in the link:#Mass_Updating_Records[Mass -Updating Records] section of this user guide. -* To duplicate a Call, you can click the Duplicate button on the Detail -View and then save the duplicate record. -* To close a Call, click on the 'x' icon on the Calls List View. You can -also close a Call by clicking the Close button on the Detail View of a -Call. You can also click the Close and Create New button. This will -close the Call you are viewing and redirect you to the Edit View to -create a new record. -* To Reschedule a call, you can click the Reschedule button on the -Detail View of a Call. For a detailed guide on rescheduling calls, see -the link:#Reschedule[Reschedule] section of this user guide. -* To delete one or multiple Calls, you can select multiple records from -the List View and click delete. You can also delete a Call from the -Detail View by clicking the Delete button. For a more detailed guide on -deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Call, click the Call Subject in the List -View. This will open the record in Detail View. -* To edit the Call details, click Edit icon within the List View or -click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Calls, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Call record, you can -click the View Change Log button on the Call Detail View or Edit View. - -[[meetings]] -Meetings -~~~~~~~~ - -Like the Calls module, the Meetings module in SuiteCRM allows Users to -create a record of any Meeting that they have been involved in. The -Meeting scheduler allows a User to invite attendees, email invitees, set -reminders, reschedule and relate to other modules including an Account, -Contact, Project and many other Objects. This module has many more -helpful functions that assist the User to plan and organise their -Meetings. - -[[meetings-actions]] -Meetings Actions -^^^^^^^^^^^^^^^^ - -You can access the Meetings actions from the Meetings module menu drop -down or via the Sidebar. The Meetings actions are as follows: - -* Schedule Meeting – A new form is opened in Edit View to allow you to -create a new Meeting record. -* View Meetings – Redirects you to the List View for the Meetings -module. This allows you to search and list Meeting records. -* Import Meetings – Redirects you to the Import Wizard for the Meetings -module. For more information, see link:#Importing_Records[Importing -Records]. - -To view the full list of fields available when creating scheduling a -Meeting, See link:#Meetings_Field_List[Meetings Field List]. - -[[managing-meetings]] -Managing Meetings -^^^^^^^^^^^^^^^^^ - -* To sort records on the Meetings List View, click any column title -which is sortable. This will sort the column either ascending or -descending. -* To search for a Meeting, see the link:#Search[Search] section of this -user guide. -* To update some or all of the Meetings on the List View, use the Mass -Update panel as described in the link:#Mass_Updating_Records[Mass -Updating Records] section of this user guide. -* To duplicate a Meeting, you can click the Duplicate button on the -Detail View and then save the duplicate record. -* To close a Meeting, click on the 'x' icon on the Meetings List View. -You can also close a Meeting by clicking the Close button on the Detail -View of a Meeting. You can also click the Close and Create New button. -This will close the Meeting you are viewing and redirect you to the Edit -View to create a new record. -* To Reschedule a Meeting, you can click the Reschedule button on the -Detail View of a Meeting. For a detailed guide on rescheduling Meetings, -see the link:#Reschedule[Reschedule] section of this user guide. -* To delete one or multiple Meetings, you can select multiple records -from the List View and click delete. You can also delete a Meeting from -the Detail View by clicking the Delete button. For a more detailed guide -on deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Meeting, click the Meeting Subject in the -List View. This will open the record in Detail View. -* To edit the Meeting details, click the Edit icon within the List View -or click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Meeting, see the -Import and Export link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Meeting record, you can -click the View Change Log button on the Meeting's Detail View or Edit -View. - -[[emails]] -Emails -~~~~~~ - -The Emails module in SuiteCRM allows Users to view, store, compose, send -and receive email from their own personal Email account or a shared -inbox, for example a Support or Sales inbox. Emails can be related to -Accounts, Cases, Contacts and many more records in the CRM. - -[[emails-actions]] -Emails Actions -^^^^^^^^^^^^^^ - -You can access the Emails actions from the Emails module menu drop down -or via the Sidebar. The Emails actions are as follows: - -* View My Email – Redirects you to your mailbox so that you can view and -manage emails displayed/imported to the CRM. -* Create Email Template - A WYSIWYG editor where you can create Emails -by dragging and dropping components, inserting variables and amending -the plain text. -* View Email Templates - Takes you to the List View page of your -existing Email Templates. This allows you to search and list Email -Template records. - -To view the full list of fields available for the Emails module, See -link:#Emails_Field_List[Emails Field List]. - -[[tasks]] -Tasks -~~~~~ - -SuiteCRM can assist Users with productivity, offering a way to record, -relate and assign Tasks and to-do items that require action. - -[[tasks-actions]] -Tasks Actions -^^^^^^^^^^^^^ - -You can access the Tasks actions from the Tasks module menu drop down or -via the Sidebar. The Tasks actions are as follows: - -* Create Task – A new form is opened in Edit View to allow you to create -a new Task record. -* View Tasks – Redirects you to the List View for the Tasks module. This -allows you to search and list Task records. -* Import Tasks – Redirects you to the Import Wizard for the Tasks -module. For more information, see link:#Importing_Records[Importing -Records]. - -To view the full list of fields available when creating a Task, See -link:#Tasks_Field_List[Tasks Field List]. - -[[managing-tasks]] -Managing Tasks -^^^^^^^^^^^^^^ - -* To sort records on the Tasks List View, click any column title which -is sortable. This will sort the column either ascending or descending. -* To search for a Task, see the link:#Search[Search] section of this -user guide. -* To update some or all of the Task on the List View, use the Mass -Update panel as described in the link:#Mass_Updating_Records[Mass -Updating Records] section of this user guide. -* To duplicate a Task, you can click the Duplicate button on the Detail -View and then save the duplicate record. -* To close a Task, click on the 'x' icon on the Tasks List View. You can -also close a Meeting by clicking the Close button on the Detail View of -a Task. You can also click the Close and Create New button. This will -close the Task you are viewing and redirect you to the Edit View to -create a new record. -* To delete one or multiple Tasks, you can select multiple records from -the List View and click delete. You can also delete a Task from the -Detail View by clicking the Delete button. For a more detailed guide on -deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Task, click the Meeting Subject in the List -View. This will open the record in Detail View. -* To edit the Task details, click Edit icon within the List View or -click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Tasks, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Task record, you can -click the View Change Log button on the Task's Detail View or Edit View. - -[[notes]] -Notes -~~~~~ - -The Notes module in SuiteCRM can be used to keep a record of any -comments, observations or explanations that a User may have relating -internally to their organisation or relating to another SuiteCRM record -such as an Account, Contact, Lead or many more. Notes are also used to -keep record of interactions with Customers regarding Cases and Bugs. - -[[notes-actions]] -Notes Actions -^^^^^^^^^^^^^ - -You can access the Notes actions from the Notes module menu drop down or -via the Sidebar. The Notes actions are as follows: - -* Create Note or Attachment – A new form is opened in Edit View to allow -you to create a new Note record (with attachment). -* View Notes – Redirects you to the List View for the Notes module. This -allows you to search and list Note records. -* Import Notes – Redirects you will be taken to the Import Wizard for -the Notes module. For more information, see -link:#Importing_Records[Importing Records]. - -To view the full list of fields available when creating a Note, See -link:#Notes_Field_List[Notes Field List]. - -[[managing-notes]] -Managing Notes -^^^^^^^^^^^^^^ - -* To sort records on the Notes List View, click any column title which -is sortable. This will sort the column either ascending or descending. -* To search for a Note, see the link:#Search[Search] section of this -user guide. -* To update some or all the Notes on the List View, use the Mass Update -panel as described in the link:#Mass_Updating_Records[Mass Updating -Records] section of this user guide. -* To duplicate a Note, you can click the Duplicate button on the Detail -View and then save the duplicate record. -* To delete one or multiple Notes, you can select multiple records from -the List View and click delete. You can also delete a Note from the -Detail View by clicking the Delete button. For a more detailed guide on -deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Note, click the Note Subject in the List -View. This will open the record in Detail View. -* To edit the Note details, click Edit icon within the List View or -click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Notes, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Note record, you can -click the View Change Log button on the Note's Detail View or Edit View. - -[[documents]] -Documents -~~~~~~~~~ - -The Documents module can be used as a repository for Customer issued or -internal files. This content can be uploaded, revised and viewed in -addition to relating to individual records within SuiteCRM. - -[[documents-actions]] -Documents Actions -^^^^^^^^^^^^^^^^^ - -You can access the Documents actions from the Documents module menu drop -down or via the Sidebar. The Documents actions are as follows: - -* Create Document – A new form is opened in Edit View to allow you to -create a new Document record. -* View Documents – Redirects you to the List View for the Documents -module. This allows you to search and list Document records. - -To view the full list of fields available when creating a Document, See -link:#Documents_Field_List[Documents Field List]. - -[[managing-documents]] -Managing Documents -^^^^^^^^^^^^^^^^^^ - -* To sort records on the Documents List View, click any column title -which is sortable. This will sort the column either ascending or -descending. -* To search for a Document, see the link:#Search[Search] section of this -user guide. -* To update some or all the Documents on the List View, use the Mass -Update panel as described in the link:#Mass_Updating_Records[Mass -Updating Records] section of this user guide. -* To duplicate a Document, you can click the Duplicate button on the -Detail View and then save the duplicate record. -* To delete one or multiple Documents, you can select multiple records -from the List View and click delete. You can also delete a Document from -the Detail View by clicking the Delete button. For a more detailed guide -on deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Document, click the Document Name in the List -View. This will open the record in Detail View. -* To view an attachment, click the attachment link on the List View or -Detail View of the Document. To update a document, you can create a -Document Revision. -* To edit the Document details, click Edit icon within the List View or -click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Documents, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Document record, you -can click the View Change Log button on the Document's Detail View or -Edit View. - -[[document-revisions]] -Document Revisions -^^^^^^^^^^^^^^^^^^ - -[[targets]] -Targets -~~~~~~~ - -Typically Targets are used as the recipients of a Marketing Campaign, -your organisation knows very little about these individuals and they may -be re-used for new Campaigns or deleted without any impact to the -business. Your organisation will spend little resources on Targets and -will usually be contacted en masse. Targets can be acquired from -purchased email lists or gathered from trade shows your organisation has -been present. The Targets module in SuiteCRM is used to store and manage -information about these individuals. - -[[targets-actions]] -Targets Actions -^^^^^^^^^^^^^^^ - -You can access the Targets actions from the Targets module menu drop -down or via the Sidebar. The Targets actions are as follows: - -* Create Target – A new form is opened in Edit View to allow you to -create a new Target record. -* View Targets – Redirects you to the List View for the Targets module. -This allows you to search and list Target records. -* Import Targets – Redirects you will be taken to the Import Wizard for -the Targets module. For more information, see -link:#Importing_Records[Importing Records]. - -To view the full list of fields available when creating a Target, See -link:#Targets_Field_List[Targets Field List]. - -[[managing-targets]] -Managing Targets -^^^^^^^^^^^^^^^^ - -* To sort records on the Targets List View, click any column title which -is sortable. This will sort the column either ascending or descending. -* To search for a Target, see the link:#Search[Search] section of this -user guide. -* To update some or all the Targets on the List View, use the Mass -Update panel as described in the link:#Mass_Updating_Records[Mass -Updating Records] section of this user guide. -* To duplicate a Target, you can click the Duplicate button on the -Detail View and then save the duplicate record. -* To delete one or multiple Targets, you can select multiple records -from the List View and click delete. You can also delete a Target from -the Detail View by clicking the Delete button. For a more detailed guide -on deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Target, click the Target Name in the List -View. This will open the record in Detail View. -* To edit the Target details, click Edit icon within the List View or -click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Targets, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Target record, you can -click the View Change Log button on the Target's Detail View or Edit -View. - -[[target-lists]] -Target Lists -~~~~~~~~~~~~ - -The Target Lists module in SuiteCRM is used to separate Targets into -groups, these can be groups of individuals that should be excluded from -a particular Campaign, test groups or a list of Targets grouped by -certain criteria, for example area or market an organisation works in. - -[[target-lists-actions]] -Target Lists Actions -^^^^^^^^^^^^^^^^^^^^ - -You can access the Target Lists actions from the Target Lists module -menu drop down or via the Sidebar. The Target Lists actions are as -follows: - -* Create Target List – A new form is opened in Edit View to allow you to -create a new Target List record. -* View Target Lists – Redirects you to the List View for the Target -Lists module. This allows you to search and list Target List records. - -To view the full list of fields available when creating a Target List, -See link:#Target_Lists_Field_List[Target Lists Field List]. - -[[managing-target-lists]] -Managing Target Lists -^^^^^^^^^^^^^^^^^^^^^ - -* To sort records on the Target List List View, click any column title -which is sortable. This will sort the column either ascending or -descending. -* To search for a Target List, see the link:#Search[Search] section of -this user guide. -* To update some or all the Target Lists on the List View, use the Mass -Update panel as described in the link:#Mass_Updating_Records[Mass -Updating Records] section of this user guide. -* To duplicate a Target List, you can click the Duplicate button on the -Detail View and then save the duplicate record. -* To delete one or multiple Target Lists, you can select multiple -records from the List View and click delete. You can also delete a -Target List from the Detail View by clicking the Delete button. For a -more detailed guide on deleting records, see the -link:#Deleting_Records[Deleting Records] section of this user guide. -* To view the details of a Target List, click the Target List Name in -the List View. This will open the record in Detail View. -* To edit the Target List details, click Edit icon within the List View -or click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Target Lists, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Target List, you can -click the View Change Log button on the Target List's Detail View or -Edit View. - -[[campaigns]] -Campaigns -~~~~~~~~~ - -The Campaigns module in SuiteCRM can be a very powerful marketing and -advertising tool for your organisation allowing you to create and track -Newsletter, Email and non-email Campaigns to prospective or existing -customers. With the tracking tools built into the Campaign module you -can monitor the response you receive from your Campaign in real time, -allowing you to view the return on investment (ROI) and many other -useful metrics. This in turn helps you to plan your strategic marketing -and advertising activities effectively by visualising which Campaigns -work and which do not. - -[[campaign-actions]] -Campaign Actions -^^^^^^^^^^^^^^^^ - -You can access the Campaign actions from the Campaign module menu drop -down or via the Sidebar. The Campaign actions are as follows: - -* Create Campaign – This takes you to the Campaign Wizard page. -* View Campaigns – Redirects you to the List View for the Campaign -module. This allows you to search and list Campaign records. -* Create Email Template – A WYSIWYG editor where you can create emails -by dragging and dropping components, inserting variables and amending -the plain text. -* View Email Templates – Takes you to the List View page of your -existing Email Templates. This allows you to search and list Email -Template records. -* View Diagnostics – Allows you to check that your Campaign Emails and -Campaign schedulers are set up correctly. If this is the case then a -green tick icon will appear, if there are any issues with the setup then -a red cross icon will appear and you should contact your Admin for -assistance. -* Create Person Form – A web form template Wizard allowing you to create -Leads, Contacts and Targets. -* To view the full list of fields available when creating a Campaign, -See link:#Campaign_Fields_List[Campaign Fields List]. - -[[creating-a-campaign-via-campaign-wizard]] -Creating a Campaign via Campaign Wizard -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -To create a Campaign and to begin the Campaign Wizard click on the -Create Campaign button on the sidebar or module menu drop down while in -the Campaign module. - -image:74Creating_a_campaign.png[74Creating_a_campaign.png,title="74Creating_a_campaign.png"] - -Alternatively click on the Create button at the top right of the screen -when in the List View of the View Campaigns page. Once you click Create -Campaign then you will be presented with three options, Newsletter, -Email and Non-email based Campaign. - -image:75Creating_a_campaign.png[75Creating_a_campaign.png,title="75Creating_a_campaign.png"] - -[[campaign-wizard-header-and-budget]] -Campaign Wizard Header and Budget -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -On clicking your selected Campaign icon you will be taken to the first -page of the Campaign Wizard, the Campaign Header page. In this page you -will be prompted to complete the required fields of Name and Status as -well as having the opportunity to record any information you may wish to -about your Campaign Budget (Campaign Budget is on a separate page for -Non-email based Campaigns). - -image:76Creating_a_campaign.png[76Creating_a_campaign.png,title="76Creating_a_campaign.png"] - -Once you have completed the necessary fields and are ready to progress -to the next stage then click Next. - -image:77Creating_a_campaign.png[77Creating_a_campaign.png,title="77Creating_a_campaign.png"] - -[[campaign-wizard-subscriptions-newsletter-campaigns-only]] -Campaign Wizard Subscriptions – Newsletter Campaigns Only -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -For a Newsletter Campaign the next step of the Campaign Wizard allows -you to specify your Subscription information. - -image:78Newsletter_campaign.png[78Newsletter_campaign.png,title="78Newsletter_campaign.png"] - -This stage is made up of three components; the Subscription List, -Unsubscription List and Test List. - -* The Subscription List - Allows you to set a Target List for your -Campaign. This Target List will be used to send out emails for this -Campaign. If you have not already created a Target List then an empty -list will be created for you and you can set this at a later time. -* The Unsubscription List - Allows you to set a Target List of -individuals who have opted out of your marketing and should not be -contacted through email. If you have not already created a Target List -then an empty list will be created for you and you can set this at a -later time. -* The Test List - Allows you to set a Target List to send out test -emails for this Campaign. If you have not already created a Target List -then an empty list will be created for you and you can set this at a -later time. - -Once you have completed the necessary fields then click Next and you -will be taken to the Templates page which the next stage of the Campaign -Wizard. - -[[campaign-wizard-target-lists-email-and-non-email-based-campaigns]] -Campaign Wizard Target Lists – Email and Non-Email Based Campaigns -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -For all Email and non-email based Campaign the next step of the Campaign -Wizard allows you to specify your Target Lists. For Email based -Campaigns this is where you would choose a list of people to Email based -on Existing Targets already created in the CRM. Or for Telesales -(non-email based) Campaigns for example this could be a list of people -that you would call. - -image:79E-mail_campaign.png[79E-mail_campaign.png,title="79E-mail_campaign.png"] - -Recipients that have previously opted out of your marketing Campaigns -will automatically be removed from your Target List. - -image:80E-mail_campaign.png[80E-mail_campaign.png,title="80E-mail_campaign.png"] - -If you have not at this stage created a Target List you can create an -empty one using the dropdown menu in the image above and populate it -after you have completed the rest of your Campaign setup by visiting the -link:#Target_Lists[Target Lists] page. The next step for non-email based -Campaigns is the link:#Campaign_Summary[Campaign Summary] page, Email -based Campaigns however should move onto the Campaign Templates page. - -[[campaign-wizard-templates]] -Campaign Wizard Templates -^^^^^^^^^^^^^^^^^^^^^^^^^ - -image:81Campaign_template.png[81Campaign_template.png,title="81Campaign_template.png"] - -This page is a WYSIWYG Newsletter Template editor so you can create a -template for your marketing emails. - -image:82Campaign_template.png[82Campaign_template.png,title="82Campaign_template.png"] - -The panel at the top presents you with three options which allows you to -select an existing template, create a brand new template or copy an -existing template. - -* Select an existing template – You can select from a drop down list of -existing Email Templates -* Create a brand new template – If you wish to start the Newsletter from -scratch then you can select this option. -* Copy an existing template – Allows you select an existing template and -use this as a base to make amendments - -Once you have chosen an Email Template you can decide you want to insert -a Tracker URL. This can be used to insert a link to your organisation's -website or direct link to a new product that you have launched. Also, -you are given the opportunity to place an 'Opt Out' link in your -template. - -image:83Campaign_template.png[83Campaign_template.png,title="83Campaign_template.png"] - -Please note that the 'Opt Out' link is added to the template -automatically even if you do not insert one at this point. Another -interesting feature of the Email Templates page is the ability to -personalise your templates by inserting variables. You can for example -insert the 'Account ID' variable in the subject line, or even insert the -addressee's first name and last name to add a more personal touch. - -image:84Campaign_template.png[84Campaign_template.png,title="84Campaign_template.png"] - -The WYSIWYG editor is displayed at the bottom of the Email Template -page, this editor allows you to visualise how your template will -actually look. - -image:85Campaign_template.png[85Campaign_template.png,title="85Campaign_template.png"] - -The panel on the left side of the editor allows you to drag and drop -different layout components to your template. These then can be edited -in the right side display panel. Once you have inserted a component into -the display panel you can click on the added item and the editor menu -will appear. - -image:Email_Template_Editor.png[Email_Template_Editor.png,title="Email_Template_Editor.png"] - -This menu provides you with a multitude of additional options which -allows you to customise the layout and appearance of your template. Font -type can be selected, formatted, colours changed, text alignment chosen, -images and even videos can be inserted. - -Insert HTML by clicking Tools > Source Code - -The bottom panel offers the option to include attachments with your -Email Template, this could be used if for example you wished to attach a -something like a product catalogue to your Newsletter. Once you are -satisfied with your Email Template you can click Next and you will be -taken to the Marketing page which is the next stage of the Campaign -Wizard. - -[[campaign-wizard-marketing]] -Campaign Wizard Marketing -^^^^^^^^^^^^^^^^^^^^^^^^^ - -image:87Campaign_marketing.png[87Campaign_marketing.png,title="87Campaign_marketing.png"] - -This section of the Campaign Wizard allows you to specify the Email -settings for your Campaign including the Bounce Handling Account, -Outgoing Email Account, From/Reply-to Name and Address. In addition to -this, you can Schedule your Campaign by completing the Date and Time -fields. Once you are satisfied with your Email Settings and Schedule you -can click Next and you will be taken to the Summary page which is the -final stage of the Campaign Wizard. - -[[campaign-wizard-summary]] -Campaign Wizard Summary -^^^^^^^^^^^^^^^^^^^^^^^ - -image:Newsletter_Summary_Review.png[Newsletter_Summary_Review.png,title="Newsletter_Summary_Review.png"] - -The Summary page includes a checklist which indicates that each page of -the Campaign Wizard has been completed satisfactorily. If a section is -complete then this is shown with green tick icon, otherwise this will be -highlighted with a red cross icon. If any section has not been completed -then SuiteCRM will not permit the Campaign to be sent. In this instance -in the image shown above the 'Choose Targets' section has not been -completed correctly as indicated by the red cross icon. This would be -resolved by clicking back to the Target List page and specifying a -Subscription List with at least one entry. Once you have ensured all -sections are complete then you can choose one of three options: - -* Send Mail at Scheduled Time – You can click this once you are sure all -sections of the Campaign are set correctly and are confident that it is -the finished article. -* Send Marketing Email as Test – This option gives you the opportunity -to send out your Campaign to your Test List that you specified in the -Subscriptions section of the Campaign Wizard. By doing this you can view -the Campaign as a recipient and double check that the Campaign appears -as it should do before sending out to real prospective/live customers. -* View Details – By clicking this option you are taken to the Detail -View of the Campaign record you have just created through the Newsletter -Campaign Wizard. - -[[create-person-form]] -Create Person Form -^^^^^^^^^^^^^^^^^^ - -Another feature of the Campaign module is the web form template Wizard -allowing you to create Leads, Contacts and Targets. This can be accessed -by clicking on the Create Person Form button from the dropdown menu in -the Campaign module or via the sidebar when in the module. - -image:88Create_person_form.png[88Create_person_form.png,title="88Create_person_form.png"] - -Once you have clicked this, you will be taken to the first page of the -Create Person Form Wizard. - -image:89Create_person_form.png[89Create_person_form.png,title="89Create_person_form.png"] - -This stage allows you to specify the type of person you would like to -create via your web form. The dropdown menu allows you to choose from a -Lead, Contact or Target. On selecting the person type you would like to -create the Available Fields dynamically change. Once you have chosen -this you can drag and drop the fields you would like to include on your -web form. Fields dropped into the First Form Column area are displayed -on the left side of your web form and the fields dropped into the Second -Form Column area are displayed on the right side of your web form. You -can choose to have 1 or 2 columns, all on the left side, right side or -on both sides. Please note as a minimum you need to include the required -fields included in your web form as indicated by an asterisk. Once you -are satisfied with the fields you wish to include click the Next button -to progress to the next stage. - -[[create-person-form-additional-information]] -Create Person Form – Additional Information -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -image:90Createperson_form.png[90Createperson_form.png,title="90Createperson_form.png"] - -On this page you can configure your web form appearance by adding a Form -Header/Footer, Form Description, change the label on the Submit button -or change how the URL is displayed. As a minimum you have to relate the -web form to an existing Campaign and assign to a User before clicking -the Generate Form button to progress to the next stage. - -[[create-person-form-editor]] -Create Person Form – Editor -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -image:91Createperson_form.png[91Createperson_form.png,title="91Createperson_form.png"] - -The final step of the Create Person Form Wizard allows you to format the -web form you have setup by using the WYSIWYG editor. This editor -provides you with a multitude of additional options which allows you to -customise the layout and appearance of your web form. Font type can be -selected, formatted, colours changed, text alignment chosen and images -can be inserted. Once you are happy with the appearance of your web form -click Save Web Form. On clicking this button you can either click on the -link to download the web form you have just created or copy and paste -the html to an existing document. By clicking the download link this -will save the html form in your download folder. - -image:92Createperson_form.png[92Createperson_form.png,title="92Createperson_form.png"] - -Please note that the web form will not be stored anywhere else on the -CRM, to ensure the html is saved please carry out one of the two steps -above. - -[[campaign-response-tracking]] -Campaign Response Tracking -^^^^^^^^^^^^^^^^^^^^^^^^^^ - -When in the Detail View of a Campaign record you can access the inbuilt -Campaign response tracking by clicking the View Status button. - -image:93View_status.png[93View_status.png,title="93View_status.png"] - -On clicking this button you will be taken to the Status page for that -Campaign record. This page gives an overview of the Campaign details as -well as a graphical representation of your Campaign response including -the number of messages sent, bounced messages, how many viewers, opt -outs and how many clicked through links. - -image:93Campaign_response.png[93Campaign_response.png,title="93Campaign_response.png"] - -These fields are expanded further down the page and detailed on an -individual record level. These records can be added to a new Target List -by clicking the Add to Target List button. This allows you to create -new, more focussed Campaigns based on who has responded. - -image:94Campaign_response.png[94Campaign_response.png,title="94Campaign_response.png"] - -[[campaign-roi-tracking]] -Campaign ROI Tracking -^^^^^^^^^^^^^^^^^^^^^ - -When in the Detail View of a Campaign record you can access the inbuilt -Campaign ROI tracking by clicking the View ROI button. - -image:95Campaign_tracking.png[95Campaign_tracking.png,title="95Campaign_tracking.png"] - -On clicking this button you will be taken to the ROI page for that -Campaign record. This page gives a graphical representation of your -Campaign Return on Investment, allowing you to easily visualise how your -organisation's money spent on the Campaign has translated into potential -business. - -image:Campaign_ROI_Graph.png[Campaign_ROI_Graph.png,title="Campaign_ROI_Graph.png"] - -[[cases]] -Cases -~~~~~ - -In SuiteCRM Cases are used to record interactions with Customers when -they ask for help or advice, for example in a Sales or Support function. -A Case can be created, updated when a User is working on it, assigned to -a colleague and closed when resolved. At each stage of the Case the User -can track and update the incoming and outgoing conversation thread so a -clear record of what has occurred is registered in the CRM. Cases can be -related to individual records such as Accounts, Contacts and Bugs. - -[[cases-actions]] -Cases Actions -^^^^^^^^^^^^^ - -You can access the Cases actions from the Cases module menu drop down or -via the Sidebar. The Cases actions are as follows: - -* Create Case – A new form is opened in Edit View to allow you to create -a new Account record. -* View Cases – Redirects you to the List View for the Cases module. This -allows you to search and list Case records. -* Import Cases – Redirects you will be taken to the Import Wizard for -the Cases module. For more information, see -link:#Importing_Records[Importing Records]. - -To view the full list of fields available when creating a Case, See -link:#Cases_Field_List[Cases Field List]. - -Advanced functionality for Cases can be found in the -link:#Advanced_Open_Cases_with_Portal[Advanced Cases] section of this -User Guide. - -[[managing-cases]] -Managing Cases -^^^^^^^^^^^^^^ - -* To sort records on the Cases List View, click any column title which -is sortable. This will sort the column either ascending or descending. -* To search for a Case, see the link:#Search[Search] section of this -user guide. -* To update some or all the Cases on the List View, use the Mass Update -panel as described in the link:#Mass_Updating_Records[Mass Updating -Records] section of this user guide. -* To duplicate a Case, you can click the Duplicate button on the Detail -View and then save the duplicate record. -* To merge duplicate Cases, select the records from the Cases List View, -click the Merge link in the Actions drop-down list, and progress through -the merge process. For more information on Merging Duplicates, see the -link:#Merging_Records[Merging Records] section of this user guide. -* To delete one or multiple Cases, you can select multiple records from -the List View and click delete. You can also delete a Case from the -Detail View by clicking the Delete button. For a more detailed guide on -deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Cases, click the Case Subject in the List -View. This will open the record in Detail View. -* To edit the Case details, click Edit icon within the List View or -click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Cases, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Case record, you can -click the View Change Log button on the Case's Detail View or Edit View. - -[[projects]] -Projects -~~~~~~~~ - -In SuiteCRM the Projects module allows the User to arrange their -organisation's projects by tracking a number of Tasks and allocating -resources. Once set up, a project can be visualised in the form of a -Gantt chart or using the project grid. - -[[projects-actions]] -Projects Actions -^^^^^^^^^^^^^^^^ - -You can access the Projects actions from the Projects module menu drop -down or via the Sidebar once you have clicked to view the module. The -Projects actions are as follows: - -* Create Project – A new form is opened in Edit View to allow you to -create a new Project record. -* View Project – Redirects you to the List View for the Projects module. -This allows you to search and list Project records. -* View Project Tasks – Allows you to list Project Tasks, which are -related to a parent Project. -* Import Project – Redirects you to the Import Wizard for the Projects -module. For more information, see link:#Importing_Records[Importing -Records]. - -To view the full list of fields available when creating a Project, See -link:#Projects_Field_List[Projects Field List]. - -[[creating-projects]] -Creating Projects -^^^^^^^^^^^^^^^^^ - -In the Projects module, you can create, manage, and duplicate Projects -and Project Tasks. - -You can define multiple Project Tasks for each Project. When you create -a Project Task, you must associate it with a Project. You can associate -a Project with multiple activities, Accounts, Opportunities, and Cases. -You can also create Projects and Project Tasks from an Email’s detail -page. - -1. In the Actions bar, click Create Project. -2. On the Projects page, enter information for the following fields: -1. Name. Enter a name for the Project. -2. Status. From the drop-down list, select the Project status such as -Draft, In Review, or Published. -3. Start Date. Click the Calendar icon and select the Project start -date. -4. End Date. Click the Calendar icon and select the Project end date. -5. Assigned to. Enter the name of you who has ownership of the Project. -By default, it is assigned to you. -6. Priority. From the drop-down list, select the importance of the -Project such as Low, Medium, or High. -7. Description. Enter a brief description of the Project. -3. Click Save to create the Project; click Cancel to exit the page -without creating the Project. - -When you save the Project, the Project’s detail page displays on the -page. - -From this page, you can relate the Project to records such as Contacts -and Opportunities. - -[[creating-project-tasks]] -Creating Project Tasks -^^^^^^^^^^^^^^^^^^^^^^ - -1. In the Project Tasks sub-panel, click Create. -2. On the Project Tasks page, enter information for the following -fields: -1. Name. Enter a name for the task. -2. Task ID. Enter a numerical value as the task identification number. -3. Start Date. Click the Calendar icon and select the date when the -task is due to begin. -4. Finish Date. Click the Calendar icon and select a date when the task -is due to be completed; enter the start time in the adjoining field. -5. Percentage Complete. Enter a numerical value to indicate what -percentage of the task has been completed. -6. Priority. From the drop-down list, select a priority level that -reflects the importance of completing this task. -7. Milestone. Check this box if the completion on this task is -considered a milestone for project completion. -8. Project Name. Click Select and choose the project associated with -the task. -9. Description. Enter a brief description of the task. -3. Click Save to create the task; click Cancel to return to the project -detail page without creating the task. - -[[managing-projects-and-project-tasks]] -Managing Projects and Project Tasks -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -* To sort the List View on the Projects and Project Tasks list view, -click any column title which is sortable. This will sort the column -either ascending or descending. -* To search for a Project or Project task, see the link:#Search[Search] -section of this user guide. -* To update some or all the Projects or Project Tasks on the List View, -use the Mass Update panel as described in the -link:#Mass_Updating_Records[Mass Updating Records] section of this user -guide. -* To duplicate a Project, you can click the Duplicate button on the -Detail View and then save the duplicate record. -* To delete one or multiple Projects, you can select multiple records -from the List View and click delete. You can also delete a Project from -the Detail View by clicking the Delete button. For a more detailed guide -on deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Project or Project Task, click the Project or -Project Task Name in the List View. This will open the record in Detail -View. -* To edit the Project or Project Task details, click Edit icon within -the List View or click the edit button on the Detail View, make the -necessary changes, and click Save. -* For a detailed guide on importing and exporting Projects and Project -Tasks, see the link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Project or Project Task -record, you can click the View Change Log button on the Project's or -Project Task's Detail View or Edit View. - -[[summary-4]] -Summary -~~~~~~~ - -In this chapter we have covered the functionality of the core modules. -These modules allow the user to define and refine sales processes, with -the ability to record data in detail within the required module. - -In the next chapter, we will cover the advanced modules within SuiteCRM. -These modules allow the user to manage further sales processes, create -automated workflows, design reports and more. - -[[advanced-modules]] -Advanced Modules ----------------- - -By now, you should have a fundamental understanding of the SuiteCRM user -interface, basic modules, layouts, creating, searching and managing -records. - -The next section of this User Guide covers in detail the Advanced CRM -modules. SuiteCRM has Advanced CRM modules which allow Users to further -enhance your Sales Force Automation Capabilities and improve business -processes. - -[[advanced-open-sales]] -Advanced Open Sales -~~~~~~~~~~~~~~~~~~~ - -The first 'Suite' of advanced modules is AOS(Advanced Open Sales). The -various modules that are part of the AOS suite of modules allow you to -manage the Post-Opportunity Sales processes such as Quoting, Invoicing -and recurring Contracting. This functionality is made available to you -through the following modules: - -* Product Categories -* Products -* PDF Templates -* Quotations -* Invoices -* Contracts - -[[aos-settings]] -AOS Settings -^^^^^^^^^^^^ - -System Administrator users can alter the settings for AOS using the AOS -Settings page under the Advanced OpenSales panel within the Admin Panel. - -image:172AOS_Settings.png[172AOS_Settings.png,title="172AOS_Settings.png"] - -You can customise the following settings within the AOS Settings: - -* Renewal Reminder Period – This defines how many days before the -Contract End Date that a reminder call should be created. -* Initial Invoice Number – Allows users to set the initial invoice -number. For example 20001. -* Initial Quote Number – Allows users to set the initial quote number. -For example 456. -* Enable Line Items Groups – If selected then users will be able to -bundle line items into groups. If this is not selected then you will not -be able to use the AOS Group functionality. _Note: This setting should -be selected before using AOS – It is difficult to migrate from/to groups -once Quotes/Invoices have been created._ -* Add Tax to Line Total – If this is selected then the Tax will be added -into the Line Total on Line Items. If this is not the selected the Line -Total will not include Tax. - -image:173AOS_settings_edit.png[173AOS_settings_edit.png,title="173AOS_settings_edit.png"] - -Once configured, click 'Save' to apply your AOS Settings. - -[[products-module]] -Products Module -^^^^^^^^^^^^^^^ - -You can create Product records using the Products module. Creating -products allows users to select product lines when preparing Quotes -using AOS. The products module allows users to specify the Products -Name, Part Number, Category and Type. Additional fields for Products can -be added using Studio. - -image:174Products_module.png[174Products_module.png,title="174Products_module.png"] - -The module also allows users to define a Cost and Price for the product. -Price is the selling price which will be used in the quoting process. A -related Contact can be associated to the product. This is the point of -contact with the supplier concerning this product. If you have an Image -of the product then this can be uploaded within the products record. A -URL to the products page on your website can also be specified. - -[[products-categories-module]] -Products Categories Module -^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The Product Categories module allows Users to structure Products into a -hierarchical category structure. To create a Product Category record, -navigate to the Product Categories module and click the 'Create Product -Categories' button in the action bar. - -image:175Product_category.png[175Product_category.png,title="175Product_category.png"] - -The Parent Category field is a relationship field to another Product -Categories record. If you check the 'Is Parent Category' field then this -signifies that the category is the highest level. Once selected you will -not be able to select a Parent Category using the relate field. - -[[pdf-templates]] -PDF Templates -^^^^^^^^^^^^^ - -*Creating Templates* - -AOS allows users to generate PDF documents and merge data from SuiteCRM -modules. You must however create a PDF template first. - -image:176PDF_template.png[176PDF_template.png,title="176PDF_template.png"] - -This module provides a WYSIWYG interface to create dynamic PDF -templates. You must select a Type. This is the module you are building -the PDF Template for. By default the modules you can select are: Quotes -Invoices Accounts Contacts Leads - -System Administrator users can extend this list by editing the -'pdf_template_type_dom' using the drop down editor functionality. Please -note that the drop down 'Item Name' must be the name of the module -directory. - -To insert fields into the Body of the template users will first select a -module. This will be the either the same module as the Type or a related -module to the Type module. This is selected using the first drop down on -the Insert Fields row. - -image:177PDF_template_field.png[177PDF_template_field.png,title="177PDF_template_field.png"] - -This will populate the second drop down with all the fields found within -that module. Once you have selected the field you wish to insert, the -text field will populate with the field variable name. Click 'Insert' to -place this field into the Body of the template. If the Active check box -is selected then users will be able to generate PDFs from this template. -If it is not selected you will not. - -*Loading Samples* - -image:178PDF_template_field.png[178PDF_template_field.png,title="178PDF_template_field.png"] - -AOS comes with seven pre-defined PDF templates to help you create your -own. These can be loaded by selecting the appropriate template from the -Load Sample drop down list. - -image:image86.png[image86.png,title="image86.png"] - -*Line Items* - -When using a sample to create a template for Quotes or Invoices the Line -Items are formatted within a table. You can change the fields found in -this table as well as add or remove columns. Please note that if you are -creating the template from scratch you must format the Line Items -section as a table. - -image:image87.png[image87.png,title="image87.png"] - -*Margins* - -At the bottom of the PDF Template Edit View, you can specify the margin -width for the PDF output. - -image:187PDF_Margins.png[187PDF_Margins.png,title="187PDF_Margins.png"] - -*Header and Footer* - -Within the PDF Templates Edit View, you can also define a Header and a -Footer for your templates. These can be completed using the Header and -Footer text areas found below the Body text area. - -image:188PDF_footer.png[188PDF_footer.png,title="188PDF_footer.png"] - -*Generate Letter* - -You can generate PDF documents for Accounts, Contacts and Leads using -the Generate Letter functionality. - -image:image90.png[image90.png,title="image90.png"] - -Clicking the 'Generate Letter' button found on these modules Detail View -will prompt a pop-up asking to select a template. - -image:image91.png[image91.png,title="image91.png"] - -The template selector pop-up will show all the active templates which -have the same Type as the module of the record. Clicking the template -name will generate a PDF document with date populated from the record -and it's related records. The Generate Letter functionality can also be -actioned from the List View. This allows you to select multiple records -and click the 'Generate Letter' button within the List View action menu. - -image:image92.png[image92.png,title="image92.png"] - -The process for generating PDFs for Quotes, Invoices and Contracts is -described in your respective sections. - -[[quotes-module]] -Quotes Module -^^^^^^^^^^^^^ - -*Creating a Quote* - -You can create a Quote by going to the Quotes module and clicking -'Create Quote' from within the actions bar. The first panel allows you -to specify details concerning the quote such as the Title, related -Opportunity, Stage and Payment Terms. The Quote Number field is -calculated automatically. - -image:96Quotes_first_panel.png[96Quotes_first_panel.png,title="96Quotes_first_panel.png"] - -The second panel allows you to specify who the Quote is for by relating -an Account and Contact to the Quote. When you select the Account, the -Billing Address and Shipping Address are dynamically pulled from the -Account and populated into the fields on the Quote record. - -image:97Quotes_2nd_panel.png[97Quotes_2nd_panel.png,title="97Quotes_2nd_panel.png"] - -*Line Items with Groups* - -The third panel allows users to specify the Quote Groups, Line Items and -the Currency. A Group is a collection of Line Items with its own Group -Total. A Line Item can be a Product Line or a Service Line. To add a -Quote Group, click the 'Add Group' button. - -_Note: Add Group will be displayed if “Enable Line Item groups” is -selected in Admin._ - -image:98Quotes_add_group.png[98Quotes_add_group.png,title="98Quotes_add_group.png"] - -This will display the Group, allowing you to insert a Group Name and add -a Product Line or Service Line. It will also display the Group Totals. - -image:200Add_group.png[200Add_group.png,title="200Add_group.png"] - -To add a Product Line, click the 'Add Product Line' button. This will -allow users to quote for Products from the Products module. - -image:201Add_product_line.png[201Add_product_line.png,title="201Add_product_line.png"] - -To select a Product, you can start typing in the Product or Part Number -field which will provide a list of results similar to any relate field. -Alternatively click the arrow button next to the Part Number field. This -will display a pop-up window allowing you to select from a list of -Products. - -image:202Add_product1.png[202Add_product1.png,title="202Add_product1.png"] - -Once you have selected a Product, the List, Sale Price and Total will -populate automatically. You can change the Quality, add Discounts -(Percentage or Amount) and increase the Tax percentage. These will alter -the Sale Price, Total Price and Group Total fields. To add a Service -Line, click the 'Add Service Line' button. This will allow users to -quote for Services. - -image:203Add_service_line.png[203Add_service_line.png,title="203Add_service_line.png"] - -For Service Lines, you must specify the List price. This will populate -the Sale Price. Tax and Discounts can be added similarly to the Product -Line. AOS will keep a Grand Total for each Group. - -image:204Total.png[204Total.png,title="204Total.png"] - -AOS will also keep a Grand Total for all Groups combined. - -image:205Total_total.png[205Total_total.png,title="205Total_total.png"] - -The Shipping field allows you to add a shipping cost. The Shipping Tax -field allows you to add tax to this value. Once the Quote has been -compiled, click 'Save' to save the Quote. - -Line Items without Groups - -Creating Quotes without Groups is very similar to creating Quotes with -Groups. The only difference is you do not have to click 'Add Group'. You -simply 'Add Product Line' and 'Add Service Line' to the quote. Without -Groups you are cannot see the Group Total fields. You will only see the -Grand Total fields. - -*Sending Quotations* - -To output a Quote you can select one of following three buttons from the -Quote Detail View. - -image:99Sending_quotations.png[99Sending_quotations.png,title="99Sending_quotations.png"] - -AOS provides users with three methods of sending Quotes: - -* Print as PDF – Allows you to select a template and download or save a -PDF of the Quote. -* Email PDF – Allows you to select a template then directs you to the -SuiteCRM email client 'Compose' screen. The Quote PDF will be attached -to email and the email will be addressed to the related Contact of the -Quote. This allows you to fill out the email body. -* Email Quotation – This directs you to the SuiteCRM email client -'Compose' screen. The email will be addressed to the related Contact of -the Quote. There will be no attachment and the Quote will be displayed -within the body of the email. - -*Convert To Invoice* - -With AOS you can convert Quotes to Invoices. This can be achieved by -clicking the 'Convert to Invoice' button on the Quote Detail View. - -image:100Conver_to_invoice.png[100Conver_to_invoice.png,title="100Conver_to_invoice.png"] - -This functionality will redirect users to the Edit View of an Invoice -record. Fields will be populated based on your Quote counterparts and -Line Items will be copied over. When you are ready to create the -Invoice, click the 'Save' button. Converting a Quote to an Invoice will -set the Invoice Status of the quote to 'Invoiced'. - -*Create Contract* - -As well as converting to an Invoice, AOS allows users to create a -Contract based on a Quote. This can be done by clicking the 'Create -Contract' button on the Quote Detail View. - -image:101Create_contract.png[101Create_contract.png,title="101Create_contract.png"] - -This will redirect you to the Edit View of a Contract record, pulling -through any appropriate fields from the Quote. This includes any Line -Items on the Quote. - -[[invoices-module]] -Invoices Module -^^^^^^^^^^^^^^^ - -*Creating an Invoice* - -Creating an Invoice record is very similar to creating a Quote record. -You can create an Invoice by going to the Invoices module and clicking -'Create Invoice' from within the actions bar. The first panel allows you -to specify details about the Invoice such as Status and Due Date. - -image:102Invoice_panel_1.png[102Invoice_panel_1.png,title="102Invoice_panel_1.png"] - -The second panel allows you to specify who the Invoice is for by -relating an Account and Contact to the Invoice. When you select the -Account, the Billing Address and Shipping Address are dynamically pulled -from the Account and populated into the fields on the Invoice record. - -image:103Invoice_panel_2.png[103Invoice_panel_2.png,title="103Invoice_panel_2.png"] - -*Groups and Line Items* - -AOS allows users to add Groups and Line Items to Invoices. This is -completed in the exact same way as Quotes. Please refer to Quotes -section for details on how to create Groups and Line Items. - -Sending Invoices - -To output an Invoice you can select one of following three buttons from -the Invoice Detail View. - -image:104Invoice_export.png[104Invoice_export.png,title="104Invoice_export.png"] - -AOS provides users with three methods of sending Invoices: - -* Print as PDF – Allows users to select a template and download or save -a PDF of the Invoice. -* Email PDF – Allows users to select a template then directs you to the -SuiteCRM email client 'Compose' screen. The Invoice PDF will be attached -to email and the email will be addressed to the related Contact of the -Invoice. This allows user to fill out the email body. -* Email Invoice – This directs you to the SuiteCRM email client -'Compose' screen. The email will be addressed to the related Contact of -the Invoice. There will be no attachment and the Invoice will be -displayed within the body of the email. - -[[contracts-module]] -Contracts Module -^^^^^^^^^^^^^^^^ - -*Creating a Contract* - -AOS allows users to create Contracts using the Contracts module. - -image:105Creating_a_contract.png[105Creating_a_contract.png,title="105Creating_a_contract.png"] - -When the Contract is created the Renewal Reminder Date will populate -automatically based on the amount of days specified in the AOS Settings -in Admin. A Call will be scheduled and assigned to the Contract Manger -for this date. - -*Groups and Line Items* - -AOS allows users to add Groups and Line Items for Contracts. This is -completed in the exact same way as Quotes. Please refer to Quotes -section for details on how to create Groups and Line Items. - -[[advanced-open-workflow]] -Advanced Open Workflow -~~~~~~~~~~~~~~~~~~~~~~ - -Advanced OpenWorkflow (AOW) is a module for SuiteCRM, allowing users to -create custom workflow processes. This module allows users to trigger -various system actions based on conditions from any SuiteCRM module. - -[[creating-a-workflow-process]] -Creating a Workflow Process -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You can create workflow processes by navigating to the 'WorkFlow' module -within SuiteCRM. Click the 'Create WorkFlow' button within the action -bar to start creating the process. The first panel allows users to set -up the workflow process. - -image:106Creating_a_workflow.png[106Creating_a_workflow.png,title="106Creating_a_workflow.png"] - -This allows you to specify the following: - -* Name – The name of the process. -* Assigned To - The assigned user of the workflow process. -* WorkFlow Module – A drop down list of all the modules found within the -SuiteCRM instance. This is the module the workflow is run against. For -example, When an Account is created/edited. -* Status – Active or Inactive. Only active processes will run. -* Run – Always, On Save or On Scheduler. -* Run On – All Records, Modified Records or New Records. -* Repeated Runs – If checked, the process will continue to run over and -over. Ideally this should only be checked if one of the specified -Actions negates (or will lead to the negation) of one of the specified -Conditions. -* Description – A description of the process. - -[[conditions]] -Conditions -^^^^^^^^^^ - -Adding Conditions - -Once set up, you can add conditions to a workflow process using the -conditions panel. This allows users to specify the criteria that should -trigger the workflow actions. - -image:107Adding_conditions.png[107Adding_conditions.png,title="107Adding_conditions.png"] - -To add a Condition Line you must click the 'Add Condition' button. - -_Note: You must select your WorkFlow Module on the first panel before -adding a Condition Line._ - -image:206Add_condition.png[206Add_condition.png,title="206Add_condition.png"] - -You can have an unlimited amount of Condition Lines. To add another line -click the 'Add Condition' button again and it will appear. On the line -you will have four fields; Field, Operator, Type and Value. - -*Field and Operator* - -Field is a drop down which automatically populates with all the fields -found in the WorkFlow Module. - -image:109Field_box.png[109Field_box.png,title="109Field_box.png"] - -The Field selected will determine the options available for Operator and -Type. If the field type is not a number or date then the operators -available will be 'Equal To' or 'Not Equal To'. For number and date -fields you can also choose from additional logical operators; 'Less -Than', 'Greater Than', 'Less Than or Equal To' or 'Greater Than or Equal -To'. - -image:110Operator_box.png[110Operator_box.png,title="110Operator_box.png"] - -*Condition Types* - -You can specify workflow processes to trigger on different condition -types. These are as follows: - -Value – This is used to directly compare the Field to a value. The value -type offered is dynamic to the field type of the Field selected. For -example, if the field type is a drop down then the value field type will -be the same drop down list. - -image:111Value_condition.png[111Value_condition.png,title="111Value_condition.png"] - -Field – This is used to action a workflow process when one field is -compared to another field in the record. - -image:112Field_condition.png[112Field_condition.png,title="112Field_condition.png"] - -Multiple – This can be selected if the Field is a drop down/multiselect. -This allows users to specify multiple values to action the workflow -from. - -image:113Multiple_condition.png[113Multiple_condition.png,title="113Multiple_condition.png"] - -Date – This allows you to specify the workflow to occur after/before an -amount of time from either another date field or 'Now'. For example, -when the start date of a call is 'Now + 10 minutes'. This can only be -used when the Field is a date field. The amount of time before or after -the date can be specified in Minutes, Hours, Days, Weeks or Months. - -image:114Date_condition.png[114Date_condition.png,title="114Date_condition.png"] - -*Removing Conditions* - -You can remove Condition Lines by clicking the '-' button on the left -hand side of the condition. - -image:115Removing_conditions.png[115Removing_conditions.png,title="115Removing_conditions.png"] - -[[actions]] -Actions -^^^^^^^ - -*Adding Actions* - -Actions are defined in the third panel. These specify what events should -occur when the conditions have been met. You can add an Action by -clicking the 'Add Action' button. - -image:116Adding_actions.png[116Adding_actions.png,title="116Adding_actions.png"] - -This will cause the Action Line to appear. - -image:207Action_line.png[207Action_line.png,title="207Action_line.png"] - -From the Action Line you can Select Action and give it a Name. The -actions available are; 'Create Record', 'Modify Record' and 'Send -Email'. You can specify an unlimited amount of actions for each workflow -process. - -*Create Record* - -If you select 'Create Record' you will be prompted to select a Record -Type. This is the module type of the record you are looking to create. - -image:208Create_record.png[208Create_record.png,title="208Create_record.png"] - -Once selected you can add fields or relationships to this record using -the 'Add Field' and 'Add Relationship' buttons. - -image:209Add_field-relationship1.png[209Add_field-relationship1.png,title="209Add_field-relationship1.png"] - -When Adding fields the first drop down in the line will populate with -all the fields from that module. The second drop down allows you to -specify how the value for that field is going to be derived. For most -cases the options are as follows: - -* Value – This will allow you to input the value directly using the same -field type as the field selected. -* Field – This will make the field the same value as a field found in -the WorkFlow Module. -* Date – Only selectable if the field is a date field. This will allow -you to specify the value as an amount of time after/before another date -field or 'Now'. - -image:210Adding_fields.png[210Adding_fields.png,title="210Adding_fields.png"] - -Selecting the 'Assigned-To' field also gives you more options. As well -as by value and field you can assign a user by: - -Round Robin – This will select each user in turn. - -Least Busy – This will select you with the least amount of records -assigned to you for that module. - -Random – This will select a random user. - -For each of the above options you can choose if you want you to be -selected from all users or users from a specific role. If you have the -SecuritySuite module installed you can additionally choose if you want -you to be selected from all users from a particular Security Group or -all users from a particular security group with a particular role. - -image:121Assigned_field.png[121Assigned_field.png,title="121Assigned_field.png"] - -When adding relationships you must select the related module from the -drop down list then select the record that the new record should be -related to. - -image:212Add_relationship.png[212Add_relationship.png,title="212Add_relationship.png"] - -_Note: You must selected the related module using the arrow button – The -auto completion on the text field is not currently developed._ - -*Modify Record* - -This provides the same functionality as 'Create Record' but instead of -creating a new record you are modifying the record which met the -conditions of the workflow process. With this action you can modify any -field found within the record or you can add a relationship to another -record. This is completed in the same way as 'Create Record' except you -are not required to specify the Record Type. - -*Send Email* - -The 'Send Email' action allows users to create workflow processes which -will send an email based on an template to individuals. Using this -action there are four different types of recipient. - -Email – This will send an email to a specific email address. You must -specify the email address and the email template. - -image:213Send_email_to.png[213Send_email_to.png,title="213Send_email_to.png"] - -Record Email – This will send an email to the primary email address -specified on the record which actioned the workflow process. This can -only be used if the record has an email field such as Accounts and -Contacts. For this option you only need to specify the template. - -https://suitecrm.com/wiki/media/image127.png[https://suitecrm.com/wiki/media/image127.png] - -User – This will send the email to a specified Users email address. You -must specify the recipient user and the template of the email. - -image:214Send_email_to_user.png[214Send_email_to_user.png,title="214Send_email_to_user.png"] - -Related Field – This will send an email to the primary email address -specified on a related modules record. In this case you must specify the -related module (From a drop down list) and the email template. - -image:215Email_related_field.png[215Email_related_field.png,title="215Email_related_field.png"] - -[[calculate-fields]] -Calculate Fields -++++++++++++++++ - -If you select 'Calculate Fields' from the Action dropdown the Calculate -Fields user interface will be loaded after a second and looks like the -picture below. - -image:216Calculate_fields.png[216Calculate_fields.png,title="216Calculate_fields.png"] - -*Calculate Fields - Adding parameters* - -It is possible to add parameters to the formulas by using the dropdown -in the Parameters section of the Calculate Fields’s user interface. The -dropdown contains all of the (basic and custom) fields which belongs to -the module selected in the basic fields section. - -To add a parameter, select the field from the dropdown and click on the -Add parameter button. After this action, a new line appears in the -parameter table with the name of the field and the given identifier. - -For some fields (dropdowns and multi-selects) an additional dropdown -shown up where the user can select if the raw or the formatted value -should be used in Calculated Fields. The raw format means the value -which is stored in the database and the formatted value means the label -for that database value. - -To remove a parameter from the table, simply click on the minus button -in the row of the parameter. Be aware, that if you remove a parameter, -all of the identifiers are recalculated, so the identifiers could change -for fields! - -image:217Add_parameter.png[217Add_parameter.png,title="217Add_parameter.png"] - -The identifier is used to reference this field when the user creates the -formula. For example all appearances of the \{P0} identifier will be -replaced with the Account’s name in the formula. All parameters are like -\{Px} where x is the sequential order of the parameter. The amount of -the parameters is not limited. - -*Calculate Fields - Adding relation parameters* - -Relation parameters are very similar to the regular parameters, the only -difference is that the user first selects an entity which is in a -one-to-one or one-to-many relationship with the actual entity. - -To add a relation parameter, select the relation first, and then select -the field from the connected entity and push the Add relation parameter -button. After this action, a new line appears in the relation parameter -table with the name of the relationship, the name of the field and the -given identifier. - -As for parameters for some relation parameter fields (dropdowns and -multi-selects) an additional dropdown shown up where the user can select -if the raw or the formatted value should be used in Calculate Fields. - -To remove a relation parameter from the table, simply click on the minus -button in the row of the relation parameter. Be aware, that if you -remove a relation parameter, all of the identifiers are recalculated, so -the identifiers could change for fields! - -image:128Adding_relation_parameter.png[128Adding_relation_parameter.png,title="128Adding_relation_parameter.png"] - -The identifier is used to reference this field when the user creates the -formula. For example all appearances of the \{R0} identifier will be -replaced with the creator user‘s username in the formula. All relation -parameters are like \{Rx} where x is the sequential order of the -relation parameter. The amount of the relation parameters is not -limited. - -*Calculate Fields - Creating formula for a field* - -In the Formulas part of the user interface the user can add formulas for -fields of the actual entity. - -To add a formula, select a field from the dropdown first and then push -the Add formula button. After this action, a new line appears in the -formula table with the name of the field and with the place for the -formula. - -To remove a formula from the table, simply click on the minus button in -the row of the formula. - -image:129Add_formula.png[129Add_formula.png,title="129Add_formula.png"] - -The formula is a textbox where the user can write the formulas. The -module evaluates the formula on the given time (on save, on scheduler -run or both) and fills the selected field with the evaluated value. - -The formula can contain any text (with full UTF-8 support), but only the -function parts (functions with parameters between ‘\{‘ and ‘}’) are -evaluated. For example and with the parameters added in the previous -sections, if we fill the formula like: Account \{P0} created by user -name \{R0}, then the description field will have the following value -after save: Account My Account created by user name MyUser (implying the -account’s name is My Account and the creator user’s username is MyUser). - -The Calculate Fields has many built-in functions which allows the user -to build complex formulas to achieve various goals. These functions are -described in the next section. - -*Calculate Fields - Usable functions* - -As it is mentioned above, all of the functions are wrapped between ‘\{‘ -and ‘}’ signs, and they look like \{functionName(parameter1; parameter2; -…)}. The count of the parameters are different for the different -functions. The module evaluates the functions and changes them with -their result in the formula. - -The functions can be embedded into each other (using a result of a -function as a parameter for another function) like in this example: - -
 \{power(\{subtract(\{divide(\{add(\{multiply(10;
-2)}; 12)}; 8)}; 1)}; 2)} 
- -This function is the formalised look of the following mathematical -expression: - -
 ((((10 * 2) + 12) / 8) – 1)2 
- -The functions are divided to six groups. These groups are described in -the next section of the document. - -[[logical-functions]] -Logical Functions - -Logical functions are returning true or false in the form of 1 and 0 so -checkboxes typed fields can be filled with these functions. They can be -also used as the logical condition for the ifThenElse function. - -*equal* - -[cols=",",] -|================================================================ -|Signature |\{equal(parameter1;parameter2)} -|Parameters |parameter1: can be any value of any type -|parameter2: can be any value of any type -|Description |Determines if *parameter1* equals with *parameter2* -|Returns |1 if the two parameters are equal or 0 if not -|Example call |\{equal(1; 2)} returns 0 -|================================================================ - -*notEqual* - -[cols=",",] -|==================================================================== -|Signature |\{notEqual(parameter1; parameter2)} -|Parameters |parameter1: can be any value of any type -|parameter2: can be any value of any type -|Description |Determines if *parameter1* not equals with *parameter2* -|Returns |0 if the two parameters are equal or 1 if not -|Example call |\{notEqual(1; 2)} returns 1 -|==================================================================== - -*greaterThan* - -[cols=",",] -|================================================================= -|Signature |\{greaterThan(parameter1; parameter2)} -|Parameters |parameter1: can be any value of any type -|parameter2: can be any value of any type -|Description |Determines if *parameter1* greater than *parameter2* -|Returns |1 if *parameter1* greater than *parameter2*, 0 if not -|Example call |\{greaterThan(3; 3)} returns 0 -|================================================================= - -*greaterThanOrEqual* - -[cols=",",] -|======================================================================= -|Signature |\{greaterThanOrEqual(parameter1; parameter2)} - -|Parameters |parameter1: can be any value of any type - -|parameter2: can be any value of any type - -|Description |Determines if *parameter1* greater than or equal -*parameter2* - -|Returns |1 if *parameter1* greater than or equal *parameter2*, 0 if not - -|Example call |\{greaterThanOrEqual(3; 3)} returns 1 -|======================================================================= - -*lessThan* - -[cols=",",] -|============================================================== -|Signature |\{lessThan(parameter1; parameter2)} -|Parameters |parameter1: can be any value of any type -|parameter2: can be any value of any type -|Description |Determines if *parameter1* less than *parameter2* -|Returns |1 if *parameter1* less than *parameter2*, 0 if not -|Example call |\{lessThan(3; 3)} returns 0 -|============================================================== - -*lessThanOrEqual* - -[cols=",",] -|======================================================================= -|Signature |\{lessThanOrEqual(parameter1; parameter2)} -|Parameters |parameter1: can be any value of any type -|parameter2: can be any value of any type -|Description |Determines if *parameter1* less than or equal *parameter2* -|Returns |1 if *parameter1* less than or equal *parameter2*, 0 if not -|Example call |\{lessThanOrEqual(3; 3)} returns 1 -|======================================================================= - -*empty* - -[cols=",",] -|=============================================== -|Signature |\{empty(parameter)} -|Parameters |parameter: text value -|Description |Determines if *parameter* is empty -|Returns |1 if *parameter* is empty, 0 if not -|Example call |\{empty(any text)} returns 0 -|=============================================== - -*notEmpty* - -[cols=",",] -|=================================================== -|Signature |\{notEmpty(parameter)} -|Parameters |parameter: text value -|Description |Determines if *parameter* is not empty -|Returns |1 if *parameter* is not empty, 0 if empty -|Example call |\{notEmpty(any text)} returns 1 -|=================================================== - -*not* - -[cols=",",] -|========================================================= -|Signature |\{not(parameter)} -|Parameters |parameter: logical value -|Description |Negates the logical value of the *parameter* -|Returns |1 if *parameter* is 0, 0 if *parameter* is 1 -|Example call |\{not(0)} returns 1 -|========================================================= - -*and* - -[cols=",",] -|======================================================================= -|Signature |\{and(parameter1; parameter2)} - -|Parameters |parameter1: logical value - -|parameter2: logical value - -|Description |Applies the AND logical operator to two logical values - -|Returns |1 if *parameter1* and *parameter2* is 1, 0 if any parameters -are 0 - -|Example call |\{and(1; 0)} returns 0 -|======================================================================= - -*or* - -[cols=",",] -|======================================================================= -|Signature |\{or(parameter1; parameter2)} - -|Parameters |parameter1: logical value - -|parameter2: logical value - -|Description |Applies the OR logical operator to two logical values - -|Returns |1 if *parameter1* or *parameter2* is 1, 0 if both parameters -are 0 - -|Example call |\{or(1; 0)} returns 1 -|======================================================================= - -[[text-functions]] -Text Functions - -Text functions are used to manipulate text in various ways. All the -functions listed here are fully supports UTF-8 texts, so special -characters should not raise any problems. - -*substring* - -[cols=",",] -|======================================================================= -|Signature |\{substring(text; start; length)} - -|Parameters |text: text value - -|start: decimal value - -|length [optional parameter]: decimal value - -|Description |Cuts the substring of a text field from *start*. If the -*length* optional parameter is not set, then it cuts all characters -until the end of the string, otherwise cuts the provided *length*. -Indexing of a text’s characters starting from 0. - -|Returns |Substring of the given text - -|Example call |\{substring(This is my text; 5)} returns is my text - -|\{substring(This is my text; 5; 5)} returns is my -|======================================================================= - -*length* - -[cols=",",] -|=============================================== -|Signature |\{length(parameter)} -|Parameters |parameter: text value -|Description |Count the characters in a text. -|Returns |The count of the characters in a text. -|Example call |\{length(sample text)} returns 11 -|=============================================== - -*replace* - -[cols=",",] -|======================================================================= -|Signature |\{replace(search; replace; subject)} - -|Parameters |search: text value - -|replace: text value - -|subject: text value - -|Description |Replace all occurrences of *search* to *replace* in the -text *subject*. - -|Returns |*subject* with replaced values. - -|Example call |\{replace(apple; orange; This is an apple tree)} returns -This is an orange tree -|======================================================================= - -*position* - -[cols=",",] -|======================================================================= -|Signature |\{position(subject; search)} - -|Parameters |subject: text value - -| |search: text value - -|Description |Find position of first occurrence of *search* in a -*subject* - -|Returns |Numeric position of *search* in *subject* or -1 if *search* -not present in *subject* - -|Example call |\{position(Where is my text?; text)} returns 12 -|======================================================================= - -*lowercase* - -[cols=",",] -|======================================================================= -|Signature |\{lowercase(parameter)} - -|Parameters |parameter: text value - -|Description |Make text lowercase - -|Returns |The lowercased text. - -|Example call |\{lowercase(ThIs iS a sAmPlE tExT)} returns this is a -sample text -|======================================================================= - -*uppercase* - -[cols=",",] -|======================================================================= -|Signature |\{uppercase(parameter)} - -|Parameters |parameter: text value - -|Description |Make text uppercase - -|Returns |The uppercased text. - -|Example call |\{uppercase(ThIs iS a sAmPlE tExT)} returns THIS IS A -SAMPLE TEXT -|======================================================================= - -[[mathematical-functions]] -Mathematical functions - -Mathematical functions are used to manipulate numbers in various ways. -Several mathematical operators are implemented as functions in Calculate -Fields. - -*add* - -[cols=",",] -|================================================= -|Signature |\{add(parameter1; parameter2)} -|Parameters |parameter1: number value -|parameter2: number value -|Description |Adds *parameter1* and *parameter2* -|Returns |The sum of *parameter1* and *parameter2* -|Example call |\{add(3.12; 4.83)} returns 7.95 -|================================================= - -*subtract* - -[cols=",",] -|========================================================= -|Signature |\{subtract(parameter1; parameter2)} -|Parameters |parameter1: number value -|parameter2: number value -|Description |Subtracts *parameter2* from *parameter1* -|Returns |The distinction of *parameter2* and *parameter1* -|Example call |\{subtract(8; 3)} returns 5 -|========================================================= - -*multiply* - -[cols=",",] -|===================================================== -|Signature |\{multiply(parameter1; parameter2)} -|Parameters |parameter1: number value -|parameter2: number value -|Description |Multiplies *parameter1* and *parameter2* -|Returns |The product of *parameter1* and *parameter2* -|Example call |\{multiply(2; 4)} returns 8 -|===================================================== - -*divide* - -[cols=",",] -|====================================================== -|Signature |\{divide(parameter1; parameter2)} -|Parameters |parameter1: number value -|parameter2: number value -|Description |Divides *parameter2* with *parameter1* -|Returns |The division of *parameter2* and *parameter1* -|Example call |\{divide(8; 2)} returns 4 -|====================================================== - -*power* - -[cols=",",] -|============================================================= -|Signature |\{power(parameter1; parameter2)} -|Parameters |parameter1: number value -|parameter2: number value -|Description |Raises *parameter1* to the power of *parameter2* -|Returns |*parameter1* raised to the power of *parameter2* -|Example call |\{power(2; 7)} returns 128 -|============================================================= - -*squareRoot* - -[cols=",",] -|====================================================== -|Signature |\{squareRoot(parameter)} -|Parameters |parameter: number value -|Description |Calculates the square root of *parameter* -|Returns |The square root of *parameter* -|Example call |\{squareRoot(4)} returns 2 -|====================================================== - -*absolute* - -[cols=",",] -|========================================================= -|Signature |\{absolute(parameter)} -|Parameters |parameter: number value -|Description |Calculates the absolute value of *parameter* -|Returns |The absolute value of *parameter* -|Example call |\{absolute(-4)} returns 4 -|========================================================= - -[[date-functions]] -Date functions - -There are several date functions implemented in Calculate Fields, so the -user can manipulate dates in many ways. Most of the functions uses a -format parameter, which is used to set the result of the functions -formatted as the user wants to. The options for these formats are -equivalent with the PHP format parameters: - -[cols=",,",options="header",] -|======================================================================= -|Format character |Description |Example returned values -|*For day* - -|style="text-align: center;" | d |Day of the month, 2 digits with -leading zeros |01 to 31 - -|style="text-align: center;" | D |A textual representation of a day, -three letters |Mon through Sun - -|style="text-align: center;" | j |Day of the month without leading zeros -|1 to 31 - -|style="text-align: center;" | l |A full textual representation of the -day of the week |Sunday through Saturday - -|style="text-align: center;" | N |ISO-8601 numeric representation of the -day of the week |1 (for Monday) through 7 (for Sunday) - -|style="text-align: center;" | S |English ordinal suffix for the day of -the month, 2 characters |st, nd, rd or th. Works well with j - -|style="text-align: center;" | w |Numeric representation of the day of -the week |0 (for Sunday) through 6 (for Saturday) - -|style="text-align: center;" | z |The day of the year (starting from 0) -|0 through 365 - -|*For week* - -|style="text-align: center;" | W |ISO-8601 week number of year, weeks -starting on Monday |42 (the 42nd week in the year) - -|*For month* - -|style="text-align: center;" | F |A full textual representation of a -month, such as January or March |January through December - -|style="text-align: center;" | m |Numeric representation of a month, -with leading zeros |01 through 12 - -|style="text-align: center;" | M |A short textual representation of a -month, three letters |Jan through Dec - -|style="text-align: center;" | n |Numeric representation of a month, -without leading zeros |1 through 12 - -|style="text-align: center;" | t |Number of days in the given month |28 -through 31 - -|*For year* - -|style="text-align: center;" | L |Whether it's a leap year |1 if it is a -leap year, 0 otherwise - -|style="text-align: center;" | o |ISO-8601 year number. This has the -same value as Y, except that if the ISO week number (W) belongs to the -previous or next year, that year is used instead |1999 or 2003 - -|style="text-align: center;" | Y |A full numeric representation of a -year, 4 digits |1999 or 2003 - -|style="text-align: center;" | y |A two digit representation of a year -|99 or 03 - -|*For time* - -|style="text-align: center;" | a |Lowercase Ante meridiem and Post -meridiem |am or pm - -|style="text-align: center;" | A |Uppercase Ante meridiem and Post -meridiem |AM or PM - -|style="text-align: center;" | B |Swatch Internet time |000 through 999 - -|style="text-align: center;" | g |12-hour format of an hour without -leading zeros |1 through 12 - -|style="text-align: center;" | G |24-hour format of an hour without -leading zeros |0 through 23 - -|style="text-align: center;" | h |12-hour format of an hour with leading -zeros |01 through 12 - -|style="text-align: center;" | H |24-hour format of an hour with leading -zeros |00 through 23 - -|style="text-align: center;" | i |Minutes with leading zeros |00 to 59 - -|style="text-align: center;" | s |Seconds, with leading zeros |00 -through 59 - -|*For timezone* - -|style="text-align: center;" | e |Timezone identifier |UTC, GMT, -Atlantic/Azores - -|style="text-align: center;" | l |Whether or not the date is in daylight -saving time |1 if Daylight Saving Time, 0 otherwise - -|style="text-align: center;" | O |Difference to Greenwich time (GMT) in -hours |+0200 - -|style="text-align: center;" | P |Difference to Greenwich time (GMT) -with colon between hours and minutes |+02:00 - -|style="text-align: center;" | T |Timezone abbreviation |EST, MDT - -|style="text-align: center;" | Z |Timezone offset in seconds. The offset -for timezones west of UTC is always negative, and for those east of UTC -is always positive. |-43200 through 50400 - -|*For full date/time* - -|style="text-align: center;" | c |ISO 8601 date -|2004-02-12T15:19:21+00:00 - -|style="text-align: center;" | r |RFC 2822 formatted date |Thu, 21 Dec -2000 16:01:07 +0200 - -|style="text-align: center;" | U |Seconds since the Unix Epoch (January -1 1970 00:00:00 GMT) | -|======================================================================= - -For all functions without timestamp parameter, we assume that the -current date/time is 2016.04.29. 15:08:03 - -*date* - -[cols=",",] -|===================================================== -|Signature |\{date(format; timestamp)} -|Parameters |format: format text -|timestamp: date/time value -|Description |Creates a date in the given format -|Returns |*timestamp* in the given *format* -|Example call |\{date(ymd; 2016-02-11)} returns 160211 -|===================================================== - -*now* - -[cols=",",] -|============================================================= -|Signature |\{now(format)} -|Parameters |format: format text -|Description |Creates the actual date/time in the given format -|Returns |Current date/time in the given *format* -|Example call |\{now(Y-m-d H:i:s)} returns 2016-04-29 15:08:03 -|============================================================= - -*yesterday* - -[cols=",",] -|=================================================================== -|Signature |\{yesterday(format)} -|Parameters |format: format text -|Description |Creates yesterday’s date/time in the given format -|Returns |Yesterday’s date/time in the given *format* -|Example call |\{yesterday(Y-m-d H:i:s)} returns 2016-04-28 15:08:03 -|=================================================================== - -*tomorrow* - -[cols=",",] -|================================================================== -|Signature |\{tomorrow(format)} -|Parameters |format: format text -|Description |Creates tomorrow’s date/time in the given format -|Returns |Tomorrow’s date/time in the given *format* -|Example call |\{tomorrow(Y-m-d H:i:s)} returns 2016-04-30 15:08:03 -|================================================================== - -*datediff* - -[cols=",",] -|================================================================== -|Signature |\{datediff(timestamp1; timestamp2; unit)} -|Parameters |timestamp1: date/time value -|timestamp2: date/time value -|unit: years/months/days/hours/minutes/seconds; default: days -|Description |Subtracts *timestamp2* from *timestamp1* -|Returns |The difference between the two dates returned in *unit* -|Example call |\{datediff(2016-02-01; 2016-04-22; days)} returns 81 -|================================================================== - -*addYears* - -[cols=",",] -|============================================================== -|Signature |\{addYears(format; timestamp; amount)} -|Parameters |format: format text -|timestamp: date/time value -|amount: decimal number -|Description |Adds *amount* years to *timestamp* -|Returns |Incremented date in *format* -|Example call |\{addYears(Ymd; 2016-04-22; 1)} returns 20170422 -|============================================================== - -*addMonths* - -[cols=",",] -|=============================================================== -|Signature |\{addMonths(format; timestamp; amount)} -|Parameters |format: format text -|timestamp: date/time value -|amount: decimal number -|Description |Adds *amount* months to *timestamp* -|Returns |Incremented date in *format* -|Example call |\{addMonths(Ymd; 2016-04-22; 1)} returns 20160522 -|=============================================================== - -*addDays* - -[cols=",",] -|============================================================= -|Signature |\{addDays(format; timestamp; amount)} -|Parameters |format: format text -|timestamp: date/time value -|amount: decimal number -|Description |Adds *amount* days to *timestamp* -|Returns |Incremented date in *format* -|Example call |\{addDays(Ymd; 2016-04-22; 1)} returns 20160423 -|============================================================= - -*addHours* - -[cols=",",] -|======================================================================= -|Signature |\{addHours(format; timestamp; amount)} - -|Parameters |format: format text - -|timestamp: date/time value - -|amount: decimal number - -|Description |Adds *amount* hours to *timestamp* - -|Returns |Incremented date in *format* - -|Example call |\{addHours(Ymd H:i:s; 2016-04-22 23:30; 5)} returns -20160423 04:30:00 -|======================================================================= - -*addMinutes* - -[cols=",",] -|======================================================================= -|Signature |\{addMinutes(format; timestamp; amount)} - -|Parameters |format: format text - -|timestamp: date/time value - -|amount: decimal number - -|Description |Adds *amount* minutes to *timestamp* - -|Returns |Incremented date in *format* - -|Example call |\{addMinutes(Ymd H:i:s; 2016-04-22 22:58; 5)} returns -20160422 23:03:00 -|======================================================================= - -*addSeconds* - -[cols=",",] -|======================================================================= -|Signature |\{addSeconds(format; timestamp; amount)} - -|Parameters |format: format text - -|timestamp: date/time value - -|amount: decimal number - -|Description |Adds *amount* seconds to *timestamp* - -|Returns |Incremented date in *format* - -|Example call |\{addSeconds(Ymd H:i:s; 2016-04-22 22:58; 5)} returns -20160422 22:58:05 -|======================================================================= - -*subtractYears* - -[cols=",",] -|=================================================================== -|Signature |\{subtractYears(format; timestamp; amount)} -|Parameters |format: format text -|timestamp: date/time value -|amount: decimal number -|Description |Subtracts *amount* years from *timestamp* -|Returns |Decremented date in *format* -|Example call |\{subtractYears(Ymd; 2016-04-22; 5)} returns 20110422 -|=================================================================== - -*subtractMonths* - -[cols=",",] -|==================================================================== -|Signature |\{subtractMonths(format; timestamp; amount)} -|Parameters |format: format text -|timestamp: date/time value -|amount: decimal number -|Description |Subtracts *amount* months from *timestamp* -|Returns |Decremented date in *format* -|Example call |\{subtractMonths(Ymd; 2016-04-22; 5)} returns 20151122 -|==================================================================== - -*subtractDays* - -[cols=",",] -|================================================================== -|Signature |\{subtractDays(format; timestamp; amount)} -|Parameters |format: format text -|timestamp: date/time value -|amount: decimal number -|Description |Subtracts *amount* days from *timestamp* -|Returns |Decremented date in *format* -|Example call |\{subtractDays(Ymd; 2016-04-22; 5)} returns 20160417 -|================================================================== - -*subtractHours* - -[cols=",",] -|======================================================================= -|Signature |\{subtractHours(format; timestamp; amount)} - -|Parameters |format: format text - -|timestamp: date/time value - -|amount: decimal number - -|Description |Subtracts *mount* hours from *timestamp* - -|Returns |Decremented date in *format* - -|Example call |\{subtractHours(Ymd H:i:s; 2016-04-22 12:37; 5)} returns -20160422 07:37:00 -|======================================================================= - -*subtractMinutes* - -[cols=",",] -|======================================================================= -|Signature |\{subtractMinutes(format; timestamp; amount)} - -|Parameters |format: format text - -|timestamp: date/time value - -|amount: decimal number - -|Description |Subtracts *amount* minutes from *timestamp* - -|Returns |Decremented date in *format* - -|Example call |\{subtractMinutes(Ymd H:i:s; 2016-04-22 12:37; 5)} -returns 20160422 12:32:00 -|======================================================================= - -*subtractSeconds* - -[cols=",",] -|======================================================================= -|Signature |\{subtractSeconds(format; timestamp; amount)} - -|Parameters |format: format text - -|timestamp: date/time value - -|amount: decimal number - -|Description |Subtracts *amount* minutes from *timestamp* - -|Returns |Decremented date in *format* - -|Example call |\{subtractSeconds(Ymd H:i:s; 2016-04-22 12:37; 5)} -returns 20160422 12:36:55 -|======================================================================= - -[[control-functions]] -Control Functions - -There is only one control function implemented in Calculate Fields so -far, but this function ensures that the user can write very complex -formulas with conditions. Since the functions can be embedded in each -other, the user can write junctions with many branches. - -*ifThenElse* - -[cols=",",] -|======================================================================= -|Signature |\{ifThenElse(condition; trueBranch; falseBranch)} - -|Parameters |condition: logical value - -|trueBranch: any expression - -|falseBranch: any expression - -|Description |Selects one of the two branches depending on *condition* - -|Returns |*trueBranch* if *condition* is true, *falseBranch* otherwise - -|Example call |\{ifThenElse(\{equal(1; 1)}; 1 equals 1; 1 not equals 1)} -returns 1 equals 1 -|======================================================================= - -[[counters]] -Counters - -There are several counters implemented in Calculate Fields which can be -used in various scenarios. - -The counters sorted into two groups: - -1. *Global counters:* Counters which are incremented every time an -affected formula is evaluated -2. *Daily counters:* Counters which resets every day. (Starting from 1) - -In this chapter we assume that the counters current value is 4, so the -incremented value will be 5 with the given format. - -*GlobalCounter* - -[cols=",",] -|======================================================================= -|Signature |\{GlobalCounter(name; numberLength)} - -|Parameters |name: any text - -| |numberLength: decimal number - -|Description |Increments and returns the counter for *name* with length -*numberLength* - -|Returns |Counter with length *numberLength* - -|Example call |\{GlobalCounter(myName; 4)} returns 0005 -|======================================================================= - -*GlobalCounterPerUser* - -[cols=",",] -|======================================================================= -|Signature |\{GlobalCounterPerUser(name; numberLength)} - -|Parameters |name: any text - -| |numberLength: decimal number - -|Description |Increments and returns the counter for *name* for the user -who creates the entity with length *numberLength* - -|Returns |Counter with length *numberLength* - -|Example call |\{GlobalCounterPerUser(myName; 3)} returns 005 -|======================================================================= - -*GlobalCounterPerModule* - -[cols=",",] -|======================================================================= -|Signature |\{GlobalCounterPerModule(name; numberLength)} - -|Parameters |name: any text - -| |numberLength: decimal number - -|Description |Increments and returns the counter for *name* for the -module of the entity with length *numberLength* - -|Returns |Counter with length *numberLength* - -|Example call |\{GlobalCounterPerModule(myName; 2)} returns 05 -|======================================================================= - -*GlobalCounterPerUserPerModule* - -[cols=",",] -|======================================================================= -|Signature |\{GlobalCounterPerUserPerModule(name; numberLength)} - -|Parameters |name: any text - -| |numberLength: decimal number - -|Description |Increments and returns the counter for *name* for the user -who creates the entity and for the module of the entity with length -*numberLength* - -|Returns |Counter with length *numberLength* - -|Example call |\{GlobalCounterPerUserPerModule(myName; 1)} returns 5 -|======================================================================= - -*DailyCounter* - -[cols=",",] -|======================================================================= -|Signature |\{DailyCounter(name; numberLength)} - -|Parameters |name: any text - -| |numberLength: decimal number - -|Description |Increments and returns the counter for *name* with length -*numberLength* - -|Returns |Counter with length *numberLength*, or if the counter is not -incremented this day then 1 with length *numberLength* - -|Example call |\{DailyCounter(myName; 1)} returns 5 -|======================================================================= - -*DailyCounterPerUser* - -[cols=",",] -|======================================================================= -|Signature |\{DailyCounterPerUser(name; numberLength)} - -|Parameters |name: any text - -| |numberLength: decimal number - -|Description |Increments and returns the counter for *name* for the user -who creates the entity with length *numberLength* - -|Returns |Counter with length *numberLength*, or if the counter is not -incremented this day for this user then 1 with length *numberLength* - -|Example call |\{DailyCounter(myName; 1)} returns 5 -|======================================================================= - -*DailyCounterPerModule* - -[cols=",",] -|======================================================================= -|Signature |\{DailyCounterPerModule(name; numberLength)} - -|Parameters |name: any text - -| |numberLength: decimal number - -|Description |Increments and returns the counter for *name* for the -module of the entity with length *numberLength* - -|Returns |Counter with length *numberLength*, or if the counter is not -incremented this day for this module then 1 with length *numberLength* - -|Example call |\{DailyCounterPerModule(myName; 1)} returns 5 -|======================================================================= - -*DailyCounterPerUserPerModule* - -[cols=",",] -|======================================================================= -|Signature |\{DailyCounterPerUserPerModule(name; numberLength)} - -|Parameters |name: any text - -| |numberLength: decimal number - -|Description |Increments and returns the counter for *name* for the user -who creates the entity and for the module of the entity with length -*numberLength* - -|Returns |Counter with length *numberLength*, or if the counter is not -incremented this day for the user who creates the entity and for this -module then 1 with length *numberLength* - -|Example call |\{DailyCounterPerUserPerModule(myName; 1)} returns 5 -|======================================================================= - -[[example]] -Example - -*Calculate monthly fee for an opportunity* - -*Use Case* - -The user would like to calculate a monthly fee of an opportunity to a -custom field by dividing the amount of the opportunity by the duration. - -*Setup* - -Our opportunities module has a dropdown field called Duration with -values: (database value in brackets) 6 months [6], 1 year [12], 2 years -[24]. There is also a currency field called Monthly. - -*Workflow* - -Go to WorkFlow module and create a new WorkFlow. Set the base options -like the following: - -[cols=",",] -|===================================================== -|*Name:* as you wish |*WorkFlow Module:* Opportunities -|*Status:* Active |*Run:* Only on save -|*Run on:* All records |*Repeated runs:* checked -|===================================================== - -image:130Example_workflow.png[130Example_workflow.png,title="130Example_workflow.png"] - -We do not create any conditions, since we would like the WorkFlow to run -on all opportunities. - -Now, add an action and select Calculate Fields from the dropdown. - -Then, add two fields from Opportunities as parameters. First, select -Opportunity amount (amount) and add it as a parameter (it will be \{P0}) -then select Duration and the raw value option from the data type -dropdown and add it as parameter two (it will be \{P1}). There is no -need to add any relational parameters for this formula. - -Now, add a formula for the monthly field and fill the textbox with the -following formula: - -
 \{divide(\{P0}; \{P1})} 
- -So the whole action should look like this: - -https://suitecrm.com/wiki/images/1/13/ExampleCF_updated1.png[https://suitecrm.com/wiki/images/1/13/ExampleCF_updated1.png] - -Save the WorkFlow and create a new Opportunity: - -https://suitecrm.com/wiki/images/5/5a/ExampleCF_orig2.png[https://suitecrm.com/wiki/images/5/5a/ExampleCF_orig2.png] - -As you can see, we did not even add the monthly field to the EditView, -because we don’t want to force the user to make calculations. Save the -Opportunity and check the results on the DetailView: - -https://suitecrm.com/wiki/images/4/4b/ExampleCF_orig3.png[https://suitecrm.com/wiki/images/4/4b/ExampleCF_orig3.png] - -''''' - -AOW Calculated Fields was contributed by http://www.dtbc.eu/[diligent -technology & business consulting GmbH] - -''''' - -*Removing Actions* - -You can remove Action Lines by clicking the 'X' button on the top right -hand side of the Action. - -image:131Removing_actions.png[131Removing_actions.png,title="131Removing_actions.png"] - -*Removing Field and Relationship Lines* - -You can remove Field and Relationship Lines by clicking the '-' button -on the left hand side of the Action. - -image:132Removing_fields.png[132Removing_fields.png,title="132Removing_fields.png"] - -[[process-audit]] -Process Audit -^^^^^^^^^^^^^ - -Advanced OpenWorkflow allows users to audit your processes. In the -Detail View of each WorkFlow record there is a sub-panel called -'Processed Flows'. - -https://suitecrm.com/wiki/media/image132.png[https://suitecrm.com/wiki/media/image132.png] - -This lists all the workflow processes which have been actioned including -details on the record which actioned the flow, its status and the date -it was created. - -https://suitecrm.com/wiki/media/image133.png[https://suitecrm.com/wiki/media/image133.png] - -You can view this information at a higher level by clicking the 'View -Process Audit' button within the module action bar. This will show all -the processes that have run for all the WorkFlow records. - -[[tutorials]] -Tutorials -^^^^^^^^^ - -*Customers to Target List* - -This tutorial will show you how to create a workflow process to add -accounts who are customers to a Target-List when the record is created -or modified. Set Up - -1. Start by navigating to the WorkFlow module and clicking 'Create -Workflow' from the the action bar. -2. Give your workflow a Name such as 'Populate Target List. -3. Select Accounts as the WorkFlow Module. -4. Ensure Repeated Runs is NOT selected and the Status is Active (This -should be done by default). Optionally you can change the Assigned-To -and add a Description. - -*Conditions* - -1. Create a new Condition Line by clicking the 'Add Condition' button. -2. Select 'Type' from the Field drop down. -3. Keep the Operator as 'Equals To' and the Type as 'Value'. -4. From the Value drop down select 'Customer'. - -Once these steps have been completed the Conditions panel should look -like this: - -image:134Conditions.png[134Conditions.png,title="134Conditions.png"] - -*Actions* - -Create a new Action by clicking the 'Add Action' button. - -1. Select 'Modify Record from the Select Action drop down list. -2. Using the Name field, give the action a name such as 'Add to Target -List' -3. Add a Relationship Line by clicking the 'Add Relationship' button. -4. A drop down will appear above the 'Add Relationship' button. Select -the relationship from this drop down box. In this case we are looking -for 'Target Lists: Prospect List' -5. This will populate the rest of the line. Click the arrow button next -to the relate field to select your target list. - -Once these steps have been completed your Actions panel should look like -this: - -image:218Add_to_target_list_actions.png[218Add_to_target_list_actions.png,title="218Add_to_target_list_actions.png"] - -*Cases Reminder* - -This tutorial will show you how to create a workflow process to notify -the assigned user and then a particular manger user when an open Case -has not been updated/modified within two days. Set Up - -1. Start by navigating to the WorkFlow module and clicking 'Create -Workflow' from the the action bar. -2. Give your workflow a Name such as 'Case Escalation'. -3. Select Cases as the WorkFlow Module. -4. Ensure Repeated Runs is NOT selected and the Status is Active (This -should be done by default). Optionally you can change the Assigned-To -and add a Description. - -Once these steps have been completed the first panel should look like -this: - -image:136Case_Escalation.png[136Case_Escalation.png,title="136Case_Escalation.png"] - -*Conditions* - -Create a new Condition Line by clicking the 'Add Condition' button. - -Select 'Date Modified' from the Field drop down. - -Change the Operator to 'Less Than or Equal To' and the Type to 'Date' - -From the Value fields select 'Now', '-', '2', 'Days' in order. - -Once these steps have been completed the Conditions panel should look -like this: - -image:137Conditions.png[137Conditions.png,title="137Conditions.png"] - -Repeat step 1. - -This time select 'Status' from the Field drop down. - -Keep the Operator as 'Equals To' and change the Type to 'Multiple'. - -From the Value multi-select field select any values which signify an -open case - -Once these steps have been completed the Conditions panel should look -like this: - -image:138Conditions.png[138Conditions.png,title="138Conditions.png"] - -*Actions* - -1. Create a new Action by clicking the 'Add Action' button. -2. Select 'Send Email from the Select Action down down list. -3. Give the action a Name such as 'Assigned User Reminder' -4. On the Email Line select 'Related Field' from the first drop down, -'Users: Assigned To' from the second drop down and a email template from -the third drop down. - -Once these steps have been completed the Actions panel should look like -this: - -image:219Assigned_user_reminder_actions.png[219Assigned_user_reminder_actions.png,title="219Assigned_user_reminder_actions.png"] - -\1. Repeat steps 1, 2 and 3 but change the name of this action to -'Manager Escalation Email'. 2. On the Email Line select 'User' and then -select you who should receive the email. Select an email template from -the third drop down. 3. When you are finished click 'Save' to create -your workflow. Once these steps have been completed the Actions panel -should look like this: - -image:220Double_action.png[220Double_action.png,title="220Double_action.png"] - -*Follow Up Web Leads* - -This tutorial will show you how to create a workflow process to assign -web Leads to a particular user from a particular role within SuiteCRM. -This user will be chosen by round robin. The workflow process will also -set a follow up call for one day after the Lead is created. - -''Note: You can change the Sales role to any role found in your own -system. '' - -*Set Up* - -1. Start by navigating to the WorkFlow module and clicking 'Create -Workflow' from the the action bar. -2. Give your workflow a Name such as 'Web Lead Assignment and Follow -Up'. -3. Select Leads as the WorkFlow Module. -4. Ensure Repeated Runs is NOT selected and the Status is Active (This -should be done by default). Optionally you can change the Assigned-To -and add a Description. - -Once these steps have been completed the first panel should look like -this: - -image:141Set_up.png[141Set_up.png,title="141Set_up.png"] - -*Conditions* - -1. Create a new Condition Line by clicking the 'Add Condition' button. -2. Select 'Lead Source' from the Field drop down. -3. Keep the Operator as 'Equals To' and the Type as 'Value' -4. From the Value drop down select our condition, 'Web Site' - -Once these steps have been completed the Conditions panel should look -like this: - -image:142Conditions.png[142Conditions.png,title="142Conditions.png"] - -*Actions* - -1. Create a new Action by clicking the 'Add Action' button. -2. Select 'Modify Record' from the Select Action down down list. -3. Using the Name field, give the action a name such as 'Assign to -Sales' -4. Add a Field Line by clicking the 'Add Field' button. -5. Select 'Assigned-To' from the new drop down box that has appeared -above the 'Add Field' button. -6. Change the middle drop down box from 'Value' to 'Round Robin' -7. Change the third drop down box from 'ALL Users' to 'ALL Users in -Role' -8. Select from forth drop down box on the line 'Sales'. - -Once these steps have been completed the Actions panel should look like -this: - -image:221Assign_to_sales_action.png[221Assign_to_sales_action.png,title="221Assign_to_sales_action.png"] - -1. Now create a new Action by repeating step 1. -2. This time select 'Create Record' from the Select Action down down -list. -3. Using the Name field, give the action a name such as 'Create Follow -Up Call'. -4. From the Record Type drop down select 'Calls'. -5. Click the Add Field button to add a new field: -6. Select 'Subject' from the first drop down box. Leave the second drop -down box as 'Value' then type the desired subject into the text field at -the end. -7. Add another field, this time selecting the 'Start Date' from the -first drop down box. -8. Change the second drop down box from 'Value' to 'Date'. -9. In the third drop down box select 'Now'. In the fourth drop down box -on the line select '+'. -10. In the text box type '1' and in the drop down next to it select -'Days'. -11. Add another field, this time select 'Assigned-To', 'Field', -'Assigned-To' – This will relate the assigned User of the Lead to the -Call. -12. You can add any other fields that you wish to include in the call at -this stage. To finish click 'Save'. - -Once these steps have been completed the Actions panel should look like -this: - -image:222action.png[222action.png,title="222action.png"] - -[[advanced-open-cases-with-portal]] -Advanced Open Cases with Portal -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -[[introduction]] -Introduction -^^^^^^^^^^^^ - -Advanced OpenPortal (AOP) is an enhancement to the case management -module in SuiteCRM. There is also a Joomla component. AOP extends the -core cases functionality and enhances mechanisms for contacts to update -cases. - -This module allows contacts held within SuiteCRM to: - -* Retrieve emails regarding updates to your Cases -* Create Cases by emailing a defined support address -* Update Cases by replying to Case emails - -The module allows SuiteCRM users to: Add updates to Cases View a -threaded log of all updates Retrieve email notifications when a contact -adds an update to a Case Create Joomla users from a Contact The AOP -Joomla component connects a Joomla site to the SuiteCRM instance. This -allows SuiteCRM Contacts to: View a list of your Cases online Create new -Cases online Reply to existing cases View your case details including a -threaded log of all updates - -Emails Advanced OpenPortal (AOP) uses the standard SuiteCRM -functionality to send emails and create cases from inbound emails. -Details on how to configure your outgoing email settings can be found -here. Details on how to set up a group email account which will -automatically generate cases can be found here. - -[[installation-configuration]] -Installation & Configuration -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -System Administrator users can configure the settings by accessing the -AOP settings through the admin panel. - -image:145AOP_settings.png[145AOP_settings.png,title="145AOP_settings.png"] - -Here you can enable or disable the AOP functionality, configure the -Joomla URL, set the case distribution method, “email from” details and -the different email templates. - -To install the Joomla AOP component, use the Joomla Extension Manager. -Once installed you must configure the SuiteCRM URL and a valid SuiteCRM -username and password. This can be done by navigating to Components → -advancedopen-portal. - -https://suitecrm.com/wiki/media/image146.png[https://suitecrm.com/wiki/media/image146.png] - -Once you have configured the Joomla component you can add two new Main -Menu items to your Joomla portal. These are: - -* List Cases - This shows a list of all Cases that the Contact has -logged. This page also provides a search mechanism to filter cases. -* New Case – This page will allow Contacts to create Cases in SuiteCRM -from the Joomla portal. - -https://suitecrm.com/wiki/media/image147.png[https://suitecrm.com/wiki/media/image147.png] - -[[using-advanced-openportal]] -Using Advanced OpenPortal -^^^^^^^^^^^^^^^^^^^^^^^^^ - -*Creating a Portal User* - -To create a Portal User a SuiteCRM User must first create a Contact for -the Portal User using the standard SuiteCRM functionality. Once created -you must click the 'Create Portal User' button. This can be found at the -top left hand side of the Contact record Detail View. - -_Note: If you have action menus enabled the button will be within the -action menu._ - -https://suitecrm.com/wiki/media/image1408png[https://suitecrm.com/wiki/media/image148.png] - -Once clicked, a new user will be created in Joomla and the Contact will -be sent your portal credentials via email. - -*Creating a Case via the Portal* - -Portal Users can create a new Case by going to the New Case page on the -portal website. - -https://suitecrm.com/wiki/media/image149.png[https://suitecrm.com/wiki/media/image149.png] - -From here Portal Users can enter the details of your issue and attach -any supporting documents. The dropdown values are dynamically pulled -from the SuiteCRM instance and thus can be edited using the drop down -editor tool within SuiteCRM. - -_Note: This feature does use the Joomla cache so please clear cache -after an update has been made. When the case is ready to be logged, -click the 'Save' button. This will create the Case within SuiteCRM_. - -*Viewing Cases via the Portal* - -Portal Users can view a list of all your Cases using the List Cases -page. This will also allow you to filter your search by State (All, Open -or Closed) or by keyword. When searching by keyword it will search the -'Number', 'Subject', 'Status', 'Created' and 'Last Update' fields to -find your result. - -https://suitecrm.com/wiki/media/image150.png[https://suitecrm.com/wiki/media/image150.png] - -To view more information on the case and to add updates then Portal -Users can click the 'Subject' of case. - -https://suitecrm.com/wiki/media/image151.png[https://suitecrm.com/wiki/media/image151.png] - -From the case view Portal Users can view all the external updates added -to the case from both Joomla and SuiteCRM. This is displayed in a -threaded format showing who updated the case Any attached files to -updates will also be accessible from this view. When a Portal User -updates a case the assigned SuiteCRM user of the case will be notified -by email. - -*Creating and Updating Cases from SuiteCRM* - -You can create and update Cases from SuiteCRM. To add an update to an -existing record Users will add text to the 'Update' field within the -case Detail View and click 'Save'. This will publish the update to the -portal and send an email to any Contacts related to the Case. - -https://suitecrm.com/wiki/media/image152.png[https://suitecrm.com/wiki/media/image152.png] - -If Users check the 'Internal Update' field then the update will appear -in SuiteCRM only. It will not appear in Joomla and the Contact will not -be emailed. - -https://suitecrm.com/wiki/media/image153.png[https://suitecrm.com/wiki/media/image153.png] - -The Case Detail View will show the full threaded update log. - -https://suitecrm.com/wiki/media/image154.png[https://suitecrm.com/wiki/media/image154.png] - -Additional Contacts can be added to the Case using the Contacts sub -panel. All emails exchanged between the system, the contact and you will -be attached to the History sub-panel. Any documents attached to the case -using the Portal are held as Notes within this sub-panel. - -*Status Drop Down* - -Within Cases, you can specify both a State and a Status value. The State -determines if the Case is Open or Closed. Depending on the State you -will be offered different statuses. You can amend these statuses using -the Dropdown Editor Tool within the Admin Developer Tools. When adding a -new Status you must define the Item Name as “_ItemName” For example “Open_New” or “Closed_Rejected”. All values -with an Item Name prefixed with “Open_” will show when the state is -Open, similarly all with the prefix “Closed_” will show when the state -is closed. - -[[advanced-open-events]] -Advanced Open Events -~~~~~~~~~~~~~~~~~~~~ - -[[events-locations]] -Events Locations -^^^^^^^^^^^^^^^^ - -The Locations module is used to capture the venue/site information where -events are held. - -*Creating Locations* - -\1. Hover over the Locations module on the navigation bar and select -'Create Location'. - -image:146Create_location.png[146Create_location.png,title="146Create_location.png"] - -\2. This will take you to the Edit View. Enter information into the -appropriate fields, all required fields are marked with a red asterisk -and must be completed prior to saving. - -image:147Location_edit_view.png[147Location_edit_view.png,title="147Location_edit_view.png"] - -\3. Once the necessary information is entered, click "Save". - -[[events]] -Events -^^^^^^ - -The Events module is used to capture information an particular event and -send out invites to delegates. To view the Events held within the system -click the 'Events' tab on the navigation bar. This will take you to the -Events List View. - -*Creating Events* - -\1. Hover over the Events module on the navigation bar and select -'Create Event'. - -image:148Create_event.png[148Create_event.png,title="148Create_event.png"] - -\2. This will take you to the Edit View. Enter information into the -appropriate fields, all required fields are marked with a red asterisk -and must be completed prior to saving. - -image:149Events_edit_view.png[149Events_edit_view.png,title="149Events_edit_view.png"] - -The following fields are found on the Events module: - -* *Name* – The name of the event -* *Start* *Date* – The date and time of when the event starts -* *End* *Date* – The date and time of when the event ends -* *Duration* – The duration of the event. This will automatically change -the end date or be altered automatically if the end date is changed. -* *Location* – This is a relationship to the *Event Locations* module. -* *Budget* – The budget for the event. -* *Email* *Invite* *Template* – The *Email Template* that will be sent -to associated Delegates. -* *Accept* *Redirect* *URL* – The web page invitees should be redirected -to after you accept an invite using the link provided in the *Email -Template*. -* *Decline* *Redirect* *URL* – The web page invitees should be -redirected to after you decline an invite using the link provided in the -*Email Template*. -* *Description* – More information about the Event. -* *Assigned*-*To* – Who the assigned user is for this event. This -defaults to you who creates the event. -* *Created* *By* – Which user created the event. - -\3. Once the necessary information is entered, click "Save". - -[[adding-delegates]] -Adding Delegates -^^^^^^^^^^^^^^^^ - -\1. Navigate to the Event Detail View. - -\2. Navigate to the Delegates sub-panel found below the 'Event Details' -panel. - -image:223Adding_delegates.png[223Adding_delegates.png,title="223Adding_delegates.png"] - -\3. Click 'Select Delegates'. A list of options will appear. - -image:224Select_delegates.png[224Select_delegates.png,title="224Select_delegates.png"] - -\4. Select the appropriate option depending on who should be added to -the Event. - -* *Target* *List* – Select a *Target List* of individuals to be -associated to the event. All *Targets*, *Leads* and *Contacts* on this -'''Target List '''will be added to the *Event*. -* *Targets* – Select *Targets* to be associated to this *Event*. -* *Contacts* – Select *Contacts* to be associated to this *Event*. -* *Leads* – Select *Leads* to be associated to this *Event*. -* *Events* – Select an *Event* to associate that *Event's* delegates to -this *Event*. - -\5. Once an option has been chosen a new pop-up box will appear to -search and select records from the module type that was chosen. - -\6. The Delegates sub-panel will populate with the records selected. - -image:225Delegates.png[225Delegates.png,title="225Delegates.png"] - -[[sending-invites-to-delegates]] -Sending Invites To Delegates -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -\1. Navigate to the Delegates sub-panel. - -\2. Choose action 'Send Invites'. - -image:226Send_invites.png[226Send_invites.png,title="226Send_invites.png"] - -\3. This will send the email template selected in the 'Email Invite -Template' to all Delegates who have the status 'Not Invited' - -\4. Once selected the Delegate status will automatically update to -'Invited'. - -https://suitecrm.com/wiki/media/image163.png[https://suitecrm.com/wiki/media/image163.png] - -\5. Choosing 'Resend Invites' will send invites out to all Delegates -associated to the Event who have yet to respond. - -[[managing-delegates-acceptance-manually]] -Managing Delegates Acceptance Manually -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -\1. Navigate to the Delegates sub-panel. - -\2. Select the Delegates that require your 'Accept Status' to be -updated. - -\3. Choose action 'Manage Acceptances' - -image:227Manage_acceptances.png[227Manage_acceptances.png,title="227Manage_acceptances.png"] - -\4. A list of options will appear. Select appropriate statuses: - -image:228Acceptances.png[228Acceptances.png,title="228Acceptances.png"] - -\5. This will update the Delegates 'Accept Status' accordingly. - -image:229Accepted.png[229Accepted.png,title="229Accepted.png"] - -_Note: Acceptance will my automatically updated if the Delegate chooses -to accept using the link provided in the email template._ - -[[updating-delegates-status-manually]] -Updating Delegates Status Manually -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -\1. Navigate to the Delegates sub-panel. - -\2. Select the Delegates that require your attendance to be updated. - -\3. Choose action 'Manage Delegates' - -image:230Manage_delegates.png[230Manage_delegates.png,title="230Manage_delegates.png"] - -\4. A list of options will appear. Select the appropriate status; -Invited, Not Invited, Attended or Not Attended. - -image:231Manage_delegates.png[231Manage_delegates.png,title="231Manage_delegates.png"] - -\5. This will update the Delegates 'Status' accordingly. - -image:232Updated_status.png[232Updated_status.png,title="232Updated_status.png"] - -_Note: Acceptance will be automatically updated if the Delegate chooses -to accept using the link provided in the email template._ - -[[advanced-open-reports]] -Advanced Open Reports -~~~~~~~~~~~~~~~~~~~~~ - -Advanced Open Reports (AOR) is the reporting module within SuiteCRM. AOR -can be accessed by clicking the 'Reports' link within the navigation -menu. The reporting module allows users to report on CRM data from any -module and has many features to display key information quickly. - -[[creating-reports]] -Creating Reports -^^^^^^^^^^^^^^^^ - -To create a report, hover over the Reports module on the navigation bar -and select 'Create Report'. - -image:152Create_report.png[152Create_report.png,title="152Create_report.png"] - -You will be presented with the report Edit View. To obtain a list of -fields to add to the report, you have to select a module from the Report -Module drop down. - -image:153Reports_edit_view.png[153Reports_edit_view.png,title="153Reports_edit_view.png"] - -*Adding Fields* - -Once you have selected a Report Module, the list of fields available -will display on the left panel. You can add fields to the 'Fields' -section of the report by expanding the module you wish to select fields -from and then drag and drop those fields into the field section. - -image:233Report_fields.png[233Report_fields.png,title="233Report_fields.png"] - -Once you have added fields to a Report, there are multiple options to -configure for those fields: - -* Display – True or false option. Allows you to specify whether this -field should be displayed on the report, or hidden. Users may wish to -add fields to perform a function/sort/group/total but may not wish to -show this on the Report.
- -* Link – True or false option. Allows you to make the field a link. -Setting this option to true will hyperlink the field on the Detail View -of the report, allowing you to click on the record. This will navigate -you to the appropriate record. For example, linking the Opportunity Name -will take you to the Detail View of that Opportunity.
- -* Label – This is the label that will be displayed for the Column/Field -on the Report. You can change the label from the default to any -alphanumerical value.
- -* Function - Provides five options: Count, Minimum, Maximum, Sum and -Average. Allows you to perform functions on alphanumerical fields. Users -may wish to calculate the average Opportunity Amount, or Count total -Opportunities at a given Sales Stage.
- -* Sort – Ascending or Descending. Allows you to select whether to sort -the field/column descending or ascending. This can be done for all -fields.
- -* Group – True or false option. Allows you to group by this field. For -example, you may wish to group by Sales Stage when reporting on an -Opportunity.
- -* Total – Provides three options: Count, Sum and Average. This allows -users to perform total calculations on numerical fields. This is useful -for financial reporting such as the total value of all Opportunities at -a given Sales Stage.
- -*Adding Conditions* - -Once you have added the fields to your Report, you can add condition -lines to the Report. You can add conditions with the same procedure as -adding fields. Using the drag and drop functionality, you can drag -fields into the 'Conditions' area which will add the field and allow you -to specify the condition for that field. - -[[charts]] -Charts -^^^^^^ - -You can add charts to Reports. Charts provide a visual representation of -the Report data to you. In some scenarios, or for particular users, -visual aids such as charts can assist quicker analysis and better -understanding. - -*Chart Types* - -There are six types of chart that the user can select to display Report -data. These are: - -* Pie Chart -* Bar Chart -* Line Chart -* Radar Chart -* Stacked Bar -* Grouped Bar - -
To add a chart, you can click the 'Add Chart' button, below the -Conditions section within the Report Edit View. - -image:234Add_chart.png[234Add_chart.png,title="234Add_chart.png"] - -Once you click add chart, you will be presented with the option to -specify the following information: - -* Title – Allows the user to specify the title for the chart. This will -show on the Detail View of the Report and also on the dashlet chart. -* Type – This allows the user to select from one of the six chart types -detailed above. -* X Axis – Allows the user to select the column that should be used for -the X Axis. -* Y Axis – Allows the user to select the column that should be used for -the Y Axis. - -image:235Making_chart.png[235Making_chart.png,title="235Making_chart.png"] - -Once you have specified the chart details, save the Report. This will -display the chart on the Detail View of the Report, below the list of -records returned. - -image:image176.png[image176.png,title="image176.png"] - -[[reports-dashlets]] -Reports Dashlets -^^^^^^^^^^^^^^^^ - -You can display a Report within a dashlet. It is possible to view -multiple Report results as you can add multiple Report dashlets and -select different Reports within each dashlet. To do this, add the -Reports dashlet to your homepage. - -image:156Add_dashlet.png[156Add_dashlet.png,title="156Add_dashlet.png"] - -image:157Reports_dashlet.png[157Reports_dashlet.png,title="157Reports_dashlet.png"] - -Once you have added the dashlet, you need to select the Report you wish -to display within the dashlet. To do this, click the pencil icon to edit -the dashlet. - -image:158Choose_report.png[158Choose_report.png,title="158Choose_report.png"] - -This allows the user to select the Report they wish to display within -the dashlet. - -image:159Report_dashlet_results.png[159Report_dashlet_results.png,title="159Report_dashlet_results.png"] - -Once you have selected the Report, click 'Save'. This will update your -Reports dashlet to show the results of the Report. - -_Note: For full details on adding and managing dashlets, see the -link:#Dashlets[Dashlets] section of this user guide._ - -[[reports-charts-dashlets]] -Reports Charts Dashlets -^^^^^^^^^^^^^^^^^^^^^^^ - -You can specify to only select to display a chart for Report dashlets. -To do this, edit your Report dashlet and select the 'Only use charts' -option. This will then list all charts you have created for this Report. - -https://suitecrm.com/wiki/media/image182.png[https://suitecrm.com/wiki/media/image182.png] - -Select a chart or multiple charts and click 'Save'. This will display -the results in the chart selected. - -https://suitecrm.com/wiki/media/image183.png[https://suitecrm.com/wiki/media/image183.png] - -[[scheduled-reports]] -Scheduled Reports -^^^^^^^^^^^^^^^^^ - -You can schedule reports to be automatically run and emailed to the -required Contact(s). This allows users to schedule reports to be sent to -Managers or Team Leads either Daily, Weekly or Monthly. To create a -Scheduled Report, you can click the 'Create' option within the Scheduled -Reports Sub-panel on the Detail View of the Report. You can also select -existing Scheduled Reports to relate to the Report. - -image:236Scheduled_Reports.png[236Scheduled_Reports.png,title="236Scheduled_Reports.png"] - -Once you have clicked 'Create', there are options to set for the -Scheduled Report. Give the Scheduled Report a relevant name. In this -example, we will use 'Daily Opportunites Report for Managers'. - -image:161Scheduled_report_edit.png[161Scheduled_report_edit.png,title="161Scheduled_report_edit.png"] - -You can select the 'Advanced' option for report scheduling. This will -provide a cron notation style option. This is best suited for System -Administrators or advanced users. - -image:162Scheduled_report_edit.png[162Scheduled_report_edit.png,title="162Scheduled_report_edit.png"] - -Once you have entered a name and selected a schedule, click 'Save'. - -image:162Scheduled_report_edit.png[162Scheduled_report_edit.png,title="162Scheduled_report_edit.png"] - -Once you save the Scheduled Report record, this will display in the -Scheduled Reports subpanel within the Detail View of the Report. - -image:237Scheduled_report.png[237Scheduled_report.png,title="237Scheduled_report.png"] - -You can view when the Scheduled Report last ran by viewing the 'Last -Run' column/field on the sub-panel. This shows in a date/time format. - -https://suitecrm.com/wiki/media/image189.png[https://suitecrm.com/wiki/media/image189.png] - -[[reschedule]] -Reschedule -~~~~~~~~~~ - -[[rescheduling-a-call]] -Rescheduling a Call -^^^^^^^^^^^^^^^^^^^ - -To reschedule a Call, you can click the 'Reschedule' button on the -Detail View of a Call which has been defined as Outbound and Planned. - -image:164Reschedule_call.png[164Reschedule_call.png,title="164Reschedule_call.png"] - -[[defining-the-details]] -Defining the Details -^^^^^^^^^^^^^^^^^^^^ - -Clicking the Reschedule button will produce a pop up or dialogue box up. -This enables users to set the date and time for the rescheduled Call. - -image:238Reschedule_call.png[238Reschedule_call.png,title="238Reschedule_call.png"] - -You can also select a reason for the incomplete/unsuccessful Call from -the drop down list. Once the details have been defined, click the 'Save' -button to save the Call. - -image:239Reschedule_reason.png[239Reschedule_reason.png,title="239Reschedule_reason.png"] - -[[tracking-history]] -Tracking History -^^^^^^^^^^^^^^^^ - -Once Saved, the Call is rescheduled for the new date and time. you can -view all Call Reschedule history by clicking the 'Reschedule' tab on the -Calls Detail View. - -image:240Call_attempty_history.png[240Call_attempty_history.png,title="240Call_attempty_history.png"] - -[[altering-reasons-drop-down]] -Altering Reasons Drop Down -^^^^^^^^^^^^^^^^^^^^^^^^^^ - -System Administrator users can edit the reasons available in the -Reschedule pop-up using the drop down editor. The drop down list used is -called 'call_reschedule_dom'. - -[[summary-5]] -Summary -~~~~~~~ - -In this chapter we have covered the functionality of the advanced -modules. These modules have a very specific purpose - enabling users to -improve processes and efficiently report on and manage data. - -In the next chapter, we will cover some third party modules which are -part of the SuiteCRM product. These third party modules provide -additional functionality to you such as teams and location mapping. - -[[security-suitegroups]] -Security Suite(Groups) ----------------------- - -Security Suite allows control of what users can access. It allows -restricting sensitive data in SuiteCRM to specific teams (groups). -SecuritySuite comes loaded with options which allow you to configure it -to meet your exact needs. Choose from a number of automatic assignment -options to ensure that your users can always access the data that you -need. - -[[create-groups]] -Create Groups -~~~~~~~~~~~~~ - -System Administrators can add groups and roles or set up Security Groups -preferences in Security Suite Settings found at the top of the Admin -page. - -image:167Create_groups.png[167Create_groups.png,title="167Create_groups.png"] - -[[allow-non-admins-to-create-groups]] -Allow Non-admins to Create Groups -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -System Administrators can allow non-admin users to add groups to -records. This can be done by doing the following steps: - -1. Navigate to Configure Tabs. Add Security Groups to the displayed -tabs. -2. Run Repair Roles, within Admin->Repair, to be able to assign rights -to Security Groups. -3. Edit role(s) to Enable Security Groups Management. -4. Edit role(s) to set List to All or Group for Security Groups -Management as desired. - -[[configure-securitysuite-settings]] -Configure SecuritySuite Settings -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -SecuritySuite is very configurable and allows for support near every -possible situation. Because of that there may be a learning curve and -some time required to understand what each option does and how it may be -used for your specific needs. You can find the settings page by going to -Admin->SecuritySuite Settings. - -[[groups-setup]] -Groups Setup -~~~~~~~~~~~~ - -There are 3 key steps to setting up Groups so that you work correctly. - -1. Create a group for each team of users and add the appropriate users -to the group. -2. Create a role and select Group for the access level for every -appropriate cell in the grid. Assign that role to each group -3. Add the groups to records in your SuiteCRM instance. You can use the -Mass Assign on the List View to do this. Going forward the groups will -automatically inherit based on your SecuritySuite Settings. You can also -use logic hooks, workflow, or do a direct database insert into the -securitygroups_records table if doing a one-time initial setup. - -If your users should only typically see their own records then the role -assigned to the group would be configured to have Owner only rights. A -manager who is a part of the group, but who should see be able to see -all records in the group would have a role directly assigned to you -record that gives Group access. - -For more help check out: - -* https://www.sugaroutfitters.com/docs/securitysuite/example-of-a-typical-setup[Example -of a Typical Setup] -* https://www.sugaroutfitters.com/docs/securitysuite/introduction-video[Introduction -Video] - -Roles determine what a user can do with a record once they have access -to it. - -1. Create the roles -2. Edit role(s) to Enable Security Groups Management -3. Edit role(s) to set List to All or Group for Security Groups -Management as desired - -[[a-typical-hierarchy-setup]] -A Typical Hierarchy Setup -~~~~~~~~~~~~~~~~~~~~~~~~~ - -Although SecuritySuite can handle any organizational structure, the most -common scenario it is used for is one where the owner can sell -everything, managers can see both their own records and those of their -team, and team members can only see their own records. - -[[the-scenario]] -The Scenario -^^^^^^^^^^^^ - -This company has 2 sales teams; East and West. The owner, Jill, should -be able to see everything. The East Sales team is lead by Will and Sarah -leads the West Sales team. Both of them should see everything just in -your own respective teams. The rest of the Sales Reps in each teams -should only be allowed to see your own records. - -[[set-up-the-groups]] -Set up the Groups -^^^^^^^^^^^^^^^^^ - -1. Create a group called East Sales -2. Add Will and the Sales Reps -3. Create a group called West Sales -4. Add Sarah and the Sales Reps - -[[set-up-the-roles]] -Set up the Roles -^^^^^^^^^^^^^^^^ - -1. Create a role called Everything and set the rights to All._Tips and -Tricks: Click the header in any column on the role grid and you can set -the rights for the whole column at one time_ -2. Assign the Everything role directly to Jill's user account -3. Create a role called Group Only and set the rights for everything to -Group -4. Assign the Group role directly to Will and Sarah -5. Create a role called Owner Only and set the rights for everything to -Owner -6. Assign the Owner Only role to the East Sales and West Sales groups - -[[assign-the-groups]] -Assign the Groups -^^^^^^^^^^^^^^^^^ - -This instance already has some existing Leads so we will assign them to -the appropriate groups. - -1. Go to the Leads List View and search for the Leads that should -belong to the East Sales group -2. Check the appropriate Leads, in the Mass Assign panel choose East -Sales, and click "Assign" -3. Repeat for the West Sales team - -_Note: Going forward the groups will be automatically inherited by any -Calls, Contacts, Notes, etc that get added based on the SecuritySuite -Settings that are configured. If the SuiteCRM instance is already loaded -with lots of data at the time of starting with SecuritySuite then there -may be some initial work to be done to add those groups to the related -records. The Mass Assign functionality on the List View can be used or -direct database insertion into the securitygroups_records table. See -existing data in that table for how to format the data. This will -require SQL knowledge if you want to go that route._ - -[[check-the-settings]] -Check the Settings -^^^^^^^^^^^^^^^^^^ - -These settings determine how SecuritySuite functions. In the Group -Inheritance Rules panel the defaults of "Inherit from Created By User", -"Inherit from Assigned To User", and "Inherit from Parent Record" will -work perfectly in this scenario. - -Any Lead that gets created will automatically have groups assigned to it -based on who created it and who gets assigned to it. If a Call is -created for a Lead then the Call will inherit the groups from the Lead -record (parent record) along with inheriting the groups from the created -by user and the assigned to user. - -Another key setting is "Strict Rights". In the scenario above the -default settings will cause the links on the List View for the team -Leads to show with no link for records that are assigned to your group. -In many cases you will want to uncheck "Strict Rights" so that you can -assign groups in the manner described in this doc. - -[[thats-it]] -That's it! -^^^^^^^^^^ - -The hardest part is always the initial setup. Once you have things -configured and figured out it will just run on its own. - -Have a more complicated structure? Apply the same principles here for -each additional level of hierarchy that you may have. The key is to -create a group at the lowest levels of the structure and then work your -way back up. - -[[advanced-options]] -Advanced Options -~~~~~~~~~~~~~~~~ - -SuiteCRM System Administrators can configure many advanced options for -Security Suite. This allows you to control various access/rights, -inheriting of records, filters and more. - -image:168Security_group_management.png[168Security_group_management.png,title="168Security_group_management.png"] - -[[additive-rights]] -Additive Rights -^^^^^^^^^^^^^^^ - -User gets greatest rights of all roles assigned to you or user's -group(s) - -[[strict-rights]] -Strict Rights -^^^^^^^^^^^^^ - -If a user is a member of several groups only the respective rights from -the group assigned to the current record are used. - -[[new-user-group-popup]] -New User Group Popup -^^^^^^^^^^^^^^^^^^^^ - -When creating a new user show the SecurityGroups popup to assign you to -a group(s). - -[[user-role-precedence]] -User Role Precedence -^^^^^^^^^^^^^^^^^^^^ - -If any role is assigned directly to a user that role should take -precedence over any group roles. - -[[filter-user-list]] -Filter User List -^^^^^^^^^^^^^^^^ - -Non-admin users can only assign to users in the same group(s) - -[[use-popup-select]] -Use Popup Select -^^^^^^^^^^^^^^^^ - -When a record is created by a user in more than one group popup a group -selection screen otherwise inherit that one group. Inheritance rules -will only be used for non-user created records (e.g. Workflows, etc). - -[[use-creator-group-select]] -Use Creator Group Select -^^^^^^^^^^^^^^^^^^^^^^^^ - -Adds a panel to a record creation screen if a user is a member of more -than one inheritable group that allows a user to select one or more -groups that you belongs to that should be associated with the newly -created record. If a user is in just one group the normal inheritance -rules will instead be applied. - -_Note: The new record will still inherit from the Assigned To user or -Parent record if these options are set. This setting only overrides the -Created By setting._ - -[[shared-calendar---hide-restricted]] -Shared Calendar - Hide Restricted -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -By default users can see when other users are busy on the Shared -Calendar. Even if you doesn't have rights to the meeting, call, etc. It -will display on the calendar, but you cannot view more details unless -you have rights to that specific calendar item. By setting this option -you cannot see these items on the Shared Calendar; only items that you -actually has rights to. - -[[inherit-from-created-by-user]] -Inherit from Created By User -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The record will inherit all the groups assigned to you who created it. - -[[inherit-from-assigned-to-user]] -Inherit from Assigned To User -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The record will inherit all the groups of you assigned to the record. -Other groups assigned to the record will NOT be removed. - -[[inherit-from-parent-record]] -Inherit from Parent Record -^^^^^^^^^^^^^^^^^^^^^^^^^^ - -e.g. If a case is created for a contact the case will inherit the groups -associated with the contact. - -[[default-groups-for-new-records]] -Default Groups for New Records -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Set groups that should always be attached when a specific module is -created. - -[[inbound-email-account]] -Inbound email account -^^^^^^^^^^^^^^^^^^^^^ - -Locks down inbound email accounts in the email client to only list those -that belong to the same group as the current user. - -[[jjw-maps]] -JJW Maps --------- - -JJW Maps provides mapping functionality for SuiteCRM. JJW Maps is a -third party module, provided by http://www.jjwdesign.com/[JJW Design]. - -Documentation and releases are kept up to date on the -http://www.jjwdesign.com/google-maps-for-sugarcrm/[JJW Maps project -page]. - -[[troubleshooting-and-support]] -Troubleshooting and Support ---------------------------- - -At SalesAgility we are advocates of Open Source. As such please do not -contact us directly via email or phone for SuiteCRM support. Instead -please use our support forum. By using the -https://suitecrm.com/forum/suite-forum[forum] the knowledge is shared -with everyone in the community. Our developers answer questions on the -forum daily but it also gives the other members of the community the -opportunity to contribute. If you would like SalesAgility to customise -SuiteCRM specifically for your needs, or to provide a hosted and -supported CRM solution, then please use our -https://salesagility.com/contact-us[contact form]. - -[[summary-6]] -Summary -------- - -In this guide we have covered various areas of SuiteCRM from the basics -of logging in to the complexity of creating automated workflow -processes. This guide is a resource to visually assist users in -maximising your use of SuiteCRM. You can also visit the -https://suitecrm.com/forum/suite-forum[SuiteCRM Community Forums] where -there are various topics and a wealth of knowledge provided by the -SuiteCRM team and contributing community members. - -[[appendix-a]] -Appendix A ----------- - -[[contacts-field-list]] -Contacts Field List -~~~~~~~~~~~~~~~~~~~ - -image:Contacts.png[Contacts.png,title="Contacts.png"] - -[[leads-field-list]] -Leads Field List -~~~~~~~~~~~~~~~~ - -image:Leads.png[Leads.png,title="Leads.png"] - -[[targets-field-list]] -Targets Field List -~~~~~~~~~~~~~~~~~~ - -image:Targets.png[Targets.png,title="Targets.png"] - -[[accounts-field-list]] -Accounts Field List -~~~~~~~~~~~~~~~~~~~ - -image:Accounts.png[Accounts.png,title="Accounts.png"] - -[[opportunities-field-list]] -Opportunities Field List -~~~~~~~~~~~~~~~~~~~~~~~~ - -image:Opportunities.png[Opportunities.png,title="Opportunities.png"] - -[[products-field-list]] -Products Field List -~~~~~~~~~~~~~~~~~~~ - -image:Products.png[Products.png,title="Products.png"] - -[[product-categories-field-list]] -Product Categories Field List -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -image:Product_Categories.png[Product_Categories.png,title="Product_Categories.png"] - -[[quotes-field-list]] -Quotes Field List -~~~~~~~~~~~~~~~~~ - -image:Quotes.png[Quotes.png,title="Quotes.png"] - -[[invoices-field-list]] -Invoices Field List -~~~~~~~~~~~~~~~~~~~ - -image:Invoices.png[Invoices.png,title="Invoices.png"] - -[[contracts-field-list]] -Contracts Field List -~~~~~~~~~~~~~~~~~~~~ - -image:Contracts.png[Contracts.png,title="Contracts.png"] - -[[line-items-field-list]] -Line Items Field List -~~~~~~~~~~~~~~~~~~~~~ - -image:Line_Items.png[Line_Items.png,title="Line_Items.png"] - -[[groups-field-list]] -Groups Field List -~~~~~~~~~~~~~~~~~ - -image:Groups.png[Groups.png,title="Groups.png"] - -[[pdf-templates-field-list]] -PDF Templates Field List -~~~~~~~~~~~~~~~~~~~~~~~~ - -image:PDF_Templates.png[PDF_Templates.png,title="PDF_Templates.png"] - -[[cases-field-list]] -Cases Field List -~~~~~~~~~~~~~~~~ - -image:Cases.png[Cases.png,title="Cases.png"] - -[[notes-field-list]] -Notes Field List -~~~~~~~~~~~~~~~~ - -image:Notes.png[Notes.png,title="Notes.png"] - -[[calls-field-list]] -Calls Field List -~~~~~~~~~~~~~~~~ - -image:Calls.png[Calls.png,title="Calls.png"] - -[[emails-field-list]] -Emails Field List -~~~~~~~~~~~~~~~~~ - -image:Emails.png[Emails.png,title="Emails.png"] - -[[meetings-field-list]] -Meetings Field List -~~~~~~~~~~~~~~~~~~~ - -image:Meetings.png[Meetings.png,title="Meetings.png"] - -[[tasks-field-list]] -Tasks Field List -~~~~~~~~~~~~~~~~ - -image:Tasks.png[Tasks.png,title="Tasks.png"] - -[[projects-field-list]] -Projects Field List -~~~~~~~~~~~~~~~~~~~ - -image:Projects.png[Projects.png,title="Projects.png"] - -[[project-tasks-field-list]] -Project Tasks Field List -~~~~~~~~~~~~~~~~~~~~~~~~ - -image:Project_Tasks.png[Project_Tasks.png,title="Project_Tasks.png"] - -[[campaigns-field-list]] -Campaigns Field List -~~~~~~~~~~~~~~~~~~~~ - -image:Campaigns.png[Campaigns.png,title="Campaigns.png"] - -[[target-lists-field-list]] -Target Lists Field List -~~~~~~~~~~~~~~~~~~~~~~~ - -image:Target_Lists.png[Target_Lists.png,title="Target_Lists.png"] - -[[email-templates-field-list]] -Email Templates Field List -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -image:Email_Templates.png[Email_Templates.png,title="Email_Templates.png"] - -[[documents-field-list]] -Documents Field List -~~~~~~~~~~~~~~~~~~~~ - -image:Documents.png[Documents.png,title="Documents.png"] - -[[events-field-list]] -Events Field List -~~~~~~~~~~~~~~~~~ - -image:Events.png[Events.png,title="Events.png"] - -[[locations-field-list]] -Locations Field List -~~~~~~~~~~~~~~~~~~~~ - -image:Locations.png[Locations.png,title="Locations.png"] - -[[users-field-list]] -Users Field List -~~~~~~~~~~~~~~~~ - -image:Users.png[Users.png,title="Users.png"] - -[[security-groups-field-list]] -Security Groups Field List -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -image:Security_Groups.png[Security_Groups.png,title="Security_Groups.png"] diff --git a/_source/wiki-main-page.md b/_source/wiki-main-page.md deleted file mode 100644 index ea4d14a9a..000000000 --- a/_source/wiki-main-page.md +++ /dev/null @@ -1,324 +0,0 @@ ---- -Title: Old Wiki Index page ---- - -This is the wiki for SuiteCRM which contains many guides, -FAQ's, information about future releases and support options. Use the -links to the left to navigate through the SuiteCRM wiki.
In the -versions section, you will find documentation on previously released and -current versions of SuiteCRM. There will be details such as when it was -last released and the support for that version. You will find all -User Guides for the custom modules inside SuiteCRM within the User -Guides section. You'll find some content translated into other -languages, but the primary documentation language is English. For -questions, advice and support about SuiteCRM see the -[support -forums](https://suitecrm.com/index.php?option=com_kunena&view=category&Itemid=1137&layout=list). - -## Using SuiteCRM - -### SuiteCRM How To's - -* [Learn How] SuiteCRM modules work -* Customise your SuiteCRM experience -* Get [help] from other community members - -## SuiteCRM Installation - -### Install & configure SuiteCRM - -* [How to] install SuiteCRM -* [Upgrade] from SugarCRM to SuiteCRM -* [Upgrade] an existing SuiteCRM installation -* Add features with [third party extensions](https://store.suitecrm.com) - -## Developing & Extending SuiteCRM - -### For SuiteCRM Developers - -* Learn how to develop and write extensions -* Contribute your extensions to our [extension -directory](https://store.suitecrm.com) -* Browse the -[forums](https://suitecrm.com/index.php?option=com_kunena&view=category&Itemid=1137&layout=list) for developer help - -## Version List - -* **Release_notes_7.9.7#SuiteCRM_7.9.7[7.9.7]** -– 18-10-2017 -* **Release_notes_7.9.6#SuiteCRM_7.9.6[7.9.6]** -– 03-10-2017 -* **Release_notes_7.9.5#SuiteCRM_7.9.5[7.9.5]** -– 6-09-2017 -* **Release_notes_7.9.4#SuiteCRM_7.9.4[7.9.4]** -– 20-07-2017 -* **Release_notes_7.9.3#SuiteCRM_7.9.3[7.9.3]** -– 17-07-2017 -* **Release_notes_7.9.2#SuiteCRM_7.9.2[7.9.2]** -– 30-06-2017 -* **Release_notes_7.9.1#SuiteCRM_7.9.1[7.9.1]** -– 15-06-2017 -* **Release_notes_7.9.0#SuiteCRM_7.9.0[7.9.0]** -– 29-05-2017 -* **Release_notes_7.8.8#SuiteCRM_7.8.8[7.8.8]** -– 18-10-2017 -* **Release_notes_7.8.7#SuiteCRM_7.8.7[7.8.7]** -– 03-10-2017 -* **Release_notes_7.8.6#SuiteCRM_7.8.6[7.8.6]** -– 6-09-2017 -* **Release_notes_7.8.5#SuiteCRM_7.8.5[7.8.5]** -– 15-06-2017 -* **Release_notes_7.8.4#SuiteCRM_7.8.4[7.8.4]** -– 29-05-2017 -* **Release_notes_7.8.3#SuiteCRM_7.8.3[7.8.3]** -– 10-04-2017 -* **Release_notes_7.8.2#SuiteCRM_7.8.2[7.8.2]** -– 27-02-2017 -* **Release_notes_7.8.1#SuiteCRM_7.8.1[7.8.1]** -– 06-02-2017 -* **Release_notes_7.8#SuiteCRM_7.8[7.8.0]** -– 30-01-2017 -* **Release_notes_7.7.9#SuiteCRM_7.7.9[7.7.9]** -– 31-12-2016 -* **Release_notes_7.7.8#SuiteCRM_7.7.8[7.7.8]** -– 16-11-2016 -* **Release_notes_7.7.7#SuiteCRM_7.7.7[7.7.7]** -– 04-11-2016 -* **Release_notes_7.7.6#SuiteCRM_7.7.6[7.7.6]** -– 19-10-2016 -* **Release_notes_7.7.5#SuiteCRM_7.7.5[7.7.5]** -– 28-09-2016 -* **Release_notes_7.7.4#SuiteCRM_7.7.4[7.7.4]** -– 31-08-2016 -* **Release_notes_7.7.3#SuiteCRM_7.7.3[7.7.3]** -– 25-08-2016 -* **Release_notes_7.7.2#SuiteCRM_7.7.2[7.7.2]** -– 23-08-2016 -* **Release_notes_7.7.1#SuiteCRM_7.7.1[7.7.1]** -– 11-08-2016 -* **Release_notes_7.7#SuiteCRM_7.7[7.7.0]** -– 02-08-2016 -* **Release_notes_7.6.10#SuiteCRM_7.6.10[7.6.10]** -– 16-11-2016 -* **Release_notes_7.6.9#SuiteCRM_7.6.9[7.6.9]** -– 04-11-2016 -* **Release_notes_7.6.8#SuiteCRM_7.6.8[7.6.8]** -– 19-10-2016 -* **Release_notes_7.6.7#SuiteCRM_7.6.7[7.6.7]** -– 28-09-2016 -* **Release_notes_7.6.6#SuiteCRM_7.6.6[7.6.6]** -– 18-07-2016 -* **Release_notes_7.6.5#SuiteCRM_7.6.5[7.6.5]** -– 04-07-2016 -* **Release_notes_7.5.4#SuiteCRM_7.5.4[7.5.4]** -– 04-07-2016 -* **Release_notes_7.6.4#SuiteCRM_7.6.4[7.6.4]** -– 30-05-2016 -* **Release_notes_7.6.3#SuiteCRM_7.6.3[7.6.3]** -– 17-05-2016 -* **Release_notes_7.6.2#SuiteCRM_7.6.2[7.6.2]** -– 10-05-2016 -* **Release_notes_7.6.1#SuiteCRM_7.6.1[7.6.1]** -– 03-05-2016 -* **Release_notes_7.6#SuiteCRM_7.6.0[7.6.0]** -– 27-04-2016 -* **Release_notes_7.5.3#SuiteCRM_7.5.3[7.5.3]** -– 15-03-2016 -* **Release_notes_7.5.2#SuiteCRM_7.5.2[7.5.2]** -– 07-03-2016 -* **Release_notes_7.5.1#SuiteCRM_7.5.1[7.5.1]** -– 26-01-2016 -* **Release_notes_7.5.0#SuiteCRM_7.5.0[7.5.0]** -– 18-01-2016 -* **Release_notes_7.4.3#SuiteCRM_7.4.3[7.4.3]** -– 23-11-2015 -* **Release_notes_7.4.2#SuiteCRM_7.4.2[7.4.2]** -– 22-10-2015 -* **Release_notes_7.4.1#SuiteCRM_7.4.1[7.4.1]** -– 10-11-2015 -* **Release_notes_7.4.0#SuiteCRM_7.4.0[7.4.0]** -– 30-10-2015 -* **Release_notes_7.3.2#SuiteCRM_7.3.2[7.3.2]** -– 22-10-2015 -* **Release_notes_7.3.1#SuiteCRM_7.3.1[7.3.1]** -– 25-08-2015 -* **Release_notes_7.3.0#SuiteCRM_7.3.0[7.3.0]** -– 14-08-2015 -* **Release_notes_7.2.3#SuiteCRM_7.2.3[7.2.3]** -– 06-08-2015 -* **Release_notes_7.1.8#SuiteCRM_7.1.8[7.1.8]** -– 06-08-2015 -* **Release_notes_7.2.2#SuiteCRM_7.2.2[7.2.2]** -– 20-05-2015 -* **link:Release_notes_7.1.7#SuiteCRM_7.1.7[7.1.7]** -– 20-05-2015 -* **link:Release_notes_7.2.1#SuiteCRM_7.2.1[7.2.1]** -– 11-03-2015 -* **link:Release_notes_7.1.6#SuiteCRM_7.1.6[7.1.6]** -– 11-03-2015 -* **link:Release_notes_7.2.0#SuiteCRM_7.2.0[7.2.0]** -– 02-03-2015 -* **link:Release_notes_7.1.5#SuiteCRM_7.1.5[7.1.5]** -– 19-01-2015 -* **link:Release_notes_7.1.4#SuiteCRM_7.1.4[7.1.4]** -– 25-09-2014 -* **link:Release_notes_7.1.3#SuiteCRM_7.1.3[7.1.3]** -– 13-08-2014 -* **link:Release_notes_7.1.2#SuiteCRM_7.1.2[7.1.2]** -– 07-07-2014 -* **link:Release_notes_7.1.1#SuiteCRM_7.1.1[7.1.1]** -– 04-04-2014 -* **link:Release_notes_7.1.0#SuiteCRM_7.1.0[7.1.0]** -– 31-03-2014 -* **link:Release_notes_7.0.2#SuiteCRM_7.0.2[7.0.2]** -– 20-01-2014 -* **link:Release_notes_7.0.1#SuiteCRM_7.0.1[7.0.1]** -– 04-11-2013 -* **link:Release_notes_7.0.0#SuiteCRM_7.0.0[7.0.0]** -– 21-10-2013 - - -## Recent news - -[13.02.2017]https://suitecrm.com/wiki/index.php/Userguide[Updated User -Guide]. - -Now including Workflow Calculated Fields action.
- -[06.02.2017]SuiteCRM 7.8.1 released. - -Please see the release notes for further information.
- -[30.01.2017]SuiteCRM 7.8 released. - -Please see the release notes for further information.
- -[31.12.2016]SuiteCRM 7.7.9 Security patch released. - -Please see the release notes for further information.
-[19.10.2016]SuiteCRM 7.7.6 & 7.6.8 released. - -Please see the release notes for further information.
-[28.09.2016]SuiteCRM 7.7.5 released. - -Please see the release notes for further information.
-[28.09.2016]SuiteCRM 7.6.7 released. - -Please see the release notes for further information.
-[31.08.2016]SuiteCRM 7.7.4 released. - -Please see the release notes for further information.
-[25.08.2016]SuiteCRM 7.7.3 released. - -Please see the release notes for further information.
-[23.08.2016]SuiteCRM 7.7.2 released. - -Please see the release notes for further information.
-[11.08.2016]SuiteCRM 7.7.1 released. - -Please see the release notes for further information.
-[02.08.2016]SuiteCRM 7.7 released. - -Please see the release notes for further information.
-[04.07.2016]SuiteCRM Important Security Patch Released 7.6.6 / 7.5.5. - -An Important Security Patch has been release that effects all version of -SuiteCRM.
[04.07.2016]SuiteCRM Important Security Patch Released -7.6.5 / 7.5.4. - -An Important Security Patch has been release that effects all version of -SuiteCRM.
[30.05.2016]SuiteCRM 7.6.4 released. - -Please see the release notes for further information.
-[17.05.2016]SuiteCRM 7.6.3 released. - -Please see the release notes for further information.
-[10.05.2016]SuiteCRM 7.6.2 released. - -Please see the release notes for further information.
-[22.10.2015]SuiteCRM 7.3.2 released. - -Please see the release notes for further information.
-[14.08.2015]SuiteCRM 7.3.1 released. - -Please see the release notes for further information.
-[14.08.2015]SuiteCRM 7.3.0 released. - -Please see the release notes for further information.
-[06.08.2015]SuiteCRM 7.2.3 and SuiteCRM 7.1.8 bug-fix versions released. - -Please see the release notes for further information.
-[20.05.2015]SuiteCRM 7.2.2 and SuiteCRM 7.1.7 bug-fix versions released. - -Please see the release notes for further information.
-[11.03.2015]SuiteCRM 7.2.1 and SuiteCRM 7.1.6 bug-fix versions released. - -Please see the release notes for the full list of new features and bug -fixes.
- -[02.03.2015]SuiteCRM 7.2.0 is the new production release of SuiteCRM. -Packed with new features, functionality and bug-fixes. - -Please see the release notes for the full list of new features and bug -fixes.
- -[19.01.2015]SuiteCRM 7.1.5 features many bug fixes and addresses -important security issues. - -SugarCRM version updated to 6.5.20 - -This update addresses some important Security issues.
- -[25.09.2014] SuiteCRM 7.1.4 has now been released. 7.1.4 features -important security fixes to both the SugarCRM CE core(upgraded to 6.5.18 -latest release) and QuickCRM. - -There are many bug fixes to several modules within SuiteCRM, and some -minor enhancements. Please see the release notes for a full list of bug -fixes.
- -[13.08.2014] SuiteCRM 7.1.3 has now been released. 7.1.3 features many -bug fixes to several modules within SuiteCRM, and some minor -enhancements. Please see the release notes for a full list of bug fixes. -
- -[07.07.2014] SuiteCRM 7.1.2 has now been released. 7.1.2 features -important security updates for the SugarCRM base and many bug fixes have -been implemented. Please see the release notes for a full list of bug -fixes.
- -[04.04.2014] SuiteCRM 7.1.1 has been released and is now available to -download and upgrade from previous SuiteCRM versions.
- -[31.03.2014] The long awaited SuiteCRM 7.1 is now available - -This release packs in many new features, most notably the many -enhancements to workflow, the new lucene powered search, (to enable see -AOD in the admin panel), the multi tabbed homepage, the ability to -filter the history sub-panel and more - -A Full list of new features and bug fixed will be available soon - -Go to the download section to get the full package or appropriate -upgrade. - -Thanks to everyone who has contributed to the project so far, if you -have something to contribute be it a Bug Fix, a Language Pack or a New -Feature, then check out the project on -http://github.com/salesagility/suitecrm[GitHub].
- -[23.01.2014] SuiteCRM 7.1 will be released in Q1 of 2014. SuiteCRM 7.1 -will contain a host of new functionality and features such as Social -integration, improvements to AOW and more.
- -[21.01.2014] SuiteCRM 7.0.2 has been released which has several new -additions and many bugfixes. We thank both the community who highlighted -and/or posted solutions for these bugs and also to our contributors who -helped work towards new additions and the resolution of bugs via our -SuiteCRM repository on GitHub -https://github.com/salesagility/SuiteCRM[1] .
- -[14.01.2014] SuiteCRM 7.0.2 and 7.1 are due for release this month. -7.0.2 is a bugfix release with fixes to languages, the theme and modules -such as AOS/AOW/AOP and AOR. 7.1 is a minor release with new features -such as OpenMeetings/Social Integration and more... diff --git a/_source/wikifiles.zip b/_source/wikifiles.zip deleted file mode 100644 index 325650c04..000000000 Binary files a/_source/wikifiles.zip and /dev/null differ diff --git a/_source/wikifiles/Coding Standards.adoc b/_source/wikifiles/Coding Standards.adoc deleted file mode 100644 index 9bcc9a229..000000000 --- a/_source/wikifiles/Coding Standards.adoc +++ /dev/null @@ -1,322 +0,0 @@ -[[coding-standards-for-suitecrm]] -Coding Standards for SuiteCRM ------------------------------ - -Some parts of the SuiteCRM code structure for PHP markup are -inconsistent in their style. SuiteCRM are working to gradually improve -this by helping our internal team and contributors maintain a consistent -style so the code can become clean and easy to read at a glance. This -will be an ongoing transition but we encourage users to begin to think -about their supplied bug fixes and enhancements to conform to the below -standards. We thank you for your continued contributions! - -[[license]] -License -------- - -At the beginning of each new *core* file include the following license -as the standard header - -
 /**
-
-`* ` +
-`* SugarCRM Community Edition is a customer relationship management program developed by ` +
-`* SugarCRM, Inc. Copyright (C) 2004-2013 SugarCRM Inc. ` +
-`* ` +
-`* SuiteCRM is an extension to SugarCRM Community Edition developed by SalesAgility Ltd. ` +
-`* Copyright (C) 2011 - 2017 SalesAgility Ltd. ` +
-`* ` +
-`* 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[`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 and "Supercharged by SuiteCRM" logo. If the display of the logos is not ` +
-`* reasonably feasible for technical reasons, the Appropriate Legal Notices must ` +
-`* display the words "Powered by SugarCRM" and "Supercharged by SuiteCRM". ` +
-`*/`
-
-
- -Ensure that the if statement for the valid entry point has been moved to -*below* the license. - -
-
-if (!defined('sugarEntry') || !sugarEntry) \{
-
-`   die('Not A Valid Entry Point');`
-
-}
-
-
- -[[indentation]] -Indentation ------------ - -Using PSR-2 Indentation. - -Code MUST use an indent of 4 spaces, and MUST NOT use tabs for -indenting. - -JavaScript files should be indented using 2 spaces. - -[[class-names]] -Class Names ------------ - -Class names should use 'StudlyCaps' e.g ClassName, DoSomething.. Classes -should be named relevant to their Entity. - -Example:-
 class YoungInfant extends
-Person \{
-
-} 
- -[[function-names]] -Function Names --------------- - -Function names should use lower camelCase e.g - functionName, -doSomething. Functions should also be named descriptively with -preferably a verb in them. - -Example:-
 function
-printLoginStatus($user, $time) \{
-
-`   // do Something`
-
-} 
- -In function arguments the variables should be descriptive of the -variables use. - -[[variables]] -Variables ---------- - -Static and Member variables should be lower camelCase and do not -abbreviate variable names un-necessarily. - -Example:-
 public static $jobStrings;
-
-var $disableRowLevelSecurity = true ; 
Also ensure that -uninitialised variables are checked if set by using the built-in isset() -function. - -Example:-
 if (isset($forum)) 
- -[[quotations]] -Quotations ----------- - -Use single and double quotes when appropriate. If you’re not evaluating -anything in the string, use single quotes. There should be no need to -ever escape quotes within a string. - -Example:-
 $sample = 'Hello'; $sample =
-"Hello, $name"; $sample = "Hello, \{$name}"; 
- -[[arrays]] -Arrays ------- - -When declaring indexed arrays with the Array function, a trailing space -must be added after each comma delimiter to improve readability. - -Example:-
 $sampleArray = array(1, 2, 3,
-'Zend', 'Studio'); 
When declaring a multi-line indexed array the -initial array item may begin on the following line. If so, it should be -padded at one indentation level greater than the line contain the array -declaration, and all successive lines should have the same indentation; -the closing parenthesis should be on a line by itself at the same -indentation level as the line contain the array declaration. - -Example:-
 $sampleArray = array(
-
-`   1, 2, 3, 'Zend', 'Studio', ` +
-`   $a, $b, $c, ` +
-`   56.44, $d, 500, `
-
-); 
When declaring associative arrays the initial array item may -begin on the following line. If so, it should be padded at one -indentation level greater than the line containing the array -declaration, and all successive lines should have the same indentation; -the closing parenthesis should be on a line by itself at the same -indentation level as the line containing the array declaration. For -readability, the various "=>" assignment operators should be padded such -that they align. - -Example:-
 $sampleArray = array(
-
-`   'firstKey'  => 'firstValue', ` +
-`   'secondKey' => 'secondValue', `
-
-); 
- -[[brace-style]] -Brace Style ------------ - -*Always include the braces*: Even if not required still maintain the -braces to provide code clarity. - -Bad:-
 if (condition) do_stuff();
-
-if (condition)
-
-`   do_stuff(); `
-
-
- -Good:-
 if (condition) \{
-
-`   do_stuff(); `
-
-}
-
-if($a != 2) \{
-
-`   $a = 2; `
-
-} elseif($a == 3) \{
-
-`   $a = 4; `
-
-} else \{
-
-`   $a = 7; `
-
-} 
- -Opening bracket on class, function, method names should be on the next -line as the declaration and the exiting bracket on a line of its own. - -Example:-
 class ThisClass \{     public
-function newMethod()
-
-`   {`
-
-    } } function newFunction() \{
-
-} 
- -[[comments]] -Comments --------- - -Use https://phpdoc.org/[phpdoc] syntax before all -classes/methods/members/functions definitions. A simple template can be -set up in your IDE. - -* All class definitions should have at least @author and @package with -the @author on the last line of the block-level comment -* Always start block-level comments containing phpdoc with two asterisks -(/** ... */) -* Single commenting should have a space first, followed by a capital -letter with no full stop needed // This is an example - -Often comment on any tricky, obscure, or otherwise -not-immediately-obvious code to include any assumptions your code makes, -or preconditions for its proper operation. A developer should be able to -look at any part of the application and understand well enough what's -going on in a reasonable amount of time. - -Example:-
 /**
-
-* The method's summary
-* 
-* This method's short description which can span
-* along multiple lines – also provide context
-* to the method.
-* 
-* @param string $variable with a description of this argument
-* @return void
-* /
-
-public function myMethod($variable) \{
-
-`   // Do something here`
-
-} 
- -[[general-guidelines]] -General Guidelines ------------------- - -Any new class (including classed in generated files) should use the -constructor __construct, but only where a constructor is required. - -Example:-
 function __construct() \{
-
-`   // do child class specific code here` +
-`   parent::__construct();`
-
-} 
- -Ensure your code is compatible with current supported Databases and PHP -versions - MySQL, MSSQL, PHP 5.5, PHP 5.6 and PHP 7. - -Ensure your code is compatible with supported browsers – see our -link:Compatibility_Matrix[wiki]. - -[[house-keeping]] -House Keeping -------------- - -If including JavaScript files, a minified version should be used in the -core, with an un-minified version added to the equivalent directory -within 'jssource' folder. Any modifications to JavaScript files should -be made in the 'jssource' folder and then minified into the core. - -If developing a new core feature do not create files within the custom -directory and ensure that the new module name is sensible and relevant -with no prefixes. - -If adding a new module clean up generated files so only the required -files are used. The following are examples (but not limited to) of -tidying up a module's directory/files. - -* Remove studio.php if it should not be in studio -* Remove '_sugar' class file from main class file if it not assignable -* or in security groups remove the option from the vardefs and remove -// to ensure that modules created and deployed under CE will -continue to function under team security if the instance is upgraded to -PRO diff --git a/_source/wikifiles/Coding Standards.wiki b/_source/wikifiles/Coding Standards.wiki deleted file mode 100644 index b65d736a6..000000000 --- a/_source/wikifiles/Coding Standards.wiki +++ /dev/null @@ -1,298 +0,0 @@ - -= Coding Standards for SuiteCRM = - -Some parts of the SuiteCRM code structure for PHP markup are inconsistent in their style. -SuiteCRM are working to gradually improve this by helping our internal team and contributors maintain a consistent style so the code can become clean and easy to read at a glance. -This will be an ongoing transition but we encourage users to begin to think about their supplied bug fixes and enhancements to conform to the below standards. We thank you for your continued contributions! - -= License = - -At the beginning of each new '''core''' file include the following license as the standard header - -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -/** - * - * SugarCRM Community Edition is a customer relationship management program developed by - * SugarCRM, Inc. Copyright (C) 2004-2013 SugarCRM Inc. - * - * SuiteCRM is an extension to SugarCRM Community Edition developed by SalesAgility Ltd. - * Copyright (C) 2011 - 2017 SalesAgility Ltd. - * - * 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 and "Supercharged by SuiteCRM" logo. If the display of the logos is not - * reasonably feasible for technical reasons, the Appropriate Legal Notices must - * display the words "Powered by SugarCRM" and "Supercharged by SuiteCRM". - */ -</pre> - - -Ensure that the if statement for the valid entry point has been moved to '''below''' the license. - -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> - -if (!defined('sugarEntry') || !sugarEntry) { - die('Not A Valid Entry Point'); -} - -</pre> - -= Indentation = - -Using PSR-2 Indentation. - -Code MUST use an indent of <u>4 spaces</u>, and MUST NOT use tabs for indenting. - -JavaScript files should be indented using <u>2 spaces</u>. - -= Class Names = - -Class names should use 'StudlyCaps' e.g ClassName, DoSomething.. Classes should be named relevant to their Entity. - -Example:- -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -class YoungInfant extends Person -{ - -} -</pre> - -= Function Names = - -Function names should use lower camelCase e.g - functionName, doSomething. Functions should also be named descriptively with preferably a verb in them. - -Example:- -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -function printLoginStatus($user, $time) -{ - // do Something -} -</pre> - -In function arguments the variables should be descriptive of the variables use. - -= Variables = - -Static and Member variables should be lower camelCase and do not abbreviate variable names un-necessarily. - -Example:- -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -public static $jobStrings; - -var $disableRowLevelSecurity = true ; -</pre> -Also ensure that uninitialised variables are checked if set by using the built-in isset() function. - -Example:- -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -if (isset($forum)) -</pre> - -= Quotations = - -Use single and double quotes when appropriate. If you’re not evaluating anything in the string, use single quotes. There should be no need to ever escape quotes within a string. - -Example:- -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -$sample = 'Hello'; -$sample = "Hello, $name"; -$sample = "Hello, {$name}"; -</pre> - -= Arrays = - -When declaring indexed arrays with the Array function, a trailing space must be added after each comma delimiter to improve readability. - -Example:- -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -$sampleArray = array(1, 2, 3, 'Zend', 'Studio'); -</pre> -When declaring a multi-line indexed array the initial array item may begin on the following line. If so, it should be padded at one indentation level greater than the line contain the array declaration, and all successive lines should have the same indentation; the closing parenthesis should be on a line by itself at the same indentation level as the line contain the array declaration. - -Example:- -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -$sampleArray = array( - 1, 2, 3, 'Zend', 'Studio', - $a, $b, $c, - 56.44, $d, 500, -); -</pre> -When declaring associative arrays the initial array item may begin on the following line. If so, it should be padded at one indentation level greater than the line containing the array declaration, and all successive lines should have the same indentation; the closing parenthesis should be on a line by itself at the same indentation level as the line containing the array declaration. For readability, the various "=>" assignment operators should be padded such that they align. - -Example:- -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -$sampleArray = array( - 'firstKey' => 'firstValue', - 'secondKey' => 'secondValue', -); -</pre> - -= Brace Style = - -'''Always include the braces''': Even if not required still maintain the braces to provide code clarity. - -Bad:- -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -if (condition) do_stuff(); - -if (condition) - do_stuff(); -</pre> - -Good:- -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -if (condition) { - do_stuff(); -} - -if($a != 2) { - $a = 2; -} -elseif($a == 3) { - $a = 4; -} -else { - $a = 7; -} -</pre> - -Opening bracket on class, function, method names should be on the next line as the declaration and the exiting bracket on a line of its own. - -Example:- -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -class ThisClass -{ -    public function newMethod() - { - -    } -} -function newFunction() -{ - -} -</pre> - -= Comments = -Use [https://phpdoc.org/ phpdoc] syntax before all classes/methods/members/functions definitions. A simple template can be set up in your IDE. - -* All class definitions should have at least @author and @package with the @author on the last line of the block-level comment -*Always start block-level comments containing phpdoc with two asterisks (/** ... */) -*Single commenting should have a space first, followed by a capital letter with no full stop needed <code>// This is an example</code> - -Often comment on any tricky, obscure, or otherwise not-immediately-obvious code to include any assumptions your code makes, or preconditions for its proper operation. A developer should be able to look at any part of the application and understand well enough what's going on in a reasonable amount of time. - -Example:- -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -/** -* The method's summary -* -* This method's short description which can span -* along multiple lines – also provide context -* to the method. -* -* @param string $variable with a description of this argument -* @return void -*/ -public function myMethod($variable) -{ - // Do something here -} -</pre> - -= General Guidelines = -Any new class (including classed in generated files) should use the constructor __construct, but only where a constructor is required. - -Example:- -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -function __construct() -{ - // do child class specific code here - parent::__construct(); -} -</pre> - -Ensure your code is compatible with current supported Databases and PHP versions - MySQL, MSSQL, PHP 5.5, PHP 5.6 and PHP 7. - -Ensure your code is compatible with supported browsers – see our [[Compatibility_Matrix|wiki]]. - -= House Keeping = - -If including JavaScript files, a minified version should be used in the core, with an un-minified version added to the equivalent directory within 'jssource' folder. Any modifications to JavaScript files should be made in the 'jssource' folder and then minified into the core. - -If developing a new core feature do not create files within the custom directory and ensure that the new module name is sensible and relevant with no prefixes. - -If adding a new module clean up generated files so only the required files are used. The following are examples (but not limited to) of tidying up a module's directory/files. - -* Remove studio.php if it should not be in studio -* Remove '_sugar' class file from main class file if it not assignable -* or in security groups remove the option from the vardefs and remove <code>// to ensure that modules created and deployed under CE will continue to function under team security if the instance is upgraded to PRO</code> diff --git a/_source/wikifiles/Compatibility Matrix.adoc b/_source/wikifiles/Compatibility Matrix.adoc deleted file mode 100644 index fcc6328db..000000000 --- a/_source/wikifiles/Compatibility Matrix.adoc +++ /dev/null @@ -1,90 +0,0 @@ -__FORCETOC__ - -[[x]] -7.9.x -~~~~~ - -| class="wikitable" style="margin: auto; width: 40%;" ! scope="row" -colspan="2"| Platform |- |Linux, Unix, Mac OS |Any version supporting -PHP |- |Windows |Windows Server 2008+ |- |PHP |5.5, 5.6, 7.0, 7.1 |- ! -scope="row" colspan="2"| Web Server |- |Apache |2.2, 2.4 |- |IIS |8, 8.5 -|- ! scope="row" colspan="2"| Database |- |MariaDB |5.5, 10, 10.1 |- -|MySQL |5.5, 5.6, 5.7 |- |SQL Server |SQL Server 2008+ - -|- ! scope="row" colspan="2"| Browsers |- |Chrome |55+ |- |Firefox |52+ -|- |IE |11 (compatibility mode not supported) |- |Edge |26 |- |Safari -|6+ |} - -[[x-1]] -7.8.x -~~~~~ - -| class="wikitable" style="margin: auto; width: 40%;" ! scope="row" -colspan="2"| Platform |- |Linux, Unix, Mac OS |Any version supporting -PHP |- |Windows |Windows Server 2008+ |- |PHP |5.5, 5.6, 7.0, 7.1 |- ! -scope="row" colspan="2"| Web Server |- |Apache |2.2, 2.4 |- |IIS |8, 8.5 -|- ! scope="row" colspan="2"| Database |- |MariaDB |5.5, 10, 10.1 |- -|MySQL |5.5, 5.6, 5.7 |- |SQL Server |SQL Server 2008+ - -|- ! scope="row" colspan="2"| Browsers |- |Chrome |55+ |- |Firefox |52+ -|- |IE |11 (compatibility mode not supported) |- |Edge |26 |- |Safari -|6+ |} - -[[x-2]] -7.7.x -~~~~~ - -| class="wikitable" style="margin: auto; width: 40%;" ! scope="row" -colspan="2"| Platform |- |Linux, Unix, Mac OS |Any version supporting -PHP |- |Windows |Windows Server 2008+ |- |PHP |5.3, 5.5, 5.6, 7.0 |- ! -scope="row" colspan="2"| Web Server |- |Apache |2.2, 2.4 |- |IIS |8, 8.5 -|- ! scope="row" colspan="2"| Database |- |MariaDB |5.5, 10, 10.1 |- -|MySQL |5.5, 5.6 |- |SQL Server |SQL Server 2008+ - -|- ! scope="row" colspan="2"| Browsers |- |Chrome |43+ |- |Firefox |38+ -|- |IE |11 (compatibility mode not supported) |- |Edge |26 |- |Safari -|6+ | - -[[x-3]] -7.6.x -~~~~~ - -| class="wikitable" style="margin: auto; width: 40%;" ! scope="row" -colspan="2"| Platform |- |Linux, Unix, Mac OS |Any version supporting -PHP |- |Windows |Windows Server 2008+ |- |PHP |5.5, 5.6, 7.0 |- ! -scope="row" colspan="2"| Web Server |- |Apache |2.2, 2.4 |- |IIS |8, 8.5 -|- ! scope="row" colspan="2"| Database |- |MariaDB |5.5, 10, 10.1 |- -|MySQL |5.5, 5.6 |- |SQL Server |SQL Server 2008+ - -|- ! scope="row" colspan="2"| Browsers |- |Chrome |43+ |- |Firefox |38+ -|- |IE |11 (compatibility mode not supported) |- |Edge |26 |- |Safari -|6+ |} - -[[x-4]] -7.5.x -~~~~~ - -| class="wikitable" style="margin: auto; width: 40%;" ! scope="row" -colspan="2"| Platform |- |Linux, Unix, Mac OS |Any version supporting -PHP |- |Windows |Windows Server 2008+ |- |PHP |5.5, 5.6, 7.0 |- ! -scope="row" colspan="2"| Web Server |- |Apache |2.2 |- |IIS |8, 8.5 |- ! -scope="row" colspan="2"| Database |- |MariaDB |5.5, 10, 10.1 |- |MySQL -|5.5, 5.6 |- |SQL Server |SQL Server 2008+ - -|- ! scope="row" colspan="2"| Browsers |- |Chrome |43+ |- |Firefox |38+ -|- |IE |11 (compatibility mode not supported) |- |Edge |26 |- |Safari -|6+ |} - -[[x-5]] -7.4.x -~~~~~ - -| class="wikitable" style="margin: auto; width: 40%;" ! scope="row" -colspan="2"| Platform |- |Linux, Unix, Mac OS |Any version supporting -PHP |- |Windows |Windows Server 2008+ |- |PHP |5.3, 5.4, 5.5, 5.6 |- ! -scope="row" colspan="2"| Web Server |- |Apache |2.0, 2.2 |- |IIS |7.0, -7.5, 8, 8.5 |- ! scope="row" colspan="2"| Database |- |MariaDB |5.5, 10, -10.1 |- |MySQL |5.1, 5.5, 5.6 |- |SQL Server |SQL Server 2008+ - -|- ! scope="row" colspan="2"| Browsers |- |Chrome |38+ |- |Firefox |32+ -|- |IE |9, 10, 11 (compatibility mode not supported) |- |Safari |6+ |} diff --git a/_source/wikifiles/Compatibility Matrix.wiki b/_source/wikifiles/Compatibility Matrix.wiki deleted file mode 100644 index ad1bd7deb..000000000 --- a/_source/wikifiles/Compatibility Matrix.wiki +++ /dev/null @@ -1,304 +0,0 @@ - -__FORCETOC__ -==7.9.x == -| class="wikitable" style="margin: auto; width: 40%;" -! scope="row" colspan="2"| Platform -|- -|Linux, Unix, Mac OS -|Any version supporting PHP -|- -|Windows -|Windows Server 2008+ -|- -|PHP -|5.5, 5.6, 7.0, 7.1 -|- -! scope="row" colspan="2"| Web Server -|- -|Apache -|2.2, 2.4 -|- -|IIS -|8, 8.5 -|- -! scope="row" colspan="2"| Database -|- -|MariaDB -|5.5, 10, 10.1 -|- -|MySQL -|5.5, 5.6, 5.7 -|- -|SQL Server -|SQL Server 2008+ - -|- -! scope="row" colspan="2"| Browsers -|- -|Chrome -|55+ -|- -|Firefox -|52+ -|- -|IE -|11 (compatibility mode not supported) -|- -|Edge -|26 -|- -|Safari -|6+ -|} - -==7.8.x == -| class="wikitable" style="margin: auto; width: 40%;" -! scope="row" colspan="2"| Platform -|- -|Linux, Unix, Mac OS -|Any version supporting PHP -|- -|Windows -|Windows Server 2008+ -|- -|PHP -|5.5, 5.6, 7.0, 7.1 -|- -! scope="row" colspan="2"| Web Server -|- -|Apache -|2.2, 2.4 -|- -|IIS -|8, 8.5 -|- -! scope="row" colspan="2"| Database -|- -|MariaDB -|5.5, 10, 10.1 -|- -|MySQL -|5.5, 5.6, 5.7 -|- -|SQL Server -|SQL Server 2008+ - -|- -! scope="row" colspan="2"| Browsers -|- -|Chrome -|55+ -|- -|Firefox -|52+ -|- -|IE -|11 (compatibility mode not supported) -|- -|Edge -|26 -|- -|Safari -|6+ -|} - -==7.7.x == -| class="wikitable" style="margin: auto; width: 40%;" -! scope="row" colspan="2"| Platform -|- -|Linux, Unix, Mac OS -|Any version supporting PHP -|- -|Windows -|Windows Server 2008+ -|- -|PHP -|5.3, 5.5, 5.6, 7.0 -|- -! scope="row" colspan="2"| Web Server -|- -|Apache -|2.2, 2.4 -|- -|IIS -|8, 8.5 -|- -! scope="row" colspan="2"| Database -|- -|MariaDB -|5.5, 10, 10.1 -|- -|MySQL -|5.5, 5.6 -|- -|SQL Server -|SQL Server 2008+ - -|- -! scope="row" colspan="2"| Browsers -|- -|Chrome -|43+ -|- -|Firefox -|38+ -|- -|IE -|11 (compatibility mode not supported) -|- -|Edge -|26 -|- -|Safari -|6+ -| - -==7.6.x == -| class="wikitable" style="margin: auto; width: 40%;" -! scope="row" colspan="2"| Platform -|- -|Linux, Unix, Mac OS -|Any version supporting PHP -|- -|Windows -|Windows Server 2008+ -|- -|PHP -|5.5, 5.6, 7.0 -|- -! scope="row" colspan="2"| Web Server -|- -|Apache -|2.2, 2.4 -|- -|IIS -|8, 8.5 -|- -! scope="row" colspan="2"| Database -|- -|MariaDB -|5.5, 10, 10.1 -|- -|MySQL -|5.5, 5.6 -|- -|SQL Server -|SQL Server 2008+ - -|- -! scope="row" colspan="2"| Browsers -|- -|Chrome -|43+ -|- -|Firefox -|38+ -|- -|IE -|11 (compatibility mode not supported) -|- -|Edge -|26 -|- -|Safari -|6+ -|} - -==7.5.x == -| class="wikitable" style="margin: auto; width: 40%;" -! scope="row" colspan="2"| Platform -|- -|Linux, Unix, Mac OS -|Any version supporting PHP -|- -|Windows -|Windows Server 2008+ -|- -|PHP -|5.5, 5.6, 7.0 -|- -! scope="row" colspan="2"| Web Server -|- -|Apache -|2.2 -|- -|IIS -|8, 8.5 -|- -! scope="row" colspan="2"| Database -|- -|MariaDB -|5.5, 10, 10.1 -|- -|MySQL -|5.5, 5.6 -|- -|SQL Server -|SQL Server 2008+ - -|- -! scope="row" colspan="2"| Browsers -|- -|Chrome -|43+ -|- -|Firefox -|38+ -|- -|IE -|11 (compatibility mode not supported) -|- -|Edge -|26 -|- -|Safari -|6+ -|} - -==7.4.x == -| class="wikitable" style="margin: auto; width: 40%;" -! scope="row" colspan="2"| Platform -|- -|Linux, Unix, Mac OS -|Any version supporting PHP -|- -|Windows -|Windows Server 2008+ -|- -|PHP -|5.3, 5.4, 5.5, 5.6 -|- -! scope="row" colspan="2"| Web Server -|- -|Apache -|2.0, 2.2 -|- -|IIS -|7.0, 7.5, 8, 8.5 -|- -! scope="row" colspan="2"| Database -|- -|MariaDB -|5.5, 10, 10.1 -|- -|MySQL -|5.1, 5.5, 5.6 -|- -|SQL Server -|SQL Server 2008+ - -|- -! scope="row" colspan="2"| Browsers -|- -|Chrome -|38+ -|- -|Firefox -|32+ -|- -|IE -|9, 10, 11 (compatibility mode not supported) -|- -|Safari -|6+ -|} diff --git a/_source/wikifiles/Contributing.adoc b/_source/wikifiles/Contributing.adoc deleted file mode 100644 index 91b891c01..000000000 --- a/_source/wikifiles/Contributing.adoc +++ /dev/null @@ -1,322 +0,0 @@ -[[how-to-contribute]] -How to Contribute ------------------ - -We want everyone to be able to contribute to SuiteCRM regardless of what -technical knowledge they may possess. Whether your a non-tech savvy -consumer, a graduate seeking a new project to dabble in, or a veteran -developer – all are welcome to maintain our title of the world's best -open source CRM! - -[[issue-raising]] -Issue raising -~~~~~~~~~~~~~ - -An issue is an area where you can feel the project could be improved, -for example, you could report a problem or bug you've encountered while -using the software, a feature you feel is missing, or a gap in the -project's documentation. - -When raising issues via our GitHub repository ensure you state the issue -clearly with a full description of steps to reproduce, what version(s) -of SuiteCRM the issue was found in and; if relevant what platform it is -running on and a screenshot of the issue. This will allow any -contributor to easily identify and potentially address the issue. Here -is the GitHub guide to all things issues. - -Good example of a raised issue: - -https://github.com/salesagility/SuiteCRM/issues/1519[https://github.com/salesagility/SuiteCRM/issues/1519] - -[[security]] -Security -^^^^^^^^ - -We take Security seriously here at SuiteCRM so if you have discovered a -security risk report it by emailing security@suitecrm.com. This will be -delivered to the product team who handle security issues. *Please don't -disclose security bugs publicly* until they have been handled by the -security team. - -Your email will be acknowledged within 24 hours during the business week -(Mon - Fri), and you’ll receive a more detailed response to your email -within 72 hours during the business week (Mon - Fri) indicating the next -steps in handling your report. - -[[labelling]] -Labelling -~~~~~~~~~ - -We have a number of labels that we tag issues with to define it's type, -priority, and action. - -Type: - -* bug -* duplicate -* invalid -* question -* suggestion - -Priority: - -* Low Priority -* Medium Priority -* High Priority - -Action: - -* Resolved: Next Release -* Fixed Proposed -* Pending Input -* Wrong Branch -* In Review - -We encourage users whom feel an issue should be raised as a higher -priority for a next release that they should make a comment to that -affect. This also applies to incorrect labelling. - -[[providing-a-bug-fix]] -Providing a Bug Fix -------------------- - -* To provide a code contribution for an issue you will need to set up -your own fork of the SuiteCRM repository, make your code changes, commit -the changes and make a Pull Request to the appropriate branch on the -SuiteCM repository. See our -link:Contributing_to_SuiteCRM#Quick_Guide_to_Fork_SuiteCRM[Quick Guide -to Fork SuiteCRM]. Once you have set up your forked repository you can -begin making commits to the project. - -* First, determine which base branch your bug fix should use. If your -bug is present in both hotfix and hotfix-7.8.x then use the hotfix-7.8.x -branch. If however, your bug is specific to hotfix, then you can use the -hotfix branch. - -* Separate each issue fix into a new branch in your repository (Either -from the *hotfix-7.8.x* or *hotfix* branch) and name it with the issue -ID e.g. bugfix_3062 or issue-1234. - -* When committing to your individual bugfix branch, it helps to follow -the message format below: - -
 Fixed #1234 -  
- -e.g of a commit command
 $ git commit -m
-"Fixed #1436 - Reports with nested Parentheses are removing parameters"
-
This commit message format allows us to easily include all bug -fixes within major and minor link:Release_notes_7.6[release notes]. - -If you are new to Writing Commit Messages in git follow the guide -http://chris.beams.io/posts/git-commit/#seven-rules[here] - -[[make-a-bug-fix-pull-request]] -Make a Bug Fix Pull Request -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -* After you have made your commits and pushed them up to your forked -repository you then create a -http://help.github.com/articles/using-pull-requests/[Pull Request] to be -reviewed and merged into the SuiteCRM repository. Make a new Pull -Request for each issue you fix – *do not* combine multiple bugfixes into -one Pull Request. - -* Ensure that in your Pull Request that the base fork is -*salesagility/SuiteCRM* and base branch is either '''hotfix ''' or -*hotfix-7.8.x* with the head fork being *your repository* and a base -branch of your unique bugfix branch e.g. *bugfix_1234* - -* We will automatically reject any Pull Requests made to the wrong -branch! - -[[cla-check]] -CLA Check -~~~~~~~~~ - -If you have not signed our -https://www.clahub.com/agreements/salesagility/SuiteCRM[CLA] -(Contributor License Agreement) then your Pull Request will fail a check -and unable to be merged into the project. You will only required to sign -this once. - -[[travis-ci]] -Travis CI -~~~~~~~~~ - -When a new Pull Request is opened, Travis CI will test the merging of -the origin and upstream branch and update the Pull Request. If this -check fails you can review the test results and resolve accordingly. To -test prior to making a Pull Request install PHPUnit via composer into -your develop environment then cd into the tests directory and run: - -
 $ sh runtests.sh 
- -[[providing-a-feature]] -Providing a Feature -------------------- - -To contribute a feature to SuiteCRM, similar to providing a Bug Fix, you -must create a forked repository of SuiteCRM and set up your git and -development environment. - -Once done, create a new branch from **develop** and name it -relevant to the feature's propose e.g campaign-wizard-ui. Following our -link:Coding_Standards[Code Standards] develop the new feature and ensure -your forked repository is kept up to date with minor/major releases. See -our link:Contributing_to_SuiteCRM#Quick_Guide_to_Fork_SuiteCRM[Quick -Guide to Fork SuiteCRM] to update your repository. - -Make sure your commit messages are relevant and descriptive. When ready -to submit for review make a Pull Request detailing your feature's -functionality. - -Ensure that in your Pull Request that the base fork is -*salesagility/SuiteCRM* and base branch is *develop* and the head fork -is *your repository* and the base branch is your feature branch. - -Add any new PHPUnit tests to the new feature branch if required e.g new -modules or classes. - -[[reviewing-features]] -Reviewing Features -^^^^^^^^^^^^^^^^^^ - -We will review the code and provide feedback within the Pull Request and -issues relating to your feature. If the feature is to be included in the -core product we will request for the forked repo to have an Issues tab -so we can raise any bugs from our testing. This will also allow you to -fix those issues using the below commit message format similar to how to -submit bug fixes to the hotfix-7.8.x branch. - -
 $ git commit -m "Fixed #1436 - Reports with
-nested Parentheses are removing parameters" 
- -*Note**** You can add an Issues tab to your forked repository via the -'Settings' tab. - -New features that have been accepted and merged will be included in the -next suitable Major release of the project for e.g 7.7 or 7.8 are major -releases. Minor releases only include bug fixes or in-house features -developed e.g 7.6.5 or 7.7.1 would be minor releases. - -[[quick-guide-to-fork-suitecrm]] -Quick Guide to Fork SuiteCRM ----------------------------- - -[[fork-the-suitecrm-repository]] -Fork the SuiteCRM repository -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You can do this entirely from the github website. See -https://help.github.com/articles/fork-a-repo/[Forking Git] to learn how. - -[[setup-git-on-your-local-machine]] -Setup Git on your local machine -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Follow the guide produced by -https://help.github.com/articles/set-up-git/[Github], which provides -detailed instructions on setting up git and connecting to Github from -your local machine. - -[[clone-your-repository-on-your-local-machine]] -Clone your repository on your local machine -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -With git setup and your Github fork created, we can now clone the git -repository to our local machine. Change to the directory you wish to do -this at, and issue this command to clone the SuiteCRM repository ( -changing username for your username in Github )
 $
-git clone git@github.com:username/SuiteCRM.git 
- -Now that we have cloned the repository locally, we next need to setup -the remote repositories that this repository will reference. By default, -git creates the origin remote, which points to the fork you created on -github (https://github.com/username/SuiteCRM) . However, in order to -stay up to date with the changes to the parent repository -(https://github.com/salesagility/SuiteCRM) you'll want to setup the -upstream remote as well. Here's how:
 $ cd
-SuiteCRM $ git remote add upstream
-git://github.com/salesagility/SuiteCRM $ git fetch upstream 
- -Now anytime you want to update your forked branch it's a simple process. -Just change to the branch you want to update from the upstream ( for -example, the master branch ) and then issue the commands below:
 $ git checkout master $ git fetch upstream $ git
-merge upstream/master $ git push origin master 
These commands -will pull down the latest changes from the upstream repo -(https://github.com/salesagility/SuiteCRM) to your local repo, then -merge the changes into your local clone's master branch, and finally -push those changes back up to your fork's repository on Github. This is -key to keep your master, hotfix, and develop up to date after a minor -and major release. - -[[code-of-conduct]] -Code of Conduct ---------------- - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our -project and our community a harassment-free experience for everyone, -regardless of age, body size, disability, ethnicity, gender identity and -expression, level of experience, nationality, personal appearance, race, -religion, or sexual identity and orientation. - -Examples of behaviour that contributes to creating a positive -environment include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community in a professional manner -* Showing empathy towards other community members - -Examples of unacceptable behaviour by participants include: - -* The use of sexualized language or imagery and unwelcome sexual -attention or advances -* Trolling, insulting/derogatory comments, and personal or political -attacks -* Public or private harassment -* Publishing others' private information, such as a physical or -electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a -professional setting - -The SuiteCRM project maintainers are responsible for clarifying the -standards of acceptable behaviour and are expected to take appropriate -and fair corrective action in response to any instances of unacceptable -behaviour. Project maintainers who do not follow or enforce the Code of -Conduct may be permanently removed from the project team. - -The SuiteCRM project maintainers have the right and responsibility to -remove, edit, or reject comments, commits, code, wiki edits, issues, and -other contributions that are not aligned to this Code of Conduct, or to -ban temporarily or permanently any contributor for other behaviours that -they deem inappropriate, threatening, offensive, or harmful. - -This Code of Conduct applies both within project spaces and in public -spaces when an individual is representing the project or its community. -Examples of representing a project or community include using an -official project e-mail address, within project forums, posting via an -official social media account, or acting as an appointed representative -at an online or offline event. - -Instances of abusive, harassing, or otherwise unacceptable behaviour may -be reported by contacting the project team at community@suitecrm.com. -All complaints will be reviewed and investigated and will result in a -response that is deemed necessary and appropriate to the circumstances. -The project team is obligated to maintain confidentiality with regard to -the reporter of an incident. Further details of specific enforcement -policies may be posted separately. - -This Code of Conduct is adapted from the Contributor -http://contributor-covenant.org[Covenant], version 1.4, available at -http://contributor-covenant.org/version/1/4/[version] diff --git a/_source/wikifiles/Contributing.wiki b/_source/wikifiles/Contributing.wiki deleted file mode 100644 index d816c1578..000000000 --- a/_source/wikifiles/Contributing.wiki +++ /dev/null @@ -1,212 +0,0 @@ -= How to Contribute = - -We want everyone to be able to contribute to SuiteCRM regardless of what technical knowledge they may possess. Whether your a non-tech savvy consumer, a graduate seeking a new project to dabble in, or a veteran developer – all are welcome to maintain our title of the world's best open source CRM! - -== Issue raising == - -An issue is an area where you can feel the project could be improved, for example, you could report a problem or bug you've encountered while using the software, a feature you feel is missing, or a gap in the project's documentation. - -When raising issues via our GitHub repository ensure you state the issue clearly with a full description of steps to reproduce, what version(s) of SuiteCRM the issue was found in and; if relevant what platform it is running on and a screenshot of the issue. This will allow any contributor to easily identify and potentially address the issue. Here is the GitHub guide to all things issues. - -Good example of a raised issue: - -[https://github.com/salesagility/SuiteCRM/issues/1519 https://github.com/salesagility/SuiteCRM/issues/1519] - -=== Security === - -We take Security seriously here at SuiteCRM so if you have discovered a security risk report it by -emailing [mailto:security@suitecrm.com security@suitecrm.com]. This will be delivered to the product team who handle security issues. -'''Please don't disclose security bugs publicly''' until they have been handled by the security team. - -Your email will be acknowledged within 24 hours during the business week (Mon - Fri), and you’ll receive a more -detailed response to your email within 72 hours during the business week (Mon - Fri) indicating the next steps in -handling your report. - -== Labelling == -We have a number of labels that we tag issues with to define it's type, priority, and action. - -Type: -* bug -* duplicate -* invalid -* question -* suggestion - -Priority: -* Low Priority -* Medium Priority -* High Priority - -Action: -* Resolved: Next Release -* Fixed Proposed -* Pending Input -* Wrong Branch -* In Review - -We encourage users whom feel an issue should be raised as a higher priority for a next release that they should make a comment to that affect. This also applies to incorrect labelling. - -= Providing a Bug Fix = - -* To provide a code contribution for an issue you will need to set up your own fork of the SuiteCRM repository, make your code changes, commit the changes and make a Pull Request to the appropriate branch on the SuiteCM repository. See our [[Contributing_to_SuiteCRM#Quick_Guide_to_Fork_SuiteCRM|Quick Guide to Fork SuiteCRM]]. Once you have set up your forked repository you can begin making commits to the project. - -* First, determine which base branch your bug fix should use. If your bug is present in both hotfix and hotfix-7.8.x then use the hotfix-7.8.x branch. If however, your bug is specific to hotfix, then you can use the hotfix branch. - -* Separate each issue fix into a new branch in your repository (Either from the '''hotfix-7.8.x''' or '''hotfix''' branch) and name it with the issue ID e.g. bugfix_3062 or issue-1234. - -* When committing to your individual bugfix branch, it helps to follow the message format below: - -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -Fixed #1234 - <the subject of the issue> -</pre> - -e.g of a commit command -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -$ git commit -m "Fixed #1436 - Reports with nested Parentheses are removing parameters" -</pre> -This commit message format allows us to easily include all bug fixes within major and minor [[Release_notes_7.6|release notes]]. - -If you are new to Writing Commit Messages in git follow the guide [http://chris.beams.io/posts/git-commit/#seven-rules here] - -== Make a Bug Fix Pull Request == - -* After you have made your commits and pushed them up to your forked repository you then create a [http://help.github.com/articles/using-pull-requests/ Pull Request] to be reviewed and merged into the SuiteCRM repository. Make a new Pull Request for each issue you fix – '''do not''' combine multiple bugfixes into one Pull Request. - -* Ensure that in your Pull Request that the base fork is '''salesagility/SuiteCRM''' and base branch is either '''hotfix ''' or '''hotfix-7.8.x''' with the head fork being '''your repository''' and a base branch of your unique bugfix branch e.g. '''bugfix_1234''' - -* We will automatically reject any Pull Requests made to the wrong branch! - -== CLA Check == - -If you have not signed our [https://www.clahub.com/agreements/salesagility/SuiteCRM CLA] (Contributor License Agreement) then your Pull Request will fail a check and unable to be merged into the project. You will only required to sign this once. - -== Travis CI == - -When a new Pull Request is opened, Travis CI will test the merging of the origin and upstream branch and update the Pull Request. -If this check fails you can review the test results and resolve accordingly. -To test prior to making a Pull Request install PHPUnit via composer into your develop environment then cd into the tests directory and run: - -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -$ sh runtests.sh -</pre> - -= Providing a Feature = - -To contribute a feature to SuiteCRM, similar to providing a Bug Fix, you must create a forked repository of SuiteCRM and set up your git and development environment. - -Once done, create a new branch from <u>'''develop'''</u> and name it relevant to the feature's propose e.g campaign-wizard-ui. Following our [[Coding_Standards|Code Standards]] develop the new feature and ensure your forked repository is kept up to date with minor/major releases. See our [[Contributing_to_SuiteCRM#Quick_Guide_to_Fork_SuiteCRM|Quick Guide to Fork SuiteCRM]] to update your repository. - -Make sure your commit messages are relevant and descriptive. When ready to submit for review make a Pull Request detailing your feature's functionality. - -Ensure that in your Pull Request that the base fork is '''salesagility/SuiteCRM''' and base branch is '''develop''' and the head fork is '''your repository''' and the base branch is your feature branch. - -Add any new PHPUnit tests to the new feature branch if required e.g new modules or classes. - - -=== Reviewing Features === - -We will review the code and provide feedback within the Pull Request and issues relating to your feature. If the feature is to be included in the core product we will request for the forked repo to have an Issues tab so we can raise any bugs from our testing. This will also allow you to fix those issues using the below commit message format similar to how to submit bug fixes to the hotfix-7.8.x branch. - -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -$ git commit -m "Fixed #1436 - Reports with nested Parentheses are removing parameters" -</pre> - -'''Note***''' You can add an Issues tab to your forked repository via the 'Settings' tab. - - - - -New features that have been accepted and merged will be included in the next suitable Major release of the project for e.g 7.7 or 7.8 are major releases. Minor releases only include bug fixes or in-house features developed e.g 7.6.5 or 7.7.1 would be minor releases. - -= Quick Guide to Fork SuiteCRM = - -== Fork the SuiteCRM repository == - -You can do this entirely from the github website. See [https://help.github.com/articles/fork-a-repo/ Forking Git] to learn how. - -== Setup Git on your local machine == - -Follow the guide produced by [https://help.github.com/articles/set-up-git/ Github], which provides detailed instructions on setting up git and connecting to Github from your local machine. - -== Clone your repository on your local machine == - -With git setup and your Github fork created, we can now clone the git repository to our local machine. Change to the directory you wish to do this at, and issue this command to clone the SuiteCRM repository ( changing username for your username in Github ) -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -$ git clone git@github.com:username/SuiteCRM.git -</pre> - -Now that we have cloned the repository locally, we next need to setup the remote repositories that this repository will reference. By default, git creates the origin remote, which points to the fork you created on github (https://github.com/username/SuiteCRM) . However, in order to stay up to date with the changes to the parent repository (https://github.com/salesagility/SuiteCRM) you'll want to setup the upstream remote as well. Here's how: -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -$ cd SuiteCRM -$ git remote add upstream git://github.com/salesagility/SuiteCRM -$ git fetch upstream -</pre> - -Now anytime you want to update your forked branch it's a simple process. Just change to the branch you want to update from the upstream ( for example, the master branch ) and then issue the commands below: -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -$ git checkout master -$ git fetch upstream -$ git merge upstream/master -$ git push origin master -</pre> -These commands will pull down the latest changes from the upstream repo (https://github.com/salesagility/SuiteCRM) to your local repo, then merge the changes into your local clone's master branch, and finally push those changes back up to your fork's repository on Github. This is key to keep your master, hotfix, and develop up to date after a minor and major release. - -= Code of Conduct = - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. - - -Examples of behaviour that contributes to creating a positive environment -include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community in a professional manner -* Showing empathy towards other community members - - -Examples of unacceptable behaviour by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - - -The SuiteCRM project maintainers are responsible for clarifying the standards of acceptable behaviour and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behaviour. Project maintainers who do not follow or enforce the Code of Conduct may be permanently removed from the project team. - - -The SuiteCRM project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviours that they deem inappropriate, threatening, offensive, or harmful. - - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, within project forums, posting via an official social media account, or acting as an appointed representative at an online or offline event. - - -Instances of abusive, harassing, or otherwise unacceptable behaviour may be reported by contacting the project team at [mailto:community@suitecrm.com community@suitecrm.com]. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - - -This Code of Conduct is adapted from the Contributor [http://contributor-covenant.org Covenant], version 1.4, -available at [http://contributor-covenant.org/version/1/4/ version] diff --git a/_source/wikifiles/Contributor Agreement.adoc b/_source/wikifiles/Contributor Agreement.adoc deleted file mode 100644 index 70300ac6a..000000000 --- a/_source/wikifiles/Contributor Agreement.adoc +++ /dev/null @@ -1,42 +0,0 @@ -[[where-can-i-find-the-contributor-agreement]] -Where can I find the Contributor Agreement? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You can find the contributor agreement -http://suitecrm.com/git/suitecrmcontributorlicenseagreement.pdf[here] - -Please read, print, sign, scan and email the contributor agreement to -the address outlined in the document. - -[[what-is-the-contributor-agreement]] -What is the Contributor Agreement? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The Contributor Agreement is a document which outlines the license -agreement between you(the developer) and us(SalesAgility) for any -contributions made to the SuiteCRM project. - -[[why-do-i-need-to-sign-it]] -Why do I need to sign it? -~~~~~~~~~~~~~~~~~~~~~~~~~ - -We want SuiteCRM to be the biggest, best, long-term open source CRM -project available globally, so we need to protect the project:- - -* The Contributor Agreement protects the project and deflects action to -the contributor. -* This means that any legal action for any contributions made to the -project are against Contributor and not Project. -* The Contributor Agreement needs to be signed only once for all pull -requests and contributions in relation to the SuiteCRM project. - -[[what-next]] -What next? -~~~~~~~~~~ - -Once you have signed, scanned and emailed the contributor agreement to -the SuiteCRM team, we will consider your pull -request/development/contribution for inclusion in the SuiteCRM project. - -You will be notified by email if your pull request/contribution is -accepted and included in the SuiteCRM project. diff --git a/_source/wikifiles/Contributor Agreement.wiki b/_source/wikifiles/Contributor Agreement.wiki deleted file mode 100644 index 2e1eeca8a..000000000 --- a/_source/wikifiles/Contributor Agreement.wiki +++ /dev/null @@ -1,24 +0,0 @@ -==Where can I find the Contributor Agreement?== - -You can find the contributor agreement [http://suitecrm.com/git/suitecrmcontributorlicenseagreement.pdf here] - -Please read, print, sign, scan and email the contributor agreement to the address outlined in the document. - -==What is the Contributor Agreement?== - -The Contributor Agreement is a document which outlines the license agreement between you(the developer) and us(SalesAgility) for any contributions made to the SuiteCRM project. - -==Why do I need to sign it?== - -We want SuiteCRM to be the biggest, best, long-term open source CRM project available globally, so we need to protect the project:- - -*The Contributor Agreement protects the project and deflects action to the contributor. -*This means that any legal action for any contributions made to the project are against Contributor and not Project. -*The Contributor Agreement needs to be signed only once for all pull requests and contributions in relation to the SuiteCRM project. - -==What next?== - -Once you have signed, scanned and emailed the contributor agreement to the SuiteCRM team, we will consider your pull request/development/contribution for inclusion in the SuiteCRM project. - -You will be notified by email if your pull request/contribution is accepted and included in the SuiteCRM project. - diff --git a/_source/wikifiles/Installation Guide.adoc b/_source/wikifiles/Installation Guide.adoc deleted file mode 100644 index bf31f3324..000000000 --- a/_source/wikifiles/Installation Guide.adoc +++ /dev/null @@ -1,592 +0,0 @@ -[cols="",] -|======= -|__TOC__ -|======= - -[[suitecrm-installation-guide]] -SuiteCRM Installation Guide -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -[[introduction]] -Introduction -^^^^^^^^^^^^ - -SuiteCRM is SugarCRM, Supercharged! SuiteCRM is a fork of the popular -open source SugarCRM Community Edition. This release features a host of -additional open source modules, along with the standard features and -functionality found within SugarCRM CE. - -[[release-notes]] -Release Notes -^^^^^^^^^^^^^ - -See the latest release notes for SuiteCRM **link:Versions[here]**.
- -[[downloading-and-installing-suitecrm]] -Downloading and installing SuiteCRM -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -If you are installing SuiteCRM for the first time, follow the -instructions in this section. If you have an earlier version of SuiteCRM -installed, refer to the upgrade section for instructions on how to -upgrade your SuiteCRM instance. Follow the steps listed below to install -SuiteCRM: - -1. Install the platform-appropriate (Linux or Windows) version of PHP, -web server, and database on your machine. -2. Download the SuiteCRM files from suitecrm.com(see “Downloading the -latest SuiteCRM files” section). -3. Copy the SuiteCRM files to your web server. -4. Install SuiteCRM by following the SuiteCRM installation wizard. - -[[downloading-the-latest-suitecrm-files]] -Downloading the latest SuiteCRM files -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -1. Navigate to the SuiteCRM Downloads section at -http://suitecrm.com/download -2. Login using your username and password. If you do not have an -account, you can register using the registration form. -3. Download your flavour of SuiteCRM. We advise that all users download -the latest SuiteCRM release. The latest version will contain the latest -features and bug fixes. -4. If you experience any issues during registering an account on our -website or downloading SuiteCRM, please use our support forums. - -[[copying-suitecrm-files-to-web-server]] -Copying SuiteCRM files to web server -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Once your SuiteCRM package has downloaded, you will need to unzip the -files and set permissions required for the installation process. The -following steps explain in detail the prerequisites to setting up your -SuiteCRM files for installation: - -1. Locate the directory on the web server in which the SuiteCRM -directory will be located(most commonly the root directory, or within a -subdirectory). -2. Unzip SuiteCRM into the directory selected in Step 1. This creates a -“SuiteCRM” directory within your selected parent directory. -3. At this stage, you may wish to rename the default “SuiteCRM” -directory. -4. Set ownership of the SuiteCRM directory: -1. chgrp ApacheUser.ApacheGroup -R recursively sets -ownership for root directory to Apache user and group. -5. The system user that your web server uses varies depending on your -operating system. Common web server users are as follows: -1. apache (Linux/Apache) -2. nobody (Linux/Apache) -3. IUSR_computerName (Windows/IIS) - -If you are unsure how to set your web server user on your operating -system, contact your web server host. If you are installing SuiteCRM -locally and need assistance, visit our support forums. - -1. Set the following permissions on the SuiteCRM directory(Linux): -1. sudo chown -R www-data:www-data . -2. sudo chmod -R 755 . -3. sudo chmod -R 775 cache custom modules themes data upload -config_override.php - -The commands/steps taken to setting permissions differs dependant on -your operating system. If you are experiencing issues with setting -permissions on your SuiteCRM instance, visit our support forums. - -[[recommended-installation-pre-requisites]] -Recommended installation pre-requisites -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -* PHP -* JSON -* XML Parsing -* MB Strings Module -* Writable SugarCRM Configuration File (config.php) -* Writeable Custom Directory -* Writable Modules Sub-Directories and Files -* Writable Upload Directory -* Writable Data Sub-Directories -* Writable Cache Sub-Directories -* PHP Memory Limit (at least 128M) -* ZLIB Compression Module -* ZIP Handling Module -* PCRE Library -* IMAP Module -* cURL Module -* Upload File Size -* Sprite Support - -[[installing-suitecrm]] -Installing SuiteCRM -^^^^^^^^^^^^^^^^^^^ - -Once you have successfully copied the SuiteCRM files to your web server, -you need to install SuiteCRM by following the on-screen installation -wizard. You can navigate to the wizard by entering the following in your -web browser: -http://%3CyourServer%3E/%3CyourSuiteCRMDirectory%3E/install.php. You can -perform a typical installation or a custom installation. Typical -installation is recommended, but you can choose custom installation for -the following reasons: The same Database Admin User should not be used -as the SuiteCRM database administrator Locale settings should be -specified during installation instead of after logging into SuiteCRM - -[[performing-a-typical-installation-of-suitecrm]] -Performing a typical installation of SuiteCRM -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -1. Launch your browser and enter the following URL: -http://%3CyourServer%3E/%3CyourSuiteCRMDirectory%3E/install.php -* This displays the Welcome page. -2. Click Next. -* The Installer displays installation instructions and requirements to -help determine successful SuiteCRM installation. -3. Review the information and click Next. -* This displays the SuiteCRM License Agreement. -4. Review the license, check I Accept, and click Next. The installer -checks the system for compatibility and then displays the Installation -Options page. -* Note: You can modify any of your settings at any time prior to -clicking Install in the Confirm Setting menu. To modify any settings, -click the Back button on your browser to return to the appropriate page. -5. Select Typical Install. -6. Click Next. This displays the Database Type page. -7. Select the database that is installed on your system and click Next. -This displays the Database Configuration page. -+ -a. Enter the database name. The Installer uses “suitecrm” as the default -name for the database. You can specify a new name. + -b. Enter the Host Name or the Host Instance for the MySQL, MariaDB or -SQL Server. The host name is, by default, set to localhost if your -database server is running on the same machine as your web server. + -c. Enter the username and password for the Database Administrator and -specify the SuiteCRM Database Username. + -d. Ensure that the Database Administrator you specify has the -permissions to create and write to the SuiteCRM database.:: - For My SQL, MariaDB and SQL Server, by default, the Installer selects - the Admin User as the SuiteCRM Database User. The SuiteCRM application - uses SuiteCRM Database User to communicate with the SuiteCRM database. - You can create a different SuiteCRM Database user at this time. -1. 1. To select an existing user, choose Provide existing user from -the SuiteCRM Database Username drop-down list. To create a new SuiteCRM -Database user, choose Define user. Enter the database username and -password in the relevant fields. Re-enter the password to confirm it. -The new user information is displayed in System Credentials on the -Confirm Settings page at the end of the installation process. -* e. Accept No as the default value if you do not want the SuiteCRM Demo -data. Select Yes to populate the database with the SuiteCRM Demo data. -8. Click Next. The Installer validates the credentials of the specified -administrator. If a database with that name already exists, it displays -a dialog box asking you to either accept the database name or choose a -new database. If you use an existing database name, the database tables -will be dropped. -9. Click Accept to accept the database name or click Cancel and enter a -new name in the Database Name field. -* This displays the Site Configuration page. -10. Enter a name for the SuiteCRM administrator. -* The SuiteCRM administrator (default name admin) has administrative -privileges in SuiteCRM. You can change the default username. -11. Enter a password for the SuiteCRM admin, re-enter it to confirm the -password, and click Next. -* This displays the Confirm Settings page. The Confirm Settings page -displays a summary of the specified settings. Click Back on your browser -to navigate to previous pages if you want to change the settings. -12. Click Print Summary for a printout of the settings for your records. -* Click Show Passwords and then click Print Summary to include the -database user password and the SuiteCRM admin password in the printout. -When you click Show Passwords, the system displays the passwords and -changes the button name to Hide Passwords. You can click this button to -hide the passwords again. -13. Click Install. -* This displays the Perform Setup page with the installation progress. -14. Click Next when the setup is complete. -* This displays the Registration page(registration is optional). -15. Enter the necessary information and click Send Registration to -register your SuiteCRM instance with SuiteCRM; or click No Thanks to -skip registration. -* This displays the SuiteCRM login page. You can now log into SuiteCRM -with the SuiteCRM admin name and password that you specified during -installation. - -[[performing-a-custom-installation-of-suitecrm]] -Performing a custom installation of SuiteCRM -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -1. Launch your browser and go to your new SuiteCRM installation. The -URL should be similar to the following: -+ -:: - http://crm.yourserver.com/Suite-CRM-Directory/install.php%3C/nowiki%3E%3C/tt%3E - + -2. The _Welcome to the SuiteCRM Setup Wizard_ screen -+ -:: - You need to accept the licence agreement first. To do so: -1. Click the _I Accept_ checkbox. -2. Click _Next_ to continue. -+ -:: -3. The _Pre-Installation requirements_ screen -+ -:: - The installer will display installation instructions and requirements. -1. Please review the information and resolve any issues. -2. Click _Next_ to continue. -+ -:: -4. The _Configuration_ screen -+ -:: - This is where you will configure SuiteCRM to work with your customized - environment. -1. _Database Configuration_ -1. _Specify Database Type_ -+ -:: - Select the type of database you will be using. If you do not see your - database here, please make sure you have installed the correct php - modules. - + -2. _Provide Database Name_ -1. _Database Name_ -+ -:: - suitecrm is default name for the database. You can specify a - custom name as well. -2. _Host Name_ -+ -:: - It is set to localhost by default. If your database server is - running on a different machine as your web server, you can specify a - custom location. -3. _User_ & _Password_ -+ -:: - Enter the username and password for the Database Administrator and - specify the SuiteCRM Database Username. _Note_: You must ensure that - the Database Administrator you specify has the permissions to create - and write to the SuiteCRM database. -4. _SuiteCRM Database User_ -+ -:: - The SuiteCRM application uses the SuiteCRM Database user to - communicate with the SuiteCRM database. For MySQL, MariaDB and SQL - Server, the Installer selects the Admin user by default. You can also - select an existing database user or create a new one. To do so Enter - the database username and password in the relevant fields and re-enter - the password to confirm it. This new user information displays in - _System Credentials_ on the _Confirm Settings_ page at the end of the - installation process. -+ -:: -2. _Site Configuration_ -1. _Identify Administration User_ -1. _SuiteCRM Application Admin Name_ -+ -:: - This is the username of the administrator account. Ex: - johnsmith -2. _SuiteCRM Admin User Password_ -+ -:: - This is the password of the administrator account. Please re-enter it - in the _Re-enter SuiteCRM Admin User Password_ section for validation. -3. _URL of SuiteCRM Instance_ -+ -:: - The URL to the CRM. Ex: - http://crm.yourserver.com/Suite-CRM-Directory%3C/nowiki%3E%3C/tt%3E -4. _Email Address_ -+ -:: - This is the administrator's email address. Ex: - john.smith@yourserver.com -+ -:: -3. _More Options_ -+ -:: - In this section you can opt to: -* Populate SuiteCRM with semo data -* Add SMTP server specifications -* Add branding (Name and logo) -* Set the system locale -* Set security options -+ -:: - Once you are happy with all the settings on the page click _Next_ to - begin installation. - + -5. The _Installation_ screen -+ -:: - The Installer validates the credentials of the specified - administrator. If a database with the specified name already exists, - it displays a dialog box prompting you to either accept the database - name or choose a new database. If you use an existing database name, - the database tables will be dropped. Click Accept to drop current - tables or click Cancel and specify a new database name. -6. Login to your new SuiteCRM instance! - -[[upgrading-suitecrm]] -Upgrading SuiteCRM -^^^^^^^^^^^^^^^^^^ - -Log into your SuiteCRM instance to use the Upgrade Wizard. There is -currently no silent upgrade path available for SuiteCRM. CAUTION: It is -strongly recommended that you run the upgrade process on a copy of your -production system. - -[[compatibility-matrix-for-upgrade]] -Compatibility matrix for upgrade -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -SuiteCRM runs on a variety of Operating Systems, Web servers, databases -and PHP versions. It supports many browsers. - -Check the link:Compatibility_Matrix[Compatibility Matrix] for complete -information on compatible versions. - -[[operating-systems]] -Operating systems -^^^^^^^^^^^^^^^^^ - -* Windows: SuiteCRM runs on any OS that runs PHP -* Linux: SuiteCRM runs on any OS that runs PHP -* Mac: SuiteCRM runs on any OS that runs PHP - -[[databases]] -Databases -^^^^^^^^^ - -* MySQL -* Microsoft SQL Server -* MariaDB - -[[web-servers]] -Web Servers -^^^^^^^^^^^ - -* Apache -* Microsoft IIS - -[[browsers]] -Browsers -^^^^^^^^ - -On the client side, you can access SuiteCRM using any of these browsers: - -* Chrome -* Firefox -* Internet Explorer -* Edge -* Safari - -It is likely that many other browsers will work correctly even if they -are not officially supported. - -[[upgrading-to-suitecrm-from-sugarcrm-community-edition]] -Upgrading to SuiteCRM from SugarCRM Community Edition -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Upgrade paths are available for SugarCRM 6.5.x to SuiteCRM 7.1.8 from -the SuiteCRM https://suitecrm.com/download%7Cdownloads[1] section of the -SuiteCRM website. - -[[upgrade-prerequisites]] -Upgrade prerequisites -^^^^^^^^^^^^^^^^^^^^^ - -* Backup your current SuiteCRM directory and database before beginning -the upgrade process. -* Disable op-code caching before upgrading your SuiteCRM installation if -op-code caching is enabled in the PHP configuration file. You can enable -it after the upgrade process is complete. -* Increase the default value of the parameters listed below before you -begin the upgrade process if you are using Zend Core 2.0: -** Navigate to C:\Program Files\Zend\Core\etc\fastcgi.conf and increase -the default value for ConnectionTimeout to 3000 seconds and -RequestTimeout to 6000 seconds. -** Navigate to the php.ini file and increase the default value of -max_execution_time to 6000 seconds. -* Perform the following for the large size of the upgrade files: -** Modify and save the value of Maximum upload size to 21000000 (20MB) -in the Advanced section of the System Settings page of your current -SuiteCRM installation. -** Navigate to the php.ini file on your web server and configure the -parameters listed below in the Advanced section of the System Settings -page of your current SuiteCRM installation: -*** Set post_max_size to at least 60MB -*** Set upload_max_filesize settings to at least 60MB -*** Set max_input_time to a large number -*** Set memory_limit to 256MB - -Restart the web server and begin the upgrade process. - -* Ensure that LimitRequestBody is set to a large number or use the -default value of 2GB if you are using an Apache web server and -LimitRequestBody is set in the httpd.conffile. Restart Apache and begin -the upgrade process. -* Ensure that the webserver user has write permissions to the SuiteCRM -database. The upgrade to SuiteCRM 7.0.x will add and replace files in -several locations including the SuiteCRM root directory. The webserver -user must have write permissions for the root folder and all -sub-directories during the upgrade process. -* The process of upgrading can take up to 30 minutes. Set the CGI script -timeout to more than the default 300 seconds to ensure that the CGI -application does not time out if you are using the IIS web server. -* Save PHP files for customized modules (for example, accounts.php) in -the Customs directory and not within the main module. Existing -customizations may be overridden by changes in SuiteCRM 7.0.x during -upgrade. - -[[upgrade-considerations]] -Upgrade considerations -^^^^^^^^^^^^^^^^^^^^^^ - -The Dynamic Teams feature requires some database schema changes across -all modules as part of the upgrade process. For larger databases, this -operation can take some time to complete. Follow the steps listed below -to ensure a smooth upgrade process: - -1. Test your upgrade on a development instance instead of the -production instance. -2. Use the Silent Upgrade method through the command line interface to -conduct the upgrade instead of the Upgrade Wizard inside the application -if your database contains more than 10000 records per table. -3. Log into the application as an Administrator and use the Repair -option to repair and rebuild the database after the upgrade is complete. - -[[using-the-upgrade-wizard]] -Using the Upgrade Wizard -^^^^^^^^^^^^^^^^^^^^^^^^ - -The Upgrade Wizard provides a quick way to upgrade to the latest version -of the SuiteCRM application. It includes critical upgrade logic as well -as the SQL commands needed to upgrade the application. Ensure that the -config.php file for your installation, located in the SuiteCRM root -directory, is writable, before using the Upgrade Wizard. Note: Manual -upgrades by file replacements and running the upgrade SQL are not -supported. - -[[upgrading-suitecrm-using-the-upgrade-wizard]] -Upgrading SuiteCRM using the Upgrade Wizard -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -1. Download the appropriate SuiteCRM Upgrade zip file from the SuiteCRM -website to your local machine. For example, download the -SuiteCRMPro-Upgrade-6.4.x-to-6.5.0.zipfile to upgrade SuiteCRM -Professional from version 6.4.x to 6.5.0. Download the appropriate -conversion file to convert to SuiteCRM Professional or SuiteCRM -Enterprise. -2. Log into your existing SuiteCRM application as the administrator and -click admin on the right-hand corner of the page. -3. Click Upgrade Wizard in the Systems panel of the Administration Home -page. -* This displays the Upgrade Wizard page. -4. Click Next. -* This displays the System Checks page. and SuiteCRM begins the system -check process. The Systems Check page indicates that there were no -issues if the system check process completes successfully. Issues with -file permissions, database, and server settings are listed on the page -if the system check process encountered any problems. -5. Click Next if the system check is successful. -* This displays the Upload an Upgrade page. -6. Click Browse, and navigate to the location of the upgrade zip file -and select it. -* The path to the file displays in the Upload an upgrade field. -7. Click Upload Upgrade to upload the package to the SuiteCRM -application. -* The system uploads the package and displays it on the page. Use the -Delete Package button to remove the package if necessary. -8. Click Next. -* This displays the Preflight Check page. -* Click Show Schema Change Script toview differences in the SuiteCRM -databases schema between your current and new SuiteCRM versions. -* By default, the Upgrade Wizard Runs SQL option is selected as the -database update method. Select Manual SQL Queries from the Database -Update Method drop-down list and select the Check when SQL has been -manually run box, if you ran the SQL queries manually. -9. Click Recheck to rerun Preflight Check. Click Next to skip this -step. -* This displays the Commit Upgrade page. -* You can also click Show to see a list of files that were copied and -the rebuilt results. You can also view skipped queries. -10. Click Next. -* During the upgrade process, SuiteCRM performs a three-way merge -between the customized instance on old version, default instance on old -version, and default instance on new version. This three-way merge adds -any fields that have been added to the default module layouts in the new -version to the corresponding module layouts in the existing version, if -the module layouts in the old version were not customized through Studio -(or in the appropriate upgrade-safe way) prior to the upgrade. The -three-way merge also changes the placement of fields in -non-Studio-customized module layouts to match the placement in the -default module layouts. -* SuiteCRM displays the Confirm Layouts page as Step 5 of the upgrade -process if the existing module layouts have been customized, and there -are changes to the default fields and field placement in the new module -layouts. -* The Confirm Layouts page lists the module layouts that have changed in -the new version. The administrator has the option of applying the -changes to the existing module layouts. By default, all of the listed -module layouts are selected to be merged during the upgrade. -* For example, in 6.1.0, SuiteCRM added the Assigned To fields to the -default Detail View and Edit View layouts for Notes and for Email -Templates. If the instance being upgraded has a customized EditView -layout for Notes, but no customized layouts for Email Templates, the -following will occur during the upgrade: -+ -a. The Confirm Layouts page appears as Step 5 in the Upgrade Wizard + -b. The Confirm Layouts page displays the Notes module with the EditView -and DetailView layouts. The Email Templates layouts do not display on -the Confirm Layouts page because the existing layouts were not -customized. + -c. The Administrator has the option of choosing to merge the changes in -the Notes module with the existing customized EditView layout.:: -11. Uncheck the module if you do not want to add the new fields to a -module. -12. Click Next. -* This displays a message confirming that the layouts were successfully -merged (if you chose to update your modules). -13. Click Next. -14. The Debrief page confirms the upgrade installation. Complete the -steps for manual merging of files or running SQL queries now. -15. Click Done. -* This displays the Home page indicating that the upgrade is complete. -16. Click Repair and select the Rebuild Relationships andRebuild -Extensions options in the Systems panel of the Administration Home page. -* For more information, see Repair. -17. Manually merge the files by extracting the skipped file from the -patch zip file if you unchecked any files to prevent the Upgrade Wizard -from overwriting them. Merge the file installed in the SuiteCRM -application directory. -* Note:Check the upgradeWizard.log file in the SuiteCRM folder for -information on unsuccessful SuiteCRM upgrades. - -[[uninstalling-a-suitecrm-instance]] -Uninstalling a SuiteCRM instance -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Follow these steps to uninstall your SuiteCRM instance: - -1. Navigate to the directory within your web server where SuiteCRM is -located. -2. Remove the SuiteCRM directory(Linux: rm -r if you -wish to be prompted, rm -rf if you wish to delete the -directory without being prompted). -3. Delete the SuiteCRM database schema from your server -database(default is “suitecrm”, this will differ if this has been -renamed during the installation process).. - -[[troubleshooting-and-support]] -Troubleshooting and Support -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -SuiteCRM is an open source project. As such please do not contact us -directly via email or phone for SuiteCRM support. Instead please use our -support forum. By using the forum the knowledge is shared with everyone -in the community. Our developers answer questions on the forum daily but -it also gives the other members of the community the opportunity to -contribute. If you would like customisation's to specifically fit your -SuiteCRM needs then please use our contact form. diff --git a/_source/wikifiles/Installation Guide.wiki b/_source/wikifiles/Installation Guide.wiki deleted file mode 100644 index b20feaae3..000000000 --- a/_source/wikifiles/Installation Guide.wiki +++ /dev/null @@ -1,271 +0,0 @@ -{| align="right" style="padding-left:25px;" -| __TOC__ -|} - -==SuiteCRM Installation Guide== -===Introduction=== -SuiteCRM is SugarCRM, Supercharged! SuiteCRM is a fork of the popular open source SugarCRM Community Edition. This release features a host of additional open source modules, along with the standard features and functionality found within SugarCRM CE. - -===Release Notes=== -See the latest release notes for SuiteCRM <span style="font-size:110%;">'''[[Versions|here]]'''</span>.<br /> - -===Downloading and installing SuiteCRM=== -If you are installing SuiteCRM for the first time, follow the instructions in this section. If you have an earlier version of SuiteCRM installed, refer to the upgrade section for instructions on how to upgrade your SuiteCRM instance. -Follow the steps listed below to install SuiteCRM: -#Install the platform-appropriate (Linux or Windows) version of PHP, web server, and database on your machine. -#Download the SuiteCRM files from suitecrm.com(see “Downloading the latest SuiteCRM files” section). -#Copy the SuiteCRM files to your web server. -#Install SuiteCRM by following the SuiteCRM installation wizard. -===Downloading the latest SuiteCRM files=== -#Navigate to the SuiteCRM Downloads section at http://suitecrm.com/download -#Login using your username and password. If you do not have an account, you can register using the registration form. -#Download your flavour of SuiteCRM. We advise that all users download the latest SuiteCRM release. The latest version will contain the latest features and bug fixes. -#If you experience any issues during registering an account on our website or downloading SuiteCRM, please use our support forums. - -===Copying SuiteCRM files to web server=== -Once your SuiteCRM package has downloaded, you will need to unzip the files and set permissions required for the installation process. The following steps explain in detail the prerequisites to setting up your SuiteCRM files for installation: -#Locate the directory on the web server in which the SuiteCRM directory will be located(most commonly the root directory, or within a subdirectory). -#Unzip SuiteCRM into the directory selected in Step 1. This creates a “SuiteCRM” directory within your selected parent directory. -#At this stage, you may wish to rename the default “SuiteCRM” directory. -#Set ownership of the SuiteCRM directory: -##chgrp ApacheUser.ApacheGroup <suitecrmroot> -R recursively sets ownership for root directory to Apache user and group. -#The system user that your web server uses varies depending on your operating system. Common web server users are as follows: -##apache (Linux/Apache) -##nobody (Linux/Apache) -##IUSR_computerName (Windows/IIS) - -If you are unsure how to set your web server user on your operating system, contact your web server host. If you are installing SuiteCRM locally and need assistance, visit our support forums. - -#Set the following permissions on the SuiteCRM directory(Linux): -##sudo chown -R www-data:www-data . -##sudo chmod -R 755 . -##sudo chmod -R 775 cache custom modules themes data upload config_override.php -The commands/steps taken to setting permissions differs dependant on your operating system. If you are experiencing issues with setting permissions on your SuiteCRM instance, visit our support forums. - -===Recommended installation pre-requisites=== -*PHP -*JSON -*XML Parsing -*MB Strings Module -*Writable SugarCRM Configuration File (config.php) -*Writeable Custom Directory -*Writable Modules Sub-Directories and Files -*Writable Upload Directory -*Writable Data Sub-Directories -*Writable Cache Sub-Directories -*PHP Memory Limit (at least 128M) -*ZLIB Compression Module -*ZIP Handling Module -*PCRE Library -*IMAP Module -*cURL Module -*Upload File Size -*Sprite Support - -===Installing SuiteCRM=== -Once you have successfully copied the SuiteCRM files to your web server, you need to install SuiteCRM by following the on-screen installation wizard. You can navigate to the wizard by entering the following in your web browser: -http://<yourServer>/<yourSuiteCRMDirectory>/install.php. -You can perform a typical installation or a custom installation. Typical installation is recommended, but you can choose custom installation for the following reasons: -The same Database Admin User should not be used as the SuiteCRM database administrator -Locale settings should be specified during installation instead of after logging into SuiteCRM -===Performing a typical installation of SuiteCRM=== -#Launch your browser and enter the following URL: http://<yourServer>/<yourSuiteCRMDirectory>/install.php -#*This displays the Welcome page. -#Click Next. -#*The Installer displays installation instructions and requirements to help determine successful SuiteCRM installation. -#Review the information and click Next. -#*This displays the SuiteCRM License Agreement. -#Review the license, check I Accept, and click Next. The installer checks the system for compatibility and then displays the Installation Options page. -#*Note: You can modify any of your settings at any time prior to clicking Install in the Confirm Setting menu. To modify any settings, click the Back button on your browser to return to the appropriate page. -#Select Typical Install. -#Click Next. This displays the Database Type page. -#Select the database that is installed on your system and click Next. This displays the Database Configuration page. -#;a. Enter the database name. The Installer uses “suitecrm” as the default name for the database. You can specify a new name. -#;b. Enter the Host Name or the Host Instance for the MySQL, MariaDB or SQL Server. The host name is, by default, set to localhost if your database server is running on the same machine as your web server. -#;c. Enter the username and password for the Database Administrator and specify the SuiteCRM Database Username. -#;d. Ensure that the Database Administrator you specify has the permissions to create and write to the SuiteCRM database. -#:For My SQL, MariaDB and SQL Server, by default, the Installer selects the Admin User as the SuiteCRM Database User. The SuiteCRM application uses SuiteCRM Database User to communicate with the SuiteCRM database. You can create a different SuiteCRM Database user at this time. -###To select an existing user, choose Provide existing user from the SuiteCRM Database Username drop-down list. To create a new SuiteCRM Database user, choose Define user. Enter the database username and password in the relevant fields. Re-enter the password to confirm it. The new user information is displayed in System Credentials on the Confirm Settings page at the end of the installation process. -#*e. Accept No as the default value if you do not want the SuiteCRM Demo data. Select Yes to populate the database with the SuiteCRM Demo data. -#Click Next. The Installer validates the credentials of the specified administrator. If a database with that name already exists, it displays a dialog box asking you to either accept the database name or choose a new database. If you use an existing database name, the database tables will be dropped. -#Click Accept to accept the database name or click Cancel and enter a new name in the Database Name field. -#*This displays the Site Configuration page. -#Enter a name for the SuiteCRM administrator. -#*The SuiteCRM administrator (default name admin) has administrative privileges in SuiteCRM. You can change the default username. -#Enter a password for the SuiteCRM admin, re-enter it to confirm the password, and click Next. -#*This displays the Confirm Settings page. The Confirm Settings page displays a summary of the specified settings. Click Back on your browser to navigate to previous pages if you want to change the settings. -#Click Print Summary for a printout of the settings for your records. -#*Click Show Passwords and then click Print Summary to include the database user password and the SuiteCRM admin password in the printout. When you click Show Passwords, the system displays the passwords and changes the button name to Hide Passwords. You can click this button to hide the passwords again. -#Click Install. -#*This displays the Perform Setup page with the installation progress. -#Click Next when the setup is complete. -#*This displays the Registration page(registration is optional). -#Enter the necessary information and click Send Registration to register your SuiteCRM instance with SuiteCRM; or click No Thanks to skip registration. -#*This displays the SuiteCRM login page. You can now log into SuiteCRM with the SuiteCRM admin name and password that you specified during installation. -===Performing a custom installation of SuiteCRM=== -#Launch your browser and go to your new SuiteCRM installation. The URL should be similar to the following: -#:<tt><nowiki>http://crm.yourserver.com/Suite-CRM-Directory/install.php</nowiki></tt> -#: -#The ''Welcome to the SuiteCRM Setup Wizard'' screen -#:You need to accept the licence agreement first. To do so: -##Click the ''I Accept'' checkbox. -##Click ''Next'' to continue. -#: -#The ''Pre-Installation requirements'' screen -#:The installer will display installation instructions and requirements. -##Please review the information and resolve any issues. -##Click ''Next'' to continue. -#: -#The ''Configuration'' screen -#:This is where you will configure SuiteCRM to work with your customized environment. -##''Database Configuration'' -###''Specify Database Type'' -###:Select the type of database you will be using. If you do not see your database here, please make sure you have installed the correct php modules. -###: -###''Provide Database Name'' -####''Database Name'' -####:<tt>suitecrm</tt> is default name for the database. You can specify a custom name as well. -####''Host Name'' -####:It is set to <tt>localhost</tt> by default. If your database server is running on a different machine as your web server, you can specify a custom location. -####''User'' & ''Password'' -####:Enter the username and password for the Database Administrator and specify the SuiteCRM Database Username. ''Note'': You must ensure that the Database Administrator you specify has the permissions to create and write to the SuiteCRM database. -####''SuiteCRM Database User'' -####:The SuiteCRM application uses the SuiteCRM Database user to communicate with the SuiteCRM database. For MySQL, MariaDB and SQL Server, the Installer selects the Admin user by default. You can also select an existing database user or create a new one. To do so Enter the database username and password in the relevant fields and re-enter the password to confirm it. This new user information displays in ''System Credentials'' on the ''Confirm Settings'' page at the end of the installation process. -##: -##''Site Configuration'' -###''Identify Administration User'' -####''SuiteCRM Application Admin Name'' -####:This is the username of the administrator account. Ex: <tt>johnsmith</tt> -####''SuiteCRM Admin User Password'' -####:This is the password of the administrator account. Please re-enter it in the ''Re-enter SuiteCRM Admin User Password'' section for validation. -####''URL of SuiteCRM Instance'' -####:The URL to the CRM. Ex: <tt><nowiki>http://crm.yourserver.com/Suite-CRM-Directory</nowiki></tt> -####''Email Address'' -####:This is the administrator's email address. Ex: <tt>john.smith@yourserver.com</tt> -##: -##''More Options'' -##:In this section you can opt to: -##*Populate SuiteCRM with semo data -##*Add SMTP server specifications -##*Add branding (Name and logo) -##*Set the system locale -##*Set security options -#:Once you are happy with all the settings on the page click ''Next'' to begin installation. -#: -#The ''Installation'' screen -#:The Installer validates the credentials of the specified administrator. If a database with the specified name already exists, it displays a dialog box prompting you to either accept the database name or choose a new database. If you use an existing database name, the database tables will be dropped. Click Accept to drop current tables or click Cancel and specify a new database name. -#Login to your new SuiteCRM instance! - -===Upgrading SuiteCRM=== -Log into your SuiteCRM instance to use the Upgrade Wizard. There is currently no silent upgrade path available for SuiteCRM. -CAUTION: It is strongly recommended that you run the upgrade process on a copy of your production system. -===Compatibility matrix for upgrade=== -SuiteCRM runs on a variety of Operating Systems, Web servers, databases and PHP versions. It supports many browsers. - -Check the [[Compatibility Matrix|Compatibility Matrix]] for complete information on compatible versions. - -===Operating systems=== - -*Windows: SuiteCRM runs on any OS that runs PHP -*Linux: SuiteCRM runs on any OS that runs PHP -*Mac: SuiteCRM runs on any OS that runs PHP - -===Databases=== - -*MySQL -*Microsoft SQL Server -*MariaDB - -===Web Servers=== - -*Apache -*Microsoft IIS - -===Browsers=== -On the client side, you can access SuiteCRM using any of these browsers: - -*Chrome -*Firefox -*Internet Explorer -*Edge -*Safari - -It is likely that many other browsers will work correctly even if they are not officially supported. - -===Upgrading to SuiteCRM from SugarCRM Community Edition=== -Upgrade paths are available for SugarCRM 6.5.x to SuiteCRM 7.1.8 from the SuiteCRM [https://suitecrm.com/download|downloads] section of the SuiteCRM website. - -===Upgrade prerequisites=== -*Backup your current SuiteCRM directory and database before beginning the upgrade process. -*Disable op-code caching before upgrading your SuiteCRM installation if op-code caching is enabled in the PHP configuration file. You can enable it after the upgrade process is complete. -*Increase the default value of the parameters listed below before you begin the upgrade process if you are using Zend Core 2.0: -**Navigate to C:\Program Files\Zend\Core\etc\fastcgi.conf and increase the default value for ConnectionTimeout to 3000 seconds and RequestTimeout to 6000 seconds. -**Navigate to the php.ini file and increase the default value of max_execution_time to 6000 seconds. -*Perform the following for the large size of the upgrade files: -**Modify and save the value of Maximum upload size to 21000000 (20MB) in the Advanced section of the System Settings page of your current SuiteCRM installation. -**Navigate to the php.ini file on your web server and configure the parameters listed below in the Advanced section of the System Settings page of your current SuiteCRM installation: -***Set post_max_size to at least 60MB -***Set upload_max_filesize settings to at least 60MB -***Set max_input_time to a large number -***Set memory_limit to 256MB -Restart the web server and begin the upgrade process. -*Ensure that LimitRequestBody is set to a large number or use the default value of 2GB if you are using an Apache web server and LimitRequestBody is set in the httpd.conffile. Restart Apache and begin the upgrade process. -*Ensure that the webserver user has write permissions to the SuiteCRM database. The upgrade to SuiteCRM 7.0.x will add and replace files in several locations including the SuiteCRM root directory. The webserver user must have write permissions for the root folder and all sub-directories during the upgrade process. -*The process of upgrading can take up to 30 minutes. Set the CGI script timeout to more than the default 300 seconds to ensure that the CGI application does not time out if you are using the IIS web server. -*Save PHP files for customized modules (for example, accounts.php) in the Customs directory and not within the main module. Existing customizations may be overridden by changes in SuiteCRM 7.0.x during upgrade. -===Upgrade considerations=== -The Dynamic Teams feature requires some database schema changes across all modules as part of the upgrade process. For larger databases, this operation can take some time to complete. Follow the steps listed below to ensure a smooth upgrade process: -#Test your upgrade on a development instance instead of the production instance. -#Use the Silent Upgrade method through the command line interface to conduct the upgrade instead of the Upgrade Wizard inside the application if your database contains more than 10000 records per table. -#Log into the application as an Administrator and use the Repair option to repair and rebuild the database after the upgrade is complete. -===Using the Upgrade Wizard=== -The Upgrade Wizard provides a quick way to upgrade to the latest version of the SuiteCRM application. It includes critical upgrade logic as well as the SQL commands needed to upgrade the application. -Ensure that the config.php file for your installation, located in the SuiteCRM root directory, is writable, before using the Upgrade Wizard. -Note: Manual upgrades by file replacements and running the upgrade SQL are not supported. -===Upgrading SuiteCRM using the Upgrade Wizard=== -#Download the appropriate SuiteCRM Upgrade zip file from the SuiteCRM website to your local machine. For example, download the SuiteCRMPro-Upgrade-6.4.x-to-6.5.0.zipfile to upgrade SuiteCRM Professional from version 6.4.x to 6.5.0. Download the appropriate conversion file to convert to SuiteCRM Professional or SuiteCRM Enterprise. -#Log into your existing SuiteCRM application as the administrator and click admin on the right-hand corner of the page. -#Click Upgrade Wizard in the Systems panel of the Administration Home page. -#*This displays the Upgrade Wizard page. -#Click Next. -#*This displays the System Checks page. and SuiteCRM begins the system check process. The Systems Check page indicates that there were no issues if the system check process completes successfully. Issues with file permissions, database, and server settings are listed on the page if the system check process encountered any problems. -#Click Next if the system check is successful. -#*This displays the Upload an Upgrade page. -#Click Browse, and navigate to the location of the upgrade zip file and select it. -#*The path to the file displays in the Upload an upgrade field. -#Click Upload Upgrade to upload the package to the SuiteCRM application. -#*The system uploads the package and displays it on the page. Use the Delete Package button to remove the package if necessary. -#Click Next. -#*This displays the Preflight Check page. -#*Click Show Schema Change Script toview differences in the SuiteCRM databases schema between your current and new SuiteCRM versions. -#*By default, the Upgrade Wizard Runs SQL option is selected as the database update method. Select Manual SQL Queries from the Database Update Method drop-down list and select the Check when SQL has been manually run box, if you ran the SQL queries manually. -#Click Recheck to rerun Preflight Check. Click Next to skip this step. -#*This displays the Commit Upgrade page. -#*You can also click Show to see a list of files that were copied and the rebuilt results. You can also view skipped queries. -#Click Next. -#*During the upgrade process, SuiteCRM performs a three-way merge between the customized instance on old version, default instance on old version, and default instance on new version. This three-way merge adds any fields that have been added to the default module layouts in the new version to the corresponding module layouts in the existing version, if the module layouts in the old version were not customized through Studio (or in the appropriate upgrade-safe way) prior to the upgrade. The three-way merge also changes the placement of fields in non-Studio-customized module layouts to match the placement in the default module layouts. -#*SuiteCRM displays the Confirm Layouts page as Step 5 of the upgrade process if the existing module layouts have been customized, and there are changes to the default fields and field placement in the new module layouts. -#*The Confirm Layouts page lists the module layouts that have changed in the new version. The administrator has the option of applying the changes to the existing module layouts. By default, all of the listed module layouts are selected to be merged during the upgrade. -#*For example, in 6.1.0, SuiteCRM added the Assigned To fields to the default Detail View and Edit View layouts for Notes and for Email Templates. If the instance being upgraded has a customized EditView layout for Notes, but no customized layouts for Email Templates, the following will occur during the upgrade: -#;a. The Confirm Layouts page appears as Step 5 in the Upgrade Wizard -#;b. The Confirm Layouts page displays the Notes module with the EditView and DetailView layouts. The Email Templates layouts do not display on the Confirm Layouts page because the existing layouts were not customized. -#;c. The Administrator has the option of choosing to merge the changes in the Notes module with the existing customized EditView layout. -#Uncheck the module if you do not want to add the new fields to a module. -#Click Next. -#*This displays a message confirming that the layouts were successfully merged (if you chose to update your modules). -#Click Next. -#The Debrief page confirms the upgrade installation. Complete the steps for manual merging of files or running SQL queries now. -#Click Done. -#*This displays the Home page indicating that the upgrade is complete. -#Click Repair and select the Rebuild Relationships andRebuild Extensions options in the Systems panel of the Administration Home page. -#*For more information, see Repair. -#Manually merge the files by extracting the skipped file from the patch zip file if you unchecked any files to prevent the Upgrade Wizard from overwriting them. Merge the file installed in the SuiteCRM application directory. -#*Note:Check the upgradeWizard.log file in the SuiteCRM folder for information on unsuccessful SuiteCRM upgrades. -===Uninstalling a SuiteCRM instance=== -Follow these steps to uninstall your SuiteCRM instance: -#Navigate to the directory within your web server where SuiteCRM is located. -#Remove the SuiteCRM directory(Linux: rm -r <suitedirectory> if you wish to be prompted, rm -rf <suitedirectory> if you wish to delete the directory without being prompted). -#Delete the SuiteCRM database schema from your server database(default is “suitecrm”, this will differ if this has been renamed during the installation process).. - -===Troubleshooting and Support=== -SuiteCRM is an open source project. As such please do not contact us directly via email or phone for SuiteCRM support. Instead please use our support forum. By using the forum the knowledge is shared with everyone in the community. Our developers answer questions on the forum daily but it also gives the other members of the community the opportunity to contribute. If you would like customisation's to specifically fit your SuiteCRM needs then please use our contact form. diff --git a/_source/wikifiles/Licensing.wiki b/_source/wikifiles/Licensing.wiki deleted file mode 100644 index 630bfaf6c..000000000 --- a/_source/wikifiles/Licensing.wiki +++ /dev/null @@ -1 +0,0 @@ -SuiteCRM is released under [http://en.wikipedia.org/wiki/Affero_General_Public_License AGPL version 3]. diff --git a/_source/wikifiles/Main Page.adoc b/_source/wikifiles/Main Page.adoc deleted file mode 100644 index 79fdd3aba..000000000 --- a/_source/wikifiles/Main Page.adoc +++ /dev/null @@ -1,424 +0,0 @@ -
'''Welcome to -the SuiteCRM Wiki '''
This is the wiki for SuiteCRM which contains many guides, -FAQ's, information about future releases and support options. Use the -links to the left to navigate through the SuiteCRM wiki.
In the -versions section, you will find documentation on previously released and -current versions of SuiteCRM. There will be details such as when it was -last released and the support for that version.
You will find all -User Guides for the custom modules inside SuiteCRM within the User -Guides section.
You'll find some content translated into other -languages, but the primary documentation language is English.
For -questions, advice and support about SuiteCRM see the -https://suitecrm.com/index.php?option=com_kunena&view=category&Itemid=1137&layout=list[support -forums].
- -| role="presentation" style="border:0; margin:0;" width="100%" -cellspacing="10" | valign="top" class="mainpage_hubbox" |
**Using SuiteCRM**
-https://suitecrm.com/wiki_home_icons/assistant.png
- -
SuiteCRM How To's - -* *link:userguide[Learn How]* SuiteCRM modules work -* Customise your SuiteCRM experience -* Get -*https://suitecrm.com/index.php?option=com_kunena&view=category&Itemid=1137&layout=list[help]* -from other community members - -
| valign="top" class="mainpage_hubbox" |
**SuiteCRM Installation**
-https://suitecrm.com/wiki_home_icons/book.png
Install & configure SuiteCRM - -* *link:Installation[How to]* install SuiteCRM -* *link:upgrade[Upgrade]* from SugarCRM to SuiteCRM -* *link:upgrade[Upgrade]* an existing SuiteCRM installation -* Add features with *https://store.suitecrm.com[third party extensions]* - -
| valign="top" class="mainpage_hubbox" |
**Developing & Extending SuiteCRM**
-https://suitecrm.com/wiki_home_icons/development.png
For SuiteCRM Developers - -* Learn how to develop and write extensions''' -* Contribute your extensions to our https://store.suitecrm.com[extension -directory] -* Browse the -https://suitecrm.com/index.php?option=com_kunena&view=category&Itemid=1137&layout=list[forums] -for developer help - -
| - -| role="presentation" style="border:0; margin: 0;" width="100%" -cellspacing="10" | valign="top" id="mainpage_downloadcell" |
**Version List**
- -* **link:Release_notes_7.9.7#SuiteCRM_7.9.7[7.9.7]** -– 18-10-2017
-* **link:Release_notes_7.9.6#SuiteCRM_7.9.6[7.9.6]** -– 03-10-2017
-* **link:Release_notes_7.9.5#SuiteCRM_7.9.5[7.9.5]** -– 6-09-2017
-* **link:Release_notes_7.9.4#SuiteCRM_7.9.4[7.9.4]** -– 20-07-2017
-* **link:Release_notes_7.9.3#SuiteCRM_7.9.3[7.9.3]** -– 17-07-2017
-* **link:Release_notes_7.9.2#SuiteCRM_7.9.2[7.9.2]** -– 30-06-2017
-* **link:Release_notes_7.9.1#SuiteCRM_7.9.1[7.9.1]** -– 15-06-2017
-* **link:Release_notes_7.9.0#SuiteCRM_7.9.0[7.9.0]** -– 29-05-2017
-* **link:Release_notes_7.8.8#SuiteCRM_7.8.8[7.8.8]** -– 18-10-2017
-* **link:Release_notes_7.8.7#SuiteCRM_7.8.7[7.8.7]** -– 03-10-2017
-* **link:Release_notes_7.8.6#SuiteCRM_7.8.6[7.8.6]** -– 6-09-2017
-* **link:Release_notes_7.8.5#SuiteCRM_7.8.5[7.8.5]** -– 15-06-2017
-* **link:Release_notes_7.8.4#SuiteCRM_7.8.4[7.8.4]** -– 29-05-2017
-* **link:Release_notes_7.8.3#SuiteCRM_7.8.3[7.8.3]** -– 10-04-2017
-* **link:Release_notes_7.8.2#SuiteCRM_7.8.2[7.8.2]** -– 27-02-2017
-* **link:Release_notes_7.8.1#SuiteCRM_7.8.1[7.8.1]** -– 06-02-2017
-* **link:Release_notes_7.8#SuiteCRM_7.8[7.8.0]** -– 30-01-2017
-* **link:Release_notes_7.7.9#SuiteCRM_7.7.9[7.7.9]** -– 31-12-2016
-* **link:Release_notes_7.7.8#SuiteCRM_7.7.8[7.7.8]** -– 16-11-2016
-* **link:Release_notes_7.7.7#SuiteCRM_7.7.7[7.7.7]** -– 04-11-2016
-* **link:Release_notes_7.7.6#SuiteCRM_7.7.6[7.7.6]** -– 19-10-2016
-* **link:Release_notes_7.7.5#SuiteCRM_7.7.5[7.7.5]** -– 28-09-2016
-* **link:Release_notes_7.7.4#SuiteCRM_7.7.4[7.7.4]** -– 31-08-2016
-* **link:Release_notes_7.7.3#SuiteCRM_7.7.3[7.7.3]** -– 25-08-2016
-* **link:Release_notes_7.7.2#SuiteCRM_7.7.2[7.7.2]** -– 23-08-2016
-* **link:Release_notes_7.7.1#SuiteCRM_7.7.1[7.7.1]** -– 11-08-2016
-* **link:Release_notes_7.7#SuiteCRM_7.7[7.7.0]** -– 02-08-2016
-* **link:Release_notes_7.6.10#SuiteCRM_7.6.10[7.6.10]** -– 16-11-2016
-* **link:Release_notes_7.6.9#SuiteCRM_7.6.9[7.6.9]** -– 04-11-2016
-* **link:Release_notes_7.6.8#SuiteCRM_7.6.8[7.6.8]** -– 19-10-2016
-* **link:Release_notes_7.6.7#SuiteCRM_7.6.7[7.6.7]** -– 28-09-2016
-* **link:Release_notes_7.6.6#SuiteCRM_7.6.6[7.6.6]** -– 18-07-2016
-* **link:Release_notes_7.6.5#SuiteCRM_7.6.5[7.6.5]** -– 04-07-2016
-* **link:Release_notes_7.5.4#SuiteCRM_7.5.4[7.5.4]** -– 04-07-2016
-* **link:Release_notes_7.6.4#SuiteCRM_7.6.4[7.6.4]** -– 30-05-2016
-* **link:Release_notes_7.6.3#SuiteCRM_7.6.3[7.6.3]** -– 17-05-2016
-* **link:Release_notes_7.6.2#SuiteCRM_7.6.2[7.6.2]** -– 10-05-2016
-* **link:Release_notes_7.6.1#SuiteCRM_7.6.1[7.6.1]** -– 03-05-2016
-* **link:Release_notes_7.6#SuiteCRM_7.6.0[7.6.0]** -– 27-04-2016
-* **link:Release_notes_7.5.3#SuiteCRM_7.5.3[7.5.3]** -– 15-03-2016
-* **link:Release_notes_7.5.2#SuiteCRM_7.5.2[7.5.2]** -– 07-03-2016
-* **link:Release_notes_7.5.1#SuiteCRM_7.5.1[7.5.1]** -– 26-01-2016
-* **link:Release_notes_7.5.0#SuiteCRM_7.5.0[7.5.0]** -– 18-01-2016
-* **link:Release_notes_7.4.3#SuiteCRM_7.4.3[7.4.3]** -– 23-11-2015
-* **link:Release_notes_7.4.2#SuiteCRM_7.4.2[7.4.2]** -– 22-10-2015
-* **link:Release_notes_7.4.1#SuiteCRM_7.4.1[7.4.1]** -– 10-11-2015
-* **link:Release_notes_7.4.0#SuiteCRM_7.4.0[7.4.0]** -– 30-10-2015
-* **link:Release_notes_7.3.2#SuiteCRM_7.3.2[7.3.2]** -– 22-10-2015
-* **link:Release_notes_7.3.1#SuiteCRM_7.3.1[7.3.1]** -– 25-08-2015
-* **link:Release_notes_7.3.0#SuiteCRM_7.3.0[7.3.0]** -– 14-08-2015
-* **link:Release_notes_7.2.3#SuiteCRM_7.2.3[7.2.3]** -– 06-08-2015
-* **link:Release_notes_7.1.8#SuiteCRM_7.1.8[7.1.8]** -– 06-08-2015
-* **link:Release_notes_7.2.2#SuiteCRM_7.2.2[7.2.2]** -– 20-05-2015
-* **link:Release_notes_7.1.7#SuiteCRM_7.1.7[7.1.7]** -– 20-05-2015
-* **link:Release_notes_7.2.1#SuiteCRM_7.2.1[7.2.1]** -– 11-03-2015
-* **link:Release_notes_7.1.6#SuiteCRM_7.1.6[7.1.6]** -– 11-03-2015
-* **link:Release_notes_7.2.0#SuiteCRM_7.2.0[7.2.0]** -– 02-03-2015
-* **link:Release_notes_7.1.5#SuiteCRM_7.1.5[7.1.5]** -– 19-01-2015
-* **link:Release_notes_7.1.4#SuiteCRM_7.1.4[7.1.4]** -– 25-09-2014
-* **link:Release_notes_7.1.3#SuiteCRM_7.1.3[7.1.3]** -– 13-08-2014
-* **link:Release_notes_7.1.2#SuiteCRM_7.1.2[7.1.2]** -– 07-07-2014
-* **link:Release_notes_7.1.1#SuiteCRM_7.1.1[7.1.1]** -– 04-04-2014
-* **link:Release_notes_7.1.0#SuiteCRM_7.1.0[7.1.0]** -– 31-03-2014
-* **link:Release_notes_7.0.2#SuiteCRM_7.0.2[7.0.2]** -– 20-01-2014
-* **link:Release_notes_7.0.1#SuiteCRM_7.0.1[7.0.1]** -– 04-11-2013
-* **link:Release_notes_7.0.0#SuiteCRM_7.0.0[7.0.0]** -– 21-10-2013
- -
https://suitecrm.com/download[Download]
-
| valign="top" id="mainpage_newscell" |
**News**
- -[[recent-news]] -Recent news -~~~~~~~~~~~ - -[13.02.2017]https://suitecrm.com/wiki/index.php/Userguide[Updated User -Guide]. - -Now including Workflow Calculated Fields action.
- -[06.02.2017]SuiteCRM 7.8.1 released. - -Please see the release notes for further information.
- -[30.01.2017]SuiteCRM 7.8 released. - -Please see the release notes for further information.
- -[31.12.2016]SuiteCRM 7.7.9 Security patch released. - -Please see the release notes for further information.
-[19.10.2016]SuiteCRM 7.7.6 & 7.6.8 released. - -Please see the release notes for further information.
-[28.09.2016]SuiteCRM 7.7.5 released. - -Please see the release notes for further information.
-[28.09.2016]SuiteCRM 7.6.7 released. - -Please see the release notes for further information.
-[31.08.2016]SuiteCRM 7.7.4 released. - -Please see the release notes for further information.
-[25.08.2016]SuiteCRM 7.7.3 released. - -Please see the release notes for further information.
-[23.08.2016]SuiteCRM 7.7.2 released. - -Please see the release notes for further information.
-[11.08.2016]SuiteCRM 7.7.1 released. - -Please see the release notes for further information.
-[02.08.2016]SuiteCRM 7.7 released. - -Please see the release notes for further information.
-[04.07.2016]SuiteCRM Important Security Patch Released 7.6.6 / 7.5.5. - -An Important Security Patch has been release that effects all version of -SuiteCRM.
[04.07.2016]SuiteCRM Important Security Patch Released -7.6.5 / 7.5.4. - -An Important Security Patch has been release that effects all version of -SuiteCRM.
[30.05.2016]SuiteCRM 7.6.4 released. - -Please see the release notes for further information.
-[17.05.2016]SuiteCRM 7.6.3 released. - -Please see the release notes for further information.
-[10.05.2016]SuiteCRM 7.6.2 released. - -Please see the release notes for further information.
-[22.10.2015]SuiteCRM 7.3.2 released. - -Please see the release notes for further information.
-[14.08.2015]SuiteCRM 7.3.1 released. - -Please see the release notes for further information.
-[14.08.2015]SuiteCRM 7.3.0 released. - -Please see the release notes for further information.
-[06.08.2015]SuiteCRM 7.2.3 and SuiteCRM 7.1.8 bug-fix versions released. - -Please see the release notes for further information.
-[20.05.2015]SuiteCRM 7.2.2 and SuiteCRM 7.1.7 bug-fix versions released. - -Please see the release notes for further information.
-[11.03.2015]SuiteCRM 7.2.1 and SuiteCRM 7.1.6 bug-fix versions released. - -Please see the release notes for the full list of new features and bug -fixes.
- -[02.03.2015]SuiteCRM 7.2.0 is the new production release of SuiteCRM. -Packed with new features, functionality and bug-fixes. - -Please see the release notes for the full list of new features and bug -fixes.
- -[19.01.2015]SuiteCRM 7.1.5 features many bug fixes and addresses -important security issues. - -SugarCRM version updated to 6.5.20 - -This update addresses some important Security issues.
- -[25.09.2014] SuiteCRM 7.1.4 has now been released. 7.1.4 features -important security fixes to both the SugarCRM CE core(upgraded to 6.5.18 -latest release) and QuickCRM. - -There are many bug fixes to several modules within SuiteCRM, and some -minor enhancements. Please see the release notes for a full list of bug -fixes.
- -[13.08.2014] SuiteCRM 7.1.3 has now been released. 7.1.3 features many -bug fixes to several modules within SuiteCRM, and some minor -enhancements. Please see the release notes for a full list of bug fixes. -
- -[07.07.2014] SuiteCRM 7.1.2 has now been released. 7.1.2 features -important security updates for the SugarCRM base and many bug fixes have -been implemented. Please see the release notes for a full list of bug -fixes.
- -[04.04.2014] SuiteCRM 7.1.1 has been released and is now available to -download and upgrade from previous SuiteCRM versions.
- -[31.03.2014] The long awaited SuiteCRM 7.1 is now available - -This release packs in many new features, most notably the many -enhancements to workflow, the new lucene powered search, (to enable see -AOD in the admin panel), the multi tabbed homepage, the ability to -filter the history sub-panel and more - -A Full list of new features and bug fixed will be available soon - -Go to the download section to get the full package or appropriate -upgrade. - -Thanks to everyone who has contributed to the project so far, if you -have something to contribute be it a Bug Fix, a Language Pack or a New -Feature, then check out the project on -http://github.com/salesagility/suitecrm[GitHub].
- -[23.01.2014] SuiteCRM 7.1 will be released in Q1 of 2014. SuiteCRM 7.1 -will contain a host of new functionality and features such as Social -integration, improvements to AOW and more.
- -[21.01.2014] SuiteCRM 7.0.2 has been released which has several new -additions and many bugfixes. We thank both the community who highlighted -and/or posted solutions for these bugs and also to our contributors who -helped work towards new additions and the resolution of bugs via our -SuiteCRM repository on GitHub -https://github.com/salesagility/SuiteCRM[1] .
- -[14.01.2014] SuiteCRM 7.0.2 and 7.1 are due for release this month. -7.0.2 is a bugfix release with fixes to languages, the theme and modules -such as AOS/AOW/AOP and AOR. 7.1 is a minor release with new features -such as OpenMeetings/Social Integration and more... - -
- -| diff --git a/_source/wikifiles/Main Page.wiki b/_source/wikifiles/Main Page.wiki deleted file mode 100644 index 077c69940..000000000 --- a/_source/wikifiles/Main Page.wiki +++ /dev/null @@ -1,283 +0,0 @@ -<div id="mainpage_topbox"> -<div id="mainpage_pagetitle">'''Welcome to the SuiteCRM Wiki '''</div> -<div class="mainpage_boxcontents"><div id="mf-intro"> -This is the wiki for SuiteCRM which contains many guides, FAQ's, information about future releases and support options. Use the links to the left to navigate through the SuiteCRM wiki. -<br> -In the versions section, you will find documentation on previously released and current versions of SuiteCRM. There will be details such as when it was last released and the support for that version. -<br> -You will find all User Guides for the custom modules inside SuiteCRM within the User Guides section. -<br> -You'll find some content translated into other languages, but the primary documentation language is English. -<br> -For questions, advice and support about SuiteCRM see the [https://suitecrm.com/index.php?option=com_kunena&view=category&Itemid=1137&layout=list support forums].</div> -</div> -</div> - -| role="presentation" style="border:0; margin:0;" width="100%" cellspacing="10" -| valign="top" class="mainpage_hubbox" | -<div class="mainpage_hubtitle">'''Using SuiteCRM'''</div> -<div class="mainpage_boxcontents"> -<div class="icons" style="text-align:center;"> -https://suitecrm.com/wiki_home_icons/assistant.png -</div> - -<div id="mf-users" title="Users"> -<strong class="mainpage_boxcontents_title">SuiteCRM How To's</strong> -* '''[[userguide|Learn How]]''' SuiteCRM modules work -* Customise your SuiteCRM experience -* Get '''[https://suitecrm.com/index.php?option=com_kunena&view=category&Itemid=1137&layout=list help]''' from other community members -</div> -</div> -| valign="top" class="mainpage_hubbox" | -<div class="mainpage_hubtitle">'''SuiteCRM Installation'''</div> -<div class="mainpage_boxcontents"> -<div class="icons" style="text-align:center;"> -https://suitecrm.com/wiki_home_icons/book.png -</div> -<div id="mf-admins" title="System administrators"> -<strong class="mainpage_boxcontents_title">Install & configure SuiteCRM</strong> -* '''[[Installation|How to]]''' install SuiteCRM -* '''[[upgrade|Upgrade]]''' from SugarCRM to SuiteCRM -* '''[[upgrade|Upgrade]]''' an existing SuiteCRM installation -* Add features with '''[https://store.suitecrm.com third party extensions]''' -</div> -</div> -| valign="top" class="mainpage_hubbox" | -<div class="mainpage_hubtitle">'''Developing & Extending SuiteCRM'''</div> -<div class="mainpage_boxcontents"> -<div class="icons" style="text-align:center;"> -https://suitecrm.com/wiki_home_icons/development.png -</div> -<div id="mf-devs" title="Developers"> -<strong class="mainpage_boxcontents_title">For SuiteCRM Developers</strong> -* Learn how to develop and write extensions''' -* Contribute your extensions to our [https://store.suitecrm.com extension directory] -* Browse the [https://suitecrm.com/index.php?option=com_kunena&view=category&Itemid=1137&layout=list forums] for developer help -</div> -</div> -| - -| role="presentation" style="border:0; margin: 0;" width="100%" cellspacing="10" -| valign="top" id="mainpage_downloadcell" |<div class="mainpage_boxtitle">'''Version List'''</div> -<div class="mainpage_boxcontents_small"> - -* <span style="font-size:110%;">'''[[Release notes 7.9.7#SuiteCRM_7.9.7|7.9.7]]''' &ndash; 18-10-2017 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.9.6#SuiteCRM_7.9.6|7.9.6]]''' &ndash; 03-10-2017 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.9.5#SuiteCRM_7.9.5|7.9.5]]''' &ndash; 6-09-2017 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.9.4#SuiteCRM_7.9.4|7.9.4]]''' &ndash; 20-07-2017 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.9.3#SuiteCRM_7.9.3|7.9.3]]''' &ndash; 17-07-2017 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.9.2#SuiteCRM_7.9.2|7.9.2]]''' &ndash; 30-06-2017 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.9.1#SuiteCRM_7.9.1|7.9.1]]''' &ndash; 15-06-2017 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.9.0#SuiteCRM_7.9.0|7.9.0]]''' &ndash; 29-05-2017 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.8.8#SuiteCRM_7.8.8|7.8.8]]''' &ndash; 18-10-2017 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.8.7#SuiteCRM_7.8.7|7.8.7]]''' &ndash; 03-10-2017 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.8.6#SuiteCRM_7.8.6|7.8.6]]''' &ndash; 6-09-2017 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.8.5#SuiteCRM_7.8.5|7.8.5]]''' &ndash; 15-06-2017 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.8.4#SuiteCRM_7.8.4|7.8.4]]''' &ndash; 29-05-2017 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.8.3#SuiteCRM_7.8.3|7.8.3]]''' &ndash; 10-04-2017 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.8.2#SuiteCRM_7.8.2|7.8.2]]''' &ndash; 27-02-2017 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.8.1#SuiteCRM_7.8.1|7.8.1]]''' &ndash; 06-02-2017 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.8#SuiteCRM_7.8|7.8.0]]''' &ndash; 30-01-2017 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.7.9#SuiteCRM_7.7.9|7.7.9]]''' &ndash; 31-12-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.7.8#SuiteCRM_7.7.8|7.7.8]]''' &ndash; 16-11-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.7.7#SuiteCRM_7.7.7|7.7.7]]''' &ndash; 04-11-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.7.6#SuiteCRM_7.7.6|7.7.6]]''' &ndash; 19-10-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.7.5#SuiteCRM_7.7.5|7.7.5]]''' &ndash; 28-09-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.7.4#SuiteCRM_7.7.4|7.7.4]]''' &ndash; 31-08-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.7.3#SuiteCRM_7.7.3|7.7.3]]''' &ndash; 25-08-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.7.2#SuiteCRM_7.7.2|7.7.2]]''' &ndash; 23-08-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.7.1#SuiteCRM_7.7.1|7.7.1]]''' &ndash; 11-08-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.7#SuiteCRM_7.7|7.7.0]]''' &ndash; 02-08-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.6.10#SuiteCRM_7.6.10|7.6.10]]''' &ndash; 16-11-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.6.9#SuiteCRM_7.6.9|7.6.9]]''' &ndash; 04-11-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.6.8#SuiteCRM_7.6.8|7.6.8]]''' &ndash; 19-10-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.6.7#SuiteCRM_7.6.7|7.6.7]]''' &ndash; 28-09-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.6.6#SuiteCRM_7.6.6|7.6.6]]''' &ndash; 18-07-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.6.5#SuiteCRM_7.6.5|7.6.5]]''' &ndash; 04-07-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.5.4#SuiteCRM_7.5.4|7.5.4]]''' &ndash; 04-07-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.6.4#SuiteCRM_7.6.4|7.6.4]]''' &ndash; 30-05-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.6.3#SuiteCRM_7.6.3|7.6.3]]''' &ndash; 17-05-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.6.2#SuiteCRM_7.6.2|7.6.2]]''' &ndash; 10-05-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.6.1#SuiteCRM_7.6.1|7.6.1]]''' &ndash; 03-05-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.6#SuiteCRM_7.6.0|7.6.0]]''' &ndash; 27-04-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.5.3#SuiteCRM_7.5.3|7.5.3]]''' &ndash; 15-03-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.5.2#SuiteCRM_7.5.2|7.5.2]]''' &ndash; 07-03-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.5.1#SuiteCRM_7.5.1|7.5.1]]''' &ndash; 26-01-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.5.0#SuiteCRM_7.5.0|7.5.0]]''' &ndash; 18-01-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.4.3#SuiteCRM_7.4.3|7.4.3]]''' &ndash; 23-11-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.4.2#SuiteCRM_7.4.2|7.4.2]]''' &ndash; 22-10-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.4.1#SuiteCRM_7.4.1|7.4.1]]''' &ndash; 10-11-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.4.0#SuiteCRM_7.4.0|7.4.0]]''' &ndash; 30-10-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.3.2#SuiteCRM_7.3.2|7.3.2]]''' &ndash; 22-10-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.3.1#SuiteCRM_7.3.1|7.3.1]]''' &ndash; 25-08-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.3.0#SuiteCRM_7.3.0|7.3.0]]''' &ndash; 14-08-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.2.3#SuiteCRM_7.2.3|7.2.3]]''' &ndash; 06-08-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.1.8#SuiteCRM_7.1.8|7.1.8]]''' &ndash; 06-08-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.2.2#SuiteCRM_7.2.2|7.2.2]]''' &ndash; 20-05-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.1.7#SuiteCRM_7.1.7|7.1.7]]''' &ndash; 20-05-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.2.1#SuiteCRM_7.2.1|7.2.1]]''' &ndash; 11-03-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.1.6#SuiteCRM_7.1.6|7.1.6]]''' &ndash; 11-03-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.2.0#SuiteCRM_7.2.0|7.2.0]]''' &ndash; 02-03-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.1.5#SuiteCRM_7.1.5|7.1.5]]''' &ndash; 19-01-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.1.4#SuiteCRM_7.1.4|7.1.4]]''' &ndash; 25-09-2014 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.1.3#SuiteCRM_7.1.3|7.1.3]]''' &ndash; 13-08-2014 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.1.2#SuiteCRM_7.1.2|7.1.2]]''' &ndash; 07-07-2014 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.1.1#SuiteCRM_7.1.1|7.1.1]]''' &ndash; 04-04-2014 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.1.0#SuiteCRM_7.1.0|7.1.0]]''' &ndash; 31-03-2014 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.0.2#SuiteCRM_7.0.2|7.0.2]]''' &ndash; 20-01-2014 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.0.1#SuiteCRM_7.0.1|7.0.1]]''' &ndash; 04-11-2013 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.0.0#SuiteCRM_7.0.0|7.0.0]]''' &ndash; 21-10-2013</span><br /> - -<div style="width:90%; text-align:center; margin:10px auto;"> -<div style="border:2px outset #cccccc; background:#dddddd; margin:5px; padding:5px; white-space:nowrap;"> -<span style="padding-left:5px; font-size:130%; font-weight:bold;">[https://suitecrm.com/download Download]</span> -</div> -</div> -</div> -| valign="top" id="mainpage_newscell" |<div class="mainpage_boxtitle">'''News'''</div> -<div class="mainpage_boxcontents_small"> -== Recent news == -[13.02.2017][https://suitecrm.com/wiki/index.php/Userguide Updated User Guide]. - -Now including Workflow Calculated Fields action. -<hr> - -[06.02.2017]SuiteCRM 7.8.1 released. - -Please see the release notes for further information. -<hr> - -[30.01.2017]SuiteCRM 7.8 released. - -Please see the release notes for further information. -<hr> - -[31.12.2016]SuiteCRM 7.7.9 Security patch released. - -Please see the release notes for further information. -<hr> -[19.10.2016]SuiteCRM 7.7.6 & 7.6.8 released. - -Please see the release notes for further information. -<hr> -[28.09.2016]SuiteCRM 7.7.5 released. - -Please see the release notes for further information. -<hr> -[28.09.2016]SuiteCRM 7.6.7 released. - -Please see the release notes for further information. -<hr> -[31.08.2016]SuiteCRM 7.7.4 released. - -Please see the release notes for further information. -<hr> -[25.08.2016]SuiteCRM 7.7.3 released. - -Please see the release notes for further information. -<hr> -[23.08.2016]SuiteCRM 7.7.2 released. - -Please see the release notes for further information. -<hr> -[11.08.2016]SuiteCRM 7.7.1 released. - -Please see the release notes for further information. -<hr> -[02.08.2016]SuiteCRM 7.7 released. - -Please see the release notes for further information. -<hr> -[04.07.2016]SuiteCRM Important Security Patch Released 7.6.6 / 7.5.5. - -An Important Security Patch has been release that effects all version of SuiteCRM. -<hr> -[04.07.2016]SuiteCRM Important Security Patch Released 7.6.5 / 7.5.4. - -An Important Security Patch has been release that effects all version of SuiteCRM. -<hr> -[30.05.2016]SuiteCRM 7.6.4 released. - -Please see the release notes for further information. -<hr> -[17.05.2016]SuiteCRM 7.6.3 released. - -Please see the release notes for further information. -<hr> -[10.05.2016]SuiteCRM 7.6.2 released. - -Please see the release notes for further information. -<hr> -[22.10.2015]SuiteCRM 7.3.2 released. - -Please see the release notes for further information. -<hr> -[14.08.2015]SuiteCRM 7.3.1 released. - -Please see the release notes for further information. -<hr> -[14.08.2015]SuiteCRM 7.3.0 released. - -Please see the release notes for further information. -<hr> -[06.08.2015]SuiteCRM 7.2.3 and SuiteCRM 7.1.8 bug-fix versions released. - -Please see the release notes for further information. -<hr> -[20.05.2015]SuiteCRM 7.2.2 and SuiteCRM 7.1.7 bug-fix versions released. - -Please see the release notes for further information. -<hr> -[11.03.2015]SuiteCRM 7.2.1 and SuiteCRM 7.1.6 bug-fix versions released. - -Please see the release notes for the full list of new features and bug fixes. -<hr> - -[02.03.2015]SuiteCRM 7.2.0 is the new production release of SuiteCRM. Packed with new features, functionality and bug-fixes. - -Please see the release notes for the full list of new features and bug fixes. -<hr> - -[19.01.2015]SuiteCRM 7.1.5 features many bug fixes and addresses important security issues. - -SugarCRM version updated to 6.5.20 - -This update addresses some important Security issues. -<hr> - -[25.09.2014] SuiteCRM 7.1.4 has now been released. 7.1.4 features important security fixes to both the SugarCRM CE core(upgraded to 6.5.18 latest release) and QuickCRM. - -There are many bug fixes to several modules within SuiteCRM, and some minor enhancements. Please see the release notes for a full list of bug fixes. -<hr> - -[13.08.2014] SuiteCRM 7.1.3 has now been released. 7.1.3 features many bug fixes to several modules within SuiteCRM, and some minor enhancements. Please see the release notes for a full list of bug fixes. -<hr> - -[07.07.2014] SuiteCRM 7.1.2 has now been released. 7.1.2 features important security updates for the SugarCRM base and many bug fixes have been implemented. Please see the release notes for a full list of bug fixes. -<hr> - -[04.04.2014] SuiteCRM 7.1.1 has been released and is now available to download and upgrade from previous SuiteCRM versions. -<hr> - -[31.03.2014] The long awaited SuiteCRM 7.1 is now available - -This release packs in many new features, most notably the many enhancements to workflow, the new lucene powered search, (to enable see AOD in the admin panel), the multi tabbed homepage, the ability to filter the history sub-panel and more - -A Full list of new features and bug fixed will be available soon - -Go to the download section to get the full package or appropriate upgrade. - -Thanks to everyone who has contributed to the project so far, if you have something to contribute be it a Bug Fix, a Language Pack or a New Feature, then check out the project on [http://github.com/salesagility/suitecrm GitHub]. -<hr> - -[23.01.2014] SuiteCRM 7.1 will be released in Q1 of 2014. SuiteCRM 7.1 will contain a host of new functionality and features such as Social integration, improvements to AOW and more. -<hr> - -[21.01.2014] SuiteCRM 7.0.2 has been released which has several new additions and many bugfixes. We thank both the community who highlighted and/or posted solutions for these bugs and also to our contributors who helped work towards new additions and the resolution of bugs via our SuiteCRM repository on GitHub [https://github.com/salesagility/SuiteCRM] . -<hr> - -[14.01.2014] SuiteCRM 7.0.2 and 7.1 are due for release this month. 7.0.2 is a bugfix release with fixes to languages, the theme and modules such as AOS/AOW/AOP and AOR. 7.1 is a minor release with new features such as OpenMeetings/Social Integration and more... - -</div> - -| diff --git a/_source/wikifiles/Support.adoc b/_source/wikifiles/Support.adoc deleted file mode 100644 index bbb7b3ded..000000000 --- a/_source/wikifiles/Support.adoc +++ /dev/null @@ -1,21 +0,0 @@ -[[support]] -Support -------- - -We are advocates of Open Source. As such please do not contact us -directly via email or phone for SuiteCRM support. Instead, please use -our support forum. - -By using the forum the knowledge is shared with everyone in the -community. Our developers answer questions on the forum daily but it -also gives the other members of the community the opportunity to -contribute. - -[[support-packages]] -Support Packages -~~~~~~~~~~~~~~~~ - -There are various tiers of support service available for SuiteCRM. -Ranging from 2 hours of support per month via tickets/phone up to 12 -hours of support including email/ticket/phone support and access to -experienced developer knowledge. diff --git a/_source/wikifiles/Support.wiki b/_source/wikifiles/Support.wiki deleted file mode 100644 index fd24f72a2..000000000 --- a/_source/wikifiles/Support.wiki +++ /dev/null @@ -1,9 +0,0 @@ -= Support = - -We are advocates of Open Source. As such please do not contact us directly via email or phone for SuiteCRM support. Instead, please use our support forum. - -By using the forum the knowledge is shared with everyone in the community. Our developers answer questions on the forum daily but it also gives the other members of the community the opportunity to contribute. - -== Support Packages == - -There are various tiers of support service available for SuiteCRM. Ranging from 2 hours of support per month via tickets/phone up to 12 hours of support including email/ticket/phone support and access to experienced developer knowledge. diff --git a/_source/wikifiles/Upgrading.adoc b/_source/wikifiles/Upgrading.adoc deleted file mode 100644 index 42e7fc662..000000000 --- a/_source/wikifiles/Upgrading.adoc +++ /dev/null @@ -1,214 +0,0 @@ -[cols="",] -|======= -|__TOC__ -|======= - -[[upgrading-suitecrm]] -Upgrading SuiteCRM -^^^^^^^^^^^^^^^^^^ - -Log into your SuiteCRM instance to use the Upgrade Wizard. There is -currently no silent upgrade path available for SuiteCRM. CAUTION: It is -strongly recommended that you run the upgrade process on a copy of your -production system. - -[[compatibility-matrix-for-upgrade]] -Compatibility matrix for upgrade -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -PHP version 5.2.1-5.2.6, 5.2.8-5.2.15, 5.2.17, 5.3.0 - 5.3.6 Databases -MySQL - 5.0x, 5.1 MSSQL - 2005, 2008 Operating systems Windows: Sugar -runs on any OS that runs PHP Linux: Sugar runs on any OS that runs PHP -Mac: Sugar runs on any OS that runs PHP - -[[upgrading-to-suitecrm-from-sugarcrm-community-edition]] -Upgrading to SuiteCRM from SugarCRM Community Edition -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Upgrade paths are available for SugarCRM to SuiteCRM from the SuiteCRM -downloads section of the SuiteCRM website. To validate what versions of -SugarCRM are compatible with the respective SuiteCRM versions, please -check the table below: SuiteCRM Version SugarCRM Version SuiteCRM 7.0.1 -SugarCRM 6.5.x SuiteCRM 7.0.0 SugarCRM 6.5.x - -[[upgrade-prerequisites]] -Upgrade prerequisites -^^^^^^^^^^^^^^^^^^^^^ - -* Backup your current SuiteCRM directory and database before beginning -the upgrade process. -* Disable op-code caching before upgrading your SuiteCRM installation if -op-code caching is enabled in the PHP configuration file. You can enable -it after the upgrade process is complete. -* Increase the default value of the parameters listed below before you -begin the upgrade process if you are using Zend Core 2.0: -** Navigate to C:\Program Files\Zend\Core\etc\fastcgi.conf and increase -the default value for ConnectionTimeout to 3000 seconds and -RequestTimeout to 6000 seconds. -** Navigate to the php.ini file and increase the default value of -max_execution_time to 6000 seconds. -* Perform the following for the large size of the upgrade files: -** Modify and save the value of Maximum upload size to 21000000 (20MB) -in the Advanced section of the System Settings page of your current -SuiteCRM installation. -** Navigate to the php.ini file on your web server and configure the -parameters listed below in the Advanced section of the System Settings -page of your current SuiteCRM installation: -*** Set post_max_size to at least 60MB -*** Set upload_max_filesize settings to at least 60MB -*** Set max_input_time to a large number -*** Set memory_limit to 256MB - -Restart the web server and begin the upgrade process. - -* Ensure that LimitRequestBody is set to a large number or use the -default value of 2GB if you are using an Apache web server and -LimitRequestBody is set in the httpd.conffile. Restart Apache and begin -the upgrade process. -* Ensure that the webserver user has write permissions to the SuiteCRM -database. The upgrade to SuiteCRM 7.0.x will add and replace files in -several locations including the SuiteCRM root directory. The webserver -user must have write permissions for the root folder and all -sub-directories during the upgrade process. -* The process of upgrading can take up to 30 minutes. Set the CGI script -timeout to more than the default 300 seconds to ensure that the CGI -application does not time out if you are using the IIS web server. -* Save PHP files for customized modules (for example, accounts.php) in -the Customs directory and not within the main module. Existing -customizations may be overridden by changes in SuiteCRM 7.0.x during -upgrade. - -[[upgrade-considerations]] -Upgrade considerations -^^^^^^^^^^^^^^^^^^^^^^ - -The Dynamic Teams feature requires some database schema changes across -all modules as part of the upgrade process. For larger databases, this -operation can take some time to complete. Follow the steps listed below -to ensure a smooth upgrade process: - -1. Test your upgrade on a development instance instead of the -production instance. -2. Use the Silent Upgrade method through the command line interface to -conduct the upgrade instead of the Upgrade Wizard inside the application -if your database contains more than 10000 records per table. -3. Log into the application as an Administrator and use the Repair -option to repair and rebuild the database after the upgrade is complete. - -[[using-the-upgrade-wizard]] -Using the Upgrade Wizard -^^^^^^^^^^^^^^^^^^^^^^^^ - -The Upgrade Wizard provides a quick way to upgrade to the latest version -of the SuiteCRM application. It includes critical upgrade logic as well -as the SQL commands needed to upgrade the application. Ensure that the -config.php file for your installation, located in the SuiteCRM root -directory, is writable, before using the Upgrade Wizard. Note: Manual -upgrades by file replacements and running the upgrade SQL are not -supported. - -[[upgrading-suitecrm-using-the-upgrade-wizard]] -Upgrading SuiteCRM using the Upgrade Wizard -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -1. Download the appropriate SuiteCRM Upgrade zip file from the SuiteCRM -website or GitHub Repository to your local machine. -2. Log into your existing SuiteCRM application as the administrator and -click admin on the right-hand corner of the page. -3. Click Upgrade Wizard in the Systems panel of the Administration Home -page. -* This displays the Upgrade Wizard page. -4. Click Next. -* This displays the System Checks page. and SuiteCRM begins the system -check process. The Systems Check page indicates that there were no -issues if the system check process completes successfully. Issues with -file permissions, database, and server settings are listed on the page -if the system check process encountered any problems. -5. Click Next if the system check is successful. -* This displays the Upload an Upgrade page. -6. Click Browse, and navigate to the location of the upgrade zip file -and select it. -* The path to the file displays in the Upload an upgrade field. -7. Click Upload Upgrade to upload the package to the SuiteCRM -application. -* The system uploads the package and displays it on the page. Use the -Delete Package button to remove the package if necessary. -8. Click Next. -* This displays the Preflight Check page. -* Click Show Schema Change Script toview differences in the SuiteCRM -databases schema between your current and new SuiteCRM versions. -* By default, the Upgrade Wizard Runs SQL option is selected as the -database update method. Select Manual SQL Queries from the Database -Update Method drop-down list and select the Check when SQL has been -manually run box, if you ran the SQL queries manually. -9. Click Recheck to rerun Preflight Check. Click Next to skip this -step. -* This displays the Commit Upgrade page. -* You can also click Show to see a list of files that were copied and -the rebuilt results. You can also view skipped queries. -10. Click Next. -* During the upgrade process, SuiteCRM performs a three-way merge -between the customized instance on old version, default instance on old -version, and default instance on new version. This three-way merge adds -any fields that have been added to the default module layouts in the new -version to the corresponding module layouts in the existing version, if -the module layouts in the old version were not customized through Studio -(or in the appropriate upgrade-safe way) prior to the upgrade. The -three-way merge also changes the placement of fields in -non-Studio-customized module layouts to match the placement in the -default module layouts. -* SuiteCRM displays the Confirm Layouts page as Step 5 of the upgrade -process if the existing module layouts have been customized, and there -are changes to the default fields and field placement in the new module -layouts. -* The Confirm Layouts page lists the module layouts that have changed in -the new version. The administrator has the option of applying the -changes to the existing module layouts. By default, all of the listed -module layouts are selected to be merged during the upgrade. -* For example, in 6.1.0, SuiteCRM added the Assigned To fields to the -default Detail View and Edit View layouts for Notes and for Email -Templates. If the instance being upgraded has a customized EditView -layout for Notes, but no customized layouts for Email Templates, the -following will occur during the upgrade: -+ -a. The Confirm Layouts page appears as Step 5 in the Upgrade Wizard + -b. The Confirm Layouts page displays the Notes module with the EditView -and DetailView layouts. The Email Templates layouts do not display on -the Confirm Layouts page because the existing layouts were not -customized. + -c. The Administrator has the option of choosing to merge the changes in -the Notes module with the existing customized EditView layout.:: -11. Uncheck the module if you do not want to add the new fields to a -module. -12. Click Next. -* This displays a message confirming that the layouts were successfully -merged (if you chose to update your modules). -13. Click Next. -14. The Debrief page confirms the upgrade installation. Complete the -steps for manual merging of files or running SQL queries now. -15. Click Done. -* This displays the Home page indicating that the upgrade is complete. -16. Click Repair and select the Rebuild Relationships andRebuild -Extensions options in the Systems panel of the Administration Home page. -* For more information, see Repair. -17. Manually merge the files by extracting the skipped file from the -patch zip file if you unchecked any files to prevent the Upgrade Wizard -from overwriting them. Merge the file installed in the SuiteCRM -application directory. -* Note:Check the upgradeWizard.log file in the SuiteCRM folder for -information on unsuccessful SuiteCRM upgrades. - -[[uninstalling-a-suitecrm-instance]] -Uninstalling a SuiteCRM instance -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Follow these steps to uninstall your SuiteCRM instance: - -1. Navigate to the directory within your web server where SuiteCRM is -located. -2. Remove the SuiteCRM directory(Linux: rm -r if you -wish to be prompted, rm -rf if you wish to delete the -directory without being prompted). -3. Delete the SuiteCRM database schema from your server -database(default is “suitecrm”, this will differ if this has been -renamed during the installation process). diff --git a/_source/wikifiles/Upgrading.wiki b/_source/wikifiles/Upgrading.wiki deleted file mode 100644 index b8969641b..000000000 --- a/_source/wikifiles/Upgrading.wiki +++ /dev/null @@ -1,97 +0,0 @@ -{| align="right" style="padding-left:25px;" -| __TOC__ -|} -===Upgrading SuiteCRM=== -Log into your SuiteCRM instance to use the Upgrade Wizard. There is currently no silent upgrade path available for SuiteCRM. -CAUTION: It is strongly recommended that you run the upgrade process on a copy of your production system. -===Compatibility matrix for upgrade=== -PHP version -5.2.1-5.2.6, 5.2.8-5.2.15, 5.2.17, 5.3.0 - 5.3.6 -Databases -MySQL - 5.0x, 5.1 -MSSQL - 2005, 2008 -Operating systems -Windows: Sugar runs on any OS that runs PHP -Linux: Sugar runs on any OS that runs PHP -Mac: Sugar runs on any OS that runs PHP -===Upgrading to SuiteCRM from SugarCRM Community Edition=== -Upgrade paths are available for SugarCRM to SuiteCRM from the SuiteCRM downloads section of the SuiteCRM website. To validate what versions of SugarCRM are compatible with the respective SuiteCRM versions, please check the table below: -SuiteCRM Version -SugarCRM Version -SuiteCRM 7.0.1 -SugarCRM 6.5.x -SuiteCRM 7.0.0 -SugarCRM 6.5.x - -===Upgrade prerequisites=== -*Backup your current SuiteCRM directory and database before beginning the upgrade process. -*Disable op-code caching before upgrading your SuiteCRM installation if op-code caching is enabled in the PHP configuration file. You can enable it after the upgrade process is complete. -*Increase the default value of the parameters listed below before you begin the upgrade process if you are using Zend Core 2.0: -**Navigate to C:\Program Files\Zend\Core\etc\fastcgi.conf and increase the default value for ConnectionTimeout to 3000 seconds and RequestTimeout to 6000 seconds. -**Navigate to the php.ini file and increase the default value of max_execution_time to 6000 seconds. -*Perform the following for the large size of the upgrade files: -**Modify and save the value of Maximum upload size to 21000000 (20MB) in the Advanced section of the System Settings page of your current SuiteCRM installation. -**Navigate to the php.ini file on your web server and configure the parameters listed below in the Advanced section of the System Settings page of your current SuiteCRM installation: -***Set post_max_size to at least 60MB -***Set upload_max_filesize settings to at least 60MB -***Set max_input_time to a large number -***Set memory_limit to 256MB -Restart the web server and begin the upgrade process. -*Ensure that LimitRequestBody is set to a large number or use the default value of 2GB if you are using an Apache web server and LimitRequestBody is set in the httpd.conffile. Restart Apache and begin the upgrade process. -*Ensure that the webserver user has write permissions to the SuiteCRM database. The upgrade to SuiteCRM 7.0.x will add and replace files in several locations including the SuiteCRM root directory. The webserver user must have write permissions for the root folder and all sub-directories during the upgrade process. -*The process of upgrading can take up to 30 minutes. Set the CGI script timeout to more than the default 300 seconds to ensure that the CGI application does not time out if you are using the IIS web server. -*Save PHP files for customized modules (for example, accounts.php) in the Customs directory and not within the main module. Existing customizations may be overridden by changes in SuiteCRM 7.0.x during upgrade. -===Upgrade considerations=== -The Dynamic Teams feature requires some database schema changes across all modules as part of the upgrade process. For larger databases, this operation can take some time to complete. Follow the steps listed below to ensure a smooth upgrade process: -#Test your upgrade on a development instance instead of the production instance. -#Use the Silent Upgrade method through the command line interface to conduct the upgrade instead of the Upgrade Wizard inside the application if your database contains more than 10000 records per table. -#Log into the application as an Administrator and use the Repair option to repair and rebuild the database after the upgrade is complete. -===Using the Upgrade Wizard=== -The Upgrade Wizard provides a quick way to upgrade to the latest version of the SuiteCRM application. It includes critical upgrade logic as well as the SQL commands needed to upgrade the application. -Ensure that the config.php file for your installation, located in the SuiteCRM root directory, is writable, before using the Upgrade Wizard. -Note: Manual upgrades by file replacements and running the upgrade SQL are not supported. -===Upgrading SuiteCRM using the Upgrade Wizard=== -#Download the appropriate SuiteCRM Upgrade zip file from the SuiteCRM website or GitHub Repository to your local machine. -#Log into your existing SuiteCRM application as the administrator and click admin on the right-hand corner of the page. -#Click Upgrade Wizard in the Systems panel of the Administration Home page. -#*This displays the Upgrade Wizard page. -#Click Next. -#*This displays the System Checks page. and SuiteCRM begins the system check process. The Systems Check page indicates that there were no issues if the system check process completes successfully. Issues with file permissions, database, and server settings are listed on the page if the system check process encountered any problems. -#Click Next if the system check is successful. -#*This displays the Upload an Upgrade page. -#Click Browse, and navigate to the location of the upgrade zip file and select it. -#*The path to the file displays in the Upload an upgrade field. -#Click Upload Upgrade to upload the package to the SuiteCRM application. -#*The system uploads the package and displays it on the page. Use the Delete Package button to remove the package if necessary. -#Click Next. -#*This displays the Preflight Check page. -#*Click Show Schema Change Script toview differences in the SuiteCRM databases schema between your current and new SuiteCRM versions. -#*By default, the Upgrade Wizard Runs SQL option is selected as the database update method. Select Manual SQL Queries from the Database Update Method drop-down list and select the Check when SQL has been manually run box, if you ran the SQL queries manually. -#Click Recheck to rerun Preflight Check. Click Next to skip this step. -#*This displays the Commit Upgrade page. -#*You can also click Show to see a list of files that were copied and the rebuilt results. You can also view skipped queries. -#Click Next. -#*During the upgrade process, SuiteCRM performs a three-way merge between the customized instance on old version, default instance on old version, and default instance on new version. This three-way merge adds any fields that have been added to the default module layouts in the new version to the corresponding module layouts in the existing version, if the module layouts in the old version were not customized through Studio (or in the appropriate upgrade-safe way) prior to the upgrade. The three-way merge also changes the placement of fields in non-Studio-customized module layouts to match the placement in the default module layouts. -#*SuiteCRM displays the Confirm Layouts page as Step 5 of the upgrade process if the existing module layouts have been customized, and there are changes to the default fields and field placement in the new module layouts. -#*The Confirm Layouts page lists the module layouts that have changed in the new version. The administrator has the option of applying the changes to the existing module layouts. By default, all of the listed module layouts are selected to be merged during the upgrade. -#*For example, in 6.1.0, SuiteCRM added the Assigned To fields to the default Detail View and Edit View layouts for Notes and for Email Templates. If the instance being upgraded has a customized EditView layout for Notes, but no customized layouts for Email Templates, the following will occur during the upgrade: -#;a. The Confirm Layouts page appears as Step 5 in the Upgrade Wizard -#;b. The Confirm Layouts page displays the Notes module with the EditView and DetailView layouts. The Email Templates layouts do not display on the Confirm Layouts page because the existing layouts were not customized. -#;c. The Administrator has the option of choosing to merge the changes in the Notes module with the existing customized EditView layout. -#Uncheck the module if you do not want to add the new fields to a module. -#Click Next. -#*This displays a message confirming that the layouts were successfully merged (if you chose to update your modules). -#Click Next. -#The Debrief page confirms the upgrade installation. Complete the steps for manual merging of files or running SQL queries now. -#Click Done. -#*This displays the Home page indicating that the upgrade is complete. -#Click Repair and select the Rebuild Relationships andRebuild Extensions options in the Systems panel of the Administration Home page. -#*For more information, see Repair. -#Manually merge the files by extracting the skipped file from the patch zip file if you unchecked any files to prevent the Upgrade Wizard from overwriting them. Merge the file installed in the SuiteCRM application directory. -#*Note:Check the upgradeWizard.log file in the SuiteCRM folder for information on unsuccessful SuiteCRM upgrades. - -===Uninstalling a SuiteCRM instance=== -Follow these steps to uninstall your SuiteCRM instance: -#Navigate to the directory within your web server where SuiteCRM is located. -#Remove the SuiteCRM directory(Linux: rm -r <suitedirectory> if you wish to be prompted, rm -rf <suitedirectory> if you wish to delete the directory without being prompted). -#Delete the SuiteCRM database schema from your server database(default is “suitecrm”, this will differ if this has been renamed during the installation process). diff --git a/_source/wikifiles/User Guide.adoc b/_source/wikifiles/User Guide.adoc deleted file mode 100644 index 22496bca4..000000000 --- a/_source/wikifiles/User Guide.adoc +++ /dev/null @@ -1,5748 +0,0 @@ - -Introduction ------------- - -[[the-suitecrm-team-and-community]] -The SuiteCRM Team and Community -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -It is safe to say without the constant work from the SuiteCRM Team and -Community, I would not have had the drive and commitment to sit down and -write this user guide. New functionality and improvements to the core -product are constantly added to make SuiteCRM the best Open Source CRM -product in the world, and to compete with proprietary CRM vendors such -as SugarCRM, Salesforce and Microsoft. - -As for The SuiteCRM Community - they provide bug reports, bug fixes and -bug testing. The Community is at the heart of any Open Source project -and this is no different with SuiteCRM. With each new release the -community grows and with it grow the benefits of the Open Source -ecosystem. - -[[what-is-suitecrm]] -What is SuiteCRM? -~~~~~~~~~~~~~~~~~ - -SuiteCRM is a software fork of the popular -https://en.wikipedia.org/wiki/Customer_relationship_management[Customer -Relationship Management] (CRM) system -https://en.wikipedia.org/wiki/SugarCRM[SugarCRM], developed and -maintained by SalesAgility. It is a free and open source alternative -application. It was released on October 21, 2013 as version 7.0. The -latest production version at the time of publishing this User Guide is -SuiteCRM 7.6.3. - -SuiteCRM has been downloaded more than 500,000 times since the original -release. It has been adopted by NHS (National Health Service) England's -Code for Health programme which seeks to foster open source in the NHS -in England. - -The SuiteCRM project has stated that the every line of code released by -the project will be open source. SuiteCRM project is intended to be an -enterprise-class open source alternative to proprietary products. - -A project Roadmap is available that details planned enhancements. - -An active public support forum with more than 25,000 members is -available for free support and is regularly monitored and updated by the -Project team. - -A directory of extensions is available where both free and paid-for -enhancements are available. - -The project maintains https://suitecrmondemand.com/[SuiteCRM:OnDemand], -a Software As A Service facility for users who seek a rapid deployment -and maintenance free service. - -There will be no licensed software as part of the project managed by -SalesAgility. All the code is free. All the code is available for free -download. There is no hidden agenda to charge for access to the code. It -is and always will be free and open source. There will be no paid-for -versions. - -[[who-is-salesagility]] -Who is SalesAgility? -~~~~~~~~~~~~~~~~~~~~ - -SalesAgility is an ISO-accredited open source consultancy focused on -Customer Relationship Management (CRM). An early adopter of SugarCRM -Community Edition, SalesAgility are the creators and maintainers behind -the SugarCRM fork – SuiteCRM. - -SalesAgility have delivered more than 300 SuiteCRM and SugarCRM -projects, and are known as a world class knowledge and expertise -resource for open source CRM. Customers include governments, enterprises -and small and medium sized business globally. - -SalesAgility has a clear mission statement: - -_"Our goal is to innovate and provide advanced SuiteCRM and SugarCRM -solutions along with the industry’s leading customer service and -support._ - -_We believe that open source is in the best interest of our clients and -we will continue to build, innovate, evangelise and provide best -practice working models for the open source community."_ - -[[what-is-in-the-user-guide]] -What is in the User Guide? -~~~~~~~~~~~~~~~~~~~~~~~~~~ - - -The SuiteCRM User Guide has been written for the end user. This guide -covers the SuiteCRM User Journey from end-to-end. We will explore all -areas from the basics of logging into the system to creating complex -automated workflows and reports. - -The SuiteCRM User Guide is split into various chapters. These chapters -are ordered so that you progress through you guide as you would -logically in day to day CRM use. The chapters contain sub-sections which -break down barriers for you, explaining how to optimise the use of the -customer relationship management system to effectively manage sales -data. - -Readers of the SuiteCRM User Guide do not need to have development -knowledge or prior knowledge of SuiteCRM. It is advised that you are -computer literate, that you are familiar with using your chosen web -browser and that SuiteCRM has already been installed and configured. - -[[getting-started]] -Getting Started ---------------- - -[[logging-into-suitecrm]] -Logging Into SuiteCRM -~~~~~~~~~~~~~~~~~~~~~ - -SuiteCRM allows users to log in using your Username and Password, -provided to you by the System Administrator. - -image:190Home_screen.png[190Home_screen.png,title="190Home_screen.png"] - -image:02Login_with_language.png[02Login_with_language.png,title="02Login_with_language.png"] - -Before logging into SuiteCRM, you can select the language you wish to -use. There are many default languages for SuiteCRM and there are also -additional language packs available for other languages around the -world. - -Once you have chosen your language and have entered your user -credentials, you will be able to click the Login button to access the -CRM. - -image:191Log_in.png[191Log_in.png,title="191Log_in.png"] - -[[forgotten-password]] -Forgotten Password -~~~~~~~~~~~~~~~~~~ - -If you forget your CRM password and cannot access your CRM user account, -you can use the 'Forgotten Password' feature to re-send your password to -the email address associated to your user account. Clicking the 'Forgot -Password?' link on the login form will display the forgotten password -form. - -image:179Forgot_password.png[179Forgot_password.png,title="179Forgot_password.png"] - -[[summary]] -Summary -~~~~~~~ - -In this chapter we have demonstrated how to access SuiteCRM using the -login form. We have also established how to use the forgotten password -functionality to retrieve a users password in the event of the password -being lost or forgotten. - -In the next chapter we will cover the User Wizard, which allows you to -set your preferences when using SuiteCRM. - -[[user-wizard]] -User Wizard ------------ - -The User Wizard guides you through the configuration options available -to you post login. This allows you to select many formats for data that -will display in SuiteCRM, and these are specific to your user. - -[[welcome-to-suitecrm]] -Welcome to SuiteCRM -~~~~~~~~~~~~~~~~~~~ - -The first step you will see is a simple welcome page that displays once -you have logged in. Click 'Next' on this page to progress to configure -your user preferences. - -image:04SuiteCRM_welcome.png[04SuiteCRM_welcome.png,title="04SuiteCRM_welcome.png"] - -[[your-information]] -Your Information -~~~~~~~~~~~~~~~~ - -On this screen you are able to provide information about yourself. When -you provide this information, other users can view this information such -as your Full Name, Email Address and Contact details. Fields marked with -a red star(*) are required fields, and as such need to be filled in with -valid data before you can progress. - -image:05Welcome_info.png[05Welcome_info.png,title="05Welcome_info.png"] - -Once you have filled in all information on this page, click 'Next' to -progress to the next step in the wizard. - -[[your-locale]] -Your Locale -~~~~~~~~~~~ - -On this screen, you are able to specify your preferred Locale settings. - -image:06SuiteCRM_Locale.png[06SuiteCRM_Locale.png,title="06SuiteCRM_Locale.png"] - -[[currency-selection]] -Currency Selection -~~~~~~~~~~~~~~~~~~ - -Select the Currency you wish to be displayed for all Currency fields -within SuiteCRM. The Currency options are populated from the options -added by the System Administrator. If there are Currency options you -require but do not see, please contact your System Administrator. - -image:180Currency_selection.png[180Currency_selection.png,title="180Currency_selection.png"] - -[[date-format]] -Date Format -~~~~~~~~~~~ - -Select the Date Format you wish to be displayed for all Date fields -within SuiteCRM. There are many different date format options to select -from, all of which are specific to your user. This date format will also -apply to Date Time fields. - -image:08Date_format.png[08Date_format.png,title="08Date_format.png"] - -[[time-zone]] -Time Zone -~~~~~~~~~ - -Select the Time Zone you wish to use within SuiteCRM. This allows you to -tailor your use of SuiteCRM specific to where you are located globally. -If you are travelling between various countries, you can change the Time -Zone at any time in your User Preferences after you Wizard set-up, to -allow you to view records in that Time Zone. - -image:09Time_zone.png[09Time_zone.png,title="09Time_zone.png"] - -[[name-format]] -Name Format -~~~~~~~~~~~ - -Select the Name Format you wish to be displayed for all Name fields -within SuiteCRM. This is applicable to the various 'Person' modules -within SuiteCRM, and allows you to set your preferred name format -dependent on your requirement. - -image:181Name_format.png[181Name_format.png,title="181Name_format.png"] - -Once you have specified all of your Locale preferences, click 'Next' to -progress to the final step/confirmation page of the User Wizard. - -[[final-step]] -Final Step -~~~~~~~~~~ - -The final step of the User Wizard provides you with multiple useful -links for learning more and obtaining further support from the SuiteCRM -website and dedicated team. There is a 'Back' button if you have made -any mistakes you wish to amend in previous steps. - -image:image12.png[image12.png,title="image12.png"] - -Clicking 'Finish' will complete the User Wizard and will present you -with SuiteCRM login form. - -[[summary-1]] -Summary -~~~~~~~ - -In this chapter, we progressed through the User Wizard. This allows you -to set your preferences when using SuiteCRM. - -In the next chapter, we will cover managing user accounts, which will -discuss how to update user details, select themes, change passwords and -more. - -[[managing-user-accounts]] -Managing User Accounts ----------------------- - -There are many configuration options available to users once logged into -the system. You can view/modify your preferences by clicking on your -name in the top right section of the navigation menu. - -image:11User_select.png[11User_select.png,title="11User_select.png"] - -[[user-profile-tab]] -User Profile Tab -~~~~~~~~~~~~~~~~ - -Once you have clicked to access your preferences, you will be taken to -the 'User Profile' tab which gives an overview of you credentials such -as Username, First Name, Last Name, Title etc. - -image:12User_profile.png[12User_profile.png,title="12User_profile.png"] - -[[password-tab]] -Password Tab -~~~~~~~~~~~~ - -Clicking on the 'Password' tab will navigate you to allow you to change -your user account password. To change your password, specify a new -password and confirm the new password. It is recommended that passwords -are secure. The recommended minimum requirement is one upper case -character, one lower case character, one numerical character and a -minimum password length of 8 characters. - -image:13Password_tab.png[13Password_tab.png,title="13Password_tab.png"] - -If you have forgotten your password and cannot login, you can use the -forgotten password functionality detailed in the -link:#Getting_Started[Getting Started] section of this User Guide. - -[[themes-tab]] -Themes Tab -~~~~~~~~~~ - -You can easily manage the theme you are using to view SuiteCRM by -navigating to the Themes Tab. This tab allows you to easily select the -desired theme, and also shows a theme preview image (assuming this has -also been provided with any third party or additional themes). - -image:image16.png[image16.png,title="image16.png"] - -[[advanced-tab]] -Advanced Tab -~~~~~~~~~~~~ - -The Advanced tab provides you with you preferences that you set during -the User Wizard process. This gives you the ability to change any of -your user preferences, if there were any mistakes or if you require to -amend these at a later date. - -image:14Advanced_tab.png[14Advanced_tab.png,title="14Advanced_tab.png"] - -[[resetting-a-users-preferences]] -Resetting a Users Preferences -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You can reset your user preferences to the system default by clicking -the 'Reset User Preferences' button on your profile. - -image:15User_preference.png[15User_preference.png,title="15User_preference.png"] - -Clicking the button will prompt you to ensure you wish to reset your -user preferences, with the following message: “Are you sure you want -reset all of your user preferences? Warning: This will also log you out -of the application.”. you can then click 'OK' or 'Cancel' to action -appropriately. If you select 'OK' you will be logged out and will need -to re-login to SuiteCRM application. - -[[resetting-a-users-home-page]] -Resetting a Users home page -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You can reset your home page to the system default by clicking the -'Reset home page' button on your profile. This will reset both dashlet -and dashboard preferences/layouts to the system default. - -image:16Reset_homepage.png[16Reset_homepage.png,title="16Reset_homepage.png"] - -Clicking the button will prompt you to ensure you wish to reset your -home page, with the following message: “Are you sure you want reset your -home page?”. you can then click 'OK' or 'Cancel' to action -appropriately. - -[[summary-2]] -Summary -~~~~~~~ - -In this chapter, we covered managing a user account. This allows you to -manage your information, modify/reset user preferences and more. - -In the next chapter, we will cover the Interface. The Interface is an -integral part of SuiteCRM. With the knowledge of your Interface, you can -progress to learning more about SuiteCRM functionality and processes. - -[[user-interface]] -User Interface --------------- - -Before we progress to understanding the structure and functionality of -SuiteCRM, we will cover the areas of the User Interface so that you are -familiar with terminology used when describing navigating SuiteCRM. -There are many elements to the User Interface, so we have broken these -down into various sections below. - -[[navigation-elements]] -Navigation Elements -~~~~~~~~~~~~~~~~~~~ - -The ability to easily view and navigate to areas of the CRM is key to -improved productivity and user adoption. SuiteCRM has a clear UI which -has various elements we will cover in this section. - -[[top-navigation-menu]] -Top navigation menu -^^^^^^^^^^^^^^^^^^^ - -The top navigation menu is the main menu users will use to navigate to -modules to create and manage records. The standard layout for the top -navigation is a list of 10 modules. The ordering for this menu is -determined by the order of the modules in Admin → Display Modules and -Subpanels. The top navigation menu has six elements. These are: - -* CRM Name – This is the name for the CRM which is specified on -installation. This defaults to SuiteCRM. -* Module Menu – This lists or groups the modules, dependent on the user -preference. This provides the ability for users to navigate to modules -within the CRM. -* Desktop Notification Count – This shows the number of desktop -notifications the user has not yet read. These can be managed by the -user. For full details on Desktop Notifications, see the -link:#Desktop_Notifications[Desktop Notifications] section within this -user guide. -* Quick Create – Quick create allows the quick creation of key module -records globally within the CRM. -* Global/Full Text Search – Allows users to search the CRM globally for -records/data. -* User menu – This displays the user name for the user currently logged -in. There is a drop down menu which gives users access to Employees, -their profile, the about page and a link to logout. - -image:17Navigation_menu.png[17Navigation_menu.png,title="17Navigation_menu.png"] - -To view a module, you can click on the module name. This will take you -to the List View of that module. For full details on views, read the -link:#Views[Views] section of this user guide. - -Hovering over a module name will produce a drop down menu. This drop -down menu displays the Actions and Recently Viewed records for that -module. - -image:18Dropdown_menu.png[18Dropdown_menu.png,title="18Dropdown_menu.png"] - -You can edit records displayed in the Recently Viewed section of the -drop down menu by clicking the pencil icon. This will direct you to the -Edit View for that record. - -image:19Recently_viewed.png[19Recently_viewed.png,title="19Recently_viewed.png"] - -There is also a grouped tab navigation structure for SuiteCRM. Users can -set this option in their user preferences. For full details on modifying -user preferences, see the link:#Managing_User_Accounts[Managing User -Accounts] section of this user guide. - -image:20.png[20.png,title="20.png"] - -The grouped tab navigation menu gives the user the ability to group -modules within a tab such as the Sales Tab. - -image:21Grouped_tab.png[21Grouped_tab.png,title="21Grouped_tab.png"] - -[[quick-create]] -Quick Create -^^^^^^^^^^^^ - -You can click the 'create' icon in the top navigation menu to access the -Quick Create options. This is a list of commonly used modules with the -ability to create new records within these modules from any location. - -image:22Quick_create.png[22Quick_create.png,title="22Quick_create.png"] - -[[sidebar]] -Sidebar -^^^^^^^ - -The sidebar is part of the responsive theme and is a user configurable -option. The sidebar can be expanded and collapsed by clicking on the -button highlighted below. - -image:23Sidebar.png[23Sidebar.png,title="23Sidebar.png"] - -*Actions* - -This displays the Actions for the module you are currently viewing. For -example, if you are viewing the Accounts module, the actions that -display are: Create Account, View Accounts, Import Accounts. This -provides you with one-click access to module actions. - -*Recently Viewed* - -This section displays the last 10 records you have viewed. This leaves a -breadcrumbs trail so that previously viewed records can be quickly and -easily accessed via the sidebar. There is also the option to click the -pencil icon, which will take you directly to the Edit View of the -record. - -[[home-page]] -Home Page -~~~~~~~~~ - -The home page is the first page that is displayed to you -post-authentication. The home page has various elements that can be used -and configured such as Dashlets, Dashboards and the Sidebar. - -[[dashlets]] -Dashlets -^^^^^^^^ - -Dashlets are user-configurable sections displayed on the home page that -give you a quick overview of your records and activity immediately after -login. This is particularly useful for sales and support led teams as -this reduces the number of clicks required to view/modify data. - -Dashlets can be dragged/dropped within the home page. You can add -dashlets by clicking the 'Add Dashlets' link on the home page. - -image:24Add_dashlets.png[24Add_dashlets.png,title="24Add_dashlets.png"] - -Clicking on the 'Add Dashlets' link on the home page will open up the -Add Dashlets popup which allows users to select from a multitude of out -of the box dashlets. - -image:25Add_dashlets.png[25Add_dashlets.png,title="25Add_dashlets.png"] - -To add one of the dashlets, simply click on the dashlet link. This will -add the dashlet to the user home page. The popup will remain if you add -a dashlet, to allow users to add multiple dashlets. Once you have added -your required dashlets, you can close the popup. - -image:26Dashlet.png[26Dashlet.png,title="26Dashlet.png"] - -You can modify dashlets by clicking the pencil icon on the desired -dashlet. - -image:27Modify_dashlet.png[27Modify_dashlet.png,title="27Modify_dashlet.png"] - -Clicking the pencil icon will display a popup. This popup will contain -all of the options that are configurable for the dashlet. - -image:28Configure_dashlet.png[28Configure_dashlet.png,title="28Configure_dashlet.png"] - -Once you have made the required changes in the dashlet configuration -popup, you can click 'Save' to apply the changes, or cancel if you wish -to revert to the current configuration. - -_Note: Some dashlets require the home page to be reloaded. For dashlets -that require this, you will be notified._ - -[[dashboards]] -Dashboards -^^^^^^^^^^ - -Dashboards are new in SuiteCRM. These are configurable per user and can -be added/removed similar to dashlets. To add a dashboard tab, you can -click the 'Add Tab' link on the homepage. - -image:29Add_tab.png[29Add_tab.png,title="29Add_tab.png"] - -Clicking on the 'Add Tab' link on the home page will open up the Add Tab -popup which allows users to specify a name for the tab and also how many -dashlet columns are required. You can opt for one, two or three columns. - -image:192Add_tab.png[192Add_tab.png,title="192Add_tab.png"] - -Once you have specified the details for the dashboard tab, you can click -'Save'. You can also click 'Cancel' to undo any changes. Once you have -saved your changes, the Dashboard Tab will be added and will display on -the tab list on user Homepage. You can then add Dashlets to your new -dashboard tab. - -image:31New_tab.png[31New_tab.png,title="31New_tab.png"] - -If you wish to delete the dashboard tab, you can click the 'x' icon. -This will prompt you to confirm the deletion and then subsequently -remove the dashboard tab from your profile only. Note: 'Suite Dashboard' -is the standard dashboard tab which cannot be removed. You can however -configure the dashlets that display on that dashboard tab. - -[[activity-stream]] -Activity Stream -^^^^^^^^^^^^^^^ - -The Activity Stream is an excellent way of keeping track of your -colleague's interactions with SuiteCRM. By default the Activity Stream -displays recent updates for the Opportunities, Contacts, Leads and Cases -modules. Your organisation's Facebook and Twitter feeds can also be -included in your Activity Steam dashlets if desired and this can be -configurable by an Admin user. - -image:32Activity_stream.png[32Activity_stream.png,title="32Activity_stream.png"] - -You can also comment about an update within the Activity Stream by -clicking on the Reply button on the right side of the post. - -image:33Reply.png[33Reply.png,title="33Reply.png"] - -Your posts can also be deleted from the Activity Stream by clicking on -the Delete button. - -image:34Delet3.png[34Delet3.png,title="34Delet3.png"] - -Your comment will appear under the original post and will also be -timestamped. - -The Activity Stream is also a useful tool for internal messaging within -your organisation, it is possible to send a message that will be -broadcast to all users in your network. To do this type your message in -the text field and click post. - -image:35Activity_post.png[35Activity_post.png,title="35Activity_post.png"] - -Your colleagues will see this message and will be able to respond by -clicking on the Reply button on the right side of the post. - -image:36Reply.png[36Reply.png,title="36Reply.png"] - -Their response will appear under your post, again with a timestamp. - -image:37Reply_view.png[37Reply_view.png,title="37Reply_view.png"] - -[[search]] -Search -~~~~~~ - -Searching is a vital aspect within the CRM as this allows you to quickly -define what it is you want to see. Many CRM's will have large data sets -so it is vital to you that you have a way to refine your search. In the -following sub-sections we will cover the various searching options -available to you. - -[[global-search]] -Global Search -^^^^^^^^^^^^^ - -You can search all records within the CRM using the global search -functionality. You can search for records via global search by using the -search bar in the main navigation menu. - -image:38Search.png[38Search.png,title="38Search.png"] - -Once you have entered your search term, you can press the return key or -click the magnifying glass/search icon. This will return records that -match the search criteria and categorise them by the modules available. - -image:39Search.png[39Search.png,title="39Search.png"] - -Modules can be added to the global search functionality by the System -Administrator. - -[[full-text-search]] -Full Text Search -^^^^^^^^^^^^^^^^ - -SuiteCRM has an option to enable or disable a full text global search. -The full text global search is powered by -http://framework.zend.com/manual/1.12/en/zend.search.lucene.overview.html[Zend -Lucene] search framework. The search works very similar to the standard -global search, but provides the enhanced functionality of searching text -in documents and other files, compared to the record-level search -provided by the standard global search. - -_Note: System Administrators can enable/disable the full text search by -clicking on the AOD Settings link within the admin panel._ - -image:169AOD_Settings.png[169AOD_Settings.png,title="169AOD_Settings.png"] - -This will display the AOD option to enable/disable the full text search. - -image:170Enable_AOD.png[170Enable_AOD.png,title="170Enable_AOD.png"] - -The search returns results slightly different to global search. Results -are returned in order of score. Records are scored dependent on how well -you match the search criteria provided by you – from 0-100%. - -image:171Search_results.png[171Search_results.png,title="171Search_results.png"] - -[[basic-module-search]] -Basic Module Search -^^^^^^^^^^^^^^^^^^^ - -Basic search is available on all modules within the CRM. Basic search, -as standard, allows users to search on the record name. - -image:193Search_button.png[193Search_button.png,title="193Search_button.png"] - -image:194Search_box.png[194Search_box.png,title="fig:194Search_box.png"]]] - -Basic search also allows users to check the 'My Items' check box. -Enabling this option will only return records that are assigned to you. - -image:195Search_my_items.png[195Search_my_items.png,title="195Search_my_items.png"] - -Once a user has searched for a record, the search will be saved. This -means that you can navigate to records and other modules within the CRM -but the search will not be cleared. If you wish to clear your search, -you can click 'Clear' and then click 'Search'. This will clear any saved -searches and return to the default result set for that module. - -_Note: System Administrators can modify which fields are searchable in -Basic Search within Studio._ - -[[advanced-module-search]] -Advanced Module Search -^^^^^^^^^^^^^^^^^^^^^^ - -Advanced Search is available on all modules within the CRM. Advanced -Search provides you with a more detailed module search functionality. As -standard, there are more fields available to you via Advanced Search. - -image:196Advanced_search.png[196Advanced_search.png,title="196Advanced_search.png"] - -You can add further fields to the Advanced Search section by expanding -the 'Layout Options' panel. - -image:image43.png[image43.png,title="image43.png"] - -You can click the field you wish to display/hide and click the arrows to -move these fields between sections. This allows users to display/hide -columns to further customise the Advanced Search section. - -Advanced Searches may have many fields and specific criteria. For this -reason, You can save your advanced search criteria to easily populate -this in future. - -image:197Save_search.png[197Save_search.png,title="197Save_search.png"] - -To load a saved search, you can select the saved search from the 'My -Filters' drop down. This will return results that match the criteria -specified in the saved search. - -image:198Saved_search.png[198Saved_search.png,title="198Saved_search.png"] - -_Note: System Administrators can modify which fields are searchable in -Advanced Search within Studio._ - -[[views]] -Views -~~~~~ - -Within the CRM you will be presented with various views. These views are -structured to present you with key information through the record -management process. There are three main views: - -* List View -* Detail View -* Edit View - -All of these views have specific purposes and these are described in the -sub-sections below. - -[[list-view]] -List View -^^^^^^^^^ - -This is the view that you are presented with when you navigate to your -desired module. - -image:40List_view.png[40List_view.png,title="40List_view.png"] - -The List View compromises of many actions that you can carry out to -manage records. These are: - -* Search Records – provides you with the ability to perform basic and -advanced searches, as covered previously in the link:#Search[Search] -section of this chapter. -* Sort Records – clicking on the column name will sort the record list -by that column either ascending or descending, if sorting is enabled. -* View Records – clicking on any hyperlinked data will take you to the -Detail View of the record. -* Edit Records – clicking the pencil icon will navigate you to the Edit -View for that record. -* Delete Records – you can select records and then select the delete -option to delete records from the module. -* Mass Update Records – you can select records and then select the mass -update option to update data on all selected records. -* Merge Records – you can select records and select the merge option. -This will begin the merge records processes. You can select a primary -record and then can merge the data from the duplicate records into the -primary record. Once saved, the duplicate records will be deleted and -all data/history merged to the primary record. - -[[detail-view]] -Detail View -^^^^^^^^^^^ - -This is the view that you are presented with when you view a record. - -image:41Detail_view.png[41Detail_view.png,title="41Detail_view.png"] - -The Detail View compromises of many actions that you can use to -view/manage your data. These are specific to the Detail View of the -module that you are viewing. There are standard actions on the Detail -View for most modules. These are: - -* Edit – allows you to edit the record you are viewing. -* Duplicate – allows you to duplicate the record the are viewing. -* Delete – allows you to delete the record you are viewing. If a record -is deleted, you will be redirected to the List View. -* Find Duplicates – allows you to begin the find duplicates process -where you can use system functionality to find duplicate records. -* View Change Log – allows you to view changes to audited fields. - -_Note: To set fields as audited and for any changes to find duplicates, -contact your System Administrator._ - -Hyperlinked fields can be clicked on. This will navigate you to that -record. - -The Detail View is tabbed in SuiteCRM. This means there is minimal -scrolling and data is categorised for each module in the appropriate -tab. - -_Note: System Administrators can select to display data in either tabs -or panels. You can contact your system administrator for more -information on managing layouts and views._ - -[[edit-view]] -Edit View -^^^^^^^^^ - -This is the view that you are presented with when you edit a record. - -image:42Edit_view.png[42Edit_view.png,title="42Edit_view.png"] - -The Edit View allows you to modify record information that is displayed -on the view. This allows users to update existing data and also -add/remove data. Once you have made changes on the Edit View, you can -click 'Save' to apply to changes or click 'Cancel'. Clicking either -options will redirect you to the Detail View of the record you are -editing. You can click the 'View Change Log' button. This allows users -to view changes to audited fields which can be useful before making your -intended changes. - -[[record-management]] -Record Management -~~~~~~~~~~~~~~~~~ - -We have covered the several views that you are presented with so we will -now move onto record management. In this section we will cover all areas -of record management so that you can efficiently store and manage -customer data. - -[[creating-records]] -Creating Records -^^^^^^^^^^^^^^^^ - -You can create records within modules from various different areas of -your Interface. Detailed below are screen shots of record creation -points. - -image:43Create_record1.png[43Create_record1.png,title="43Create_record1.png"] - -image:44Create_record2.png[44Create_record2.png,title="44Create_record2.png"] - -image:45Create_record_3.png[45Create_record_3.png,title="45Create_record_3.png"] - -Once you click the create button, you will be taken to the creation -screen. This is essentially the Edit View that we have covered -previously in the link:#User_Interface[User Interface] section. This -allows you to fill in the appropriate data for that record. Fields with -the red star(*) are required fields. Validation is performed so that a -record cannot be saved within the CRM unless data is valid for required -fields. - -image:46Create_contact.png[46Create_contact.png,title="46Create_contact.png"] - -Once you have populated all data for the record, you can save the record -which will create the record within the module in the CRM. Once saved, -you will be redirected to the Detail View of the record you have -created. - -[[editing-records]] -Editing Records -^^^^^^^^^^^^^^^ - -You can edit records within modules from various different areas of your -Interface. Detailed below are screen shots of record editing points. - -image:47Edit_contact.png[47Edit_contact.png,title="47Edit_contact.png"] - -image:48Edit_contact.png[48Edit_contact.png,title="48Edit_contact.png"] - -Once you click the edit button(or pencil), you will be taken to the Edit -View. This allows you to edit/populate the appropriate data for that -record. Fields with the red star(*) are required fields. Validation is -performed so that a record cannot be saved within the CRM unless data is -valid for required fields. - -Once you have edited/populated the record data, you can save the record -which will update the existing record with the new data populated when -editing. Once saved, you will be redirected to the Detail View of the -record you have edited. - -[[deleting-records]] -Deleting Records -^^^^^^^^^^^^^^^^ - -You can delete records within modules from both the List View and Detail -View. Detailed below are screen shots of record editing points: - -*Detail View Deletion method* - -Deleting records from the Detail View is a simple process. You simply -have to click the 'Delete' button. - -image:49Delete_contact.png[49Delete_contact.png,title="49Delete_contact.png"] - -When you click the delete button on a record, you will receive a popup -which will ask you to confirm that you want to delete the record. - -image:50Delete_contact.png[50Delete_contact.png,title="50Delete_contact.png"] - -You can either click Cancel or OK. Clicking Cancel will revert you back -to the Detail View of the record and will not delete it. Clicking OK -will action the record deletion. If you choose to delete the record, the -record will be deleted and you will be redirected to the module List -View. - -*List View Deletion method* - -To delete records from the List View, you can select records using the -checkbox option on the left hand side of the view. It is possible to -select single records or use the 'Select this Page' or 'Select All' -options, to select all records from the page or all records within the -module. - -image:51ListView_deletion.png[51ListView_deletion.png,title="51ListView_deletion.png"] - -Once the records are selected to delete, you can click the 'Delete' -button. When you click the delete button on a record, you will receive a -popup which will display the number of records being deleted and ask you -to confirm that you want to delete the record. - -image:image59.png[image59.png,title="image59.png"] - -You can either click Cancel or OK. Clicking Cancel will revert you back -to the Detail View of the record and will not delete it. Clicking OK -will action the record deletion. If you choose to delete the record, the -record will be deleted and you will be redirected to the module List -View. - -[[mass-updating-records]] -Mass Updating Records -^^^^^^^^^^^^^^^^^^^^^ - -You can mass update records from the List View of any module, given this -option is made available to you. To mass update records, you have to -check the records in the List View and then select the 'Mass Update' -option from the dropdown menu (next to the delete link). - -image:52Mass_update_records.png[52Mass_update_records.png,title="52Mass_update_records.png"] - -Clicking the mass update option will display a screen at the bottom of -the List View. This will list all fields that can be mass updated by -you. - -image:53Mass_update.png[53Mass_update.png,title="53Mass_update.png"] - -Once you have populated the fields you wish to mass update, you can -either click 'Update' or 'Cancel'. Cancelling the mass update will -cancel any changes and redirect you to the List View of the module. -Clicking update will update all selected records with the changes -specified in the link:#Mass_Updating_Records[Mass Updating Records] -section. - -image:54Mass_update.png[54Mass_update.png,title="54Mass_update.png"] - -[[merging-records]] -Merging Records -^^^^^^^^^^^^^^^ - -You can merge records from the List View of any module, given this -option is made available to you, or via the Detail View if you follow -the 'Find Duplicates' process. - -To merge records, you have to check the records in the List View and -then select the 'Merge' option from the dropdown menu (next to the -delete link). - -image:55Merge.png[55Merge.png,title="55Merge.png"] - -Once you have clicked on the 'Merge' option, you will be presented with -a merge screen. This will show the primary record and the duplicates -that you wish to merge with that primary record. - -image:182Merging_records.png[182Merging_records.png,title="182Merging_records.png"] - -You can select which record is primary using the 'Set as primary' button -on the right of the merge view. You can move data from the duplicate -records to the primary record using the '<<' buttons. In this example, -we have moved the First Name and Last Name from the duplicate record to -the primary record. - -image:183Merging_records.png[183Merging_records.png,title="183Merging_records.png"] - -Once you have made the required changes on the merge screen, you can -click 'Save Merge' or 'Cancel'. Clicking cancel will discard the merge -changes and will revert you to the List View for that module. Clicking -'Save Merge' will continue the Merge process and will prompt you to -inform you that the duplicate record will be deleted. - -image:184Save_merge.png[184Save_merge.png,title="184Save_merge.png"] - -You can click 'OK' or 'Cancel'. Clicking Cancel will discard the merge -changes and will revert you to the List View for that module. Clicking -'OK' will save the merge and will redirect you to the Detail View for -the merged record. - -image:185Saved_merge.png[185Saved_merge.png,title="185Saved_merge.png"] - -As can be seen from the example, the merge has completed successfully. -The First Name and Last Name have been updated, and all other data has -been retained. - -[[importing-records]] -Importing Records -^^^^^^^^^^^^^^^^^ - -It is possible to import data easily by using SuiteCRM's easy-to-use -User Import Wizard. There are many hints and tips as you progress -through the Import Wizard on the requirements of importing data and for -further steps in the Wizard. - -*User Import Wizard features* - -There are many features of the Import Wizard which make it easier for -you to map data to CRM fields and also for future imports. These are: - -* Sample .csv file for easier import of data — Use the available sample -.csv file as a template for import of files -* Retain settings from previous imports — Save/preserve import file -properties, mappings, and duplicate check indexes from previous imports -for ease of current data import process -* Ability to accept both database name and display labels of drop-down -and multi-select field items — Field labels as well as database names -are accepted and mapped during import, but only the field labels are -displayed for ease of use -* Ability to accept both usernames and full names in user fields during -import and export of data — Full names of Users displayed for Assigned -To and other User-related fields in exported .csv file for easier -identification of user records -* Ability to auto-detect file properties in import file — Upload import -files without specifying file properties such as tab, comma, double and -single quotes, date and time formats, making the process simpler and -faster -* Ability to import contacts from external sources such as Google — -Ability to import Google Contacts for person-type modules such as -Contacts, Leads, and Targets, relate SuiteCRM records to Google -Contacts, and communicate with Google Contacts from within SuiteCRM - -*Steps to Import data* - -_Note: Always import the Account data first and then import Contacts and -other data related to Accounts (such as Meetings, Calls, Notes) to -automatically create a relationship between the imported Account and -Contacts and activity records related to the Account._ - -Follow the steps listed below to import data for a module, such as -Accounts: - -1. Select Import from the Actions drop-down list in the module menu -options. -2. This displays Step 1 of the import process with a link to a sample -Import File Template. -3. Upload your import file to this page using the Browse button in the -Select File field or, -4. Optionally, download the available template, delete the existing -data, input your data and upload to this page using the Browse button. -5. Click Next. -6. This displays Step 2 (Confirm Import File Properties). -7. Auto-detection of imported data takes place at this step. -8. Click View Import File Properties button to verify and change the -data as needed, if you notice irregularities in the Confirm Import File -Properties table. -9. Click the Hide Import File Properties to collapse the panel. -10. Click Next. -11. This displays Step 3: Confirm Field Mappings. -12. The table in this page displays all the fields in the module that -can be mapped to the data in the import file. If the file contains a -header row, the columns in the file map to matching fields. -13. Check for correct mapping and modify if necessary. -14. Map to all of the required fields (indicated by an asterisk). -15. Click Next. -16. This displays Step 4: Check for Possible Duplicates. -17. Follow the instructions on this page. -18. Step 4 also provides the option of saving the current import file -properties, mappings, and duplicate check indexes for future imports. -19. (Optionally) Save the import settings. -20. Click Import Now. -21. Click the Errors tab to check for errors in the process. Follow the -instructions to fix problems (if any) and Click Import Again. -22. This displays Step 1 of the import process. -23. Follow all the steps in the wizard through Step 5. -24. If the import was successful, you can to view all the imported -records at Step 5. -25. Click Undo Import if you are not satisfied with the imported -records, -26. Or, click Import Again to import more data -27. Or, click Exit to navigate to the List View page of the module that -you imported your records into. - -[[exporting-records]] -Exporting Records -^^^^^^^^^^^^^^^^^ - -You can export SuiteCRM records in .csv format. When you exports records -from the CRM, you will be provided with the .csv file to download when -the export has finished executing. You can save and open this file in -applications such as Libre Office Calc or Microsoft Office Excel. - -The .csv file displays in a tabular format with columns and rows. When -data is exported from the CRM, the record ID is included with all other -fields that are specified in the export list for that module. You can -then use the record ID as a reference for performing a 'Create new -records and update existing records' import, as detailed in the -link:#Importing_Records[Importing Records] section of the user guide. - -_Note: When exporting values from drop-down lists, SuiteCRM exports the -ID associated with each option and not the display labels. For example, -if a drop down list has options labelled High, Medium and Low with an ID -of 1, 2 and 3 – the .csv file will show the drop down options as 1, 2 or -3._ - -*Steps to Export Records* - -1. Select the records from the List View on the module's home page. -2. Select Export from the Actions drop-down menu in the List View. -3. To export all records listed on the page, click Select located above -the item list and select one of the following options: -4. This Page. To export all the records listed on the page, select this -option. -5. All Records. To export all records on the list (if it is more than a -page long), select this option. -6. This displays an Opening.csv dialog box. -7. Select Open to open the export file in .csv format or select Save to -Disk to save the .csv file to your local machine. -8. Click OK to execute the operation. If you chose to open the file, -the csv file opens in Microsoft Excel. -9. The file contains all the fields in the module from which you are -exporting the data. - -[[in-line-editing]] -In-line Editing -~~~~~~~~~~~~~~~ - -In-line editing gives you the ability to change values “on the fly”. -In-line editing has been implemented on both List View and Detail View, -providing an advantage to users wishing to change field values quickly, -reducing the number of clicks/processes that would normally be taken to -edit the full record. - -_Note: In-line editing can be enabled/disabled for both List View and -Detail View. This can be done in the main System Settings for the CRM, -by the System Administrator._ - -image:186In-line_editing.png[186In-line_editing.png,title="186In-line_editing.png"] - -[[list-view-in-line-editing]] -List View In-line Editing -^^^^^^^^^^^^^^^^^^^^^^^^^ - -You can edit record information on the List View of a module using -in-line editing by clicking on a field where the pencil icon is shown. - -image:60ListView_editing.png[60ListView_editing.png,title="60ListView_editing.png"] - -You can either click on the pencil icon, or double click on the field to -edit the value. - -image:61ListView_editing.png[61ListView_editing.png,title="61ListView_editing.png"] - -Once you have made the required change to the field value, you can -either press Return or click on the 'tick'. This will save your changes. -If you navigate away without making any changes, you will see a prompt -warning you that you have made unsaved changes to the field being -edited. - -image:image71.png[image71.png,title="image71.png"] - -You can either click cancel and continue editing and saving your change, -or you can click OK which will discard the changes made. - -[[detail-view-in-line-editing]] -Detail View In-line Editing -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Similar to List View, you can edit record information on the Detail View -of a module using in-line editing by clicking on a field where the -pencil icon is shown. - -image:62DetailView_Editing.png[62DetailView_Editing.png,title="62DetailView_Editing.png"] - -You can either click on the pencil icon, or double click on the field to -edit the value. - -image:63DetailView_editing.png[63DetailView_editing.png,title="63DetailView_editing.png"] - -Once you have made the required change to the field value, you can -either press Return or click on the 'tick'. This will save user changes. -If you navigate away without making any changes, you will see a prompt -warning you that you have made unsaved changes to the field being -edited. - -image:image74.png[image74.png,title="image74.png"] - -You can either click cancel and continue editing and saving your change, -or you can click OK which will discard the changes made. - -[[desktop-notifications]] -Desktop Notifications -~~~~~~~~~~~~~~~~~~~~~ - -[[enabling-desktop-notifications]] -Enabling Desktop Notifications -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You can enable desktop notifications by accessing the 'Advanced' tab -within your user preferences. This will enable desktop notifications -only for that browser on that computer. you can choose to enable the -desktop notifications just for that browser session, or to always enable -desktop notifications. - -_Note: Users will have to enable desktop notifications on all browsers -and computers if you use more than one._ - -image:199Enable_desktop_notifications.png[199Enable_desktop_notifications.png,title="199Enable_desktop_notifications.png"] - -Once desktop notifications have been enabled, users will receive -notifications for any Calendar events such as: - -* Meetings – Meetings you have been invited to that have popup reminders -set. -* Calls – Calls you have been invited to that have popup reminders set. - -[[managing-desktop-notifications]] -Managing Desktop Notifications -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -If you have no notifications, the notification count will show '0' to -tell you you currently have no notifications to check. - -image:65Managing_notifications.png[65Managing_notifications.png,title="65Managing_notifications.png"] - -If you do not click on a desktop notification when it is displayed in -the browser, for example you are AFK(Away From Keyboard) your -notifications will be added to the notification list which shows as a -count on the main navigation bar. - -image:66Managing_notifications.png[66Managing_notifications.png,title="66Managing_notifications.png"] - -You can manage your desktop notifications by clicking the icon which -will show any existing notifications. - -image:67Managing_notifications.png[67Managing_notifications.png,title="67Managing_notifications.png"] - -You can either click the notification which will take you to the record -the notification is related to or you can click the small 'x' icon to -clear you immediately. - -[[summary-3]] -Summary -~~~~~~~ - -In this chapter, we covered all elements of the SuiteCRM user interface. -There are many elements which you can use to optimise your navigation -and data management, to increase productivity. - -In the next chapter, we will look at modules. Modules are the data -entities within SuiteCRM which can be standalone, or related to one or -many other modules. Each module has a different function but many -modules work together to structure and automate day to day business -processes. - -[[core-modules]] -Core Modules ------------- - -[[accounts]] -Accounts -~~~~~~~~ - -The Accounts module is the centralised base from which you can create an -association with most records in SuiteCRM. It is possible to create a -relationship with Contacts, Converted Leads, Opportunities, any Activity -such as Emails or Meetings and Cases. Accounts in SuiteCRM will -typically hold all information specific to a company that your -organisation will have a relationship with. In real world terms an -Account may be a business entity that is a qualified Sales Prospect, -Customer, Supplier or Re-seller and can be used to track all -interactions that take place between these entities and your -organisation. - -[[accounts-actions]] -Accounts Actions -^^^^^^^^^^^^^^^^ - -You can access the accounts actions from the Accounts module menu drop -down or via the Sidebar. The Accounts actions are as follows: - -* Create Account – Once clicked, a new form is opened in Edit View to -allow you to create a new Account record. -* View Accounts – Once clicked, you will be redirected to the List View -for the Accounts module. This allows you to search and list Accounts -records. -* Import Accounts – Redirects you to the Import Wizard for the Accounts -module. For more information, see link:#Importing_Records[Importing -Records]. - -To view the full list of fields available when creating an Account, See -link:#Accounts_Field_List[Accounts Field List]. - -[[managing-accounts]] -Managing Accounts -^^^^^^^^^^^^^^^^^ - -* To sort records on the Accounts List View, click any column title -which is sortable. This will sort the column either ascending or -descending. -* To search for a Account, see the link:#Search[Search] section of this -user guide. -* To update some or all the Accounts on the List View, use the Mass -Update panel as described in the link:#Mass_Updating_Records[Mass -Updating Records] section of this user guide. -* To duplicate a Account, you can click the Duplicate button on the -Detail View and then save the duplicate record. -* To merge duplicate Accounts, select the records from the Accounts List -View, click the Merge link in the Actions drop-down list, and progress -through the merge process. For more information on Merging Duplicates, -see the link:#Merging_Records[Merging Records] section of this user -guide. -* To delete one or multiple Accounts, you can select multiple records -from the List View and click delete. you can also delete a Account from -the Detail View by clicking the Delete button. For a more detailed guide -on deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Account, click the Account Name in the List -View. This will open the record in Detail View. -* To edit the Account details, click Edit icon within the List View or -click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Accounts, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Account record, you can -click the View Change Log button on the Account's Detail View or Edit -View. - -[[contacts]] -Contacts -~~~~~~~~ - -In SuiteCRM a Contact is an individual who is typically associated with -an Account (organisation) or Opportunity (qualified prospect). For -example if Techco is the Account, then John Smith, Sales Manager of -Techco is the Contact. This module holds all information relating to -these individuals and also provides a vantage point for any history -relating to a Contact record, for example if they were involved in a -Meeting, raised a Case or sent an Email. - -[[contacts-actions]] -Contacts Actions -^^^^^^^^^^^^^^^^ - -You can access the Contacts actions from the Contacts module menu drop -down or via the Sidebar. The Contacts actions are as follows: - -* Create Contact – A new form is opened in Edit View to allow you to -create a new Contact record. -* View Contacts – Redirects you to the List View for the Contacts -module. This allows you to search and list Contact records. -* Import Contacts – Redirects you to the Import Wizard for the Contacts -module. For more information, see link:#Importing_Records[Importing -Records]. - -To view the full list of fields available when creating an Contact, See -link:#Contacts_Field_List[ Contacts Field List]. - -[[managing-contacts]] -Managing Contacts -^^^^^^^^^^^^^^^^^ - -* To sort records on the Contacts List View, click any column title -which is sortable. This will sort the column either ascending or -descending. -* To search for a Contact, see the link:#Search[Search] section of this -user guide. -* To update some or all the Contacts on the List View, use the Mass -Update panel as described in the link:#Mass_Updating_Records[Mass -Updating Records] section of this user guide. -* To duplicate a Contact, you can click the Duplicate button on the -Detail View and then save the duplicate record. -* To merge duplicate Contacts, select the records from the Contacts List -View, click the Merge link in the Actions drop-down list, and progress -through the merge process. For more information on Merging Duplicates, -see the link:#Merging_Records[Merging Records] section of this user -guide. -* To delete one or multiple Contacts, you can select multiple records -from the List View and click delete. You can also delete a Contact from -the Detail View by clicking the Delete button. For a more detailed guide -on deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Contact, click the Contact Name in the List -View. This will open the record in Detail View. -* To edit the Contact details, click Edit icon within the List View or -click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Contacts, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Contact record, you can -click the View Change Log button on the Contact's Detail View or Edit -View. - -[[opportunities]] -Opportunities -~~~~~~~~~~~~~ - -An Opportunity is a qualified Sales prospect with a likely chance that -they will be able to do business with your company. You have established -that they have buying power and have entered into the buying cycle. This -module allows you to track your Opportunities throughout the Sales -Pipeline until the deal is 'Closed Lost or 'Closed Won'. - -[[opportunities-actions]] -Opportunities Actions -^^^^^^^^^^^^^^^^^^^^^ - -You can access the Opportunities actions from the Opportunities module -menu drop down or via the Sidebar. The Opportunities actions are as -follows: - -* Create Opportunity – A new form is opened in Edit View to allow you to -create a new Account record. -* View Opportunities – Redirects you to the List View for the -Opportunities module. This allows you to search and list Opportunity -records. -* Import Opportunities – Redirects you to the Import Wizard for the -Opportunities module. For more information, see -link:#Importing_Records[Importing Records]. - -To view the full list of fields available when creating an Opportunity, -See link:#Opportunities_Field_List[Opportunities Field List]. - -[[managing-opportunities]] -Managing Opportunities -^^^^^^^^^^^^^^^^^^^^^^ - -* To sort records on the Opportunities List View, click any column title -which is sortable. This will sort the column either ascending or -descending. -* To search for a Opportunity, see the link:#Search[Search] section of -this user guide. -* To update some or all the Opportunities on the List View, use the Mass -Update panel as described in the link:#Mass_Updating_Records[Mass -Updating Records] section of this user guide. -* To duplicate a Opportunity, you can click the Duplicate button on the -Detail View and then save the duplicate record. -* To merge duplicate Opportunities, select the records from the -Opportunities List View, click the Merge link in the Actions drop-down -list, and progress through the merge process. For more information on -Merging Duplicates, see the link:#Merging_Records[Merging Records] -section of this user guide. -* To delete one or multiple Opportunities, you can select multiple -records from the List View and click delete. You can also delete a -Opportunity from the Detail View by clicking the delete button. For a -more detailed guide on deleting records, see the -link:#Deleting_Records[Deleting Records] section of this user guide. -* To view the details of a Opportunity, click the Opportunity Name in -the List View. This will open the record in Detail View. -* To edit the Opportunity details, click the Edit icon within the List -View or click the edit button on the Detail View, make the necessary -changes, and click Save. -* For a detailed guide on importing and exporting Opportunities, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Opportunity record, you -can click the View Change Log button on the Opportunities Detail View or -Edit View. - -[[leads]] -Leads -~~~~~ - -In SuiteCRM a Lead is an unqualified contact usually generated from some -form of marketing related event, for example it could be a person that -has filled out a form on your website or someone that you met at a trade -show and you are not sure yet if they have buying authority. Once a Lead -is qualified and converted then it can be split into three parts; a -Contact once you have established 'Who' it is, an Account when you know -'Where' they work and an Opportunity once it is known 'What' they might -buy. - -[[leads-actions]] -Leads Actions -^^^^^^^^^^^^^ - -You can access the Leads actions from the Leads module menu drop down or -via the Sidebar. The Leads actions are as follows: - -* Create Lead – A new form is opened in Edit View to allow you to create -a new Account record. -* View Leads – Redirects you to the List View for the Leads module. This -allows you to search and list Lead records. -* Import Leads – Redirects you to the Import Wizard for the Leads -module. For more information, see link:#Importing_Records[Importing -Records]. - -To view the full list of fields available when creating a Lead, See -link:#Leads_Field_List[Leads Field List]. - -[[managing-leads]] -Managing Leads -^^^^^^^^^^^^^^ - -* To sort records on the Leads List View, click any column title which -is sortable. This will sort the column either ascending or descending. -* To search for a Leads, see the link:#Search[Search] section of this -user guide. -* To update some or all the Leads on the List View, use the Mass Update -panel as described in the link:#Mass_Updating_Records[Mass Updating -Records] section of this user guide. -* To duplicate a Lead, you can click the Duplicate button on the Detail -View and then save the duplicate record. -* To merge duplicate Leads, select the records from the Leads List View, -click the Merge link in the Actions drop-down list, and progress through -the merge process. For more information on Merging Duplicates, see the -link:#Merging_Records[Merging Records] section of this user guide. -* To delete one or multiple Leads, you can select multiple records from -the List View and click delete. you can also delete a Lead from the -Detail View by clicking the Delete button. For a more detailed guide on -deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Lead, click the Lead Name in the List View. -This will open the record in Detail View. -* To edit the Lead details, click Edit icon within the List View or -click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Leads, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Lead record, you can -click the View Change Log button on the Lead Detail View or Edit View. - -[[converting-a-lead]] -Converting a Lead -^^^^^^^^^^^^^^^^^ - -Once enough information is gathered about a Lead, then the Lead can be -progressed to the next Sales stage and the Lead can be converted into a -Contact, Account and Opportunity. The way in which a Lead is converted -depends on how the System Administrator has set up SuiteCRM. To convert -a Lead with the default SuiteCRM setup you have to click on an -individual Lead record to access the Detail View of the Lead and click -on the arrow next to the Other button, then click on 'Convert Lead' from -the drop-down menu shown in the image below: - -image:68Converting_a_lead.png[68Converting_a_lead.png,title="68Converting_a_lead.png"] - -Once you have clicked on 'Convert Lead' button then you will be taken to -the Convert Lead page. - -[[convert-lead-to-contact]] -Convert Lead to Contact -^^^^^^^^^^^^^^^^^^^^^^^ - -On this page you will be able to Create or Select Contact: - -image:69Convert_lead_to_contact.png[69Convert_lead_to_contact.png,title="69Convert_lead_to_contact.png"] - -By deselecting the checkbox next to 'Create Contact' you will be able to -associate the Lead to an existing Contact. However, in most cases when -converting a Lead there will be no existing Contact. Make sure the -Create Contact checkbox is selected. Some of the fields will -automatically be populated using the Lead information. Fill out the -remaining relevant fields and move to the next Stage below: - -[[convert-lead-to-account]] -Convert Lead to Account -^^^^^^^^^^^^^^^^^^^^^^^ - -image:70Convert_lead_to_account.png[70Convert_lead_to_account.png,title="70Convert_lead_to_account.png"] - -To create an Account from a converted Lead you will follow the same -process as with a Contact, some information will populate from the Lead -automatically, just complete the rest. - -[[convert-lead-to-opportunity]] -Convert Lead to Opportunity -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -image:71Convert_lead_to_opportunity.png[71Convert_lead_to_opportunity.png,title="71Convert_lead_to_opportunity.png"] - -To create an Opportunity from a converted Lead you will follow the same -process as with a Contact, some information will populate from the Lead -automatically, just complete the rest. - -[[other-lead-conversion-options]] -Other Lead Conversion Options -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Other records can be created when converting a Lead in the same way as -Contacts/Accounts and Opportunities. - -image:72Convert_lead_options.png[72Convert_lead_options.png,title="72Convert_lead_options.png"] - -After you have completed the relevant sections click the Save button to -confirm the changes. - -[[duplicate-record-check]] -Duplicate Record Check -^^^^^^^^^^^^^^^^^^^^^^ - -When converting a Lead SuiteCRM will automatically check for any -duplicate records and will return a warning if a matching record is -found. - -image:73Duplicate_record_check.png[73Duplicate_record_check.png,title="73Duplicate_record_check.png"] - -If you find that the duplicate warning is not valid and you still wish -to create a new record, then click the Create button. Otherwise if you -decide that the warning is correct and the record does already exist in -the CRM then you should click on the Select button. - -[[calendar]] -Calendar -~~~~~~~~ - -The Calendar module in SuiteCRM allows you to manage your time by -scheduling Meetings, Calls and Tasks. Users may share their Calendar so -they can allow others to view their upcoming activities. These -activities will be displayed in the Calendar module given that the User -concerned is a participant or the task has been assigned to them. - -[[calendar-actions]] -Calendar Actions -^^^^^^^^^^^^^^^^ - -You can access the Calendar actions from the Calendar module menu drop -down or via the Sidebar. The Calendar actions are as follows: - -* Schedule Meetings – A new form is opened in the Edit View of the -Meetings module to allow you to create a new Meeting record. This record -will display on the Calendar. -* Schedule Calls – A new form is opened in the Edit View of the Call -module to allow you to create a new Call record. This record will -display on the Calendar. -* Create Task – A new form is opened in the Edit View of the Tasks -module to allow you to create a new Task record. This record will -display on the Calendar. -* Today – Redirects you to the Day format of the Calendar for the -current day. - -[[calls]] -Calls -~~~~~ - -The Calls module in SuiteCRM allows Users to schedule and log a record -of inbound and outbound calls that they may be a participant of. - -[[calls-actions]] -Calls Actions -^^^^^^^^^^^^^ - -You can access the Calls actions from the Calls module menu drop down or -via the Sidebar. The Calls actions are as follows: - -* Log Call – A new form is opened in Edit View to allow you to create a -new Call record. -* View Calls – Redirects you to the List View for the Calls module. This -allows you to search and list Call records. -* Import Calls – Redirects you to the Import Wizard for the Calls -module. For more information, see link:#Importing_Records[Importing -Records]. - -To view the full list of fields available when logging a Call, See -link:#Calls_Field_List[Calls Field List]. - -[[managing-calls]] -Managing Calls -^^^^^^^^^^^^^^ - -* To sort records on the Calls List View, click any column title which -is sortable. This will sort the column either ascending or descending. -* To search for a Call, see the link:#Search[Search] section of this -user guide. -* To update some or all of the Calls on the List View, use the Mass -Update panel as described in the link:#Mass_Updating_Records[Mass -Updating Records] section of this user guide. -* To duplicate a Call, you can click the Duplicate button on the Detail -View and then save the duplicate record. -* To close a Call, click on the 'x' icon on the Calls List View. You can -also close a Call by clicking the Close button on the Detail View of a -Call. You can also click the Close and Create New button. This will -close the Call you are viewing and redirect you to the Edit View to -create a new record. -* To Reschedule a call, you can click the Reschedule button on the -Detail View of a Call. For a detailed guide on rescheduling calls, see -the link:#Reschedule[Reschedule] section of this user guide. -* To delete one or multiple Calls, you can select multiple records from -the List View and click delete. You can also delete a Call from the -Detail View by clicking the Delete button. For a more detailed guide on -deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Call, click the Call Subject in the List -View. This will open the record in Detail View. -* To edit the Call details, click Edit icon within the List View or -click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Calls, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Call record, you can -click the View Change Log button on the Call Detail View or Edit View. - -[[meetings]] -Meetings -~~~~~~~~ - -Like the Calls module, the Meetings module in SuiteCRM allows Users to -create a record of any Meeting that they have been involved in. The -Meeting scheduler allows a User to invite attendees, email invitees, set -reminders, reschedule and relate to other modules including an Account, -Contact, Project and many other Objects. This module has many more -helpful functions that assist the User to plan and organise their -Meetings. - -[[meetings-actions]] -Meetings Actions -^^^^^^^^^^^^^^^^ - -You can access the Meetings actions from the Meetings module menu drop -down or via the Sidebar. The Meetings actions are as follows: - -* Schedule Meeting – A new form is opened in Edit View to allow you to -create a new Meeting record. -* View Meetings – Redirects you to the List View for the Meetings -module. This allows you to search and list Meeting records. -* Import Meetings – Redirects you to the Import Wizard for the Meetings -module. For more information, see link:#Importing_Records[Importing -Records]. - -To view the full list of fields available when creating scheduling a -Meeting, See link:#Meetings_Field_List[Meetings Field List]. - -[[managing-meetings]] -Managing Meetings -^^^^^^^^^^^^^^^^^ - -* To sort records on the Meetings List View, click any column title -which is sortable. This will sort the column either ascending or -descending. -* To search for a Meeting, see the link:#Search[Search] section of this -user guide. -* To update some or all of the Meetings on the List View, use the Mass -Update panel as described in the link:#Mass_Updating_Records[Mass -Updating Records] section of this user guide. -* To duplicate a Meeting, you can click the Duplicate button on the -Detail View and then save the duplicate record. -* To close a Meeting, click on the 'x' icon on the Meetings List View. -You can also close a Meeting by clicking the Close button on the Detail -View of a Meeting. You can also click the Close and Create New button. -This will close the Meeting you are viewing and redirect you to the Edit -View to create a new record. -* To Reschedule a Meeting, you can click the Reschedule button on the -Detail View of a Meeting. For a detailed guide on rescheduling Meetings, -see the link:#Reschedule[Reschedule] section of this user guide. -* To delete one or multiple Meetings, you can select multiple records -from the List View and click delete. You can also delete a Meeting from -the Detail View by clicking the Delete button. For a more detailed guide -on deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Meeting, click the Meeting Subject in the -List View. This will open the record in Detail View. -* To edit the Meeting details, click the Edit icon within the List View -or click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Meeting, see the -Import and Export link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Meeting record, you can -click the View Change Log button on the Meeting's Detail View or Edit -View. - -[[emails]] -Emails -~~~~~~ - -The Emails module in SuiteCRM allows Users to view, store, compose, send -and receive email from their own personal Email account or a shared -inbox, for example a Support or Sales inbox. Emails can be related to -Accounts, Cases, Contacts and many more records in the CRM. - -[[emails-actions]] -Emails Actions -^^^^^^^^^^^^^^ - -You can access the Emails actions from the Emails module menu drop down -or via the Sidebar. The Emails actions are as follows: - -* View My Email – Redirects you to your mailbox so that you can view and -manage emails displayed/imported to the CRM. -* Create Email Template - A WYSIWYG editor where you can create Emails -by dragging and dropping components, inserting variables and amending -the plain text. -* View Email Templates - Takes you to the List View page of your -existing Email Templates. This allows you to search and list Email -Template records. - -To view the full list of fields available for the Emails module, See -link:#Emails_Field_List[Emails Field List]. - -[[tasks]] -Tasks -~~~~~ - -SuiteCRM can assist Users with productivity, offering a way to record, -relate and assign Tasks and to-do items that require action. - -[[tasks-actions]] -Tasks Actions -^^^^^^^^^^^^^ - -You can access the Tasks actions from the Tasks module menu drop down or -via the Sidebar. The Tasks actions are as follows: - -* Create Task – A new form is opened in Edit View to allow you to create -a new Task record. -* View Tasks – Redirects you to the List View for the Tasks module. This -allows you to search and list Task records. -* Import Tasks – Redirects you to the Import Wizard for the Tasks -module. For more information, see link:#Importing_Records[Importing -Records]. - -To view the full list of fields available when creating a Task, See -link:#Tasks_Field_List[Tasks Field List]. - -[[managing-tasks]] -Managing Tasks -^^^^^^^^^^^^^^ - -* To sort records on the Tasks List View, click any column title which -is sortable. This will sort the column either ascending or descending. -* To search for a Task, see the link:#Search[Search] section of this -user guide. -* To update some or all of the Task on the List View, use the Mass -Update panel as described in the link:#Mass_Updating_Records[Mass -Updating Records] section of this user guide. -* To duplicate a Task, you can click the Duplicate button on the Detail -View and then save the duplicate record. -* To close a Task, click on the 'x' icon on the Tasks List View. You can -also close a Meeting by clicking the Close button on the Detail View of -a Task. You can also click the Close and Create New button. This will -close the Task you are viewing and redirect you to the Edit View to -create a new record. -* To delete one or multiple Tasks, you can select multiple records from -the List View and click delete. You can also delete a Task from the -Detail View by clicking the Delete button. For a more detailed guide on -deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Task, click the Meeting Subject in the List -View. This will open the record in Detail View. -* To edit the Task details, click Edit icon within the List View or -click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Tasks, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Task record, you can -click the View Change Log button on the Task's Detail View or Edit View. - -[[notes]] -Notes -~~~~~ - -The Notes module in SuiteCRM can be used to keep a record of any -comments, observations or explanations that a User may have relating -internally to their organisation or relating to another SuiteCRM record -such as an Account, Contact, Lead or many more. Notes are also used to -keep record of interactions with Customers regarding Cases and Bugs. - -[[notes-actions]] -Notes Actions -^^^^^^^^^^^^^ - -You can access the Notes actions from the Notes module menu drop down or -via the Sidebar. The Notes actions are as follows: - -* Create Note or Attachment – A new form is opened in Edit View to allow -you to create a new Note record (with attachment). -* View Notes – Redirects you to the List View for the Notes module. This -allows you to search and list Note records. -* Import Notes – Redirects you will be taken to the Import Wizard for -the Notes module. For more information, see -link:#Importing_Records[Importing Records]. - -To view the full list of fields available when creating a Note, See -link:#Notes_Field_List[Notes Field List]. - -[[managing-notes]] -Managing Notes -^^^^^^^^^^^^^^ - -* To sort records on the Notes List View, click any column title which -is sortable. This will sort the column either ascending or descending. -* To search for a Note, see the link:#Search[Search] section of this -user guide. -* To update some or all the Notes on the List View, use the Mass Update -panel as described in the link:#Mass_Updating_Records[Mass Updating -Records] section of this user guide. -* To duplicate a Note, you can click the Duplicate button on the Detail -View and then save the duplicate record. -* To delete one or multiple Notes, you can select multiple records from -the List View and click delete. You can also delete a Note from the -Detail View by clicking the Delete button. For a more detailed guide on -deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Note, click the Note Subject in the List -View. This will open the record in Detail View. -* To edit the Note details, click Edit icon within the List View or -click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Notes, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Note record, you can -click the View Change Log button on the Note's Detail View or Edit View. - -[[documents]] -Documents -~~~~~~~~~ - -The Documents module can be used as a repository for Customer issued or -internal files. This content can be uploaded, revised and viewed in -addition to relating to individual records within SuiteCRM. - -[[documents-actions]] -Documents Actions -^^^^^^^^^^^^^^^^^ - -You can access the Documents actions from the Documents module menu drop -down or via the Sidebar. The Documents actions are as follows: - -* Create Document – A new form is opened in Edit View to allow you to -create a new Document record. -* View Documents – Redirects you to the List View for the Documents -module. This allows you to search and list Document records. - -To view the full list of fields available when creating a Document, See -link:#Documents_Field_List[Documents Field List]. - -[[managing-documents]] -Managing Documents -^^^^^^^^^^^^^^^^^^ - -* To sort records on the Documents List View, click any column title -which is sortable. This will sort the column either ascending or -descending. -* To search for a Document, see the link:#Search[Search] section of this -user guide. -* To update some or all the Documents on the List View, use the Mass -Update panel as described in the link:#Mass_Updating_Records[Mass -Updating Records] section of this user guide. -* To duplicate a Document, you can click the Duplicate button on the -Detail View and then save the duplicate record. -* To delete one or multiple Documents, you can select multiple records -from the List View and click delete. You can also delete a Document from -the Detail View by clicking the Delete button. For a more detailed guide -on deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Document, click the Document Name in the List -View. This will open the record in Detail View. -* To view an attachment, click the attachment link on the List View or -Detail View of the Document. To update a document, you can create a -Document Revision. -* To edit the Document details, click Edit icon within the List View or -click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Documents, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Document record, you -can click the View Change Log button on the Document's Detail View or -Edit View. - -[[document-revisions]] -Document Revisions -^^^^^^^^^^^^^^^^^^ - -[[targets]] -Targets -~~~~~~~ - -Typically Targets are used as the recipients of a Marketing Campaign, -your organisation knows very little about these individuals and they may -be re-used for new Campaigns or deleted without any impact to the -business. Your organisation will spend little resources on Targets and -will usually be contacted en masse. Targets can be acquired from -purchased email lists or gathered from trade shows your organisation has -been present. The Targets module in SuiteCRM is used to store and manage -information about these individuals. - -[[targets-actions]] -Targets Actions -^^^^^^^^^^^^^^^ - -You can access the Targets actions from the Targets module menu drop -down or via the Sidebar. The Targets actions are as follows: - -* Create Target – A new form is opened in Edit View to allow you to -create a new Target record. -* View Targets – Redirects you to the List View for the Targets module. -This allows you to search and list Target records. -* Import Targets – Redirects you will be taken to the Import Wizard for -the Targets module. For more information, see -link:#Importing_Records[Importing Records]. - -To view the full list of fields available when creating a Target, See -link:#Targets_Field_List[Targets Field List]. - -[[managing-targets]] -Managing Targets -^^^^^^^^^^^^^^^^ - -* To sort records on the Targets List View, click any column title which -is sortable. This will sort the column either ascending or descending. -* To search for a Target, see the link:#Search[Search] section of this -user guide. -* To update some or all the Targets on the List View, use the Mass -Update panel as described in the link:#Mass_Updating_Records[Mass -Updating Records] section of this user guide. -* To duplicate a Target, you can click the Duplicate button on the -Detail View and then save the duplicate record. -* To delete one or multiple Targets, you can select multiple records -from the List View and click delete. You can also delete a Target from -the Detail View by clicking the Delete button. For a more detailed guide -on deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Target, click the Target Name in the List -View. This will open the record in Detail View. -* To edit the Target details, click Edit icon within the List View or -click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Targets, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Target record, you can -click the View Change Log button on the Target's Detail View or Edit -View. - -[[target-lists]] -Target Lists -~~~~~~~~~~~~ - -The Target Lists module in SuiteCRM is used to separate Targets into -groups, these can be groups of individuals that should be excluded from -a particular Campaign, test groups or a list of Targets grouped by -certain criteria, for example area or market an organisation works in. - -[[target-lists-actions]] -Target Lists Actions -^^^^^^^^^^^^^^^^^^^^ - -You can access the Target Lists actions from the Target Lists module -menu drop down or via the Sidebar. The Target Lists actions are as -follows: - -* Create Target List – A new form is opened in Edit View to allow you to -create a new Target List record. -* View Target Lists – Redirects you to the List View for the Target -Lists module. This allows you to search and list Target List records. - -To view the full list of fields available when creating a Target List, -See link:#Target_Lists_Field_List[Target Lists Field List]. - -[[managing-target-lists]] -Managing Target Lists -^^^^^^^^^^^^^^^^^^^^^ - -* To sort records on the Target List List View, click any column title -which is sortable. This will sort the column either ascending or -descending. -* To search for a Target List, see the link:#Search[Search] section of -this user guide. -* To update some or all the Target Lists on the List View, use the Mass -Update panel as described in the link:#Mass_Updating_Records[Mass -Updating Records] section of this user guide. -* To duplicate a Target List, you can click the Duplicate button on the -Detail View and then save the duplicate record. -* To delete one or multiple Target Lists, you can select multiple -records from the List View and click delete. You can also delete a -Target List from the Detail View by clicking the Delete button. For a -more detailed guide on deleting records, see the -link:#Deleting_Records[Deleting Records] section of this user guide. -* To view the details of a Target List, click the Target List Name in -the List View. This will open the record in Detail View. -* To edit the Target List details, click Edit icon within the List View -or click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Target Lists, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Target List, you can -click the View Change Log button on the Target List's Detail View or -Edit View. - -[[campaigns]] -Campaigns -~~~~~~~~~ - -The Campaigns module in SuiteCRM can be a very powerful marketing and -advertising tool for your organisation allowing you to create and track -Newsletter, Email and non-email Campaigns to prospective or existing -customers. With the tracking tools built into the Campaign module you -can monitor the response you receive from your Campaign in real time, -allowing you to view the return on investment (ROI) and many other -useful metrics. This in turn helps you to plan your strategic marketing -and advertising activities effectively by visualising which Campaigns -work and which do not. - -[[campaign-actions]] -Campaign Actions -^^^^^^^^^^^^^^^^ - -You can access the Campaign actions from the Campaign module menu drop -down or via the Sidebar. The Campaign actions are as follows: - -* Create Campaign – This takes you to the Campaign Wizard page. -* View Campaigns – Redirects you to the List View for the Campaign -module. This allows you to search and list Campaign records. -* Create Email Template – A WYSIWYG editor where you can create emails -by dragging and dropping components, inserting variables and amending -the plain text. -* View Email Templates – Takes you to the List View page of your -existing Email Templates. This allows you to search and list Email -Template records. -* View Diagnostics – Allows you to check that your Campaign Emails and -Campaign schedulers are set up correctly. If this is the case then a -green tick icon will appear, if there are any issues with the setup then -a red cross icon will appear and you should contact your Admin for -assistance. -* Create Person Form – A web form template Wizard allowing you to create -Leads, Contacts and Targets. -* To view the full list of fields available when creating a Campaign, -See link:#Campaign_Fields_List[Campaign Fields List]. - -[[creating-a-campaign-via-campaign-wizard]] -Creating a Campaign via Campaign Wizard -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -To create a Campaign and to begin the Campaign Wizard click on the -Create Campaign button on the sidebar or module menu drop down while in -the Campaign module. - -image:74Creating_a_campaign.png[74Creating_a_campaign.png,title="74Creating_a_campaign.png"] - -Alternatively click on the Create button at the top right of the screen -when in the List View of the View Campaigns page. Once you click Create -Campaign then you will be presented with three options, Newsletter, -Email and Non-email based Campaign. - -image:75Creating_a_campaign.png[75Creating_a_campaign.png,title="75Creating_a_campaign.png"] - -[[campaign-wizard-header-and-budget]] -Campaign Wizard Header and Budget -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -On clicking your selected Campaign icon you will be taken to the first -page of the Campaign Wizard, the Campaign Header page. In this page you -will be prompted to complete the required fields of Name and Status as -well as having the opportunity to record any information you may wish to -about your Campaign Budget (Campaign Budget is on a separate page for -Non-email based Campaigns). - -image:76Creating_a_campaign.png[76Creating_a_campaign.png,title="76Creating_a_campaign.png"] - -Once you have completed the necessary fields and are ready to progress -to the next stage then click Next. - -image:77Creating_a_campaign.png[77Creating_a_campaign.png,title="77Creating_a_campaign.png"] - -[[campaign-wizard-subscriptions-newsletter-campaigns-only]] -Campaign Wizard Subscriptions – Newsletter Campaigns Only -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -For a Newsletter Campaign the next step of the Campaign Wizard allows -you to specify your Subscription information. - -image:78Newsletter_campaign.png[78Newsletter_campaign.png,title="78Newsletter_campaign.png"] - -This stage is made up of three components; the Subscription List, -Unsubscription List and Test List. - -* The Subscription List - Allows you to set a Target List for your -Campaign. This Target List will be used to send out emails for this -Campaign. If you have not already created a Target List then an empty -list will be created for you and you can set this at a later time. -* The Unsubscription List - Allows you to set a Target List of -individuals who have opted out of your marketing and should not be -contacted through email. If you have not already created a Target List -then an empty list will be created for you and you can set this at a -later time. -* The Test List - Allows you to set a Target List to send out test -emails for this Campaign. If you have not already created a Target List -then an empty list will be created for you and you can set this at a -later time. - -Once you have completed the necessary fields then click Next and you -will be taken to the Templates page which the next stage of the Campaign -Wizard. - -[[campaign-wizard-target-lists-email-and-non-email-based-campaigns]] -Campaign Wizard Target Lists – Email and Non-Email Based Campaigns -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -For all Email and non-email based Campaign the next step of the Campaign -Wizard allows you to specify your Target Lists. For Email based -Campaigns this is where you would choose a list of people to Email based -on Existing Targets already created in the CRM. Or for Telesales -(non-email based) Campaigns for example this could be a list of people -that you would call. - -image:79E-mail_campaign.png[79E-mail_campaign.png,title="79E-mail_campaign.png"] - -Recipients that have previously opted out of your marketing Campaigns -will automatically be removed from your Target List. - -image:80E-mail_campaign.png[80E-mail_campaign.png,title="80E-mail_campaign.png"] - -If you have not at this stage created a Target List you can create an -empty one using the dropdown menu in the image above and populate it -after you have completed the rest of your Campaign setup by visiting the -link:#Target_Lists[Target Lists] page. The next step for non-email based -Campaigns is the link:#Campaign_Summary[Campaign Summary] page, Email -based Campaigns however should move onto the Campaign Templates page. - -[[campaign-wizard-templates]] -Campaign Wizard Templates -^^^^^^^^^^^^^^^^^^^^^^^^^ - -image:81Campaign_template.png[81Campaign_template.png,title="81Campaign_template.png"] - -This page is a WYSIWYG Newsletter Template editor so you can create a -template for your marketing emails. - -image:82Campaign_template.png[82Campaign_template.png,title="82Campaign_template.png"] - -The panel at the top presents you with three options which allows you to -select an existing template, create a brand new template or copy an -existing template. - -* Select an existing template – You can select from a drop down list of -existing Email Templates -* Create a brand new template – If you wish to start the Newsletter from -scratch then you can select this option. -* Copy an existing template – Allows you select an existing template and -use this as a base to make amendments - -Once you have chosen an Email Template you can decide you want to insert -a Tracker URL. This can be used to insert a link to your organisation's -website or direct link to a new product that you have launched. Also, -you are given the opportunity to place an 'Opt Out' link in your -template. - -image:83Campaign_template.png[83Campaign_template.png,title="83Campaign_template.png"] - -Please note that the 'Opt Out' link is added to the template -automatically even if you do not insert one at this point. Another -interesting feature of the Email Templates page is the ability to -personalise your templates by inserting variables. You can for example -insert the 'Account ID' variable in the subject line, or even insert the -addressee's first name and last name to add a more personal touch. - -image:84Campaign_template.png[84Campaign_template.png,title="84Campaign_template.png"] - -The WYSIWYG editor is displayed at the bottom of the Email Template -page, this editor allows you to visualise how your template will -actually look. - -image:85Campaign_template.png[85Campaign_template.png,title="85Campaign_template.png"] - -The panel on the left side of the editor allows you to drag and drop -different layout components to your template. These then can be edited -in the right side display panel. Once you have inserted a component into -the display panel you can click on the added item and the editor menu -will appear. - -image:Email_Template_Editor.png[Email_Template_Editor.png,title="Email_Template_Editor.png"] - -This menu provides you with a multitude of additional options which -allows you to customise the layout and appearance of your template. Font -type can be selected, formatted, colours changed, text alignment chosen, -images and even videos can be inserted. - -Insert HTML by clicking Tools > Source Code - -The bottom panel offers the option to include attachments with your -Email Template, this could be used if for example you wished to attach a -something like a product catalogue to your Newsletter. Once you are -satisfied with your Email Template you can click Next and you will be -taken to the Marketing page which is the next stage of the Campaign -Wizard. - -[[campaign-wizard-marketing]] -Campaign Wizard Marketing -^^^^^^^^^^^^^^^^^^^^^^^^^ - -image:87Campaign_marketing.png[87Campaign_marketing.png,title="87Campaign_marketing.png"] - -This section of the Campaign Wizard allows you to specify the Email -settings for your Campaign including the Bounce Handling Account, -Outgoing Email Account, From/Reply-to Name and Address. In addition to -this, you can Schedule your Campaign by completing the Date and Time -fields. Once you are satisfied with your Email Settings and Schedule you -can click Next and you will be taken to the Summary page which is the -final stage of the Campaign Wizard. - -[[campaign-wizard-summary]] -Campaign Wizard Summary -^^^^^^^^^^^^^^^^^^^^^^^ - -image:Newsletter_Summary_Review.png[Newsletter_Summary_Review.png,title="Newsletter_Summary_Review.png"] - -The Summary page includes a checklist which indicates that each page of -the Campaign Wizard has been completed satisfactorily. If a section is -complete then this is shown with green tick icon, otherwise this will be -highlighted with a red cross icon. If any section has not been completed -then SuiteCRM will not permit the Campaign to be sent. In this instance -in the image shown above the 'Choose Targets' section has not been -completed correctly as indicated by the red cross icon. This would be -resolved by clicking back to the Target List page and specifying a -Subscription List with at least one entry. Once you have ensured all -sections are complete then you can choose one of three options: - -* Send Mail at Scheduled Time – You can click this once you are sure all -sections of the Campaign are set correctly and are confident that it is -the finished article. -* Send Marketing Email as Test – This option gives you the opportunity -to send out your Campaign to your Test List that you specified in the -Subscriptions section of the Campaign Wizard. By doing this you can view -the Campaign as a recipient and double check that the Campaign appears -as it should do before sending out to real prospective/live customers. -* View Details – By clicking this option you are taken to the Detail -View of the Campaign record you have just created through the Newsletter -Campaign Wizard. - -[[create-person-form]] -Create Person Form -^^^^^^^^^^^^^^^^^^ - -Another feature of the Campaign module is the web form template Wizard -allowing you to create Leads, Contacts and Targets. This can be accessed -by clicking on the Create Person Form button from the dropdown menu in -the Campaign module or via the sidebar when in the module. - -image:88Create_person_form.png[88Create_person_form.png,title="88Create_person_form.png"] - -Once you have clicked this, you will be taken to the first page of the -Create Person Form Wizard. - -image:89Create_person_form.png[89Create_person_form.png,title="89Create_person_form.png"] - -This stage allows you to specify the type of person you would like to -create via your web form. The dropdown menu allows you to choose from a -Lead, Contact or Target. On selecting the person type you would like to -create the Available Fields dynamically change. Once you have chosen -this you can drag and drop the fields you would like to include on your -web form. Fields dropped into the First Form Column area are displayed -on the left side of your web form and the fields dropped into the Second -Form Column area are displayed on the right side of your web form. You -can choose to have 1 or 2 columns, all on the left side, right side or -on both sides. Please note as a minimum you need to include the required -fields included in your web form as indicated by an asterisk. Once you -are satisfied with the fields you wish to include click the Next button -to progress to the next stage. - -[[create-person-form-additional-information]] -Create Person Form – Additional Information -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -image:90Createperson_form.png[90Createperson_form.png,title="90Createperson_form.png"] - -On this page you can configure your web form appearance by adding a Form -Header/Footer, Form Description, change the label on the Submit button -or change how the URL is displayed. As a minimum you have to relate the -web form to an existing Campaign and assign to a User before clicking -the Generate Form button to progress to the next stage. - -[[create-person-form-editor]] -Create Person Form – Editor -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -image:91Createperson_form.png[91Createperson_form.png,title="91Createperson_form.png"] - -The final step of the Create Person Form Wizard allows you to format the -web form you have setup by using the WYSIWYG editor. This editor -provides you with a multitude of additional options which allows you to -customise the layout and appearance of your web form. Font type can be -selected, formatted, colours changed, text alignment chosen and images -can be inserted. Once you are happy with the appearance of your web form -click Save Web Form. On clicking this button you can either click on the -link to download the web form you have just created or copy and paste -the html to an existing document. By clicking the download link this -will save the html form in your download folder. - -image:92Createperson_form.png[92Createperson_form.png,title="92Createperson_form.png"] - -Please note that the web form will not be stored anywhere else on the -CRM, to ensure the html is saved please carry out one of the two steps -above. - -[[campaign-response-tracking]] -Campaign Response Tracking -^^^^^^^^^^^^^^^^^^^^^^^^^^ - -When in the Detail View of a Campaign record you can access the inbuilt -Campaign response tracking by clicking the View Status button. - -image:93View_status.png[93View_status.png,title="93View_status.png"] - -On clicking this button you will be taken to the Status page for that -Campaign record. This page gives an overview of the Campaign details as -well as a graphical representation of your Campaign response including -the number of messages sent, bounced messages, how many viewers, opt -outs and how many clicked through links. - -image:93Campaign_response.png[93Campaign_response.png,title="93Campaign_response.png"] - -These fields are expanded further down the page and detailed on an -individual record level. These records can be added to a new Target List -by clicking the Add to Target List button. This allows you to create -new, more focussed Campaigns based on who has responded. - -image:94Campaign_response.png[94Campaign_response.png,title="94Campaign_response.png"] - -[[campaign-roi-tracking]] -Campaign ROI Tracking -^^^^^^^^^^^^^^^^^^^^^ - -When in the Detail View of a Campaign record you can access the inbuilt -Campaign ROI tracking by clicking the View ROI button. - -image:95Campaign_tracking.png[95Campaign_tracking.png,title="95Campaign_tracking.png"] - -On clicking this button you will be taken to the ROI page for that -Campaign record. This page gives a graphical representation of your -Campaign Return on Investment, allowing you to easily visualise how your -organisation's money spent on the Campaign has translated into potential -business. - -image:Campaign_ROI_Graph.png[Campaign_ROI_Graph.png,title="Campaign_ROI_Graph.png"] - -[[cases]] -Cases -~~~~~ - -In SuiteCRM Cases are used to record interactions with Customers when -they ask for help or advice, for example in a Sales or Support function. -A Case can be created, updated when a User is working on it, assigned to -a colleague and closed when resolved. At each stage of the Case the User -can track and update the incoming and outgoing conversation thread so a -clear record of what has occurred is registered in the CRM. Cases can be -related to individual records such as Accounts, Contacts and Bugs. - -[[cases-actions]] -Cases Actions -^^^^^^^^^^^^^ - -You can access the Cases actions from the Cases module menu drop down or -via the Sidebar. The Cases actions are as follows: - -* Create Case – A new form is opened in Edit View to allow you to create -a new Account record. -* View Cases – Redirects you to the List View for the Cases module. This -allows you to search and list Case records. -* Import Cases – Redirects you will be taken to the Import Wizard for -the Cases module. For more information, see -link:#Importing_Records[Importing Records]. - -To view the full list of fields available when creating a Case, See -link:#Cases_Field_List[Cases Field List]. - -Advanced functionality for Cases can be found in the -link:#Advanced_Open_Cases_with_Portal[Advanced Cases] section of this -User Guide. - -[[managing-cases]] -Managing Cases -^^^^^^^^^^^^^^ - -* To sort records on the Cases List View, click any column title which -is sortable. This will sort the column either ascending or descending. -* To search for a Case, see the link:#Search[Search] section of this -user guide. -* To update some or all the Cases on the List View, use the Mass Update -panel as described in the link:#Mass_Updating_Records[Mass Updating -Records] section of this user guide. -* To duplicate a Case, you can click the Duplicate button on the Detail -View and then save the duplicate record. -* To merge duplicate Cases, select the records from the Cases List View, -click the Merge link in the Actions drop-down list, and progress through -the merge process. For more information on Merging Duplicates, see the -link:#Merging_Records[Merging Records] section of this user guide. -* To delete one or multiple Cases, you can select multiple records from -the List View and click delete. You can also delete a Case from the -Detail View by clicking the Delete button. For a more detailed guide on -deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Cases, click the Case Subject in the List -View. This will open the record in Detail View. -* To edit the Case details, click Edit icon within the List View or -click the edit button on the Detail View, make the necessary changes, -and click Save. -* For a detailed guide on importing and exporting Cases, see the -link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Case record, you can -click the View Change Log button on the Case's Detail View or Edit View. - -[[projects]] -Projects -~~~~~~~~ - -In SuiteCRM the Projects module allows the User to arrange their -organisation's projects by tracking a number of Tasks and allocating -resources. Once set up, a project can be visualised in the form of a -Gantt chart or using the project grid. - -[[projects-actions]] -Projects Actions -^^^^^^^^^^^^^^^^ - -You can access the Projects actions from the Projects module menu drop -down or via the Sidebar once you have clicked to view the module. The -Projects actions are as follows: - -* Create Project – A new form is opened in Edit View to allow you to -create a new Project record. -* View Project – Redirects you to the List View for the Projects module. -This allows you to search and list Project records. -* View Project Tasks – Allows you to list Project Tasks, which are -related to a parent Project. -* Import Project – Redirects you to the Import Wizard for the Projects -module. For more information, see link:#Importing_Records[Importing -Records]. - -To view the full list of fields available when creating a Project, See -link:#Projects_Field_List[Projects Field List]. - -[[creating-projects]] -Creating Projects -^^^^^^^^^^^^^^^^^ - -In the Projects module, you can create, manage, and duplicate Projects -and Project Tasks. - -You can define multiple Project Tasks for each Project. When you create -a Project Task, you must associate it with a Project. You can associate -a Project with multiple activities, Accounts, Opportunities, and Cases. -You can also create Projects and Project Tasks from an Email’s detail -page. - -. In the Actions bar, click Create Project. -. On the Projects page, enter information for the following fields: -.. Name. Enter a name for the Project. -.. Status. From the drop-down list, select the Project status such as -Draft, In Review, or Published. -.. Start Date. Click the Calendar icon and select the Project start -date. -.. End Date. Click the Calendar icon and select the Project end date. -.. Assigned to. Enter the name of you who has ownership of the Project. -By default, it is assigned to you. -.. Priority. From the drop-down list, select the importance of the -Project such as Low, Medium, or High. -.. Description. Enter a brief description of the Project. -. Click Save to create the Project; click Cancel to exit the page -without creating the Project. - -When you save the Project, the Project’s detail page displays on the -page. - -From this page, you can relate the Project to records such as Contacts -and Opportunities. - -[[creating-project-tasks]] -Creating Project Tasks -^^^^^^^^^^^^^^^^^^^^^^ - -. In the Project Tasks sub-panel, click Create. -. On the Project Tasks page, enter information for the following -fields: -.. Name. Enter a name for the task. -.. Task ID. Enter a numerical value as the task identification number. -.. Start Date. Click the Calendar icon and select the date when the -task is due to begin. -.. Finish Date. Click the Calendar icon and select a date when the task -is due to be completed; enter the start time in the adjoining field. -.. Percentage Complete. Enter a numerical value to indicate what -percentage of the task has been completed. -.. Priority. From the drop-down list, select a priority level that -reflects the importance of completing this task. -.. Milestone. Check this box if the completion on this task is -considered a milestone for project completion. -.. Project Name. Click Select and choose the project associated with -the task. -.. Description. Enter a brief description of the task. -. Click Save to create the task; click Cancel to return to the project -detail page without creating the task. - -[[managing-projects-and-project-tasks]] -Managing Projects and Project Tasks -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -* To sort the List View on the Projects and Project Tasks list view, -click any column title which is sortable. This will sort the column -either ascending or descending. -* To search for a Project or Project task, see the link:#Search[Search] -section of this user guide. -* To update some or all the Projects or Project Tasks on the List View, -use the Mass Update panel as described in the -link:#Mass_Updating_Records[Mass Updating Records] section of this user -guide. -* To duplicate a Project, you can click the Duplicate button on the -Detail View and then save the duplicate record. -* To delete one or multiple Projects, you can select multiple records -from the List View and click delete. You can also delete a Project from -the Detail View by clicking the Delete button. For a more detailed guide -on deleting records, see the link:#Deleting_Records[Deleting Records] -section of this user guide. -* To view the details of a Project or Project Task, click the Project or -Project Task Name in the List View. This will open the record in Detail -View. -* To edit the Project or Project Task details, click Edit icon within -the List View or click the edit button on the Detail View, make the -necessary changes, and click Save. -* For a detailed guide on importing and exporting Projects and Project -Tasks, see the link:#Importing_Records[Importing Records] and -link:#Exporting_Records[Exporting Records] sections of this user guide. -* To track all changes to audited fields, in the Project or Project Task -record, you can click the View Change Log button on the Project's or -Project Task's Detail View or Edit View. - -[[summary-4]] -Summary -~~~~~~~ - -In this chapter we have covered the functionality of the core modules. -These modules allow the user to define and refine sales processes, with -the ability to record data in detail within the required module. - -In the next chapter, we will cover the advanced modules within SuiteCRM. -These modules allow the user to manage further sales processes, create -automated workflows, design reports and more. - -[[advanced-modules]] -Advanced Modules ----------------- - -By now, you should have a fundamental understanding of the SuiteCRM user -interface, basic modules, layouts, creating, searching and managing -records. - -The next section of this User Guide covers in detail the Advanced CRM -modules. SuiteCRM has Advanced CRM modules which allow Users to further -enhance your Sales Force Automation Capabilities and improve business -processes. - -[[advanced-open-sales]] -Advanced Open Sales -~~~~~~~~~~~~~~~~~~~ - -The first 'Suite' of advanced modules is AOS(Advanced Open Sales). The -various modules that are part of the AOS suite of modules allow you to -manage the Post-Opportunity Sales processes such as Quoting, Invoicing -and recurring Contracting. This functionality is made available to you -through the following modules: - -* Product Categories -* Products -* PDF Templates -* Quotations -* Invoices -* Contracts - -[[aos-settings]] -AOS Settings -^^^^^^^^^^^^ - -System Administrator users can alter the settings for AOS using the AOS -Settings page under the Advanced OpenSales panel within the Admin Panel. - -image:172AOS_Settings.png[172AOS_Settings.png,title="172AOS_Settings.png"] - -You can customise the following settings within the AOS Settings: - -* Renewal Reminder Period – This defines how many days before the -Contract End Date that a reminder call should be created. -* Initial Invoice Number – Allows users to set the initial invoice -number. For example 20001. -* Initial Quote Number – Allows users to set the initial quote number. -For example 456. -* Enable Line Items Groups – If selected then users will be able to -bundle line items into groups. If this is not selected then you will not -be able to use the AOS Group functionality. _Note: This setting should -be selected before using AOS – It is difficult to migrate from/to groups -once Quotes/Invoices have been created._ -* Add Tax to Line Total – If this is selected then the Tax will be added -into the Line Total on Line Items. If this is not the selected the Line -Total will not include Tax. - -image:173AOS_settings_edit.png[173AOS_settings_edit.png,title="173AOS_settings_edit.png"] - -Once configured, click 'Save' to apply your AOS Settings. - -[[products-module]] -Products Module -^^^^^^^^^^^^^^^ - -You can create Product records using the Products module. Creating -products allows users to select product lines when preparing Quotes -using AOS. The products module allows users to specify the Products -Name, Part Number, Category and Type. Additional fields for Products can -be added using Studio. - -image:174Products_module.png[174Products_module.png,title="174Products_module.png"] - -The module also allows users to define a Cost and Price for the product. -Price is the selling price which will be used in the quoting process. A -related Contact can be associated to the product. This is the point of -contact with the supplier concerning this product. If you have an Image -of the product then this can be uploaded within the products record. A -URL to the products page on your website can also be specified. - -[[products-categories-module]] -Products Categories Module -^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The Product Categories module allows Users to structure Products into a -hierarchical category structure. To create a Product Category record, -navigate to the Product Categories module and click the 'Create Product -Categories' button in the action bar. - -image:175Product_category.png[175Product_category.png,title="175Product_category.png"] - -The Parent Category field is a relationship field to another Product -Categories record. If you check the 'Is Parent Category' field then this -signifies that the category is the highest level. Once selected you will -not be able to select a Parent Category using the relate field. - -[[pdf-templates]] -PDF Templates -^^^^^^^^^^^^^ - -*Creating Templates* - -AOS allows users to generate PDF documents and merge data from SuiteCRM -modules. You must however create a PDF template first. - -image:176PDF_template.png[176PDF_template.png,title="176PDF_template.png"] - -This module provides a WYSIWYG interface to create dynamic PDF -templates. You must select a Type. This is the module you are building -the PDF Template for. By default the modules you can select are: Quotes -Invoices Accounts Contacts Leads - -System Administrator users can extend this list by editing the -'pdf_template_type_dom' using the drop down editor functionality. Please -note that the drop down 'Item Name' must be the name of the module -directory. - -To insert fields into the Body of the template users will first select a -module. This will be the either the same module as the Type or a related -module to the Type module. This is selected using the first drop down on -the Insert Fields row. - -image:177PDF_template_field.png[177PDF_template_field.png,title="177PDF_template_field.png"] - -This will populate the second drop down with all the fields found within -that module. Once you have selected the field you wish to insert, the -text field will populate with the field variable name. Click 'Insert' to -place this field into the Body of the template. If the Active check box -is selected then users will be able to generate PDFs from this template. -If it is not selected you will not. - -*Loading Samples* - -image:178PDF_template_field.png[178PDF_template_field.png,title="178PDF_template_field.png"] - -AOS comes with seven pre-defined PDF templates to help you create your -own. These can be loaded by selecting the appropriate template from the -Load Sample drop down list. - -image:image86.png[image86.png,title="image86.png"] - -*Line Items* - -When using a sample to create a template for Quotes or Invoices the Line -Items are formatted within a table. You can change the fields found in -this table as well as add or remove columns. Please note that if you are -creating the template from scratch you must format the Line Items -section as a table. - -image:image87.png[image87.png,title="image87.png"] - -*Margins* - -At the bottom of the PDF Template Edit View, you can specify the margin -width for the PDF output. - -image:187PDF_Margins.png[187PDF_Margins.png,title="187PDF_Margins.png"] - -*Header and Footer* - -Within the PDF Templates Edit View, you can also define a Header and a -Footer for your templates. These can be completed using the Header and -Footer text areas found below the Body text area. - -image:188PDF_footer.png[188PDF_footer.png,title="188PDF_footer.png"] - -*Generate Letter* - -You can generate PDF documents for Accounts, Contacts and Leads using -the Generate Letter functionality. - -image:image90.png[image90.png,title="image90.png"] - -Clicking the 'Generate Letter' button found on these modules Detail View -will prompt a pop-up asking to select a template. - -image:image91.png[image91.png,title="image91.png"] - -The template selector pop-up will show all the active templates which -have the same Type as the module of the record. Clicking the template -name will generate a PDF document with date populated from the record -and it's related records. The Generate Letter functionality can also be -actioned from the List View. This allows you to select multiple records -and click the 'Generate Letter' button within the List View action menu. - -image:image92.png[image92.png,title="image92.png"] - -The process for generating PDFs for Quotes, Invoices and Contracts is -described in your respective sections. - -[[quotes-module]] -Quotes Module -^^^^^^^^^^^^^ - -*Creating a Quote* - -You can create a Quote by going to the Quotes module and clicking -'Create Quote' from within the actions bar. The first panel allows you -to specify details concerning the quote such as the Title, related -Opportunity, Stage and Payment Terms. The Quote Number field is -calculated automatically. - -image:96Quotes_first_panel.png[96Quotes_first_panel.png,title="96Quotes_first_panel.png"] - -The second panel allows you to specify who the Quote is for by relating -an Account and Contact to the Quote. When you select the Account, the -Billing Address and Shipping Address are dynamically pulled from the -Account and populated into the fields on the Quote record. - -image:97Quotes_2nd_panel.png[97Quotes_2nd_panel.png,title="97Quotes_2nd_panel.png"] - -*Line Items with Groups* - -The third panel allows users to specify the Quote Groups, Line Items and -the Currency. A Group is a collection of Line Items with its own Group -Total. A Line Item can be a Product Line or a Service Line. To add a -Quote Group, click the 'Add Group' button. - -_Note: Add Group will be displayed if “Enable Line Item groups” is -selected in Admin._ - -image:98Quotes_add_group.png[98Quotes_add_group.png,title="98Quotes_add_group.png"] - -This will display the Group, allowing you to insert a Group Name and add -a Product Line or Service Line. It will also display the Group Totals. - -image:200Add_group.png[200Add_group.png,title="200Add_group.png"] - -To add a Product Line, click the 'Add Product Line' button. This will -allow users to quote for Products from the Products module. - -image:201Add_product_line.png[201Add_product_line.png,title="201Add_product_line.png"] - -To select a Product, you can start typing in the Product or Part Number -field which will provide a list of results similar to any relate field. -Alternatively click the arrow button next to the Part Number field. This -will display a pop-up window allowing you to select from a list of -Products. - -image:202Add_product1.png[202Add_product1.png,title="202Add_product1.png"] - -Once you have selected a Product, the List, Sale Price and Total will -populate automatically. You can change the Quality, add Discounts -(Percentage or Amount) and increase the Tax percentage. These will alter -the Sale Price, Total Price and Group Total fields. To add a Service -Line, click the 'Add Service Line' button. This will allow users to -quote for Services. - -image:203Add_service_line.png[203Add_service_line.png,title="203Add_service_line.png"] - -For Service Lines, you must specify the List price. This will populate -the Sale Price. Tax and Discounts can be added similarly to the Product -Line. AOS will keep a Grand Total for each Group. - -image:204Total.png[204Total.png,title="204Total.png"] - -AOS will also keep a Grand Total for all Groups combined. - -image:205Total_total.png[205Total_total.png,title="205Total_total.png"] - -The Shipping field allows you to add a shipping cost. The Shipping Tax -field allows you to add tax to this value. Once the Quote has been -compiled, click 'Save' to save the Quote. - -Line Items without Groups - -Creating Quotes without Groups is very similar to creating Quotes with -Groups. The only difference is you do not have to click 'Add Group'. You -simply 'Add Product Line' and 'Add Service Line' to the quote. Without -Groups you are cannot see the Group Total fields. You will only see the -Grand Total fields. - -*Sending Quotations* - -To output a Quote you can select one of following three buttons from the -Quote Detail View. - -image:99Sending_quotations.png[99Sending_quotations.png,title="99Sending_quotations.png"] - -AOS provides users with three methods of sending Quotes: - -* Print as PDF – Allows you to select a template and download or save a -PDF of the Quote. -* Email PDF – Allows you to select a template then directs you to the -SuiteCRM email client 'Compose' screen. The Quote PDF will be attached -to email and the email will be addressed to the related Contact of the -Quote. This allows you to fill out the email body. -* Email Quotation – This directs you to the SuiteCRM email client -'Compose' screen. The email will be addressed to the related Contact of -the Quote. There will be no attachment and the Quote will be displayed -within the body of the email. - -*Convert To Invoice* - -With AOS you can convert Quotes to Invoices. This can be achieved by -clicking the 'Convert to Invoice' button on the Quote Detail View. - -image:100Conver_to_invoice.png[100Conver_to_invoice.png,title="100Conver_to_invoice.png"] - -This functionality will redirect users to the Edit View of an Invoice -record. Fields will be populated based on your Quote counterparts and -Line Items will be copied over. When you are ready to create the -Invoice, click the 'Save' button. Converting a Quote to an Invoice will -set the Invoice Status of the quote to 'Invoiced'. - -*Create Contract* - -As well as converting to an Invoice, AOS allows users to create a -Contract based on a Quote. This can be done by clicking the 'Create -Contract' button on the Quote Detail View. - -image:101Create_contract.png[101Create_contract.png,title="101Create_contract.png"] - -This will redirect you to the Edit View of a Contract record, pulling -through any appropriate fields from the Quote. This includes any Line -Items on the Quote. - -[[invoices-module]] -Invoices Module -^^^^^^^^^^^^^^^ - -*Creating an Invoice* - -Creating an Invoice record is very similar to creating a Quote record. -You can create an Invoice by going to the Invoices module and clicking -'Create Invoice' from within the actions bar. The first panel allows you -to specify details about the Invoice such as Status and Due Date. - -image:102Invoice_panel_1.png[102Invoice_panel_1.png,title="102Invoice_panel_1.png"] - -The second panel allows you to specify who the Invoice is for by -relating an Account and Contact to the Invoice. When you select the -Account, the Billing Address and Shipping Address are dynamically pulled -from the Account and populated into the fields on the Invoice record. - -image:103Invoice_panel_2.png[103Invoice_panel_2.png,title="103Invoice_panel_2.png"] - -*Groups and Line Items* - -AOS allows users to add Groups and Line Items to Invoices. This is -completed in the exact same way as Quotes. Please refer to Quotes -section for details on how to create Groups and Line Items. - -Sending Invoices - -To output an Invoice you can select one of following three buttons from -the Invoice Detail View. - -image:104Invoice_export.png[104Invoice_export.png,title="104Invoice_export.png"] - -AOS provides users with three methods of sending Invoices: - -* Print as PDF – Allows users to select a template and download or save -a PDF of the Invoice. -* Email PDF – Allows users to select a template then directs you to the -SuiteCRM email client 'Compose' screen. The Invoice PDF will be attached -to email and the email will be addressed to the related Contact of the -Invoice. This allows user to fill out the email body. -* Email Invoice – This directs you to the SuiteCRM email client -'Compose' screen. The email will be addressed to the related Contact of -the Invoice. There will be no attachment and the Invoice will be -displayed within the body of the email. - -[[contracts-module]] -Contracts Module -^^^^^^^^^^^^^^^^ - -*Creating a Contract* - -AOS allows users to create Contracts using the Contracts module. - -image:105Creating_a_contract.png[105Creating_a_contract.png,title="105Creating_a_contract.png"] - -When the Contract is created the Renewal Reminder Date will populate -automatically based on the amount of days specified in the AOS Settings -in Admin. A Call will be scheduled and assigned to the Contract Manger -for this date. - -*Groups and Line Items* - -AOS allows users to add Groups and Line Items for Contracts. This is -completed in the exact same way as Quotes. Please refer to Quotes -section for details on how to create Groups and Line Items. - -[[advanced-open-workflow]] -Advanced Open Workflow -~~~~~~~~~~~~~~~~~~~~~~ - -Advanced OpenWorkflow (AOW) is a module for SuiteCRM, allowing users to -create custom workflow processes. This module allows users to trigger -various system actions based on conditions from any SuiteCRM module. - -[[creating-a-workflow-process]] -Creating a Workflow Process -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You can create workflow processes by navigating to the 'WorkFlow' module -within SuiteCRM. Click the 'Create WorkFlow' button within the action -bar to start creating the process. The first panel allows users to set -up the workflow process. - -image:106Creating_a_workflow.png[106Creating_a_workflow.png,title="106Creating_a_workflow.png"] - -This allows you to specify the following: - -* Name – The name of the process. -* Assigned To - The assigned user of the workflow process. -* WorkFlow Module – A drop down list of all the modules found within the -SuiteCRM instance. This is the module the workflow is run against. For -example, When an Account is created/edited. -* Status – Active or Inactive. Only active processes will run. -* Run – Always, On Save or On Scheduler. -* Run On – All Records, Modified Records or New Records. -* Repeated Runs – If checked, the process will continue to run over and -over. Ideally this should only be checked if one of the specified -Actions negates (or will lead to the negation) of one of the specified -Conditions. -* Description – A description of the process. - -[[conditions]] -Conditions -^^^^^^^^^^ - -Adding Conditions - -Once set up, you can add conditions to a workflow process using the -conditions panel. This allows users to specify the criteria that should -trigger the workflow actions. - -image:107Adding_conditions.png[107Adding_conditions.png,title="107Adding_conditions.png"] - -To add a Condition Line you must click the 'Add Condition' button. - -_Note: You must select your WorkFlow Module on the first panel before -adding a Condition Line._ - -image:206Add_condition.png[206Add_condition.png,title="206Add_condition.png"] - -You can have an unlimited amount of Condition Lines. To add another line -click the 'Add Condition' button again and it will appear. On the line -you will have four fields; Field, Operator, Type and Value. - -*Field and Operator* - -Field is a drop down which automatically populates with all the fields -found in the WorkFlow Module. - -image:109Field_box.png[109Field_box.png,title="109Field_box.png"] - -The Field selected will determine the options available for Operator and -Type. If the field type is not a number or date then the operators -available will be 'Equal To' or 'Not Equal To'. For number and date -fields you can also choose from additional logical operators; 'Less -Than', 'Greater Than', 'Less Than or Equal To' or 'Greater Than or Equal -To'. - -image:110Operator_box.png[110Operator_box.png,title="110Operator_box.png"] - -*Condition Types* - -You can specify workflow processes to trigger on different condition -types. These are as follows: - -Value – This is used to directly compare the Field to a value. The value -type offered is dynamic to the field type of the Field selected. For -example, if the field type is a drop down then the value field type will -be the same drop down list. - -image:111Value_condition.png[111Value_condition.png,title="111Value_condition.png"] - -Field – This is used to action a workflow process when one field is -compared to another field in the record. - -image:112Field_condition.png[112Field_condition.png,title="112Field_condition.png"] - -Multiple – This can be selected if the Field is a drop down/multiselect. -This allows users to specify multiple values to action the workflow -from. - -image:113Multiple_condition.png[113Multiple_condition.png,title="113Multiple_condition.png"] - -Date – This allows you to specify the workflow to occur after/before an -amount of time from either another date field or 'Now'. For example, -when the start date of a call is 'Now + 10 minutes'. This can only be -used when the Field is a date field. The amount of time before or after -the date can be specified in Minutes, Hours, Days, Weeks or Months. - -image:114Date_condition.png[114Date_condition.png,title="114Date_condition.png"] - -*Removing Conditions* - -You can remove Condition Lines by clicking the '-' button on the left -hand side of the condition. - -image:115Removing_conditions.png[115Removing_conditions.png,title="115Removing_conditions.png"] - -[[actions]] -Actions -^^^^^^^ - -*Adding Actions* - -Actions are defined in the third panel. These specify what events should -occur when the conditions have been met. You can add an Action by -clicking the 'Add Action' button. - -image:116Adding_actions.png[116Adding_actions.png,title="116Adding_actions.png"] - -This will cause the Action Line to appear. - -image:207Action_line.png[207Action_line.png,title="207Action_line.png"] - -From the Action Line you can Select Action and give it a Name. The -actions available are; 'Create Record', 'Modify Record' and 'Send -Email'. You can specify an unlimited amount of actions for each workflow -process. - -*Create Record* - -If you select 'Create Record' you will be prompted to select a Record -Type. This is the module type of the record you are looking to create. - -image:208Create_record.png[208Create_record.png,title="208Create_record.png"] - -Once selected you can add fields or relationships to this record using -the 'Add Field' and 'Add Relationship' buttons. - -image:209Add_field-relationship1.png[209Add_field-relationship1.png,title="209Add_field-relationship1.png"] - -When Adding fields the first drop down in the line will populate with -all the fields from that module. The second drop down allows you to -specify how the value for that field is going to be derived. For most -cases the options are as follows: - -* Value – This will allow you to input the value directly using the same -field type as the field selected. -* Field – This will make the field the same value as a field found in -the WorkFlow Module. -* Date – Only selectable if the field is a date field. This will allow -you to specify the value as an amount of time after/before another date -field or 'Now'. - -image:210Adding_fields.png[210Adding_fields.png,title="210Adding_fields.png"] - -Selecting the 'Assigned-To' field also gives you more options. As well -as by value and field you can assign a user by: - -Round Robin – This will select each user in turn. - -Least Busy – This will select you with the least amount of records -assigned to you for that module. - -Random – This will select a random user. - -For each of the above options you can choose if you want you to be -selected from all users or users from a specific role. If you have the -SecuritySuite module installed you can additionally choose if you want -you to be selected from all users from a particular Security Group or -all users from a particular security group with a particular role. - -image:121Assigned_field.png[121Assigned_field.png,title="121Assigned_field.png"] - -When adding relationships you must select the related module from the -drop down list then select the record that the new record should be -related to. - -image:212Add_relationship.png[212Add_relationship.png,title="212Add_relationship.png"] - -_Note: You must selected the related module using the arrow button – The -auto completion on the text field is not currently developed._ - -*Modify Record* - -This provides the same functionality as 'Create Record' but instead of -creating a new record you are modifying the record which met the -conditions of the workflow process. With this action you can modify any -field found within the record or you can add a relationship to another -record. This is completed in the same way as 'Create Record' except you -are not required to specify the Record Type. - -*Send Email* - -The 'Send Email' action allows users to create workflow processes which -will send an email based on an template to individuals. Using this -action there are four different types of recipient. - -Email – This will send an email to a specific email address. You must -specify the email address and the email template. - -image:213Send_email_to.png[213Send_email_to.png,title="213Send_email_to.png"] - -Record Email – This will send an email to the primary email address -specified on the record which actioned the workflow process. This can -only be used if the record has an email field such as Accounts and -Contacts. For this option you only need to specify the template. - -https://suitecrm.com/wiki/media/image127.png[https://suitecrm.com/wiki/media/image127.png] - -User – This will send the email to a specified Users email address. You -must specify the recipient user and the template of the email. - -image:214Send_email_to_user.png[214Send_email_to_user.png,title="214Send_email_to_user.png"] - -Related Field – This will send an email to the primary email address -specified on a related modules record. In this case you must specify the -related module (From a drop down list) and the email template. - -image:215Email_related_field.png[215Email_related_field.png,title="215Email_related_field.png"] - -[[calculate-fields]] -Calculate Fields -++++++++++++++++ - -If you select 'Calculate Fields' from the Action dropdown the Calculate -Fields user interface will be loaded after a second and looks like the -picture below. - -image:216Calculate_fields.png[216Calculate_fields.png,title="216Calculate_fields.png"] - -*Calculate Fields - Adding parameters* - -It is possible to add parameters to the formulas by using the dropdown -in the Parameters section of the Calculate Fields’s user interface. The -dropdown contains all of the (basic and custom) fields which belongs to -the module selected in the basic fields section. - -To add a parameter, select the field from the dropdown and click on the -Add parameter button. After this action, a new line appears in the -parameter table with the name of the field and the given identifier. - -For some fields (dropdowns and multi-selects) an additional dropdown -shown up where the user can select if the raw or the formatted value -should be used in Calculated Fields. The raw format means the value -which is stored in the database and the formatted value means the label -for that database value. - -To remove a parameter from the table, simply click on the minus button -in the row of the parameter. Be aware, that if you remove a parameter, -all of the identifiers are recalculated, so the identifiers could change -for fields! - -image:217Add_parameter.png[217Add_parameter.png,title="217Add_parameter.png"] - -The identifier is used to reference this field when the user creates the -formula. For example all appearances of the \{P0} identifier will be -replaced with the Account’s name in the formula. All parameters are like -\{Px} where x is the sequential order of the parameter. The amount of -the parameters is not limited. - -*Calculate Fields - Adding relation parameters* - -Relation parameters are very similar to the regular parameters, the only -difference is that the user first selects an entity which is in a -one-to-one or one-to-many relationship with the actual entity. - -To add a relation parameter, select the relation first, and then select -the field from the connected entity and push the Add relation parameter -button. After this action, a new line appears in the relation parameter -table with the name of the relationship, the name of the field and the -given identifier. - -As for parameters for some relation parameter fields (dropdowns and -multi-selects) an additional dropdown shown up where the user can select -if the raw or the formatted value should be used in Calculate Fields. - -To remove a relation parameter from the table, simply click on the minus -button in the row of the relation parameter. Be aware, that if you -remove a relation parameter, all of the identifiers are recalculated, so -the identifiers could change for fields! - -image:128Adding_relation_parameter.png[128Adding_relation_parameter.png,title="128Adding_relation_parameter.png"] - -The identifier is used to reference this field when the user creates the -formula. For example all appearances of the \{R0} identifier will be -replaced with the creator user‘s username in the formula. All relation -parameters are like \{Rx} where x is the sequential order of the -relation parameter. The amount of the relation parameters is not -limited. - -*Calculate Fields - Creating formula for a field* - -In the Formulas part of the user interface the user can add formulas for -fields of the actual entity. - -To add a formula, select a field from the dropdown first and then push -the Add formula button. After this action, a new line appears in the -formula table with the name of the field and with the place for the -formula. - -To remove a formula from the table, simply click on the minus button in -the row of the formula. - -image:129Add_formula.png[129Add_formula.png,title="129Add_formula.png"] - -The formula is a textbox where the user can write the formulas. The -module evaluates the formula on the given time (on save, on scheduler -run or both) and fills the selected field with the evaluated value. - -The formula can contain any text (with full UTF-8 support), but only the -function parts (functions with parameters between ‘\{‘ and ‘}’) are -evaluated. For example and with the parameters added in the previous -sections, if we fill the formula like: Account \{P0} created by user -name \{R0}, then the description field will have the following value -after save: Account My Account created by user name MyUser (implying the -account’s name is My Account and the creator user’s username is MyUser). - -The Calculate Fields has many built-in functions which allows the user -to build complex formulas to achieve various goals. These functions are -described in the next section. - -*Calculate Fields - Usable functions* - -As it is mentioned above, all of the functions are wrapped between ‘\{‘ -and ‘}’ signs, and they look like \{functionName(parameter1; parameter2; -…)}. The count of the parameters are different for the different -functions. The module evaluates the functions and changes them with -their result in the formula. - -The functions can be embedded into each other (using a result of a -function as a parameter for another function) like in this example: - -
 \{power(\{subtract(\{divide(\{add(\{multiply(10;
-2)}; 12)}; 8)}; 1)}; 2)} 
- -This function is the formalised look of the following mathematical -expression: - -
 ((((10 * 2) + 12) / 8) – 1)2 
- -The functions are divided to six groups. These groups are described in -the next section of the document. - -[[logical-functions]] -Logical Functions - -Logical functions are returning true or false in the form of 1 and 0 so -checkboxes typed fields can be filled with these functions. They can be -also used as the logical condition for the ifThenElse function. - -*equal* - -[cols=",",] -|================================================================ -|Signature |\{equal(parameter1;parameter2)} -|Parameters |parameter1: can be any value of any type -|parameter2: can be any value of any type -|Description |Determines if *parameter1* equals with *parameter2* -|Returns |1 if the two parameters are equal or 0 if not -|Example call |\{equal(1; 2)} returns 0 -|================================================================ - -*notEqual* - -[cols=",",] -|==================================================================== -|Signature |\{notEqual(parameter1; parameter2)} -|Parameters |parameter1: can be any value of any type -|parameter2: can be any value of any type -|Description |Determines if *parameter1* not equals with *parameter2* -|Returns |0 if the two parameters are equal or 1 if not -|Example call |\{notEqual(1; 2)} returns 1 -|==================================================================== - -*greaterThan* - -[cols=",",] -|================================================================= -|Signature |\{greaterThan(parameter1; parameter2)} -|Parameters |parameter1: can be any value of any type -|parameter2: can be any value of any type -|Description |Determines if *parameter1* greater than *parameter2* -|Returns |1 if *parameter1* greater than *parameter2*, 0 if not -|Example call |\{greaterThan(3; 3)} returns 0 -|================================================================= - -*greaterThanOrEqual* - -[cols=",",] -|======================================================================= -|Signature |\{greaterThanOrEqual(parameter1; parameter2)} - -|Parameters |parameter1: can be any value of any type - -|parameter2: can be any value of any type - -|Description |Determines if *parameter1* greater than or equal -*parameter2* - -|Returns |1 if *parameter1* greater than or equal *parameter2*, 0 if not - -|Example call |\{greaterThanOrEqual(3; 3)} returns 1 -|======================================================================= - -*lessThan* - -[cols=",",] -|============================================================== -|Signature |\{lessThan(parameter1; parameter2)} -|Parameters |parameter1: can be any value of any type -|parameter2: can be any value of any type -|Description |Determines if *parameter1* less than *parameter2* -|Returns |1 if *parameter1* less than *parameter2*, 0 if not -|Example call |\{lessThan(3; 3)} returns 0 -|============================================================== - -*lessThanOrEqual* - -[cols=",",] -|======================================================================= -|Signature |\{lessThanOrEqual(parameter1; parameter2)} -|Parameters |parameter1: can be any value of any type -|parameter2: can be any value of any type -|Description |Determines if *parameter1* less than or equal *parameter2* -|Returns |1 if *parameter1* less than or equal *parameter2*, 0 if not -|Example call |\{lessThanOrEqual(3; 3)} returns 1 -|======================================================================= - -*empty* - -[cols=",",] -|=============================================== -|Signature |\{empty(parameter)} -|Parameters |parameter: text value -|Description |Determines if *parameter* is empty -|Returns |1 if *parameter* is empty, 0 if not -|Example call |\{empty(any text)} returns 0 -|=============================================== - -*notEmpty* - -[cols=",",] -|=================================================== -|Signature |\{notEmpty(parameter)} -|Parameters |parameter: text value -|Description |Determines if *parameter* is not empty -|Returns |1 if *parameter* is not empty, 0 if empty -|Example call |\{notEmpty(any text)} returns 1 -|=================================================== - -*not* - -[cols=",",] -|========================================================= -|Signature |\{not(parameter)} -|Parameters |parameter: logical value -|Description |Negates the logical value of the *parameter* -|Returns |1 if *parameter* is 0, 0 if *parameter* is 1 -|Example call |\{not(0)} returns 1 -|========================================================= - -*and* - -[cols=",",] -|======================================================================= -|Signature |\{and(parameter1; parameter2)} - -|Parameters |parameter1: logical value - -|parameter2: logical value - -|Description |Applies the AND logical operator to two logical values - -|Returns |1 if *parameter1* and *parameter2* is 1, 0 if any parameters -are 0 - -|Example call |\{and(1; 0)} returns 0 -|======================================================================= - -*or* - -[cols=",",] -|======================================================================= -|Signature |\{or(parameter1; parameter2)} - -|Parameters |parameter1: logical value - -|parameter2: logical value - -|Description |Applies the OR logical operator to two logical values - -|Returns |1 if *parameter1* or *parameter2* is 1, 0 if both parameters -are 0 - -|Example call |\{or(1; 0)} returns 1 -|======================================================================= - -[[text-functions]] -Text Functions - -Text functions are used to manipulate text in various ways. All the -functions listed here are fully supports UTF-8 texts, so special -characters should not raise any problems. - -*substring* - -[cols=",",] -|======================================================================= -|Signature |\{substring(text; start; length)} - -|Parameters |text: text value - -|start: decimal value - -|length [optional parameter]: decimal value - -|Description |Cuts the substring of a text field from *start*. If the -*length* optional parameter is not set, then it cuts all characters -until the end of the string, otherwise cuts the provided *length*. -Indexing of a text’s characters starting from 0. - -|Returns |Substring of the given text - -|Example call |\{substring(This is my text; 5)} returns is my text - -|\{substring(This is my text; 5; 5)} returns is my -|======================================================================= - -*length* - -[cols=",",] -|=============================================== -|Signature |\{length(parameter)} -|Parameters |parameter: text value -|Description |Count the characters in a text. -|Returns |The count of the characters in a text. -|Example call |\{length(sample text)} returns 11 -|=============================================== - -*replace* - -[cols=",",] -|======================================================================= -|Signature |\{replace(search; replace; subject)} - -|Parameters |search: text value - -|replace: text value - -|subject: text value - -|Description |Replace all occurrences of *search* to *replace* in the -text *subject*. - -|Returns |*subject* with replaced values. - -|Example call |\{replace(apple; orange; This is an apple tree)} returns -This is an orange tree -|======================================================================= - -*position* - -[cols=",",] -|======================================================================= -|Signature |\{position(subject; search)} - -|Parameters |subject: text value - -| |search: text value - -|Description |Find position of first occurrence of *search* in a -*subject* - -|Returns |Numeric position of *search* in *subject* or -1 if *search* -not present in *subject* - -|Example call |\{position(Where is my text?; text)} returns 12 -|======================================================================= - -*lowercase* - -[cols=",",] -|======================================================================= -|Signature |\{lowercase(parameter)} - -|Parameters |parameter: text value - -|Description |Make text lowercase - -|Returns |The lowercased text. - -|Example call |\{lowercase(ThIs iS a sAmPlE tExT)} returns this is a -sample text -|======================================================================= - -*uppercase* - -[cols=",",] -|======================================================================= -|Signature |\{uppercase(parameter)} - -|Parameters |parameter: text value - -|Description |Make text uppercase - -|Returns |The uppercased text. - -|Example call |\{uppercase(ThIs iS a sAmPlE tExT)} returns THIS IS A -SAMPLE TEXT -|======================================================================= - -[[mathematical-functions]] -Mathematical functions - -Mathematical functions are used to manipulate numbers in various ways. -Several mathematical operators are implemented as functions in Calculate -Fields. - -*add* - -[cols=",",] -|================================================= -|Signature |\{add(parameter1; parameter2)} -|Parameters |parameter1: number value -|parameter2: number value -|Description |Adds *parameter1* and *parameter2* -|Returns |The sum of *parameter1* and *parameter2* -|Example call |\{add(3.12; 4.83)} returns 7.95 -|================================================= - -*subtract* - -[cols=",",] -|========================================================= -|Signature |\{subtract(parameter1; parameter2)} -|Parameters |parameter1: number value -|parameter2: number value -|Description |Subtracts *parameter2* from *parameter1* -|Returns |The distinction of *parameter2* and *parameter1* -|Example call |\{subtract(8; 3)} returns 5 -|========================================================= - -*multiply* - -[cols=",",] -|===================================================== -|Signature |\{multiply(parameter1; parameter2)} -|Parameters |parameter1: number value -|parameter2: number value -|Description |Multiplies *parameter1* and *parameter2* -|Returns |The product of *parameter1* and *parameter2* -|Example call |\{multiply(2; 4)} returns 8 -|===================================================== - -*divide* - -[cols=",",] -|====================================================== -|Signature |\{divide(parameter1; parameter2)} -|Parameters |parameter1: number value -|parameter2: number value -|Description |Divides *parameter2* with *parameter1* -|Returns |The division of *parameter2* and *parameter1* -|Example call |\{divide(8; 2)} returns 4 -|====================================================== - -*power* - -[cols=",",] -|============================================================= -|Signature |\{power(parameter1; parameter2)} -|Parameters |parameter1: number value -|parameter2: number value -|Description |Raises *parameter1* to the power of *parameter2* -|Returns |*parameter1* raised to the power of *parameter2* -|Example call |\{power(2; 7)} returns 128 -|============================================================= - -*squareRoot* - -[cols=",",] -|====================================================== -|Signature |\{squareRoot(parameter)} -|Parameters |parameter: number value -|Description |Calculates the square root of *parameter* -|Returns |The square root of *parameter* -|Example call |\{squareRoot(4)} returns 2 -|====================================================== - -*absolute* - -[cols=",",] -|========================================================= -|Signature |\{absolute(parameter)} -|Parameters |parameter: number value -|Description |Calculates the absolute value of *parameter* -|Returns |The absolute value of *parameter* -|Example call |\{absolute(-4)} returns 4 -|========================================================= - -[[date-functions]] -Date functions - -There are several date functions implemented in Calculate Fields, so the -user can manipulate dates in many ways. Most of the functions uses a -format parameter, which is used to set the result of the functions -formatted as the user wants to. The options for these formats are -equivalent with the PHP format parameters: - -[cols=",,",options="header",] -|======================================================================= -|Format character |Description |Example returned values -|*For day* - -|style="text-align: center;" | d |Day of the month, 2 digits with -leading zeros |01 to 31 - -|style="text-align: center;" | D |A textual representation of a day, -three letters |Mon through Sun - -|style="text-align: center;" | j |Day of the month without leading zeros -|1 to 31 - -|style="text-align: center;" | l |A full textual representation of the -day of the week |Sunday through Saturday - -|style="text-align: center;" | N |ISO-8601 numeric representation of the -day of the week |1 (for Monday) through 7 (for Sunday) - -|style="text-align: center;" | S |English ordinal suffix for the day of -the month, 2 characters |st, nd, rd or th. Works well with j - -|style="text-align: center;" | w |Numeric representation of the day of -the week |0 (for Sunday) through 6 (for Saturday) - -|style="text-align: center;" | z |The day of the year (starting from 0) -|0 through 365 - -|*For week* - -|style="text-align: center;" | W |ISO-8601 week number of year, weeks -starting on Monday |42 (the 42nd week in the year) - -|*For month* - -|style="text-align: center;" | F |A full textual representation of a -month, such as January or March |January through December - -|style="text-align: center;" | m |Numeric representation of a month, -with leading zeros |01 through 12 - -|style="text-align: center;" | M |A short textual representation of a -month, three letters |Jan through Dec - -|style="text-align: center;" | n |Numeric representation of a month, -without leading zeros |1 through 12 - -|style="text-align: center;" | t |Number of days in the given month |28 -through 31 - -|*For year* - -|style="text-align: center;" | L |Whether it's a leap year |1 if it is a -leap year, 0 otherwise - -|style="text-align: center;" | o |ISO-8601 year number. This has the -same value as Y, except that if the ISO week number (W) belongs to the -previous or next year, that year is used instead |1999 or 2003 - -|style="text-align: center;" | Y |A full numeric representation of a -year, 4 digits |1999 or 2003 - -|style="text-align: center;" | y |A two digit representation of a year -|99 or 03 - -|*For time* - -|style="text-align: center;" | a |Lowercase Ante meridiem and Post -meridiem |am or pm - -|style="text-align: center;" | A |Uppercase Ante meridiem and Post -meridiem |AM or PM - -|style="text-align: center;" | B |Swatch Internet time |000 through 999 - -|style="text-align: center;" | g |12-hour format of an hour without -leading zeros |1 through 12 - -|style="text-align: center;" | G |24-hour format of an hour without -leading zeros |0 through 23 - -|style="text-align: center;" | h |12-hour format of an hour with leading -zeros |01 through 12 - -|style="text-align: center;" | H |24-hour format of an hour with leading -zeros |00 through 23 - -|style="text-align: center;" | i |Minutes with leading zeros |00 to 59 - -|style="text-align: center;" | s |Seconds, with leading zeros |00 -through 59 - -|*For timezone* - -|style="text-align: center;" | e |Timezone identifier |UTC, GMT, -Atlantic/Azores - -|style="text-align: center;" | l |Whether or not the date is in daylight -saving time |1 if Daylight Saving Time, 0 otherwise - -|style="text-align: center;" | O |Difference to Greenwich time (GMT) in -hours |+0200 - -|style="text-align: center;" | P |Difference to Greenwich time (GMT) -with colon between hours and minutes |+02:00 - -|style="text-align: center;" | T |Timezone abbreviation |EST, MDT - -|style="text-align: center;" | Z |Timezone offset in seconds. The offset -for timezones west of UTC is always negative, and for those east of UTC -is always positive. |-43200 through 50400 - -|*For full date/time* - -|style="text-align: center;" | c |ISO 8601 date -|2004-02-12T15:19:21+00:00 - -|style="text-align: center;" | r |RFC 2822 formatted date |Thu, 21 Dec -2000 16:01:07 +0200 - -|style="text-align: center;" | U |Seconds since the Unix Epoch (January -1 1970 00:00:00 GMT) | -|======================================================================= - -For all functions without timestamp parameter, we assume that the -current date/time is 2016.04.29. 15:08:03 - -*date* - -[cols=",",] -|===================================================== -|Signature |\{date(format; timestamp)} -|Parameters |format: format text -|timestamp: date/time value -|Description |Creates a date in the given format -|Returns |*timestamp* in the given *format* -|Example call |\{date(ymd; 2016-02-11)} returns 160211 -|===================================================== - -*now* - -[cols=",",] -|============================================================= -|Signature |\{now(format)} -|Parameters |format: format text -|Description |Creates the actual date/time in the given format -|Returns |Current date/time in the given *format* -|Example call |\{now(Y-m-d H:i:s)} returns 2016-04-29 15:08:03 -|============================================================= - -*yesterday* - -[cols=",",] -|=================================================================== -|Signature |\{yesterday(format)} -|Parameters |format: format text -|Description |Creates yesterday’s date/time in the given format -|Returns |Yesterday’s date/time in the given *format* -|Example call |\{yesterday(Y-m-d H:i:s)} returns 2016-04-28 15:08:03 -|=================================================================== - -*tomorrow* - -[cols=",",] -|================================================================== -|Signature |\{tomorrow(format)} -|Parameters |format: format text -|Description |Creates tomorrow’s date/time in the given format -|Returns |Tomorrow’s date/time in the given *format* -|Example call |\{tomorrow(Y-m-d H:i:s)} returns 2016-04-30 15:08:03 -|================================================================== - -*datediff* - -[cols=",",] -|================================================================== -|Signature |\{datediff(timestamp1; timestamp2; unit)} -|Parameters |timestamp1: date/time value -|timestamp2: date/time value -|unit: years/months/days/hours/minutes/seconds; default: days -|Description |Subtracts *timestamp2* from *timestamp1* -|Returns |The difference between the two dates returned in *unit* -|Example call |\{datediff(2016-02-01; 2016-04-22; days)} returns 81 -|================================================================== - -*addYears* - -[cols=",",] -|============================================================== -|Signature |\{addYears(format; timestamp; amount)} -|Parameters |format: format text -|timestamp: date/time value -|amount: decimal number -|Description |Adds *amount* years to *timestamp* -|Returns |Incremented date in *format* -|Example call |\{addYears(Ymd; 2016-04-22; 1)} returns 20170422 -|============================================================== - -*addMonths* - -[cols=",",] -|=============================================================== -|Signature |\{addMonths(format; timestamp; amount)} -|Parameters |format: format text -|timestamp: date/time value -|amount: decimal number -|Description |Adds *amount* months to *timestamp* -|Returns |Incremented date in *format* -|Example call |\{addMonths(Ymd; 2016-04-22; 1)} returns 20160522 -|=============================================================== - -*addDays* - -[cols=",",] -|============================================================= -|Signature |\{addDays(format; timestamp; amount)} -|Parameters |format: format text -|timestamp: date/time value -|amount: decimal number -|Description |Adds *amount* days to *timestamp* -|Returns |Incremented date in *format* -|Example call |\{addDays(Ymd; 2016-04-22; 1)} returns 20160423 -|============================================================= - -*addHours* - -[cols=",",] -|======================================================================= -|Signature |\{addHours(format; timestamp; amount)} - -|Parameters |format: format text - -|timestamp: date/time value - -|amount: decimal number - -|Description |Adds *amount* hours to *timestamp* - -|Returns |Incremented date in *format* - -|Example call |\{addHours(Ymd H:i:s; 2016-04-22 23:30; 5)} returns -20160423 04:30:00 -|======================================================================= - -*addMinutes* - -[cols=",",] -|======================================================================= -|Signature |\{addMinutes(format; timestamp; amount)} - -|Parameters |format: format text - -|timestamp: date/time value - -|amount: decimal number - -|Description |Adds *amount* minutes to *timestamp* - -|Returns |Incremented date in *format* - -|Example call |\{addMinutes(Ymd H:i:s; 2016-04-22 22:58; 5)} returns -20160422 23:03:00 -|======================================================================= - -*addSeconds* - -[cols=",",] -|======================================================================= -|Signature |\{addSeconds(format; timestamp; amount)} - -|Parameters |format: format text - -|timestamp: date/time value - -|amount: decimal number - -|Description |Adds *amount* seconds to *timestamp* - -|Returns |Incremented date in *format* - -|Example call |\{addSeconds(Ymd H:i:s; 2016-04-22 22:58; 5)} returns -20160422 22:58:05 -|======================================================================= - -*subtractYears* - -[cols=",",] -|=================================================================== -|Signature |\{subtractYears(format; timestamp; amount)} -|Parameters |format: format text -|timestamp: date/time value -|amount: decimal number -|Description |Subtracts *amount* years from *timestamp* -|Returns |Decremented date in *format* -|Example call |\{subtractYears(Ymd; 2016-04-22; 5)} returns 20110422 -|=================================================================== - -*subtractMonths* - -[cols=",",] -|==================================================================== -|Signature |\{subtractMonths(format; timestamp; amount)} -|Parameters |format: format text -|timestamp: date/time value -|amount: decimal number -|Description |Subtracts *amount* months from *timestamp* -|Returns |Decremented date in *format* -|Example call |\{subtractMonths(Ymd; 2016-04-22; 5)} returns 20151122 -|==================================================================== - -*subtractDays* - -[cols=",",] -|================================================================== -|Signature |\{subtractDays(format; timestamp; amount)} -|Parameters |format: format text -|timestamp: date/time value -|amount: decimal number -|Description |Subtracts *amount* days from *timestamp* -|Returns |Decremented date in *format* -|Example call |\{subtractDays(Ymd; 2016-04-22; 5)} returns 20160417 -|================================================================== - -*subtractHours* - -[cols=",",] -|======================================================================= -|Signature |\{subtractHours(format; timestamp; amount)} - -|Parameters |format: format text - -|timestamp: date/time value - -|amount: decimal number - -|Description |Subtracts *mount* hours from *timestamp* - -|Returns |Decremented date in *format* - -|Example call |\{subtractHours(Ymd H:i:s; 2016-04-22 12:37; 5)} returns -20160422 07:37:00 -|======================================================================= - -*subtractMinutes* - -[cols=",",] -|======================================================================= -|Signature |\{subtractMinutes(format; timestamp; amount)} - -|Parameters |format: format text - -|timestamp: date/time value - -|amount: decimal number - -|Description |Subtracts *amount* minutes from *timestamp* - -|Returns |Decremented date in *format* - -|Example call |\{subtractMinutes(Ymd H:i:s; 2016-04-22 12:37; 5)} -returns 20160422 12:32:00 -|======================================================================= - -*subtractSeconds* - -[cols=",",] -|======================================================================= -|Signature |\{subtractSeconds(format; timestamp; amount)} - -|Parameters |format: format text - -|timestamp: date/time value - -|amount: decimal number - -|Description |Subtracts *amount* minutes from *timestamp* - -|Returns |Decremented date in *format* - -|Example call |\{subtractSeconds(Ymd H:i:s; 2016-04-22 12:37; 5)} -returns 20160422 12:36:55 -|======================================================================= - -[[control-functions]] -Control Functions - -There is only one control function implemented in Calculate Fields so -far, but this function ensures that the user can write very complex -formulas with conditions. Since the functions can be embedded in each -other, the user can write junctions with many branches. - -*ifThenElse* - -[cols=",",] -|======================================================================= -|Signature |\{ifThenElse(condition; trueBranch; falseBranch)} - -|Parameters |condition: logical value - -|trueBranch: any expression - -|falseBranch: any expression - -|Description |Selects one of the two branches depending on *condition* - -|Returns |*trueBranch* if *condition* is true, *falseBranch* otherwise - -|Example call |\{ifThenElse(\{equal(1; 1)}; 1 equals 1; 1 not equals 1)} -returns 1 equals 1 -|======================================================================= - -[[counters]] -Counters - -There are several counters implemented in Calculate Fields which can be -used in various scenarios. - -The counters sorted into two groups: - -1. *Global counters:* Counters which are incremented every time an -affected formula is evaluated -2. *Daily counters:* Counters which resets every day. (Starting from 1) - -In this chapter we assume that the counters current value is 4, so the -incremented value will be 5 with the given format. - -*GlobalCounter* - -[cols=",",] -|======================================================================= -|Signature |\{GlobalCounter(name; numberLength)} - -|Parameters |name: any text - -| |numberLength: decimal number - -|Description |Increments and returns the counter for *name* with length -*numberLength* - -|Returns |Counter with length *numberLength* - -|Example call |\{GlobalCounter(myName; 4)} returns 0005 -|======================================================================= - -*GlobalCounterPerUser* - -[cols=",",] -|======================================================================= -|Signature |\{GlobalCounterPerUser(name; numberLength)} - -|Parameters |name: any text - -| |numberLength: decimal number - -|Description |Increments and returns the counter for *name* for the user -who creates the entity with length *numberLength* - -|Returns |Counter with length *numberLength* - -|Example call |\{GlobalCounterPerUser(myName; 3)} returns 005 -|======================================================================= - -*GlobalCounterPerModule* - -[cols=",",] -|======================================================================= -|Signature |\{GlobalCounterPerModule(name; numberLength)} - -|Parameters |name: any text - -| |numberLength: decimal number - -|Description |Increments and returns the counter for *name* for the -module of the entity with length *numberLength* - -|Returns |Counter with length *numberLength* - -|Example call |\{GlobalCounterPerModule(myName; 2)} returns 05 -|======================================================================= - -*GlobalCounterPerUserPerModule* - -[cols=",",] -|======================================================================= -|Signature |\{GlobalCounterPerUserPerModule(name; numberLength)} - -|Parameters |name: any text - -| |numberLength: decimal number - -|Description |Increments and returns the counter for *name* for the user -who creates the entity and for the module of the entity with length -*numberLength* - -|Returns |Counter with length *numberLength* - -|Example call |\{GlobalCounterPerUserPerModule(myName; 1)} returns 5 -|======================================================================= - -*DailyCounter* - -[cols=",",] -|======================================================================= -|Signature |\{DailyCounter(name; numberLength)} - -|Parameters |name: any text - -| |numberLength: decimal number - -|Description |Increments and returns the counter for *name* with length -*numberLength* - -|Returns |Counter with length *numberLength*, or if the counter is not -incremented this day then 1 with length *numberLength* - -|Example call |\{DailyCounter(myName; 1)} returns 5 -|======================================================================= - -*DailyCounterPerUser* - -[cols=",",] -|======================================================================= -|Signature |\{DailyCounterPerUser(name; numberLength)} - -|Parameters |name: any text - -| |numberLength: decimal number - -|Description |Increments and returns the counter for *name* for the user -who creates the entity with length *numberLength* - -|Returns |Counter with length *numberLength*, or if the counter is not -incremented this day for this user then 1 with length *numberLength* - -|Example call |\{DailyCounter(myName; 1)} returns 5 -|======================================================================= - -*DailyCounterPerModule* - -[cols=",",] -|======================================================================= -|Signature |\{DailyCounterPerModule(name; numberLength)} - -|Parameters |name: any text - -| |numberLength: decimal number - -|Description |Increments and returns the counter for *name* for the -module of the entity with length *numberLength* - -|Returns |Counter with length *numberLength*, or if the counter is not -incremented this day for this module then 1 with length *numberLength* - -|Example call |\{DailyCounterPerModule(myName; 1)} returns 5 -|======================================================================= - -*DailyCounterPerUserPerModule* - -[cols=",",] -|======================================================================= -|Signature |\{DailyCounterPerUserPerModule(name; numberLength)} - -|Parameters |name: any text - -| |numberLength: decimal number - -|Description |Increments and returns the counter for *name* for the user -who creates the entity and for the module of the entity with length -*numberLength* - -|Returns |Counter with length *numberLength*, or if the counter is not -incremented this day for the user who creates the entity and for this -module then 1 with length *numberLength* - -|Example call |\{DailyCounterPerUserPerModule(myName; 1)} returns 5 -|======================================================================= - -[[example]] -Example - -*Calculate monthly fee for an opportunity* - -*Use Case* - -The user would like to calculate a monthly fee of an opportunity to a -custom field by dividing the amount of the opportunity by the duration. - -*Setup* - -Our opportunities module has a dropdown field called Duration with -values: (database value in brackets) 6 months [6], 1 year [12], 2 years -[24]. There is also a currency field called Monthly. - -*Workflow* - -Go to WorkFlow module and create a new WorkFlow. Set the base options -like the following: - -[cols=",",] -|===================================================== -|*Name:* as you wish |*WorkFlow Module:* Opportunities -|*Status:* Active |*Run:* Only on save -|*Run on:* All records |*Repeated runs:* checked -|===================================================== - -image:130Example_workflow.png[130Example_workflow.png,title="130Example_workflow.png"] - -We do not create any conditions, since we would like the WorkFlow to run -on all opportunities. - -Now, add an action and select Calculate Fields from the dropdown. - -Then, add two fields from Opportunities as parameters. First, select -Opportunity amount (amount) and add it as a parameter (it will be \{P0}) -then select Duration and the raw value option from the data type -dropdown and add it as parameter two (it will be \{P1}). There is no -need to add any relational parameters for this formula. - -Now, add a formula for the monthly field and fill the textbox with the -following formula: - -
 \{divide(\{P0}; \{P1})} 
- -So the whole action should look like this: - -https://suitecrm.com/wiki/images/1/13/ExampleCF_updated1.png[https://suitecrm.com/wiki/images/1/13/ExampleCF_updated1.png] - -Save the WorkFlow and create a new Opportunity: - -https://suitecrm.com/wiki/images/5/5a/ExampleCF_orig2.png[https://suitecrm.com/wiki/images/5/5a/ExampleCF_orig2.png] - -As you can see, we did not even add the monthly field to the EditView, -because we don’t want to force the user to make calculations. Save the -Opportunity and check the results on the DetailView: - -https://suitecrm.com/wiki/images/4/4b/ExampleCF_orig3.png[https://suitecrm.com/wiki/images/4/4b/ExampleCF_orig3.png] - -''''' - -AOW Calculated Fields was contributed by http://www.dtbc.eu/[diligent -technology & business consulting GmbH] - -''''' - -*Removing Actions* - -You can remove Action Lines by clicking the 'X' button on the top right -hand side of the Action. - -image:131Removing_actions.png[131Removing_actions.png,title="131Removing_actions.png"] - -*Removing Field and Relationship Lines* - -You can remove Field and Relationship Lines by clicking the '-' button -on the left hand side of the Action. - -image:132Removing_fields.png[132Removing_fields.png,title="132Removing_fields.png"] - -[[process-audit]] -Process Audit -^^^^^^^^^^^^^ - -Advanced OpenWorkflow allows users to audit your processes. In the -Detail View of each WorkFlow record there is a sub-panel called -'Processed Flows'. - -https://suitecrm.com/wiki/media/image132.png[https://suitecrm.com/wiki/media/image132.png] - -This lists all the workflow processes which have been actioned including -details on the record which actioned the flow, its status and the date -it was created. - -https://suitecrm.com/wiki/media/image133.png[https://suitecrm.com/wiki/media/image133.png] - -You can view this information at a higher level by clicking the 'View -Process Audit' button within the module action bar. This will show all -the processes that have run for all the WorkFlow records. - -[[tutorials]] -Tutorials -^^^^^^^^^ - -*Customers to Target List* - -This tutorial will show you how to create a workflow process to add -accounts who are customers to a Target-List when the record is created -or modified. Set Up - -1. Start by navigating to the WorkFlow module and clicking 'Create -Workflow' from the the action bar. -2. Give your workflow a Name such as 'Populate Target List. -3. Select Accounts as the WorkFlow Module. -4. Ensure Repeated Runs is NOT selected and the Status is Active (This -should be done by default). Optionally you can change the Assigned-To -and add a Description. - -*Conditions* - -1. Create a new Condition Line by clicking the 'Add Condition' button. -2. Select 'Type' from the Field drop down. -3. Keep the Operator as 'Equals To' and the Type as 'Value'. -4. From the Value drop down select 'Customer'. - -Once these steps have been completed the Conditions panel should look -like this: - -image:134Conditions.png[134Conditions.png,title="134Conditions.png"] - -*Actions* - -Create a new Action by clicking the 'Add Action' button. - -1. Select 'Modify Record from the Select Action drop down list. -2. Using the Name field, give the action a name such as 'Add to Target -List' -3. Add a Relationship Line by clicking the 'Add Relationship' button. -4. A drop down will appear above the 'Add Relationship' button. Select -the relationship from this drop down box. In this case we are looking -for 'Target Lists: Prospect List' -5. This will populate the rest of the line. Click the arrow button next -to the relate field to select your target list. - -Once these steps have been completed your Actions panel should look like -this: - -image:218Add_to_target_list_actions.png[218Add_to_target_list_actions.png,title="218Add_to_target_list_actions.png"] - -*Cases Reminder* - -This tutorial will show you how to create a workflow process to notify -the assigned user and then a particular manger user when an open Case -has not been updated/modified within two days. Set Up - -1. Start by navigating to the WorkFlow module and clicking 'Create -Workflow' from the the action bar. -2. Give your workflow a Name such as 'Case Escalation'. -3. Select Cases as the WorkFlow Module. -4. Ensure Repeated Runs is NOT selected and the Status is Active (This -should be done by default). Optionally you can change the Assigned-To -and add a Description. - -Once these steps have been completed the first panel should look like -this: - -image:136Case_Escalation.png[136Case_Escalation.png,title="136Case_Escalation.png"] - -*Conditions* - -Create a new Condition Line by clicking the 'Add Condition' button. - -Select 'Date Modified' from the Field drop down. - -Change the Operator to 'Less Than or Equal To' and the Type to 'Date' - -From the Value fields select 'Now', '-', '2', 'Days' in order. - -Once these steps have been completed the Conditions panel should look -like this: - -image:137Conditions.png[137Conditions.png,title="137Conditions.png"] - -Repeat step 1. - -This time select 'Status' from the Field drop down. - -Keep the Operator as 'Equals To' and change the Type to 'Multiple'. - -From the Value multi-select field select any values which signify an -open case - -Once these steps have been completed the Conditions panel should look -like this: - -image:138Conditions.png[138Conditions.png,title="138Conditions.png"] - -*Actions* - -1. Create a new Action by clicking the 'Add Action' button. -2. Select 'Send Email from the Select Action down down list. -3. Give the action a Name such as 'Assigned User Reminder' -4. On the Email Line select 'Related Field' from the first drop down, -'Users: Assigned To' from the second drop down and a email template from -the third drop down. - -Once these steps have been completed the Actions panel should look like -this: - -image:219Assigned_user_reminder_actions.png[219Assigned_user_reminder_actions.png,title="219Assigned_user_reminder_actions.png"] - -\1. Repeat steps 1, 2 and 3 but change the name of this action to -'Manager Escalation Email'. 2. On the Email Line select 'User' and then -select you who should receive the email. Select an email template from -the third drop down. 3. When you are finished click 'Save' to create -your workflow. Once these steps have been completed the Actions panel -should look like this: - -image:220Double_action.png[220Double_action.png,title="220Double_action.png"] - -*Follow Up Web Leads* - -This tutorial will show you how to create a workflow process to assign -web Leads to a particular user from a particular role within SuiteCRM. -This user will be chosen by round robin. The workflow process will also -set a follow up call for one day after the Lead is created. - -''Note: You can change the Sales role to any role found in your own -system. '' - -*Set Up* - -1. Start by navigating to the WorkFlow module and clicking 'Create -Workflow' from the the action bar. -2. Give your workflow a Name such as 'Web Lead Assignment and Follow -Up'. -3. Select Leads as the WorkFlow Module. -4. Ensure Repeated Runs is NOT selected and the Status is Active (This -should be done by default). Optionally you can change the Assigned-To -and add a Description. - -Once these steps have been completed the first panel should look like -this: - -image:141Set_up.png[141Set_up.png,title="141Set_up.png"] - -*Conditions* - -1. Create a new Condition Line by clicking the 'Add Condition' button. -2. Select 'Lead Source' from the Field drop down. -3. Keep the Operator as 'Equals To' and the Type as 'Value' -4. From the Value drop down select our condition, 'Web Site' - -Once these steps have been completed the Conditions panel should look -like this: - -image:142Conditions.png[142Conditions.png,title="142Conditions.png"] - -*Actions* - -1. Create a new Action by clicking the 'Add Action' button. -2. Select 'Modify Record' from the Select Action down down list. -3. Using the Name field, give the action a name such as 'Assign to -Sales' -4. Add a Field Line by clicking the 'Add Field' button. -5. Select 'Assigned-To' from the new drop down box that has appeared -above the 'Add Field' button. -6. Change the middle drop down box from 'Value' to 'Round Robin' -7. Change the third drop down box from 'ALL Users' to 'ALL Users in -Role' -8. Select from forth drop down box on the line 'Sales'. - -Once these steps have been completed the Actions panel should look like -this: - -image:221Assign_to_sales_action.png[221Assign_to_sales_action.png,title="221Assign_to_sales_action.png"] - -1. Now create a new Action by repeating step 1. -2. This time select 'Create Record' from the Select Action down down -list. -3. Using the Name field, give the action a name such as 'Create Follow -Up Call'. -4. From the Record Type drop down select 'Calls'. -5. Click the Add Field button to add a new field: -6. Select 'Subject' from the first drop down box. Leave the second drop -down box as 'Value' then type the desired subject into the text field at -the end. -7. Add another field, this time selecting the 'Start Date' from the -first drop down box. -8. Change the second drop down box from 'Value' to 'Date'. -9. In the third drop down box select 'Now'. In the fourth drop down box -on the line select '+'. -10. In the text box type '1' and in the drop down next to it select -'Days'. -11. Add another field, this time select 'Assigned-To', 'Field', -'Assigned-To' – This will relate the assigned User of the Lead to the -Call. -12. You can add any other fields that you wish to include in the call at -this stage. To finish click 'Save'. - -Once these steps have been completed the Actions panel should look like -this: - -image:222action.png[222action.png,title="222action.png"] - -[[advanced-open-cases-with-portal]] -Advanced Open Cases with Portal -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -[[introduction]] -Introduction -^^^^^^^^^^^^ - -Advanced OpenPortal (AOP) is an enhancement to the case management -module in SuiteCRM. There is also a Joomla component. AOP extends the -core cases functionality and enhances mechanisms for contacts to update -cases. - -This module allows contacts held within SuiteCRM to: - -* Retrieve emails regarding updates to your Cases -* Create Cases by emailing a defined support address -* Update Cases by replying to Case emails - -The module allows SuiteCRM users to: Add updates to Cases View a -threaded log of all updates Retrieve email notifications when a contact -adds an update to a Case Create Joomla users from a Contact The AOP -Joomla component connects a Joomla site to the SuiteCRM instance. This -allows SuiteCRM Contacts to: View a list of your Cases online Create new -Cases online Reply to existing cases View your case details including a -threaded log of all updates - -Emails Advanced OpenPortal (AOP) uses the standard SuiteCRM -functionality to send emails and create cases from inbound emails. -Details on how to configure your outgoing email settings can be found -here. Details on how to set up a group email account which will -automatically generate cases can be found here. - -[[installation-configuration]] -Installation & Configuration -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -System Administrator users can configure the settings by accessing the -AOP settings through the admin panel. - -image:145AOP_settings.png[145AOP_settings.png,title="145AOP_settings.png"] - -Here you can enable or disable the AOP functionality, configure the -Joomla URL, set the case distribution method, “email from” details and -the different email templates. - -To install the Joomla AOP component, use the Joomla Extension Manager. -Once installed you must configure the SuiteCRM URL and a valid SuiteCRM -username and password. This can be done by navigating to Components → -advancedopen-portal. - -https://suitecrm.com/wiki/media/image146.png[https://suitecrm.com/wiki/media/image146.png] - -Once you have configured the Joomla component you can add two new Main -Menu items to your Joomla portal. These are: - -* List Cases - This shows a list of all Cases that the Contact has -logged. This page also provides a search mechanism to filter cases. -* New Case – This page will allow Contacts to create Cases in SuiteCRM -from the Joomla portal. - -https://suitecrm.com/wiki/media/image147.png[https://suitecrm.com/wiki/media/image147.png] - -[[using-advanced-openportal]] -Using Advanced OpenPortal -^^^^^^^^^^^^^^^^^^^^^^^^^ - -*Creating a Portal User* - -To create a Portal User a SuiteCRM User must first create a Contact for -the Portal User using the standard SuiteCRM functionality. Once created -you must click the 'Create Portal User' button. This can be found at the -top left hand side of the Contact record Detail View. - -_Note: If you have action menus enabled the button will be within the -action menu._ - -https://suitecrm.com/wiki/media/image1408png[https://suitecrm.com/wiki/media/image148.png] - -Once clicked, a new user will be created in Joomla and the Contact will -be sent your portal credentials via email. - -*Creating a Case via the Portal* - -Portal Users can create a new Case by going to the New Case page on the -portal website. - -https://suitecrm.com/wiki/media/image149.png[https://suitecrm.com/wiki/media/image149.png] - -From here Portal Users can enter the details of your issue and attach -any supporting documents. The dropdown values are dynamically pulled -from the SuiteCRM instance and thus can be edited using the drop down -editor tool within SuiteCRM. - -_Note: This feature does use the Joomla cache so please clear cache -after an update has been made. When the case is ready to be logged, -click the 'Save' button. This will create the Case within SuiteCRM_. - -*Viewing Cases via the Portal* - -Portal Users can view a list of all your Cases using the List Cases -page. This will also allow you to filter your search by State (All, Open -or Closed) or by keyword. When searching by keyword it will search the -'Number', 'Subject', 'Status', 'Created' and 'Last Update' fields to -find your result. - -https://suitecrm.com/wiki/media/image150.png[https://suitecrm.com/wiki/media/image150.png] - -To view more information on the case and to add updates then Portal -Users can click the 'Subject' of case. - -https://suitecrm.com/wiki/media/image151.png[https://suitecrm.com/wiki/media/image151.png] - -From the case view Portal Users can view all the external updates added -to the case from both Joomla and SuiteCRM. This is displayed in a -threaded format showing who updated the case Any attached files to -updates will also be accessible from this view. When a Portal User -updates a case the assigned SuiteCRM user of the case will be notified -by email. - -*Creating and Updating Cases from SuiteCRM* - -You can create and update Cases from SuiteCRM. To add an update to an -existing record Users will add text to the 'Update' field within the -case Detail View and click 'Save'. This will publish the update to the -portal and send an email to any Contacts related to the Case. - -https://suitecrm.com/wiki/media/image152.png[https://suitecrm.com/wiki/media/image152.png] - -If Users check the 'Internal Update' field then the update will appear -in SuiteCRM only. It will not appear in Joomla and the Contact will not -be emailed. - -https://suitecrm.com/wiki/media/image153.png[https://suitecrm.com/wiki/media/image153.png] - -The Case Detail View will show the full threaded update log. - -https://suitecrm.com/wiki/media/image154.png[https://suitecrm.com/wiki/media/image154.png] - -Additional Contacts can be added to the Case using the Contacts sub -panel. All emails exchanged between the system, the contact and you will -be attached to the History sub-panel. Any documents attached to the case -using the Portal are held as Notes within this sub-panel. - -*Status Drop Down* - -Within Cases, you can specify both a State and a Status value. The State -determines if the Case is Open or Closed. Depending on the State you -will be offered different statuses. You can amend these statuses using -the Dropdown Editor Tool within the Admin Developer Tools. When adding a -new Status you must define the Item Name as “_ItemName” For example “Open_New” or “Closed_Rejected”. All values -with an Item Name prefixed with “Open_” will show when the state is -Open, similarly all with the prefix “Closed_” will show when the state -is closed. - -[[advanced-open-events]] -Advanced Open Events -~~~~~~~~~~~~~~~~~~~~ - -[[events-locations]] -Events Locations -^^^^^^^^^^^^^^^^ - -The Locations module is used to capture the venue/site information where -events are held. - -*Creating Locations* - -\1. Hover over the Locations module on the navigation bar and select -'Create Location'. - -image:146Create_location.png[146Create_location.png,title="146Create_location.png"] - -\2. This will take you to the Edit View. Enter information into the -appropriate fields, all required fields are marked with a red asterisk -and must be completed prior to saving. - -image:147Location_edit_view.png[147Location_edit_view.png,title="147Location_edit_view.png"] - -\3. Once the necessary information is entered, click "Save". - -[[events]] -Events -^^^^^^ - -The Events module is used to capture information an particular event and -send out invites to delegates. To view the Events held within the system -click the 'Events' tab on the navigation bar. This will take you to the -Events List View. - -*Creating Events* - -\1. Hover over the Events module on the navigation bar and select -'Create Event'. - -image:148Create_event.png[148Create_event.png,title="148Create_event.png"] - -\2. This will take you to the Edit View. Enter information into the -appropriate fields, all required fields are marked with a red asterisk -and must be completed prior to saving. - -image:149Events_edit_view.png[149Events_edit_view.png,title="149Events_edit_view.png"] - -The following fields are found on the Events module: - -* *Name* – The name of the event -* *Start* *Date* – The date and time of when the event starts -* *End* *Date* – The date and time of when the event ends -* *Duration* – The duration of the event. This will automatically change -the end date or be altered automatically if the end date is changed. -* *Location* – This is a relationship to the *Event Locations* module. -* *Budget* – The budget for the event. -* *Email* *Invite* *Template* – The *Email Template* that will be sent -to associated Delegates. -* *Accept* *Redirect* *URL* – The web page invitees should be redirected -to after you accept an invite using the link provided in the *Email -Template*. -* *Decline* *Redirect* *URL* – The web page invitees should be -redirected to after you decline an invite using the link provided in the -*Email Template*. -* *Description* – More information about the Event. -* *Assigned*-*To* – Who the assigned user is for this event. This -defaults to you who creates the event. -* *Created* *By* – Which user created the event. - -\3. Once the necessary information is entered, click "Save". - -[[adding-delegates]] -Adding Delegates -^^^^^^^^^^^^^^^^ - -\1. Navigate to the Event Detail View. - -\2. Navigate to the Delegates sub-panel found below the 'Event Details' -panel. - -image:223Adding_delegates.png[223Adding_delegates.png,title="223Adding_delegates.png"] - -\3. Click 'Select Delegates'. A list of options will appear. - -image:224Select_delegates.png[224Select_delegates.png,title="224Select_delegates.png"] - -\4. Select the appropriate option depending on who should be added to -the Event. - -* *Target* *List* – Select a *Target List* of individuals to be -associated to the event. All *Targets*, *Leads* and *Contacts* on this -'''Target List '''will be added to the *Event*. -* *Targets* – Select *Targets* to be associated to this *Event*. -* *Contacts* – Select *Contacts* to be associated to this *Event*. -* *Leads* – Select *Leads* to be associated to this *Event*. -* *Events* – Select an *Event* to associate that *Event's* delegates to -this *Event*. - -\5. Once an option has been chosen a new pop-up box will appear to -search and select records from the module type that was chosen. - -\6. The Delegates sub-panel will populate with the records selected. - -image:225Delegates.png[225Delegates.png,title="225Delegates.png"] - -[[sending-invites-to-delegates]] -Sending Invites To Delegates -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -\1. Navigate to the Delegates sub-panel. - -\2. Choose action 'Send Invites'. - -image:226Send_invites.png[226Send_invites.png,title="226Send_invites.png"] - -\3. This will send the email template selected in the 'Email Invite -Template' to all Delegates who have the status 'Not Invited' - -\4. Once selected the Delegate status will automatically update to -'Invited'. - -https://suitecrm.com/wiki/media/image163.png[https://suitecrm.com/wiki/media/image163.png] - -\5. Choosing 'Resend Invites' will send invites out to all Delegates -associated to the Event who have yet to respond. - -[[managing-delegates-acceptance-manually]] -Managing Delegates Acceptance Manually -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -\1. Navigate to the Delegates sub-panel. - -\2. Select the Delegates that require your 'Accept Status' to be -updated. - -\3. Choose action 'Manage Acceptances' - -image:227Manage_acceptances.png[227Manage_acceptances.png,title="227Manage_acceptances.png"] - -\4. A list of options will appear. Select appropriate statuses: - -image:228Acceptances.png[228Acceptances.png,title="228Acceptances.png"] - -\5. This will update the Delegates 'Accept Status' accordingly. - -image:229Accepted.png[229Accepted.png,title="229Accepted.png"] - -_Note: Acceptance will my automatically updated if the Delegate chooses -to accept using the link provided in the email template._ - -[[updating-delegates-status-manually]] -Updating Delegates Status Manually -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -\1. Navigate to the Delegates sub-panel. - -\2. Select the Delegates that require your attendance to be updated. - -\3. Choose action 'Manage Delegates' - -image:230Manage_delegates.png[230Manage_delegates.png,title="230Manage_delegates.png"] - -\4. A list of options will appear. Select the appropriate status; -Invited, Not Invited, Attended or Not Attended. - -image:231Manage_delegates.png[231Manage_delegates.png,title="231Manage_delegates.png"] - -\5. This will update the Delegates 'Status' accordingly. - -image:232Updated_status.png[232Updated_status.png,title="232Updated_status.png"] - -_Note: Acceptance will be automatically updated if the Delegate chooses -to accept using the link provided in the email template._ - -[[advanced-open-reports]] -Advanced Open Reports -~~~~~~~~~~~~~~~~~~~~~ - -Advanced Open Reports (AOR) is the reporting module within SuiteCRM. AOR -can be accessed by clicking the 'Reports' link within the navigation -menu. The reporting module allows users to report on CRM data from any -module and has many features to display key information quickly. - -[[creating-reports]] -Creating Reports -^^^^^^^^^^^^^^^^ - -To create a report, hover over the Reports module on the navigation bar -and select 'Create Report'. - -image:152Create_report.png[152Create_report.png,title="152Create_report.png"] - -You will be presented with the report Edit View. To obtain a list of -fields to add to the report, you have to select a module from the Report -Module drop down. - -image:153Reports_edit_view.png[153Reports_edit_view.png,title="153Reports_edit_view.png"] - -*Adding Fields* - -Once you have selected a Report Module, the list of fields available -will display on the left panel. You can add fields to the 'Fields' -section of the report by expanding the module you wish to select fields -from and then drag and drop those fields into the field section. - -image:233Report_fields.png[233Report_fields.png,title="233Report_fields.png"] - -Once you have added fields to a Report, there are multiple options to -configure for those fields: - -* Display – True or false option. Allows you to specify whether this -field should be displayed on the report, or hidden. Users may wish to -add fields to perform a function/sort/group/total but may not wish to -show this on the Report.
- -* Link – True or false option. Allows you to make the field a link. -Setting this option to true will hyperlink the field on the Detail View -of the report, allowing you to click on the record. This will navigate -you to the appropriate record. For example, linking the Opportunity Name -will take you to the Detail View of that Opportunity.
- -* Label – This is the label that will be displayed for the Column/Field -on the Report. You can change the label from the default to any -alphanumerical value.
- -* Function - Provides five options: Count, Minimum, Maximum, Sum and -Average. Allows you to perform functions on alphanumerical fields. Users -may wish to calculate the average Opportunity Amount, or Count total -Opportunities at a given Sales Stage.
- -* Sort – Ascending or Descending. Allows you to select whether to sort -the field/column descending or ascending. This can be done for all -fields.
- -* Group – True or false option. Allows you to group by this field. For -example, you may wish to group by Sales Stage when reporting on an -Opportunity.
- -* Total – Provides three options: Count, Sum and Average. This allows -users to perform total calculations on numerical fields. This is useful -for financial reporting such as the total value of all Opportunities at -a given Sales Stage.
- -*Adding Conditions* - -Once you have added the fields to your Report, you can add condition -lines to the Report. You can add conditions with the same procedure as -adding fields. Using the drag and drop functionality, you can drag -fields into the 'Conditions' area which will add the field and allow you -to specify the condition for that field. - -[[charts]] -Charts -^^^^^^ - -You can add charts to Reports. Charts provide a visual representation of -the Report data to you. In some scenarios, or for particular users, -visual aids such as charts can assist quicker analysis and better -understanding. - -*Chart Types* - -There are six types of chart that the user can select to display Report -data. These are: - -* Pie Chart -* Bar Chart -* Line Chart -* Radar Chart -* Stacked Bar -* Grouped Bar - -
To add a chart, you can click the 'Add Chart' button, below the -Conditions section within the Report Edit View. - -image:234Add_chart.png[234Add_chart.png,title="234Add_chart.png"] - -Once you click add chart, you will be presented with the option to -specify the following information: - -* Title – Allows the user to specify the title for the chart. This will -show on the Detail View of the Report and also on the dashlet chart. -* Type – This allows the user to select from one of the six chart types -detailed above. -* X Axis – Allows the user to select the column that should be used for -the X Axis. -* Y Axis – Allows the user to select the column that should be used for -the Y Axis. - -image:235Making_chart.png[235Making_chart.png,title="235Making_chart.png"] - -Once you have specified the chart details, save the Report. This will -display the chart on the Detail View of the Report, below the list of -records returned. - -image:image176.png[image176.png,title="image176.png"] - -[[reports-dashlets]] -Reports Dashlets -^^^^^^^^^^^^^^^^ - -You can display a Report within a dashlet. It is possible to view -multiple Report results as you can add multiple Report dashlets and -select different Reports within each dashlet. To do this, add the -Reports dashlet to your homepage. - -image:156Add_dashlet.png[156Add_dashlet.png,title="156Add_dashlet.png"] - -image:157Reports_dashlet.png[157Reports_dashlet.png,title="157Reports_dashlet.png"] - -Once you have added the dashlet, you need to select the Report you wish -to display within the dashlet. To do this, click the pencil icon to edit -the dashlet. - -image:158Choose_report.png[158Choose_report.png,title="158Choose_report.png"] - -This allows the user to select the Report they wish to display within -the dashlet. - -image:159Report_dashlet_results.png[159Report_dashlet_results.png,title="159Report_dashlet_results.png"] - -Once you have selected the Report, click 'Save'. This will update your -Reports dashlet to show the results of the Report. - -_Note: For full details on adding and managing dashlets, see the -link:#Dashlets[Dashlets] section of this user guide._ - -[[reports-charts-dashlets]] -Reports Charts Dashlets -^^^^^^^^^^^^^^^^^^^^^^^ - -You can specify to only select to display a chart for Report dashlets. -To do this, edit your Report dashlet and select the 'Only use charts' -option. This will then list all charts you have created for this Report. - -https://suitecrm.com/wiki/media/image182.png[https://suitecrm.com/wiki/media/image182.png] - -Select a chart or multiple charts and click 'Save'. This will display -the results in the chart selected. - -https://suitecrm.com/wiki/media/image183.png[https://suitecrm.com/wiki/media/image183.png] - -[[scheduled-reports]] -Scheduled Reports -^^^^^^^^^^^^^^^^^ - -You can schedule reports to be automatically run and emailed to the -required Contact(s). This allows users to schedule reports to be sent to -Managers or Team Leads either Daily, Weekly or Monthly. To create a -Scheduled Report, you can click the 'Create' option within the Scheduled -Reports Sub-panel on the Detail View of the Report. You can also select -existing Scheduled Reports to relate to the Report. - -image:236Scheduled_Reports.png[236Scheduled_Reports.png,title="236Scheduled_Reports.png"] - -Once you have clicked 'Create', there are options to set for the -Scheduled Report. Give the Scheduled Report a relevant name. In this -example, we will use 'Daily Opportunites Report for Managers'. - -image:161Scheduled_report_edit.png[161Scheduled_report_edit.png,title="161Scheduled_report_edit.png"] - -You can select the 'Advanced' option for report scheduling. This will -provide a cron notation style option. This is best suited for System -Administrators or advanced users. - -image:162Scheduled_report_edit.png[162Scheduled_report_edit.png,title="162Scheduled_report_edit.png"] - -Once you have entered a name and selected a schedule, click 'Save'. - -image:162Scheduled_report_edit.png[162Scheduled_report_edit.png,title="162Scheduled_report_edit.png"] - -Once you save the Scheduled Report record, this will display in the -Scheduled Reports subpanel within the Detail View of the Report. - -image:237Scheduled_report.png[237Scheduled_report.png,title="237Scheduled_report.png"] - -You can view when the Scheduled Report last ran by viewing the 'Last -Run' column/field on the sub-panel. This shows in a date/time format. - -https://suitecrm.com/wiki/media/image189.png[https://suitecrm.com/wiki/media/image189.png] - -[[reschedule]] -Reschedule -~~~~~~~~~~ - -[[rescheduling-a-call]] -Rescheduling a Call -^^^^^^^^^^^^^^^^^^^ - -To reschedule a Call, you can click the 'Reschedule' button on the -Detail View of a Call which has been defined as Outbound and Planned. - -image:164Reschedule_call.png[164Reschedule_call.png,title="164Reschedule_call.png"] - -[[defining-the-details]] -Defining the Details -^^^^^^^^^^^^^^^^^^^^ - -Clicking the Reschedule button will produce a pop up or dialogue box up. -This enables users to set the date and time for the rescheduled Call. - -image:238Reschedule_call.png[238Reschedule_call.png,title="238Reschedule_call.png"] - -You can also select a reason for the incomplete/unsuccessful Call from -the drop down list. Once the details have been defined, click the 'Save' -button to save the Call. - -image:239Reschedule_reason.png[239Reschedule_reason.png,title="239Reschedule_reason.png"] - -[[tracking-history]] -Tracking History -^^^^^^^^^^^^^^^^ - -Once Saved, the Call is rescheduled for the new date and time. you can -view all Call Reschedule history by clicking the 'Reschedule' tab on the -Calls Detail View. - -image:240Call_attempty_history.png[240Call_attempty_history.png,title="240Call_attempty_history.png"] - -[[altering-reasons-drop-down]] -Altering Reasons Drop Down -^^^^^^^^^^^^^^^^^^^^^^^^^^ - -System Administrator users can edit the reasons available in the -Reschedule pop-up using the drop down editor. The drop down list used is -called 'call_reschedule_dom'. - -[[summary-5]] -Summary -~~~~~~~ - -In this chapter we have covered the functionality of the advanced -modules. These modules have a very specific purpose - enabling users to -improve processes and efficiently report on and manage data. - -In the next chapter, we will cover some third party modules which are -part of the SuiteCRM product. These third party modules provide -additional functionality to you such as teams and location mapping. - -[[security-suitegroups]] -Security Suite (Groups) ----------------------- - -Security Suite allows control of what users can access. It allows -restricting sensitive data in SuiteCRM to specific teams (groups). -SecuritySuite comes loaded with options which allow you to configure it -to meet your exact needs. Choose from a number of automatic assignment -options to ensure that your users can always access the data that you -need. - -[[create-groups]] -Create Groups -~~~~~~~~~~~~~ - -System Administrators can add groups and roles or set up Security Groups -preferences in Security Suite Settings found at the top of the Admin -page. - -image:167Create_groups.png[167Create_groups.png,title="167Create_groups.png"] - -[[allow-non-admins-to-create-groups]] -Allow Non-admins to Create Groups -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -System Administrators can allow non-admin users to add groups to -records. This can be done by doing the following steps: - -1. Navigate to Configure Tabs. Add Security Groups to the displayed -tabs. -2. Run Repair Roles, within Admin->Repair, to be able to assign rights -to Security Groups. -3. Edit role(s) to Enable Security Groups Management. -4. Edit role(s) to set List to All or Group for Security Groups -Management as desired. - -[[configure-securitysuite-settings]] -Configure SecuritySuite Settings -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -SecuritySuite is very configurable and allows for support near every -possible situation. Because of that there may be a learning curve and -some time required to understand what each option does and how it may be -used for your specific needs. You can find the settings page by going to -Admin->SecuritySuite Settings. - -[[groups-setup]] -Groups Setup -~~~~~~~~~~~~ - -There are 3 key steps to setting up Groups so that you work correctly. - -1. Create a group for each team of users and add the appropriate users -to the group. -2. Create a role and select Group for the access level for every -appropriate cell in the grid. Assign that role to each group -3. Add the groups to records in your SuiteCRM instance. You can use the -Mass Assign on the List View to do this. Going forward the groups will -automatically inherit based on your SecuritySuite Settings. You can also -use logic hooks, workflow, or do a direct database insert into the -securitygroups_records table if doing a one-time initial setup. - -If your users should only typically see their own records then the role -assigned to the group would be configured to have Owner only rights. A -manager who is a part of the group, but who should see be able to see -all records in the group would have a role directly assigned to you -record that gives Group access. - -For more help check out: - -* https://www.sugaroutfitters.com/docs/securitysuite/example-of-a-typical-setup[Example -of a Typical Setup] -* https://www.sugaroutfitters.com/docs/securitysuite/introduction-video[Introduction -Video] - -Roles determine what a user can do with a record once they have access -to it. - -1. Create the roles -2. Edit role(s) to Enable Security Groups Management -3. Edit role(s) to set List to All or Group for Security Groups -Management as desired - -[[a-typical-hierarchy-setup]] -A Typical Hierarchy Setup -~~~~~~~~~~~~~~~~~~~~~~~~~ - -Although SecuritySuite can handle any organizational structure, the most -common scenario it is used for is one where the owner can sell -everything, managers can see both their own records and those of their -team, and team members can only see their own records. - -[[the-scenario]] -The Scenario -^^^^^^^^^^^^ - -This company has 2 sales teams; East and West. The owner, Jill, should -be able to see everything. The East Sales team is lead by Will and Sarah -leads the West Sales team. Both of them should see everything just in -your own respective teams. The rest of the Sales Reps in each teams -should only be allowed to see your own records. - -[[set-up-the-groups]] -Set up the Groups -^^^^^^^^^^^^^^^^^ - -1. Create a group called East Sales -2. Add Will and the Sales Reps -3. Create a group called West Sales -4. Add Sarah and the Sales Reps - -[[set-up-the-roles]] -Set up the Roles -^^^^^^^^^^^^^^^^ - -1. Create a role called Everything and set the rights to All._Tips and -Tricks: Click the header in any column on the role grid and you can set -the rights for the whole column at one time_ -2. Assign the Everything role directly to Jill's user account -3. Create a role called Group Only and set the rights for everything to -Group -4. Assign the Group role directly to Will and Sarah -5. Create a role called Owner Only and set the rights for everything to -Owner -6. Assign the Owner Only role to the East Sales and West Sales groups - -[[assign-the-groups]] -Assign the Groups -^^^^^^^^^^^^^^^^^ - -This instance already has some existing Leads so we will assign them to -the appropriate groups. - -1. Go to the Leads List View and search for the Leads that should -belong to the East Sales group -2. Check the appropriate Leads, in the Mass Assign panel choose East -Sales, and click "Assign" -3. Repeat for the West Sales team - -_Note: Going forward the groups will be automatically inherited by any -Calls, Contacts, Notes, etc that get added based on the SecuritySuite -Settings that are configured. If the SuiteCRM instance is already loaded -with lots of data at the time of starting with SecuritySuite then there -may be some initial work to be done to add those groups to the related -records. The Mass Assign functionality on the List View can be used or -direct database insertion into the securitygroups_records table. See -existing data in that table for how to format the data. This will -require SQL knowledge if you want to go that route._ - -[[check-the-settings]] -Check the Settings -^^^^^^^^^^^^^^^^^^ - -These settings determine how SecuritySuite functions. In the Group -Inheritance Rules panel the defaults of "Inherit from Created By User", -"Inherit from Assigned To User", and "Inherit from Parent Record" will -work perfectly in this scenario. - -Any Lead that gets created will automatically have groups assigned to it -based on who created it and who gets assigned to it. If a Call is -created for a Lead then the Call will inherit the groups from the Lead -record (parent record) along with inheriting the groups from the created -by user and the assigned to user. - -Another key setting is "Strict Rights". In the scenario above the -default settings will cause the links on the List View for the team -Leads to show with no link for records that are assigned to your group. -In many cases you will want to uncheck "Strict Rights" so that you can -assign groups in the manner described in this doc. - -[[thats-it]] -That's it! -^^^^^^^^^^ - -The hardest part is always the initial setup. Once you have things -configured and figured out it will just run on its own. - -Have a more complicated structure? Apply the same principles here for -each additional level of hierarchy that you may have. The key is to -create a group at the lowest levels of the structure and then work your -way back up. - -[[advanced-options]] -Advanced Options -~~~~~~~~~~~~~~~~ - -SuiteCRM System Administrators can configure many advanced options for -Security Suite. This allows you to control various access/rights, -inheriting of records, filters and more. - -image:168Security_group_management.png[168Security_group_management.png,title="168Security_group_management.png"] - -[[additive-rights]] -Additive Rights -^^^^^^^^^^^^^^^ - -User gets greatest rights of all roles assigned to you or user's -group(s) - -[[strict-rights]] -Strict Rights -^^^^^^^^^^^^^ - -If a user is a member of several groups only the respective rights from -the group assigned to the current record are used. - -[[new-user-group-popup]] -New User Group Popup -^^^^^^^^^^^^^^^^^^^^ - -When creating a new user show the SecurityGroups popup to assign you to -a group(s). - -[[user-role-precedence]] -User Role Precedence -^^^^^^^^^^^^^^^^^^^^ - -If any role is assigned directly to a user that role should take -precedence over any group roles. - -[[filter-user-list]] -Filter User List -^^^^^^^^^^^^^^^^ - -Non-admin users can only assign to users in the same group(s) - -[[use-popup-select]] -Use Popup Select -^^^^^^^^^^^^^^^^ - -When a record is created by a user in more than one group popup a group -selection screen otherwise inherit that one group. Inheritance rules -will only be used for non-user created records (e.g. Workflows, etc). - -[[use-creator-group-select]] -Use Creator Group Select -^^^^^^^^^^^^^^^^^^^^^^^^ - -Adds a panel to a record creation screen if a user is a member of more -than one inheritable group that allows a user to select one or more -groups that you belongs to that should be associated with the newly -created record. If a user is in just one group the normal inheritance -rules will instead be applied. - -_Note: The new record will still inherit from the Assigned To user or -Parent record if these options are set. This setting only overrides the -Created By setting._ - -[[shared-calendar---hide-restricted]] -Shared Calendar - Hide Restricted -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -By default users can see when other users are busy on the Shared -Calendar. Even if you doesn't have rights to the meeting, call, etc. It -will display on the calendar, but you cannot view more details unless -you have rights to that specific calendar item. By setting this option -you cannot see these items on the Shared Calendar; only items that you -actually has rights to. - -[[inherit-from-created-by-user]] -Inherit from Created By User -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The record will inherit all the groups assigned to you who created it. - -[[inherit-from-assigned-to-user]] -Inherit from Assigned To User -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The record will inherit all the groups of you assigned to the record. -Other groups assigned to the record will NOT be removed. - -[[inherit-from-parent-record]] -Inherit from Parent Record -^^^^^^^^^^^^^^^^^^^^^^^^^^ - -e.g. If a case is created for a contact the case will inherit the groups -associated with the contact. - -[[default-groups-for-new-records]] -Default Groups for New Records -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Set groups that should always be attached when a specific module is -created. - -[[inbound-email-account]] -Inbound email account -^^^^^^^^^^^^^^^^^^^^^ - -Locks down inbound email accounts in the email client to only list those -that belong to the same group as the current user. - -[[jjw-maps]] -JJW Maps --------- - -JJW Maps provides mapping functionality for SuiteCRM. JJW Maps is a -third party module, provided by http://www.jjwdesign.com/[JJW Design]. - -Documentation and releases are kept up to date on the -http://www.jjwdesign.com/google-maps-for-sugarcrm/[JJW Maps project -page]. - -[[troubleshooting-and-support]] -Troubleshooting and Support ---------------------------- - -At SalesAgility we are advocates of Open Source. As such please do not -contact us directly via email or phone for SuiteCRM support. Instead -please use our support forum. By using the -https://suitecrm.com/forum/suite-forum[forum] the knowledge is shared -with everyone in the community. Our developers answer questions on the -forum daily but it also gives the other members of the community the -opportunity to contribute. If you would like SalesAgility to customise -SuiteCRM specifically for your needs, or to provide a hosted and -supported CRM solution, then please use our -https://salesagility.com/contact-us[contact form]. - -[[summary-6]] -Summary -------- - -In this guide we have covered various areas of SuiteCRM from the basics -of logging in to the complexity of creating automated workflow -processes. This guide is a resource to visually assist users in -maximising your use of SuiteCRM. You can also visit the -https://suitecrm.com/forum/suite-forum[SuiteCRM Community Forums] where -there are various topics and a wealth of knowledge provided by the -SuiteCRM team and contributing community members. - -[[appendix-a]] -Appendix A ----------- - -[[contacts-field-list]] -Contacts Field List -~~~~~~~~~~~~~~~~~~~ - -image:Contacts.png[Contacts.png,title="Contacts.png"] - -[[leads-field-list]] -Leads Field List -~~~~~~~~~~~~~~~~ - -image:Leads.png[Leads.png,title="Leads.png"] - -[[targets-field-list]] -Targets Field List -~~~~~~~~~~~~~~~~~~ - -image:Targets.png[Targets.png,title="Targets.png"] - -[[accounts-field-list]] -Accounts Field List -~~~~~~~~~~~~~~~~~~~ - -image:Accounts.png[Accounts.png,title="Accounts.png"] - -[[opportunities-field-list]] -Opportunities Field List -~~~~~~~~~~~~~~~~~~~~~~~~ - -image:Opportunities.png[Opportunities.png,title="Opportunities.png"] - -[[products-field-list]] -Products Field List -~~~~~~~~~~~~~~~~~~~ - -image:Products.png[Products.png,title="Products.png"] - -[[product-categories-field-list]] -Product Categories Field List -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -image:Product_Categories.png[Product_Categories.png,title="Product_Categories.png"] - -[[quotes-field-list]] -Quotes Field List -~~~~~~~~~~~~~~~~~ - -image:Quotes.png[Quotes.png,title="Quotes.png"] - -[[invoices-field-list]] -Invoices Field List -~~~~~~~~~~~~~~~~~~~ - -image:Invoices.png[Invoices.png,title="Invoices.png"] - -[[contracts-field-list]] -Contracts Field List -~~~~~~~~~~~~~~~~~~~~ - -image:Contracts.png[Contracts.png,title="Contracts.png"] - -[[line-items-field-list]] -Line Items Field List -~~~~~~~~~~~~~~~~~~~~~ - -image:Line_Items.png[Line_Items.png,title="Line_Items.png"] - -[[groups-field-list]] -Groups Field List -~~~~~~~~~~~~~~~~~ - -image:Groups.png[Groups.png,title="Groups.png"] - -[[pdf-templates-field-list]] -PDF Templates Field List -~~~~~~~~~~~~~~~~~~~~~~~~ - -image:PDF_Templates.png[PDF_Templates.png,title="PDF_Templates.png"] - -[[cases-field-list]] -Cases Field List -~~~~~~~~~~~~~~~~ - -image:Cases.png[Cases.png,title="Cases.png"] - -[[notes-field-list]] -Notes Field List -~~~~~~~~~~~~~~~~ - -image:Notes.png[Notes.png,title="Notes.png"] - -[[calls-field-list]] -Calls Field List -~~~~~~~~~~~~~~~~ - -image:Calls.png[Calls.png,title="Calls.png"] - -[[emails-field-list]] -Emails Field List -~~~~~~~~~~~~~~~~~ - -image:Emails.png[Emails.png,title="Emails.png"] - -[[meetings-field-list]] -Meetings Field List -~~~~~~~~~~~~~~~~~~~ - -image:Meetings.png[Meetings.png,title="Meetings.png"] - -[[tasks-field-list]] -Tasks Field List -~~~~~~~~~~~~~~~~ - -image:Tasks.png[Tasks.png,title="Tasks.png"] - -[[projects-field-list]] -Projects Field List -~~~~~~~~~~~~~~~~~~~ - -image:Projects.png[Projects.png,title="Projects.png"] - -[[project-tasks-field-list]] -Project Tasks Field List -~~~~~~~~~~~~~~~~~~~~~~~~ - -image:Project_Tasks.png[Project_Tasks.png,title="Project_Tasks.png"] - -[[campaigns-field-list]] -Campaigns Field List -~~~~~~~~~~~~~~~~~~~~ - -image:Campaigns.png[Campaigns.png,title="Campaigns.png"] - -[[target-lists-field-list]] -Target Lists Field List -~~~~~~~~~~~~~~~~~~~~~~~ - -image:Target_Lists.png[Target_Lists.png,title="Target_Lists.png"] - -[[email-templates-field-list]] -Email Templates Field List -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -image:Email_Templates.png[Email_Templates.png,title="Email_Templates.png"] - -[[documents-field-list]] -Documents Field List -~~~~~~~~~~~~~~~~~~~~ - -image:Documents.png[Documents.png,title="Documents.png"] - -[[events-field-list]] -Events Field List -~~~~~~~~~~~~~~~~~ - -image:Events.png[Events.png,title="Events.png"] - -[[locations-field-list]] -Locations Field List -~~~~~~~~~~~~~~~~~~~~ - -image:Locations.png[Locations.png,title="Locations.png"] - -[[users-field-list]] -Users Field List -~~~~~~~~~~~~~~~~ - -image:Users.png[Users.png,title="Users.png"] - -[[security-groups-field-list]] -Security Groups Field List -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -image:Security_Groups.png[Security_Groups.png,title="Security_Groups.png"] diff --git a/_source/wikifiles/User Guide.wiki b/_source/wikifiles/User Guide.wiki deleted file mode 100644 index 2308b3dde..000000000 --- a/_source/wikifiles/User Guide.wiki +++ /dev/null @@ -1,4433 +0,0 @@ -== The SuiteCRM Team and Community == -It is safe to say without the constant work from the SuiteCRM Team and Community, I would not have had the drive and commitment to sit down and write this user guide. New functionality and improvements to the core product are constantly added to make SuiteCRM the best Open Source CRM product in the world, and to compete with proprietary CRM vendors such as SugarCRM, Salesforce and Microsoft. - -As for The SuiteCRM Community - they provide bug reports, bug fixes and bug testing. The Community is at the heart of any Open Source project and this is no different with SuiteCRM. With each new release the community grows and with it grow the benefits of the Open Source ecosystem. - -= What is SuiteCRM? = -SuiteCRM is a software fork of the popular [https://en.wikipedia.org/wiki/Customer_relationship_management Customer Relationship Management] (CRM) system [https://en.wikipedia.org/wiki/SugarCRM SugarCRM], developed and maintained by SalesAgility. It is a free and open source alternative application. It was released on October 21, 2013 as version 7.0. The latest production version at the time of publishing this User Guide is SuiteCRM 7.6.3. - -SuiteCRM has been downloaded more than 500,000 times since the original release. It has been adopted by NHS (National Health Service) England's Code for Health programme which seeks to foster open source in the NHS in England. - -The SuiteCRM project has stated that the every line of code released by the project will be open source. SuiteCRM project is intended to be an enterprise-class open source alternative to proprietary products. - -A project Roadmap is available that details planned enhancements. - -An active public support forum with more than 25,000 members is available for free support and is regularly monitored and updated by the Project team. - -A directory of extensions is available where both free and paid-for enhancements are available. - -The project maintains [https://suitecrmondemand.com/ SuiteCRM:OnDemand], a Software As A Service facility for users who seek a rapid deployment and maintenance free service. - -There will be no licensed software as part of the project managed by SalesAgility. All the code is free. All the code is available for free download. There is no hidden agenda to charge for access to the code. It is and always will be free and open source. There will be no paid-for versions. - -= Who is SalesAgility? = -SalesAgility is an ISO-accredited open source consultancy focused on Customer Relationship Management (CRM). An early adopter of SugarCRM Community Edition, SalesAgility are the creators and maintainers behind the SugarCRM fork – SuiteCRM. - - -SalesAgility have delivered more than 300 SuiteCRM and SugarCRM projects, and are known as a world class knowledge and expertise resource for open source CRM. Customers include governments, enterprises and small and medium sized business globally. - - -SalesAgility has a clear mission statement: - - -''"Our goal is to innovate and provide advanced SuiteCRM and SugarCRM solutions along with the industry’s leading customer service and support.'' - -''We believe that open source is in the best interest of our clients and we will continue to build, innovate, evangelise and provide best practice working models for the open source community."'' - -= What is in the User Guide? = -The SuiteCRM User Guide has been written for the end user. This guide covers the SuiteCRM User Journey from end-to-end. We will explore all areas from the basics of logging into the system to creating complex automated workflows and reports. - -The SuiteCRM User Guide is split into various chapters. These chapters are ordered so that you progress through you guide as you would logically in day to day CRM use. The chapters contain sub-sections which break down barriers for you, explaining how to optimise the use of the customer relationship management system to effectively manage sales data. - -Readers of the SuiteCRM User Guide do not need to have development knowledge or prior knowledge of SuiteCRM. It is advised that you are computer literate, that you are familiar with using your chosen web browser and that SuiteCRM has already been installed and configured. - -= Getting Started = -== Logging Into SuiteCRM == -SuiteCRM allows users to log in using your Username and Password, provided to you by the System Administrator. - -[[File:190Home screen.png]] - - -[[File:02Login with language.png]] - -Before logging into SuiteCRM, you can select the language you wish to use. There are many default languages for SuiteCRM and there are also additional language packs available for other languages around the world. - -Once you have chosen your language and have entered your user credentials, you will be able to click the Login button to access the CRM. - - -[[File:191Log in.png]] - -== Forgotten Password == -If you forget your CRM password and cannot access your CRM user account, you can use the 'Forgotten Password' feature to re-send your password to the email address associated to your user account. Clicking the 'Forgot Password?' link on the login form will display the forgotten password form. - -[[File:179Forgot password.png]] - -== Summary == -In this chapter we have demonstrated how to access SuiteCRM using the login form. We have also established how to use the forgotten password functionality to retrieve a users password in the event of the password being lost or forgotten. - - -In the next chapter we will cover the User Wizard, which allows you to set your preferences when using SuiteCRM. - -= User Wizard = -The User Wizard guides you through the configuration options available to you post login. This allows you to select many formats for data that will display in SuiteCRM, and these are specific to your user. - - -== Welcome to SuiteCRM == -The first step you will see is a simple welcome page that displays once you have logged in. Click 'Next' on this page to progress to configure your user preferences. - - -[[Image:04SuiteCRM welcome.png]] - -== Your Information == -On this screen you are able to provide information about yourself. When you provide this information, other users can view this information such as your Full Name, Email Address and Contact details. Fields marked with a red star(*) are required fields, and as such need to be filled in with valid data before you can progress. - -[[Image:05Welcome info.png]] - -Once you have filled in all information on this page, click 'Next' to progress to the next step in the wizard. - -== Your Locale == -On this screen, you are able to specify your preferred Locale settings. - -[[File:06SuiteCRM Locale.png]] - -== Currency Selection == -Select the Currency you wish to be displayed for all Currency fields within SuiteCRM. The Currency options are populated from the options added by the System Administrator. If there are Currency options you require but do not see, please contact your System Administrator. - -[[File:180Currency selection.png]] - -== Date Format == -Select the Date Format you wish to be displayed for all Date fields within SuiteCRM. There are many different date format options to select from, all of which are specific to your user. This date format will also apply to Date Time fields. - - -[[File:08Date format.png]] - -== Time Zone == -Select the Time Zone you wish to use within SuiteCRM. This allows you to tailor your use of SuiteCRM specific to where you are located globally. If you are travelling between various countries, you can change the Time Zone at any time in your User Preferences after you Wizard set-up, to allow you to view records in that Time Zone. - -[[File:09Time zone.png]] - -== Name Format == -Select the Name Format you wish to be displayed for all Name fields within SuiteCRM. This is applicable to the various 'Person' modules within SuiteCRM, and allows you to set your preferred name format dependent on your requirement. - - -[[File:181Name format.png]] - - -Once you have specified all of your Locale preferences, click 'Next' to progress to the final step/confirmation page of the User Wizard. - -== Final Step == -The final step of the User Wizard provides you with multiple useful links for learning more and obtaining further support from the SuiteCRM website and dedicated team. There is a 'Back' button if you have made any mistakes you wish to amend in previous steps. - -[[Image:image12.png]] - -Clicking 'Finish' will complete the User Wizard and will present you with SuiteCRM login form. - -== Summary == -In this chapter, we progressed through the User Wizard. This allows you to set your preferences when using SuiteCRM. - -In the next chapter, we will cover managing user accounts, which will discuss how to update user details, select themes, change passwords and more. - -= Managing User Accounts = -There are many configuration options available to users once logged into the system. You can view/modify your preferences by clicking on your name in the top right section of the navigation menu. - - -[[File:11User select.png]] - - -== User Profile Tab == -Once you have clicked to access your preferences, you will be taken to the 'User Profile' tab which gives an overview of you credentials such as Username, First Name, Last Name, Title etc. - - -[[File:12User profile.png]] - -== Password Tab == -Clicking on the 'Password' tab will navigate you to allow you to change your user account password. To change your password, specify a new password and confirm the new password. It is recommended that passwords are secure. The recommended minimum requirement is one upper case character, one lower case character, one numerical character and a minimum password length of 8 characters. - -[[File:13Password tab.png]] - -If you have forgotten your password and cannot login, you can use the forgotten password functionality detailed in the [[#Getting Started|Getting Started]] section of this User Guide. - -== Themes Tab == -You can easily manage the theme you are using to view SuiteCRM by navigating to the Themes Tab. This tab allows you to easily select the desired theme, and also shows a theme preview image (assuming this has also been provided with any third party or additional themes). - -[[Image:image16.png]] - -== Advanced Tab == -The Advanced tab provides you with you preferences that you set during the User Wizard process. This gives you the ability to change any of your user preferences, if there were any mistakes or if you require to amend these at a later date. - - -[[File:14Advanced tab.png]] - -== Resetting a Users Preferences == -You can reset your user preferences to the system default by clicking the 'Reset User Preferences' button on your profile. - - -[[File:15User preference.png]] - - -Clicking the button will prompt you to ensure you wish to reset your user preferences, with the following message: “Are you sure you want reset all of your user preferences? Warning: This will also log you out of the application.”. you can then click 'OK' or 'Cancel' to action appropriately. If you select 'OK' you will be logged out and will need to re-login to SuiteCRM application. - -== Resetting a Users home page == -You can reset your home page to the system default by clicking the 'Reset home page' button on your profile. This will reset both dashlet and dashboard preferences/layouts to the system default. - - -[[File:16Reset homepage.png]] - - -Clicking the button will prompt you to ensure you wish to reset your home page, with the following message: “Are you sure you want reset your home page?”. you can then click 'OK' or 'Cancel' to action appropriately. - -== Summary == -In this chapter, we covered managing a user account. This allows you to manage your information, modify/reset user preferences and more. - -In the next chapter, we will cover the Interface. The Interface is an integral part of SuiteCRM. With the knowledge of your Interface, you can progress to learning more about SuiteCRM functionality and processes. - -= User Interface = -Before we progress to understanding the structure and functionality of SuiteCRM, we will cover the areas of the User Interface so that you are familiar with terminology used when describing navigating SuiteCRM. There are many elements to the User Interface, so we have broken these down into various sections below. - - -== Navigation Elements == -The ability to easily view and navigate to areas of the CRM is key to improved productivity and user adoption. SuiteCRM has a clear UI which has various elements we will cover in this section. - -=== Top navigation menu === -The top navigation menu is the main menu users will use to navigate to modules to create and manage records. The standard layout for the top navigation is a list of 10 modules. The ordering for this menu is determined by the order of the modules in Admin → Display Modules and Subpanels. The top navigation menu has six elements. These are: - -* CRM Name – This is the name for the CRM which is specified on installation. This defaults to SuiteCRM. -* Module Menu – This lists or groups the modules, dependent on the user preference. This provides the ability for users to navigate to modules within the CRM. -* Desktop Notification Count – This shows the number of desktop notifications the user has not yet read. These can be managed by the user. For full details on Desktop Notifications, see the [[#Desktop Notifications|Desktop Notifications]] section within this user guide. -* Quick Create – Quick create allows the quick creation of key module records globally within the CRM. -* Global/Full Text Search – Allows users to search the CRM globally for records/data. -* User menu – This displays the user name for the user currently logged in. There is a drop down menu which gives users access to Employees, their profile, the about page and a link to logout. - - -[[File:17Navigation menu.png]] - - -To view a module, you can click on the module name. This will take you to the List View of that module. For full details on views, read the [[#Views|Views]] section of this user guide. - -Hovering over a module name will produce a drop down menu. This drop down menu displays the Actions and Recently Viewed records for that module. - -[[File:18Dropdown menu.png]] - - -You can edit records displayed in the Recently Viewed section of the drop down menu by clicking the pencil icon. This will direct you to the Edit View for that record. - -[[File:19Recently viewed.png]] - -There is also a grouped tab navigation structure for SuiteCRM. Users can set this option in their user preferences. For full details on modifying user preferences, see the [[#Managing User Accounts|Managing User Accounts]] section of this user guide. - - -[[File:20.png]] - - -The grouped tab navigation menu gives the user the ability to group modules within a tab such as the Sales Tab. - - -[[File:21Grouped tab.png]] - -=== Quick Create === -You can click the 'create' icon in the top navigation menu to access the Quick Create options. This is a list of commonly used modules with the ability to create new records within these modules from any location. - -[[File:22Quick create.png]] - -=== Sidebar === -The sidebar is part of the responsive theme and is a user configurable option. The sidebar can be expanded and collapsed by clicking on the button highlighted below. - -[[File:23Sidebar.png]] - -'''Actions''' - -This displays the Actions for the module you are currently viewing. For example, if you are viewing the Accounts module, the actions that display are: Create Account, View Accounts, Import Accounts. This provides you with one-click access to module actions. - -'''Recently Viewed''' - -This section displays the last 10 records you have viewed. This leaves a breadcrumbs trail so that previously viewed records can be quickly and easily accessed via the sidebar. There is also the option to click the pencil icon, which will take you directly to the Edit View of the record. - -== Home Page == -The home page is the first page that is displayed to you post-authentication. The home page has various elements that can be used and configured such as Dashlets, Dashboards and the Sidebar. - -=== Dashlets === -Dashlets are user-configurable sections displayed on the home page that give you a quick overview of your records and activity immediately after login. This is particularly useful for sales and support led teams as this reduces the number of clicks required to view/modify data. - -Dashlets can be dragged/dropped within the home page. You can add dashlets by clicking the 'Add Dashlets' link on the home page. - - -[[File:24Add dashlets.png]] - - -Clicking on the 'Add Dashlets' link on the home page will open up the Add Dashlets popup which allows users to select from a multitude of out of the box dashlets. - - -[[File:25Add dashlets.png]] - - -To add one of the dashlets, simply click on the dashlet link. This will add the dashlet to the user home page. The popup will remain if you add a dashlet, to allow users to add multiple dashlets. Once you have added your required dashlets, you can close the popup. - - -[[File:26Dashlet.png]] - - -You can modify dashlets by clicking the pencil icon on the desired dashlet. - - -[[File:27Modify dashlet.png]] - - -Clicking the pencil icon will display a popup. This popup will contain all of the options that are configurable for the dashlet. - - -[[File:28Configure dashlet.png]] - - -Once you have made the required changes in the dashlet configuration popup, you can click 'Save' to apply the changes, or cancel if you wish to revert to the current configuration. - -''Note: Some dashlets require the home page to be reloaded. For dashlets that require this, you will be notified.'' - -=== Dashboards === -Dashboards are new in SuiteCRM. These are configurable per user and can be added/removed similar to dashlets. To add a dashboard tab, you can click the 'Add Tab' link on the homepage. - - -[[File:29Add tab.png]] - - -Clicking on the 'Add Tab' link on the home page will open up the Add Tab popup which allows users to specify a name for the tab and also how many dashlet columns are required. You can opt for one, two or three columns. - - -[[File:192Add tab.png]] - - -Once you have specified the details for the dashboard tab, you can click 'Save'. You can also click 'Cancel' to undo any changes. Once you have saved your changes, the Dashboard Tab will be added and will display on the tab list on user Homepage. You can then add Dashlets to your new dashboard tab. - - -[[File:31New tab.png]] - - -If you wish to delete the dashboard tab, you can click the 'x' icon. This will prompt you to confirm the deletion and then subsequently remove the dashboard tab from your profile only. -Note: 'Suite Dashboard' is the standard dashboard tab which cannot be removed. You can however configure the dashlets that display on that dashboard tab. - -=== Activity Stream === - -The Activity Stream is an excellent way of keeping track of your colleague's interactions with SuiteCRM. By default the Activity Stream displays recent updates for the Opportunities, Contacts, Leads and Cases modules. Your organisation's Facebook and Twitter feeds can also be included in your Activity Steam dashlets if desired and this can be configurable by an Admin user. - -[[File:32Activity stream.png]] - -You can also comment about an update within the Activity Stream by clicking on the Reply button on the right side of the post. - -[[File:33Reply.png]] - -Your posts can also be deleted from the Activity Stream by clicking on the Delete button. - -[[File:34Delet3.png]] - -Your comment will appear under the original post and will also be timestamped. - -The Activity Stream is also a useful tool for internal messaging within your organisation, it is possible to send a message that will be broadcast to all users in your network. To do this type your message in the text field and click post. - -[[File:35Activity post.png]] - -Your colleagues will see this message and will be able to respond by clicking on the Reply button on the right side of the post. - -[[File:36Reply.png]] - -Their response will appear under your post, again with a timestamp. - -[[File:37Reply view.png]] - -== Search == -Searching is a vital aspect within the CRM as this allows you to quickly define what it is you want to see. Many CRM's will have large data sets so it is vital to you that you have a way to refine your search. In the following sub-sections we will cover the various searching options available to you. - -=== Global Search === -You can search all records within the CRM using the global search functionality. You can search for records via global search by using the search bar in the main navigation menu. - - -[[File:38Search.png]] - - -Once you have entered your search term, you can press the return key or click the magnifying glass/search icon. This will return records that match the search criteria and categorise them by the modules available. - - -[[File:39Search.png]] - - -Modules can be added to the global search functionality by the System Administrator. - -=== Full Text Search === -SuiteCRM has an option to enable or disable a full text global search. The full text global search is powered by [http://framework.zend.com/manual/1.12/en/zend.search.lucene.overview.html Zend Lucene] search framework. The search works very similar to the standard global search, but provides the enhanced functionality of searching text in documents and other files, compared to the record-level search provided by the standard global search. - -''Note: System Administrators can enable/disable the full text search by clicking on the AOD Settings link within the admin panel.'' - - -[[File:169AOD Settings.png]] - - -This will display the AOD option to enable/disable the full text search. - - -[[File:170Enable AOD.png]] - - -The search returns results slightly different to global search. Results are returned in order of score. Records are scored dependent on how well you match the search criteria provided by you – from 0-100%. - - -[[File:171Search results.png]] - -=== Basic Module Search === -Basic search is available on all modules within the CRM. Basic search, as standard, allows users to search on the record name. - - -[[File:193Search button.png]] - - -[[File:194Search box.png]]]] - - -Basic search also allows users to check the 'My Items' check box. Enabling this option will only return records that are assigned to you. - - -[[File:195Search my items.png]] - - -Once a user has searched for a record, the search will be saved. This means that you can navigate to records and other modules within the CRM but the search will not be cleared. If you wish to clear your search, you can click 'Clear' and then click 'Search'. This will clear any saved searches and return to the default result set for that module. - -''Note: System Administrators can modify which fields are searchable in Basic Search within Studio.'' - -=== Advanced Module Search === -Advanced Search is available on all modules within the CRM. Advanced Search provides you with a more detailed module search functionality. As standard, there are more fields available to you via Advanced Search. - - -[[File:196Advanced search.png]] - - -You can add further fields to the Advanced Search section by expanding the 'Layout Options' panel. - - -[[Image:image43.png]] - - -You can click the field you wish to display/hide and click the arrows to move these fields between sections. This allows users to display/hide columns to further customise the Advanced Search section. - -Advanced Searches may have many fields and specific criteria. For this reason, You can save your advanced search criteria to easily populate this in future. - - -[[File:197Save search.png]] - - -To load a saved search, you can select the saved search from the 'My Filters' drop down. This will return results that match the criteria specified in the saved search. - - -[[File:198Saved search.png]] - - -''Note: System Administrators can modify which fields are searchable in Advanced Search within Studio.'' - -== Views == -Within the CRM you will be presented with various views. These views are structured to present you with key information through the record management process. There are three main views: - -* List View -* Detail View -* Edit View - -All of these views have specific purposes and these are described in the sub-sections below. - -=== List View === -This is the view that you are presented with when you navigate to your desired module. - -[[File:40List view.png]] - -The List View compromises of many actions that you can carry out to manage records. These are: - - -* Search Records – provides you with the ability to perform basic and advanced searches, as covered previously in the [[#Search|Search]] section of this chapter. -* Sort Records – clicking on the column name will sort the record list by that column either ascending or descending, if sorting is enabled. -* View Records – clicking on any hyperlinked data will take you to the Detail View of the record. -* Edit Records – clicking the pencil icon will navigate you to the Edit View for that record. -* Delete Records – you can select records and then select the delete option to delete records from the module. -* Mass Update Records – you can select records and then select the mass update option to update data on all selected records. -* Merge Records – you can select records and select the merge option. This will begin the merge records processes. You can select a primary record and then can merge the data from the duplicate records into the primary record. Once saved, the duplicate records will be deleted and all data/history merged to the primary record. - -=== Detail View === -This is the view that you are presented with when you view a record. - - -[[File:41Detail view.png]] - - -The Detail View compromises of many actions that you can use to view/manage your data. These are specific to the Detail View of the module that you are viewing. There are standard actions on the Detail View for most modules. These are: - -* Edit – allows you to edit the record you are viewing. -* Duplicate – allows you to duplicate the record the are viewing. -* Delete – allows you to delete the record you are viewing. If a record is deleted, you will be redirected to the List View. -* Find Duplicates – allows you to begin the find duplicates process where you can use system functionality to find duplicate records. -* View Change Log – allows you to view changes to audited fields. - -''Note: To set fields as audited and for any changes to find duplicates, contact your System Administrator.'' - -Hyperlinked fields can be clicked on. This will navigate you to that record. - -The Detail View is tabbed in SuiteCRM. This means there is minimal scrolling and data is categorised for each module in the appropriate tab. - -''Note: System Administrators can select to display data in either tabs or panels. You can contact your system administrator for more information on managing layouts and views.'' - -=== Edit View === -This is the view that you are presented with when you edit a record. - - -[[File:42Edit view.png]] - - -The Edit View allows you to modify record information that is displayed on the view. This allows users to update existing data and also add/remove data. Once you have made changes on the Edit View, you can click 'Save' to apply to changes or click 'Cancel'. Clicking either options will redirect you to the Detail View of the record you are editing. You can click the 'View Change Log' button. This allows users to view changes to audited fields which can be useful before making your intended changes. - -== Record Management == -We have covered the several views that you are presented with so we will now move onto record management. In this section we will cover all areas of record management so that you can efficiently store and manage customer data. - -=== Creating Records === -You can create records within modules from various different areas of your Interface. Detailed below are screen shots of record creation points. - - -[[File:43Create record1.png]] - -[[File:44Create record2.png]] - -[[File:45Create record 3.png]] - - -Once you click the create button, you will be taken to the creation screen. This is essentially the Edit View that we have covered previously in the [[#User Interface|User Interface]] section. This allows you to fill in the appropriate data for that record. Fields with the red star(*) are required fields. Validation is performed so that a record cannot be saved within the CRM unless data is valid for required fields. - - -[[File:46Create contact.png]] - - -Once you have populated all data for the record, you can save the record which will create the record within the module in the CRM. Once saved, you will be redirected to the Detail View of the record you have created. - -=== Editing Records === -You can edit records within modules from various different areas of your Interface. Detailed below are screen shots of record editing points. - - -[[File:47Edit contact.png]] - - -[[File:48Edit contact.png]] - - -Once you click the edit button(or pencil), you will be taken to the Edit View. This allows you to edit/populate the appropriate data for that record. Fields with the red star(*) are required fields. Validation is performed so that a record cannot be saved within the CRM unless data is valid for required fields. - -Once you have edited/populated the record data, you can save the record which will update the existing record with the new data populated when editing. Once saved, you will be redirected to the Detail View of the record you have edited. - -=== Deleting Records === -You can delete records within modules from both the List View and Detail View. Detailed below are screen shots of record editing points: - -'''Detail View Deletion method''' - -Deleting records from the Detail View is a simple process. You simply have to click the 'Delete' button. - - -[[File:49Delete contact.png]] - - -When you click the delete button on a record, you will receive a popup which will ask you to confirm that you want to delete the record. - - -[[File:50Delete contact.png]] - - -You can either click Cancel or OK. Clicking Cancel will revert you back to the Detail View of the record and will not delete it. Clicking OK will action the record deletion. If you choose to delete the record, the record will be deleted and you will be redirected to the module List View. - -'''List View Deletion method''' - -To delete records from the List View, you can select records using the checkbox option on the left hand side of the view. It is possible to select single records or use the 'Select this Page' or 'Select All' options, to select all records from the page or all records within the module. - - -[[File:51ListView deletion.png]] - - -Once the records are selected to delete, you can click the 'Delete' button. When you click the delete button on a record, you will receive a popup which will display the number of records being deleted and ask you to confirm that you want to delete the record. - - -[[Image:image59.png]] - - -You can either click Cancel or OK. Clicking Cancel will revert you back to the Detail View of the record and will not delete it. Clicking OK will action the record deletion. If you choose to delete the record, the record will be deleted and you will be redirected to the module List View. - -=== Mass Updating Records === -You can mass update records from the List View of any module, given this option is made available to you. To mass update records, you have to check the records in the List View and then select the 'Mass Update' option from the dropdown menu (next to the delete link). - - -[[File:52Mass update records.png]] - - -Clicking the mass update option will display a screen at the bottom of the List View. This will list all fields that can be mass updated by you. - - -[[File:53Mass update.png]] - - -Once you have populated the fields you wish to mass update, you can either click 'Update' or 'Cancel'. Cancelling the mass update will cancel any changes and redirect you to the List View of the module. Clicking update will update all selected records with the changes specified in the [[#Mass Updating Records|Mass Updating Records]] section. - - -[[File:54Mass update.png]] - -=== Merging Records === -You can merge records from the List View of any module, given this option is made available to you, or via the Detail View if you follow the 'Find Duplicates' process. - -To merge records, you have to check the records in the List View and then select the 'Merge' option from the dropdown menu (next to the delete link). - - -[[File:55Merge.png]] - - -Once you have clicked on the 'Merge' option, you will be presented with a merge screen. This will show the primary record and the duplicates that you wish to merge with that primary record. - - -[[File:182Merging records.png]] - -You can select which record is primary using the 'Set as primary' button on the right of the merge view. You can move data from the duplicate records to the primary record using the '<<' buttons. In this example, we have moved the First Name and Last Name from the duplicate record to the primary record. - -[[File:183Merging records.png]] - -Once you have made the required changes on the merge screen, you can click 'Save Merge' or 'Cancel'. Clicking cancel will discard the merge changes and will revert you to the List View for that module. Clicking 'Save Merge' will continue the Merge process and will prompt you to inform you that the duplicate record will be deleted. - - -[[File:184Save merge.png]] - - -You can click 'OK' or 'Cancel'. Clicking Cancel will discard the merge changes and will revert you to the List View for that module. Clicking 'OK' will save the merge and will redirect you to the Detail View for the merged record. - - -[[File:185Saved merge.png]] - - -As can be seen from the example, the merge has completed successfully. The First Name and Last Name have been updated, and all other data has been retained. - -=== Importing Records === -It is possible to import data easily by using SuiteCRM's easy-to-use User Import Wizard. There are many hints and tips as you progress through the Import Wizard on the requirements of importing data and for further steps in the Wizard. - -'''User Import Wizard features''' - -There are many features of the Import Wizard which make it easier for you to map data to CRM fields and also for future imports. These are: - -* Sample .csv file for easier import of data — Use the available sample .csv file as a template for import of files -* Retain settings from previous imports — Save/preserve import file properties, mappings, and duplicate check indexes from previous imports for ease of current data import process -* Ability to accept both database name and display labels of drop-down and multi-select field items — Field labels as well as database names are accepted and mapped during import, but only the field labels are displayed for ease of use -* Ability to accept both usernames and full names in user fields during import and export of data — Full names of Users displayed for Assigned To and other User-related fields in exported .csv file for easier identification of user records -* Ability to auto-detect file properties in import file — Upload import files without specifying file properties such as tab, comma, double and single quotes, date and time formats, making the process simpler and faster -* Ability to import contacts from external sources such as Google — Ability to import Google Contacts for person-type modules such as Contacts, Leads, and Targets, relate SuiteCRM records to Google Contacts, and communicate with Google Contacts from within SuiteCRM - -'''Steps to Import data''' - -''Note: Always import the Account data first and then import Contacts and other data related to Accounts (such as Meetings, Calls, Notes) to automatically create a relationship between the imported Account and Contacts and activity records related to the Account.'' - -Follow the steps listed below to import data for a module, such as Accounts: - -# Select Import from the Actions drop-down list in the module menu options. -# This displays Step 1 of the import process with a link to a sample Import File Template. -# Upload your import file to this page using the Browse button in the Select File field or, -# Optionally, download the available template, delete the existing data, input your data and upload to this page using the Browse button. -# Click Next. -# This displays Step 2 (Confirm Import File Properties). -# Auto-detection of imported data takes place at this step. -# Click View Import File Properties button to verify and change the data as needed, if you notice irregularities in the Confirm Import File Properties table. -# Click the Hide Import File Properties to collapse the panel. -# Click Next. -# This displays Step 3: Confirm Field Mappings. -# The table in this page displays all the fields in the module that can be mapped to the data in the import file. If the file contains a header row, the columns in the file map to matching fields. -# Check for correct mapping and modify if necessary. -# Map to all of the required fields (indicated by an asterisk). -# Click Next. -# This displays Step 4: Check for Possible Duplicates. -# Follow the instructions on this page. -# Step 4 also provides the option of saving the current import file properties, mappings, and duplicate check indexes for future imports. -# (Optionally) Save the import settings. -# Click Import Now. -# Click the Errors tab to check for errors in the process. Follow the instructions to fix problems (if any) and Click Import Again. -# This displays Step 1 of the import process. -# Follow all the steps in the wizard through Step 5. -# If the import was successful, you can to view all the imported records at Step 5. -# Click Undo Import if you are not satisfied with the imported records, -# Or, click Import Again to import more data -# Or, click Exit to navigate to the List View page of the module that you imported your records into. - -=== Exporting Records === -You can export SuiteCRM records in .csv format. When you exports records from the CRM, you will be provided with the .csv file to download when the export has finished executing. You can save and open this file in applications such as Libre Office Calc or Microsoft Office Excel. - -The .csv file displays in a tabular format with columns and rows. When data is exported from the CRM, the record ID is included with all other fields that are specified in the export list for that module. You can then use the record ID as a reference for performing a 'Create new records and update existing records' import, as detailed in the [[#Importing Records|Importing Records]] section of the user guide. - -''Note: When exporting values from drop-down lists, SuiteCRM exports the ID associated with each option and not the display labels. For example, if a drop down list has options labelled High, Medium and Low with an ID of 1, 2 and 3 – the .csv file will show the drop down options as 1, 2 or 3.'' - -'''Steps to Export Records''' - -# Select the records from the List View on the module's home page. -# Select Export from the Actions drop-down menu in the List View. -# To export all records listed on the page, click Select located above the item list and select one of the following options: -# This Page. To export all the records listed on the page, select this option. -# All Records. To export all records on the list (if it is more than a page long), select this option. -# This displays an Opening.csv dialog box. -# Select Open to open the export file in .csv format or select Save to Disk to save the .csv file to your local machine. -# Click OK to execute the operation. If you chose to open the file, the csv file opens in Microsoft Excel. -# The file contains all the fields in the module from which you are exporting the data. - -== In-line Editing == -In-line editing gives you the ability to change values “on the fly”. In-line editing has been implemented on both List View and Detail View, providing an advantage to users wishing to change field values quickly, reducing the number of clicks/processes that would normally be taken to edit the full record. - -''Note: In-line editing can be enabled/disabled for both List View and Detail View. This can be done in the main System Settings for the CRM, by the System Administrator.'' - - -[[File:186In-line editing.png]] - - -=== List View In-line Editing === -You can edit record information on the List View of a module using in-line editing by clicking on a field where the pencil icon is shown. - - -[[File:60ListView editing.png]] - - -You can either click on the pencil icon, or double click on the field to edit the value. - - -[[File:61ListView editing.png]] - -Once you have made the required change to the field value, you can either press Return or click on the 'tick'. This will save your changes. If you navigate away without making any changes, you will see a prompt warning you that you have made unsaved changes to the field being edited. - -[[Image:image71.png]] - - -You can either click cancel and continue editing and saving your change, or you can click OK which will discard the changes made. - -=== Detail View In-line Editing === -Similar to List View, you can edit record information on the Detail View of a module using in-line editing by clicking on a field where the pencil icon is shown. - - -[[File:62DetailView Editing.png]] - - -You can either click on the pencil icon, or double click on the field to edit the value. - - -[[File:63DetailView editing.png]] - - -Once you have made the required change to the field value, you can either press Return or click on the 'tick'. This will save user changes. If you navigate away without making any changes, you will see a prompt warning you that you have made unsaved changes to the field being edited. - - -[[Image:image74.png]] - - -You can either click cancel and continue editing and saving your change, or you can click OK which will discard the changes made. - -== Desktop Notifications == -=== Enabling Desktop Notifications === -You can enable desktop notifications by accessing the 'Advanced' tab within your user preferences. This will enable desktop notifications only for that browser on that computer. you can choose to enable the desktop notifications just for that browser session, or to always enable desktop notifications. - -''Note: Users will have to enable desktop notifications on all browsers and computers if you use more than one.'' - - -[[File:199Enable desktop notifications.png]] - - -Once desktop notifications have been enabled, users will receive notifications for any Calendar events such as: - -* Meetings – Meetings you have been invited to that have popup reminders set. -* Calls – Calls you have been invited to that have popup reminders set. - -=== Managing Desktop Notifications === -If you have no notifications, the notification count will show '0' to tell you you currently have no notifications to check. - - -[[File:65Managing notifications.png]] - - -If you do not click on a desktop notification when it is displayed in the browser, for example you are AFK(Away From Keyboard) your notifications will be added to the notification list which shows as a count on the main navigation bar. - - -[[File:66Managing notifications.png]] - - -You can manage your desktop notifications by clicking the icon which will show any existing notifications. - - -[[File:67Managing notifications.png]] - - -You can either click the notification which will take you to the record the notification is related to or you can click the small 'x' icon to clear you immediately. - -== Summary == -In this chapter, we covered all elements of the SuiteCRM user interface. There are many elements which you can use to optimise your navigation and data management, to increase productivity. - -In the next chapter, we will look at modules. Modules are the data entities within SuiteCRM which can be standalone, or related to one or many other modules. Each module has a different function but many modules work together to structure and automate day to day business processes. - -= Core Modules = -== Accounts == -The Accounts module is the centralised base from which you can create an association with most records in SuiteCRM. It is possible to create a relationship with Contacts, Converted Leads, Opportunities, any Activity such as Emails or Meetings and Cases. Accounts in SuiteCRM will typically hold all information specific to a company that your organisation will have a relationship with. In real world terms an Account may be a business entity that is a qualified Sales Prospect, Customer, Supplier or Re-seller and can be used to track all interactions that take place between these entities and your organisation. - -=== Accounts Actions === -You can access the accounts actions from the Accounts module menu drop down or via the Sidebar. The Accounts actions are as follows: - -* Create Account – Once clicked, a new form is opened in Edit View to allow you to create a new Account record. -* View Accounts – Once clicked, you will be redirected to the List View for the Accounts module. This allows you to search and list Accounts records. -* Import Accounts – Redirects you to the Import Wizard for the Accounts module. For more information, see [[#Importing Records|Importing Records]]. - -To view the full list of fields available when creating an Account, See [[#Accounts Field List|Accounts Field List]]. - -=== Managing Accounts === -* To sort records on the Accounts List View, click any column title which is sortable. This will sort the column either ascending or descending. -* To search for a Account, see the [[#Search|Search]] section of this user guide. -* To update some or all the Accounts on the List View, use the Mass Update panel as described in the [[#Mass Updating Records|Mass Updating Records]] section of this user guide. -* To duplicate a Account, you can click the Duplicate button on the Detail View and then save the duplicate record. -* To merge duplicate Accounts, select the records from the Accounts List View, click the Merge link in the Actions drop-down list, and progress through the merge process. For more information on Merging Duplicates, see the [[#Merging Records|Merging Records]] section of this user guide. -* To delete one or multiple Accounts, you can select multiple records from the List View and click delete. you can also delete a Account from the Detail View by clicking the Delete button. For a more detailed guide on deleting records, see the [[#Deleting Records|Deleting Records]] section of this user guide. -* To view the details of a Account, click the Account Name in the List View. This will open the record in Detail View. -* To edit the Account details, click Edit icon within the List View or click the edit button on the Detail View, make the necessary changes, and click Save. -* For a detailed guide on importing and exporting Accounts, see the [[#Importing Records|Importing Records]] and [[#Exporting Records|Exporting Records]] sections of this user guide. -* To track all changes to audited fields, in the Account record, you can click the View Change Log button on the Account's Detail View or Edit View. - -== Contacts == -In SuiteCRM a Contact is an individual who is typically associated with an Account (organisation) or Opportunity (qualified prospect). For example if Techco is the Account, then John Smith, Sales Manager of Techco is the Contact. This module holds all information relating to these individuals and also provides a vantage point for any history relating to a Contact record, for example if they were involved in a Meeting, raised a Case or sent an Email. - -=== Contacts Actions === -You can access the Contacts actions from the Contacts module menu drop down or via the Sidebar. The Contacts actions are as follows: - -* Create Contact – A new form is opened in Edit View to allow you to create a new Contact record. -* View Contacts – Redirects you to the List View for the Contacts module. This allows you to search and list Contact records. -* Import Contacts – Redirects you to the Import Wizard for the Contacts module. For more information, see [[#Importing Records|Importing Records]]. - -To view the full list of fields available when creating an Contact, See [[#Contacts Field List | Contacts Field List]]. - -=== Managing Contacts === -* To sort records on the Contacts List View, click any column title which is sortable. This will sort the column either ascending or descending. -* To search for a Contact, see the [[#Search|Search]] section of this user guide. -* To update some or all the Contacts on the List View, use the Mass Update panel as described in the [[#Mass Updating Records|Mass Updating Records]] section of this user guide. -* To duplicate a Contact, you can click the Duplicate button on the Detail View and then save the duplicate record. -* To merge duplicate Contacts, select the records from the Contacts List View, click the Merge link in the Actions drop-down list, and progress through the merge process. For more information on Merging Duplicates, see the [[#Merging Records|Merging Records]] section of this user guide. -* To delete one or multiple Contacts, you can select multiple records from the List View and click delete. You can also delete a Contact from the Detail View by clicking the Delete button. For a more detailed guide on deleting records, see the [[#Deleting Records|Deleting Records]] section of this user guide. -* To view the details of a Contact, click the Contact Name in the List View. This will open the record in Detail View. -* To edit the Contact details, click Edit icon within the List View or click the edit button on the Detail View, make the necessary changes, and click Save. -* For a detailed guide on importing and exporting Contacts, see the [[#Importing Records|Importing Records]] and [[#Exporting Records|Exporting Records]] sections of this user guide. -* To track all changes to audited fields, in the Contact record, you can click the View Change Log button on the Contact's Detail View or Edit View. - -== Opportunities == -An Opportunity is a qualified Sales prospect with a likely chance that they will be able to do business with your company. You have established that they have buying power and have entered into the buying cycle. This module allows you to track your Opportunities throughout the Sales Pipeline until the deal is 'Closed Lost or 'Closed Won'. - -=== Opportunities Actions === -You can access the Opportunities actions from the Opportunities module menu drop down or via the Sidebar. The Opportunities actions are as follows: - -* Create Opportunity – A new form is opened in Edit View to allow you to create a new Account record. -* View Opportunities – Redirects you to the List View for the Opportunities module. This allows you to search and list Opportunity records. -* Import Opportunities – Redirects you to the Import Wizard for the Opportunities module. For more information, see [[#Importing Records|Importing Records]]. - -To view the full list of fields available when creating an Opportunity, See [[#Opportunities Field List|Opportunities Field List]]. - -=== Managing Opportunities === -* To sort records on the Opportunities List View, click any column title which is sortable. This will sort the column either ascending or descending. -* To search for a Opportunity, see the [[#Search|Search]] section of this user guide. -* To update some or all the Opportunities on the List View, use the Mass Update panel as described in the [[#Mass Updating Records|Mass Updating Records]] section of this user guide. -* To duplicate a Opportunity, you can click the Duplicate button on the Detail View and then save the duplicate record. -* To merge duplicate Opportunities, select the records from the Opportunities List View, click the Merge link in the Actions drop-down list, and progress through the merge process. For more information on Merging Duplicates, see the [[#Merging Records|Merging Records]] section of this user guide. -* To delete one or multiple Opportunities, you can select multiple records from the List View and click delete. You can also delete a Opportunity from the Detail View by clicking the delete button. For a more detailed guide on deleting records, see the [[#Deleting Records|Deleting Records]] section of this user guide. -* To view the details of a Opportunity, click the Opportunity Name in the List View. This will open the record in Detail View. -* To edit the Opportunity details, click the Edit icon within the List View or click the edit button on the Detail View, make the necessary changes, and click Save. -* For a detailed guide on importing and exporting Opportunities, see the [[#Importing Records|Importing Records]] and [[#Exporting Records|Exporting Records]] sections of this user guide. -* To track all changes to audited fields, in the Opportunity record, you can click the View Change Log button on the Opportunities Detail View or Edit View. - -== Leads == -In SuiteCRM a Lead is an unqualified contact usually generated from some form of marketing related event, for example it could be a person that has filled out a form on your website or someone that you met at a trade show and you are not sure yet if they have buying authority. Once a Lead is qualified and converted then it can be split into three parts; a Contact once you have established 'Who' it is, an Account when you know 'Where' they work and an Opportunity once it is known 'What' they might buy. - -=== Leads Actions === -You can access the Leads actions from the Leads module menu drop down or via the Sidebar. The Leads actions are as follows: - -* Create Lead – A new form is opened in Edit View to allow you to create a new Account record. -* View Leads – Redirects you to the List View for the Leads module. This allows you to search and list Lead records. -* Import Leads – Redirects you to the Import Wizard for the Leads module. For more information, see [[#Importing Records|Importing Records]]. - -To view the full list of fields available when creating a Lead, See [[#Leads Field List|Leads Field List]]. - -=== Managing Leads === -* To sort records on the Leads List View, click any column title which is sortable. This will sort the column either ascending or descending. -* To search for a Leads, see the [[#Search|Search]] section of this user guide. -* To update some or all the Leads on the List View, use the Mass Update panel as described in the [[#Mass Updating Records|Mass Updating Records]] section of this user guide. -* To duplicate a Lead, you can click the Duplicate button on the Detail View and then save the duplicate record. -* To merge duplicate Leads, select the records from the Leads List View, click the Merge link in the Actions drop-down list, and progress through the merge process. For more information on Merging Duplicates, see the [[#Merging Records|Merging Records]] section of this user guide. -* To delete one or multiple Leads, you can select multiple records from the List View and click delete. you can also delete a Lead from the Detail View by clicking the Delete button. For a more detailed guide on deleting records, see the [[#Deleting Records|Deleting Records]] section of this user guide. -* To view the details of a Lead, click the Lead Name in the List View. This will open the record in Detail View. -* To edit the Lead details, click Edit icon within the List View or click the edit button on the Detail View, make the necessary changes, and click Save. -* For a detailed guide on importing and exporting Leads, see the [[#Importing Records|Importing Records]] and [[#Exporting Records|Exporting Records]] sections of this user guide. -* To track all changes to audited fields, in the Lead record, you can click the View Change Log button on the Lead Detail View or Edit View. - -=== Converting a Lead === - -Once enough information is gathered about a Lead, then the Lead can be progressed to the next Sales stage and the Lead can be converted into a Contact, Account and Opportunity. -The way in which a Lead is converted depends on how the System Administrator has set up SuiteCRM. To convert a Lead with the default SuiteCRM setup you have to click on an individual Lead record to access the Detail View of the Lead and click on the arrow next to the Other button, then click on 'Convert Lead' from the drop-down menu shown in the image below: - -[[File:68Converting a lead.png]] - -Once you have clicked on 'Convert Lead' button then you will be taken to the Convert Lead page. - -=== Convert Lead to Contact === - -On this page you will be able to Create or Select Contact: - -[[File:69Convert lead to contact.png]] - -By deselecting the checkbox next to 'Create Contact' you will be able to associate the Lead to an existing Contact. -However, in most cases when converting a Lead there will be no existing Contact. Make sure the Create Contact checkbox is selected. Some of the fields will automatically be populated using the Lead information. Fill out the remaining relevant fields and move to the next Stage below: - -=== Convert Lead to Account === - -[[File:70Convert lead to account.png]] - -To create an Account from a converted Lead you will follow the same process as with a Contact, some information will populate from the Lead automatically, just complete the rest. - -=== Convert Lead to Opportunity === - -[[File:71Convert lead to opportunity.png]] - -To create an Opportunity from a converted Lead you will follow the same process as with a Contact, some information will populate from the Lead automatically, just complete the rest. - -=== Other Lead Conversion Options === - -Other records can be created when converting a Lead in the same way as Contacts/Accounts and Opportunities. - -[[File:72Convert lead options.png]] - -After you have completed the relevant sections click the Save button to confirm the changes. - -=== Duplicate Record Check === - -When converting a Lead SuiteCRM will automatically check for any duplicate records and will return a warning if a matching record is found. - - -[[File:73Duplicate record check.png]] - - -If you find that the duplicate warning is not valid and you still wish to create a new record, then click the Create button. Otherwise if you decide that the warning is correct and the record does already exist in the CRM then you should click on the Select button. - -== Calendar == -The Calendar module in SuiteCRM allows you to manage your time by scheduling Meetings, Calls and Tasks. Users may share their Calendar so they can allow others to view their upcoming activities. These activities will be displayed in the Calendar module given that the User concerned is a participant or the task has been assigned to them. - -=== Calendar Actions === -You can access the Calendar actions from the Calendar module menu drop down or via the Sidebar. The Calendar actions are as follows: - -* Schedule Meetings – A new form is opened in the Edit View of the Meetings module to allow you to create a new Meeting record. This record will display on the Calendar. -* Schedule Calls – A new form is opened in the Edit View of the Call module to allow you to create a new Call record. This record will display on the Calendar. -* Create Task – A new form is opened in the Edit View of the Tasks module to allow you to create a new Task record. This record will display on the Calendar. -* Today – Redirects you to the Day format of the Calendar for the current day. - -== Calls == -The Calls module in SuiteCRM allows Users to schedule and log a record of inbound and outbound calls that they may be a participant of. - -=== Calls Actions === -You can access the Calls actions from the Calls module menu drop down or via the Sidebar. The Calls actions are as follows: - -* Log Call – A new form is opened in Edit View to allow you to create a new Call record. -* View Calls – Redirects you to the List View for the Calls module. This allows you to search and list Call records. -* Import Calls – Redirects you to the Import Wizard for the Calls module. For more information, see [[#Importing Records|Importing Records]]. - -To view the full list of fields available when logging a Call, See [[#Calls Field List|Calls Field List]]. - -=== Managing Calls === -* To sort records on the Calls List View, click any column title which is sortable. This will sort the column either ascending or descending. -* To search for a Call, see the [[#Search|Search]] section of this user guide. -* To update some or all of the Calls on the List View, use the Mass Update panel as described in the [[#Mass Updating Records|Mass Updating Records]] section of this user guide. -* To duplicate a Call, you can click the Duplicate button on the Detail View and then save the duplicate record. -* To close a Call, click on the 'x' icon on the Calls List View. You can also close a Call by clicking the Close button on the Detail View of a Call. You can also click the Close and Create New button. This will close the Call you are viewing and redirect you to the Edit View to create a new record. -* To Reschedule a call, you can click the Reschedule button on the Detail View of a Call. For a detailed guide on rescheduling calls, see the [[#Reschedule|Reschedule]] section of this user guide. -* To delete one or multiple Calls, you can select multiple records from the List View and click delete. You can also delete a Call from the Detail View by clicking the Delete button. For a more detailed guide on deleting records, see the [[#Deleting Records|Deleting Records]] section of this user guide. -* To view the details of a Call, click the Call Subject in the List View. This will open the record in Detail View. -* To edit the Call details, click Edit icon within the List View or click the edit button on the Detail View, make the necessary changes, and click Save. -* For a detailed guide on importing and exporting Calls, see the [[#Importing Records|Importing Records]] and [[#Exporting Records|Exporting Records]] sections of this user guide. -* To track all changes to audited fields, in the Call record, you can click the View Change Log button on the Call Detail View or Edit View. - -== Meetings == -Like the Calls module, the Meetings module in SuiteCRM allows Users to create a record of any Meeting that they have been involved in. The Meeting scheduler allows a User to invite attendees, email invitees, set reminders, reschedule and relate to other modules including an Account, Contact, Project and many other Objects. This module has many more helpful functions that assist the User to plan and organise their Meetings. - -=== Meetings Actions === -You can access the Meetings actions from the Meetings module menu drop down or via the Sidebar. The Meetings actions are as follows: - -* Schedule Meeting – A new form is opened in Edit View to allow you to create a new Meeting record. -* View Meetings – Redirects you to the List View for the Meetings module. This allows you to search and list Meeting records. -* Import Meetings – Redirects you to the Import Wizard for the Meetings module. For more information, see [[#Importing Records|Importing Records]]. - -To view the full list of fields available when creating scheduling a Meeting, See [[#Meetings Field List|Meetings Field List]]. - -=== Managing Meetings === -* To sort records on the Meetings List View, click any column title which is sortable. This will sort the column either ascending or descending. -* To search for a Meeting, see the [[#Search|Search]] section of this user guide. -* To update some or all of the Meetings on the List View, use the Mass Update panel as described in the [[#Mass Updating Records|Mass Updating Records]] section of this user guide. -* To duplicate a Meeting, you can click the Duplicate button on the Detail View and then save the duplicate record. -* To close a Meeting, click on the 'x' icon on the Meetings List View. You can also close a Meeting by clicking the Close button on the Detail View of a Meeting. You can also click the Close and Create New button. This will close the Meeting you are viewing and redirect you to the Edit View to create a new record. -* To Reschedule a Meeting, you can click the Reschedule button on the Detail View of a Meeting. For a detailed guide on rescheduling Meetings, see the [[#Reschedule|Reschedule]] section of this user guide. -* To delete one or multiple Meetings, you can select multiple records from the List View and click delete. You can also delete a Meeting from the Detail View by clicking the Delete button. For a more detailed guide on deleting records, see the [[#Deleting Records|Deleting Records]] section of this user guide. -* To view the details of a Meeting, click the Meeting Subject in the List View. This will open the record in Detail View. -* To edit the Meeting details, click the Edit icon within the List View or click the edit button on the Detail View, make the necessary changes, and click Save. -* For a detailed guide on importing and exporting Meeting, see the Import and Export [[#Importing Records|Importing Records]] and [[#Exporting Records|Exporting Records]] sections of this user guide. -* To track all changes to audited fields, in the Meeting record, you can click the View Change Log button on the Meeting's Detail View or Edit View. - -== Emails == -The Emails module in SuiteCRM allows Users to view, store, compose, send and receive email from their own personal Email account or a shared inbox, for example a Support or Sales inbox. Emails can be related to Accounts, Cases, Contacts and many more records in the CRM. - -=== Emails Actions === -You can access the Emails actions from the Emails module menu drop down or via the Sidebar. The Emails actions are as follows: - -* View My Email – Redirects you to your mailbox so that you can view and manage emails displayed/imported to the CRM. -* Create Email Template - A WYSIWYG editor where you can create Emails by dragging and dropping components, inserting variables and amending the plain text. -* View Email Templates - Takes you to the List View page of your existing Email Templates. This allows you to search and list Email Template records. - -To view the full list of fields available for the Emails module, See [[#Emails Field List|Emails Field List]]. - -== Tasks == -SuiteCRM can assist Users with productivity, offering a way to record, relate and assign Tasks and to-do items that require action. - -=== Tasks Actions === -You can access the Tasks actions from the Tasks module menu drop down or via the Sidebar. The Tasks actions are as follows: - -* Create Task – A new form is opened in Edit View to allow you to create a new Task record. -* View Tasks – Redirects you to the List View for the Tasks module. This allows you to search and list Task records. -* Import Tasks – Redirects you to the Import Wizard for the Tasks module. For more information, see [[#Importing Records|Importing Records]]. - -To view the full list of fields available when creating a Task, See [[#Tasks Field List|Tasks Field List]]. - -=== Managing Tasks === -* To sort records on the Tasks List View, click any column title which is sortable. This will sort the column either ascending or descending. -* To search for a Task, see the [[#Search|Search]] section of this user guide. -* To update some or all of the Task on the List View, use the Mass Update panel as described in the [[#Mass Updating Records|Mass Updating Records]] section of this user guide. -* To duplicate a Task, you can click the Duplicate button on the Detail View and then save the duplicate record. -* To close a Task, click on the 'x' icon on the Tasks List View. You can also close a Meeting by clicking the Close button on the Detail View of a Task. You can also click the Close and Create New button. This will close the Task you are viewing and redirect you to the Edit View to create a new record. -* To delete one or multiple Tasks, you can select multiple records from the List View and click delete. You can also delete a Task from the Detail View by clicking the Delete button. For a more detailed guide on deleting records, see the [[#Deleting Records|Deleting Records]] section of this user guide. -* To view the details of a Task, click the Meeting Subject in the List View. This will open the record in Detail View. -* To edit the Task details, click Edit icon within the List View or click the edit button on the Detail View, make the necessary changes, and click Save. -* For a detailed guide on importing and exporting Tasks, see the [[#Importing Records|Importing Records]] and [[#Exporting Records|Exporting Records]] sections of this user guide. -* To track all changes to audited fields, in the Task record, you can click the View Change Log button on the Task's Detail View or Edit View. - -== Notes == -The Notes module in SuiteCRM can be used to keep a record of any comments, observations or explanations that a User may have relating internally to their organisation or relating to another SuiteCRM record such as an Account, Contact, Lead or many more. Notes are also used to keep record of interactions with Customers regarding Cases and Bugs. - -=== Notes Actions === -You can access the Notes actions from the Notes module menu drop down or via the Sidebar. The Notes actions are as follows: - -* Create Note or Attachment – A new form is opened in Edit View to allow you to create a new Note record (with attachment). -* View Notes – Redirects you to the List View for the Notes module. This allows you to search and list Note records. -* Import Notes – Redirects you will be taken to the Import Wizard for the Notes module. For more information, see [[#Importing Records|Importing Records]]. - -To view the full list of fields available when creating a Note, See [[#Notes Field List|Notes Field List]]. - -=== Managing Notes === -* To sort records on the Notes List View, click any column title which is sortable. This will sort the column either ascending or descending. -* To search for a Note, see the [[#Search|Search]] section of this user guide. -* To update some or all the Notes on the List View, use the Mass Update panel as described in the [[#Mass Updating Records|Mass Updating Records]] section of this user guide. -* To duplicate a Note, you can click the Duplicate button on the Detail View and then save the duplicate record. -* To delete one or multiple Notes, you can select multiple records from the List View and click delete. You can also delete a Note from the Detail View by clicking the Delete button. For a more detailed guide on deleting records, see the [[#Deleting Records|Deleting Records]] section of this user guide. -* To view the details of a Note, click the Note Subject in the List View. This will open the record in Detail View. -* To edit the Note details, click Edit icon within the List View or click the edit button on the Detail View, make the necessary changes, and click Save. -* For a detailed guide on importing and exporting Notes, see the [[#Importing Records|Importing Records]] and [[#Exporting Records|Exporting Records]] sections of this user guide. -* To track all changes to audited fields, in the Note record, you can click the View Change Log button on the Note's Detail View or Edit View. - -== Documents == -The Documents module can be used as a repository for Customer issued or internal files. This content can be uploaded, revised and viewed in addition to relating to individual records within SuiteCRM. - -=== Documents Actions === -You can access the Documents actions from the Documents module menu drop down or via the Sidebar. The Documents actions are as follows: - -* Create Document – A new form is opened in Edit View to allow you to create a new Document record. -* View Documents – Redirects you to the List View for the Documents module. This allows you to search and list Document records. - -To view the full list of fields available when creating a Document, See [[#Documents Field List|Documents Field List]]. - -=== Managing Documents === -* To sort records on the Documents List View, click any column title which is sortable. This will sort the column either ascending or descending. -* To search for a Document, see the [[#Search|Search]] section of this user guide. -* To update some or all the Documents on the List View, use the Mass Update panel as described in the [[#Mass Updating Records|Mass Updating Records]] section of this user guide. -* To duplicate a Document, you can click the Duplicate button on the Detail View and then save the duplicate record. -* To delete one or multiple Documents, you can select multiple records from the List View and click delete. You can also delete a Document from the Detail View by clicking the Delete button. For a more detailed guide on deleting records, see the [[#Deleting Records|Deleting Records]] section of this user guide. -* To view the details of a Document, click the Document Name in the List View. This will open the record in Detail View. -* To view an attachment, click the attachment link on the List View or Detail View of the Document. To update a document, you can create a Document Revision. -* To edit the Document details, click Edit icon within the List View or click the edit button on the Detail View, make the necessary changes, and click Save. -* For a detailed guide on importing and exporting Documents, see the [[#Importing Records|Importing Records]] and [[#Exporting Records|Exporting Records]] sections of this user guide. -* To track all changes to audited fields, in the Document record, you can click the View Change Log button on the Document's Detail View or Edit View. - -=== Document Revisions === - -== Targets == -Typically Targets are used as the recipients of a Marketing Campaign, your organisation knows very little about these individuals and they may be re-used for new Campaigns or deleted without any impact to the business. Your organisation will spend little resources on Targets and will usually be contacted en masse. Targets can be acquired from purchased email lists or gathered from trade shows your organisation has been present. The Targets module in SuiteCRM is used to store and manage information about these individuals. - -=== Targets Actions === -You can access the Targets actions from the Targets module menu drop down or via the Sidebar. The Targets actions are as follows: - -* Create Target – A new form is opened in Edit View to allow you to create a new Target record. -* View Targets – Redirects you to the List View for the Targets module. This allows you to search and list Target records. -* Import Targets – Redirects you will be taken to the Import Wizard for the Targets module. For more information, see [[#Importing Records|Importing Records]]. - -To view the full list of fields available when creating a Target, See [[#Targets Field List|Targets Field List]]. - -=== Managing Targets === -* To sort records on the Targets List View, click any column title which is sortable. This will sort the column either ascending or descending. -* To search for a Target, see the [[#Search|Search]] section of this user guide. -* To update some or all the Targets on the List View, use the Mass Update panel as described in the [[#Mass Updating Records|Mass Updating Records]] section of this user guide. -* To duplicate a Target, you can click the Duplicate button on the Detail View and then save the duplicate record. -* To delete one or multiple Targets, you can select multiple records from the List View and click delete. You can also delete a Target from the Detail View by clicking the Delete button. For a more detailed guide on deleting records, see the [[#Deleting Records|Deleting Records]] section of this user guide. -* To view the details of a Target, click the Target Name in the List View. This will open the record in Detail View. -* To edit the Target details, click Edit icon within the List View or click the edit button on the Detail View, make the necessary changes, and click Save. -* For a detailed guide on importing and exporting Targets, see the [[#Importing Records|Importing Records]] and [[#Exporting Records|Exporting Records]] sections of this user guide. -* To track all changes to audited fields, in the Target record, you can click the View Change Log button on the Target's Detail View or Edit View. - -== Target Lists == -The Target Lists module in SuiteCRM is used to separate Targets into groups, these can be groups of individuals that should be excluded from a particular Campaign, test groups or a list of Targets grouped by certain criteria, for example area or market an organisation works in. - -=== Target Lists Actions === -You can access the Target Lists actions from the Target Lists module menu drop down or via the Sidebar. The Target Lists actions are as follows: - -* Create Target List – A new form is opened in Edit View to allow you to create a new Target List record. -* View Target Lists – Redirects you to the List View for the Target Lists module. This allows you to search and list Target List records. - -To view the full list of fields available when creating a Target List, See [[#Target Lists Field List|Target Lists Field List]]. - -=== Managing Target Lists === -* To sort records on the Target List List View, click any column title which is sortable. This will sort the column either ascending or descending. -* To search for a Target List, see the [[#Search|Search]] section of this user guide. -* To update some or all the Target Lists on the List View, use the Mass Update panel as described in the [[#Mass Updating Records|Mass Updating Records]] section of this user guide. -* To duplicate a Target List, you can click the Duplicate button on the Detail View and then save the duplicate record. -* To delete one or multiple Target Lists, you can select multiple records from the List View and click delete. You can also delete a Target List from the Detail View by clicking the Delete button. For a more detailed guide on deleting records, see the [[#Deleting Records|Deleting Records]] section of this user guide. -* To view the details of a Target List, click the Target List Name in the List View. This will open the record in Detail View. -* To edit the Target List details, click Edit icon within the List View or click the edit button on the Detail View, make the necessary changes, and click Save. -* For a detailed guide on importing and exporting Target Lists, see the [[#Importing Records|Importing Records]] and [[#Exporting Records|Exporting Records]] sections of this user guide. -* To track all changes to audited fields, in the Target List, you can click the View Change Log button on the Target List's Detail View or Edit View. - -== Campaigns == -The Campaigns module in SuiteCRM can be a very powerful marketing and advertising tool for your organisation allowing you to create and track Newsletter, Email and non-email Campaigns to prospective or existing customers. With the tracking tools built into the Campaign module you can monitor the response you receive from your Campaign in real time, allowing you to view the return on investment (ROI) and many other useful metrics. This in turn helps you to plan your strategic marketing and advertising activities effectively by visualising which Campaigns work and which do not. -=== Campaign Actions === -You can access the Campaign actions from the Campaign module menu drop down or via the Sidebar. The Campaign actions are as follows: -*Create Campaign – This takes you to the Campaign Wizard page. -*View Campaigns – Redirects you to the List View for the Campaign module. This allows you to search and list Campaign records. -*Create Email Template – A WYSIWYG editor where you can create emails by dragging and dropping components, inserting variables and amending the plain text. -*View Email Templates – Takes you to the List View page of your existing Email Templates. This allows you to search and list Email Template records. -*View Diagnostics – Allows you to check that your Campaign Emails and Campaign schedulers are set up correctly. If this is the case then a green tick icon will appear, if there are any issues with the setup then a red cross icon will appear and you should contact your Admin for assistance. -*Create Person Form – A web form template Wizard allowing you to create Leads, Contacts and Targets. -*To view the full list of fields available when creating a Campaign, See [[#Campaign Fields List|Campaign Fields List]]. -=== Creating a Campaign via Campaign Wizard === -To create a Campaign and to begin the Campaign Wizard click on the Create Campaign button on the sidebar or module menu drop down while in the Campaign module. - -[[File:74Creating a campaign.png]] - -Alternatively click on the Create button at the top right of the screen when in the List View of the View Campaigns page. -Once you click Create Campaign then you will be presented with three options, Newsletter, Email and Non-email based Campaign. - -[[File:75Creating a campaign.png]] - -=== Campaign Wizard Header and Budget === -On clicking your selected Campaign icon you will be taken to the first page of the Campaign Wizard, the Campaign Header page. In this page you will be prompted to complete the required fields of Name and Status as well as having the opportunity to record any information you may wish to about your Campaign Budget (Campaign Budget is on a separate page for Non-email based Campaigns). - -[[File:76Creating a campaign.png]] - -Once you have completed the necessary fields and are ready to progress to the next stage then click Next. - -[[File:77Creating a campaign.png]] - -=== Campaign Wizard Subscriptions – Newsletter Campaigns Only === -For a Newsletter Campaign the next step of the Campaign Wizard allows you to specify your Subscription information. - -[[File:78Newsletter campaign.png]] - -This stage is made up of three components; the Subscription List, Unsubscription List and Test List. -*The Subscription List - Allows you to set a Target List for your Campaign. This Target List will be used to send out emails for this Campaign. If you have not already created a Target List then an empty list will be created for you and you can set this at a later time. -*The Unsubscription List - Allows you to set a Target List of individuals who have opted out of your marketing and should not be contacted through email. If you have not already created a Target List then an empty list will be created for you and you can set this at a later time. -*The Test List - Allows you to set a Target List to send out test emails for this Campaign. If you have not already created a Target List then an empty list will be created for you and you can set this at a later time. -Once you have completed the necessary fields then click Next and you will be taken to the Templates page which the next stage of the Campaign Wizard. - -=== Campaign Wizard Target Lists – Email and Non-Email Based Campaigns === -For all Email and non-email based Campaign the next step of the Campaign Wizard allows you to specify your Target Lists. For Email based Campaigns this is where you would choose a list of people to Email based on Existing Targets already created in the CRM. Or for Telesales (non-email based) Campaigns for example this could be a list of people that you would call. - -[[File:79E-mail campaign.png]] - -Recipients that have previously opted out of your marketing Campaigns will automatically be removed from your Target List. - -[[File:80E-mail campaign.png]] - -If you have not at this stage created a Target List you can create an empty one using the dropdown menu in the image above and populate it after you have completed the rest of your Campaign setup by visiting the [[#Target Lists |Target Lists]] page. -The next step for non-email based Campaigns is the [[#Campaign Summary|Campaign Summary]] page, Email based Campaigns however should move onto the Campaign Templates page. - -=== Campaign Wizard Templates === - -[[File:81Campaign template.png]] - -This page is a WYSIWYG Newsletter Template editor so you can create a template for your marketing emails. - -[[File:82Campaign template.png]] - -The panel at the top presents you with three options which allows you to select an existing template, create a brand new template or copy an existing template. -*Select an existing template – You can select from a drop down list of existing Email Templates -*Create a brand new template – If you wish to start the Newsletter from scratch then you can select this option. -*Copy an existing template – Allows you select an existing template and use this as a base to make amendments -Once you have chosen an Email Template you can decide you want to insert a Tracker URL. This can be used to insert a link to your organisation's website or direct link to a new product that you have launched. Also, you are given the opportunity to place an 'Opt Out' link in your template. - -[[File:83Campaign template.png]] - -Please note that the 'Opt Out' link is added to the template automatically even if you do not insert one at this point. -Another interesting feature of the Email Templates page is the ability to personalise your templates by inserting variables. You can for example insert the 'Account ID' variable in the subject line, or even insert the addressee's first name and last name to add a more personal touch. - -[[File:84Campaign template.png]] - -The WYSIWYG editor is displayed at the bottom of the Email Template page, this editor allows you to visualise how your template will actually look. - -[[File:85Campaign template.png]] - -The panel on the left side of the editor allows you to drag and drop different layout components to your template. These then can be edited in the right side display panel. Once you have inserted a component into the display panel you can click on the added item and the editor menu will appear. - -[[Image:Email Template Editor.png]] - -This menu provides you with a multitude of additional options which allows you to customise the layout and appearance of your template. Font type can be selected, formatted, colours changed, text alignment chosen, images and even videos can be inserted. - -Insert HTML by clicking Tools > Source Code - -The bottom panel offers the option to include attachments with your Email Template, this could be used if for example you wished to attach a something like a product catalogue to your Newsletter. -Once you are satisfied with your Email Template you can click Next and you will be taken to the Marketing page which is the next stage of the Campaign Wizard. - -=== Campaign Wizard Marketing === -[[File:87Campaign marketing.png]] - -This section of the Campaign Wizard allows you to specify the Email settings for your Campaign including the Bounce Handling Account, Outgoing Email Account, From/Reply-to Name and Address. In addition to this, you can Schedule your Campaign by completing the Date and Time fields. Once you are satisfied with your Email Settings and Schedule you can click Next and you will be taken to the Summary page which is the final stage of the Campaign Wizard. - -=== Campaign Wizard Summary === -[[Image:Newsletter Summary Review.png]] - -The Summary page includes a checklist which indicates that each page of the Campaign Wizard has been completed satisfactorily. If a section is complete then this is shown with green tick icon, otherwise this will be highlighted with a red cross icon. If any section has not been completed then SuiteCRM will not permit the Campaign to be sent. In this instance in the image shown above the 'Choose Targets' section has not been completed correctly as indicated by the red cross icon. This would be resolved by clicking back to the Target List page and specifying a Subscription List with at least one entry. Once you have ensured all sections are complete then you can choose one of three options: -*Send Mail at Scheduled Time – You can click this once you are sure all sections of the Campaign are set correctly and are confident that it is the finished article. -*Send Marketing Email as Test – This option gives you the opportunity to send out your Campaign to your Test List that you specified in the Subscriptions section of the Campaign Wizard. By doing this you can view the Campaign as a recipient and double check that the Campaign appears as it should do before sending out to real prospective/live customers. -*View Details – By clicking this option you are taken to the Detail View of the Campaign record you have just created through the Newsletter Campaign Wizard. - - -=== Create Person Form === -Another feature of the Campaign module is the web form template Wizard allowing you to create Leads, Contacts and Targets. This can be accessed by clicking on the Create Person Form button from the dropdown menu in the Campaign module or via the sidebar when in the module. - -[[File:88Create person form.png]] - -Once you have clicked this, you will be taken to the first page of the Create Person Form Wizard. - -[[File:89Create person form.png]] - -This stage allows you to specify the type of person you would like to create via your web form. The dropdown menu allows you to choose from a Lead, Contact or Target. On selecting the person type you would like to create the Available Fields dynamically change. Once you have chosen this you can drag and drop the fields you would like to include on your web form. Fields dropped into the First Form Column area are displayed on the left side of your web form and the fields dropped into the Second Form Column area are displayed on the right side of your web form. You can choose to have 1 or 2 columns, all on the left side, right side or on both sides. Please note as a minimum you need to include the required fields included in your web form as indicated by an asterisk. Once you are satisfied with the fields you wish to include click the Next button to progress to the next stage. - -=== Create Person Form – Additional Information === - -[[File:90Createperson form.png]] - -On this page you can configure your web form appearance by adding a Form Header/Footer, Form Description, change the label on the Submit button or change how the URL is displayed. As a minimum you have to relate the web form to an existing Campaign and assign to a User before clicking the Generate Form button to progress to the next stage. - -=== Create Person Form – Editor === - -[[File:91Createperson form.png]] - -The final step of the Create Person Form Wizard allows you to format the web form you have setup by using the WYSIWYG editor. This editor provides you with a multitude of additional options which allows you to customise the layout and appearance of your web form. Font type can be selected, formatted, colours changed, text alignment chosen and images can be inserted. Once you are happy with the appearance of your web form click Save Web Form. -On clicking this button you can either click on the link to download the web form you have just created or copy and paste the html to an existing document. By clicking the download link this will save the html form in your download folder. - -[[File:92Createperson form.png]] - -Please note that the web form will not be stored anywhere else on the CRM, to ensure the html is saved please carry out one of the two steps above. - -=== Campaign Response Tracking === -When in the Detail View of a Campaign record you can access the inbuilt Campaign response tracking by clicking the View Status button. - -[[File:93View status.png]] - -On clicking this button you will be taken to the Status page for that Campaign record. This page gives an overview of the Campaign details as well as a graphical representation of your Campaign response including the number of messages sent, bounced messages, how many viewers, opt outs and how many clicked through links. - -[[File:93Campaign response.png]] - -These fields are expanded further down the page and detailed on an individual record level. These records can be added to a new Target List by clicking the Add to Target List button. This allows you to create new, more focussed Campaigns based on who has responded. - -[[File:94Campaign response.png]] - -=== Campaign ROI Tracking === -When in the Detail View of a Campaign record you can access the inbuilt Campaign ROI tracking by clicking the View ROI button. - -[[File:95Campaign tracking.png]] - -On clicking this button you will be taken to the ROI page for that Campaign record. This page gives a graphical representation of your Campaign Return on Investment, allowing you to easily visualise how your organisation's money spent on the Campaign has translated into potential business. - -[[Image:Campaign ROI Graph.png]] - -== Cases == -In SuiteCRM Cases are used to record interactions with Customers when they ask for help or advice, for example in a Sales or Support function. A Case can be created, updated when a User is working on it, assigned to a colleague and closed when resolved. At each stage of the Case the User can track and update the incoming and outgoing conversation thread so a clear record of what has occurred is registered in the CRM. Cases can be related to individual records such as Accounts, Contacts and Bugs. - -=== Cases Actions === -You can access the Cases actions from the Cases module menu drop down or via the Sidebar. The Cases actions are as follows: - -* Create Case – A new form is opened in Edit View to allow you to create a new Account record. -* View Cases – Redirects you to the List View for the Cases module. This allows you to search and list Case records. -* Import Cases – Redirects you will be taken to the Import Wizard for the Cases module. For more information, see [[#Importing Records|Importing Records]]. - -To view the full list of fields available when creating a Case, See [[#Cases Field List|Cases Field List]]. - -Advanced functionality for Cases can be found in the [[#Advanced Open Cases with Portal|Advanced Cases]] section of this User Guide. - -=== Managing Cases === -* To sort records on the Cases List View, click any column title which is sortable. This will sort the column either ascending or descending. -* To search for a Case, see the [[#Search|Search]] section of this user guide. -* To update some or all the Cases on the List View, use the Mass Update panel as described in the [[#Mass Updating Records|Mass Updating Records]] section of this user guide. -* To duplicate a Case, you can click the Duplicate button on the Detail View and then save the duplicate record. -* To merge duplicate Cases, select the records from the Cases List View, click the Merge link in the Actions drop-down list, and progress through the merge process. For more information on Merging Duplicates, see the [[#Merging Records|Merging Records]] section of this user guide. -* To delete one or multiple Cases, you can select multiple records from the List View and click delete. You can also delete a Case from the Detail View by clicking the Delete button. For a more detailed guide on deleting records, see the [[#Deleting Records|Deleting Records]] section of this user guide. -* To view the details of a Cases, click the Case Subject in the List View. This will open the record in Detail View. -* To edit the Case details, click Edit icon within the List View or click the edit button on the Detail View, make the necessary changes, and click Save. -* For a detailed guide on importing and exporting Cases, see the [[#Importing Records|Importing Records]] and [[#Exporting Records|Exporting Records]] sections of this user guide. -* To track all changes to audited fields, in the Case record, you can click the View Change Log button on the Case's Detail View or Edit View. - -== Projects == -In SuiteCRM the Projects module allows the User to arrange their organisation's projects by tracking a number of Tasks and allocating resources. Once set up, a project can be visualised in the form of a Gantt chart or using the project grid. - -=== Projects Actions === -You can access the Projects actions from the Projects module menu drop down or via the Sidebar once you have clicked to view the module. The Projects actions are as follows: - -* Create Project – A new form is opened in Edit View to allow you to create a new Project record. -* View Project – Redirects you to the List View for the Projects module. This allows you to search and list Project records. -* View Project Tasks – Allows you to list Project Tasks, which are related to a parent Project. -* Import Project – Redirects you to the Import Wizard for the Projects module. For more information, see [[#Importing Records|Importing Records]]. - -To view the full list of fields available when creating a Project, See [[#Projects Field List|Projects Field List]]. - -=== Creating Projects === -In the Projects module, you can create, manage, and duplicate Projects and Project Tasks. - -You can define multiple Project Tasks for each Project. When you create a Project Task, you must associate it with a Project. You can associate a Project with multiple activities, Accounts, Opportunities, and Cases. You can also create Projects and Project Tasks from an Email’s detail page. - -#In the Actions bar, click Create Project. -#On the Projects page, enter information for the following fields: -##Name. Enter a name for the Project. -##Status. From the drop-down list, select the Project status such as Draft, In Review, or Published. -##Start Date. Click the Calendar icon and select the Project start date. -##End Date. Click the Calendar icon and select the Project end date. -##Assigned to. Enter the name of you who has ownership of the Project. By default, it is assigned to you. -##Priority. From the drop-down list, select the importance of the Project such as Low, Medium, or High. -##Description. Enter a brief description of the Project. -#Click Save to create the Project; click Cancel to exit the page without creating the Project. - -When you save the Project, the Project’s detail page displays on the page. - -From this page, you can relate the Project to records such as Contacts and Opportunities. - -=== Creating Project Tasks === -#In the Project Tasks sub-panel, click Create. -#On the Project Tasks page, enter information for the following fields: -##Name. Enter a name for the task. -##Task ID. Enter a numerical value as the task identification number. -##Start Date. Click the Calendar icon and select the date when the task is due to begin. -##Finish Date. Click the Calendar icon and select a date when the task is due to be completed; enter the start time in the adjoining field. -##Percentage Complete. Enter a numerical value to indicate what percentage of the task has been completed. -##Priority. From the drop-down list, select a priority level that reflects the importance of completing this task. -##Milestone. Check this box if the completion on this task is considered a milestone for project completion. -##Project Name. Click Select and choose the project associated with the task. -##Description. Enter a brief description of the task. -#Click Save to create the task; click Cancel to return to the project detail page without creating the task. - -=== Managing Projects and Project Tasks === -* To sort the List View on the Projects and Project Tasks list view, click any column title which is sortable. This will sort the column either ascending or descending. -* To search for a Project or Project task, see the [[#Search|Search]] section of this user guide. -* To update some or all the Projects or Project Tasks on the List View, use the Mass Update panel as described in the [[#Mass Updating Records|Mass Updating Records]] section of this user guide. -* To duplicate a Project, you can click the Duplicate button on the Detail View and then save the duplicate record. -* To delete one or multiple Projects, you can select multiple records from the List View and click delete. You can also delete a Project from the Detail View by clicking the Delete button. For a more detailed guide on deleting records, see the [[#Deleting Records|Deleting Records]] section of this user guide. -* To view the details of a Project or Project Task, click the Project or Project Task Name in the List View. This will open the record in Detail View. -* To edit the Project or Project Task details, click Edit icon within the List View or click the edit button on the Detail View, make the necessary changes, and click Save. -* For a detailed guide on importing and exporting Projects and Project Tasks, see the [[#Importing Records|Importing Records]] and [[#Exporting Records|Exporting Records]] sections of this user guide. -* To track all changes to audited fields, in the Project or Project Task record, you can click the View Change Log button on the Project's or Project Task's Detail View or Edit View. - -== Summary == -In this chapter we have covered the functionality of the core modules. These modules allow the user to define and refine sales processes, with the ability to record data in detail within the required module. - -In the next chapter, we will cover the advanced modules within SuiteCRM. These modules allow the user to manage further sales processes, create automated workflows, design reports and more. - -= Advanced Modules = -By now, you should have a fundamental understanding of the SuiteCRM user interface, basic modules, layouts, creating, searching and managing records. - - -The next section of this User Guide covers in detail the Advanced CRM modules. SuiteCRM has Advanced CRM modules which allow Users to further enhance your Sales Force Automation Capabilities and improve business processes. - - -== Advanced Open Sales == -The first 'Suite' of advanced modules is AOS(Advanced Open Sales). The various modules that are part of the AOS suite of modules allow you to manage the Post-Opportunity Sales processes such as Quoting, Invoicing and recurring Contracting. This functionality is made available to you through the following modules: - - -* Product Categories -* Products -* PDF Templates -* Quotations -* Invoices -* Contracts - -=== AOS Settings === -System Administrator users can alter the settings for AOS using the AOS Settings page under the Advanced OpenSales panel within the Admin Panel. - - -[[File:172AOS Settings.png]] - - -You can customise the following settings within the AOS Settings: - - -* Renewal Reminder Period – This defines how many days before the Contract End Date that a reminder call should be created. -* Initial Invoice Number – Allows users to set the initial invoice number. For example 20001. -* Initial Quote Number – Allows users to set the initial quote number. For example 456. -* Enable Line Items Groups – If selected then users will be able to bundle line items into groups. If this is not selected then you will not be able to use the AOS Group functionality. ''Note: This setting should be selected before using AOS – It is difficult to migrate from/to groups once Quotes/Invoices have been created.'' -* Add Tax to Line Total – If this is selected then the Tax will be added into the Line Total on Line Items. If this is not the selected the Line Total will not include Tax. - -[[File:173AOS settings edit.png]] - - -Once configured, click 'Save' to apply your AOS Settings. - -=== Products Module === -You can create Product records using the Products module. Creating products allows users to select product lines when preparing Quotes using AOS. The products module allows users to specify the Products Name, Part Number, Category and Type. Additional fields for Products can be added using Studio. - - -[[File:174Products module.png]] - - -The module also allows users to define a Cost and Price for the product. Price is the selling price which will be used in the quoting process. A related Contact can be associated to the product. This is the point of contact with the supplier concerning this product. If you have an Image of the product then this can be uploaded within the products record. A URL to the products page on your website can also be specified. - -=== Products Categories Module === -The Product Categories module allows Users to structure Products into a hierarchical category structure. To create a Product Category record, navigate to the Product Categories module and click the 'Create Product Categories' button in the action bar. - - -[[File:175Product category.png]] - - -The Parent Category field is a relationship field to another Product Categories record. If you check the 'Is Parent Category' field then this signifies that the category is the highest level. Once selected you will not be able to select a Parent Category using the relate field. - -=== PDF Templates === -'''Creating Templates''' - -AOS allows users to generate PDF documents and merge data from SuiteCRM modules. You must however create a PDF template first. - - -[[File:176PDF template.png]] - - -This module provides a WYSIWYG interface to create dynamic PDF templates. You must select a Type. This is the module you are building the PDF Template for. By default the modules you can select are: Quotes Invoices Accounts Contacts Leads - - -System Administrator users can extend this list by editing the 'pdf_template_type_dom' using the drop down editor functionality. Please note that the drop down 'Item Name' must be the name of the module directory. - - -To insert fields into the Body of the template users will first select a module. This will be the either the same module as the Type or a related module to the Type module. This is selected using the first drop down on the Insert Fields row. - - -[[File:177PDF template field.png]] - - -This will populate the second drop down with all the fields found within that module. Once you have selected the field you wish to insert, the text field will populate with the field variable name. Click 'Insert' to place this field into the Body of the template. If the Active check box is selected then users will be able to generate PDFs from this template. If it is not selected you will not. - - -'''Loading Samples''' - - -[[File:178PDF template field.png]] - - -AOS comes with seven pre-defined PDF templates to help you create your own. These can be loaded by selecting the appropriate template from the Load Sample drop down list. - - -[[Image:image86.png]] - -'''Line Items''' - - -When using a sample to create a template for Quotes or Invoices the Line Items are formatted within a table. You can change the fields found in this table as well as add or remove columns. Please note that if you are creating the template from scratch you must format the Line Items section as a table. - - -[[Image:image87.png]] - -'''Margins''' - - -At the bottom of the PDF Template Edit View, you can specify the margin width for the PDF output. - - -[[Image:187PDF Margins.png]] - -'''Header and Footer''' - - -Within the PDF Templates Edit View, you can also define a Header and a Footer for your templates. These can be completed using the Header and Footer text areas found below the Body text area. - - -[[Image:188PDF footer.png]] - -'''Generate Letter''' - - -You can generate PDF documents for Accounts, Contacts and Leads using the Generate Letter functionality. - - -[[Image:image90.png]] - - -Clicking the 'Generate Letter' button found on these modules Detail View will prompt a pop-up asking to select a template. - - -[[Image:image91.png]] - - -The template selector pop-up will show all the active templates which have the same Type as the module of the record. Clicking the template name will generate a PDF document with date populated from the record and it's related records. The Generate Letter functionality can also be actioned from the List View. This allows you to select multiple records and click the 'Generate Letter' button within the List View action menu. - - -[[Image:image92.png]] - - -The process for generating PDFs for Quotes, Invoices and Contracts is described in your respective sections. - -=== Quotes Module === -'''Creating a Quote''' - - -You can create a Quote by going to the Quotes module and clicking 'Create Quote' from within the actions bar. The first panel allows you to specify details concerning the quote such as the Title, related Opportunity, Stage and Payment Terms. The Quote Number field is calculated automatically. - - -[[File:96Quotes first panel.png]] - -The second panel allows you to specify who the Quote is for by relating an Account and Contact to the Quote. When you select the Account, the Billing Address and Shipping Address are dynamically pulled from the Account and populated into the fields on the Quote record. - - -[[File:97Quotes 2nd panel.png]] - -'''Line Items with Groups''' - - -The third panel allows users to specify the Quote Groups, Line Items and the Currency. A Group is a collection of Line Items with its own Group Total. A Line Item can be a Product Line or a Service Line. To add a Quote Group, click the 'Add Group' button. - - -''Note: Add Group will be displayed if “Enable Line Item groups” is selected in Admin.'' - - -[[File:98Quotes add group.png]] - - -This will display the Group, allowing you to insert a Group Name and add a Product Line or Service Line. It will also display the Group Totals. - - -[[File:200Add group.png]] - - -To add a Product Line, click the 'Add Product Line' button. This will allow users to quote for Products from the Products module. - - -[[File:201Add product line.png]] - - -To select a Product, you can start typing in the Product or Part Number field which will provide a list of results similar to any relate field. Alternatively click the arrow button next to the Part Number field. This will display a pop-up window allowing you to select from a list of Products. - - -[[File:202Add product1.png]] - -Once you have selected a Product, the List, Sale Price and Total will populate automatically. You can change the Quality, add Discounts (Percentage or Amount) and increase the Tax percentage. These will alter the Sale Price, Total Price and Group Total fields. To add a Service Line, click the 'Add Service Line' button. This will allow users to quote for Services. - - -[[File:203Add service line.png]] - -For Service Lines, you must specify the List price. This will populate the Sale Price. Tax and Discounts can be added similarly to the Product Line. AOS will keep a Grand Total for each Group. - - -[[File:204Total.png]] - - -AOS will also keep a Grand Total for all Groups combined. - - -[[File:205Total total.png]] - - -The Shipping field allows you to add a shipping cost. The Shipping Tax field allows you to add tax to this value. Once the Quote has been compiled, click 'Save' to save the Quote. - -Line Items without Groups - - -Creating Quotes without Groups is very similar to creating Quotes with Groups. The only difference is you do not have to click 'Add Group'. You simply 'Add Product Line' and 'Add Service Line' to the quote. Without Groups you are cannot see the Group Total fields. You will only see the Grand Total fields. - - -'''Sending Quotations''' - - -To output a Quote you can select one of following three buttons from the Quote Detail View. - - -[[File:99Sending quotations.png]] - - -AOS provides users with three methods of sending Quotes: - - -* Print as PDF – Allows you to select a template and download or save a PDF of the Quote. -* Email PDF – Allows you to select a template then directs you to the SuiteCRM email client 'Compose' screen. The Quote PDF will be attached to email and the email will be addressed to the related Contact of the Quote. This allows you to fill out the email body. -* Email Quotation – This directs you to the SuiteCRM email client 'Compose' screen. The email will be addressed to the related Contact of the Quote. There will be no attachment and the Quote will be displayed within the body of the email. - -'''Convert To Invoice''' - - -With AOS you can convert Quotes to Invoices. This can be achieved by clicking the 'Convert to Invoice' button on the Quote Detail View. - - -[[File:100Conver to invoice.png]] - - -This functionality will redirect users to the Edit View of an Invoice record. Fields will be populated based on your Quote counterparts and Line Items will be copied over. When you are ready to create the Invoice, click the 'Save' button. Converting a Quote to an Invoice will set the Invoice Status of the quote to 'Invoiced'. - - -'''Create Contract''' - - -As well as converting to an Invoice, AOS allows users to create a Contract based on a Quote. This can be done by clicking the 'Create Contract' button on the Quote Detail View. - - -[[File:101Create contract.png]] - - -This will redirect you to the Edit View of a Contract record, pulling through any appropriate fields from the Quote. This includes any Line Items on the Quote. - -=== Invoices Module === -'''Creating an Invoice''' - - -Creating an Invoice record is very similar to creating a Quote record. You can create an Invoice by going to the Invoices module and clicking 'Create Invoice' from within the actions bar. The first panel allows you to specify details about the Invoice such as Status and Due Date. - -[[File:102Invoice panel 1.png]] - - -The second panel allows you to specify who the Invoice is for by relating an Account and Contact to the Invoice. When you select the Account, the Billing Address and Shipping Address are dynamically pulled from the Account and populated into the fields on the Invoice record. - - -[[File:103Invoice panel 2.png]] - - -'''Groups and Line Items''' - - -AOS allows users to add Groups and Line Items to Invoices. This is completed in the exact same way as Quotes. Please refer to Quotes section for details on how to create Groups and Line Items. - -Sending Invoices - - -To output an Invoice you can select one of following three buttons from the Invoice Detail View. - - -[[File:104Invoice export.png]] - - -AOS provides users with three methods of sending Invoices: - - -* Print as PDF – Allows users to select a template and download or save a PDF of the Invoice. -* Email PDF – Allows users to select a template then directs you to the SuiteCRM email client 'Compose' screen. The Invoice PDF will be attached to email and the email will be addressed to the related Contact of the Invoice. This allows user to fill out the email body. -* Email Invoice – This directs you to the SuiteCRM email client 'Compose' screen. The email will be addressed to the related Contact of the Invoice. There will be no attachment and the Invoice will be displayed within the body of the email. - -=== Contracts Module === -'''Creating a Contract''' - - -AOS allows users to create Contracts using the Contracts module. - - -[[File:105Creating a contract.png]] - - -When the Contract is created the Renewal Reminder Date will populate automatically based on the amount of days specified in the AOS Settings in Admin. A Call will be scheduled and assigned to the Contract Manger for this date. - - -'''Groups and Line Items''' - - -AOS allows users to add Groups and Line Items for Contracts. This is completed in the exact same way as Quotes. Please refer to Quotes section for details on how to create Groups and Line Items. - -== Advanced Open Workflow == -Advanced OpenWorkflow (AOW) is a module for SuiteCRM, allowing users to create custom workflow processes. This module allows users to trigger various system actions based on conditions from any SuiteCRM module. - - -=== Creating a Workflow Process === -You can create workflow processes by navigating to the 'WorkFlow' module within SuiteCRM. Click the 'Create WorkFlow' button within the action bar to start creating the process. The first panel allows users to set up the workflow process. - - -[[File:106Creating a workflow.png]] - - -This allows you to specify the following: - - -* Name – The name of the process. -* Assigned To - The assigned user of the workflow process. -* WorkFlow Module – A drop down list of all the modules found within the SuiteCRM instance. This is the module the workflow is run against. For example, When an Account is created/edited. -* Status – Active or Inactive. Only active processes will run. -* Run – Always, On Save or On Scheduler. -* Run On – All Records, Modified Records or New Records. -* Repeated Runs – If checked, the process will continue to run over and over. Ideally this should only be checked if one of the specified Actions negates (or will lead to the negation) of one of the specified Conditions. -* Description – A description of the process. - -=== Conditions === -Adding Conditions - - -Once set up, you can add conditions to a workflow process using the conditions panel. This allows users to specify the criteria that should trigger the workflow actions. - - -[[File:107Adding conditions.png]] - - -To add a Condition Line you must click the 'Add Condition' button. - - -''Note: You must select your WorkFlow Module on the first panel before adding a Condition Line.'' - - -[[File:206Add condition.png]] - - -You can have an unlimited amount of Condition Lines. To add another line click the 'Add Condition' button again and it will appear. On the line you will have four fields; Field, Operator, Type and Value. - -'''Field and Operator''' - - -Field is a drop down which automatically populates with all the fields found in the WorkFlow Module. - - -[[File:109Field box.png]] - - -The Field selected will determine the options available for Operator and Type. If the field type is not a number or date then the operators available will be 'Equal To' or 'Not Equal To'. For number and date fields you can also choose from additional logical operators; 'Less Than', 'Greater Than', 'Less Than or Equal To' or 'Greater Than or Equal To'. - - -[[File:110Operator box.png]] - - -'''Condition Types''' - - -You can specify workflow processes to trigger on different condition types. These are as follows: - - -Value – This is used to directly compare the Field to a value. The value type offered is dynamic to the field type of the Field selected. For example, if the field type is a drop down then the value field type will be the same drop down list. - - -[[File:111Value condition.png]] - - -Field – This is used to action a workflow process when one field is compared to another field in the record. - - -[[File:112Field condition.png]] - - -Multiple – This can be selected if the Field is a drop down/multiselect. This allows users to specify multiple values to action the workflow from. - - -[[File:113Multiple condition.png]] - - -Date – This allows you to specify the workflow to occur after/before an amount of time from either another date field or 'Now'. For example, when the start date of a call is 'Now + 10 minutes'. This can only be used when the Field is a date field. The amount of time before or after the date can be specified in Minutes, Hours, Days, Weeks or Months. - - -[[File:114Date condition.png]] - - -'''Removing Conditions''' - - -You can remove Condition Lines by clicking the '-' button on the left hand side of the condition. - - -[[File:115Removing conditions.png]] - -=== Actions === -'''Adding Actions''' - - -Actions are defined in the third panel. These specify what events should occur when the conditions have been met. You can add an Action by clicking the 'Add Action' button. - - -[[File:116Adding actions.png]] - - -This will cause the Action Line to appear. - - -[[File:207Action line.png]] - - -From the Action Line you can Select Action and give it a Name. The actions available are; 'Create Record', 'Modify Record' and 'Send Email'. You can specify an unlimited amount of actions for each workflow process. - - -'''Create Record''' - - -If you select 'Create Record' you will be prompted to select a Record Type. This is the module type of the record you are looking to create. - - -[[File:208Create record.png]] - - -Once selected you can add fields or relationships to this record using the 'Add Field' and 'Add Relationship' buttons. - - -[[File:209Add field-relationship1.png]] - - -When Adding fields the first drop down in the line will populate with all the fields from that module. The second drop down allows you to specify how the value for that field is going to be derived. For most cases the options are as follows: - - -* Value – This will allow you to input the value directly using the same field type as the field selected. -* Field – This will make the field the same value as a field found in the WorkFlow Module. -* Date – Only selectable if the field is a date field. This will allow you to specify the value as an amount of time after/before another date field or 'Now'. - - -[[File:210Adding fields.png]] - - -Selecting the 'Assigned-To' field also gives you more options. As well as by value and field you can assign a user by: - - -Round Robin – This will select each user in turn. - -Least Busy – This will select you with the least amount of records assigned to you for that module. - -Random – This will select a random user. - - -For each of the above options you can choose if you want you to be selected from all users or users from a specific role. If you have the SecuritySuite module installed you can additionally choose if you want you to be selected from all users from a particular Security Group or all users from a particular security group with a particular role. - - -[[File:121Assigned field.png]] - - -When adding relationships you must select the related module from the drop down list then select the record that the new record should be related to. - - -[[File:212Add relationship.png]] - - -''Note: You must selected the related module using the arrow button – The auto completion on the text field is not currently developed.'' - - -'''Modify Record''' - - -This provides the same functionality as 'Create Record' but instead of creating a new record you are modifying the record which met the conditions of the workflow process. With this action you can modify any field found within the record or you can add a relationship to another record. This is completed in the same way as 'Create Record' except you are not required to specify the Record Type. - - -'''Send Email''' - - -The 'Send Email' action allows users to create workflow processes which will send an email based on an template to individuals. Using this action there are four different types of recipient. - - -Email – This will send an email to a specific email address. You must specify the email address and the email template. - -[[File:213Send email to.png]] - -Record Email – This will send an email to the primary email address specified on the record which actioned the workflow process. This can only be used if the record has an email field such as Accounts and Contacts. For this option you only need to specify the template. - - -<span class="plainlinks">[https://suitecrm.com/wiki/media/image127.png https://suitecrm.com/wiki/media/image127.png]</span> - - -User – This will send the email to a specified Users email address. You must specify the recipient user and the template of the email. - - -[[File:214Send email to user.png]] - - -Related Field – This will send an email to the primary email address specified on a related modules record. In this case you must specify the related module (From a drop down list) and the email template. - -[[File:215Email related field.png]] - - -====Calculate Fields==== - - -If you select 'Calculate Fields' from the Action dropdown the Calculate Fields user interface will be loaded after a second and looks like the picture below. - - -[[File:216Calculate fields.png]] - - - -'''Calculate Fields - Adding parameters''' - - -It is possible to add parameters to the formulas by using the dropdown in the Parameters section of the Calculate Fields’s user interface. The dropdown contains all of the (basic and custom) fields which belongs to the module selected in the basic fields section. - -To add a parameter, select the field from the dropdown and click on the Add parameter button. After this action, a new line appears in the parameter table with the name of the field and the given identifier. - -For some fields (dropdowns and multi-selects) an additional dropdown shown up where the user can select if the raw or the formatted value should be used in Calculated Fields. The raw format means the value which is stored in the database and the formatted value means the label for that database value. - -To remove a parameter from the table, simply click on the minus button in the row of the parameter. Be aware, that if you remove a parameter, all of the identifiers are recalculated, so the identifiers could change for fields! - - -[[File:217Add parameter.png]] - - -The identifier is used to reference this field when the user creates the formula. For example all appearances of the {P0} identifier will be replaced with the Account’s name in the formula. All parameters are like {Px} where x is the sequential order of the parameter. The amount of the parameters is not limited. - - -'''Calculate Fields - Adding relation parameters''' - - -Relation parameters are very similar to the regular parameters, the only difference is that the user first selects an entity which is in a one-to-one or one-to-many relationship with the actual entity. - -To add a relation parameter, select the relation first, and then select the field from the connected entity and push the Add relation parameter button. After this action, a new line appears in the relation parameter table with the name of the relationship, the name of the field and the given identifier. - -As for parameters for some relation parameter fields (dropdowns and multi-selects) an additional dropdown shown up where the user can select if the raw or the formatted value should be used in Calculate Fields. - -To remove a relation parameter from the table, simply click on the minus button in the row of the relation parameter. Be aware, that if you remove a relation parameter, all of the identifiers are recalculated, so the identifiers could change for fields! - -[[File:128Adding relation parameter.png]] - - -The identifier is used to reference this field when the user creates the formula. For example all appearances of the {R0} identifier will be replaced with the creator user‘s username in the formula. All relation parameters are like {Rx} where x is the sequential order of the relation parameter. The amount of the relation parameters is not limited. - - -'''Calculate Fields - Creating formula for a field''' - - -In the Formulas part of the user interface the user can add formulas for fields of the actual entity. - -To add a formula, select a field from the dropdown first and then push the Add formula button. After this action, a new line appears in the formula table with the name of the field and with the place for the formula. - -To remove a formula from the table, simply click on the minus button in the row of the formula. - - -[[File:129Add formula.png]] - - -The formula is a textbox where the user can write the formulas. The module evaluates the formula on the given time (on save, on scheduler run or both) and fills the selected field with the evaluated value. - -The formula can contain any text (with full UTF-8 support), but only the function parts (functions with parameters between ‘{‘ and ‘}’) are evaluated. -For example and with the parameters added in the previous sections, if we fill the formula like: Account {P0} created by user name {R0}, then the description field will have the following value after save: Account My Account created by user name MyUser (implying the account’s name is My Account and the creator user’s username is MyUser). - -The Calculate Fields has many built-in functions which allows the user to build complex formulas to achieve various goals. These functions are described in the next section. - - -'''Calculate Fields - Usable functions''' - -As it is mentioned above, all of the functions are wrapped between ‘{‘ and ‘}’ signs, and they look like {functionName(parameter1; parameter2; …)}. The count of the parameters are different for the different functions. The module evaluates the functions and changes them with their result in the formula. - -The functions can be embedded into each other (using a result of a function as a parameter for another function) like in this example: - -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -{power({subtract({divide({add({multiply(10; 2)}; 12)}; 8)}; 1)}; 2)} -</pre> - - -This function is the formalised look of the following mathematical expression: - -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -((((10 * 2) + 12) / 8) – 1)2 -</pre> - - -The functions are divided to six groups. These groups are described in the next section of the document. - - -=====Logical Functions===== - - -Logical functions are returning true or false in the form of 1 and 0 so checkboxes typed fields can be filled with these functions. They can be also used as the logical condition for the ifThenElse function. - - -'''equal''' - -{| class="wikitable" -| Signature -| {equal(parameter1;parameter2)} -|- -| rowspan="2" | Parameters -| parameter1: can be any value of any type -|- -| parameter2: can be any value of any type -|- -| Description -| Determines if '''parameter1''' equals -with '''parameter2''' -|- -| Returns -| 1 if the two parameters are equal or 0 if -not -|- -| Example call -| {equal(1; 2)} returns 0 -|} - - -'''notEqual''' - -{| class="wikitable" -| Signature -| {notEqual(parameter1; parameter2)} -|- -| rowspan="2" | Parameters -| parameter1: can be any value of any type -|- -| parameter2: can be any value of any type -|- -| Description -| Determines if '''parameter1''' not -equals with '''parameter2''' -|- -| Returns -| 0 if the two parameters are equal or 1 if -not -|- -| Example call -| {notEqual(1; 2)} returns 1 -|} - - -'''greaterThan''' - -{| class="wikitable" -| Signature -| {greaterThan(parameter1; parameter2)} -|- -| rowspan="2" | Parameters -| parameter1: can be any value of any type -|- -| parameter2: can be any value of any type -|- -| Description -| Determines if '''parameter1''' greater -than '''parameter2''' -|- -| Returns -| 1 if '''parameter1''' greater than -'''parameter2''', 0 if not -|- -| Example call -| {greaterThan(3; 3)} returns 0 -|} - - -'''greaterThanOrEqual''' - -{| class="wikitable" -| Signature -| {greaterThanOrEqual(parameter1; -parameter2)} -|- -| rowspan="2" | Parameters -| parameter1: can be any value of any type -|- -| parameter2: can be any value of any type -|- -| Description -| Determines if '''parameter1''' greater -than or equal '''parameter2''' -|- -| Returns -| 1 if '''parameter1''' greater than or -equal '''parameter2''', 0 if not -|- -| Example call -| {greaterThanOrEqual(3; 3)} returns 1 -|} - - -'''lessThan''' - -{| class="wikitable" -| Signature -| {lessThan(parameter1; parameter2)} -|- -| rowspan="2" | Parameters -| parameter1: can be any value of any type -|- -| parameter2: can be any value of any type -|- -| Description -| Determines if '''parameter1''' less than -'''parameter2''' -|- -| Returns -| 1 if '''parameter1''' less than -'''parameter2''', 0 if not -|- -| Example call -| {lessThan(3; 3)} returns 0 -|} - - -'''lessThanOrEqual''' - -{| class="wikitable" -| Signature -| {lessThanOrEqual(parameter1; parameter2)} -|- -| rowspan="2" | Parameters -| parameter1: can be any value of any type -|- -| parameter2: can be any value of any type -|- -| Description -| Determines if '''parameter1''' less than -or equal '''parameter2''' -|- -| Returns -| 1 if '''parameter1''' less than or equal -'''parameter2''', 0 if not -|- -| Example call -| {lessThanOrEqual(3; 3)} returns 1 -|} - - -'''empty''' - -{| class="wikitable" -| Signature -| {empty(parameter)} -|- -| Parameters -| parameter: text value -|- -| Description -| Determines if '''parameter''' is empty -|- -| Returns -| 1 if '''parameter''' is empty, 0 if not -|- -| Example call -| {empty(any text)} returns 0 -|} - - -'''notEmpty''' - -{| class="wikitable" -| Signature -| {notEmpty(parameter)} -|- -| Parameters -| parameter: text value -|- -| Description -| Determines if '''parameter''' is not -empty -|- -| Returns -| 1 if '''parameter''' is not empty, 0 if -empty -|- -| Example call -| {notEmpty(any text)} returns 1 -|} - - -'''not''' - -{| class="wikitable" -| Signature -| {not(parameter)} -|- -| Parameters -| parameter: logical value -|- -| Description -| Negates the logical value of the -'''parameter''' -|- -| Returns -| 1 if '''parameter''' is 0, 0 if -'''parameter''' is 1 -|- -| Example call -| {not(0)} returns 1 -|} - - -'''and''' - -{| class="wikitable" -| Signature -| {and(parameter1; parameter2)} -|- -| rowspan="2" | Parameters -| parameter1: logical value -|- -| parameter2: logical value -|- -| Description -| Applies the AND logical operator to two -logical values -|- -| Returns -| 1 if '''parameter1''' and '''parameter2''' -is 1, 0 if any parameters are 0 -|- -| Example call -| {and(1; 0)} returns 0 -|} - -'''or''' - -{| class="wikitable" -| Signature -| {or(parameter1; parameter2)} -|- -| rowspan="2" | Parameters -| parameter1: logical value -|- -| parameter2: logical value -|- -| Description -| Applies the OR logical operator to two -logical values -|- -| Returns -| 1 if '''parameter1''' or '''parameter2''' -is 1, 0 if both parameters are 0 -|- -| Example call -| {or(1; 0)} returns 1 -|} - -=====Text Functions===== - - -Text functions are used to manipulate text in various ways. All the functions listed here are fully supports UTF-8 texts, so special characters should not raise any problems. - - -'''substring''' - -{| class="wikitable" -| Signature -| {substring(text; start; length)} -|- -| rowspan="3" | Parameters -| text: text value -|- -| start: decimal value -|- -| length [optional parameter]: decimal -value -|- -| Description -| Cuts the substring of a text field from '''start'''. -If the '''length''' optional parameter is not set, then it cuts all characters until the end of the string, otherwise cuts the provided '''length'''. -Indexing of a text’s characters starting from 0. -|- -| Returns -| Substring of the given text -|- -| rowspan="2" | Example call -| {substring(This is my text; 5)} returns -is my text -|- -| {substring(This is my text; 5; 5)} -returns is my -|} - - -'''length''' - -{| class="wikitable" -| Signature -| {length(parameter)} -|- -| Parameters -| parameter: text value -|- -| Description -| Count the characters in a text. -|- -| Returns -| The count of the characters in a text. -|- -| Example call -| {length(sample text)} returns 11 -|} - - -'''replace''' - -{| class="wikitable" -| Signature -| {replace(search; replace; subject)} -|- -| rowspan="3" | Parameters -| search: text value -|- -| replace: text value -|- -| subject: text value -|- -| Description -| Replace all occurrences of '''search''' -to '''replace''' in the text '''subject'''. -|- -| Returns -| '''subject''' with replaced values. -|- -| Example call -| {replace(apple; orange; This is an apple -tree)} returns This is an orange tree -|} - - -'''position''' - -{| class="wikitable" -| Signature -| {position(subject; search)} -|- -| Parameters -| subject: text value -|- -| -| search: text value -|- -| Description -| Find position of first occurrence of -'''search''' in a '''subject''' -|- -| Returns -| Numeric position of '''search''' in -'''subject''' or -1 if '''search''' not present in '''subject''' -|- -| Example call -| {position(Where is my text?; text)} -returns 12 -|} - - -'''lowercase''' - -{| class="wikitable" -| Signature -| {lowercase(parameter)} -|- -| Parameters -| parameter: text value -|- -| Description -| Make text lowercase -|- -| Returns -| The lowercased text. -|- -| Example call -| {lowercase(ThIs iS a sAmPlE tExT)} -returns this is a sample text -|} - - -'''uppercase''' - -{| class="wikitable" -| Signature -| {uppercase(parameter)} -|- -| Parameters -| parameter: text value -|- -| Description -| Make text uppercase -|- -| Returns -| The uppercased text. -|- -| Example call -| {uppercase(ThIs iS a sAmPlE tExT)} -returns THIS IS A SAMPLE TEXT -|} - -=====Mathematical functions===== - - -Mathematical functions are used to manipulate numbers in various ways. Several mathematical operators are implemented as functions in Calculate Fields. - - -'''add''' - -{| class="wikitable" -| Signature -| {add(parameter1; parameter2)} -|- -| rowspan="2" | Parameters -| parameter1: number value -|- -| parameter2: number value -|- -| Description -| Adds '''parameter1''' and '''parameter2''' -|- -| Returns -| The sum of '''parameter1''' and -'''parameter2''' -|- -| Example call -| {add(3.12; 4.83)} returns 7.95 -|} - - -'''subtract''' - -{| class="wikitable" -| Signature -| {subtract(parameter1; parameter2)} -|- -| rowspan="2" | Parameters -| parameter1: number value -|- -| parameter2: number value -|- -| Description -| Subtracts '''parameter2''' from -'''parameter1''' -|- -| Returns -| The distinction of '''parameter2''' and -'''parameter1''' -|- -| Example call -| {subtract(8; 3)} returns 5 -|} - - -'''multiply''' - -{| class="wikitable" -| Signature -| {multiply(parameter1; parameter2)} -|- -| rowspan="2" | Parameters -| parameter1: number value -|- -| parameter2: number value -|- -| Description -| Multiplies '''parameter1''' and -'''parameter2''' -|- -| Returns -| The product of '''parameter1''' and -'''parameter2''' -|- -| Example call -| {multiply(2; 4)} returns 8 -|} - - -'''divide''' - -{| class="wikitable" -| Signature -| {divide(parameter1; parameter2)} -|- -| rowspan="2" | Parameters -| parameter1: number value -|- -| parameter2: number value -|- -| Description -| Divides '''parameter2''' with '''parameter1''' -|- -| Returns -| The division of '''parameter2''' and -'''parameter1''' -|- -| Example call -| {divide(8; 2)} returns 4 -|} - - -'''power''' - -{| class="wikitable" -| Signature -| {power(parameter1; parameter2)} -|- -| rowspan="2" | Parameters -| parameter1: number value -|- -| parameter2: number value -|- -| Description -| Raises '''parameter1''' to the power of -'''parameter2''' -|- -| Returns -| '''parameter1''' raised to the power of -'''parameter2''' -|- -| Example call -| {power(2; 7)} returns 128 -|} - - -'''squareRoot''' - -{| class="wikitable" -| Signature -| {squareRoot(parameter)} -|- -| Parameters -| parameter: number value -|- -| Description -| Calculates the square root of '''parameter''' -|- -| Returns -| The square root of '''parameter''' -|- -| Example call -| {squareRoot(4)} returns 2 -|} - - -'''absolute''' - -{| class="wikitable" -| Signature -| {absolute(parameter)} -|- -| Parameters -| parameter: number value -|- -| Description -| Calculates the absolute value of -'''parameter''' -|- -| Returns -| The absolute value of '''parameter''' -|- -| Example call -| {absolute(-4)} returns 4 -|} - -=====Date functions===== - - -There are several date functions implemented in Calculate Fields, so the user can manipulate dates in many ways. -Most of the functions uses a format parameter, which is used to set the result of the functions formatted as the user wants to. The options for these formats are equivalent with the PHP format parameters: - - -{| class="wikitable" -! Format character -! Description -! Example returned values -|- -| colspan="3" | '''For day''' -|- -|style="text-align: center;" | d -| Day of the month, 2 digits with leading -zeros -| 01 to 31 -|- -|style="text-align: center;" | D -| A textual representation of a day, three -letters -| Mon through Sun -|- -|style="text-align: center;" | j -| Day of the month without leading zeros -| 1 to 31 -|- -|style="text-align: center;" | l -| A full textual representation of the day -of the week -| Sunday through Saturday -|- -|style="text-align: center;" | N -| ISO-8601 numeric representation of the -day of the week -| 1 (for Monday) through 7 (for Sunday) -|- -|style="text-align: center;" | S -| English ordinal suffix for the day of the -month, 2 characters -| st, nd, rd or th. Works well with j -|- -|style="text-align: center;" | w -| Numeric representation of the day of the -week -| 0 (for Sunday) through 6 (for Saturday) -|- -|style="text-align: center;" | z -| The day of the year (starting from 0) -| 0 through 365 -|- -| colspan="3" | '''For week''' -|- -|style="text-align: center;" | W -| ISO-8601 week number of year, weeks -starting on Monday -| 42 (the 42nd week in the year) -|- -| colspan="3" | '''For month''' -|- -|style="text-align: center;" | F -| A full textual representation of a month, -such as January or March -| January through December -|- -|style="text-align: center;" | m -| Numeric representation of a month, with -leading zeros -| 01 through 12 -|- -|style="text-align: center;" | M -| A short textual representation of a -month, three letters -| Jan through Dec -|- -|style="text-align: center;" | n -| Numeric representation of a month, -without leading zeros -| 1 through 12 -|- -|style="text-align: center;" | t -| Number of days in the given month -| 28 through 31 -|- -| colspan="3" | '''For year''' -|- -|style="text-align: center;" | L -| Whether it's a leap year -| 1 if it is a leap year, 0 otherwise -|- -|style="text-align: center;" | o -| ISO-8601 year number. This has the same -value as Y, except that if the ISO week number (W) belongs to the -previous or next year, that year is used instead -| 1999 or 2003 -|- -|style="text-align: center;" | Y -| A full numeric representation of a year, -4 digits -| 1999 or 2003 -|- -|style="text-align: center;" | y -| A two digit representation of a year -| 99 or 03 -|- -| colspan="3" | '''For time''' -|- -|style="text-align: center;" | a -| Lowercase Ante meridiem and Post meridiem -| am or pm -|- -|style="text-align: center;" | A -| Uppercase Ante meridiem and Post meridiem -| AM or PM -|- -|style="text-align: center;" | B -| Swatch Internet time -| 000 through 999 -|- -|style="text-align: center;" | g -| 12-hour format of an hour without leading -zeros -| 1 through 12 -|- -|style="text-align: center;" | G -| 24-hour format of an hour without leading -zeros -| 0 through 23 -|- -|style="text-align: center;" | h -| 12-hour format of an hour with leading -zeros -| 01 through 12 -|- -|style="text-align: center;" | H -| 24-hour format of an hour with leading -zeros -| 00 through 23 -|- -|style="text-align: center;" | i -| Minutes with leading zeros -| 00 to 59 -|- -|style="text-align: center;" | s -| Seconds, with leading zeros -| 00 through 59 -|- -| colspan="3" | '''For timezone''' -|- -|style="text-align: center;" | e -| Timezone identifier -| UTC, GMT, Atlantic/Azores -|- -|style="text-align: center;" | l -| Whether or not the date is in daylight -saving time -| 1 if Daylight Saving Time, 0 otherwise -|- -|style="text-align: center;" | O -| Difference to Greenwich time (GMT) in -hours -| +0200 -|- -|style="text-align: center;" | P -| Difference to Greenwich time (GMT) with -colon between hours and minutes -| +02:00 -|- -|style="text-align: center;" | T -| Timezone abbreviation -| EST, MDT -|- -|style="text-align: center;" | Z -| Timezone offset in seconds. The offset -for timezones west of UTC is always negative, and for those east of -UTC is always positive. -| -43200 through 50400 -|- -| colspan="3" | '''For full date/time''' -|- -|style="text-align: center;" | c -| ISO 8601 date -| 2004-02-12T15:19:21+00:00 -|- -|style="text-align: center;" | r -| RFC 2822 formatted date -| Thu, 21 Dec 2000 16:01:07 +0200 -|- -|style="text-align: center;" | U -| Seconds since the Unix Epoch (January 1 -1970 00:00:00 GMT) -| -|} - -For all functions without timestamp parameter, we assume that the current date/time is 2016.04.29. 15:08:03 - - -'''date''' - -{| class="wikitable" -| Signature -| {date(format; timestamp)} -|- -| rowspan="2" | Parameters -| format: format text -|- -| timestamp: date/time value -|- -| Description -| Creates a date in the given format -|- -| Returns -| '''timestamp''' in the given '''format''' -|- -| Example call -| {date(ymd; 2016-02-11)} returns 160211 -|} - - - -'''now''' - -{| class="wikitable" -| Signature -| {now(format)} -|- -| Parameters -| format: format text -|- -| Description -| Creates the actual date/time in the given -format -|- -| Returns -| Current date/time in the given -'''format''' -|- -| Example call -| {now(Y-m-d H:i:s)} returns 2016-04-29 -15:08:03 -|} - - -'''yesterday''' - -{| class="wikitable" -| Signature -| {yesterday(format)} -|- -| Parameters -| format: format text -|- -| Description -| Creates yesterday’s date/time in the -given format -|- -| Returns -| Yesterday’s date/time in the -given '''format''' -|- -| Example call -| {yesterday(Y-m-d H:i:s)} returns -2016-04-28 15:08:03 -|} - - -'''tomorrow''' - -{| class="wikitable" -| Signature -| {tomorrow(format)} -|- -| Parameters -| format: format text -|- -| Description -| Creates tomorrow’s date/time in the -given format -|- -| Returns -| Tomorrow’s date/time in the -given '''format''' -|- -| Example call -| {tomorrow(Y-m-d H:i:s)} returns -2016-04-30 15:08:03 -|} - - - -'''datediff''' - -{| class="wikitable" -| Signature -| {datediff(timestamp1; timestamp2; unit)} -|- -| rowspan="3" | Parameters -| timestamp1: date/time value -|- -| timestamp2: date/time value -|- -| unit: -years/months/days/hours/minutes/seconds; default: days -|- -| Description -| Subtracts '''timestamp2''' from -'''timestamp1''' -|- -| Returns -| The difference between the two dates -returned in '''unit''' -|- -| Example call -| {datediff(2016-02-01; 2016-04-22; days)} -returns 81 -|} - - -'''addYears''' - -{| class="wikitable" -| Signature -| {addYears(format; timestamp; amount)} -|- -| rowspan="3" | Parameters -| format: format text -|- -| timestamp: date/time value -|- -| amount: decimal number -|- -| Description -| Adds '''amount''' years to '''timestamp''' -|- -| Returns -| Incremented date in '''format''' -|- -| Example call -| {addYears(Ymd; 2016-04-22; 1)} returns -20170422 -|} - - -'''addMonths''' - -{| class="wikitable" -| Signature -| {addMonths(format; timestamp; amount)} -|- -| rowspan="3" | Parameters -| format: format text -|- -| timestamp: date/time value -|- -| amount: decimal number -|- -| Description -| Adds '''amount''' months to '''timestamp''' -|- -| Returns -| Incremented date in '''format''' -|- -| Example call -| {addMonths(Ymd; 2016-04-22; 1)} returns -20160522 -|} - - -'''addDays''' - -{| class="wikitable" -| Signature -| {addDays(format; timestamp; amount)} -|- -| rowspan="3" | Parameters -| format: format text -|- -| timestamp: date/time value -|- -| amount: decimal number -|- -| Description -| Adds '''amount''' days to '''timestamp''' -|- -| Returns -| Incremented date in '''format''' -|- -| Example call -| {addDays(Ymd; 2016-04-22; 1)} returns -20160423 -|} - - -'''addHours''' - -{| class="wikitable" -| Signature -| {addHours(format; timestamp; amount)} -|- -| rowspan="3" | Parameters -| format: format text -|- -| timestamp: date/time value -|- -| amount: decimal number -|- -| Description -| Adds '''amount''' hours to '''timestamp''' -|- -| Returns -| Incremented date in '''format''' -|- -| Example call -| {addHours(Ymd H:i:s; 2016-04-22 23:30; -5)} returns 20160423 04:30:00 -|} - - -'''addMinutes''' - -{| class="wikitable" -| Signature -| {addMinutes(format; timestamp; amount)} -|- -| rowspan="3" | Parameters -| format: format text -|- -| timestamp: date/time value -|- -| amount: decimal number -|- -| Description -| Adds '''amount''' minutes to '''timestamp''' -|- -| Returns -| Incremented date in '''format''' -|- -| Example call -| {addMinutes(Ymd H:i:s; 2016-04-22 22:58; -5)} returns 20160422 23:03:00 -|} - - -'''addSeconds''' - -{| class="wikitable" -| Signature -| {addSeconds(format; timestamp; amount)} -|- -| rowspan="3" | Parameters -| format: format text -|- -| timestamp: date/time value -|- -| amount: decimal number -|- -| Description -| Adds '''amount''' seconds to '''timestamp''' -|- -| Returns -| Incremented date in '''format''' -|- -| Example call -| {addSeconds(Ymd H:i:s; 2016-04-22 22:58; -5)} returns 20160422 22:58:05 -|} - - -'''subtractYears''' - -{| class="wikitable" -| Signature -| {subtractYears(format; timestamp; -amount)} -|- -| rowspan="3" | Parameters -| format: format text -|- -| timestamp: date/time value -|- -| amount: decimal number -|- -| Description -| Subtracts '''amount''' years from -'''timestamp''' -|- -| Returns -| Decremented date in '''format''' -|- -| Example call -| {subtractYears(Ymd; 2016-04-22; 5)} -returns 20110422 -|} - - -'''subtractMonths''' - -{| class="wikitable" -| Signature -| {subtractMonths(format; timestamp; -amount)} -|- -| rowspan="3" | Parameters -| format: format text -|- -| timestamp: date/time value -|- -| amount: decimal number -|- -| Description -| Subtracts '''amount''' months from -'''timestamp''' -|- -| Returns -| Decremented date in '''format''' -|- -| Example call -| {subtractMonths(Ymd; 2016-04-22; 5)} -returns 20151122 -|} - - -'''subtractDays''' - -{| class="wikitable" -| Signature -| {subtractDays(format; timestamp; amount)} -|- -| rowspan="3" | Parameters -| format: format text -|- -| timestamp: date/time value -|- -| amount: decimal number -|- -| Description -| Subtracts '''amount''' days from -'''timestamp''' -|- -| Returns -| Decremented date in '''format''' -|- -| Example call -| {subtractDays(Ymd; 2016-04-22; 5)} -returns 20160417 -|} - - -'''subtractHours''' - -{| class="wikitable" -| Signature -| {subtractHours(format; timestamp; -amount)} -|- -| rowspan="3" | Parameters -| format: format text -|- -| timestamp: date/time value -|- -| amount: decimal number -|- -| Description -| Subtracts '''mount''' hours from -'''timestamp''' -|- -| Returns -| Decremented date in '''format''' -|- -| Example call -| {subtractHours(Ymd H:i:s; 2016-04-22 -12:37; 5)} returns 20160422 07:37:00 -|} - - -'''subtractMinutes''' - -{| class="wikitable" -| Signature -| {subtractMinutes(format; timestamp; -amount)} -|- -| rowspan="3" | Parameters -| format: format text -|- -| timestamp: date/time value -|- -| amount: decimal number -|- -| Description -| Subtracts '''amount''' minutes from -'''timestamp''' -|- -| Returns -| Decremented date in '''format''' -|- -| Example call -| {subtractMinutes(Ymd H:i:s; 2016-04-22 -12:37; 5)} returns 20160422 12:32:00 -|} - - -'''subtractSeconds''' - -{| class="wikitable" -| Signature -| {subtractSeconds(format; timestamp; -amount)} -|- -| rowspan="3" | Parameters -| format: format text -|- -| timestamp: date/time value -|- -| amount: decimal number -|- -| Description -| Subtracts '''amount''' minutes from -'''timestamp''' -|- -| Returns -| Decremented date in '''format''' -|- -| Example call -| {subtractSeconds(Ymd H:i:s; 2016-04-22 -12:37; 5)} returns 20160422 12:36:55 -|} - -=====Control Functions===== - -There is only one control function implemented in Calculate Fields so far, but this function ensures that the user can write very complex formulas with conditions. -Since the functions can be embedded in each other, the user can write junctions with many branches. - - -'''ifThenElse''' - -{| class="wikitable" -| Signature -| {ifThenElse(condition; trueBranch; -falseBranch)} -|- -| rowspan="3" | Parameters -| condition: logical value -|- -| trueBranch: any expression -|- -| falseBranch: any expression -|- -| Description -| Selects one of the two branches depending -on '''condition''' -|- -| Returns -| '''trueBranch''' if '''condition''' is -true, '''falseBranch''' otherwise -|- -| Example call -| {ifThenElse({equal(1; 1)}; 1 equals 1; 1 -not equals 1)} returns 1 equals 1 -|} - -=====Counters===== - -There are several counters implemented in Calculate Fields which can be used in various scenarios. - -The counters sorted into two groups: - -# '''Global counters:''' Counters which are incremented every time an affected formula is evaluated -# '''Daily counters:''' Counters which resets every day. (Starting from 1) - -In this chapter we assume that the counters current value is 4, so the incremented value will be 5 with the given format. - - -'''GlobalCounter''' - -{| class="wikitable" -| Signature -| {GlobalCounter(name; numberLength)} -|- -| Parameters -| name: any text -|- -| -| numberLength: decimal number -|- -| Description -| Increments and returns the counter for -'''name''' with length '''numberLength''' -|- -| Returns -| Counter with length '''numberLength''' -|- -| Example call -| {GlobalCounter(myName; 4)} returns 0005 -|} - - -'''GlobalCounterPerUser''' - -{| class="wikitable" -| Signature -| {GlobalCounterPerUser(name; -numberLength)} -|- -| Parameters -| name: any text -|- -| -| numberLength: decimal number -|- -| Description -| Increments and returns the counter for -'''name''' for the user who creates the entity with length -'''numberLength''' -|- -| Returns -| Counter with length '''numberLength''' -|- -| Example call -| {GlobalCounterPerUser(myName; 3)} returns -005 -|} - - -'''GlobalCounterPerModule''' - -{| class="wikitable" -| Signature -| {GlobalCounterPerModule(name; -numberLength)} -|- -| Parameters -| name: any text -|- -| -| numberLength: decimal number -|- -| Description -| Increments and returns the counter for -'''name''' for the module of the entity with length '''numberLength''' -|- -| Returns -| Counter with length '''numberLength''' -|- -| Example call -| {GlobalCounterPerModule(myName; 2)} -returns 05 -|} - - -'''GlobalCounterPerUserPerModule''' - -{| class="wikitable" -| Signature -| {GlobalCounterPerUserPerModule(name; -numberLength)} -|- -| Parameters -| name: any text -|- -| -| numberLength: decimal number -|- -| Description -| Increments and returns the counter for -'''name''' for the user who creates the entity and for the module of -the entity with length '''numberLength''' -|- -| Returns -| Counter with length '''numberLength''' -|- -| Example call -| {GlobalCounterPerUserPerModule(myName; -1)} returns 5 -|} - - -'''DailyCounter''' - -{| class="wikitable" -| Signature -| {DailyCounter(name; numberLength)} -|- -| Parameters -| name: any text -|- -| -| numberLength: decimal number -|- -| Description -| Increments and returns the counter for -'''name''' with length '''numberLength''' -|- -| Returns -| Counter with length '''numberLength''', -or if the counter is not incremented this day then 1 with length -'''numberLength''' -|- -| Example call -| {DailyCounter(myName; 1)} returns 5 -|} - - -'''DailyCounterPerUser''' - -{| class="wikitable" -| Signature -| {DailyCounterPerUser(name; numberLength)} -|- -| Parameters -| name: any text -|- -| -| numberLength: decimal number -|- -| Description -| Increments and returns the counter for -'''name''' for the user who creates the entity with length -'''numberLength''' -|- -| Returns -| Counter with length '''numberLength''', -or if the counter is not incremented this day for this user then 1 -with length '''numberLength''' -|- -| Example call -| {DailyCounter(myName; 1)} returns 5 -|} - - -'''DailyCounterPerModule''' - -{| class="wikitable" -| Signature -| {DailyCounterPerModule(name; -numberLength)} -|- -| Parameters -| name: any text -|- -| -| numberLength: decimal number -|- -| Description -| Increments and returns the counter for -'''name''' for the module of the entity with length '''numberLength''' -|- -| Returns -| Counter with length '''numberLength''', -or if the counter is not incremented this day for this module then 1 -with length '''numberLength''' -|- -| Example call -| {DailyCounterPerModule(myName; 1)} -returns 5 -|} - - -'''DailyCounterPerUserPerModule''' - -{| class="wikitable" -| Signature -| {DailyCounterPerUserPerModule(name; -numberLength)} -|- -| Parameters -| name: any text -|- -| -| numberLength: decimal number -|- -| Description -| Increments and returns the counter for -'''name''' for the user who creates the entity and for the module of -the entity with length '''numberLength''' -|- -| Returns -| Counter with length '''numberLength''', -or if the counter is not incremented this day for the user who -creates the entity and for this module then 1 with length -'''numberLength''' -|- -| Example call -| {DailyCounterPerUserPerModule(myName; 1)} -returns 5 -|} - - -=====Example===== - - - -'''Calculate monthly fee for an opportunity''' - - -'''Use Case''' - -The user would like to calculate a monthly fee of an opportunity to a custom field by dividing the amount of the opportunity by the duration. - - -'''Setup''' - -Our opportunities module has a dropdown field called Duration with values: (database value in brackets) 6 months [6], 1 year [12], 2 years [24]. There is also a currency field called Monthly. - - -'''Workflow''' - -Go to WorkFlow module and create a new WorkFlow. Set the base options like the following: - -{| class="wikitable" -| '''Name:''' as you wish -| '''WorkFlow Module:''' Opportunities -|- -| '''Status:''' Active -| '''Run:''' Only on save -|- -| '''Run on:''' All records -| '''Repeated runs:''' checked -|} - - -[[File:130Example workflow.png]] - - -We do not create any conditions, since we would like the WorkFlow to run on all opportunities. - - -Now, add an action and select Calculate Fields from the dropdown. - -Then, add two fields from Opportunities as parameters. First, select Opportunity amount (amount) and add it as a parameter (it will be {P0}) then select Duration and the raw value option from the data type dropdown and add it as parameter two (it will be {P1}). There is no need to add any relational parameters for this formula. - -Now, add a formula for the monthly field and fill the textbox with the following formula: - -<pre style="white-space: pre; -white-space: -moz-pre; -white-space: -pre; -white-space: -o-pre;"> -{divide({P0}; {P1})} -</pre> - - -So the whole action should look like this: - - -<span class="plainlinks">[https://suitecrm.com/wiki/images/1/13/ExampleCF_updated1.png https://suitecrm.com/wiki/images/1/13/ExampleCF_updated1.png]</span> - - -Save the WorkFlow and create a new Opportunity: - - -<span class="plainlinks">[https://suitecrm.com/wiki/images/5/5a/ExampleCF_orig2.png https://suitecrm.com/wiki/images/5/5a/ExampleCF_orig2.png]</span> - - -As you can see, we did not even add the monthly field to the EditView, because we don’t want to force the user to make calculations. Save the Opportunity and check the results on the DetailView: - - -<span class="plainlinks">[https://suitecrm.com/wiki/images/4/4b/ExampleCF_orig3.png https://suitecrm.com/wiki/images/4/4b/ExampleCF_orig3.png]</span> - - ----- - -AOW Calculated Fields was contributed by [http://www.dtbc.eu/ diligent technology & business consulting GmbH] - ----- - - - - -'''Removing Actions''' - - -You can remove Action Lines by clicking the 'X' button on the top right hand side of the Action. - -[[File:131Removing actions.png]] - - -'''Removing Field and Relationship Lines''' - - -You can remove Field and Relationship Lines by clicking the '-' button on the left hand side of the Action. - - -[[File:132Removing fields.png]] - -=== Process Audit === -Advanced OpenWorkflow allows users to audit your processes. In the Detail View of each WorkFlow record there is a sub-panel called 'Processed Flows'. - - -<span class="plainlinks">[https://suitecrm.com/wiki/media/image132.png https://suitecrm.com/wiki/media/image132.png]</span> - - -This lists all the workflow processes which have been actioned including details on the record which actioned the flow, its status and the date it was created. - - -<span class="plainlinks">[https://suitecrm.com/wiki/media/image133.png https://suitecrm.com/wiki/media/image133.png]</span> - - -You can view this information at a higher level by clicking the 'View Process Audit' button within the module action bar. This will show all the processes that have run for all the WorkFlow records. - -=== Tutorials === -'''Customers to Target List''' - - -This tutorial will show you how to create a workflow process to add accounts who are customers to a Target-List when the record is created or modified. Set Up - - -# Start by navigating to the WorkFlow module and clicking 'Create Workflow' from the the action bar. -# Give your workflow a Name such as 'Populate Target List. -# Select Accounts as the WorkFlow Module. -# Ensure Repeated Runs is NOT selected and the Status is Active (This should be done by default). Optionally you can change the Assigned-To and add a Description. - -'''Conditions''' - - -# Create a new Condition Line by clicking the 'Add Condition' button. -# Select 'Type' from the Field drop down. -# Keep the Operator as 'Equals To' and the Type as 'Value'. -# From the Value drop down select 'Customer'. - -Once these steps have been completed the Conditions panel should look like this: - - -[[File:134Conditions.png]] - - -'''Actions''' - - -Create a new Action by clicking the 'Add Action' button. - -# Select 'Modify Record from the Select Action drop down list. -# Using the Name field, give the action a name such as 'Add to Target List' -# Add a Relationship Line by clicking the 'Add Relationship' button. -# A drop down will appear above the 'Add Relationship' button. Select the relationship from this drop down box. In this case we are looking for 'Target Lists: Prospect List' -# This will populate the rest of the line. Click the arrow button next to the relate field to select your target list. - -Once these steps have been completed your Actions panel should look like this: - - -[[File:218Add to target list actions.png]] - - -'''Cases Reminder''' - - -This tutorial will show you how to create a workflow process to notify the assigned user and then a particular manger user when an open Case has not been updated/modified within two days. Set Up - - -# Start by navigating to the WorkFlow module and clicking 'Create Workflow' from the the action bar. -# Give your workflow a Name such as 'Case Escalation'. -# Select Cases as the WorkFlow Module. -# Ensure Repeated Runs is NOT selected and the Status is Active (This should be done by default). Optionally you can change the Assigned-To and add a Description. - -Once these steps have been completed the first panel should look like this: - - -[[File:136Case Escalation.png]] - - -'''Conditions''' - - -Create a new Condition Line by clicking the 'Add Condition' button. - -Select 'Date Modified' from the Field drop down. - -Change the Operator to 'Less Than or Equal To' and the Type to 'Date' - -From the Value fields select 'Now', '-', '2', 'Days' in order. - - -Once these steps have been completed the Conditions panel should look like this: - - -[[File:137Conditions.png]] - - -Repeat step 1. - -This time select 'Status' from the Field drop down. - -Keep the Operator as 'Equals To' and change the Type to 'Multiple'. - -From the Value multi-select field select any values which signify an open case - - -Once these steps have been completed the Conditions panel should look like this: - - -[[File:138Conditions.png]] - -'''Actions''' - - -# Create a new Action by clicking the 'Add Action' button. -# Select 'Send Email from the Select Action down down list. -# Give the action a Name such as 'Assigned User Reminder' -# On the Email Line select 'Related Field' from the first drop down, 'Users: Assigned To' from the second drop down and a email template from the third drop down. - -Once these steps have been completed the Actions panel should look like this: - - -[[File:219Assigned user reminder actions.png]] - - -1. Repeat steps 1, 2 and 3 but change the name of this action to 'Manager Escalation Email'. 2. On the Email Line select 'User' and then select you who should receive the email. Select an email template from the third drop down. 3. When you are finished click 'Save' to create your workflow. Once these steps have been completed the Actions panel should look like this: - - -[[File:220Double action.png]] - - -'''Follow Up Web Leads''' - - -This tutorial will show you how to create a workflow process to assign web Leads to a particular user from a particular role within SuiteCRM. This user will be chosen by round robin. The workflow process will also set a follow up call for one day after the Lead is created. - - -''Note: You can change the Sales role to any role found in your own system. '' - - -'''Set Up''' - - -# Start by navigating to the WorkFlow module and clicking 'Create Workflow' from the the action bar. -# Give your workflow a Name such as 'Web Lead Assignment and Follow Up'. -# Select Leads as the WorkFlow Module. -# Ensure Repeated Runs is NOT selected and the Status is Active (This should be done by default). Optionally you can change the Assigned-To and add a Description. - -Once these steps have been completed the first panel should look like this: - - -[[File:141Set up.png]] - - -'''Conditions''' - - -# Create a new Condition Line by clicking the 'Add Condition' button. -# Select 'Lead Source' from the Field drop down. -# Keep the Operator as 'Equals To' and the Type as 'Value' -# From the Value drop down select our condition, 'Web Site' - -Once these steps have been completed the Conditions panel should look like this: - - -[[File:142Conditions.png]] - - - -'''Actions''' - - -# Create a new Action by clicking the 'Add Action' button. -# Select 'Modify Record' from the Select Action down down list. -# Using the Name field, give the action a name such as 'Assign to Sales' -# Add a Field Line by clicking the 'Add Field' button. -# Select 'Assigned-To' from the new drop down box that has appeared above the 'Add Field' button. -# Change the middle drop down box from 'Value' to 'Round Robin' -# Change the third drop down box from 'ALL Users' to 'ALL Users in Role' -# Select from forth drop down box on the line 'Sales'. - -Once these steps have been completed the Actions panel should look like this: - - -[[File:221Assign to sales action.png]] - - -# Now create a new Action by repeating step 1. -# This time select 'Create Record' from the Select Action down down list. -# Using the Name field, give the action a name such as 'Create Follow Up Call'. -# From the Record Type drop down select 'Calls'. -# Click the Add Field button to add a new field: -# Select 'Subject' from the first drop down box. Leave the second drop down box as 'Value' then type the desired subject into the text field at the end. -# Add another field, this time selecting the 'Start Date' from the first drop down box. -# Change the second drop down box from 'Value' to 'Date'. -# In the third drop down box select 'Now'. In the fourth drop down box on the line select '+'. -# In the text box type '1' and in the drop down next to it select 'Days'. -# Add another field, this time select 'Assigned-To', 'Field', 'Assigned-To' – This will relate the assigned User of the Lead to the Call. -# You can add any other fields that you wish to include in the call at this stage. To finish click 'Save'. - -Once these steps have been completed the Actions panel should look like this: - - -[[File:222action.png]] - -== Advanced Open Cases with Portal == -=== Introduction === -Advanced OpenPortal (AOP) is an enhancement to the case management module in SuiteCRM. There is also a Joomla component. AOP extends the core cases functionality and enhances mechanisms for contacts to update cases. - - -This module allows contacts held within SuiteCRM to: - - -* Retrieve emails regarding updates to your Cases -* Create Cases by emailing a defined support address -* Update Cases by replying to Case emails - -The module allows SuiteCRM users to: Add updates to Cases View a threaded log of all updates Retrieve email notifications when a contact adds an update to a Case Create Joomla users from a Contact The AOP Joomla component connects a Joomla site to the SuiteCRM instance. This allows SuiteCRM Contacts to: View a list of your Cases online Create new Cases online Reply to existing cases View your case details including a threaded log of all updates - - -Emails Advanced OpenPortal (AOP) uses the standard SuiteCRM functionality to send emails and create cases from inbound emails. Details on how to configure your outgoing email settings can be found here. Details on how to set up a group email account which will automatically generate cases can be found here. - - -=== Installation & Configuration === -System Administrator users can configure the settings by accessing the AOP settings through the admin panel. - - -[[File:145AOP settings.png]] - - - -Here you can enable or disable the AOP functionality, configure the Joomla URL, set the case distribution method, “email from” details and the different email templates. - - -To install the Joomla AOP component, use the Joomla Extension Manager. Once installed you must configure the SuiteCRM URL and a valid SuiteCRM username and password. This can be done by navigating to Components → advancedopen-portal. - - -<span class="plainlinks">[https://suitecrm.com/wiki/media/image146.png https://suitecrm.com/wiki/media/image146.png]</span> - - -Once you have configured the Joomla component you can add two new Main Menu items to your Joomla portal. These are: - - -* List Cases - This shows a list of all Cases that the Contact has logged. This page also provides a search mechanism to filter cases. -* New Case – This page will allow Contacts to create Cases in SuiteCRM from the Joomla portal. - - -<span class="plainlinks">[https://suitecrm.com/wiki/media/image147.png https://suitecrm.com/wiki/media/image147.png]</span> - -=== Using Advanced OpenPortal === -'''Creating a Portal User''' - - -To create a Portal User a SuiteCRM User must first create a Contact for the Portal User using the standard SuiteCRM functionality. Once created you must click the 'Create Portal User' button. This can be found at the top left hand side of the Contact record Detail View. - - -''Note: If you have action menus enabled the button will be within the action menu.'' - - -<span class="plainlinks">[https://suitecrm.com/wiki/media/image1408png https://suitecrm.com/wiki/media/image148.png]</span> - - -Once clicked, a new user will be created in Joomla and the Contact will be sent your portal credentials via email. - - -'''Creating a Case via the Portal''' - -Portal Users can create a new Case by going to the New Case page on the portal website. - - -<span class="plainlinks">[https://suitecrm.com/wiki/media/image149.png https://suitecrm.com/wiki/media/image149.png]</span> - - -From here Portal Users can enter the details of your issue and attach any supporting documents. The dropdown values are dynamically pulled from the SuiteCRM instance and thus can be edited using the drop down editor tool within SuiteCRM. - - -''Note: This feature does use the Joomla cache so please clear cache after an update has been made. When the case is ready to be logged, click the 'Save' button. This will create the Case within SuiteCRM''. - - -'''Viewing Cases via the Portal''' - - -Portal Users can view a list of all your Cases using the List Cases page. This will also allow you to filter your search by State (All, Open or Closed) or by keyword. When searching by keyword it will search the 'Number', 'Subject', 'Status', 'Created' and 'Last Update' fields to find your result. - - -<span class="plainlinks">[https://suitecrm.com/wiki/media/image150.png https://suitecrm.com/wiki/media/image150.png]</span> - - -To view more information on the case and to add updates then Portal Users can click the 'Subject' of case. - - -<span class="plainlinks">[https://suitecrm.com/wiki/media/image151.png https://suitecrm.com/wiki/media/image151.png]</span> - - -From the case view Portal Users can view all the external updates added to the case from both Joomla and SuiteCRM. This is displayed in a threaded format showing who updated the case Any attached files to updates will also be accessible from this view. When a Portal User updates a case the assigned SuiteCRM user of the case will be notified by email. - - -'''Creating and Updating Cases from SuiteCRM''' - - -You can create and update Cases from SuiteCRM. To add an update to an existing record Users will add text to the 'Update' field within the case Detail View and click 'Save'. This will publish the update to the portal and send an email to any Contacts related to the Case. - - -<span class="plainlinks">[https://suitecrm.com/wiki/media/image152.png https://suitecrm.com/wiki/media/image152.png]</span> - - -If Users check the 'Internal Update' field then the update will appear in SuiteCRM only. It will not appear in Joomla and the Contact will not be emailed. - - -<span class="plainlinks">[https://suitecrm.com/wiki/media/image153.png https://suitecrm.com/wiki/media/image153.png]</span> - -The Case Detail View will show the full threaded update log. - - -<span class="plainlinks">[https://suitecrm.com/wiki/media/image154.png https://suitecrm.com/wiki/media/image154.png]</span> - - -Additional Contacts can be added to the Case using the Contacts sub panel. All emails exchanged between the system, the contact and you will be attached to the History sub-panel. Any documents attached to the case using the Portal are held as Notes within this sub-panel. - - -'''Status Drop Down''' - - -Within Cases, you can specify both a State and a Status value. The State determines if the Case is Open or Closed. Depending on the State you will be offered different statuses. You can amend these statuses using the Dropdown Editor Tool within the Admin Developer Tools. When adding a new Status you must define the Item Name as “<parent dropdown item name>_ItemName” For example “Open_New” or “Closed_Rejected”. All values with an Item Name prefixed with “Open_” will show when the state is Open, similarly all with the prefix “Closed_” will show when the state is closed. - -== Advanced Open Events == -=== Events Locations === -The Locations module is used to capture the venue/site information where events are held. - -'''Creating Locations''' - - -1. Hover over the Locations module on the navigation bar and select 'Create Location'. - - -[[File:146Create location.png]] - - -2. This will take you to the Edit View. Enter information into the appropriate fields, all required fields are marked with a red asterisk and must be completed prior to saving. - - -[[File:147Location edit view.png]] - - -3. Once the necessary information is entered, click "Save". - -=== Events === -The Events module is used to capture information an particular event and send out invites to delegates. To view the Events held within the system click the 'Events' tab on the navigation bar. This will take you to the Events List View. - -'''Creating Events''' - - -1. Hover over the Events module on the navigation bar and select 'Create Event'. - - -[[File:148Create event.png]] - - -2. This will take you to the Edit View. Enter information into the appropriate fields, all required fields are marked with a red asterisk and must be completed prior to saving. - - -[[File:149Events edit view.png]] - - -The following fields are found on the Events module: - -* '''Name''' – The name of the event -* '''Start''' '''Date''' – The date and time of when the event starts -* '''End''' '''Date''' – The date and time of when the event ends -* '''Duration''' – The duration of the event. This will automatically change the end date or be altered automatically if the end date is changed. -* '''Location''' – This is a relationship to the '''Event Locations''' module. -* '''Budget''' – The budget for the event. -* '''Email''' '''Invite''' '''Template''' – The '''Email Template''' that will be sent to associated Delegates. -* '''Accept''' '''Redirect''' '''URL''' – The web page invitees should be redirected to after you accept an invite using the link provided in the '''Email Template'''. -* '''Decline''' '''Redirect''' '''URL''' – The web page invitees should be redirected to after you decline an invite using the link provided in the '''Email Template'''. -* '''Description''' – More information about the Event. -* '''Assigned'''-'''To''' – Who the assigned user is for this event. This defaults to you who creates the event. -* '''Created''' '''By''' – Which user created the event. - -3. Once the necessary information is entered, click "Save". - -=== Adding Delegates === -1. Navigate to the Event Detail View. - -2. Navigate to the Delegates sub-panel found below the 'Event Details' panel. - - -[[File:223Adding delegates.png]] - - -3. Click 'Select Delegates'. A list of options will appear. - - -[[File:224Select delegates.png]] - - -4. Select the appropriate option depending on who should be added to the Event. - -* '''Target''' '''List''' – Select a '''Target List''' of individuals to be associated to the event. All '''Targets''', '''Leads''' and '''Contacts''' on this '''Target List '''will be added to the '''Event'''. -* '''Targets''' – Select '''Targets''' to be associated to this '''Event'''. -* '''Contacts''' – Select '''Contacts''' to be associated to this '''Event'''. -* '''Leads''' – Select '''Leads''' to be associated to this '''Event'''. -* '''Events''' – Select an '''Event''' to associate that '''Event's''' delegates to this '''Event'''. - -5. Once an option has been chosen a new pop-up box will appear to search and select records from the module type that was chosen. - -6. The Delegates sub-panel will populate with the records selected. - - -[[File:225Delegates.png]] - -=== Sending Invites To Delegates === -1. Navigate to the Delegates sub-panel. - -2. Choose action 'Send Invites'. - - -[[File:226Send invites.png]] - - -3. This will send the email template selected in the 'Email Invite Template' to all Delegates who have the status 'Not Invited' - -4. Once selected the Delegate status will automatically update to 'Invited'. - - -<span class="plainlinks">[https://suitecrm.com/wiki/media/image163.png https://suitecrm.com/wiki/media/image163.png]</span> - - -5. Choosing 'Resend Invites' will send invites out to all Delegates associated to the Event who have yet to respond. - -=== Managing Delegates Acceptance Manually === -1. Navigate to the Delegates sub-panel. - -2. Select the Delegates that require your 'Accept Status' to be updated. - -3. Choose action 'Manage Acceptances' - - -[[File:227Manage acceptances.png]] - - -4. A list of options will appear. Select appropriate statuses: - - -[[File:228Acceptances.png]] - -5. This will update the Delegates 'Accept Status' accordingly. - - -[[File:229Accepted.png]] - - -''Note: Acceptance will my automatically updated if the Delegate chooses to accept using the link provided in the email template.'' - -=== Updating Delegates Status Manually === -1. Navigate to the Delegates sub-panel. - -2. Select the Delegates that require your attendance to be updated. - -3. Choose action 'Manage Delegates' - - -[[File:230Manage delegates.png]] - - -4. A list of options will appear. Select the appropriate status; Invited, Not Invited, Attended or Not Attended. - - -[[File:231Manage delegates.png]] - - -5. This will update the Delegates 'Status' accordingly. - - -[[File:232Updated status.png]] - - -''Note: Acceptance will be automatically updated if the Delegate chooses to accept using the link provided in the email template.'' - -== Advanced Open Reports == -Advanced Open Reports (AOR) is the reporting module within SuiteCRM. AOR can be accessed by clicking the 'Reports' link within the navigation menu. The reporting module allows users to report on CRM data from any module and has many features to display key information quickly. - -=== Creating Reports === -To create a report, hover over the Reports module on the navigation bar and select 'Create Report'. - - -[[File:152Create report.png]] - - -You will be presented with the report Edit View. To obtain a list of fields to add to the report, you have to select a module from the Report Module drop down. - - -[[File:153Reports edit view.png]] - - -'''Adding Fields''' - - -Once you have selected a Report Module, the list of fields available will display on the left panel. You can add fields to the 'Fields' section of the report by expanding the module you wish to select fields from and then drag and drop those fields into the field section. - - -[[File:233Report fields.png]] - - -Once you have added fields to a Report, there are multiple options to configure for those fields: - - -* Display – True or false option. Allows you to specify whether this field should be displayed on the report, or hidden. Users may wish to add fields to perform a function/sort/group/total but may not wish to show this on the Report.<br/> - -* Link – True or false option. Allows you to make the field a link. Setting this option to true will hyperlink the field on the Detail View of the report, allowing you to click on the record. This will navigate you to the appropriate record. For example, linking the Opportunity Name will take you to the Detail View of that Opportunity.<br/> - -* Label – This is the label that will be displayed for the Column/Field on the Report. You can change the label from the default to any alphanumerical value.<br/> - -* Function - Provides five options: Count, Minimum, Maximum, Sum and Average. Allows you to perform functions on alphanumerical fields. Users may wish to calculate the average Opportunity Amount, or Count total Opportunities at a given Sales Stage.<br/> - -* Sort – Ascending or Descending. Allows you to select whether to sort the field/column descending or ascending. This can be done for all fields.<br/> - -* Group – True or false option. Allows you to group by this field. For example, you may wish to group by Sales Stage when reporting on an Opportunity.<br/> - -* Total – Provides three options: Count, Sum and Average. This allows users to perform total calculations on numerical fields. This is useful for financial reporting such as the total value of all Opportunities at a given Sales Stage.<br/> - - -'''Adding Conditions''' - - -Once you have added the fields to your Report, you can add condition lines to the Report. You can add conditions with the same procedure as adding fields. Using the drag and drop functionality, you can drag fields into the 'Conditions' area which will add the field and allow you to specify the condition for that field. - -=== Charts === -You can add charts to Reports. Charts provide a visual representation of the Report data to you. In some scenarios, or for particular users, visual aids such as charts can assist quicker analysis and better understanding. - -'''Chart Types''' - -There are six types of chart that the user can select to display Report data. These are: - -* Pie Chart -* Bar Chart -* Line Chart -* Radar Chart -* Stacked Bar -* Grouped Bar -<br/> -To add a chart, you can click the 'Add Chart' button, below the Conditions section within the Report Edit View. - - -[[File:234Add chart.png]] - - -Once you click add chart, you will be presented with the option to specify the following information: - -* Title – Allows the user to specify the title for the chart. This will show on the Detail View of the Report and also on the dashlet chart. -* Type – This allows the user to select from one of the six chart types detailed above. -* X Axis – Allows the user to select the column that should be used for the X Axis. -* Y Axis – Allows the user to select the column that should be used for the Y Axis. - - -[[File:235Making chart.png]] - - -Once you have specified the chart details, save the Report. This will display the chart on the Detail View of the Report, below the list of records returned. - - -[[File:image176.png]] - -=== Reports Dashlets === -You can display a Report within a dashlet. It is possible to view multiple Report results as you can add multiple Report dashlets and select different Reports within each dashlet. To do this, add the Reports dashlet to your homepage. - - -[[File:156Add dashlet.png]] - - -[[File:157Reports dashlet.png]] - - -Once you have added the dashlet, you need to select the Report you wish to display within the dashlet. To do this, click the pencil icon to edit the dashlet. - - -[[File:158Choose report.png]] - - -This allows the user to select the Report they wish to display within the dashlet. - - -[[File:159Report dashlet results.png]] - - -Once you have selected the Report, click 'Save'. This will update your Reports dashlet to show the results of the Report. - - -''Note: For full details on adding and managing dashlets, see the [[#Dashlets|Dashlets]] section of this user guide.'' - -=== Reports Charts Dashlets === -You can specify to only select to display a chart for Report dashlets. To do this, edit your Report dashlet and select the 'Only use charts' option. This will then list all charts you have created for this Report. - - -<span class="plainlinks">[https://suitecrm.com/wiki/media/image182.png https://suitecrm.com/wiki/media/image182.png]</span> - - -Select a chart or multiple charts and click 'Save'. This will display the results in the chart selected. - - -<span class="plainlinks">[https://suitecrm.com/wiki/media/image183.png https://suitecrm.com/wiki/media/image183.png]</span> - -=== Scheduled Reports === -You can schedule reports to be automatically run and emailed to the required Contact(s). This allows users to schedule reports to be sent to Managers or Team Leads either Daily, Weekly or Monthly. To create a Scheduled Report, you can click the 'Create' option within the Scheduled Reports Sub-panel on the Detail View of the Report. You can also select existing Scheduled Reports to relate to the Report. - - -[[File:236Scheduled Reports.png]] - - -Once you have clicked 'Create', there are options to set for the Scheduled Report. Give the Scheduled Report a relevant name. In this example, we will use 'Daily Opportunites Report for Managers'. - - -[[File:161Scheduled report edit.png]] - -You can select the 'Advanced' option for report scheduling. This will provide a cron notation style option. This is best suited for System Administrators or advanced users. - - -[[File:162Scheduled report edit.png]] - - -Once you have entered a name and selected a schedule, click 'Save'. - - -[[File:162Scheduled report edit.png]] - - -Once you save the Scheduled Report record, this will display in the Scheduled Reports subpanel within the Detail View of the Report. - - -[[File:237Scheduled report.png]] - - -You can view when the Scheduled Report last ran by viewing the 'Last Run' column/field on the sub-panel. This shows in a date/time format. - - -<span class="plainlinks">[https://suitecrm.com/wiki/media/image189.png https://suitecrm.com/wiki/media/image189.png]</span> - -== Reschedule == -=== Rescheduling a Call === -To reschedule a Call, you can click the 'Reschedule' button on the Detail View of a Call which has been defined as Outbound and Planned. - - -[[File:164Reschedule call.png]] - -=== Defining the Details === -Clicking the Reschedule button will produce a pop up or dialogue box up. This enables users to set the date and time for the rescheduled Call. - - -[[File:238Reschedule call.png]] - - -You can also select a reason for the incomplete/unsuccessful Call from the drop down list. Once the details have been defined, click the 'Save' button to save the Call. - - -[[File:239Reschedule reason.png]] - -=== Tracking History === -Once Saved, the Call is rescheduled for the new date and time. you can view all Call Reschedule history by clicking the 'Reschedule' tab on the Calls Detail View. - - -[[File:240Call attempty history.png]] - -=== Altering Reasons Drop Down === -System Administrator users can edit the reasons available in the Reschedule pop-up using the drop down editor. The drop down list used is called 'call_reschedule_dom'. - -== Summary == -In this chapter we have covered the functionality of the advanced modules. These modules have a very specific purpose - enabling users to improve processes and efficiently report on and manage data. - -In the next chapter, we will cover some third party modules which are part of the SuiteCRM product. These third party modules provide additional functionality to you such as teams and location mapping. - -= Security Suite(Groups) = -Security Suite allows control of what users can access. It allows restricting sensitive data in SuiteCRM to specific teams (groups). SecuritySuite comes loaded with options which allow you to configure it to meet your exact needs. Choose from a number of automatic assignment options to ensure that your users can always access the data that you need. - -== Create Groups == -System Administrators can add groups and roles or set up Security Groups preferences in Security Suite Settings found at the top of the Admin page. - -[[File:167Create groups.png]] - -== Allow Non-admins to Create Groups == -System Administrators can allow non-admin users to add groups to records. This can be done by doing the following steps: - -# Navigate to Configure Tabs. Add Security Groups to the displayed tabs. -# Run Repair Roles, within Admin->Repair, to be able to assign rights to Security Groups. -# Edit role(s) to Enable Security Groups Management. -# Edit role(s) to set List to All or Group for Security Groups Management as desired. - -== Configure SecuritySuite Settings == -SecuritySuite is very configurable and allows for support near every possible situation. Because of that there may be a learning curve and some time required to understand what each option does and how it may be used for your specific needs. You can find the settings page by going to Admin->SecuritySuite Settings. - -== Groups Setup == -There are 3 key steps to setting up Groups so that you work correctly. - -# Create a group for each team of users and add the appropriate users to the group. -# Create a role and select Group for the access level for every appropriate cell in the grid. Assign that role to each group -# Add the groups to records in your SuiteCRM instance. You can use the Mass Assign on the List View to do this. Going forward the groups will automatically inherit based on your SecuritySuite Settings. You can also use logic hooks, workflow, or do a direct database insert into the securitygroups_records table if doing a one-time initial setup. - -If your users should only typically see their own records then the role assigned to the group would be configured to have Owner only rights. A manager who is a part of the group, but who should see be able to see all records in the group would have a role directly assigned to you record that gives Group access. - -For more help check out: - -* [https://www.sugaroutfitters.com/docs/securitysuite/example-of-a-typical-setup Example of a Typical Setup] -* [https://www.sugaroutfitters.com/docs/securitysuite/introduction-video Introduction Video] - -Roles determine what a user can do with a record once they have access to it. - -# Create the roles -# Edit role(s) to Enable Security Groups Management -# Edit role(s) to set List to All or Group for Security Groups Management as desired - -== A Typical Hierarchy Setup == -Although SecuritySuite can handle any organizational structure, the most common scenario it is used for is one where the owner can sell everything, managers can see both their own records and those of their team, and team members can only see their own records. - -=== The Scenario === -This company has 2 sales teams; East and West. The owner, Jill, should be able to see everything. The East Sales team is lead by Will and Sarah leads the West Sales team. Both of them should see everything just in your own respective teams. The rest of the Sales Reps in each teams should only be allowed to see your own records. - -=== Set up the Groups === -# Create a group called East Sales -# Add Will and the Sales Reps -# Create a group called West Sales -# Add Sarah and the Sales Reps - -=== Set up the Roles === -# Create a role called Everything and set the rights to All.''Tips and Tricks: Click the header in any column on the role grid and you can set the rights for the whole column at one time'' -# Assign the Everything role directly to Jill's user account -# Create a role called Group Only and set the rights for everything to Group -# Assign the Group role directly to Will and Sarah -# Create a role called Owner Only and set the rights for everything to Owner -# Assign the Owner Only role to the East Sales and West Sales groups - -=== Assign the Groups === -This instance already has some existing Leads so we will assign them to the appropriate groups. - -# Go to the Leads List View and search for the Leads that should belong to the East Sales group -# Check the appropriate Leads, in the Mass Assign panel choose East Sales, and click "Assign" -# Repeat for the West Sales team - -''Note: Going forward the groups will be automatically inherited by any Calls, Contacts, Notes, etc that get added based on the SecuritySuite Settings that are configured. If the SuiteCRM instance is already loaded with lots of data at the time of starting with SecuritySuite then there may be some initial work to be done to add those groups to the related records. The Mass Assign functionality on the List View can be used or direct database insertion into the securitygroups_records table. See existing data in that table for how to format the data. This will require SQL knowledge if you want to go that route.'' - -=== Check the Settings === -These settings determine how SecuritySuite functions. In the Group Inheritance Rules panel the defaults of "Inherit from Created By User", "Inherit from Assigned To User", and "Inherit from Parent Record" will work perfectly in this scenario. - -Any Lead that gets created will automatically have groups assigned to it based on who created it and who gets assigned to it. If a Call is created for a Lead then the Call will inherit the groups from the Lead record (parent record) along with inheriting the groups from the created by user and the assigned to user. - -Another key setting is "Strict Rights". In the scenario above the default settings will cause the links on the List View for the team Leads to show with no link for records that are assigned to your group. In many cases you will want to uncheck "Strict Rights" so that you can assign groups in the manner described in this doc. - -=== That's it! === -The hardest part is always the initial setup. Once you have things configured and figured out it will just run on its own. - -Have a more complicated structure? Apply the same principles here for each additional level of hierarchy that you may have. The key is to create a group at the lowest levels of the structure and then work your way back up. - -== Advanced Options == -SuiteCRM System Administrators can configure many advanced options for Security Suite. This allows you to control various access/rights, inheriting of records, filters and more. - - -[[File:168Security group management.png]] - - -=== Additive Rights === -User gets greatest rights of all roles assigned to you or user's group(s) - -=== Strict Rights === -If a user is a member of several groups only the respective rights from the group assigned to the current record are used. - -=== New User Group Popup === -When creating a new user show the SecurityGroups popup to assign you to a group(s). - -=== User Role Precedence === -If any role is assigned directly to a user that role should take precedence over any group roles. - -=== Filter User List === -Non-admin users can only assign to users in the same group(s) - -=== Use Popup Select === -When a record is created by a user in more than one group popup a group selection screen otherwise inherit that one group. Inheritance rules will only be used for non-user created records (e.g. Workflows, etc). - -=== Use Creator Group Select === -Adds a panel to a record creation screen if a user is a member of more than one inheritable group that allows a user to select one or more groups that you belongs to that should be associated with the newly created record. If a user is in just one group the normal inheritance rules will instead be applied. - -''Note: The new record will still inherit from the Assigned To user or Parent record if these options are set. This setting only overrides the Created By setting.'' - -=== Shared Calendar - Hide Restricted === -By default users can see when other users are busy on the Shared Calendar. Even if you doesn't have rights to the meeting, call, etc. It will display on the calendar, but you cannot view more details unless you have rights to that specific calendar item. By setting this option you cannot see these items on the Shared Calendar; only items that you actually has rights to. - -=== Inherit from Created By User === -The record will inherit all the groups assigned to you who created it. - -=== Inherit from Assigned To User === -The record will inherit all the groups of you assigned to the record. Other groups assigned to the record will NOT be removed. - -=== Inherit from Parent Record === -e.g. If a case is created for a contact the case will inherit the groups associated with the contact. - -=== Default Groups for New Records === -Set groups that should always be attached when a specific module is created. - -=== Inbound email account === -Locks down inbound email accounts in the email client to only list those that belong to the same group as the current user. - -= JJW Maps = -JJW Maps provides mapping functionality for SuiteCRM. JJW Maps is a third party module, provided by [http://www.jjwdesign.com/ JJW Design]. - -Documentation and releases are kept up to date on the [http://www.jjwdesign.com/google-maps-for-sugarcrm/ JJW Maps project page]. - -= Troubleshooting and Support = -At SalesAgility we are advocates of Open Source. As such please do not contact us directly via email or phone for SuiteCRM support. Instead please use our support forum. By using the [https://suitecrm.com/forum/suite-forum forum] the knowledge is shared with everyone in the community. Our developers answer questions on the forum daily but it also gives the other members of the community the opportunity to contribute. If you would like SalesAgility to customise SuiteCRM specifically for your needs, or to provide a hosted and supported CRM solution, then please use our [https://salesagility.com/contact-us contact form]. - -= Summary = -In this guide we have covered various areas of SuiteCRM from the basics of logging in to the complexity of creating automated workflow processes. This guide is a resource to visually assist users in maximising your use of SuiteCRM. You can also visit the [https://suitecrm.com/forum/suite-forum SuiteCRM Community Forums] where there are various topics and a wealth of knowledge provided by the SuiteCRM team and contributing community members. - -= Appendix A = -== Contacts Field List == - -[[File:Contacts.png]] - -== Leads Field List == - -[[File:Leads.png]] - -== Targets Field List == - - -[[File:Targets.png]] - -== Accounts Field List == - - -[[File:Accounts.png]] - -== Opportunities Field List == - - -[[File:Opportunities.png]] - -== Products Field List == - - -[[File:Products.png]] - -== Product Categories Field List == - - -[[File:Product Categories.png]] - -== Quotes Field List == - - -[[File:Quotes.png]] - -== Invoices Field List == - - -[[File:Invoices.png]] - -== Contracts Field List == - - -[[File:Contracts.png]] - -== Line Items Field List == - - -[[File:Line Items.png]] - -== Groups Field List == - - -[[File:Groups.png]] - -== PDF Templates Field List == - - -[[File:PDF Templates.png]] - -== Cases Field List == - - -[[File:Cases.png]] - -== Notes Field List == - - -[[File:Notes.png]] - -== Calls Field List == - - -[[File:Calls.png]] - -== Emails Field List == - - -[[File:Emails.png]] - -== Meetings Field List == - - -[[File:Meetings.png]] - -== Tasks Field List == - - -[[File:Tasks.png]] - -== Projects Field List == - - -[[File:Projects.png]] - -== Project Tasks Field List == - - -[[File:Project Tasks.png]] - -== Campaigns Field List == - - -[[File:Campaigns.png]] - -== Target Lists Field List == - - -[[File:Target Lists.png]] - -== Email Templates Field List == - - -[[File:Email Templates.png]] - -== Documents Field List == - -[[File:Documents.png]] - -== Events Field List == - - -[[File:Events.png]] - -== Locations Field List == - - -[[File:Locations.png]] - -== Users Field List == - - -[[File:Users.png]] - -== Security Groups Field List == - - -[[File:Security Groups.png]] diff --git a/_source/wikifiles/Versions.adoc b/_source/wikifiles/Versions.adoc deleted file mode 100644 index 7ff5877d7..000000000 --- a/_source/wikifiles/Versions.adoc +++ /dev/null @@ -1,110 +0,0 @@ -[cols="",] -|======= -|__TOC__ -|======= - -[cols="",] -|======= -|__TOC__ -|======= - -* **link:Release_notes_7.6.4#SuiteCRM_7.6.4[7.6.4]** -– 30-05-2016
-* **link:Release_notes_7.6.3#SuiteCRM_7.6.3[7.6.3]** -– 17-05-2016
-* **link:Release_notes_7.6.2#SuiteCRM_7.6.2[7.6.2]** -– 10-05-2016
-* **link:Release_notes_7.6.1#SuiteCRM_7.6.1[7.6.1]** -– 03-05-2016
-* **link:Release_notes_7.6#SuiteCRM_7.6.0[7.6.0]** -– 27-04-2016
-* **link:Release_notes_7.5.3#SuiteCRM_7.5.3[7.5.3]** -– 15-03-2016
-* **link:Release_notes_7.5.2#SuiteCRM_7.5.2[7.5.2]** -– 07-03-2016
-* **link:Release_notes_7.5.1#SuiteCRM_7.5.1[7.5.1]** -– 26-01-2016
-* **link:Release_notes_7.5.0#SuiteCRM_7.5.0[7.5.0]** -– 18-01-2016
-* **link:Release_notes_7.4.3#SuiteCRM_7.4.3[7.4.3]** -– 23-11-2015
-* **link:Release_notes_7.4.2#SuiteCRM_7.4.2[7.4.2]** -– 22-10-2015
-* **link:Release_notes_7.4.1#SuiteCRM_7.4.1[7.4.1]** -– 10-11-2015
-* **link:Release_notes_7.4.0#SuiteCRM_7.4.0[7.4.0]** -– 30-10-2015
-* **link:Release_notes_7.3.2#SuiteCRM_7.3.2[7.3.2]** -– 22-10-2015
-* **link:Release_notes_7.3.1#SuiteCRM_7.3.1[7.3.1]** -– 25-08-2015
-* **link:Release_notes_7.3.0#SuiteCRM_7.3.0[7.3.0]** -– 14-08-2015
-* **link:Release_notes_7.2.3#SuiteCRM_7.2.3[7.2.3]** -– 06-08-2015
-* **link:Release_notes_7.1.8#SuiteCRM_7.1.8[7.1.8]** -– 06-08-2015
-* **link:Release_notes_7.2.2#SuiteCRM_7.2.2[7.2.2]** -– 20-05-2015
-* **link:Release_notes_7.1.7#SuiteCRM_7.1.7[7.1.7]** -– 20-05-2015
-* **link:Release_notes_7.2.1#SuiteCRM_7.2.1[7.2.1]** -– 11-03-2015
-* **link:Release_notes_7.1.6#SuiteCRM_7.1.6[7.1.6]** -– 11-03-2015
-* **link:Release_notes_7.2.0#SuiteCRM_7.2.0[7.2.0]** -– 02-03-2015
-* **link:Release_notes_7.1.5#SuiteCRM_7.1.5[7.1.5]** -– 19-01-2015
-* **link:Release_notes_7.1.4#SuiteCRM_7.1.4[7.1.4]** -– 25-09-2014
-* **link:Release_notes_7.1.3#SuiteCRM_7.1.3[7.1.3]** -– 13-08-2014
-* **link:Release_notes_7.1.2#SuiteCRM_7.1.2[7.1.2]** -– 07-07-2014
-* **link:Release_notes_7.1.1#SuiteCRM_7.1.1[7.1.1]** -– 04-04-2014
-* **link:Release_notes_7.1.0#SuiteCRM_7.1.0[7.1.0]** -– 31-03-2014
-* **link:Release_notes_7.0.2#SuiteCRM_7.0.2[7.0.2]** -– 20-01-2014
-* **link:Release_notes_7.0.1#SuiteCRM_7.0.1[7.0.1]** -– 04-11-2013
-* **link:Release_notes_7.0.0#SuiteCRM_7.0.0[7.0.0]** -– 21-10-2013
- -`     ``esw4seuplkh7ciuxif26u6najyikllf` + -`   ` + -` ` diff --git a/_source/wikifiles/Versions.wiki b/_source/wikifiles/Versions.wiki deleted file mode 100644 index 74e02bbf1..000000000 --- a/_source/wikifiles/Versions.wiki +++ /dev/null @@ -1,44 +0,0 @@ - -{| align="right" style="padding-left:25px;" -| __TOC__ -|} - -{| align="right" style="padding-left:25px;" -| __TOC__ -|} -* <span style="font-size:110%;">'''[[Release notes 7.6.4#SuiteCRM_7.6.4|7.6.4]]''' &ndash; 30-05-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.6.3#SuiteCRM_7.6.3|7.6.3]]''' &ndash; 17-05-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.6.2#SuiteCRM_7.6.2|7.6.2]]''' &ndash; 10-05-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.6.1#SuiteCRM_7.6.1|7.6.1]]''' &ndash; 03-05-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.6#SuiteCRM_7.6.0|7.6.0]]''' &ndash; 27-04-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.5.3#SuiteCRM_7.5.3|7.5.3]]''' &ndash; 15-03-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.5.2#SuiteCRM_7.5.2|7.5.2]]''' &ndash; 07-03-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.5.1#SuiteCRM_7.5.1|7.5.1]]''' &ndash; 26-01-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.5.0#SuiteCRM_7.5.0|7.5.0]]''' &ndash; 18-01-2016 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.4.3#SuiteCRM_7.4.3|7.4.3]]''' &ndash; 23-11-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.4.2#SuiteCRM_7.4.2|7.4.2]]''' &ndash; 22-10-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.4.1#SuiteCRM_7.4.1|7.4.1]]''' &ndash; 10-11-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.4.0#SuiteCRM_7.4.0|7.4.0]]''' &ndash; 30-10-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.3.2#SuiteCRM_7.3.2|7.3.2]]''' &ndash; 22-10-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.3.1#SuiteCRM_7.3.1|7.3.1]]''' &ndash; 25-08-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.3.0#SuiteCRM_7.3.0|7.3.0]]''' &ndash; 14-08-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.2.3#SuiteCRM_7.2.3|7.2.3]]''' &ndash; 06-08-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.1.8#SuiteCRM_7.1.8|7.1.8]]''' &ndash; 06-08-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.2.2#SuiteCRM_7.2.2|7.2.2]]''' &ndash; 20-05-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.1.7#SuiteCRM_7.1.7|7.1.7]]''' &ndash; 20-05-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.2.1#SuiteCRM_7.2.1|7.2.1]]''' &ndash; 11-03-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.1.6#SuiteCRM_7.1.6|7.1.6]]''' &ndash; 11-03-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.2.0#SuiteCRM_7.2.0|7.2.0]]''' &ndash; 02-03-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.1.5#SuiteCRM_7.1.5|7.1.5]]''' &ndash; 19-01-2015 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.1.4#SuiteCRM_7.1.4|7.1.4]]''' &ndash; 25-09-2014 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.1.3#SuiteCRM_7.1.3|7.1.3]]''' &ndash; 13-08-2014 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.1.2#SuiteCRM_7.1.2|7.1.2]]''' &ndash; 07-07-2014 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.1.1#SuiteCRM_7.1.1|7.1.1]]''' &ndash; 04-04-2014 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.1.0#SuiteCRM_7.1.0|7.1.0]]''' &ndash; 31-03-2014 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.0.2#SuiteCRM_7.0.2|7.0.2]]''' &ndash; 20-01-2014 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.0.1#SuiteCRM_7.0.1|7.0.1]]''' &ndash; 04-11-2013 </span><br /> -* <span style="font-size:110%;">'''[[Release notes 7.0.0#SuiteCRM_7.0.0|7.0.0]]''' &ndash; 21-10-2013</span><br /> - esw4seuplkh7ciuxif26u6najyikllf - - - diff --git a/_source/wikifiles/pandoc-many.sh b/_source/wikifiles/pandoc-many.sh deleted file mode 100644 index a7dd60091..000000000 --- a/_source/wikifiles/pandoc-many.sh +++ /dev/null @@ -1,22 +0,0 @@ -# This script was created to convert a directory full -# of wikimedia files into adoc equivalents. It uses -# pandoc to do the conversion. -# -# 1. Install pandoc from http://johnmacfarlane.net/pandoc/ -# 2. Copy this script into the directory containing the .md files -# 3. Ensure that the script has execute permissions -# 4. Run the script -# -# By default this will keep the original file - -FILES=*.wiki -for f in $FILES -do - # extension="${f##*.}" - filename="${f%.*}" - echo "Converting $f to $filename.adoc" - `pandoc "$f" -f mediawiki -t asciidoc -o "$filename.adoc"` - # uncomment this line to delete the source file. - # rm $f -done - diff --git a/bin/htmltest b/bin/htmltest index 6c4001a6b..4e05c8e69 100755 Binary files a/bin/htmltest and b/bin/htmltest differ diff --git a/build.sh b/build.sh new file mode 100644 index 000000000..1feebe4b3 --- /dev/null +++ b/build.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +# output some version numbers: +cat /etc/issue +asciidoctor -V +echo ------------- +echo Some Netlify environment variables you might want to know: +echo BASE_URL is $BASE_URL +echo BUILD_ID is $BUILD_ID +echo CONTEXT is $CONTEXT +echo DEPLOY_PRIME_URL is $DEPLOY_PRIME_URL +echo URL is $URL +echo DEPLOY_URL is $DEPLOY_URL +echo REPOSITORY_URL is $REPOSITORY_URL +echo BRANCH is $BRANCH +echo COMMIT_REF is $COMMIT_REF +echo ------------- +bundle env + +# the main call to Hugo, passing it all parameters from the command-line: +echo Running Hugo with arguments: "$@" +hugo "$@" +hugoReturnCode=$? + +# now the other steps in the pipeline, currently it's just htmltest, which doesn't count for the Result code +# (it can fail or not, but it's the Hugo result code that gets signalled to Netlify in the exit) +if [ $hugoReturnCode -ne 0 ] + then + echo "Hugo failed with return code "$hugoReturnCode"!!! ------------------------------------ !!!" + else + echo --------------------------------------------------------- + echo -------- Hugo succeeded, running htmltest... ------------ + echo --------------------------------------------------------- + # they provide a nice installer of the latest version: + curl https://htmltest.wjdp.uk | bash + # the tee and the rest are for counting errors by kind: + ./bin/htmltest | tee >(grep -v 'errors in\|failed in\|htmltest started\|======' | cut -d '-' -f 1 | sort | uniq -c -w 10) + echo --------------------------------------------------------- +fi + +exit $hugoReturnCode diff --git a/config.toml b/config.toml index 44f228600..40b55b2b4 100644 --- a/config.toml +++ b/config.toml @@ -8,6 +8,7 @@ metaDataFormat = "yaml" defaultContentLanguageInSubdir= false enableGitInfo = true timeout = 37000 +ignoreErrors = ["error-remote-getjson"] [params] GitHubRepo = "https://github.com/salesagility/SuiteDocs/" @@ -25,12 +26,18 @@ home = [ "HTML", "RSS", "JSON"] section = [ "HTML", "RSS"] [Languages] + +# ------------------------------------------------------------ +# ------------------ ENGLISH --------------------------------- +# ------------------------------------------------------------ + [Languages.en] # the following site title appears as PageTitle :: SiteTitle on every page; it will be the tab name on the browser title = "SuiteCRM Documentation" #title = "Docs" weight = 1 languageName = "English" +languageDir = "/" [[Languages.en.menu.shortcuts]] name = " Blog" @@ -55,10 +62,15 @@ name = " Credits" url = "/credits" weight = 30 +# ------------------------------------------------------------ +# ------------------ SPANISH --------------------------------- +# ------------------------------------------------------------ + [Languages.es] title = "Documentación de SuiteCRM" weight = 2 languageName = "Español" +languageDir = "/es/" [[Languages.es.menu.shortcuts]] name = " GitHub" @@ -93,9 +105,47 @@ weight = 30 # url = "https://gohugo.io/" # weight = 20 - +# ------------------------------------------------------------ +# ------------------ RUSSIAN --------------------------------- +# ------------------------------------------------------------ [Languages.ru] title = "SuiteCRM - Русскоязычная документация" weight = 3 languageName = "Русский" +languageDir = "/ru/" + +# ------------------------------------------------------------ +# ------------------ PORTUGUESE ------------------------------ +# ------------------------------------------------------------ + +[Languages.pt] +#title = "SuiteCRM Documentation" +title = "Docs" +weight = 4 +languageName = "Português" +languageDir = "/pt/" + +[[Languages.pt.menu.shortcuts]] +name = " Blog" +url = "blog" +weight = 10 + +[[Languages.pt.menu.shortcuts]] +name = " Github" +identifier = "ds" +url = "https://github.com/salesagility/SuiteCRM" +weight = 11 + + +# [[Languages.en.menu.shortcuts]] +# name = " Hugo Documentation" +# identifier = "hugodoc" +# url = "https://gohugo.io/" +# weight = 20 + +[[Languages.pt.menu.shortcuts]] +name = " Créditos" +url = "/credits" +weight = 30 + diff --git a/content/8.x/_index.en.adoc b/content/8.x/_index.en.adoc new file mode 100644 index 000000000..6df1820e2 --- /dev/null +++ b/content/8.x/_index.en.adoc @@ -0,0 +1,10 @@ +--- +title: "SuiteCRM 8 Guide" +weight: 50 +pre: "5. " +--- + +=== Table of Contents +{{% children depth="3" showhidden="false" %}} + + diff --git a/content/8.x/_index.ru.adoc b/content/8.x/_index.ru.adoc new file mode 100644 index 000000000..094c474fb --- /dev/null +++ b/content/8.x/_index.ru.adoc @@ -0,0 +1,13 @@ +--- +title: "SuiteCRM 8 - Руководство" +weight: 50 +pre: "5. " +--- + +:author: likhobory +:email: likhobory@mail.ru + +=== Оглавление +{{% children depth="3" showhidden="false" %}} + + diff --git a/content/8.x/admin/Compatibility Matrix.adoc b/content/8.x/admin/Compatibility Matrix.adoc new file mode 100644 index 000000000..fea3dbd08 --- /dev/null +++ b/content/8.x/admin/Compatibility Matrix.adoc @@ -0,0 +1,48 @@ +--- +Title: Compatibility Matrix +weight: 60 +--- + +{{% notice note %}} +The following documentation is for SuiteCRM Version 8+; to see documentation on the same topic for Version 7, click link:../../../admin/compatibility-matrix[here]. +{{% /notice %}} + +== Versions + +=== SuiteCRM 8.0.x + +[[smaller-table-spacing-8]] +[cols="1s,2" ] +|======== + +2+^h| Platform + +| Linux, Unix, Mac OS | Any version supporting PHP +| PHP | 7.3, 7.4, 8.0 + +2+^| Additional requirements for Development + +| Angular CLI | 12+ +| Node.js | 12.14 +| yarn | 1.22.10+ + +2+^h| Web Server + +| Apache |2.2, 2.4 + +2+^h| Database + +| MariaDB |10.3, 10.4, 10.5, 10.6 + +| MySQL |5.7, 8.0 + +2+^h| Browsers + +| Chrome |90+ + +| Firefox |90+ + +| Edge (Chromium) |89+ + +| Safari |14+ +|======== diff --git a/content/8.x/admin/Compatibility Matrix.ru.adoc b/content/8.x/admin/Compatibility Matrix.ru.adoc new file mode 100644 index 000000000..42f9cb291 --- /dev/null +++ b/content/8.x/admin/Compatibility Matrix.ru.adoc @@ -0,0 +1,47 @@ +--- +Title: Таблица совместимости +weight: 60 +--- +{{% notice note %}} +Это страница содержит таблицу совместимости для SuiteCRM Версии 8. Таблица совместимости для SuiteCRM версии 7 находится link:../../../admin/compatibility-matrix[здесь]. +{{% /notice %}} + +== Версии SuiteCRM + +=== SuiteCRM 8.0.x + +[[smaller-table-spacing-8]] +[cols="1s,2" ] +|======== + +2+^h| Platform + +| Linux, Unix, Mac OS | Любая версия с поддержкой PHP +| PHP | 7.3, 7.4, 8.0 + +2+^| Дополнительные требования для разработчиков + +| Angular CLI | 12+ +| Node.js | 12.14 +| yarn | 1.22.10+ + +2+^h| Веб-сервер + +| Apache |2.2, 2.4 + +2+^h| Базы данных + +| MariaDB |10.3, 10.4, 10.5, 10.6 + +| MySQL |5.7, 8.0 + +2+^h| Браузеры + +| Chrome |90+ + +| Firefox |90+ + +| Edge (Chromium) |89+ + +| Safari |14+ +|======== diff --git a/_source/wikifiles/Licensing.adoc b/content/8.x/admin/Licensing.adoc similarity index 60% rename from _source/wikifiles/Licensing.adoc rename to content/8.x/admin/Licensing.adoc index 7dd62c65c..91eef5b35 100644 --- a/_source/wikifiles/Licensing.adoc +++ b/content/8.x/admin/Licensing.adoc @@ -1,3 +1,11 @@ + +--- +Title: Licensing +Weight: 30 +--- + +:imagesdir: /images/en/user + SuiteCRM is released under http://en.wikipedia.org/wiki/Affero_General_Public_License[AGPL version 3]. diff --git a/content/8.x/admin/Licensing.ru.adoc b/content/8.x/admin/Licensing.ru.adoc new file mode 100644 index 000000000..4e1d03f28 --- /dev/null +++ b/content/8.x/admin/Licensing.ru.adoc @@ -0,0 +1,14 @@ +--- +Title: Лицензия +Weight: 30 +--- + +:author: likhobory +:email: likhobory@mail.ru + + +:imagesdir: /images/en/user + +SuiteCRM выпускается под лицензией +http://licenseit.ru/wiki/index.php/GNU_Affero_General_Public_License_version_3[AGPL version +3]. diff --git a/content/8.x/admin/_index.en.adoc b/content/8.x/admin/_index.en.adoc new file mode 100644 index 000000000..45868fa0f --- /dev/null +++ b/content/8.x/admin/_index.en.adoc @@ -0,0 +1,9 @@ +--- +title: "Administrator Guide" +weight: 30 +--- + +=== Table of Contents +{{% children depth="2" showhidden="false" %}} + + diff --git a/content/8.x/admin/_index.ru.adoc b/content/8.x/admin/_index.ru.adoc new file mode 100644 index 000000000..1c13e1e5e --- /dev/null +++ b/content/8.x/admin/_index.ru.adoc @@ -0,0 +1,10 @@ +--- +Title: "Руководство администратора" +Weight: 20 +--- + +:author: likhobory +:email: likhobory@mail.ru + +=== Оглавление +{{% children depth="3" showhidden="false" %}} diff --git a/content/8.x/admin/installation-guide/Downloading & Installing.adoc b/content/8.x/admin/installation-guide/Downloading & Installing.adoc new file mode 100644 index 000000000..0bcadf1aa --- /dev/null +++ b/content/8.x/admin/installation-guide/Downloading & Installing.adoc @@ -0,0 +1,449 @@ +--- +title: Downloading & Installing +weight: 20 +--- + +:imagesdir: /images/en/8.x/admin/install-guide + +:toc: + +{{% notice info %}} +The following documentation is for SuiteCRM Version 8+; to see documentation on the same topic for Version 7, click link:../../../../admin/installation-guide/downloading-installing[here]. +{{% /notice %}} + + +== 1. Setup your webserver for SuiteCRM + +{{% notice note %}} +The following documentation will use as base setup a LAMP stack: Linux, Apache, MySql and php. However, most of the steps may apply to other webservers and databases +{{% /notice %}} + +=== 1.1 Install required software + +Install the platform-appropriate version of the following: + +* webserver: `apache` +* `php` +* database: `mysql` or `mariadb` + +See the link:../../compatibility-matrix/[Compatibility matrix] to ensure you have the correct versions of the required softwares. + +{{% notice note %}} +there are other software dependencies on the link:../../compatibility-matrix/[Compatibility matrix], however those are the ones required for a development environment. +{{% /notice %}} + +When installing SuiteCRM from pre-build installable package zip you **do not** need to install the dependencies that are for development, namely: node, angular cli, yarn/npm. + +The SuiteCRM 8 pre-built installable package zip comes with the pre-built front end files under `public/dist` and all the required libs on vendors. + + +==== Helpfull Resources + +On how to install a development LAMP stack on Ubuntu: + +* link:https://www.digitalocean.com/community/tutorials/how-to-install-php-7-4-and-set-up-a-local-development-environment-on-ubuntu-20-04[DigitalOcean - Tutorial on how to install LAMP development environment,window=_blank] + + +=== 1.2 Install required php modules + +Install on your server the required php modules: + +* cli +* curl +* common +* intl +* json +* gd +* mbstring +* mysqli +* pdo_mysql +* openssl +* soap +* xml +* zip +* imap (optional) +* ldap (optional) + +==== Helpfull Resources + +Please check the `Helpfull Resources` section from link:#_1_1_install_required_software[Install required software] for instructions on how to install php modules + +=== 1.3 Configuring URL re-writes + +In order for api routes to work you need allow url re-writes. + +* All SuiteCRM-Core api calls depend on this (calls to `api/graphql`) if re-rewrites are not allowed you will get a `404` when calling the api. + +In `apache` webserver this can be achieved by enabling mod-rewrite and configuring the vhost. + +{{% notice note %}} +It is highly recommended that you update the webroot or configure vhost to point to the `public` folder inside SuiteCRM folder. If the webroot is pointing to SuiteCRM folder instead of the public folder, all the files under SuiteCRM folder maybe be exposed to the web. +{{% /notice %}} + + +On your vhost configuration you need something like: + +[source,xml] +---- + + ... + + DocumentRoot //public + /public> + AllowOverride All + Order Allow,Deny + Allow from All + + + +---- + + +==== Helpfull resources: + +* link:https://symfony.com/doc/current/setup/web_server_configuration.html#apache-with-mod-php-php-cgi[Symfony documentation on how to setup webserver (apache and others),window=_blank] +* link:https://www.digitalocean.com/community/tutorials/how-to-set-up-mod_rewrite[DigitalOcean - Tutorial on how to setup mod_write (apache),window=_blank] +** Note from the above you would only need: +*** Section 1—How to Activate Mod_Rewrites +*** How to permit changes in the .htaccess file: + +=== 1.4 Configure php error_reporting + +Please make sure that notices aren't considered on `error_handling`. For that you can update the error handling entry in `php.ini` + +[source,ini] +---- +error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE & ~E_WARNING +---- + + +==== Helpfull Resources + +Please check the `Helpfull Resources` section from link:#_1_1_install_required_software[Install required software] for instructions on where to find `php.ini` + + +=== 1.5 (optional) (recommended for production) Enable op cache + +Enabling op cache will greatly improve performance. Though its only recommended for production environments. + +To enable op cache you have to enable and configure it on php.ini. + +* The following example is based on the Symfony documentation that you will find in the `Helpfull resources` + +[source,ini] +---- + +[opcache] +; Determines if Zend OPCache is enabled +zend_extension=opcache.so +opcache.enable=1 + +; The OPcache shared memory storage size. +opcache.memory_consumption=256 + +; The maximum number of keys (scripts) in the OPcache hash table. +; Only numbers between 200 and 100000 are allowed. +opcache.max_accelerated_files=20000 + +; When disabled, you must reset the OPcache manually or restart the +; webserver for changes to the filesystem to take effect. +opcache.validate_timestamps=0 +---- + +==== Helpfull resources: + +For a deeper understanding of the above we recommend reading the following: + +* link:https://symfony.com/doc/current/performance.html[Symfony documentation - Performance,window=_blank] +* link:https://api-platform.com/docs/core/performance/#enabling-the-metadata-cache[ApiPlatform documentation - Performance,window=_blank] +** From the ApiPlatform documentation have have a look at `Enabling the Metadata Cache` + + +''' + +== 2. Downloading and Setting up SuiteCRM + +=== 2.1 Downloading the latest SuiteCRM files + +Unless you want to setup a development environment, you should download the pre-built installable packages available for download on link:https://suitecrm.com[suitecrm.com,window=_blank] + +See the link:../../releases/8.0/[SuiteCRM 8 releases page] + +=== 2.2 Copy the files to your webserver root + +After you download the package + +. Unzip the pre-build installable package. +. Copy the the files to your web server web root. + +For `apache` webserver the web root is usually under `/var/www` or `/var/www/html` + +{{% notice note %}} +Please consider the `DocumentRoot` you have set on your vhost (if using apache). See link:#_1_3_configuring_url_re_writes[1.3 Configuring URL re-writes] +{{% /notice %}} + +{{% notice note %}} +Adding the files to the web root is the most typical install method, but you can have different setups, like subdomains and others. +{{% /notice %}} + + + +=== 2.3 Set permissions + +Set the required permissions + +If you are using the terminal you can do this by running: + +[source,bash] +---- +find . -type d -not -perm 2755 -exec chmod 2755 {} \; +find . -type f -not -perm 0644 -exec chmod 0644 {} \; +find . ! -user www-data -exec chown www-data:www-data {} \; +chmod +x bin/console +---- + +Please have in mind that: + +* The user and group name (in the above example `www-data`) needs to be replaced by the actual system user and group that your webserver runs under. This varies depending on your +operating system. Common web server users are as follows: +** `www-data` (Ubuntu Linux/Apache) +** `apache` (Linux/Apache) + +* If the group name differs from the username apache is running with, you may need `0664` instead of `0644`, and `2775` instead of `2755` + +=== 2.4 (optional) Creating the database + +Depending on your setup, you maybe required to create the database before you go through the install process. + +The install process will then create the needed tables. + +''' + +== 3. Running the installer + +From SuiteCRM version 8 and above you have two ways to run installer: + +. link:#_3_1_option_1_installing_using_the_install_page[3.1 Option 1: Installing using the install page] +. link:#_3_2_option_2_installing_using_the_cli[3.2 Option 2: Installing using the cli] + +Following you can find documentation on how to install using the web installer or the cli. + +=== 3.1 Option 1: Installing using the install page + +To run the web installer go to `https:///` + +Since you are not installed this should re-direct you to `https:///#/install` + +Where you should see a view like the following + +image:web-ui-install-license.png[web-ui-install-license.png] + +==== 2.1.1 Accept the license + +In order to be able to install you'll have to accept the license by checking the `I ACCEPT` checkbox. + +==== 2.1.2 Setup basic system configuration + +The next step is to add the base system configuration in order for your system to work. + +image:web-ui-install-configuration.png[web-ui-install-configuration.png] + +{{% notice note %}} +On this page apart from `Ignore system check warnings` all fields are required and need to be set a value. +{{% /notice %}} + +In this tab you will find the following configurations: + +==== 2.1.2.1 URL OF SUITECRM INSTANCE + +image:web-ui-install-url.png[web-ui-install-url.png] + +In the above field you should set the url where your SuiteCRM instance is located. A few example: + +* `https://example-domain.com` +* `https://localhost` +* `https://crm.example-domain.com` + +**Tip: ** you can simply copy the url from you browser's address bar + +==== 2.1.2.2 SuiteCRM Database User + +image:web-ui-install-db-user.png[web-ui-install-db-user.png] + +In the above field you should set the user name for accessing your database. + +{{% notice note %}} +Ensure that the Database Administrator you specify has the permissions to create and write to the SuiteCRM database. +{{% /notice %}} + +==== 2.1.2.3 SuiteCRM Database User Password + +image:web-ui-install-db-user-password.png[web-ui-install-db-user-password.png] + +In the above field you should set the password for accessing your database. + + +==== 2.1.2.4 Host Name + +image:web-ui-install-db-host.png[web-ui-install-db-host.png] + +In the above field you should set the host of your database. + +{{% notice note %}} +In some systems when using `localhost` doctrine will try to use socket connection. However, socket connection is not supported at the moment, so in such cases, its maybe best to try with the ip, e.g. `127.0.0.1` +{{% /notice %}} + +==== 2.1.2.5 Database Name + +image:web-ui-install-db-name.png[web-ui-install-db-name.png] + +In the above field you should set the name you want for the databases that will be created on your host during the install process, e.g. `suite` or `suitecrm` or another valid db name. + +==== 2.1.2.6 Database Port + +image:web-ui-install-db-port.png[web-ui-install-db-port.png] + +In the above field is set to the default port user in `mysql` and `mariadb` database engines. You should only change it in case your database host is using a different port. + +==== 2.1.2.7 POPULATE DATABASE WITH DEMO DATA + +image:web-ui-install-demo-data.png[web-ui-install-demo-data.png] + +In the above field you can set if, during the install process, you want to pre-populate your database with demo data. + +==== 2.1.2.8 SuiteCRM Application Admin Name + +image:web-ui-install-admin-username.png[web-ui-install-admin-username.png] + +In the above field you can set the username for your SuiteCRM instance's administrator user, e.g. `admin` or any other username you want to give. + +==== 2.1.2.9 SuiteCRM Admin User Password + +image:web-ui-install-admin-password.png[web-ui-install-admin-password.png] + +In the above field you can set the password for your SuiteCRM instance's administrator user. + +==== 2.1.3 Ignoring install warnings + +image:web-ui-install-ignore-warnings.png[web-ui-install-ignore-warnings.png] + +Before running the install process, SuiteCRM is going to check for some system requirements, like `max upload file size` or `memory limit`. Some of these checks are optional, meaning that you can install the system without those. +In case you want to proceed with the installation even if there are warnings you can check the `Ignore System Check Warnings` checkbox + +==== 2.1.4 Run the install + +After you have accepted the license and set correct values for all the configurations you can click on `Proceed`. + +This is going to trigger the install process. +As explained before the install process will first check for some system requirements. + +If there any errors during the validation, the install process will halt and a modal will open with a description of the checks that failed. + +If all the checks passed the system will continue on to the install process. During the install process you will see a loading spinner on the page. This process can take some time. + +After the install process finishes you will be re-directed to the login page. + +==== 2.1.6 Access the app + +Try to login into your instance + + +=== 3.2 Option 2: Installing using the cli + + +==== 3.2.1 Install the system + +* Run command: +. Option 1 - Run `./bin/console suitecrm:app:install` without any options, the command will ask you for the required options +. Option 2 - Run `./bin/console suitecrm:app:install` in one line by passing the required options the. See the section below for more detail. + + +[source,bash] +---- +./bin/console suitecrm:app:install -u "admin_username" -p "admin_password" -U "db_user" -P "db_password" -H "db_host" -N "db_name" -S "site_url" -d "demo_data" +---- + +*Further Info* + +[source,bash] +---- +#Example +./bin/console suitecrm:app:install -u "admin" -p "pass" -U "root" -P "dbpass" -H "mariadb" -N "suitecrm" -S "https://yourcrm.com/" -d "yes" +---- + +To get more information on the supported arguments you can run: `./bin/console suitecrm:app:install --help`. Which should show a list similar to the following: + +image:suite-cli-install-options.png[suite-cli-install-options.png] + + +The following sub-sections provide a brief explanation of each parameter you can set + +==== 3.2.1.1 site_url + +In the above parameter you should set the url where your SuiteCRM instance is located. A few example: + +* `https://example-domain.com` +* `https://localhost` +* `https://crm.example-domain.com` + +**Tip: ** you can simply copy the url from you browser's address bar + +==== 3.2.1.2 db_user + +In the above parameter you should set the user name for accessing your database. + +{{% notice note %}} +Ensure that the Database Administrator you specify has the permissions to create and write to the SuiteCRM database. +{{% /notice %}} + +==== 3.2.1.3 db_password + +In the above parameter you should set the password for accessing your database. + +==== 3.2.1.4 db_host + +In the above parameter you should set the host of your database. + +{{% notice note %}} +in some systems when using `localhost` doctrine will try to use socket connection. However, socket connection is not supported at the moment, so in such cases, its maybe best to try with the ip, e.g. `127.0.0.1` +{{% /notice %}} + +==== 3.2.1.5 db_name + +In the above parameter you should set the name you want for the databases that will be created on your host during the install process, e.g. `suite` or `suitecrm` or another valid db name. + +==== 3.2.1.6 db_port + +In the above parameter is set to the default port user in `mysql` and `mariadb` database engines. You should only change it in case your database host is using a different port. + +==== 3.2.1.7 demo_data + +In the above parameter you can set if, during the install process, you want to pre-populate your database with demo data. + +Possible values: 'yes' , 'no'. + +==== 3.2.1.8 admin_username + +In the above parameter you can set the username for your SuiteCRM instance's administrator user, e.g. `admin` or any other username you want to give. + +==== 3.2.1.9 admin_password + +In the above parameter you can set the password for your SuiteCRM instance's administrator user. + +==== 3.2.1.10 sys_check_option + +Ignoring install warnings + +Before running the install process, SuiteCRM is going to check for some system requirements, like `max upload file size` or `memory limit`. Some of these checks are optional, meaning that you can install the system without those. +In case you want to proceed with the installation even if there are warnings you can check the `Ignore System Check Warnings` checkbox + +Possible values: 'true' (for ignoring) , 'false' (for *not* ignoring). + +==== 3.2.2 Re-set permissions + +After allowing time for the installation to complete, again set permissions as done in step link:#_2_3_set_permissions[2.3 Set permissions]. + +==== 3.2.3 Access the app + +You should now be able to access the instance at the `https://` + diff --git a/content/8.x/admin/installation-guide/Downloading & Installing.ru.adoc b/content/8.x/admin/installation-guide/Downloading & Installing.ru.adoc new file mode 100644 index 000000000..6937df987 --- /dev/null +++ b/content/8.x/admin/installation-guide/Downloading & Installing.ru.adoc @@ -0,0 +1,274 @@ +--- +title: Установка SuiteCRM +weight: 20 +--- + +:author: likhobory +:email: likhobory@mail.ru + +:toc: +:toc-title: Оглавление +:toclevels: 3 + +:experimental: + +:imagesdir: /images/ru/8.x/admin/Installing + +ifdef::env-github[:imagesdir: ./../../../../static/images/ru/8.x/admin/Installing] + +:btn: btn: + +ifdef::env-github[:btn:] + +{{% notice info %}} +Это страница содержит описание для SuiteCRM Версии 8. Описание для SuiteCRM версии 7 находится link:../../../../admin/installation-guide/downloading-installing[здесь]. +{{% /notice %}} + +Если вы впервые устанавливаете SuiteCRM, следуйте этому описанию. Если вы обновляете ранее установленную вервию, обратитесь к разделу link:../upgrading[Обновление системы]. + +== Подготовка к установке + + . Установите версию PHP, веб-сервер, и базу данных, руководствуясь информацией, указанной в link:../../compatibility-matrix[Таблице совместимости^]. + + . Установите следующие php-модули: + * cli + * curl + * common + * intl + * json + * gd + * mbstring + * mysqli + * pdo_mysql + * openssl + * soap + * xml + * zip + * imap (опционально) + * ldap (опционально) + +[horizontal] +*Полезные ссылки*:: link:https://www.digitalocean.com/community/tutorials/how-to-install-php-7-4-and-set-up-a-local-development-environment-on-ubuntu-20-04[DigitalOcean - Установка программного окружения^] + +[start=3] + . Загрузите SuiteCRM со страницы https://suitecrm.com/download + . Скопируйте загруженные файлы из архива в соответствующую папку веб-сервера и установите необходимые права (см. ниже). + +{{% notice note %}} +Обратите внимание, что часть программного обеспечения, указанного в таблице совместимости, необходима только для разработчиков, и при установке пакета, предлагаемого на официальной странице загрузки, *нет необходимости* в установке node, angular и yarn/npm. Загружаемый пакет уже содержит все необходимые файлы в папке *public/dist*. +{{% /notice %}} + +{{% notice note %}} +Если вы используете веб-сервер *apache*, убедитесь, что модуль `mod_rewrite` включён и корректно настроен. Модуль используется при вызове SuiteCRM-Core API, и, если перенаправление отключено, вы получите ошибку `404`. +{{% /notice %}} + + +[cols="1s,3a"] +|=== +|Полезные ссылки |link:https://www.digitalocean.com/community/tutorials/how-to-set-up-mod_rewrite[DigitalOcean - настройка mod_rewrite^] (см. разделы *_How to Activate Mod_Rewrites_* и *_How to permit changes in the .htaccess file_*) +|=== + +Настройте корневую папку веб-сервера таким образом, чтобы она указывала на папку *public*, в этом случае другие файлы и папки не будут доступны из внешней сети. + +Если используется виртуальный хост, то настройка может выглядеть следующим образом: + +[source,xml] +---- + + ... + + DocumentRoot //public + /public> + AllowOverride All + Order Allow,Deny + Allow from All + + + +---- + +[cols="1s,3a"] +|=== +|Полезные ссылки |link:https://symfony.com/doc/current/setup/web_server_configuration.html#apache-with-mod-php-php-cgi[Symfony - настройка веб-сервера^] +|=== + +== Настройка директивы error_reporting + +Убедитесь, что при обработке ошибок не учитываются нефатальные уведомления. Для этого настройте директиву `error_reporting` в файле `php.ini` + +[source,ini] +---- +error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE & ~E_WARNING +---- + + +== Установка прав + +Перейдите в папку, в которую был распакован пакет SUiteCRM и установите права, как это показано ниже: + +[source,bash] +---- +find . -type d -not -perm 2775 -exec chmod 2755 {} \; +find . -type f -not -perm 0644 -exec chmod 0644 {} \; +find . ! -user www-data -exec chown www-data:www-data {} \; +chmod +x bin/console +---- + +* При необходимости замените пользователя *www-data* на пользователя, под которым запущен веб-сервер. + +Пользователи, имеющие полный доступ к файлам системы, могут различаться в зависимости от используемой конфигурации системы, например: +** www-data (Linux/Apache) +** apache (Linux/Apache) +** nobody (Linux/Apache) + +* Если имя группы отличается от имени пользователя, под которым работает apache, вам могут понадобиться права `0664` вместо `0644` и `2775` вместо `2755`. + +{{% notice note %}} +Приведённые выше команды могут различаться в зависимости от используемой вами ОС. Если у вас возникли трудности с установкой прав - задайте необходимые вопросы на нашем link:https://community.suitecrm.com[форуме^]. +{{% /notice %}} + +{{% notice note %}} +В зависимости от настроек, вам, возможно, потребуется создать базу данных *до* установки системы. В процессе установки в базу данных будут добавлены необходимые таблицы. +{{% /notice %}} + +== Установка системы + +Возможны два варианта установки: + +* Используя мастер установки в веб-интерфейсе браузера +* Используя установку из <<Установка из командной строки,командной строки>> + +=== Использование мастера установки + +. В адресной строке браузера введите: *_\http://<АдресСервера>/<ПутьКПапкеСФайламиSuiteCRM>_* , если система ещё не была установлена, то произойдет перенаправление на адрес *_\http://<АдресСервера>/<ПутьКПапкеСФайламиSuiteCRM>/#/install>_* + +image:lic.png[SuiteCRM 8 - Лицензионное соглашение] + +. Примите лицензионное соглашение и перейдите на закладку *Конфигурация*. + +image:conf.png[SuiteCRM 8 - Настройка основных параметров при установке] + +{{% notice note %}} +Все перечисленные здесь параметры (за исключение параметра *Игнорировать предупреждения при проверке системы*) являются обязательными. +{{% /notice %}} + +[start=2] +. Ведите необходимые данные: + +[cols="1s,3a"] +|=== +|URL дистрибутива SuiteCRM |Расположение устанавливаемой системы, например: + +* `\https://example-domain.com` +* `\https://localhost` +* `\https://crm.example-domain.com` + +{{% notice tip %}} +Как вариант - скопируйте данные из адресной строки браузера. +{{% /notice %}} + +|Имя пользователя БД | Логин администратора базы данных. + +{{% notice note %}} +Убедитесь, что указанный администратор базы данных имеет разрешения на создание и запись в базу данных SuiteCRM. +{{% /notice %}} + +|Пароль базы данных | Пароль администратора базы данных. +|Имя сервера | Сервер, на котором размещается база данных. Если она расположена там же, где и веб-сервер, то используется значение `localhost` + +{{% notice note %}} +Если при вводе параметра `localhost` соединение не устанавливается, попробуйте указать ip-адрес `127.0.0.1`. +{{% /notice %}} + +|Название базы данных | Имя базы данных для устанавливаемого экземпляра системы, например, `suitecrm`. +|Порт базы данных | Порт, используемой базой данных. Как правило, используется стандартный порт *3306*. Указывайте этот параметр в том случае, если база данных использует нестандартный порт. +|Заполнить базу данных демонстрационными данными | Добавление в базу данных демонстрационных данных. +|Имя администратора системы | Логин администратора системы. +|Пароль администратора | Пароль администратора системы. +|Игнорировать предупреждения при проверке системы | Перед началом установки SuiteCRM проверяет некоторые системные параметры, в частности `max upload file size` и `memory limit`. Некоторые значения этих параметров не являются обязательными на момент установки, и, при необходимости, могут быть изменены позже. Так что если вы хотите пропустить проверку - отметьте этот параметр. +|=== + +[start=3] +. После установки всех необходимых параметров нажмите на кнопку {btn}[Продолжить]. + +Как было указано выше, SuiteCRM проверит некоторые системные параметры. + Если при проверке возникнут ошибки - установка будет остановлена, и вам будет предложено исправить некорректные значения. +Если ошибок не будет обнаружено - установка продолжится, что займет некоторое время. + +После окончания установки вы будете перенаправлены на страницу ввода логина/пароля. + +=== Установка из командной строки + + . Выполните команду: + +** Вариант 1: `./bin/console suitecrm:app:install` без параметров, команда сама запросит необходимые данные +** Вариант 2: `./bin/console suitecrm:app:install` с указанными ниже параметрами: ++ +[source,bash] +---- +./bin/console suitecrm:app:install -u "admin_username" -p "admin_password" -U "db_user" -P "db_password" -H "db_host" -N "db_name" -Z "db_port" -S "site_url" -d "demo_data" +---- ++ +где: + +*** *"admin_username"* - логин администратора системы +*** *"admin_password"* - пароль администратора системы +*** *"db_user"* - логин администратора базы данных + **** Убедитесь, что указываемый администратор БД имеет необходимые права на создание и запись в базу данных SuiteCRM. +*** *"db_password"* - пароль администратора базы данных +*** *"db_host"* - имя хоста для MySQL, MariaDB или SQL Server. Если БД расположена там же, где и веб-сервер, то используется значение `localhost`. ++ +{{% notice note %}} +В некоторых системах при указании `localhost` система попытается установить соединение через сокет. Однако в настоящее время подключение через сокет не поддерживается, поэтому в таких случаях лучше всего использовать ip-адрес `127.0.0.1`. +{{% /notice %}} ++ +*** *"db_name"* - имя базы данных для устанавливаемого экземпляра системы +*** *"db_port"* - Порт, используемый базой данных. Указывайте этот параметр в том случае, если база данных использует нестандартный порт. По умолчанию используется стандартный порт *3306*. +*** *"site_url"* - адрес устанавливаемого экземпляра системы (при необходимости скопируйте данные из адресной строки браузера) +*** *"demo_data"* - добавление в БД демонстрационных данных. Допустимые значения: `yes` или `no`. + +Пример: + +[source,bash] +---- +./bin/console suitecrm:app:install -u "admin" -p "mypass" -U "root" -P "dbpass" -H "localhost" -N "suitecrm" -S "https://yourcrm.com/" -d "yes" +---- + +{{% notice tip %}} +В примере указаны только *обязательные* аргументы. Для получения полного списка всех доступных аргументов выполните следующую команду из папки с установленной системой: `./bin/console suitecrm:app:install --help`. +{{% /notice %}} + +[start=2] + . По завершении установки ещё раз установите соответствующие права, как это было показано в разделе <<Установка прав>>. + + . После всех вышеописанных действий экземпляр системы будет доступен по адресу *\https://yourcrm.com* + +== Включение кеширования (опционально) + +Если система не используется в целях разработки и полностью готова к использованию, то рекомендуется включить OPCache для повышения производительности PHP на веб-сервере, указав в файле php.ini следующие параметры: + +[source,ini] +---- + +[opcache] +; Determines if Zend OPCache is enabled +zend_extension=opcache.so +opcache.enable=1 + +; The OPcache shared memory storage size. +opcache.memory_consumption=256 + +; The maximum number of keys (scripts) in the OPcache hash table. +; Only numbers between 200 and 100000 are allowed. +opcache.max_accelerated_files=20000 + +; When disabled, you must reset the OPcache manually or restart the +; webserver for changes to the filesystem to take effect. +opcache.validate_timestamps=0 +---- + +[cols="1s,3a"] +|=== +|Полезные ссылки +| * link:https://symfony.com/doc/current/performance.html[Symfony documentation - Performance^] + * link:https://api-platform.com/docs/core/performance/#enabling-the-metadata-cache[ApiPlatform documentation - Enabling the Metadata Cache^] +|=== diff --git a/content/8.x/admin/installation-guide/Languages/install-a-new-language.adoc b/content/8.x/admin/installation-guide/Languages/install-a-new-language.adoc new file mode 100644 index 000000000..559fee400 --- /dev/null +++ b/content/8.x/admin/installation-guide/Languages/install-a-new-language.adoc @@ -0,0 +1,49 @@ +--- +Title: "Install New Languages" +Weight: 50 +--- + +:experimental: ////this is here to allow btn:[]syntax used below + +:imagesdir: /images/en/8.x/admin/install-guide/ + +{{% notice note %}} +If you are not adding a new language to SuiteCRM, but rather updating an already +installed language, make sure you start by following the appropriate +link:../update-a-language-pack/[Language Packs Update] guide. +{{% /notice %}} + +== Download a Language pack + +. Choose either https://sourceforge.net/projects/suitecrmtranslations/files/[Stable SuiteCRM Language Packs^] +or https://crowdin.com/project/suitecrmtranslations[Latest Build SuiteCRM Language Packs^] + +. Choose your version and language +. Download ZIP file + +== Installation steps + +. Login as English +image:1.png[1.png] + +. Go to 'Admin / Module Loader' +image:2.png[2.png] image:3.png[3.png] + +. Upload and install the new Language pack (zip file) +image:4.png[4.png] + +image:5.png[5.png] + +. Click btn:[Upload] to send the file to the server +image:6.png[6.png] + +. Click btn:[Install] and confirm to apply the changes +image:7.png[7.png] + +image:8.png[8.png] + +image:9.png[9.png] + +. Go to 'Admin / Repair / Quick Repair and Rebuild +image:2.png[2.png] + +image:10.png[10.png] + +image:11.png[11.png] + +image:12.png[12.png] + +. Logout +image:13.png[13.png] + +. Login for your new language +image:14.png[14.png] + + diff --git a/content/8.x/admin/installation-guide/Languages/install-a-new-language.ru.adoc b/content/8.x/admin/installation-guide/Languages/install-a-new-language.ru.adoc new file mode 100644 index 000000000..08dd55558 --- /dev/null +++ b/content/8.x/admin/installation-guide/Languages/install-a-new-language.ru.adoc @@ -0,0 +1,52 @@ +--- +Title: Русификация SuiteCRM +Weight: 50 +--- + +:author: likhobory +:email: likhobory@mail.ru + +:imagesdir: /images/ru/admin/Installing/Languages + +ifdef::env-github[:imagesdir: ./../../../../master/static/images/ru/admin/Installing/Languages] + +В разделе описано изменение языка интерфейса SuiteCRM на примере установки русскоязычного пакета. + +{{% notice note %}} +Обновление ранее установленного языкового пакета описано в +link:../update-a-language-pack/[этом] разделе. +{{% /notice %}} + + +== Скачивание языкового пакета + +На данный момент доступны следующие публичные пакеты русификации: :: +* https://github.com/likhobory/SuiteCRM7RU[Russian RAPIRA Language Pack^] +* https://crowdin.com/project/suitecrmtranslations[Альтернативный перевод на русский язык, осуществляющийся всеми желающими на основе языковых файлов RAPIRA на сайте crowdin.com^] + +{{% notice note %}} +В языковом пакете RAPIRA используется та же терминология, что и в данном руководстве, с другой стороны - альтернативный пакет обновляется несколько чаще. Окончательный выбор по использованию того или иного пакета остаётся за пользователями системы. +{{% /notice %}} + +{{% notice info %}} +Если система установлена не на ОС WINDOWS, то возможно использование обеих пакетов, поскольку имена языковых файлов отличаются по регистру: в файлах RAPIRA используется суффикс *ru_ru*, в альтернативном переводе - *ru_RU*. +{{% /notice %}} + +== Установка языкового пакета + + . Откройте панель администрирования. + +image:image1.png[Открытие панели администратора] + +[start=2] + . Установите скачанный пакет в систему, как это описано в разделе +link:../../../administration-panel/developer-tools/#_загрузчик_модулей[Загрузчик модулей]. + . Выйдите из системы и войдите в систему заново, предварительно выбрав необходимый язык на странице ввода логина/пароля. + +image:image3.png[Выбор языкового пакета] + +[start=3] + . В панели администрирования при необходимости укажите русский язык в качестве языка системы по умолчанию, как это описано в разделе +link:../../../administration-panel/system/#_региональные_настройки[Региональные настройки]. + +image:image2.png[Установка русского языка в качестве основного языка SuiteCRM] diff --git a/content/8.x/admin/installation-guide/Languages/update-a-language-pack.adoc b/content/8.x/admin/installation-guide/Languages/update-a-language-pack.adoc new file mode 100644 index 000000000..772dc3a01 --- /dev/null +++ b/content/8.x/admin/installation-guide/Languages/update-a-language-pack.adoc @@ -0,0 +1,41 @@ +--- +Title: "Update a Language Pack" +Weight: 60 +--- + +:experimental: ////this is here to allow btn:[]syntax used below + +:imagesdir: /images/en/8.x/admin/install-guide/ + +{{% notice warning %}} +If you have an older translation version already installed you need to remove previous pack and upload a new one. +{{% /notice %}} + +In overview, the process for updating a Language Pack is + +. Uninstall the old language pack +. Run a Quick Repair and Rebuild +. Install the new language pack +. Run a Quick Repair and Rebuild + +== Steps to remove old pack + +. Login as English +image:1.png[1.png] + +. Go to Admin / Module Loader +image:2.png[2.png] + +image:3.png[3.png] + +. Uninstall previous language pack by clicking btn:[Uninstall] followed by btn:[Commit] +image:15.png[15.png] + +image:16.png[16.png] + +image:9.png[9.png] + +. Go to Admin / Repair / Quick Repair and Rebuild +image:2.png[2.png] + +image:10.png[10.png] + +image:11.png[11.png] + +. Logout +image:13.png[13.png] + + +== Steps to install the updated language pack + +Just follow the normal link:../install-a-new-language/[installation steps]. diff --git a/content/8.x/admin/installation-guide/Languages/update-a-language-pack.ru.adoc b/content/8.x/admin/installation-guide/Languages/update-a-language-pack.ru.adoc new file mode 100644 index 000000000..8b3998a3d --- /dev/null +++ b/content/8.x/admin/installation-guide/Languages/update-a-language-pack.ru.adoc @@ -0,0 +1,21 @@ +--- +Title: "Обновление языкового пакета" +Weight: 60 +--- + +:author: likhobory +:email: likhobory@mail.ru + +:imagesdir: /images/ru/admin/Installing/Languages + +ifdef::env-github[:imagesdir: ./../../../../master/static/images/ru/admin/Installing/Languages] + + + . Перед установкой обновлённого языкового пакета удалите ранее установленный пакет, как это описано в разделе +link:../../../administration-panel/developer-tools/#_загрузчик_модулей[Деинсталляция модуля]. + + . Установите новый языковой пакет, как это описано в разделе +link:../install-a-new-language[Русификация SuiteCRM]. + + . В панели администратора выполните link:../../../administration-panel/system/#_восстановление[быстрое восстановление]. + diff --git a/content/8.x/admin/installation-guide/Uninstalling.adoc b/content/8.x/admin/installation-guide/Uninstalling.adoc new file mode 100644 index 000000000..ccf3b0ad6 --- /dev/null +++ b/content/8.x/admin/installation-guide/Uninstalling.adoc @@ -0,0 +1,17 @@ +--- +title: Uninstalling SuiteCRM +weight: 90 +--- + +== Uninstalling a SuiteCRM instance + +Follow these steps to uninstall your SuiteCRM instance: + +. Navigate to the directory within your web server where SuiteCRM is +located. +. Remove the SuiteCRM directory. In Linux, you can use `rm -r ` if you +wish to be prompted, or `rm -rf ` if you wish to delete the +directory without being prompted. +. Delete the SuiteCRM database schema from your server +database. The default is `suitecrm`, but it will differ if it has been +renamed during the installation process. diff --git a/content/8.x/admin/installation-guide/Uninstalling.ru.adoc b/content/8.x/admin/installation-guide/Uninstalling.ru.adoc new file mode 100644 index 000000000..838be846a --- /dev/null +++ b/content/8.x/admin/installation-guide/Uninstalling.ru.adoc @@ -0,0 +1,26 @@ +--- +Title: Удаление системы +Weight: 90 +--- + +:author: likhobory +:email: likhobory@mail.ru + + +== Удаление SuiteCRM + +Если возникла необходимость в удалении системы, то выполните следующее: + + . Перейдите к папке с файлами SuiteCRM + . Удалите папку, пример для Linux: + +[source] +rm -r SuiteCRMFolder + +либо то же действие, но без лишних вопросов: + +[source] +rm -rf SuiteCRMFolder + +[start=3] + . Удалите файлы базы данных (как правило папка называется *_suitecrm_*, если только базе данных не было присвоено другое имя при установке системы). \ No newline at end of file diff --git a/content/8.x/admin/installation-guide/Upgrading.adoc b/content/8.x/admin/installation-guide/Upgrading.adoc new file mode 100644 index 000000000..406772d88 --- /dev/null +++ b/content/8.x/admin/installation-guide/Upgrading.adoc @@ -0,0 +1,251 @@ +--- +Title: Upgrading +weight: 30 +--- + +:imagesdir: /images/en/user + +== Compatibility matrix for upgrade + +{{% notice note %}} +Before running the upgrade, please make sure your system complies with the new version compatibility matrix. +{{% /notice %}} + +Check the link:../../compatibility-matrix[Compatibility Matrix] for complete +information on compatible versions. + +== Upgrading SuiteCRM + +{{% notice info %}} +It is recommend that you run the upgrade process in a development instance and test. Only after testing, deploying the upgraded version on to a production instance +{{% /notice %}} + +{{% notice note %}} +Before upgrading please make sure to create a backup of your instance code and database. +{{% /notice %}} + +=== Upgrading from SuiteCRM 8 Beta 3 to SuiteCRM 8 RC + +{{% notice info %}} +Some bugs were found while testing the upgrade from Beta 3 to RC. +The steps on this section explain how to workaround those problems. +These issues have been fixed on the RC version. +{{% /notice %}} + + +==== 1. Prepare for upgrade. + +To overcome the issues mentioned above, you need to apply the following change on your code base. + +*1* - Open the `config/services/system/upgrades.yaml` config file. + +*2* - Add a `tmp` entry to the `toKeep` section. + +It should look like this: + +[source,yaml] +---- +parameters: + upgrades: + toKeep: + - 'cache' + - 'extensions' + - 'public/extensions' + - 'public/legacy/modules' + - 'public/legacy/custom' + - 'public/legacy/cache' + - 'public/legacy/upload' + - 'public/legacy/Api/V8/OAuth2/private.key' + - 'public/legacy/Api/V8/OAuth2/public.key' + - 'public/legacy/config.php' + - 'public/legacy/config_override.php' + - 'public/legacy/config_si.php' + - 'public/legacy/suitecrm.log' + - 'public/legacy/install.log' + - 'logs' + - '.env.local' + - '.env.local.php' + - 'tmp' + toExpand: + + ... +---- + +*3* - Run: + +* For dev mode run: `composer install` +* For prod mode run: `composer install --no-dev --prefer-dist --optimize-autoloader` + +==== 2. Download the RC package + +*1* - Create the following folder on you current instance: + +* `/tmp/package/upgrade` + +*2* - Download the SuiteCRM 8 RC pre-built / installable package + +*3* - Place the package on the `/tmp/package/upgrade` folder + +*4* - If needed re-set the correct permissions. + +==== 3. Run the upgrade command + +*1* - On your SuiteCRM 8 instance root run: `./bin/console suitecrm:app:upgrade -t ""` + +* Where `` is the name on the SuiteCRM 8 RC package + +{{% notice info %}} +There is a known issue when running the upgrade command from Beta 3 to the RC version. + +The step to overcome that issue are explained next +{{% /notice %}} + +The output of the command should be something like: + +*Note*: please ignore the above `libpng warning` + +[source,bash] +---- +SuiteCRM Upgrade +============ + +Running: check-package +step: check-package | status: done +Package found in path +Running: extract-package +step: extract-package | status: done +Package extracted +Running: check-permissions +step: check-permissions | status: done +Permissions checked +Running: install-upgrade-package +step: install-upgrade-package | status: done +Successfully installed package +Running: run-migrations +step: run-migrations | status: done +Successfully run migrations +Running: legacy-post-upgrade +libpng warning: Interlace handling should be turned on when using png_read_image +libpng warning: Interlace handling should be turned on when using png_read_image +libpng warning: Interlace handling should be turned on when using png_read_image +libpng warning: iCCP: known incorrect sRGB profile +libpng warning: Interlace handling should be turned on when using png_read_image +libpng warning: iCCP: known incorrect sRGB profile +libpng warning: iCCP: known incorrect sRGB profile +libpng warning: iCCP: known incorrect sRGB profile +libpng warning: Interlace handling should be turned on when using png_read_image +step: legacy-post-upgrade | status: done +Post Upgrade process complete + +---- + +In the last step of the command you should get the following error + +[source,bash] +---- +Running: clear-symfony-cache +PHP Fatal error: Interface 'Stringable' not found in //vendor/symfony/string/AbstractString.php on line 30 + +Symfony\Component\ErrorHandler\Error\ClassNotFoundError^ {#3095 + #message: """ + Attempted to load class "UnicodeString" from namespace "Symfony\Component\String".\n + Did you forget a "use" statement for another namespace? + """ + #code: 0 + #file: "./vendor/symfony/console/Helper/Helper.php" + #line: 63 + trace: { + ./vendor/symfony/console/Helper/Helper.php:63 { …} + ./vendor/symfony/console/Helper/Helper.php:49 { …} + ./vendor/symfony/console/Application.php:826 { …} + ./vendor/symfony/console/Application.php:795 { …} + ./vendor/symfony/http-kernel/EventListener/DebugHandlersListener.php:136 { …} + ./vendor/symfony/error-handler/ErrorHandler.php:607 { …} + ./vendor/symfony/error-handler/ErrorHandler.php:695 { …} + Symfony\Component\ErrorHandler\ErrorHandler::handleFatalError() {} + } +} +---- + +*2* - To overcome the above error you need to clear symfony cache + +* On your SuiteCRM 8 instance root, please run: `./bin/console cache:clear` + +*3* - Re-set permissions, if needed + +==== 4. Open your instance + +*1* - If all the above steps went as expected, you should now be able to login into your instance. + + + + + + +=== Upgrading to a new SuiteCRM 8 version greated that RC + + +==== 1. Download the new version package + +*1* - Create the following folder on you current instance: + +* `/tmp/package/upgrade` + +*2* - Download the SuiteCRM 8 target version pre-built / installable package + +*3* - Place the package on the `/tmp/package/upgrade` folder + +*4* - If needed re-set the correct permissions. + +==== 3. Run the upgrade command + +*1* - On your SuiteCRM 8 instance root run: `./bin/console suitecrm:app:upgrade -t ""` + +* Where `` is the name on the SuiteCRM 8 package you've downloaded + +The output should be something like: + +*Note*: please ignore the `libpng warning` + +[source,bash] +---- +SuiteCRM Upgrade +============ + +Running: check-package +step: check-package | status: done +Package found in path +Running: extract-package +step: extract-package | status: done +Package extracted +Running: check-permissions +step: check-permissions | status: done +Permissions checked +Running: install-upgrade-package +step: install-upgrade-package | status: done +Successfully installed package +Running: run-migrations +step: run-migrations | status: done +Successfully run migrations +Running: legacy-post-upgrade +libpng warning: Interlace handling should be turned on when using png_read_image +libpng warning: Interlace handling should be turned on when using png_read_image +libpng warning: Interlace handling should be turned on when using png_read_image +libpng warning: iCCP: known incorrect sRGB profile +libpng warning: Interlace handling should be turned on when using png_read_image +libpng warning: iCCP: known incorrect sRGB profile +libpng warning: iCCP: known incorrect sRGB profile +libpng warning: iCCP: known incorrect sRGB profile +libpng warning: Interlace handling should be turned on when using png_read_image +step: legacy-post-upgrade | status: done +Post Upgrade process complete +Running: clear-symfony-cache +---- + + +*2* - Re-set permissions, if needed + +==== 4. Open your instance + +*1* - If all the above steps went as expected, you should now be able to login into your instance. + diff --git a/content/8.x/admin/installation-guide/Upgrading.ru.adoc b/content/8.x/admin/installation-guide/Upgrading.ru.adoc new file mode 100644 index 000000000..2fc9da0ab --- /dev/null +++ b/content/8.x/admin/installation-guide/Upgrading.ru.adoc @@ -0,0 +1,43 @@ +--- +Title: Обновление системы +Weight: 30 +--- + +:author: likhobory +:email: likhobory@mail.ru + + +:toc: +:toc-title: Оглавление +:toclevels: 1 + +:experimental: + +:imagesdir: /images/ru/admin/Upgrading + +ifdef::env-github[:imagesdir: ./../../../../master/static/images/ru/admin/Upgrading] + +:btn: btn: + +ifdef::env-github[:btn:] + +{{% notice note %}} +Описание обновления для SuiteCRM 8 ещё в процессе создания, наберитесь терпения. + {{% /notice %}} + + +== Обновление системы + +В данном разделе описывается процесс обновления системы при помощи мастера обновления. + +Прежде всего, необходимо скачать необходимый https://suitecrm.com/upgrade-suitecrm[пакет обновления^]. + +{{% notice warning %}} +Перед выполнением обновления настоятельно рекомендуется сделать резервную копию системы! +{{% /notice %}} + +=== Таблица совместимости + +SuiteCRM может быть запущена в различных операционных системах, с использованием различных браузеров. Все детали указаны в link:../../compatibility-matrix[этой] таблице совместимости. + +Продолжение обязательно будет... \ No newline at end of file diff --git a/content/8.x/admin/installation-guide/_index.en.adoc b/content/8.x/admin/installation-guide/_index.en.adoc new file mode 100644 index 000000000..68ca39a78 --- /dev/null +++ b/content/8.x/admin/installation-guide/_index.en.adoc @@ -0,0 +1,16 @@ +--- +title: Installation Guide +weight: 10 +--- + +== Introduction + +link:https://suitecrm.com[SuiteCRM] is the award-winning open-source, enterprise-ready Customer Relationship Management (CRM) software application. + +Our vision is to be the most adopted open source enterprise CRM in the world, giving users full control of their data and freedom to own and customise their business solution. + +Find out more about SuiteCRM 8 and checkout the online demo link:https://suitecrm.com/suitecrm-8-public-demo/[here] + +== Release Notes + +See the latest release notes for SuiteCRM link:../releases[here]. diff --git a/content/8.x/admin/installation-guide/_index.ru.adoc b/content/8.x/admin/installation-guide/_index.ru.adoc new file mode 100644 index 000000000..34e98da5d --- /dev/null +++ b/content/8.x/admin/installation-guide/_index.ru.adoc @@ -0,0 +1,23 @@ +--- +title: Установка и обновление SuiteCRM +weight: 10 +--- + +:author: likhobory +:email: likhobory@mail.ru + +== Введение + +link:https://suitecrm.com[SuiteCRM] - это отмеченное наградами приложение для управления взаимоотношениями с клиентами (CRM) с открытым исходным кодом. + +Мы стремимся к тому, чтобы стать наиболее распространенной корпоративной CRM с открытым исходным кодом в мире, предоставляя пользователям полный контроль над своими данными и давая возможность свободно владеть и настраивать своё бизнес-решение. + +Узнать больше о SuiteCRM 8 вы можете посетив страницу link:https://suitecrm.com/suitecrm-8-public-demo/[онлайн-демонстрации]. + +== Примечания к релизу + +Самые последние нововведения link:../../../../8.x/admin/releases/[описаны] в англоязычном разделе документации. + +{{% notice note %}} +Краткая история основных нововведений и изменений системы link:https://community.suitecrm.com/c/suitecrm-forum/8[будет представлена^] в русскоязычном разделе форума. +{{% /notice %}} diff --git a/content/8.x/admin/releases/8.0/_index.en.adoc b/content/8.x/admin/releases/8.0/_index.en.adoc new file mode 100644 index 000000000..29c370d28 --- /dev/null +++ b/content/8.x/admin/releases/8.0/_index.en.adoc @@ -0,0 +1,658 @@ +--- +title: "8.0 Releases" +weight: 9880 +aliases: + - /8.x/admin/releases/8.0-beta/ +--- + +:toc: +:toc-title: +:toclevels: 1 +:icons: font + +== 8.0.1 + +_Released 17/12/2021_ + +=== icon:box-open[] Assets + +* https://suitecrm.com/suitecrm-8/#SCRM8_download[Download] +* https://github.com/salesagility/SuiteCRM-Core[Github] + +=== icon:check[] Release Notes + +==== icon:lock[] Security + +* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-45903[CVE-2021-45903] - XSS Vulnerability +* CVE: Pending - RCE and CSRF Vulnerability +* CVE: Pending - Privilege Escalation vulnerability +* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-45041[CVE-2021-45041] - Authenticated SQL-Injection in SuiteCRM + +[discrete] + +==== icon:star[] Enhancements & Bug Fixes + +* PR: https://github.com/salesagility/SuiteCRM/pull/9384[9348] - Fix https://github.com/salesagility/SuiteCRM/issues/9382[#9382] - Outbound Emails editview Unsupported operand types fatal in php 8 +* PR: https://github.com/salesagility/SuiteCRM/pull/9379[9379] - Fix https://github.com/salesagility/SuiteCRM/issues/9374[#9374] - OAuth password creation Unsupported operand types fatal in php8 +* PR: https://github.com/salesagility/SuiteCRM/pull/9087[9087] - Fix #9087 - Allow changing text colors when composing an email +* PR: https://github.com/salesagility/SuiteCRM/pull/9377[9377] - Fix https://github.com/salesagility/SuiteCRM/issues/9376[#9376] - Allow Workflows to run on imported records +* PR: https://github.com/salesagility/SuiteCRM/pull/9030[9030] - Fix #9030 - Campaign Email settings removes Email Settings +* PR: https://github.com/salesagility/SuiteCRM/pull/9395[9359] - Fix https://github.com/salesagility/SuiteCRM/issues/9383[9383] - Unsupported each function in php8. +* PR: https://github.com/salesagility/SuiteCRM/pull/9393[9393] - Fix email message modal buttons +* Fix https://github.com/salesagility/SuiteCRM-Core/issues/42[42] - [8-Subpanels-Bug] Activities & History subpanels do not show create actions +* Fix https://github.com/salesagility/SuiteCRM-Core/issues/41[41] - SuiteCRM 8 install - Port not properly set + +==== icon:star[] Styling + +* [Legacy] Scheduler Styling Fixes +* [Legacy] Diagnostic Tool Whitespace Styling Fixes +* [Legacy] User Name Longtext styling fixes +* [Legacy] Jotpad Dashlet Styling Fixes +* [Legacy] Backup Modules Styling Fixes +* User Name Mobile Spacing Styling Fixes +* [Legacy] Admin Import Styling Fixes +* [Legacy] Popup Selector Styling Fixes +* [Legacy] Meeting Module Styling Fixes + +==== Known Issues + +* Report Module Styling Issues +* Cannot create an "Opportunity" filter with multiple Sales Stages +* "Undefined" record UUID on one-to-one custom module relationship linked field url +* When adding a field to Products in studio an error occurs +* Meetings Module EditView Styling Issues +* On the Admin->Schedulers Panel, the bottom " [x] Selected" and "Bulk Action" dropdowns don't display +* When adding "My Open Tasks" to the Homepage the Styling breaks +* Styling Issues on Username Within the Navbar +* User Wizard requires Styling +* Styling Issues on the Record Importer +* Mobile->Desktop View breaks widgets Styling +* The Jotpad dashlet shows a Suite 7 view +* Charts have a limited colour set +* Navbar Doesn't Highlight when Selected in the Mobile View +* Navigation stops working when a notification is displayed +* Background panels in Admin don't have rounded edges +* LDAP authentication is not currently working. +* In Diagnostic Tool, There is a lot of whitespace between tick boxes and Field Headers +* In some modules there is lack of whitespace between fields and field names +* Fields Length isn't consistent with Suite 8 to colour and length +* Confirm button doesn't have whitespace between page contents +* In System Settings and Password Management Panels, the Action Button is incorrectly Positioned +* In Calls EditView the invitee panel uses Suite7 Styling +* On Workflow actions, Email & Calendar have some incorrect styling +* The "Reschedule" action popup has some Suite 7 Styling +* On Legacy Modules Relate Field Styling Doesn't Lineup with fields on the same level +* Legacy validation styling issues +* "My Closed Opportunities" dashlet uses white text on a white background, which can make it difficult to read +* On the Admin->Schedulers Panel, the bottom " [x] Selected" and "Bulk Action" dropdowns don't display +* Incorrect Styling on Top Widgets in Mobile View +* Cannot login after logging out without refreshing the browser +* Cannot enable two factor authentication +* Disable option does not work for plugins +* Full new user wizard does not show +* Mobile navbar does not highlight current module +* ListView filter allows for duplicate entries on assigned user field +* Redirect link on calendar takes you to legacy view with no navbar +* Redirect after Create on Subpanel actions does not work +* Default chart drill down does not take you to a filtered ListView as per legacy +* Product Subcategory module contains a Subpanel insight with no title for Products +* Inline Edit icon disappears after edit +* Minor Custom Module deployment relationship issues +* Edit button shows on Subpanel when user does not have edit access (access is still prevented) +* Repair and rebuild required for custom modules to display on navbar +* 'Select Which Subpanels to View' label still shows when no relationships +* Can't minimise groups within the Reports module +* Changelog has scrollbar when not required +* Default dashboard charts do not take roles into consideration +* Actions partially covered on DetailView for the Project module +* Case 'Body' field does not render HTML correctly +* Unable to create a new Email template through Campaigns module (this needs to be created via the Email Template module) +* Users cannot create Trackers in the Campaign Wizard +* When selecting another Mailbox via the Emails Module Listview, you are taken to a legacy view that is entirely made up of the Body content (i.e. no navbar) +* Can't create an email account via the User->Email Settings panel. When clicking "Done", the user always receives the error "Please check your settings", with "Mail Server Protocol" becoming highlighted. +* History Subpanel on some Modules won't show the imported Email on the Suite8 view (But do on legacy view) +* Issues picking up custom changes to the User module +* When running through a fresh install the user will occasionally be shown a blank error message and the installation process will fail. A rerun will then be successful. +* Due Date field on Activities/History Subpanels does not populate for Meetings +* Select button will disappear when relating a record via the legacy DetailView +* Clicking on the Theme Name in Admin→Themes will take you to a blank page +* Issues with some Link functionality for Subpanels on specific modules +* Long Module names push navbar along when selected +* Email line items labels should be shown for each row at lower resolutions + +=== icon:heart[] Community + +We would love to have you feedback and input to help make SuiteCRM 8 Great for everyone. + +SuiteCRM 8 marks our biggest SuiteCRM upgrade to date and we are very excited to be sharing it with you. In the coming months, we will continue to enhance SuiteCRM 8 with new features and issue fixes. For more information regarding this, please see our link:https://suitecrm.com/suitecrm-roadmap/[Road Map] which will provide further information on what can be expected from future releases. + +If you have found an issue you think we should know about, or have a suggestion/feedback, please link:https://github.com/salesagility/SuiteCRM-Core/issues[Submit An Issue]. Before raising an issue please be sure to check the link:https://docs.suitecrm.com/8.x/admin/releases/[Release Notes and list of Known Issues]. + +If you want to get involved or submit a Fix, fork the repo and when ready please link:https://github.com/salesagility/SuiteCRM-Core/pulls[Submit An PR] - More detail for developers can be found link:https://docs.suitecrm.com/8.x/developer/development-install-guide/[here]. + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors QuickCRM yaroslaw74 mstyp peterkracik fcorluka %}} + +Please link:https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +_Special thanks to everyone who reporting the security issues addressed in this release!_ + +Konstantin Damotsev, Victor Garcia, Manuel Zametter + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 8.0.0 + +_Released 23/11/2021_ + +=== icon:box-open[] Assets + +* https://suitecrm.com/suitecrm-8/#SCRM8_download[Download] +* https://github.com/salesagility/SuiteCRM-Core[Github] + +=== icon:check[] Release Notes + +*Important: Please note that the upgrade/migration path from SuiteCRM 7.x to 8.0 is not yet available. Further information regarding the migration process from SuiteCRM 7 will be released very soon.* + +==== icon:star[] Enhancements & Bug Fixes + +* Add Flex Relate Fields +* Preload Images for Optimisation +* Implement Suite8 EntryPoints +* Implement Suite8 extensions to Legacy +* Add Option to use Internal System to set Emails +* Fix Target Date Fields +* Remove Photo Widget, Alerts & Favourites Icons +* Fix Owner ACLs +* Fix/Update Owner and Group ACLs on Widgets +* Fix Print PDF action +* Update Legacy Entry Point handling +* Fix .htaccess Generation +* Fix Assigned User to Populate filtered fields +* Fix Redirection for Subpanel Edit Buttons +* Fix Assigned User Search via Assigned User Field +* Fix Widgets to Comply with Roles +* Add Emails to route config +* Fixes Product Categories->Categories Parent Relationship +* Add optional DB port on install +* Fix Keyboard disappearing on some mobile devices +* Fix the license not showing on the install page on re-install +* Fix Users Data Caching issue + +==== icon:star[] Styling + +* Update Activity Button Styling +* Update Dashlet Labels and Styling +* Update Map Button Styling +* Update Reports Button Styling +* Update Meetings Module Styling +* Update DetailView Headers +* Update Mobile View Navigation and Buttons +* Update ChangeLog Styling +* Update Admin Styling +* Update Subpanel Button Styling +* Update Popup Styling +* Update User/ User Profile Styling +* Update Password Management and System Settings Styling +* Fix Home Module not appearing on Navbar + +==== Known Issues + +* Report Module Styling Issues +* Meetings Module EditView Styling Issues +* On the Admin->Schedulers Panel, the bottom " [x] Selected" and "Bulk Action" dropdowns don't display +* When adding "My Open Tasks" to the Homepage the Styling breaks +* Styling Issues on Username Within the Navbar +* User Wizard requires Styling +* Styling Issues on the Record Importer +* Mobile->Desktop View breaks widgets Styling +* The Jotpad dashlet shows a Suite 7 view +* Charts have a limited colour set +* Navbar Doesn't Highlight when Selected in the Mobile View +* Navigation stops working when a notification is displayed +* Background panels in Admin don't have rounded edges +* In Diagnostic Tool, There is a lot of whitespace between tick boxes and Field Headers +* In some modules there is lack of whitespace between fields and field names +* Fields Length isn't consistent with Suite 8 to colour and length +* Confirm button doesn't have whitespace between page contents +* In System Settings and Password Management Panels, the Action Button is incorrectly Positioned +* In Calls EditView the invitee panel uses Suite7 Styling +* On Workflow actions, Email & Calendar have some incorrect styling +* The "Reschedule" action popup has some Suite 7 Styling +* On Legacy Modules Relate Field Styling Doesn't Lineup with fields on the same level +* Legacy validation styling issues +* "My Closed Opportunities" dashlet uses white text on a white background, which can make it difficult to read +* On the Admin->Schedulers Panel, the bottom " [x] Selected" and "Bulk Action" dropdowns don't display +* Incorrect Styling on Top Widgets in Mobile View +* Cannot login after logging out without refreshing the browser +* Cannot enable two factor authentication +* Disable option does not work for plugins +* Full new user wizard does not show +* Mobile navbar does not highlight current module +* ListView filter allows for duplicate entries on assigned user field +* Redirect link on calendar takes you to legacy view with no navbar +* Redirect after Create on Subpanel actions does not work +* Default chart drill down does not take you to a filtered ListView as per legacy +* Product Subcategory module contains a Subpanel insight with no title for Products +* Inline Edit icon disappears after edit +* Minor Custom Module deployment relationship issues +* Edit button shows on Subpanel when user does not have edit access (access is still prevented) +* Repair and rebuild required for custom modules to display on navbar +* 'Select Which Subpanels to View' label still shows when no relationships +* Can't minimise groups within the Reports module +* Changelog has scrollbar when not required +* Default dashboard charts do not take roles into consideration +* Actions partially covered on DetailView for the Project module +* Case 'Body' field does not render HTML correctly +* Unable to create a new Email template through Campaigns module (this needs to be created via the Email Template module) +* Users cannot create Trackers in the Campaign Wizard +* When selecting another Mailbox via the Emails Module Listview, you are taken to a legacy view that is entirely made up of the Body content (i.e. no navbar) +* Can't create an email account via the User->Email Settings panel. When clicking "Done", the user always receives the error "Please check your settings", with "Mail Server Protocol" becoming highlighted. +* History Subpanel on some Modules won't show the imported Email on the Suite8 view (But do on legacy view) +* Issues picking up custom changes to the User module +* When running through a fresh install the user will occasionally be shown a blank error message and the installation process will fail. A rerun will then be successful. +* Due Date field on Activities/History Subpanels does not populate for Meetings +* Select button will disappear when relating a record via the legacy DetailView +* Clicking on the Theme Name in Admin→Themes will take you to a blank page +* Issues with some Link functionality for Subpanels on specific modules +* Long Module names push navbar along when selected +* Email line items labels should be shown for each row at lower resolutions + +=== icon:heart[] Community + +We would love to have you feedback and input to help make SuiteCRM 8 Great for everyone. + +SuiteCRM 8 marks our biggest SuiteCRM upgrade to date and we are very excited to be sharing it with you. In the coming months, we will continue to enhance SuiteCRM 8 with new features and issue fixes. For more information regarding this, please see our link:https://suitecrm.com/suitecrm-roadmap/[Road Map] which will provide further information on what can be expected from future releases. + +If you have found an issue you think we should know about, or have a suggestion/feedback, please link:https://github.com/salesagility/SuiteCRM-Core/issues[Submit An Issue]. Before raising an issue please be sure to check the link:https://docs.suitecrm.com/8.x/admin/releases/[Release Notes and list of Known Issues]. + +If you want to get involved or submit a Fix, fork the repo and when ready please link:https://github.com/salesagility/SuiteCRM-Core/pulls[Submit An PR] - More detail for developers can be found link:https://docs.suitecrm.com/8.x/developer/development-install-guide/[here]. + +Please link:https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 8.0-rc + +_Released 29/09/2021_ + +=== icon:box-open[] Assets + +* https://suitecrm.com/suitecrm-8/#SCRM8_download[Download] +* https://github.com/salesagility/SuiteCRM-Core[Github] + +=== icon:check[] Release Notes + +==== icon:star[] Enhancements & Bug Fixes + +* SuiteCRM 8 Installer UI added +* Upgrade functionality implemented +* Implement Role functionality in SuiteCRM8 List and Record view (including Actions) +* Implement Role functionality on page navigation +* Implement Role functionality added to Subpanel action buttons +* Implement Module Framework for use with the Extension Framework +* Add Navbar extensions to the Extension Framework +* Add extension support for chart widgets to the Extension Framework +* Add extension support for sidebar widgets to the Extension Framework +* Add field logic extensions to the Extension Framework +* Add Currency Field Implementation +* Add widget reload on related Sub-panels +* Fix enum default values +* Fix Converting Leads - Links no longer point to legacy when opened in a new tab/window +* Fix Hitting enter while adding a new tab on the homescreen will create the new tab. +* Fix Column selector now able to move items when scrolled to the bottom +* Fix Email Line items to automatically select the first row as primary +* Fix Products/ Services Subpanel Insights Implemented +* Fix Import action link updated + +==== icon:star[] Styling + +* Fix History Timeline Colour Updated +* Fix Action Drop-down Arrow Alignment On Homepage +* Fix Date Calendar Icon Colour On Legacy Pages +* History Subpanel Minor Styling Changes +* Fix Cases Thread Text Wrap Added +* Fix Email Action DropDown Styling +* Quotes & Invoices Faint Line Removed From Line Items +* Fix Mobile Homepage Styling Minor Styling Changes +* Fix Mobile Password Management Page Styling Updated +* Fix Security Group Styling Updated +* Fix Email Checkbox Alignment Fixed +* Fix Admin Modules label Font Updated +* Fix Convert Lead Styling Updated +* Fix Admin Release Page Updated +* Fix OAUTH2 Clients and tokens Page Updated + +==== Known Issues + +* Install process may occasionally fail which would require the user to press 'proceed' again for the process to succeed +* Edit button from some module subpanels does not redirect correctly +* "Select" button disappears when a record is linked on legacy Detail View, requiring a refresh to display as expected +* The Calendar Popup doesn’t load the Meeting/Call modules +* Unable to import Email records to the History Subpanel for various modules +* Clicking on the Theme Name in Admin→Themes will take you to a blank page +* If you select a 'Main Group' condition within Reports you cannot minimise any groups +* Create action on subpanels still present even if roles suggest it shouldn't +* Cannot Navigate Via Mobile/Tablet Navbar +* The keyboard disappears on some mobile devices +* Assigned User field doesn’t populate on filter fields +* Issues with some Link functionality for subpanels on specific modules +* Records are not being related to the Parent for some modules +* Non-admin user cant edit email templates +* Targets module Date Created and Date Modified fields show Created By and Modified By values +* Users cannot edit the “Body” field in the Knowledge Base module +* Email Line Items can be saved with no email address even when required for some modules such as Users +* Due Date field does not populate for meetings in Activities/History subpanel +* You are unable to enable 2 Factor Authentication, ticking the box in profile does not save and is reset upon leaving page. +* History Subpanel on some Modules won't show the imported Email on the Suite8 view +* Long Module names push navbar along when selected +* Security Groups Module doesn’t have an "Overview" tab label +* Validation styling appears incorrect for Security Groups and Roles +* Line item fields Remove button requires updated styling +* Email line items labels should be shown for each row at lower resolutions +* Report Subpanel’s require restyling + +=== icon:heart[] Community + +We would love to have you feedback and input to help make SuiteCRM 8 Great for everyone. + +SuiteCRM 8 is still in active development and all current releases are not yet production ready, so be sure to check the link:https://docs.suitecrm.com/8.x/admin/releases/[Release Notes and list of Known Issues] before getting involved. + +If you have found an issue you think we should know about, or have a suggestion/feedback, please link:https://github.com/salesagility/SuiteCRM-Core/issues[Submit An Issue]. + +If you want to get involved or submit a Fix, fork the repo and when ready please link:https://github.com/salesagility/SuiteCRM-Core/pulls[Submit An PR] - More detail for developers can be found link:https://docs.suitecrm.com/8.x/developer/development-install-guide/[here]. + +Please link:https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 8.0-beta-3 + +_Released 19/08/2021_ + +=== icon:box-open[] Assets + +We would recommend downloading the pre-built package(s) from https://sourceforge.net/projects/suitecrm/files/pre-release/SuiteCRM-8.0.0-beta.3.zip/download[*SuiteCRM-8.0.0-beta.3.zip* (zip)] which contains the SuiteCRM instance with pre-built and downloaded requirements. +Below are the zips of the raw source code. + +* https://github.com/salesagility/SuiteCRM-Core/archive/refs/tags/v8.0.0-beta.3.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM-Core/archive/refs/tags/v8.0.0-beta.3.tar.gz[*Source code* (tar.gz)] + + +=== icon:check[] Release Notes + +==== icon:star[] Enhancements + +* Ranged Search Options Added to Dates on Filters +* Email Addresses Added As Line Items +* History Timeline Implemented Based on Real Record Data +* Print as PDF Functionality Added To List and RecordView +* Change Log Functionality Added To The RecordView +* Mass Update Functionality Added To ListView +* Angular 12 Upgrade +* DateTimeCombo Field Added +* Find Duplicate Functionality Added To RecordView +* Bulk Delete Confirmation Message Added + +==== icon:star[] Styling List + +* Email Line Item Styling +* Display Module & Subpanel Page Styling Updated +* Rename Module Page Styling Updated +* Security Suite Settings Page Styling Updated +* Help Icon Styling Updated +* Hover-over Colour Fixed on Buttons on Various Pages +* Security Groups Create/Edit View Page Styling Updated +* Theme Page Styling Updated +* Language Page Styling Updated +* Diagnostic Page Styling Updated +* Activity Streams Page Styling Updated +* Dashlets styling On Desktop And On Mobile View Updated +* Homepage - Add Tab & Edit Tab Styling Updated +* Field Outline Colour Updated +* Email Settings Page Styling Updated +* Currencies Page Styling Updated +* Password Management Page (+ Create and Edit View) Updated +* Role Create View Styling Updated +* Locale Page Styling Updated +* Business Hours Page Styling Updated +* AOS Settings Page Styling Updated + +==== Missing Features: + +* Missing Currency dropdown from RecordView +* No email preference integration to use inbuilt email client +* Between Filter not showing for any non-date fields +* No front-end install or upgrade process +* Roles not currently fully featured in SuiteCRM8 front-end + +==== Feature Issues: + +* Adding fields via studio can cause errors +* Products & Services Subpanel Insight does not operate as expected +* "Select" button disappears when a record is linked on legacy Detail View, requiring a refresh to display as expected +* The Calendar Popup doesn't load the Meeting/Call modules +* Unable to import Email records to the History Subpanel for various modules +* Tasks Top Widget shows ': -' when task is completed +* Clicking on the Theme Name in Admin->Themes will take you to a blank page +* If you select a 'Main Group' condition within Reports you cannot minimise any groups + +==== Styling Issues: + +* Long Module names push navbar along when selected +* Security Groups Module doesn't have an "Overview" tab label +* The Email actions button is using a mix of old and new styling +* Case Updates do not wrap when long +* The Products Editview Save/Cancel buttons do not match SuiteCRM8 styling +* Validation styling appears incorrect for Security Groups and Roles +* Password Management screen layout issues at low resolutions +* Password Management minor styling issues +* Homepage minor layout issues at low resolutions +* Line item fields (workflow, quotes & invoices) require further styling adjustments +* Clicking on the Edit icon on the ListView of Security Groups shows broken Save And Continue option as well as hidden buttons below (Only shows when there are multiple Security Groups in the CRM) +* Several buttons require additional hover over colours +* Text highlight colour inconsistent between some pages +* Email line items checkboxes slightly misaligned and some minor layout issues +* Email line items labels should be shown for each row at lower resolutions +* Legacy date fields (Meetings, Calls etc) and calendar overlap. +* Report Subpanel's require restyling. + + + +=== icon:heart[] Community + +We would love to have you feedback and input to help make SuiteCRM 8 Great for everyone. + +SuiteCRM 8 is still in active development and all current releases are not yet production ready, so be sure to check the link:https://docs.suitecrm.com/8.x/admin/releases/[Release Notes and list of Known Issues] before getting involved. + +If you have found an issue you think we should know about, or have a suggestion/feedback, please link:https://github.com/salesagility/SuiteCRM-Core/issues[Submit An Issue]. + +If you want to get involved or submit a Fix, fork the repo and when ready please link:https://github.com/salesagility/SuiteCRM-Core/pulls[Submit An PR] - More detail for developers can be found link:https://docs.suitecrm.com/8.x/developer/development-install-guide/[here]. + +Please link:https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 8.0-beta-2 + +_Released 20/05/2021_ + +=== icon:box-open[] Assets + +We would recommend to download the pre-built package(s) from https://sourceforge.net/projects/suitecrm/files/pre-release/SuiteCRM-8.0.0-beta.2.zip/download[*SuiteCRM-8.0.0-beta.2.zip* (zip)] which contains the SuiteCRM instance with pre-built and downloaded requirements. +Below are the zips of the raw source code. + +* https://github.com/salesagility/SuiteCRM-Core/archive/refs/tags/v8.0.0-beta.2.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM-Core/archive/refs/tags/v8.0.0-beta.2.tar.gz[*Source code* (tar.gz)] + + +=== icon:check[] Release Notes + +==== icon:star[] Enhancements + +* Case Threads Insight implemented into the Cases RecordView. +* Column Selector implemented allowing users to customise which fields are shown on the ListView. +* Link buttons added to the Subpanel actions, allowing users to select which records to relate. +* Unlink buttons added to the Subpanel records, allowing users to remove the relationship for the selected record. +* Filter Panel enhanced to include options to save a filter and to set an sort order and direction. +* Filter Panel enhanced to include options to edit or delete a saved filter. +* Relate Fields and relate popup implemented into the Filter Panel +* Subpanels enhanced to store open/closed preferences for the session. +* Charts enhanced to update in real time when a record is deleted. +* DateTime fields implemented. +* DynamicEnum fields implemented. +* History Subpanel Insight enhanced to consider time and date when showing latest touch point. +* Assigned User field issue fixed and will allow for changes to assigned user. +* Convert Lead page redesigned to match the SuiteCRM8 theme. +* User Profile page redesigned to match the SuiteCRM8 theme. +* Inbound Email page redesigned to match the SuiteCRM8 theme. +* Salutation field alignment and width dynamically adjusted on Edit Mode. +* Minor styling enhancements to the Home Screen, Navigation Bar, RecordView and Legacy Subpanels. +* Homepage enhanced for mobile and tablet views. +* Insights enhanced for mobile and tablet views. +* ListView enhanced for mobile and tablet views. + +==== Known Missing Features + +* Several field types are still to be implemented. +* Popup warnings on delete (bulk and single record) to be implemented. +* Full implementation of Extension Framework. +* Photos insight for Leads and Contacts to be fully implemented. +* History Timeline insight to be fully implemented. +* Mass Update functionality to be fully implemented. +* Missing 'between' functionality for Date fields on ListView filters. +* Missing RecordView actions such as Print as PDF, View Changelog. +* Missing ListView bulk actions such as Add to Target List, Print as PDF, Email. +* RecordView navigation buttons to be added. +* Column Selector functionality is not stored locally and reset on refresh. +* Dashlets columns alignment issues on mobile and tablet views. +* Navigation via the navbar in mobile and tablet views will not route to the module ListView. +* Convert Lead page datetime picker uses legacy styling. +* Convert Lead page redirects point to legacy views. +* Some minor styling changes required for Inbound Emails, such as pagination buttons. +* The Relate Field Popup is currently limited to allowing you to link one record at a time. +* Roles are not currently factored into Subpanel actions. +* Insight charts are not translated. +* Subpanel “Select which subpanels to view” panel is not translated. +* Top widget labels are not translated. +* My Closed Opportunities and Top Campaigns Widgets styling is misaligned. + +=== icon:heart[] Community + +We would love to have you feedback and input to help make SuiteCRM 8 Great for everyone. + +SuiteCRM 8 is still in active development and all current releases are not yet production ready, so be sure to check the link:https://docs.suitecrm.com/8.x/admin/releases/[Release Notes and list of Known Issues] before getting involved. + +If you have found an issue you think we should know about, or have a suggestion/feedback, please link:https://github.com/salesagility/SuiteCRM-Core/issues[Submit An Issue]. + +If you want to get involved or submit a Fix, fork the repo and when ready please link:https://github.com/salesagility/SuiteCRM-Core/pulls[Submit An PR] - More detail for developers can be found link:https://docs.suitecrm.com/8.x/developer/development-install-guide/[here]. + +Please link:https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 8.0-beta + +_Released 01/04/2021_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM-Core/archive/refs/tags/v8.0.0-beta.1.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM-Core/archive/refs/tags/v8.0.0-beta.1.tar.gz[*Source code* (tar.gz)] + +=== icon:check[] Release Notes + +==== icon:star[] Enhancements + +* Leads, Opportunities and Accounts ListView charts enhanced to be based on selected ListView data. +* Field Validation: Including both record level (required fields) and field level (based on the type of field) validation for both the RecordView and also the Filter on ListView. +* Additional boolean and enum fields implemented. +* Invoices, Quotes, Contracts and Campaigns given specific Subpanel Insight statistics. +* Generic Insight statistic implemented. +* Popups have been designed and implemented in Angular front-end. +* Relate fields designed and implemented including additional popup with search filters, datatable and selecting a record functionality. +* Filter information stored in session variables so any active filter is still applied on refresh while the session is still active. +* Extension Framework - backend implemented to allow extension of core, dataprovider and configuration. +* Extension Framework - frontend base implementation using Dynamic Module Federation to allow extension of services, components and routing. +* Subpanel insights redesigned including container. +* Subpanel insights enhanced to include tooltips. +* Subpanel insights enhanced to allow comparisons with total values (used in Invoices and Cases). +* Performance enhancment to run Insights statistics on batch calls. +* Legacy EditView design updated to be consistent with Suite8 RecordView. +* Group fields implemented such as Address and Full Name fields. +* Frontend upgraded to run on Angular 11. +* General design enhancements to the Login, Navbars and Views. +* Homepage designed to match Suite8 theme. +* Read Only fields implemented. +* Threads Insight added to Cases - currently displaying demo information. +* Photo Insight added to Leads and Contacts - currently displaying demo information. +* Base Installation script added to allow for easy install. +* Checkboxes redesigned. +* Date fields implemented including time picker (ng-boostrap). +* Text Area fields added to Edit mode of the RecordView. +* Legacy enhanced to be translated to the selected language. +* Convert a Lead functionality added to the Leads module. +* CreateView implemented based on RecordView. + +==== icon:bug[] Bug Fixes + +* Unable to navigate to the password reset screen through Forgot Password option. +* Some buttons appear as duplicates due to removal of module name from the button label (for example, Import on Quotes and New in Roles). +* CreateView contains the Date Created and Date Modified fields. +* Some Non-standard Legacy DetailViews require additional styling. +* Products and Service subpanel insight does not function. +* Security groups subpanel insight does not function. +* Relate fields have not been fully implemented on ListView filters. +* Parent relate fields have not been fully implemented. +* Currency conversion issues between subpanel values and RecordView values. +* Some fields that are hidden from the Legacy EditView are still shown in RecordView Edit Mode. +* Inline edit buttons are visible on ReadOnly fields although they are not functional. +* Some minor spacing inconsistencies between Create and RecordViews. +* The Assign To field does not save an updated values. +* History Insight updates based on day and not time specifically. +* Due Date field does not populate for Meetings on the History and Activities subpanels. + +==== Known Missing Features + +* Several field types are still to be implemented. +* Popup warnings on delete (bulk and single record) to be implemented. +* Full implementation of Extension Framework. +* Subpanel open status to be saved to session. +* Case Updates/Threads Insight to be fully implemented. +* Photos insight for Leads and Contacts to be fully implemented. +* History Timeline insight to be fully implemented. +* Column Selector to be fully implemented. +* Mass Update functionalty to be fully implemented. +* Relate Fields to be implemented on ListView filters. +* Missing 'between' functionality for Date fields on ListView filters. +* Missing RecordView actions such as Print as PDF, View Changelog. +* Missing ListView bulk actions such as Add to Target List, Print as PDF, Email. +* RecordView navigation buttons to be added. +* Additional Subpanel buttons to be added such as removing the relationship and custom buttons. + +=== icon:heart[] Community + +We would love to have you feedback and input to help make SuiteCRM 8 Great for everyone. + +SuiteCRM 8 is still in active development and all current releases are not yet production ready, so be sure to check the link:https://docs.suitecrm.com/8.x/admin/releases/[Release Notes and list of Known Issues] before getting involved. + +If you have found an issue you think we should know about, or have a suggestion/feedback, please link:https://github.com/salesagility/SuiteCRM-Core/issues[Submit An Issue]. + +If you want to get involved or submit a Fix, fork the repo and when ready please link:https://github.com/salesagility/SuiteCRM-Core/pulls[Submit An PR] - More detail for developers will be coming soon so stay tuned. + +Please link:https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' diff --git a/content/8.x/admin/releases/_index.en.adoc b/content/8.x/admin/releases/_index.en.adoc new file mode 100644 index 000000000..3ed5fbc91 --- /dev/null +++ b/content/8.x/admin/releases/_index.en.adoc @@ -0,0 +1,10 @@ +--- +title: "Releases" +weight: 10000 +--- + +{{% children depth="1" %}} + + + + diff --git a/content/8.x/admin/releases/_index.ru.adoc b/content/8.x/admin/releases/_index.ru.adoc new file mode 100644 index 000000000..532f36100 --- /dev/null +++ b/content/8.x/admin/releases/_index.ru.adoc @@ -0,0 +1,19 @@ +--- +title: "История релизов" +weight: 10000 +--- + +:author: likhobory +:email: likhobory@mail.ru + +{{% notice note %}} +Полная история изменений системы link:../../../../8.x/admin/releases/[представлена] в англоязычном разделе документации. + +Краткая история основных нововведений и изменений системы будет link:https://community.suitecrm.com/t/suitecrm/54809[представлена^] в русскоязычном разделе форума. +{{% /notice %}} + + + + + + + diff --git a/content/8.x/developer/_index.en.adoc b/content/8.x/developer/_index.en.adoc new file mode 100644 index 000000000..ae8f9860c --- /dev/null +++ b/content/8.x/developer/_index.en.adoc @@ -0,0 +1,7 @@ +--- +title: "Developer Guide" +weight: 30 +--- + +=== Table of Contents +{{% children depth="2" showhidden="false" %}} \ No newline at end of file diff --git a/content/8.x/developer/_index.ru.adoc b/content/8.x/developer/_index.ru.adoc new file mode 100644 index 000000000..a546a42d0 --- /dev/null +++ b/content/8.x/developer/_index.ru.adoc @@ -0,0 +1,14 @@ +--- +Title: "Руководство разработчика" +Weight: 30 +--- + +:author: likhobory +:email: likhobory@mail.ru + + +{{% notice info %}} +Содержимое раздела не русифицировано, для переходя к оригинальному описанию нажмите link:../../../8.x/developer[здесь]. + +Желающие внести свой вклад в создании русскоязычной документации могут ознакомиться с деталями в link:../../community/contributing-to-docs[этом] разделе. + +Обсудить документацию можно в link:https://community.suitecrm.com/t/suitecrm/12906[русскоязычном разделе форума^]. +{{% /notice %}} diff --git a/content/8.x/developer/front-end-architecture/_index.en.adoc b/content/8.x/developer/front-end-architecture/_index.en.adoc new file mode 100644 index 000000000..11bb88c27 --- /dev/null +++ b/content/8.x/developer/front-end-architecture/_index.en.adoc @@ -0,0 +1,143 @@ +--- +title: "Front-end Architecture" +weight: 10 +--- + +:imagesdir: /images/en/8.x/developer/extensions/front-end/fe-architecture-intro + + +{{% notice note %}} +The following documentation assumes that you have some understanding of angular framework +{{% /notice %}} + + +== 1. Architecture overview + +SuiteCRM's front end architecture was designed with the following concepts in mind. + +. Keep a standard design and approach accross the app +** Aim to have a very standard UI, with the same look and feel across the app +** Aim for maximum component re-usage and develop similar features using the same components +. Configuration driven +** Aim to be backend configuration driven as much as possible. +*** Allows for easier customizations +*** Front-end extensions are complex and hard to develop +** No module specific features. +*** If a module has a specific feature it should be developed in a configurable way. Allowing it to be re-used +. Extensible +** Aim to allow extending / overriding all components and services + +== 2. Front-end structure + +SuiteCRM front end components are split into some categories according to their goal. + +A good way to start is to have a look at the `app-core` structure in `core/app/core`. +It can provide a high level understanding of how the project is structured and of the existing concepts. + +image:app_core_folder_structure.png[app_core_folder_structure.png] + +While `directives`, `pipes`, `services` and `components` are well known angular concepts. Some of the other may not be that obvious to understand at a first glance. +In the next sub-chapters we are going to give a high level intro to the concepts behind some of these parts. + +== 2.1 Views + +Views is a well known concept in SuiteCRM since way back. Each view represents a page. +In the new front-end architecture they structure and control all subcomponents in given page. + +The following images can help provide a better idea of what a view is on the page. + +image:listview-view-highlight.png[listview-view-highlight.png] +image:recordview-view-highlight.png[recordview-view-highlight.png] + +Views could be defined as: + +. The Main component for a page +. Always linked to a route in the router +** Thus should always be accessible through a route +. Can load and control data for a record +** Done using the concept of stores +. Control display state for other components in the view +. Can not be re-used within other views or components + + +== 2.2 Components + +Components are the well know components in angular. +However in SuiteCRM there are some extra distinctions + +Components could be defined as: + +. Represent a ui re-usable component +** they must be re-usable within any other component +. Display only +** Data-wise, they are considered dumb. +** Components only display data they don't change it control it +** If a component triggers an action or does something that data changes, they do not contain any of the business logic to handle that. They just notify the parent view / container and that action should be handled by the parent +. Components can call/use other components + + +Good examples of components are: + +* buttons +* panels +* image component +* label component + +== 2.3 Fields + +Fields follow the same concept that know to SuiteCRM since way back. +They represent a field in a record. +A field has a type and is displayed differently depending on that type. + + +Components could be defined as: + +. Represent a field in the record +. Can be displayed in modes: `edit`, `create`, `detail`, `list`, `massupdate`, `filter`, and other that may come +. Can change the way they display depending on metadata +. They can display and update data + +The following image can help give a better understanding + +image:recordview-fields-highlight.png[recordview-fields-highlight.png] + + +== 2.4 Containers + +Containers are very similar to views. Each can load and manage data and each also have and control subcomponents. +Though there is a big difference is: Containers are re-usable. Containers can be called within other views and aren't linked to a route. + +Containers could be defined as: + +. Representing a set of data: a record, a list, etc. +** Can load and control data for a record +. Their data fetching is not tied to the view's data fetching. +. They are never linked to a route in the router +. Control display state for their subcomponents components +. Can have several instances in a single view + + +Good examples of containers are: + +* Subpanels +* Record selection modals +* Sidebar widgets +* Top widgets + +The image we've seen previously can help give a better understanding + +image:recordview-fields-highlight.png[recordview-fields-highlight.png] + +== Front-End Extensions/ Framework Examples + +To see more information on how to setup Front-End Extensions up please see link:fe-extensions-setup/[here]. + +If you would like more documentation on building specific extensions. Please see the +documentation linked below. + +* link:add-sidebar-widget/[Custom Sidebar Widget Example] +* link:add-field-logic-extension/[Custom Field Logic Example] +* link:add-charts-extension/[Custom Charts Example] +* link:add-fields-extension/[Custom Field Example] +* link:add-validators-extension/[Custom Validator Example] +* link:add-custom-views-extension/[Custom Views Example] diff --git a/content/8.x/developer/front-end-architecture/add-charts-extension.adoc b/content/8.x/developer/front-end-architecture/add-charts-extension.adoc new file mode 100644 index 000000000..fde2c8ac3 --- /dev/null +++ b/content/8.x/developer/front-end-architecture/add-charts-extension.adoc @@ -0,0 +1,8 @@ +--- +title: "Adding a Custom Chart" +weight: 50 +--- + +{{% notice note %}} +This page is under construction. +{{% /notice %}} diff --git a/content/8.x/developer/front-end-architecture/add-custom-views-extension.adoc b/content/8.x/developer/front-end-architecture/add-custom-views-extension.adoc new file mode 100644 index 000000000..875805d00 --- /dev/null +++ b/content/8.x/developer/front-end-architecture/add-custom-views-extension.adoc @@ -0,0 +1,8 @@ +--- +title: "Adding a Custom View" +weight: 80 +--- + +{{% notice note %}} +This page is under construction. +{{% /notice %}} diff --git a/content/8.x/developer/front-end-architecture/add-field-logic-extension.adoc b/content/8.x/developer/front-end-architecture/add-field-logic-extension.adoc new file mode 100644 index 000000000..70f944138 --- /dev/null +++ b/content/8.x/developer/front-end-architecture/add-field-logic-extension.adoc @@ -0,0 +1,8 @@ +--- +title: "Adding Custom Field Logic" +weight: 50 +--- + +{{% notice note %}} +This page is under construction. +{{% /notice %}} diff --git a/content/8.x/developer/front-end-architecture/add-fields-extension.adoc b/content/8.x/developer/front-end-architecture/add-fields-extension.adoc new file mode 100644 index 000000000..d462ea222 --- /dev/null +++ b/content/8.x/developer/front-end-architecture/add-fields-extension.adoc @@ -0,0 +1,8 @@ +--- +title: "Adding a Custom Field" +weight: 60 +--- + +{{% notice note %}} +This page is under construction. +{{% /notice %}} diff --git a/content/8.x/developer/front-end-architecture/add-sidebar-widget.adoc b/content/8.x/developer/front-end-architecture/add-sidebar-widget.adoc new file mode 100644 index 000000000..9548e935d --- /dev/null +++ b/content/8.x/developer/front-end-architecture/add-sidebar-widget.adoc @@ -0,0 +1,880 @@ +--- +title: "Adding a Custom Sidebar Widget" +weight: 40 +--- + +:imagesdir: /images/en/8.x/developer/extensions/front-end/examples/add-sidebar-widget + +{{% notice note %}} +The following documentation assumes that you have good understanding of angular and rxjs. +{{% /notice %}} + +The concepts required to understand the following example are: + +* link:https://angular.io/guide/component-overview[angular components,window=_blank] +* link:https://angular.io/guide/lifecycle-hooks[angular component lifecycle,window=_blank] +* link:https://angular.io/guide/architecture-modules[angular modules,window=_blank] +* link:https://angular.io/guide/dependency-injection[angular services and dependency injection,window=_blank] +* link:https://angular.io/guide/content-projection[angular content projection,window=_blank] +* link:https://rxjs.dev/[rxjs,window=_blank] +* Reactive angular +** link:https://www.youtube.com/watch?v=h-F5uYM69a4[ng-conf 2019 | Before NgRx: Superpowers with RxJS + Facades | Thomas Burleson,window=_blank] +** link:https://www.youtube.com/watch?v=Z76QlSpYcck[ng-conf 2019 | Data Composition with RxJS | Deborah Kurata,window=_blank] +** link:https://www.youtube.com/watch?v=-4cwkHNguXE&t=959s[ng-conf 2019 | Thinking Reactively: Most Difficult | Mike Pearson,window=_blank] + +== Extension framework setup + +{{% notice info %}} +This guide assumes that you have already setup the front extension on your local environment +{{% /notice %}} + + +For information on how to setup the frontend extension framework see the Setup guide link:../fe-extensions-setup/[here] + +== General concepts + +As described on the link:../fe-extensions-setup/[Front end extension general concepts]. Front end extensions are built using registries. +There is a registry for each of the key areas in the application. By registering new components or services you can override existing ones. + +== 1. Hello World example + +The first example we are going to setup is a very simple one. It intends to serve as an intro to the process and structure on the frontend extension framework. + +On the following sections you will have a step-by-step guide on how to create a simple `hello-world` widget. + +=== 1.0 Structure intro + +The first step is to create a standard component. +You can place it anywhere, though we recommend following a folder structure similar to the core one. +So you could add it to `/extensions//app/src/containers/sidebar-widget/` + +For our `hello-world` example we are going to add it to `/extensions//app/src/containers/sidebar-widget/hello-world` + +=== 1.1 - Add the html + +Add a file named `hello-world-sidebar-widget.component.html` + +[source,html,angular2html] +---- + +
+ HELLO WORLD! +
+
+---- + +`` is generic panel for widgets that will allow you to add widget that has the same look and feel as the other widgets + +By setting `widget-body` on the `div` angular will project the `div` into the widget body within the `` component + +=== 1.2 - Add the component + +Add a file named `hello-world-sidebar-widget.component.ts` + +[source,javascript,typescript] +---- +import {Component, OnDestroy, OnInit} from '@angular/core'; +import { + BaseWidgetComponent, +} from 'core'; + +@Component({ + selector: 'scrm-hello-world-sidebar-widget', + templateUrl: './hello-world-sidebar-widget.component.html', + styles: [] +}) +export class HelloWorldSidebarWidgetComponent extends BaseWidgetComponent implements OnInit, OnDestroy { + constructor() { + super(); + } +} +---- + +=== 1.3 - Add the module + +Add a file named `hello-world-sidebar-widget.module.ts` + +[source,javascript,typescript] +---- +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {HelloWorldSidebarWidgetComponent} from './hello-world-sidebar-widget.component'; +import {LoadingSpinnerModule, WidgetPanelModule} from 'core'; + +@NgModule({ + declarations: [HelloWorldSidebarWidgetComponent], + exports: [ + HelloWorldSidebarWidgetComponent + ], + imports: [ + CommonModule, + LoadingSpinnerModule, + WidgetPanelModule, + ] +}) +export class HelloWorldSidebarWidgetModule { +} +---- + +=== 1.4 - Register your component + +Now that we've created our `hello-world` sidebar widget we need to register in order to make it available. +This should be done within your extension's main module. Like so: + +[source,javascript,typescript] +---- + +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {SidebarWidgetRegistry} from 'core'; +import {HttpClientModule} from '@angular/common/http'; +import {HelloWorldSidebarWidgetModule} from './sidebar-widget/hello-world/hello-world-sidebar-widget.module'; +import {HelloWorldSidebarWidgetComponent} from './sidebar-widget/hello-world/hello-world-sidebar-widget.component'; + +@NgModule({ + declarations: [], + imports: [ + CommonModule, + HttpClientModule, + HelloWorldSidebarWidgetModule + ], +}) +export class ExtensionModule { + constructor(protected sidebarWidgetRegistry: SidebarWidgetRegistry) { + + console.log('sidebar widget register'); + sidebarWidgetRegistry.register('default', 'hello-world', HelloWorldSidebarWidgetComponent); + + console.log('loaded'); + } +} + +---- + +=== 1.5 - Build your extension + + +Everything is setup so we can now to build our extension, with the following command. + +`yarn run build:` + +For a faster development process you can also build on dev mode and use `--watch`. +It will watch for changes and auto rebuild every time the code changes. + +`yarn run build-dev: --watch` + + +=== 1.6 - Configure the component to be used on a module + +All the previous steps made our new widget avaible and ready to use. We now need to change the view configuration to show it. +Lets say that you would like to add your new `hello-world` component to the Accounts module on the record view. + +For that you would need to edit the Account's detailviewdefs on `public/legacy/modules/Accounts/metadata/detailviewdefs.php`. +There we can add our widget to the `sidebarWidgets` configuration, using the same name we've registered it with in the above `ExtensionModule`: `hello-world` + +[source, php] +---- + [ + 'templateMeta' => [...], + 'topWidget' => [...], + 'sidebarWidgets' => [ + ['type' => 'hello-world'], + ... + ], + 'panels' => [ + ... +---- + +=== 1.7 - Refresh and test + +Depending on how you've setup your extension you many need to run `composer install` to copy over the built files in to the `public` folder + +After that your new extension should be ready to use and showing on the Accounts module. + + + +== 2. Tasks Insight example + +The following guide provides the steps on how to build a more complex widget, that aims to be an example of a more real-world scenario. +In the guide we are going to setup a tasks sidebar widget. It will fetch the tasks related to the current module and render them in a list. + +After we do all the changes it should look something like the following: + +image:tasks-sidebar-widget-detail.png[tasks-sidebar-widget-detail.png] +image:tasks-sidebar-widget-full.png[tasks-sidebar-widget-full.png] + +=== 2.0 Structure intro + +The first step is to create a standard component. +You can place it anywhere, though we recommend following a folder structure similar to the core one. +So you could add it to `/extensions//app/src/containers/sidebar-widget/` + +For our `hello-world` example we are going to add it to `/extensions//app/src/containers/sidebar-widget/tasks` + + +=== 2.1 - Add the html + +Add a file named `.component.html`. +In this case we are going to add it to `tasks-sidebar-widget.component.html`. + +[source,html,angular2html] +---- + +
+ + +
+ +
+
+ +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + + +
+
+
+
+ + + +
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+---- + +==== 2.2 - Add the component + +Add a file named `.component.ts` +In this case we are going to add it to `tasks-sidebar-widget.component.ts`. + +[source,javascript,typescript] +---- + +import {Component, ElementRef, OnDestroy, OnInit, ViewChild} from '@angular/core'; +import { + ButtonInterface, + ColumnDefinition, + Field, + Record, + SearchCriteria, + SearchCriteriaFieldFilter, + SearchCriteriaFilter +} from 'common'; +import {Subscription} from 'rxjs'; +import { + BaseWidgetComponent, + FieldManager, + LanguageStore, + Metadata, + MetadataStore, + RecordListStore, + RecordListStoreFactory +} from 'core'; +import {shareReplay, take} from 'rxjs/operators'; + +@Component({ + selector: 'scrm-tasks-sidebar-widget', + templateUrl: './tasks-sidebar-widget.component.html', + styles: [] +}) +export class TasksSidebarWidgetComponent extends BaseWidgetComponent implements OnInit, OnDestroy { + + @ViewChild('list') listContainer: ElementRef; + + recordList: RecordListStore; + records: Record[]; + loading = false; + maxHeight = 400; + module = 'tasks'; + noData = true; + + protected subs: Subscription[] = []; + protected fieldDefs: ColumnDefinition[]; + protected parentId: string; + protected parentType: string; + + + constructor( + protected listStoreFactory: RecordListStoreFactory, + protected meta: MetadataStore, + protected language: LanguageStore, + protected fieldManager: FieldManager + ) { + super(); + this.recordList = listStoreFactory.create(); + } + + ngOnInit(): void { + + if (!this.context$) { + return; + } + + this.recordList.init(this.module, false, 'list_max_entries_per_subpanel'); + this.initRecordSubscription(); + this.initLoading(); + + this.loading = true; + this.meta.getMetadata(this.module).pipe( + take(1), + shareReplay() + ).subscribe(meta => { + this.loading = false; + this.initFieldDefinitions(meta); + this.initLoadDataSubscription(); + }); + } + + ngOnDestroy(): void { + this.subs.forEach(sub => sub.unsubscribe()); + } + + /** + * Get Header label + */ + getHeaderLabel(): string { + return this.language.getFieldLabel('LBL_MODULE_NAME', 'tasks') || ''; + } + + /** + * Check if all records have been loaded + */ + allLoaded(): boolean { + const pagination = this.recordList.getPagination(); + if (!pagination) { + return false; + } + + return pagination.pageSize >= pagination.total; + } + + /** + * Get load more button definitions + */ + getLoadMoreButton(): ButtonInterface { + return { + klass: 'load-more-button btn btn-link btn-sm', + labelKey: 'LBL_LOAD_MORE', + onClick: () => { + this.loadMore(); + } + } as ButtonInterface; + } + + /** + * Get field + * @param field + * @param record + */ + initField(field: string, record: Record): Field { + + if (!field || !record) { + return null; + } + + if (record.fields && record.fields[field]) { + return record.fields[field]; + } + + const definition = this?.fieldDefs[field] ?? null; + + if (!definition) { + return null; + } + + return this.fieldManager.addField(record, definition); + } + + /** + * Init record subscription + */ + protected initRecordSubscription(): void { + + this.subs.push(this.recordList.records$.subscribe(records => { + this.records = records; + })); + } + + /** + * Init loading subscription + */ + protected initLoading(): void { + this.subs.push(this.recordList.loading$.subscribe(loading => { + this.loading = loading === true; + })); + } + + /** + * Update list search criteria + * @param parentId + * @param parentType + */ + protected updateSearchCriteria(parentId: string, parentType: string): void { + this.recordList.updateSearchCriteria({ + filters: { + 'parent_id': { + field: 'parent_id', + fieldType: 'id', + operator: '=', + values: [parentId] + } as SearchCriteriaFieldFilter, + 'parent_type': { + field: 'parent_id', + fieldType: 'varchar', + operator: '=', + values: [parentType] + } as SearchCriteriaFieldFilter + } as SearchCriteriaFilter, + orderBy: 'DESC', + sortOrder: 'date_due', + searchModule: this.module + } as SearchCriteria); + } + + /** + * Init load data subscription + */ + protected initLoadDataSubscription(): void { + this.subs.push(this.context$.subscribe(context => { + this.context = context; + + this.loadData(); + })); + } + + /** + * Load Data + */ + protected loadData(): void { + const parentId = this?.context?.id ?? null; + const parentType = this?.context?.module ?? null; + const sameParentId = this.parentId === parentId; + const sameParentType = this.parentType === parentType; + + if (!parentId || !parentType) { + this.noData = true; + + this.parentId = null; + this.parentType = null; + + return; + } + + + if (sameParentId && sameParentType) { + return; + } + + this.parentId = parentId; + this.parentType = parentType; + + this.updateSearchCriteria(parentId, parentType); + + this.recordList.load().pipe( + take(1) + ).subscribe(); + } + + /** + * Init field definitions + * @param meta + */ + protected initFieldDefinitions(meta: Metadata): void { + const fieldDefinitions = meta?.listView?.fields ?? []; + this.fieldDefs = []; + + fieldDefinitions.forEach(definition => { + if (!definition || !definition.name) { + return + } + + this.fieldDefs[definition.name] = definition; + }); + } + + /** + * Load more records + * @param jump + */ + protected loadMore(jump: number = 10): void { + const pagination = this.recordList.getPagination(); + const currentPageSize = pagination.pageSize || 0; + let newPageSize = currentPageSize + jump; + + this.recordList.setPageSize(newPageSize); + this.recordList.updatePagination(0); + } + +} +---- + +==== 2.3 - Add the module + +Add a file named `.module.ts` +In this case we are going to add it to `tasks-sidebar-widget.module.ts`. + +[source,javascript,typescript] +---- +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {TasksSidebarWidgetComponent} from './tasks-sidebar-widget.component'; +import {ButtonModule, FieldModule, LabelModule, LoadingSpinnerModule, WidgetPanelModule} from 'core'; + +@NgModule({ + declarations: [TasksSidebarWidgetComponent], + exports: [ + TasksSidebarWidgetComponent + ], + imports: [ + CommonModule, + LoadingSpinnerModule, + LabelModule, + FieldModule, + WidgetPanelModule, + ButtonModule, + ] +}) +export class TasksSidebarWidgetModule { +} +---- + + +=== 2.4 - Register your component + +Now that we've created our `tasks` sidebar widget we need to register in order to make it available. +This should be done within your extension's main module. Like so: + +[source,javascript,typescript] +---- + +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {SidebarWidgetRegistry} from 'core'; +import {HttpClientModule} from '@angular/common/http'; +import {TasksSidebarWidgetModule} from './sidebar-widget/tasks/tasks-sidebar-widget.module'; +import {TasksSidebarWidgetComponent} from './sidebar-widget/tasks/tasks-sidebar-widget.component'; + +@NgModule({ + declarations: [], + imports: [ + CommonModule, + HttpClientModule, + TasksSidebarWidgetModule + ], +}) +export class ExtensionModule { + constructor(protected sidebarWidgetRegistry: SidebarWidgetRegistry) { + + console.log('sidebar widget register'); + sidebarWidgetRegistry.register('default', 'tasks', TasksSidebarWidgetComponent); + + console.log('loaded'); + } +} + +---- + +=== 2.5 - Build your extension + + +Everything is setup. So we can now to build our extension, with the following command. + +`yarn run build:` + +For a faster development process you can also build on dev mode and use `--watch`. +It will watch for changes and auto rebuild every time the code changes. + +`yarn run build-dev: --watch` + + +=== 2.6 - Configure the component to be used on a module + +All the previous steps made our new widget avaible and ready to use. We now need to change the view configuration to show it. +Lets say that you would like to add your new `tasks` component to the Accounts module on the record view. + +For that you would need to edit the Account's detailviewdefs on `public/legacy/modules/Accounts/metadata/detailviewdefs.php`. +There we can add our widget to the `sidebarWidgets` configuration, using the same name we've registered it with in the above `ExtensionModule`: `tasks` + + +[source, php] +---- + [ + 'templateMeta' => [...], + 'topWidget' => [...], + 'sidebarWidgets' => [ + ['type' => 'tasks'], + ... + ], + 'panels' => [ + ... +---- + +=== 2.7 - Refresh and test + +Depending on how you've setup your extension you many need to run `composer install` to copy over the built files in to the `public` folder + +Your new extension should be ready to use. + +=== 2.8 - A deeper look into the code + +Now that our tasks widget is up and running, it is time to explain in detail how the code is structured. +The following subsection will try to cover the key parts of the widget code. + +==== 2.8.1 - The base component + +As you probably already noticed our `TasksSidebarWidgetComponent` extends `BaseWidgetComponent`, which is a base class that provides a common interface for sidebar widgets. +This allows SuiteCRM to dynamically render widgets just based on configuration. + +[source,javascript,typescript] +---- +export class TasksSidebarWidgetComponent extends BaseWidgetComponent implements OnInit, OnDestroy { +---- + +All sidebar widgets must extend this base class and should not add any new mandatory inputs using `@Input`. +Since the sidebar widgets are dynamic, the inputs that are passed to them are always the same regardless of the implementation. + + +==== 2.8.2 - RecordList Store + +To load the tasks we are using a `RecordListStore`. For more details on the concept behind a store, please watch the following `ng-conf` talk: +link:https://www.youtube.com/watch?v=h-F5uYM69a4[ng-conf 2019 | Before NgRx: Superpowers with RxJS + Facades | Thomas Burleson,window=_blank] + +The `RecordListStore` will handle all aspects related with fetching a list of records from the backend. +In this widget a list of `task` records. The store can also handle pagination, sorting and the usual functionality found on lists/tables. + +In order to use the record list we need to initialize it, for that we must specify the `module`. In our case we are also overriding the optional arguments in order to avoid loading data on init and to set a different page size from the default one. + +[source,javascript,typescript] +---- +this.recordList.init(this.module, false, 'list_max_entries_per_subpanel'); +---- + +==== 2.8.3 - Fields and Metadata + +To render the task data we use the standard `` component. Which is able to dynamically render a field component depending on the type of field and the mode we want to display the field in. + +[source,html,angular2html] +---- + +---- + +In order to render a field, we need a `Field` and a `Record` objects. There `Record` interface represents a single record from a module. +It contains the `attributes` sent from the backend, attributes represent the raw values received. +Those attributes will then be used to instantiate the corresponding field instances. `Field` instances are objects that are able to manipulate a single field. They contain both the value and metadata on how to render that field, e.g. the type, type overrides, if it is readonly or not, etc. + +Thus, to create a `Field`, apart from the field's `value` we need the `metadata` on how to render that field. + +Therefore, on `ngOnInit` one of the first things we do is to load the metadata required to then properly render the field. + +[source,javascript,typescript] +---- + this.meta.getMetadata(this.module).pipe( + take(1), + shareReplay() + ).subscribe(meta => { + ... + }); +---- + +Though there are other approaches that maybe better, in our widget implementation we only build the each `Field` when before rendering it, in a lazy-loading kind of approach. +Which means that we only build the fields and inject them into the `Record` when we need. + +Please note that this approach, although simple, has some disadvantages. As only the rendered fields are built and ready to be used, which could prevent us to add field level logic that would update other fields. + + +[source,html,angular2html] +---- + + ` and `parent_id = ` + +The `BaseWidgetComponent` provides you with a way to retrieve some context data from the parent. It provides a `context` object with the initial `context` at the moment on initialization and a `context$` Observable, that you can subscribe to, in order to react to updates on the parent. + +[source,javascript,typescript] +---- + @Input('context') context: ViewContext; + @Input('context$') context$: Observable; +---- + +On our example we are subscribing to the `context$` Observable and re-loading the data everytime this context changes. + +[source,javascript,typescript] +---- + protected initLoadDataSubscription() { + this.subs.push(this.context$.subscribe(context => { + this.context = context; + + this.loadData(); + })); + } +---- + +On every context update we check for the `id` and `module` of the parent module. Then based on that information we update the search criteria and re-fetch data from the backend. + +[source,javascript,typescript] +---- + /** + * Load Data + */ + protected loadData(): void { + + ... + + this.parentId = parentId; + this.parentType = parentType; + + this.updateSearchCriteria(parentId, parentType); + + this.recordList.load().pipe( + take(1) + ).subscribe(); + + ... + } +---- + +==== 2.8.5 - Rendering the list of tasks + +As you might have noticed from the above section there is no call to re-render after the `recordList` is re-fetched. +Like all SuiteCRM frontend this example has been built in a `reactive` way. You don't need to explicitly tell the component to re-render you just need to change the data and the component will re-render. + +This is achieved by using observable streams. Our component subscribes to the `records$` observable on `RecordListStore` and everytime there is an update to the list of records the component will re-render. + +This process is initialised when we call `initRecordSubscription()` on `ngOnInit`. The component's internal list of records is going to update when the original list is updated. And once the component's `records` property is changed angular will know that the component needs to be re-rendered. + +[source,javascript,typescript] +---- + /** + * Init record subscription + */ + protected initRecordSubscription(): void { + + this.subs.push(this.recordList.records$.subscribe(records => { + this.records = records; + })); + } +---- + +This also makes the `html` simpler and cleaner. As it only needs to read from the `records`. + +[source,html,angular2html] +---- + ... + +
+
+
+ + ... +---- + +Another benefit of this approach is that we keep the list of records in a single place, a "single source of truth". +It also provides a clear structure on how to read and update data as all updates need to be done in the `RecordListStore`. + +A good example of that is the `getLoadMoreButton()`. When the load more button is clicked we change the page size on the `RecordListStore` and re-fetch the data: + +[source,javascript,typescript] +---- + /** + * Load more records + * @param jump + */ + protected loadMore(jump: number = 10): void { + const pagination = this.recordList.getPagination(); + const currentPageSize = pagination.pageSize || 0; + let newPageSize = currentPageSize + jump; + + this.recordList.setPageSize(newPageSize); + this.recordList.updatePagination(0); + } +---- + + +The `html` for rendering the list of tasks doesn't need to know about that, it will remain the same, only looking into the `records`. It will just re-render when they are updated, regardless of how and when they are updated. diff --git a/content/8.x/developer/front-end-architecture/add-validators-extension.adoc b/content/8.x/developer/front-end-architecture/add-validators-extension.adoc new file mode 100644 index 000000000..d5990b26a --- /dev/null +++ b/content/8.x/developer/front-end-architecture/add-validators-extension.adoc @@ -0,0 +1,8 @@ +--- +title: "Adding a Custom Validator" +weight: 70 +--- + +{{% notice note %}} +This page is under construction. +{{% /notice %}} diff --git a/content/8.x/developer/front-end-architecture/fe-extensions-setup.adoc b/content/8.x/developer/front-end-architecture/fe-extensions-setup.adoc new file mode 100644 index 000000000..5aa85a9ab --- /dev/null +++ b/content/8.x/developer/front-end-architecture/fe-extensions-setup.adoc @@ -0,0 +1,555 @@ +--- +title: "Setting Up a Front-End Extension Module" +weight: 30 +--- + +:imagesdir: /images/en/8.x/developer/extensions/front-end/fe-extensions-setup + + +{{% notice note %}} +The following documentation assumes that you have good understanding of angular framework +{{% /notice %}} + + +== Extension framework setup + +The following guide provides a ste-by-step explanation on how to setup an front-end extension module. +Which will allow you to add new front-end customizations or to override existing features. + +== 1. Choosing an extension name + +The first thing is to choose an extension machine name. This name should not have spaces, nor `-`, nor special charaters. +We recommend using camel case, e.g. `myExt` for the key. And snake-case, e.g. `my-ext` for the filename and paths. + +*Note:* this recommendation for having a different case system for files, is just to avoid problems in case-sensitive systems. + +== 2. Generate a micro-frontend (micro angular app) for your extensions + +The first step is to generate your angular extension "micro" app + +. You can generate it by running: `ng g app --projectRoot=extensions//app --routing=false --style=scss` +.. On our example it is going to be: `ng g app myExt --projectRoot=extensions/my-ext/app --routing=false --style=scss` + +== 3. Initialize module federation on your extension + +Next we need to enable module-federation on our extension. + +=== 3.1 Enable module federation + +. You enable it by running: `ng add @angular-architects/module-federation --project=` +.. On our example it is going to be: `ng add @angular-architects/module-federation --project=myExt` + +=== 3.2 Clean webpack configuration + +Now we need to clean the sample code that was added by the generator + +Clean you your configuration so that it looks like the following: + +[source,javascript] +---- +const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin'); + +module.exports = { + output: { + publicPath: 'auto', + uniqueName: 'myExt' + }, + optimization: { + runtimeChunk: false + }, + plugins: [ + new ModuleFederationPlugin({ + + name: 'myExt', + filename: 'remoteEntry.js', + library: { + type: 'window', + name: 'myExt', + }, + exposes: { + './Module': './extensions/my-ext/app/src/extension/extension.module.ts' + }, + + shared: { + '@angular/core': { + singleton: true, + requiredVersion: '^12.0.0' + }, + '@angular/common': { + singleton: true, + requiredVersion: '^12.0.0' + }, + '@angular/common/http': { + singleton: true, + requiredVersion: '^12.0.0' + }, + '@angular/router': { + singleton: true, + requiredVersion: '^12.0.0' + }, + '@angular/animations': { + singleton: true, + requiredVersion: '^12.0.0' + }, + '@angular/cdk': { + singleton: true, + requiredVersion: '^12.0.0' + }, + '@angular/forms': { + singleton: true, + requiredVersion: '^12.0.0' + }, + '@apollo/client': { + singleton: true, + requiredVersion: '^3.3.7' + }, + '@apollo/link-error': { + singleton: true, + requiredVersion: '^2.0.0-beta.3' + }, + 'angular-svg-icon': { + singleton: true, + requiredVersion: '^12.0.0' + }, + 'apollo-angular': { + singleton: true, + requiredVersion: '^2.2.0' + }, + graphql: { + singleton: true, + requiredVersion: '^14.7.0' + }, + 'graphql-tag': { + singleton: true, + requiredVersion: '^2.11.0' + }, + 'lodash-es': { + singleton: true, + requiredVersion: '^4.17.20' + }, + luxon: { + singleton: true, + requiredVersion: '^1.25.0' + }, + 'ng-animate': { + singleton: true, + requiredVersion: '^1.0.0' + }, + 'ngx-chips': { + singleton: true, + requiredVersion: '^2.2.2' + }, + + '@swimlane/ngx-charts': { + singleton: true, + requiredVersion: '^17.0.0' + }, + + '@ng-bootstrap/ng-bootstrap': { + singleton: true, + requiredVersion: '^9.0.2' + }, + + 'bn-ng-idle': { + singleton: true, + requiredVersion: '^1.0.1' + }, + + common: { + singleton: true, + import: 'dist/common', + requiredVersion: false + }, + + core: { + singleton: true, + import: 'dist/core', + requiredVersion: false + }, + } + + }), + ], +}; + +---- + +=== 3.3 Configure shared modules + +{{% notice note %}} +The `shared` config added on 3.2 for this example may be out-of-date. So we need to update it. +{{% /notice %}} + +To update the `shared` modules configuration to the correct one, please go through the following steps: + +1. Open the webpack config for core shell, located at `core/app/shell/webpack.config.js` +2. Copy the contents of the `shared` entry. +3. Replace the contents of the shared entry on your extension's webpack config with the ones from shared + + + +== 4. Adjust angular.json configuration + +. Open `angular.json` +. Look for the entry with the name of your extension, in our example it is `myExt` +. Within your extension entry there should be an `architect` + +=== 4.1 Change the outputPath + +. On `architect`.`build`.`options` entry of your extension configuration +. change `outputPath` to `public/extensions/` +.. in our example it is going to be `public/extensions/my-ext` + +{{% notice info%}} +This `outputPath` we are setting is just to make development easier as it directly places built files in the `public` folder. +{{% /notice %}} + +When preparing the final bundle for your extension you should place your built files under `/extensions//Resources/public` +* in our example it is going to be `/extensions/my-ext/Resources/public` + +you can change the `outputPath` to the above one and rebuild your extension in prod mode. + +=== 4.2 Adjust dev build configuration +. On `architect`.`build`.`options` entry of your extension configuration +. Add the following entries + +[source,json] +---- + "namedChunks": true, + "sourceMap": true, + "aot": true, +---- + +. On `architect`.`build`.`configurations` entry of your extension configuration +.. if you have a `development` entry remove it. + + +=== 4.3 Adjust prod build configuration + +. On `architect`.`build`.`configurations`.`production` entry of your extension configuration +. Add/change the following options + +[source,json] +---- + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "6kb", + "maximumError": "10kb" + } + ], +---- + +=== 4.4 Final configuration example + +After the above change your configuration should look something like the following: + +[source,json] +---- + "myExt": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + }, + "@schematics/angular:application": { + "strict": true + } + }, + "root": "extensions/my-ext/app", + "sourceRoot": "extensions/my-ext/app/src", + "prefix": "app", + "architect": { + "build": { + "builder": "ngx-build-plus:browser", + "options": { + "namedChunks": true, + "commonChunk": false, + "sourceMap": true, + "aot": true, + "outputPath": "public/extensions/my-ext", + "index": "extensions/my-ext/app/src/index.html", + "main": "extensions/my-ext/app/src/main.ts", + "polyfills": "extensions/my-ext/app/src/polyfills.ts", + "tsConfig": "extensions/my-ext/app/tsconfig.app.json", + "inlineStyleLanguage": "scss", + "assets": [ + "extensions/my-ext/app/src/favicon.ico", + "extensions/my-ext/app/src/assets" + ], + "styles": [ + "extensions/my-ext/app/src/styles.scss" + ], + "scripts": [], + "extraWebpackConfig": "extensions/my-ext/app/webpack.config.js", + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "extensions/my-ext/app/src/environments/environment.ts", + "with": "extensions/my-ext/app/src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "6kb", + "maximumError": "10kb" + } + ], + "extraWebpackConfig": "extensions/my-ext/app/webpack.prod.config.js" + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "ngx-build-plus:dev-server", + "configurations": { + "production": { + "browserTarget": "myExt:build:production", + "extraWebpackConfig": "extensions/my-ext/app/webpack.prod.config.js" + }, + "development": { + "browserTarget": "myExt:build:development" + } + }, + "defaultConfiguration": "development", + "options": { + "extraWebpackConfig": "extensions/my-ext/app/webpack.config.js", + "port": 3333 + } + }, + "extract-i18n": { + "builder": "ngx-build-plus:extract-i18n", + "options": { + "browserTarget": "myExt:build", + "extraWebpackConfig": "extensions/my-ext/app/webpack.config.js" + } + }, + "test": { + "builder": "ngx-build-plus:karma", + "options": { + "main": "extensions/my-ext/app/src/test.ts", + "polyfills": "extensions/my-ext/app/src/polyfills.ts", + "tsConfig": "extensions/my-ext/app/tsconfig.spec.json", + "karmaConfig": "extensions/my-ext/app/karma.conf.js", + "inlineStyleLanguage": "scss", + "assets": [ + "extensions/my-ext/app/src/favicon.ico", + "extensions/my-ext/app/src/assets" + ], + "styles": [ + "extensions/my-ext/app/src/styles.scss" + ], + "scripts": [], + "extraWebpackConfig": "extensions/my-ext/app/webpack.config.js" + } + } + } + } +---- + +== 5. Add build command + +Add the following to the `scripts` entry of your `package.json` + +. Add a dev build command: `"build-dev:": "ng build ",` +.. On our example it is going to be`"build-dev:myExt": "ng build myExt",` +. Add a production build command: `"build:": "ng build --configuration production",` +.. On our example it is going to be`"build:myExt": "ng build myExt --configuration production",` + +== 6. Add ng module for your extension + +For extensions to work they need to have a main extension angular module. +This module works like an "entrypoint". It will be loaded by the "main"/"shell" app. From there you can load all your custom code. + +This is the same module that we've added on our extension `webpack.config.js` on the following entry + +[source,json] +---- + exposes: { + './Module': './extensions/my-ext/app/src/extension/extension.module.ts' + }, +---- + +=== 6.1 Add extension ng module + +Lets add a angular module in the location we defined in the above entry. + +. Please create a `extension` folder under your extension location: `extensions//app/src` +.. on our example is going to be `extensions/my-ext/app/src/extension` +. Add a file named `extension.module.ts` within the `extension` folder +. Add the following code to the `extension.module.ts` + +[source,javascript,typescript] +---- +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; + +@NgModule({ + declarations: [], + imports: [ + CommonModule, + ], +}) +export class ExtensionModule { + constructor() { + console.log('Dynamic extension myExt!'); + } + + init(): void { + } +} +---- + + +{{% notice note %}} +You can remove the `console.log` from the constructor after getting your example up-and-running +{{% /notice %}} + + +=== 6.2 Add ExtensionModule to imports + +After adding the extension module we need to import it in the app module within your extension. +Otherwise the angular compiler will not be able to build it. + +. Open `app.module.ts` on you extension folder, it should be in `extensions//app/src/app/app.module.ts`. +** In our example it is on `extensions/my-ext/app/src/app/app.module.ts` +. Add the `ExtensionModule` to the imports of the `AppModule`. It should look similar to the following example: + +[source,javascript,typescript] +---- +import {NgModule} from '@angular/core'; +import {BrowserModule} from '@angular/platform-browser'; + +import {AppComponent} from './app.component'; +import {ExtensionModule} from '../extension/extension.module'; + +@NgModule({ + declarations: [ + AppComponent + ], + imports: [ + BrowserModule, + ExtensionModule + ], + providers: [], + bootstrap: [AppComponent] +}) +export class AppModule { +} +---- + + +== 7. Build core + +In order to build your extension you'll need to build the core dependencies. + +. Build common by running: `yarn run build:common` +** if you want more debugging info on the browser dev tools, you can build in dev mode +*** `yarn run build-dev:common` + +. Build core by running: `yarn run build:core` +** if you want more debugging info on the browser dev tools, you can build in dev mode +*** `yarn run build-dev:core` + +. Build shell by running: `yarn run build:shell` +** if you want more debugging info on the browser dev tools, you can build in dev mode +*** `yarn run build-dev:shell` + +*Note:* +After building the above dependencies you will only need to build again if: + +* you've upgraded to a new SuiteCRM version +* you've deleted the dist folder +** *note:* the dist folder is only need for building your extension, you don't need it to run the extension. this it is not needed on a production environment +* you've cleared / deleted the public folder + + +== 8. Build your extension + +You have the option to build your extension in prod or dev mode. + +* prod mode: you production environment should be running the code on prod mode, thus you need to build it before deploying your extension +* dev mode: it is better suited for development, as it provides more debugging info, as well as sourcemaps. + +For faster builds in development mode you can use the `--watch` option. +It will keep the command running and watching for any changes made to the files in the extension. We recommend using this options as it will allow for faster build and therefore a faster development process. + +* you can use `watch` like so: `yarn run build-dev: --watch` +** in our example it would be: `yarn run build-dev:myExt --watch` + +== 9. Enable your extension + +We have already setup and build our extension making it ready to use. + + +{{% notice note %}} +SuiteCRM front-end extensions use module federation in a dynamic way. Which allows to load extensions in run-time based on a list of enabled extensions that is retrieved in runtime from the system configs api. +{{% /notice %}} + +Thus, the next step is to enable our extension. To tell the api that it should be loaded. + +. Add a config folder to your extension folder under `/extensions//config`. +** On our example is going to be `extensions/my-ext/config` +. Add a `extension.php` file to the new config folder +** On our example is going to be `extensions/my-ext/config/extension.php` +. Enable / register your extension by adding the following code to the new `extension.php` +** on the following example replace `myExt` and `my-ext` by your extension name on: +*** `remoteEntry` +*** `remoteName` + + +[source,php] +---- +getParameter('extensions') ?? []; + +$extensions['myExt'] = [ + 'remoteEntry' => './extensions/my-ext/remoteEntry.js', + 'remoteName' => 'myExt', + 'enabled' => true +]; + +$container->setParameter('extensions', $extensions); +---- + +== 10. Refresh your instance and test + +Now that we have configured and enabled our extension it should be loaded during the angular the app init. + +Please open you browser console before refreshing. After the page loads check your console, you should see the message we left on the `console.log` : `'Dynamic extension myExt!'` + diff --git a/content/8.x/developer/installation-guide/_index.en.adoc b/content/8.x/developer/installation-guide/_index.en.adoc new file mode 100644 index 000000000..212624412 --- /dev/null +++ b/content/8.x/developer/installation-guide/_index.en.adoc @@ -0,0 +1,123 @@ +--- +title: "Developer Install Guide" +weight: 10 +--- + +{{% notice info %}} +The following documentation is for SuiteCRM Version 8+; to see documentation for Version 7, click link:../../../developer/introduction[here]. +{{% /notice %}} + +== Quick Start Guide +For System Requirements see the compatibility matrix link:../../admin/compatibility-matrix[here] + +=== Pre-Installation + +. Setup php, mysql and apache + +{{% notice note %}} +Please make sure that your `apache` has `mod_rewrite` enabled and that it is properly configured to allow for re-writes. +All SuiteCRM-Core api calls depend on this (calls to `api/graphql`) if re-rewrites are not allowed you will get a `404` when calling the api. +{{% /notice %}} + +. Install composer +. Install node and npm +. Install angular cli +. Install yarn: (https://yarnpkg.com/getting-started/install) + +=== Installation + +. Run `composer install` in the root directory +. Run `yarn install` in the root directory +. Run legacy theme compile in the root directory + - *NOTE:* the `./vendor/bin/pscss` is added as a composer dev dependency, so you need to run `composer install` *without* `--no-dev` ++ +[source,bash] +---- +./vendor/bin/pscss -s compressed ./public/legacy/themes/suite8/css/Dawn/style.scss > ./public/legacy/themes/suite8/css/Dawn/style.css +---- + + - *NOTE:* Pre beta 2 steps + ** On SuiteCRM 8 Beta 2 version the legacy composer.json file has been aligned and unified into the Suite 8 composer.json file. + ** Hence, from Beta 2 onwards there is only one composer file under `{Suite 8 Root}/composer.json`. + ** For SuiteCRM 8 versions prior to Beta 2 you need to: + *** Run `composer install` in legacy directory (`/public/legacy`) + *** Run legacy theme compile in the legacy directory (`/public/legacy`) + **** *NOTE:* the `./vendor/bin/pscss` is added as a composer dev dependency, so you need to run `composer install` *without* `--no-dev` + ****`./vendor/bin/pscss -s compressed themes/suite8/css/Dawn/style.scss > themes/suite8/css/Dawn/style.css` + +. Set permissions (though these may need to be different depending on your setup) ++ +[source,bash] +---- +find . -type d -not -perm 2775 -exec chmod 2775 {} \; + +find . -type f -not -perm 0644 -exec chmod 0644 {} \; + +find . \! -user www-data -exec chown www-data:www-data {} \; + +chmod +x bin/console +---- + +. Run `yarn run build:common` or `yarn run build-dev:common` (for dev environment) +. Run `yarn run build:core` or `yarn run build-dev:core` (for dev environment) +. Run `yarn run build:shell` or `yarn run build-dev:shell` (for dev environment) + +. Run `composer dumpautoload` + +. Go back to suite8 root folder +. Run `./bin/console suitecrm:app:install` (or pass on the options, e.g. -u ) + - **Note:** before running the command make sure to create the database (the command will create the needed tables) + +. Re-set permissions on Suite 8 root folder + ++ +[source,bash] +---- +find . -type d -not -perm 2775 -exec chmod 2775 {} \; + +find . -type f -not -perm 0644 -exec chmod 0644 {} \; + +find . \! -user www-data -exec chown www-data:www-data {} \; + +chmod +x bin/console +---- + +. Set your web server `DocumentRoot` to `/{root}/{suitecrm-8}/public.` This is normally found in `/etc/apache2/sites-available/applications.conf` + + +== Developer working guide + +=== Backend +From the suite 8 root folder + +. Run `composer install` ++ + +Depending on the changes you are working on you may also need to run the following + +. Run `composer dumpautoload` +. Run `./bin/console cache:clear` + +=== Frontend + +From the suite 8 root folder + +* Run `yarn run build-dev:common` +* Run `yarn run build-dev:core` +* Run `yarn run build-dev:shell` + +{{% notice note %}} +When building common, core and shell you need to build all in prod mode or all in non-prod mode. +{{% /notice %}} + +==== Run frontend unit tests + +* Run `yarn run test:core` + +==== Run backend unit tests + +The backend unit tests use codeception. You can install codeception + +To run the tests do; + +* Run `codecept run unit` \ No newline at end of file diff --git a/content/_index.pt.md b/content/_index.pt.md new file mode 100644 index 000000000..4d89bd8ad --- /dev/null +++ b/content/_index.pt.md @@ -0,0 +1,5 @@ +--- +title: "Documentação SuiteCRM" +--- + +# Site de Documentação SuiteCRM diff --git a/content/admin/Advanced Configuration Options.adoc b/content/admin/Advanced Configuration Options.adoc index e7ef31db6..173c536d0 100644 --- a/content/admin/Advanced Configuration Options.adoc +++ b/content/admin/Advanced Configuration Options.adoc @@ -54,7 +54,7 @@ For import, export, synchronization, and when working in the administration pane the maximum number of requests is 50,000. Thus, all processes that take up too much system resources are interrupted. You can change these settings as desired by specifying values ​​for variables -`defaultpass:[_]limit` and `specialpass:[_]querypass:[_]limit` in file `config.php`. +`default_limit` and `special_query_limit` in file `config.php`. == Setting file system permissions in Linux @@ -71,15 +71,15 @@ The following example shows the read, write and execute permissions for the user 'chown' => 'apache', 'chgrp' => 'apache',), -For the parameter `dirpass:[_]mode` you can set the value to ```1528```, +For the parameter `dir_mode` you can set the value to ```1528```, which is the decimal equivalent of the octal value ```02770```. For the parameter -`filepass:[_]mode` you can set the value to ```432```, which is the decimal equivalent of the octal value ```0660```. +`file_mode` you can set the value to ```432```, which is the decimal equivalent of the octal value ```0660```. == Changing the location of the download folder All files downloaded by the system are stored in a special download folder. Its location is set by variable -`uploadpass:[_]dir` in file `config.php`. By default, this is the upload folder, located in the installed system folder. -If necessary, its location can be changed, for this purpose in a variable `uploadpass:[_]dir` set the absolute +`upload_dir` in file `config.php`. By default, this is the upload folder, located in the installed system folder. +If necessary, its location can be changed, for this purpose in a variable `upload_dir` set the absolute path to the new location of the download folder. {{% notice note %}} @@ -94,7 +94,7 @@ The system actively uses data caching, which greatly improves its performance. A special folder is used to store cached data (compiled templates, email data, etc.) and its size can be quite large. By default, this is the cache folder located in the installed system folder. If necessary, its location can be changed, for this purpose in a variable -`cachepass:[_]dir`, located in the file `config.php`, set the absolute path to the new +`cache_dir`, located in the file `config.php`, set the absolute path to the new location of the cache folder. At the same time, the link pointing to the new cache folder should be placed in the same place of the cache folder. This is necessary to provide access to some cached system files. diff --git a/content/admin/Advanced Configuration Options.ru.adoc b/content/admin/Advanced Configuration Options.ru.adoc index c01568b72..c7040b5eb 100644 --- a/content/admin/Advanced Configuration Options.ru.adoc +++ b/content/admin/Advanced Configuration Options.ru.adoc @@ -233,7 +233,7 @@ $sugar_config['save_query'] = 'populate_only'; === Постоянное отображение Расширенных фильтров в Формах списка В SuiteCRM версии 7.8 вместо Базового и Расширенного поиска был введён более компактный -функционал link:../../user/introduction/user-interface/search/#_Фильтр[фильтров]. +функционал link:../../user/introduction/user-interface/search/#_фильтр[фильтров]. Если вам все же необходимо постоянное отображение полей фильтра в верхней части Формы списка определённых модулей (как это было в более ранних версиях системы), добавьте соответствующий массив по аналогии со следующим примером (для модулей *Контрагенты*, *Пользователи* и *Сотрудники*) @@ -270,11 +270,11 @@ image:image1.png[Замена выпадающего меню на кнопки] $layout_defs['Leads']['subpanel_setup']['history']['flat'] = 1; [start=3] - . Выполните link:../administration-panel/system/#_Восстановление[Быстрое восстановление]. + . Выполните link:../administration-panel/system/#_восстановление[Быстрое восстановление]. === Быстрое редактирование пользовательского комбобокса -Если необходимо отредактировать комбобокс, созданный в link:../administration-panel/developer-tools/#_Редактор_комбобоксов[редакторе комбобоксов], то это можно сделать как при помощи редактора, так и прямым редактирование файла php, что может быть актуально при редактировании больших объёмов данных. Например, для созданных в link:../administration-panel/developer-tools/#_Создание_динамического_комбобокса[этом примере] динамических комбобоксов, содержащих русскоязычные значения, необходимо отредактировать файл `/custom/include/language/ru_ru.lang.php`: +Если необходимо отредактировать комбобокс, созданный в link:../administration-panel/developer-tools/#_редактор_комбобоксов[редакторе комбобоксов], то это можно сделать как при помощи редактора, так и прямым редактирование файла php, что может быть актуально при редактировании больших объёмов данных. Например, для созданных в link:../administration-panel/developer-tools/#_создание_динамического_комбобокса[этом примере] динамических комбобоксов, содержащих русскоязычные значения, необходимо отредактировать файл `/custom/include/language/ru_ru.lang.php`: [source,php] ---- @@ -291,4 +291,19 @@ $GLOBALS['app_list_strings']['satellite_list']=array ( 'jupiter_ganymede' => 'ГАНИМЕД', 'jupiter_callisto' => 'КАЛЛИСТО', ); +---- + +=== Запрет настройки колонок Формы списка + +По умолчанию пользователи SuiteCRM могут настраивать внешний вид Формы списка любого модуля, добавляя или скрывая те или иные колонки, как это описано в разделе link:../../user/introduction/user-interface/views/#_настройка_колонок[Настройка колонок]. + +Однако, при необходимости администратор SuiteCRM может запретить пользователям изменять настройки колонок, скрыв кнопку настройки колонок в необходимом модуле. + +Например, для скрытия кнопки настройки колонок в модуле *Контрагенты* добавьте в файл `config_override.php` следующие строки: + +[source,php] +---- + $sugar_config['hideColumnFilter'] = [ + 'Accounts' => true, +]; ---- \ No newline at end of file diff --git a/content/admin/Compatibility Matrix.adoc b/content/admin/Compatibility Matrix.adoc index 5a1fc7bff..98269dafa 100644 --- a/content/admin/Compatibility Matrix.adoc +++ b/content/admin/Compatibility Matrix.adoc @@ -5,44 +5,87 @@ weight: 60 == Versions +=== SuiteCRM 7.12.x + +[[smaller-table-spacing-9]] +[cols="1s,2" ] +|======== + +2+^h| Platform + +| Linux, Unix, Mac OS | Any version supporting PHP + +| Windows | Windows Server 2012+ + +| PHP | 7.3, 7.4, 8.0 + +2+^h| Web Server + +| Apache |2.2, 2.4 + +| IIS |8, 8.5, 10 + +2+^h| Database + +| MariaDB |10.2, 10.3, 10.4, 10.5, 10.6 + +| MySQL |5.7, 8.0 + +| SQL Server |SQL Server 2012+ + +2+^h| Browsers + +| Chrome |90+ + +| Firefox |90+ + +| IE | 11 (compatibility mode not supported) + +| Edge |88+ + +| Safari |12+ +|======== + === SuiteCRM 7.11.x [[smaller-table-spacing-8]] [cols="1s,2" ] |======== -2+^h| Platform +2+^h| Platform -| Linux, Unix, Mac OS | Any version supporting PHP +| Linux, Unix, Mac OS | Any version supporting PHP | Windows | Windows Server 2008+ | PHP | 5.6, 7.0, 7.1, 7.2, + -7.3 (starting from SuiteCRM 7.11.5) +7.3 (starting from SuiteCRM 7.11.5) + +7.4 (starting from SuiteCRM 7.11.19) -2+^h| Web Server +2+^h| Web Server -| Apache |2.2, 2.4 +| Apache |2.2, 2.4 | IIS |8, 8.5 -2+^h| Database +2+^h| Database -| MariaDB |5.5, 10, 10.1, 10.2 +| MariaDB |5.5, 10, 10.1, 10.2, 10.3 -| MySQL |5.5, 5.6, 5.7 +| MySQL |5.5, 5.6, 5.7 + +8 (starting from SuiteCRM 7.11.16) | SQL Server |SQL Server 2008+ -2+^h| Browsers +2+^h| Browsers -| Chrome |55+ +| Chrome |55+ | Firefox |52+ -| IE | 11 (compatibility mode not supported) +| IE | 11 (compatibility mode not supported) -| Edge |26 +| Edge |26 | Safari |6+ |======== @@ -53,38 +96,40 @@ weight: 60 [cols="1s,2" ] |======== -2+^h| Platform +2+^h| Platform -| Linux, Unix, Mac OS | Any version supporting PHP +| Linux, Unix, Mac OS | Any version supporting PHP | Windows | Windows Server 2008+ | PHP | 5.5.9, 5.6, 7.0, 7.1, 7.2, + -7.3 (starting from SuiteCRM 7.10.17) +7.3 (starting from SuiteCRM 7.10.17) + +7.4 (starting from SuiteCRM 7.10.30) -2+^h| Web Server +2+^h| Web Server -| Apache |2.2, 2.4 +| Apache |2.2, 2.4 | IIS |8, 8.5 -2+^h| Database +2+^h| Database -| MariaDB |5.5, 10, 10.1, 10.2 +| MariaDB |5.5, 10, 10.1, 10.2, 10.3 -| MySQL |5.5, 5.6, 5.7 +| MySQL |5.5, 5.6, 5.7 + +8 (starting from SuiteCRM 7.10.28) | SQL Server |SQL Server 2008+ -2+^h| Browsers +2+^h| Browsers -| Chrome |55+ +| Chrome |55+ | Firefox |52+ -| IE | 11 (compatibility mode not supported) +| IE | 11 (compatibility mode not supported) -| Edge |26 +| Edge |26 | Safari |6+ |======== @@ -95,37 +140,37 @@ weight: 60 [cols="1s,2" ] |======== -2+^h| Platform +2+^h| Platform -| Linux, Unix, Mac OS | Any version supporting PHP +| Linux, Unix, Mac OS | Any version supporting PHP | Windows | Windows Server 2008+ -| PHP | 5.5, 5.6, 7.0, 7.1 +| PHP | 5.5, 5.6, 7.0, 7.1 -2+^h| Web Server +2+^h| Web Server -| Apache |2.2, 2.4 +| Apache |2.2, 2.4 | IIS |8, 8.5 -2+^h| Database +2+^h| Database -| MariaDB |5.5, 10, 10.1 +| MariaDB |5.5, 10, 10.1 -| MySQL |5.5, 5.6, 5.7 +| MySQL |5.5, 5.6, 5.7 | SQL Server |SQL Server 2008+ -2+^h| Browsers +2+^h| Browsers -| Chrome |55+ +| Chrome |55+ | Firefox |52+ -| IE | 11 (compatibility mode not supported) +| IE | 11 (compatibility mode not supported) -| Edge |26 +| Edge |26 | Safari |6+ |======== @@ -138,11 +183,11 @@ weight: 60 2+^h|Platform -|Linux, Unix, Mac OS |Any version supporting PHP +|Linux, Unix, Mac OS |Any version supporting PHP -|Windows |Windows Server 2008+ +|Windows |Windows Server 2008+ -|PHP |5.5, 5.6, 7.0, 7.1 +|PHP |5.5, 5.6, 7.0, 7.1 2+^h|Web Server @@ -160,57 +205,56 @@ weight: 60 2+^h|Browsers -|Chrome |55+ +|Chrome |55+ |Firefox |52+ |IE |11 (compatibility mode not supported) -|Edge |26 +|Edge |26 |Safari |6+ |========= - === SuiteCRM 7.7.x [[smaller-table-spacing-3]] [cols="1s,2",] |==== -2+^h| Platform +2+^h| Platform -|Linux, Unix, Mac OS |Any version supporting PHP +|Linux, Unix, Mac OS |Any version supporting PHP |Windows |Windows Server 2008+ |PHP |5.3, 5.5, 5.6, 7.0 -2+^h| Web Server +2+^h| Web Server -|Apache |2.2, 2.4 +|Apache |2.2, 2.4 |IIS |8, 8.5 -2+^h| Database +2+^h| Database |MariaDB |5.5, 10, 10.1 -|MySQL |5.5, 5.6 +|MySQL |5.5, 5.6 |SQL Server |SQL Server 2008+ 2+^h|Browsers -|Chrome |43+ +|Chrome |43+ |Firefox |38+ -|IE |11 (compatibility mode not supported) +|IE |11 (compatibility mode not supported) -|Edge |26 +|Edge |26 -|Safari |6+ +|Safari |6+ |==== === SuiteCRM 7.6.x @@ -223,33 +267,33 @@ weight: 60 |Linux, Unix, Mac OS |Any version supporting PHP -|Windows |Windows Server 2008+ +|Windows |Windows Server 2008+ -|PHP |5.5, 5.6, 7.0 +|PHP |5.5, 5.6, 7.0 -2+^h|Web Server +2+^h|Web Server -|Apache |2.2, 2.4 +|Apache |2.2, 2.4 |IIS |8, 8.5 -2+^h|Database +2+^h|Database |MariaDB |5.5, 10, 10.1 -|MySQL |5.5, 5.6 +|MySQL |5.5, 5.6 |SQL Server |SQL Server 2008+ -2+^h|Browsers +2+^h|Browsers |Chrome |43+ |Firefox |38+ -|IE |11 (compatibility mode not supported) +|IE |11 (compatibility mode not supported) -|Edge |26 +|Edge |26 |Safari |6+ |==== @@ -260,37 +304,37 @@ weight: 60 [cols="1s,2",] |==== -2+^h|Platform +2+^h|Platform -|Linux, Unix, Mac OS |Any version supporting PHP +|Linux, Unix, Mac OS |Any version supporting PHP |Windows |Windows Server 2008+ -|PHP |5.5, 5.6, 7.0 +|PHP |5.5, 5.6, 7.0 2+^h|Web Server |Apache |2.2 -|IIS |8, 8.5 +|IIS |8, 8.5 -2+^h|Database +2+^h|Database |MariaDB |5.5, 10, 10.1 -|MySQL |5.5, 5.6 +|MySQL |5.5, 5.6 |SQL Server |SQL Server 2008+ 2+^h|Browsers -|Chrome |43+ +|Chrome |43+ |Firefox |38+ -|IE |11 (compatibility mode not supported) +|IE |11 (compatibility mode not supported) -|Edge |26 +|Edge |26 |Safari |6+ |==== @@ -301,35 +345,35 @@ weight: 60 [cols="1s,2",] |==== -2+^h|Platform +2+^h|Platform -|Linux, Unix, Mac OS |Any version supporting PHP +|Linux, Unix, Mac OS |Any version supporting PHP -|Windows |Windows Server 2008+ +|Windows |Windows Server 2008+ -|PHP |5.3, 5.4, 5.5, 5.6 +|PHP |5.3, 5.4, 5.5, 5.6 2+^h|Web Server -|Apache |2.0, 2.2 +|Apache |2.0, 2.2 -|IIS |7.0, 7.5, 8, 8.5 +|IIS |7.0, 7.5, 8, 8.5 -2+^h| Database +2+^h| Database -|MariaDB |5.5, 10, 10.1 +|MariaDB |5.5, 10, 10.1 -|MySQL |5.1, 5.5, 5.6 +|MySQL |5.1, 5.5, 5.6 |SQL Server |SQL Server 2008+ 2+^h| Browsers -|Chrome |38+ +|Chrome |38+ |Firefox |32+ -|IE |9, 10, 11 (compatibility mode not supported) +|IE |9, 10, 11 (compatibility mode not supported) -|Safari |6+ +|Safari |6+ |==== diff --git a/content/admin/Compatibility Matrix.ru.adoc b/content/admin/Compatibility Matrix.ru.adoc index fe3db4cec..721bc83f3 100644 --- a/content/admin/Compatibility Matrix.ru.adoc +++ b/content/admin/Compatibility Matrix.ru.adoc @@ -9,6 +9,48 @@ Weight: 60 == Версии SuiteCRM + +=== SuiteCRM 7.12.x + +[[smaller-table-spacing-9]] +[cols="1s,2" ] +|======== + +2+^h| Платформа + +| Linux, Unix, Mac OS | Любая версия с поддержкой PHP + +| Windows | Windows Server 2012+ + +| PHP | 7.3, 7.4, 8.0 + +2+^h| Web Server + +| Apache |2.2, 2.4 + +| IIS |8, 8.5, 10 + +2+^h| Базы данных + +| MariaDB |10.2, 10.3, 10.4, 10.5, 10.6 + +| MySQL |5.7, 8.0 + +| SQL Server |SQL Server 2012+ + +2+^h| Браузеры + +| Chrome |90+ + +| Firefox |90+ + +| IE | 11 (режим совместимости не поддерживается) + +| Edge |88+ + +| Safari |12+ +|======== + === SuiteCRM 7.11.x [[smaller-table-spacing-8]] @@ -21,8 +63,9 @@ Weight: 60 | Windows | Windows Server 2008+ -| PHP | 5.6, 7.0, 7.1, 7.2, 7.3 (начиная с SuiteCRM версии 7.11.5) - +| PHP | 5.6, 7.0, 7.1, 7.2, + +7.3 (начиная с SuiteCRM версии 7.11.5) + +7.4 (начиная с SuiteCRM версии 7.11.19) 2+^h| Веб-сервер | Apache |2.2, 2.4 @@ -31,9 +74,10 @@ Weight: 60 2+^h| Базы данных -| MariaDB |5.5, 10, 10.1, 10.2 +| MariaDB |5.5, 10, 10.1, 10.2, 10.3 -| MySQL |5.5, 5.6, 5.7 +| MySQL |5.5, 5.6, 5.7 + +8 (начиная с SuiteCRM версии 7.11.16) | SQL Server |SQL Server 2008+ @@ -62,8 +106,9 @@ Weight: 60 | Windows | Windows Server 2008+ -| PHP | 5.5.9, 5.6, 7.0, 7.1, 7.2, 7.3 (начиная с SuiteCRM версии 7.10.17) - +| PHP | 5.5.9, 5.6, 7.0, 7.1, 7.2, + +7.3 (начиная с SuiteCRM версии 7.10.17) + +7.4 (начиная с SuiteCRM версии 7.10.30) 2+^h| Веб-сервер | Apache |2.2, 2.4 @@ -72,9 +117,10 @@ Weight: 60 2+^h| Базы данных -| MariaDB |5.5, 10, 10.1, 10.2 +| MariaDB |5.5, 10, 10.1, 10.2, 10.3 -| MySQL |5.5, 5.6, 5.7 +| MySQL |5.5, 5.6, 5.7 + +8 (начиная с SuiteCRM версии 7.10.28) | SQL Server |SQL Server 2008+ diff --git a/content/admin/Troubleshooting and Support.adoc b/content/admin/Troubleshooting and Support.adoc index a1bf13690..2c593c131 100644 --- a/content/admin/Troubleshooting and Support.adoc +++ b/content/admin/Troubleshooting and Support.adoc @@ -8,7 +8,7 @@ Weight: 20 At SalesAgility, we are advocates of Open Source. As such please do not contact us directly via email or phone for SuiteCRM support. Instead please use our support forum. By using the -https://suitecrm.com/forum/suite-forum[forum] the knowledge is shared +https://community.suitecrm.com[forum] the knowledge is shared with everyone in the community. Our developers answer questions on the forum daily but it also gives the other members of the community the opportunity to contribute. If you would like SalesAgility to customise diff --git a/content/admin/Troubleshooting and Support.ru.adoc b/content/admin/Troubleshooting and Support.ru.adoc index 010f8e1fb..d2598972c 100644 --- a/content/admin/Troubleshooting and Support.ru.adoc +++ b/content/admin/Troubleshooting and Support.ru.adoc @@ -11,7 +11,7 @@ Weight: 20 Мы являемся сторонниками программного обеспечения с открытым исходным кодом. + Пожалуйста, не обращайтесь к нам за технической поддержкой по электронной почте или по телефону. + -Вместо этого воспользуйтесь нашим https://suitecrm.com/forum/suite-forum[форумом поддержки], +Вместо этого воспользуйтесь нашим https://community.suitecrm.com[форумом поддержки], где может получить необходимую информацию любой желающий. + Наши разработчики ежедневно отвечают на поступающие вопросы, кроме этого, помощь оказывают и другие члены сообщества. + Если у вас есть желание доработать SuiteCRM непосредственно под ваши потребности, либо вы хотите воспользоваться нашим хостингом или расширенной поддержкой - diff --git a/content/admin/_index.pt.adoc b/content/admin/_index.pt.adoc new file mode 100644 index 000000000..aaf5e1bfe --- /dev/null +++ b/content/admin/_index.pt.adoc @@ -0,0 +1,13 @@ +--- +title: "Guia de Administrador" +weight: 30 +pre: "3. " +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +=== Índice +{{% children depth="2" showhidden="false" showhidden="true" %}} + + diff --git a/content/admin/administration-panel/Advanced OpenAdmin.ru.adoc b/content/admin/administration-panel/Advanced OpenAdmin.ru.adoc index a62343642..c4b4b5ab9 100644 --- a/content/admin/administration-panel/Advanced OpenAdmin.ru.adoc +++ b/content/admin/administration-panel/Advanced OpenAdmin.ru.adoc @@ -48,7 +48,7 @@ image:image1.png[Настройка модулей продаж] image:image2.png[Включение функции полнотекстового поиска] Для периодического индексирования текста должны быть настроены задания -link:../system/#_Планировщик[Планировщика] *Индексировать неиндексированные документы* и *Оптимизировать индекс полнотекстового поиска*. +link:../system/#_планировщик[Планировщика] *Индексировать неиндексированные документы* и *Оптимизировать индекс полнотекстового поиска*. Подробная информация о поиске описана в разделе link:../../../user/introduction/user-interface/search[Поиск информации в системе]. @@ -81,7 +81,7 @@ image:image4.png[Изменение статуса обращений] image:image5.png[Настройка графика работы] В разделе есть возможность указать рабочие дни и часы работы организации. Указанные параметры будут учтены при запуске -link:../../../user/advanced-modules/workflow/#_Создание_процесса[Процессов] с установленным параметром запуска *Только в рабочее время*, а также при расчёте продолжительности -link:../../../user/core-modules/projects/#_Создание_проекта[Проекта], если в созданном Проекте отмечен параметр *Учитывать график работы* (если график организации не настроен, то в расчёте используется стандартная 40-часовая рабочая неделя). +link:../../../user/advanced-modules/workflow/#_создание_процесса[Процессов] с установленным параметром запуска *Только в рабочее время*, а также при расчёте продолжительности +link:../../../user/core-modules/projects/#_создание_проекта[Проекта], если в созданном Проекте отмечен параметр *Учитывать график работы* (если график организации не настроен, то в расчёте используется стандартная 40-часовая рабочая неделя). diff --git a/content/admin/administration-panel/Developer Tools.ru.adoc b/content/admin/administration-panel/Developer Tools.ru.adoc index 3efdeb95c..feea32588 100644 --- a/content/admin/administration-panel/Developer Tools.ru.adoc +++ b/content/admin/administration-panel/Developer Tools.ru.adoc @@ -115,7 +115,7 @@ image:image4.png[Сохранение модуля] ==== Настройка макета дашлета модуля При необходимости внешний вид дашлета, который может быть отображён на основной странице системы, может быть изменён: могут быть добавлены новые поля, удалены неиспользуемые элементы, изменён порядок расположения элементов, в параметры дашлета могут быть добавлены новые значения в поля со списками и т.д. Подробная информация о дашлетах описана в разделе -link:../../../user/introduction/user-interface/home-page/#_Управление_дашлетами[Управление дашлетами]. +link:../../../user/introduction/user-interface/home-page/#_управление_дашлетами[Управление дашлетами]. В левой части Конструктора раскройте соответствующий модуль и перейдите к разделу *Макеты*. @@ -164,7 +164,7 @@ image:image7.png[Студия] {{% notice note %}} Если в макет пользовательского модуля были внесены изменения при помощи Студии (изменены поля или макеты), то часть изменений будет утеряна, если вы повторно установите пакет из Конструктора модулей. Более подробная информация об установке пакета находится в разделе -link:./#_Конструктор_модулей[Конструктор модулей]. +link:./#_конструктор_модулей[Конструктор модулей]. {{% /notice %}} При необходимости вы можете сбросить те или иные настройки модуля, приведя их к стандартному виду. Для этого воспользуйтесь соответствующей кнопкой в верхней левой части страницы редактирования модуля. @@ -367,7 +367,7 @@ image:image14.png[Форма создания поля] При создании односторонней связи между модулями рекомендуется использовать поле типа *Relate*. Для создания двусторонней связи между модулями используйте Редактор связей. {{% /notice %}} -Вы также можете создать связь модуля с самим собой. В этом случае создаётся связь типа *предок-потомок*. Например, вы можете создать связь между различными link:../../../user/core-modules/projects/#_Создание_проектных_задач[проектными задачами], тем самым связав несколько подчинённых проектных задач с основной проектной задачей. +Вы также можете создать связь модуля с самим собой. В этом случае создаётся связь типа *предок-потомок*. Например, вы можете создать связь между различными link:../../../user/core-modules/projects/#_создание_проектных_задач[проектными задачами], тем самым связав несколько подчинённых проектных задач с основной проектной задачей. ==== Типы связей @@ -726,7 +726,7 @@ image:image31e.png[Динамический комбобокс - добавле image:image31f.png[Динамический комбобокс - пример использования] {{% notice tip %}} -Если необходимо быстро отредактировать длинный список значений созданного комбобокса, то это можно сделать непосредственно в файле php, как это описано в разделе link:../../advanced-configuration-options/#_Быстрое_редактирование_пользовательского_комбобокса[Быстрое редактирование пользовательского комбобокса]. +Если необходимо быстро отредактировать длинный список значений созданного комбобокса, то это можно сделать непосредственно в файле php, как это описано в разделе link:../../advanced-configuration-options/#_быстрое_редактирование_пользовательского_комбобокса[Быстрое редактирование пользовательского комбобокса]. {{% /notice %}} == Загрузчик модулей @@ -781,7 +781,7 @@ image:image33.png[Отключение установленного модуля После скрытия закладки соответствующий модуль становится недоступен пользователям системы. Но если скрытый модуль связан с каким-либо отображаемым модулем, то его субпанель отображается с Форме просмотра отображаемого модуля. Таким образом, пользователи могут получить доступ к скрытому модулю через соответствующую субпанель Формы просмотра отображаемого модуля. Скрыв необходимую субпанель, вы предотвращаете доступ к скрытому модулю через подчинённый модуль. Для полного блокирования доступа пользователей к скрытым модулям настройте соответствующие роли. Более подробная информация находится в разделе -link:../users/#_Роли_и_группы_пользователей[Роли и группы пользователей]. +link:../users/#_роли_и_группы_пользователей[Роли и группы пользователей]. Вы можете разрешить пользователям настраивать закладки модуля в индивидуальном порядке на странице настроек пользователя. Пользовательские настройки будут иметь приоритет над настройками, сделанными в панели администрирования, за исключением того, что пользователь не сможет отобразить скрытые администратором модули. {{% notice note %}} @@ -832,7 +832,7 @@ image:image36.png[Сгруппированные модули] {{% notice tip %}} Если необходимо отображать каждый модуль на отдельной закладке - отключите группировку модулей в профиле пользователя на закладке -link:../../../user/introduction/managing-user-accounts/#_Параметры_макета[Параметры макета]. +link:../../../user/introduction/managing-user-accounts/#_параметры_макета[Параметры макета]. {{% /notice %}} Для настройки сгруппированных модулей выполните следующее: diff --git a/content/admin/administration-panel/Email.ru.adoc b/content/admin/administration-panel/Email.ru.adoc index 8b7f30fb6..daca80181 100644 --- a/content/admin/administration-panel/Email.ru.adoc +++ b/content/admin/administration-panel/Email.ru.adoc @@ -24,6 +24,9 @@ ifdef::env-github[:btn:] Раздел описывает настройку и управление учётными записями электронной почты, используемых в системе. +{{% notice warning %}} +При обновлении SuiteCRM с версий 7.8 и более ранних необходимо выполнить link:../../installation-guide/using-the-upgrade-wizard/#_синхронизация_учётных_записей_входящей_почты[синхронизацию учётных записей входящей почты]. +{{% /notice %}} == Настройка E-mail @@ -82,9 +85,9 @@ link:../../../user/core-modules/emailtemplates[свой собственный]. Используйте данный раздел для управления групповыми учётными записями электронной почты, а также для управления учётными записями, которые используются для обработки возвращаемой почты. -Групповые учётные записи:: Позволяют просматривать поступившие электронные письма в рамках одной учётной записи и распределять их между сотрудниками вашей организации для дальнейшей обработки. Данная учётная запись может быть полезна в том случае, когда письма адресованы не конкретному сотруднику, а направлены на один из стандартных электронных адресов вашей организации, например на *support@example.com* или *sales@example.com*. Впоследствии, письма из данных почтовых ящиков могут быть распределены по определённому алгоритму между сотрудниками организации. +Групповые учётные записи:: Позволяют просматривать поступившие электронные письма в рамках одной учётной записи и распределять их между сотрудниками вашей организации для дальнейшей обработки. Эта учётная запись может быть полезна в случае, когда письма адресованы не конкретному сотруднику, а направлены на один из стандартных электронных адресов вашей организации, например на *support@example.com* или *sales@example.com*. Впоследствии письма из этих почтовых ящиков могут быть распределены по определённому алгоритму между сотрудниками организации. -Учётные записи для обработки возвращаемой почты:: Данные учётные записи хранят письма, возвращённые после неудачной рассылки, как правило по причине указания неверного электронного адреса получателя. Вы можете либо создавать данные учётные записи для каждой рассылки в отдельности, либо создать одну общую учётную запись для всех рассылок. Система помечает каждое возвращаемое письмо специальным идентификатором, который позволяет уточнить принадлежность данного письма к той или иной рассылке. +Учётные записи для обработки возвращаемой почты:: Эти учётные записи хранят письма, возвращённые после неудачной рассылки, как правило по причине указания неверного электронного адреса получателя. Вы можете либо создавать эти учётные записи для каждой рассылки в отдельности, либо создать одну общую учётную запись для всех рассылок. Система помечает каждое возвращаемое письмо специальным идентификатором, который позволяет уточнить принадлежность данного письма к той или иной рассылке. === Настройки групповой учётной записи @@ -113,7 +116,7 @@ image:image3.png[Настройки групповой учётной запис Ответить на имя:: Введите имя получателя возвращаемых писем. Ответить на адрес:: Введите адрес получателя возвращаемых писем. Разрешить пользователям отправлять письма, используя в качестве адреса для ответа данные поля <От>:: Отметьте эту опцию, если хотите, чтобы имя и адрес редактируемой групповой учётной записи появлялось в поле *От* при отправке писем. -Автоматически импортировать E-mail:: Выберите данный параметр для автоматического импортирования в систему всех входящих писем. +Автоматически импортировать E-mail:: Выберите данный параметр для автоматического link:../../../user/core-modules/emails/#_импорт_писем_в_систему[импортирования] в систему всех входящих писем. Создать Обращение из E-mail:: Выберите данный параметр для автоматического создания <<Создание обращений из входящих писем,Обращений из входящих писем>>. При выборе данного параметра необходимо выбрать алгоритм назначения ответственного. Алгоритм назначения ответственного:: Данный параметр доступен только при выборе предыдущего параметра. При циклическом назначении Обращения будут последовательно назначаться всем пользователям. В противном случае Обращения будут назначаться наименее занятому пользователю, имеющему самую короткую очередь назначенных Обращений. Шаблон автоответа при создании нового Обращения:: Данный параметр доступен только при создании Обращения из E-mail. Вы можете использовать данный шаблон для информирования отправителей о том, что на основании их писем были созданы соответствующие Обращения. Вы можете использовать как существующие шаблоны, так и создавать @@ -197,11 +200,11 @@ image:image5.png[Параметры рассылки E-mail] Данный раздел используется для просмотра, отправки и удаления почтовых рассылок, находящихся в очереди на отправку. Процесс отправки будет запущен только по прошествии указанной даты/времени начала рассылки. После запуска рассылки в модуле *Маркетинг* можно просматривать статистику выполняемой рассылки, такую как дату отправки рассылки, количество попыток отправки писем и т.д. Используйте соответствующие задания -link:../system/#_Планировщик[планировщика] как для запуска ночных массовых рассылок писем, так и для проверки почтовых ящиков для возвращаемых писем. +link:../system/#_планировщик[планировщика] как для запуска ночных массовых рассылок писем, так и для проверки почтовых ящиков для возвращаемых писем. Для управление очередью E-mail выполните следующее: . Для отправки сообщений выберите в списке соответствующие рассылки и нажмите на кнопку {btn}[Разослать очередь сообщений]. . Для удаления рассылки выберите соответствующую запись в списке и нажмите на кнопку {btn}[Удалить]. . Для поиска рассылки введите либо название искомой рассылки, либо имя, либо электронный адрес получателя и нажмите на кнопку {btn}[Найти]. Для сброса условий поиска нажмите на кнопку {btn}[Очистить]. - + \ No newline at end of file diff --git a/content/admin/administration-panel/Google Maps.ru.adoc b/content/admin/administration-panel/Google Maps.ru.adoc index b7ae3c39e..31541d729 100644 --- a/content/admin/administration-panel/Google Maps.ru.adoc +++ b/content/admin/administration-panel/Google Maps.ru.adoc @@ -56,7 +56,7 @@ link:https://developers.google.com/maps/documentation/geocoding/usage-limits?hl= image:image3.png[Настройка автоматического геокодирования в Планировщике] За более подобной информацией о настройке задания обратитесь к разделу -link:../system/#_Планировщик[Планировщик]. +link:../system/#_планировщик[Планировщик]. При необходимости геокодирования адресов сторонними утилитами, вы можете выполнить экспорт адресов из соответствующих модулей. По окончании геокодирования импортируйте обновлённые адреса через модуль *Кэш адресов*. diff --git a/content/admin/administration-panel/Google Sync.adoc b/content/admin/administration-panel/Google Sync.adoc index 1dab7f604..f6610be15 100644 --- a/content/admin/administration-panel/Google Sync.adoc +++ b/content/admin/administration-panel/Google Sync.adoc @@ -47,7 +47,7 @@ Go to https://console.developers.google.com/apis/dashboard[Google Developers Con |Click on the drop-down at the top of the screen.|image:cred_1.png[float=left] -|Click on the 'New Project' Button.|image:cred_2.png[float=left] +|Click on the 'New Project' Button.|image:cred_2.png[float=left] |Give the project a descriptive name, like 'SuiteCRM Google Sync', and click 'Create'.|image:cred_3.png[float=left] |At the top of the page, click on the 'Select a project' dropdown...|image:cred_4.png[float=left] @@ -71,7 +71,7 @@ For example, if you reach your SuiteCRM install at the URI 'http://crm.yourdomai `http://crm.yourdomain.com/index.php?entryPoint=saveGoogleApiKey` + If your SuiteCRM install is under a subdirectory, you'll need to include that. For instance + `http://crm.yourdomain.com/SuiteCRM/index.php?entryPoint=saveGoogleApiKey` + - + Note that this does not need to be a public URL. It only needs to be accessible to the user who is enabling the calendar sync. It is strongly recommend having an https enabled site for production on a publicly accessible site. + + Then click on ‘Create OAuth client ID’.|image:cred_11.png[float=left] @@ -124,7 +124,13 @@ Check the ‘Enable Calendar Sync’ checkbox, and then click the ‘Save’ but That’s it! By default, the sync happens every quarter hour. That can be changed by the Administrator in the Scheduler configuration. +=== Known Issues + +If the value of "google_calendar_sync_name" is changed then this will cause ALL Meetings to re-sync. +This is due to the fact that if the value changes then Google detects all current meetings as new, unique Calendar items. +The best way to avoid this from happening is to not edit/change the "google_calendar_sync_name" that is located +in your config.php file. diff --git a/content/admin/administration-panel/Google Sync.ru.adoc b/content/admin/administration-panel/Google Sync.ru.adoc index b97aa07cc..46c4b2354 100644 --- a/content/admin/administration-panel/Google Sync.ru.adoc +++ b/content/admin/administration-panel/Google Sync.ru.adoc @@ -44,7 +44,7 @@ SuiteCRM может синхронизировать link:../../../user/core-mod Сервер SuiteCRM должен иметь доступ к Интернету; сервер не обязательно должен быть общедоступным. Для настройки процесса синхронизации пользователь системы должен иметь доступ как к консоли разработчика Google, так и к панели администрирования SuiteCRM. -По окончании настройки процесс синхронизации выполняется автоматически по расписанию link:../system/#_Планировщик[Планировщика] без какого-либо участия со стороны пользователя. +По окончании настройки процесс синхронизации выполняется автоматически по расписанию link:../system/#_планировщик[Планировщика] без какого-либо участия со стороны пользователя. === Наличие как минимум одного аккаунта Google @@ -155,9 +155,15 @@ link:https://console.developers.google.com/apis/dashboard[консоль раз В конце настройки отметьте параметр *Включить синхронизацию с календарём Google* и нажмите на кнопку {btn}[Сохранить]. -По умолчанию синхронизация происходит каждые 15 минут, при необходимости вы можете указать желаемый интервал синхронизации в параметрах задания *Синхронизировать с календарём Google* на странице настроек link:../system/#_Планировщик[Планировщика]. +По умолчанию синхронизация происходит каждые 15 минут, при необходимости вы можете указать желаемый интервал синхронизации в параметрах задания *Синхронизировать с календарём Google* на странице настроек link:../system/#_планировщик[Планировщика]. +=== Известные проблемы +Начиная с SuiteCRM версии 7.12 появилась возможность изменять название календаря при синхронизации с Google через установку соответствующего значения переменной `google_calendar_sync_name`, прописав её в файле конфигурации (config.php). +Если значение этой переменной будет изменено, это приведет к повторной синхронизации ВСЕХ встреч. +Это связано с тем, что при изменении значения Google определяет все текущие встречи как новые, уникальные значения Календаря. + +Лучший способ избежать этого - не изменять значения переменной `google_calendar_sync_name`. diff --git a/content/admin/administration-panel/Roles and Security Groups.ru.adoc b/content/admin/administration-panel/Roles and Security Groups.ru.adoc index d5824b11e..a948da423 100644 --- a/content/admin/administration-panel/Roles and Security Groups.ru.adoc +++ b/content/admin/administration-panel/Roles and Security Groups.ru.adoc @@ -10,4 +10,4 @@ Weight: 25 = Роли и группы пользователей -См. раздел link:../users/#_Роли_и_группы_пользователей[Пользователи]. \ No newline at end of file +См. раздел link:../users/#_роли_и_группы_пользователей[Пользователи]. \ No newline at end of file diff --git a/content/admin/administration-panel/Studio.ru.adoc b/content/admin/administration-panel/Studio.ru.adoc index 75e0668d2..c9a4e736a 100644 --- a/content/admin/administration-panel/Studio.ru.adoc +++ b/content/admin/administration-panel/Studio.ru.adoc @@ -10,4 +10,4 @@ Weight: 55 = Студия -См. раздел link:../developer-tools/#_Студия[Студия] \ No newline at end of file +См. раздел link:../developer-tools/#_студия[Студия] \ No newline at end of file diff --git a/content/admin/administration-panel/System.adoc b/content/admin/administration-panel/System.adoc index e6b33b8a8..a7247a5e7 100644 --- a/content/admin/administration-panel/System.adoc +++ b/content/admin/administration-panel/System.adoc @@ -131,6 +131,29 @@ When running a Quick Repair and Rebuild, be sure to scroll to the bottom of the new SQL code which may need to be executed to ensure that your database tables are correctly synced with any changes that have been made. +The following functions are available to you in the section: + +Quick Repair and Rebuild:: Repairs and rebuilds DB, Extensions, Vardefs, SuiteCRM Dashlets etc. +Expand Column Width:: Expands certain char, varchar and text columns in database (MSSQL ONLY) +Rebuild .htaccess File:: Rebuilds .htaccess to limit access to certain files directly +Rebuild Config File:: Rebuilds config.php by updating version and adding defaults when not explicitly declared +Rebuild Relationships:: Rebuilds relationship metadata and drops the cache file +Rebuild Schedulers:: Rebuilds out-of-the-box Scheduler Jobs +Rebuild SuiteCRM Dashlets:: Rebuilds the SuiteCRM Dashlets cache file +Rebuild Javascript Languages:: Rebuilds javascript versions of language files +Rebuild JS Compressed Files:: Copies original Full JS Source files and replaces existing compressed JS files +Rebuild JS Grouping Files:: Re-concatenates and overwrites existing group files with latest versions of group files +Rebuild Minified JS Files:: Copies original Full JS Source Files and minifies them, then replaces existing compressed files +Repair JS Files:: Compresses Existing JS files - includes any changes made, but does not overwrite original JS Source files +Repair Non-Lowercase Fields:: Repair mixed-case custom table(s) and metadata file(s) to fix issues where code expects lowercase field names +Repair Roles:: Repairs Roles by adding all new modules that support Access Controls, and by adding any new Access Controls to existing modules +Repair Inbound Email Accounts:: Repairs Inbound Email accounts and encrypts account passwords +Sync Inbound Email Accounts:: Sync Inbound Email Accounts and Emails +Remove XSS:: Removes XSS Vulnerabilities from the database +Repair Activities:: Repairs Activities (Calls, Meetings) end dates +Enable/Disable Seed Users:: Quickly enable or disable seed users populated during demo installation. +Remove missed files from upload directory:: Please note that removal can take a lot of time + == Global Search The Global Search functionality is used to search for records using the search bar on the main diff --git a/content/admin/administration-panel/System.ru.adoc b/content/admin/administration-panel/System.ru.adoc index ceaabbfd5..3cc71db1c 100644 --- a/content/admin/administration-panel/System.ru.adoc +++ b/content/admin/administration-panel/System.ru.adoc @@ -27,7 +27,7 @@ ifdef::env-github[:btn:] == Настройка конфигурации -Используйте эту опцию для настройки общих параметров в соответствии со спецификой вашей организации. Некоторые стандартные настройки пользователи при необходимости смогут переопределить позже на странице настроек пользователя. +Используйте этот раздел для настройки общих параметров SuiteCRM в соответствии со спецификой вашей организации. Некоторые параметры каждый пользователь при необходимости сможет настроить под себя, воспользовавшись link:../../../user/introduction/managing-user-accounts[страницей настройки параметров пользователя]. === Пользовательский интерфейс @@ -52,17 +52,17 @@ image:image1.png[Пользовательский интерфейс] Название системы:: Введите название системы, которое будет постоянно отображаться в заголовке браузера. Текущий логотип:: Логотип вашей организации, отображаемый в левом верхнем углу каждой страницы системы. Выбрать новый логотип:: Укажите путь к новому логотипу системы, который вы хотите разместить вместо текущего. Допустимы следующие форматы изображений: PNG или JPG. Рекомендуемый размер изображения - 170x450 пикселей. -Мероприятия при преобразовании предварит. контакта:: В процессе link:../../../user/core-modules/leads/#_Преобразование_предварительного_контакта[преобразования] предварительного контакта возможны следующие варианты: +Мероприятия при преобразовании предварит. контакта:: В процессе link:../../../user/core-modules/leads/#_преобразование_предварительного_контакта[преобразования] предварительного контакта возможны следующие варианты: -* *Копировать* - создаются КОПИИ записей мероприятий, каждая из которых образует связь с записями выбранных модулей Контакта И/ИЛИ Контрагента. Связи создаются с записями ВСЕХ выбранных модулей. +* *Копировать* - создаются КОПИИ записей мероприятий, каждая из которых образует связь с записями выбранных модулей Контакта И/ИЛИ Контрагента. Создаются связи с записями ВСЕХ выбранных модулей. * *Перемещать* - записи мероприятий связываются с записью Контакта ИЛИ Контрагента. Связи между мероприятиями и предварительным контактом удаляются. * *Оставить "как есть"* - копии мероприятий и новые связи НЕ создаются. Все созданные мероприятия связаны только с предварительным контактом. -Отключить преобразование для ранее преобразованных предварительных контактов:: Если предварительный контакт уже был link:../../../user/core-modules/leads/#_Преобразование_предварительного_контакта[преобразован], то при включении данного параметра опция *Преобразовать предварит. контакт* будет недоступна. +Отключить преобразование для ранее преобразованных предварительных контактов:: Если предварительный контакт уже был link:../../../user/core-modules/leads/#_преобразование_предварительного_контакта[преобразован], то при включении данного параметра опция *Преобразовать предварит. контакт* будет недоступна. Отображать действия в выпадающем меню:: Все действия в Форме просмотра и в субпанелях будут сгруппированы в выпадающем меню, в противном случае каждое действие будет представлено соответствующей кнопкой. + Включить link:../../../user/introduction/user-interface/in-line-editing/[быструю правку] в Формах списка:: Редактирование данных непосредственно в Форме списка, не открывая Формы редактирования. + Включить link:../../../user/introduction/user-interface/in-line-editing/[быструю правку] в Формах просмотра:: Редактирование данных непосредственно в Форме просмотра, не открывая Формы редактирования.[[Collapced]] + -Отображать link:../../../user/introduction/user-interface/views/#_Субпанели[субпанели] в свёрнутом виде:: При открытии Формы просмотра отображать все субпанели в свёрнутом виде, что повышает удобство просмотра страниц на мобильных устройствах, а также уменьшает время загрузки страницы. +Отображать link:../../../user/introduction/user-interface/views/#_субпанели[субпанели] в свёрнутом виде:: При открытии Формы просмотра отображать все субпанели в свёрнутом виде, что повышает удобство просмотра страниц на мобильных устройствах, а также уменьшает время загрузки страницы. [start=2] . Для сохранения параметров нажмите на кнопку {btn}[Сохранить]. @@ -70,7 +70,7 @@ image:image1.png[Пользовательский интерфейс] === Настройка прокси-сервера -Если вы выходите в интернет, используя прокси-сервер, то для того, чтобы система могла проверять доступные обновления, необходимо произвести дополнительные настройки. +Если вы выходите в интернет, используя прокси-сервер, то необходимо произвести дополнительные настройки. . Заполните следующие поля: Использовать прокси-сервер?:: Отметьте данный параметр, если используется прокси-сервер. @@ -84,11 +84,6 @@ image:image1.png[Пользовательский интерфейс] . Для сохранения параметров нажмите на кнопку {btn}[Сохранить]. . Для восстановления стандартных настроек нажмите на кнопку {btn}[Восстановить]. -[discrete] -=== Click-To-Call - -Отметьте данный параметр, чтобы пользователи могли звонить через сервис Click-To-Call, нажимая указателем на телефонные номера. - === Дополнительные настройки . Вы также можете настроить следующие дополнительные параметры: @@ -191,8 +186,8 @@ image:image4.png[Планировщик] Очищать базу данных первого числа каждого месяца:: Задание проверяет все таблицы системы на наличие записей, помеченных на удаление (deleted = 1) и физически удаляет найденные записи из базы данных первого числа каждого месяца. Резервные копии файлов очищаемых таблиц помещаются в папку cache/backups, к названиям создаваемых копий добавляется информация о дате/времени создания резервного файла. Проверять почтовые ящики для входящей почты:: Задание проверяет почтовые ящики активных учётных записей, настроенных в разделе -link:../email/#_Входящие_e_mail[Входящие E-mail] панели администрирования. -Запускать ночью проверку почтовых ящиков для возвращаемых писем:: Задание проверяет все учётные записи, у которых в колонке *Действие* указано *Обработка возврата*. Задание является важной составляющей при проведении link:../../../user/core-modules/campaigns/#_Подготовка_к_рассылке[массовой рассылки] писем. +link:../email/#_входящие_e_mail[Входящие E-mail] панели администрирования. +Запускать ночью проверку почтовых ящиков для возвращаемых писем:: Задание проверяет все учётные записи, у которых в колонке *Действие* указано *Обработка возврата*. Задание является важной составляющей при проведении link:../../../user/core-modules/campaigns/#_подготовка_к_рассылке[массовой рассылки] писем. Запускать ночью массовую рассылку писем:: Задание обрабатывает очередь исходящих писем при проведении массовой рассылки. Очищать таблицы трекера:: Задание очищает таблицы tracker и tracker_sessions каждые 30 дней. Отправлять напоминания о мероприятиях по E-mail:: Задание отправляет электронные письма с напоминанием о предстоящем звонке или встрече. @@ -205,7 +200,7 @@ link:../../../user/advanced-modules/workflow[Процессы]. Индексировать неиндексированные документы:: Задание индексирует документы для выполнения по ним link:../../../user/introduction/user-interface/search[полнотекстового поиска]. Оптимизировать индекс полнотекстового поиска:: Задание необходимо для выполнения полнотекстового поиска. Создавать отчёты по расписанию:: Задание создаёт и рассылает отчёты, указанные в модуле -link:../../../user/advanced-modules/reports/#_Отчёты_по_расписанию[Отчёты по расписанию]. +link:../../../user/advanced-modules/reports/#_отчёты_по_расписанию[Отчёты по расписанию]. === Настройка заданий планировщика @@ -326,7 +321,7 @@ image:image5.png[Создать задание»] Статус:: Из выпадающего списка выберите *Активно*, чтобы задание выполнялось в указанное время или *Не активно*, чтобы задание была сохранено, но не выполнялось. Задание:: Из выпадающего списка выберите задание. URL задания:: Если в качестве задания выбрано *URL*, то в это поле введите адрес скрипта для запуска задания с указанного веб-сервера. Пример использования URL в задании планировщика описан в разделе -link:../google-maps/#_Геокодирование_адресов[Геокодирование адресов]. +link:../google-maps/#_геокодирование_адресов[Геокодирование адресов]. Периодичность:: Укажите периодичность выполнения задания. По умолчанию отображаются основные параметры планировщика, где вы можете задать периодичность выполнения задания в часах или минутах. По умолчанию задания выполняется ежеминутно. [start=3] @@ -470,7 +465,7 @@ image:image7.png[Диагностика-выполнение] image:image8.png[Мастер импорта] Процесс импорта осуществляется так же, как это описано в разделе -link:../../../user/introduction/user-interface/record-management/#_Импорт_данных[Импорт данных]. +link:../../../user/introduction/user-interface/record-management/#_импорт_данных[Импорт данных]. == Мастер обновления @@ -522,8 +517,8 @@ image:image10.png[Восстановление] Восстановление нестрочных полей:: Приведение названий полей пользовательских таблиц и файлов метаданных к нижнему регистру.[[RepairRoles]] Восстановление ролей:: Добавление контроля доступа как к новым, так и к уже существующим модулям. Функция особенно актуальна для пользователей, не имеющих прав администратора SuiteCRM, и работающими с новыми модулями, добавленными в систему. Восстановление учётных записей входящей почты:: Восстановление учётных записей входящей почты и шифрование паролей. -Обновление импортированных писем:: Обновление ранее импортированных в систему писем - данный функционал используется при обновлении системы с версий 7.8 и более ранних. Детальная информация описана в разделе -link:../../installation-guide/using-the-upgrade-wizard/#_Обновление_импортированных_писем[Обновление импортированных писем]. +Синхронизация учётных записей входящей почты:: Данный функционал используется при обновлении системы с версий 7.8 и более ранних. Детальная информация описана в разделе +link:../../installation-guide/using-the-upgrade-wizard/#_синхронизация_учётных_записей_входящей_почты[Синхронизация учётных записей входящей почты]. Удаление XSS:: Удаление XSS-уязвимостей из базы данных. После выбора данной функции выберите необходимые модули и нажмите на кнопку {btn}[Выполнить]. Восстановление мероприятий:: Восстановление мероприятий (звонков, встреч) и дат. Включить/Отключить демо-пользователей:: Быстрое включение/отключение пользователей, добавленных в систему при заполнении БД демонстрационными данными в процессе установки системы. @@ -674,7 +669,7 @@ image:image13.png[Лента событий] Используйте данный раздел для: . Настройки доступности тем системы. Пользователи могут использовать только доступные темы. По умолчанию доступны все темы системы. Смена текущей темы у конкретного пользователя описана в разделе -link:../../../user/introduction/managing-user-accounts/#_Настройка_тем[Настройка тем]. +link:../../../user/introduction/managing-user-accounts/#_настройка_тем[Настройка тем]. image:image14.png[Темы] @@ -717,7 +712,7 @@ image:image17.png[Языковые пакеты] == Подключения Используйте данный раздел для управления подключениями к внешним источникам данных. При настроенном подключении пользователи могут работать с внешней информацией непосредственно из Формы просмотра записи. Например, пользователь может обновить адреса и телефоны Контрагента. За дополнительной информацией обратитесь к разделу -link:../../../user/introduction/user-interface/record-management/#_Интеграция_данных_системы_с_внешними_данными[Интеграция данных системы с внешними данными]. +link:../../../user/introduction/user-interface/record-management/#_интеграция_данных_системы_с_внешними_данными[Интеграция данных системы с внешними данными]. Как правило, подключения используются в модулях, созданных на основе шаблонов *Персона* и *Компания*, например в модулях *Контакты*, *Предварительные контакты* и *Контрагенты*. Однако вы можете настраивать подключения как в стандартных, так и в пользовательских модулях. Основное требование к подобному модулю – он должен содержать Форму просмотра. diff --git a/content/admin/administration-panel/Users.ru.adoc b/content/admin/administration-panel/Users.ru.adoc index 0a37fb6b3..275e35e52 100644 --- a/content/admin/administration-panel/Users.ru.adoc +++ b/content/admin/administration-panel/Users.ru.adoc @@ -34,11 +34,11 @@ ifdef::env-github[:btn:] Пользователь с административными правами имеет полный доступ к модулям и записям системы, вне зависимости от ограничения ролей, а также имеет доступ к панели администрирования, где он может редактировать стандартные настройки системы, создавать новых пользователей, управлять ролями и группами пользователей, скрывать модули, создавать новые и редактировать стандартные модули системы. Групповой пользователь (не путать с Группами пользователей, описание которых см. ниже) используется только для обработки входящей почты. Например, если для технической поддержки вы создаёте групповую почтовую учётную запись *Support*, то будет создан соответствующий групповой пользователь, в почтовый ящик которого будут поступать все письма, адресованные технической поддержке. Письма из группового почтового ящика могут быть назначены другим пользователям системы - либо прямым назначением, либо циклически, либо по принципу «наименее занятой» (пользователям, имеющим самую короткую очередь назначенных писем). Тип *Групповой пользователь* может быть указан в разделе *Управление пользователями* при создании нового пользователя. Также данный тип пользователя будет создан (как указывалось выше) при создании групповой учётной записи. Более подробная информация находится в разделе -link:../email/#_Входящие_e_mail[Входящие E-mail]. +link:../email/#_входящие_e_mail[Входящие E-mail]. После создания обычного пользователя или пользователя с административными правами соответствующее имя появится как в списке пользователей системы, так и в списке сотрудников. Групповые пользователи будут отображаться только в списке пользователей системы. -В зависимости от задач, выполняемых пользователями в системе, им могут быть назначены различные права доступа. Набор прав доступа описывается т.н. <<Роли и группы пользователей,Ролями>>. Роль может быть назначена пользователю как напрямую, так и опосредованно, через <<_Группы,Группу>> пользователей. Второй вариант как правило более предпочтителен, поскольку позволяет более гибко управлять правами доступа в системе. +В зависимости от задач, выполняемых пользователями в системе, им могут быть назначены различные права доступа. Набор прав доступа описывается т.н. <<Роли и группы пользователей,Ролями>>. Роль может быть назначена пользователю как напрямую, так и опосредованно, через <<Группы,Группу>> пользователей. Второй вариант как правило более предпочтителен, поскольку позволяет более гибко управлять правами доступа в системе. === Создание пользователя @@ -55,12 +55,12 @@ image:image2.png[Создание пользователя] .. В верхней части страницы укажите ФИО, логин, статус и тип пользователя. .. В подразделе *Информация о сотруднике* вы можете указать такую информацию как статус сотрудника, его должность, отдел, ФИО руководителя, контактные данные и т.д. .. В подразделе -link:../email/#_Настройка_e_mail[Настройка E-mail] укажите настройки электронной почты клиента, такие как основной электронный адрес, адрес для автоматического ответа на входящие электронные письма, тип почтового клиента. +link:../email/#_настройка_e_mail[Настройка E-mail] укажите настройки электронной почты клиента, такие как основной электронный адрес, адрес для автоматического ответа на входящие электронные письма, тип почтового клиента. . Если в разделе *Управление паролями* не включено автоматическое создание паролей, то на закладке *Пароль* вы можете задать пароль и сообщить его пользователю. Вы также можете включить автоматическое создание паролей в разделе *Управление паролями*, в этом случае автоматически созданный пароль будет отправлен пользователю по электронной почте на указанный в его учётной записи электронный адрес. Более подробная информация находится в разделе <<Управление паролями>>. . На закладке *Темы* представлены различные способы оформления страниц системы. Темы могут различаться не только внешним видом, но и доступным функционалом. Закладка доступна только в том случае, если в системе установлено более одной темы. . На закладке *Дополнительно* вы можете изменить стандартные настройки пользователя. Более подробная информация находится в разделе -link:../../../user/introduction/managing-user-accounts/#_Пользовательские_настройки[Пользовательские настройки]. +link:../../../user/introduction/managing-user-accounts/#_пользовательские_настройки[Пользовательские настройки]. . Нажмите на кнопку {btn}[Сохранить] для создания пользователя и соответствующего link:../../../user/core-modules/employees[сотрудника]; нажмите на кнопку {btn}[Отказаться] для возврата в панель администрирования без сохранения внесённых изменений. . В режиме просмотра настроек пользователя отображается закладка *Права доступа*, где вы можете просмотреть список имеющихся у пользователя прав на доступ к тем или иным модулям системы. @@ -77,7 +77,7 @@ image:image4.png[Группы и роли] === Управление информацией о пользователях -* Для обновления информации об одном или нескольких пользователях – выберите интересующие вас записи и воспользуйтесь link:../../../user/introduction/user-interface/record-management/#_Массовое_обновление_записей[панелью массового обновления]. +* Для обновления информации об одном или нескольких пользователях – выберите интересующие вас записи и воспользуйтесь link:../../../user/introduction/user-interface/record-management/#_массовое_обновление_записей[панелью массового обновления]. * Для просмотра подробной информации о пользователе – нажмите на его имени в списке пользователей. * Для редактирования данных пользователя – выберите необходимого пользователя из списка и нажмите на кнопку {btn}[Править]. * Для дублирования информации о пользователе нажмите на кнопку {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих записей, вы можете изменить продублированную информацию с целью создания нового пользователя. Значения следующих подразделов не дублируются: Настройки календаря, Параметры макета, Параметры E-mail, Информация о пользователе и Региональные настройки. @@ -208,7 +208,7 @@ image:image5.png[Создание ролей] При необходимости пользователь с административными правами может дать доступ обычным пользователям на создание новых Групп. Для этого: . Переместите модуль *Группы пользователей* в колонку отображаемых модулей как это описано в разделе -link:../developer-tools/#_Настройка_отображения_закладок_и_субпанелей[Настройка отображения закладок и субпанелей]. +link:../developer-tools/#_настройка_отображения_закладок_и_субпанелей[Настройка отображения закладок и субпанелей]. . Выполните link:../system/#RepairRoles[Восстановление ролей]. . В соответствующей Роли (Ролях) для модуля *Группы пользователей* установите *Доступ к модулю* в значение *Доступен*. @@ -316,7 +316,7 @@ image:image10.png[Настройка параметров пароля] ==== Двухфакторная аутентификация Использование двухфакторной аутентификации значительно повышает надёжность доступа к данным системы: при каждом входе в систему после ввода пароля необходимо дополнительно ввести подтверждающий код, присланный на адрес электронной почты пользователя. Включение двухфакторной аутентификации осуществляется в -link:../../../user/introduction/managing-user-accounts/#_Профиль_пользователя[параметрах пользователя]. +link:../../../user/introduction/managing-user-accounts/#_профиль_пользователя[параметрах пользователя]. [discrete] ==== Сброс пароля пользователем @@ -339,7 +339,7 @@ image:image11.png[Включить возможность сброса паро Шаблон письма, содержащий автоматически сгенерированный пароль:: В выпадающем списке выберите пункт *System-generated password email* или нажмите на кнопку {btn}[Создать] для создания нового шаблона. Шаблон письма, содержащий автоматически сгенерированную ссылку сброса пароля:: В выпадающем списке выберите пункт *Forgot Password email* или нажмите на кнопку {btn}[Создать] для создания нового шаблона. Шаблон письма, содержащий код для двухфакторной аутентификации:: В выпадающем списке выберите пункт *Two Factor Authentication email* или нажмите на кнопку {btn}[Создать] для создания нового шаблона. Шаблон в обязательном порядке должен содержать переменную *_$code_*. Настройка двухфакторной аутентификации осуществляется в -link:../../../user/introduction/managing-user-accounts/#_Профиль_пользователя[параметрах пользователя]. +link:../../../user/introduction/managing-user-accounts/#_профиль_пользователя[параметрах пользователя]. Для доступа к созданным шаблонам воспользуйтесь пунктом меню *Шаблоны E-mail* модуля *E-mail*. diff --git a/content/admin/administration-panel/_index.pt.adoc b/content/admin/administration-panel/_index.pt.adoc new file mode 100644 index 000000000..e58ead867 --- /dev/null +++ b/content/admin/administration-panel/_index.pt.adoc @@ -0,0 +1,10 @@ +--- +title: Painel de Administração +weight: 10 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +=== Índice +{{% children depth="3" showhidden="true" %}} diff --git a/content/admin/administration-panel/search/_index.pt.adoc b/content/admin/administration-panel/search/_index.pt.adoc new file mode 100644 index 000000000..b075c6732 --- /dev/null +++ b/content/admin/administration-panel/search/_index.pt.adoc @@ -0,0 +1,10 @@ +--- +title: Pesquisa +weight: 50 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +=== Índice +{{% children depth="3" showhidden="true" %}} diff --git a/content/admin/administration-panel/search/elasticsearch/Command Line Tools.pt.adoc b/content/admin/administration-panel/search/elasticsearch/Command Line Tools.pt.adoc new file mode 100644 index 000000000..095e4d979 --- /dev/null +++ b/content/admin/administration-panel/search/elasticsearch/Command Line Tools.pt.adoc @@ -0,0 +1,75 @@ +--- +title: Ferramentas de Linha de Comandos +weight: 5 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +:imagesdir: /images/en/admin/ElasticSearch + +{{% notice info %}} +Esta funcionalidade só está disponível para versões do SuiteCRM posteriores a 7.11. +{{% /notice %}} + +A integração do SuiteCRM com Elasticsearch inclui duas úteis ferramentas de linha de comandos fornecidas pela +https://robo.li/[_Robo_]. + +Estes dois comandos permitem realizar indexação e pesquisas a partir da linha de comandos, tornando mais fácil +o debug e integração com ferramentas externas. + +{{% notice note %}} +Estes comandos necessitam de uma ligação activa com a base de dados. Se está a correr o SuiteCRM em cima de +Docker ou numa Máquina Virtual, execute-os da linha de comandos do mesmo servidor do SuiteCRM. +{{% /notice %}} + +== elastic:index + +O comando `elastic:index` permite executar a indexação a partir da linha de comandos e ver os registos +passo-a-passo. +Tanto indexação parcial como completa são suportadas. + +=== Uso + +[source,bash] +elastic:index [ = 1] + +=== Exemplos + +Correr uma indexação completa: +[source,bash] +vendor/bin/robo elastic:index 1 + +Running a partial indexing: +[source,bash] +vendor/bin/robo elastic:index 0 + +image:ElasticIndexCLI.png["Elasticsearch Index CLI"] + +== elastic:search + +O comando `elastic:search` permite executar o mesmo tipo de pesquisa que se poderá fazer a partir da barra +de pesquisa, directamente da linha de comands. Retorna um objecto JSON com dados adicionais sobre o registo. + +=== Uso +[source,bash] +elastic:search [ = 20] [ = false] + +Pode usar a sintaxe completa para o argumento `query`. + +A opção `size` indica o número de resultados. + +Quando a opção `showJson` estiver activada, será retornado um objecto json para cada resultado + +=== Exemplos + +Pesquisa por todos os registoc com a palavra 'rohan': +[source,bash] +vendor/bin/robo elastic:search "rohan" + +image:ElasticSearchCLI.png["Elasticsearch CLI"] + +Pesquisar a primeira conta com nome 'Maxwell' e mostrar um JSON: +[source,bash] +vendor/bin/robo elastic:search "_type:Accounts AND named:Maxwell" 1 true + diff --git a/content/admin/administration-panel/search/elasticsearch/Command Line Tools.ru.adoc b/content/admin/administration-panel/search/elasticsearch/Command Line Tools.ru.adoc index e683a646e..ee823f90e 100644 --- a/content/admin/administration-panel/search/elasticsearch/Command Line Tools.ru.adoc +++ b/content/admin/administration-panel/search/elasticsearch/Command Line Tools.ru.adoc @@ -37,11 +37,11 @@ elastic:index [ = 1] Запуск полной индексации: [source,bash] -vendor/bin/robo elastic:index 1 +vendor/bin/robo elastic:index 0 Запуск частичной индексации: [source,bash] -vendor/bin/robo elastic:index 0 +vendor/bin/robo elastic:index 1 image:ElasticIndexCLI.png[Elasticsearch - запуск индексации в консоли] diff --git a/content/admin/administration-panel/search/elasticsearch/Introduction.pt.adoc b/content/admin/administration-panel/search/elasticsearch/Introduction.pt.adoc new file mode 100644 index 000000000..60fd01f7f --- /dev/null +++ b/content/admin/administration-panel/search/elasticsearch/Introduction.pt.adoc @@ -0,0 +1,30 @@ +--- +title: Introdução +weight: 1 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +{{% notice info %}} +{Esta funcionalidade só está disponível para versões do SuiteCRM posteriores a 7.11. +{% /notice %}} + +O https://www.elastic.co/[Elasticsearch] é um motor de indexação criado especificamente +para fornecer resultados de pesquisa em quase-tempo real, optimizado para a pesquisa +de texto. É programado em Java e corre como um processo ou num servidor separado. + +O Elasticsearch pode ser integrado com o SuiteCRM para melhorar bastante a qualidade +e rapidez de pesquisa. +Para atingir este fim, os módulos com possibilidades de pesquisa são indexados no +servidor Elasticsearch. Quando uma pesquisa é efectuada no SuiteCRM, é redireccionada +para o servidor Elasticsearch, que irá executar uma pesquisa optimizada e devolver os +resultados ao CRM. + +O SuiteCRM suporta apenas o `Elasticsearch 5.6`. + +A sincronização da base de dados com o índice elasticsearch acontece de três modos: + +Logic Hooks:: Cada vez que um registo é actualizade é automaticamente reindexado. +Tarefa Programada:: Uma tarefa programada irá correr periodicamente para garantir que a base de dados e o índice se mantêm em sincronia. +Indexação Manual:: Uma indexação completa ou parcial pode ser pedida por um administrador através do painel de administração ou de uma tarefa Robo. diff --git a/content/admin/administration-panel/search/elasticsearch/Introduction.ru.adoc b/content/admin/administration-panel/search/elasticsearch/Introduction.ru.adoc index b961cfcd0..d27e66c76 100644 --- a/content/admin/administration-panel/search/elasticsearch/Introduction.ru.adoc +++ b/content/admin/administration-panel/search/elasticsearch/Introduction.ru.adoc @@ -19,12 +19,13 @@ link:https://www.elastic.co/[Elasticsearch] - это поисковая сис который выполняет оптимизированный поиск и возвращает результаты обратно в CRM. {{% notice note %}} -В данный момент SuiteCRM поддерживает Elasticsearch версии 5.6. +SuiteCRM версии 7.11 поддерживает Elasticsearch 5.6. + +SuiteCRM версии 7.12 поддерживает Elasticsearch 7.x. {{% /notice %}} Синхронизация между базой данных и Elasticsearch выполняется в случае: Обновления записи:: Автоматическая переиндексация после каждого обновления записи. Запуска задачи Планировщика:: Периодический запуск процесса индексации по настроенному расписанию в -link:../../../system/#_Планировщик[Планировщике]. +link:../../../system/#_планировщик[Планировщике]. Ручного запуска процесса индексации:: Полная или частичная индексация, запускаемая администратором либо через панель администрирования, либо в link:../command-line-tools[консоли]. diff --git a/content/admin/administration-panel/search/elasticsearch/Set up Elasticsearch.pt.adoc b/content/admin/administration-panel/search/elasticsearch/Set up Elasticsearch.pt.adoc new file mode 100644 index 000000000..deaa45ada --- /dev/null +++ b/content/admin/administration-panel/search/elasticsearch/Set up Elasticsearch.pt.adoc @@ -0,0 +1,147 @@ +--- +title: Instalar o Elasticsearch +weight: 2 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +{{% notice info %}} +{Esta funcionalidade só está disponível para versões do SuiteCRM posteriores a 7.11. +{% /notice %}} + +:toc: + +{{% notice note %}} +O SuiteCRM requer o Elasticsearch 5.6. +{{% /notice %}} + +O elasticsearch necessita do Java 8, e apenas suporta `Oracle Java` e `OpenJDK`. + +O modo mais rápido de ter um servidor Elasticsearch pronto é através da imagem Docker +oficial ou dos pacotes .deb para sistemas Debian e derivados (como o Ubuntu). + +Neste guia iremos assumir que está a tentar instalar o Elasticsearch numa máquina +com Ubuntu. Veja a +https://www.elastic.co/guide/en/elasticsearch/reference/5.6/install-elasticsearch.html[documentação oficial (em Inglês)] +para conhecer outras maneiras de instalar o Elasticsearch. + +Este guia irá ensiná-lo a ter um servidor de desenvolvimento sem necessidade de grandes configurações, +através da instalação via Docker ou pacote .deb. +Por favor recorde que este guia não é aconselhado para instalar e configurar uma instância +de um servidor Elasticsearch para produção. + +== Instalação via Docker (recomendado) + +{{% notice note %}} +Certifique-se que o utilizador que vai fazer a instalação pertence ao grupo `docker` ou irá receber avisos de permissões. +{{% /notice %}} + +Faça o download da imagem docker: + +[source,bash] +docker pull docker.elastic.co/elasticsearch/elasticsearch:5.6.10 + +=== Iniciar com `docker run` + +Inicie o Elasticsearch. Isto é o ideal para um servidor de teste/desenvolvimento. + +[source,bash] +docker run -p 9200:9200 -p 9300:9300 \ +-e "discovery.type=single-node" -e "xpack.security.enabled=false" \ +docker.elastic.co/elasticsearch/elasticsearch:5.6.10 + +=== Iniciar com `docker-compose` + +Crie um novo ficheiro `docker-compose.yml` ou acrescente a configuração do elasticsearch ao seu ficheiro docker-compose existente. + +[source,yaml] +---- +version: '3' +services: + elasticsearch: + image: docker.elastic.co/elasticsearch/elasticsearch:5.6.10 + container_name: elasticsearch + restart: unless-stopped + ports: + - 9200:9200 + - 9300:9300 + environment: + - discovery.type=single-node + - xpack.security.enabled=false + - "ES_JAVA_OPTS=-Xms512m -Xmx512m" +---- + +E inicie com: + +[source,bash] +docker-compose up + +== Instalar via .deb (não recomendado) + +Faça o download e instalação da chave pública: + +[source,bash] +wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - + +Pode precisar de instalar o pacote `apt-transport-https` no Debian antes de prosseguir: + +[source,bash] +sudo apt-get install apt-transport-https + +Guarde a definição do repositório em `/etc/apt/sources.list.d/elastic-5.x.list`: + +[source,bash] +echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list + +Actualize o repositório e instale o OpenJDK 11 e o Elasticsearch: + +[source,bash] +sudo apt-get update && sudo apt-get install openjdk-11-jre elasticsearch + +{{% notice note %}} +Pode precisar de ajustar a versão do OpenJDK conforme o que estiver disponível para a sua distribuição. +{{% /notice %}} + +Inicie o Elasticsearch com: + +[source,bash] +sudo systemctl start elasticsearch.service + +ou, em versões mais antigas do Ubuntu: + +[source,bash] +/etc/init.d/elasticsearch start + +== Teste a Instalação + +Verifique se o servidor está a correr com: + +[source,bash] +curl -X GET "localhost:9200/" + +E deve receber algo como: + +[source,json] +---- +{ + "name" : "B5VzMdk", + "cluster_name" : "elasticsearch", + "cluster_uuid" : "KGoWI84GQ8SZipmDaeA7pA", + "version" : { + "number" : "5.6.10", + "build_hash" : "b727a60", + "build_date" : "2018-06-06T15:48:34.860Z", + "build_snapshot" : false, + "lucene_version" : "6.6.1" + }, + "tagline" : "You Know, for Search" +} +---- + +{{% notice warning %}} +Note que a configuração mostrada não fornece autenticação. +Lembre-se de fortalecer o seu servidor Elasticsearch antes de o colocar em produção, +ou os seus dados ficarão vulneráveis! +{{% /notice %}} + diff --git a/content/admin/administration-panel/search/elasticsearch/Set up Elasticsearch.ru.adoc b/content/admin/administration-panel/search/elasticsearch/Set up Elasticsearch.ru.adoc index 37266fdb3..787b5af4e 100644 --- a/content/admin/administration-panel/search/elasticsearch/Set up Elasticsearch.ru.adoc +++ b/content/admin/administration-panel/search/elasticsearch/Set up Elasticsearch.ru.adoc @@ -14,7 +14,8 @@ Weight: 2 {{% /notice %}} {{% notice note %}} -В данный момент SuiteCRM поддерживает Elasticsearch версии 5.6. +SuiteCRM версии 7.11 поддерживает Elasticsearch 5.6. + +SuiteCRM версии 7.12 поддерживает Elasticsearch 7.x. {{% /notice %}} Для работы Elasticsearch необходимо Java 8 , поддерживается только *Oracle Java* и *OpenJDK*. diff --git a/content/admin/administration-panel/search/elasticsearch/Troubleshooting.ru.adoc b/content/admin/administration-panel/search/elasticsearch/Troubleshooting.ru.adoc index 3e8f10333..b0150db10 100644 --- a/content/admin/administration-panel/search/elasticsearch/Troubleshooting.ru.adoc +++ b/content/admin/administration-panel/search/elasticsearch/Troubleshooting.ru.adoc @@ -15,13 +15,13 @@ ifdef::env-github[:imagesdir: ./../../../../../../master/static/images/en/admin/ {{% /notice %}} Чтобы упростить процесс устранения неполадок для расширения Elasticsearch, используется отдельный и очень подробный файл журнала *_search_index.log_*, поскольку процедуры индексирования выполняются в фоновом режиме и их достаточно трудно отлаживать. Результаты также перенаправляются в стандартный файл журнала, где отфильтровываются в соответствии с уровнем детализации ведения журнала, указанным в -link:../../../system/#_Параметры_журнала[настройках конфигурации]. +link:../../../system/#_параметры_журнала[настройках конфигурации]. В дополнение к проверке журналов вы можете выполнить поиск или индексирование непосредственно из командной строки, используя link:../command-line-tools[консольные утилиты]. Детальный вывод результатов поможет сузить диапазон поиска проблемы. И, наконец, включение режима разработчика в -link:../../../system/#_Дополнительные_настройки[настройках конфигурации] позволит отобразить страницу с исключением, если во время поиска произойдёт ошибка. +link:../../../system/#_дополнительные_настройки[настройках конфигурации] позволит отобразить страницу с исключением, если во время поиска произойдёт ошибка. image:ErrorPage.png[Пример подробного сообщения об ошибке] diff --git a/content/admin/administration-panel/search/elasticsearch/_index.pt.adoc b/content/admin/administration-panel/search/elasticsearch/_index.pt.adoc new file mode 100644 index 000000000..24984d856 --- /dev/null +++ b/content/admin/administration-panel/search/elasticsearch/_index.pt.adoc @@ -0,0 +1,14 @@ +--- +title: Elasticsearch +weight: 10 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +{{% notice info %}} +Esta funcionalidade só está disponível para versões do SuiteCRM posteriores a 7.11. +{{% /notice %}} + +== Índice +{{% children depth="3" showhidden="true" %}} diff --git a/content/admin/installation-guide/Downloading & Installing.ru.adoc b/content/admin/installation-guide/Downloading & Installing.ru.adoc index c710fd45a..a7c92a246 100644 --- a/content/admin/installation-guide/Downloading & Installing.ru.adoc +++ b/content/admin/installation-guide/Downloading & Installing.ru.adoc @@ -52,13 +52,14 @@ ifdef::env-github[:btn:] Для установки драйверов выполните следующее: - . Загрузите необходимые драйвера, руководствуясь данной таблицей. -[cols="1,3,3",options="header"] + . Загрузите необходимые драйвера, руководствуясь данной таблицей: + +[cols="1,1,5",options="header"] |=== |Тип БД |Расширение |Драйвер -|MySQL |mysqli |http://us.php.net/manual/en/book.mysqli.php +|MySQL |mysqli |https://www.php.net/manual/ru/book.mysqli.php -|Microsoft SQL |sqlsrv |http://msdn.microsoft.com/en-us/library/cc296170.aspx +|Microsoft SQL |sqlsrv |https://docs.microsoft.com/ru-ru/sql/connect/php/system-requirements-for-the-php-sql-driver |=== [start=2] @@ -73,16 +74,14 @@ link:../../compatibility-matrix[Таблица совместимости]. Для предотвращения неавторизованного доступа к файлам системы при использовании веб-сервера Apache рекомендуется выполнить следующее: -Перед запуском процесса установки в файле httpd.conf установите для папки SuiteCRM параметр *_AllowOverride_* в значение *_All_*. После установки системы в корневой папке устанавливаемой системы появится файл .htaccess, содержащий следующие строки: +Перед запуском процесса установки в файле httpd.conf установите для папки SuiteCRM параметр *_AllowOverride_* в значение *_All_*. После установки системы в корневой папке устанавливаемой системы появится файл .htaccess, содержащий в том числе следующие строки: + [source] ---- -# BEGIN SUITECRM RESTRICTIONS -RedirectMatch 403 (?i)^.*\.log$ -RedirectMatch 403 (?i)/+not_imported_.*\.txt -RedirectMatch 403 (?i)/+(soap|cache|xtemplate|data|examples|include|log4php|metadata|modules)/+.*\.(php|tpl) -RedirectMatch 403 (?i)/+emailmandelivery\.php -RedirectMatch 403 (?i)/+cache/+upload -# END SUITECRM RESTRICTIONS +# BEGIN SUITECRM RESTRICTIONS +RedirectMatch 403 (?i).*\.log$ +RedirectMatch 403 (?i)/+not_imported_.*\.txt +RedirectMatch 403 (?i)/+(soap|cache|xtemplate|data|examples|include|log4php|metadata|modules|vendor)/+.*\.(php|tpl) ---- Для проверки действия этих ограничений попытайтесь просмотреть через браузер файл *_suitecrm.log_*, должна появиться ошибка *_#403_*. Если этого не произошло – проверьте файл *_.htaccess_*. За более подробной информацией обратитесь к документации Apache. @@ -160,7 +159,7 @@ image:image1.png[Лицензионное соглашение] [start=3] . Примите лицензионное соглашение и нажмите на кнопку {btn}[Вперёд]. -Инсталлятор проверит права доступа к файлам системы и если права установлены корректно - отобразит либо: +Инсталлятор проверит права доступа к файлам системы и если права установлены корректно - отобразит: * информацию об установленных пакетах * информацию об отсутствующих пакетах (если таковые имеются) @@ -187,17 +186,22 @@ image:image3.png[Настройки конфигурации системы] [start=5] . В нижней части страницы могут быть указаны следующие дополнительные *_НЕОБЯЗАТЕЛЬНЫЕ_* параметры: +* Дополнительные параметры базы данных - выбор сопоставления (utf8_general_ci / utf8mb4_general_ci) и кодировки (utf8 / utf8mb4) базы данных * Демонстрация – заполнение базы данных демонстрационными данными -* Выбор наборов модулей – выбор наборов модулей, доступных пользователям системы. Доступность модулей (закладок) может быть настроена позже (см. раздел link:../../administration-panel/developer-tools/#_Настройка_отображения_закладок_и_субпанелей[Настройка отображения закладок и субпанелей]). -* Настройка SMTP-сервера – настройка сервера исходящей почты. Настройка может быть выполнена позже (см. раздел link:../../administration-panel/email/#_Настройка_e_mail[Настройка E-mail]). -* Настройка логотипа - указание картинки с логотипом системы. Настройка может быть выполнена позже (см. раздел link:../../administration-panel/system/#_Пользовательский_интерфейс[Пользовательский интерфейс]). -* Региональные настройки – настройка формата даты, времени, символов валют, часового пояса и т.д. Настройка может быть выполнена позже (см. раздел link:../../administration-panel/system/#_Региональные_настройки[Региональные настройки]). +* Выбор наборов модулей – выбор наборов модулей, доступных пользователям системы. Доступность модулей (закладок) может быть настроена позже (см. раздел link:../../administration-panel/developer-tools/#_настройка_отображения_закладок_и_субпанелей[Настройка отображения закладок и субпанелей]). +* Настройка SMTP-сервера – настройка сервера исходящей почты. Настройка может быть выполнена позже (см. раздел link:../../administration-panel/email/#_настройка_e_mail[Настройка E-mail]). +* Настройка логотипа - указание картинки с логотипом системы. Настройка может быть выполнена позже (см. раздел link:../../administration-panel/system/#_пользовательский_интерфейс[Пользовательский интерфейс]). +* Региональные настройки – настройка формата даты, времени, символов валют, часового пояса и т.д. Настройка может быть выполнена позже (см. раздел link:../../administration-panel/system/#_региональные_настройки[Региональные настройки]). * Параметры безопасности – дополнительные параметры защиты системы. +{{% notice info %}} +Настройка дополнительных параметров базы данных доступна в SuiteCRM версий 7.10.23 / 7.11.11 и выше. +{{% /notice %}} + {{% notice note %}} • Доступность модулей (отображаемые закладки) для конкретного пользователя может быть изменена в -link:../../../user/introduction/managing-user-accounts/#_Параметры_макета[параметрах макета] профиля пользователя + +link:../../../user/introduction/managing-user-accounts/#_параметры_макета[параметрах макета] профиля пользователя + • Региональные настройки конкретного пользователя могут быть изменены в -link:../../../user/introduction/managing-user-accounts/#_Дополнительно[дополнительных настройках] профиля пользователя +link:../../../user/introduction/managing-user-accounts/#_дополнительно[дополнительных настройках] профиля пользователя {{% /notice %}} diff --git a/content/admin/installation-guide/Languages/install-a-new-language.ru.adoc b/content/admin/installation-guide/Languages/install-a-new-language.ru.adoc index 04ac67dc4..08dd55558 100644 --- a/content/admin/installation-guide/Languages/install-a-new-language.ru.adoc +++ b/content/admin/installation-guide/Languages/install-a-new-language.ru.adoc @@ -40,13 +40,13 @@ image:image1.png[Открытие панели администратора] [start=2] . Установите скачанный пакет в систему, как это описано в разделе -link:../../../administration-panel/developer-tools/#_Загрузчик_модулей[Загрузчик модулей]. +link:../../../administration-panel/developer-tools/#_загрузчик_модулей[Загрузчик модулей]. . Выйдите из системы и войдите в систему заново, предварительно выбрав необходимый язык на странице ввода логина/пароля. image:image3.png[Выбор языкового пакета] [start=3] . В панели администрирования при необходимости укажите русский язык в качестве языка системы по умолчанию, как это описано в разделе -link:../../../administration-panel/system/#_Региональные_настройки[Региональные настройки]. +link:../../../administration-panel/system/#_региональные_настройки[Региональные настройки]. image:image2.png[Установка русского языка в качестве основного языка SuiteCRM] diff --git a/content/admin/installation-guide/Languages/update-a-language-pack.ru.adoc b/content/admin/installation-guide/Languages/update-a-language-pack.ru.adoc index 8cf4ee150..8b3998a3d 100644 --- a/content/admin/installation-guide/Languages/update-a-language-pack.ru.adoc +++ b/content/admin/installation-guide/Languages/update-a-language-pack.ru.adoc @@ -12,10 +12,10 @@ ifdef::env-github[:imagesdir: ./../../../../master/static/images/ru/admin/Instal . Перед установкой обновлённого языкового пакета удалите ранее установленный пакет, как это описано в разделе -link:../../../administration-panel/developer-tools/#_Загрузчик_модулей[Деинсталляция модуля]. +link:../../../administration-panel/developer-tools/#_загрузчик_модулей[Деинсталляция модуля]. . Установите новый языковой пакет, как это описано в разделе link:../install-a-new-language[Русификация SuiteCRM]. - . В панели администратора выполните link:../../../administration-panel/system/#_Восстановление[быстрое восстановление]. + . В панели администратора выполните link:../../../administration-panel/system/#_восстановление[быстрое восстановление]. diff --git a/content/admin/installation-guide/Upgrading.ru.adoc b/content/admin/installation-guide/Upgrading.ru.adoc index d02db8cf2..a15d4efd2 100644 --- a/content/admin/installation-guide/Upgrading.ru.adoc +++ b/content/admin/installation-guide/Upgrading.ru.adoc @@ -104,7 +104,7 @@ link:../../compatibility-matrix[этой] странице. {{% notice tip %}} • Если перед обновлением не были сделаны резервные копии файлов SuiteCRM и базы данных, протестируйте обновление на тестовом экземпляре SuiteCRM + • Если в какой-либо из таблиц обновляемой БД содержится более чем 10000 записей, выполняйте обновление из командной строки, не используя мастер обновления + -• После завершения обновления войдите в SuiteCRM с правами администратора и выполните link:../../administration-panel/system/#_Восстановление[Быстрое восстановление] +• После завершения обновления войдите в SuiteCRM с правами администратора и выполните link:../../administration-panel/system/#_восстановление[Быстрое восстановление] {{% /notice %}} == Выполнение обновления diff --git a/content/admin/installation-guide/Using the Upgrade Wizard.ru.adoc b/content/admin/installation-guide/Using the Upgrade Wizard.ru.adoc index 867b9e191..8e0c1d237 100644 --- a/content/admin/installation-guide/Using the Upgrade Wizard.ru.adoc +++ b/content/admin/installation-guide/Using the Upgrade Wizard.ru.adoc @@ -75,26 +75,40 @@ image:image4.png[] . Нажмите кнопку {btn}[Вперёд] для перехода к заключительному этапу обновления. Если ранее было выбрано ручное выполнение SQL-запросов, то оно должно быть выполнено на данном этапе. . Нажмите на кнопку {btn}[Готово], после чего откроется основная страница системы. . В панели администрирования перейдите в раздел *_Восстановление_* и выполните перестройку расширений и перестройку связей. Более подробная информация находится в разделе -link:../../administration-panel/system/#_Восстановление[Восстановление]. +link:../../administration-panel/system/#_восстановление[Восстановление]. {{% notice note %}} Если процесс обновления завершился неудачно, обратитесь к файлу *_upgradeWizard.log_*, расположенному в корневой папке системы. {{% /notice %}} -== Обновление импортированных писем +== Синхронизация учётных записей входящей почты -Описанные ниже действия актуальны при обновлении системы с версий 7.8.х или более ранних. +В SuiteCRM версии 7.8 и более ранних система синхронизировала заголовки электронной почты, прежде чем пользователи могли их просматривать. Начиная с версии 7.9 SuiteCRM напрямую связывается с сервером электронной почты, получая только минимально необходимую информацию. Такой алгоритм исключает процесс синхронизации и значительно сокращает объём почтовых данных, сохраняемых в базе данных. {{% notice note %}} -В версии 7.9 и более поздних изменился алгоритм хранения почтовых данных. Если в предыдущих версиях почтовые данные кэшировались в системе (использовалась таблица email_cache), то теперь SuiteCRM напрямую взаимодействует с почтовым сервером, избавляясь от необходимости синхронизации информации и значительно сокращая объём почтовых данных, сохраняемых в базе данных. +Для разработчиков: таблица 'email_cache' считается устаревшей, начиная с SuiteCRM версии 7.9. {{% /notice %}} -Для обновления ранее импортированных в систему писем выполните следующее: :: +=== Особенности обновления с устаревших версий - . В панели Администрирования выберите пункт menu:Восстановление[Синхронизация учётных записей входящей почты]. - . Выберите необходимую учётную запись (или несколько записей) входящей почты и нажмите на кнопку {btn}[Синхронизировать]. - -Если в процессе синхронизации возникнут ошибки, то информация о них будет сохранена в файле *_suitecrm.log_*. +Если вы обновляете систему с версии 7.8 и более ранних, то после обновления вам необходимо выполнить синхронизацию учётных записей входящей почты. Этот функционал синхронизирует почту, уже импортированную в SuiteCRM, с вашими текущими учетными записями почтового сервера, поэтому вам не придется синхронизировать ее в будущем. Мы рекомендуем сделать резервную копию как базы данных, так и файлов Suite CRM перед выполнением обновления. + + +=== Выполнение синхронизации + +В панели Администрирования выберите пункт menu:Восстановление[Синхронизация учётных записей входящей почты] + +image:image6.png[Синхронизация учётных записей входящей почты] + +Появится окно, в котором перечислены все активные учётные записи входящей электронной почты (включая персональные учетные записи). + +[cols="30,70",frame="none", grid="none"] +|=== +|image:image7.png[Выбор учётных записей для синхронизации] +|Выберите нужные учетные записи (удерживайте клавишу Ctrl для множественного выбора) и нажмите на кнопку {btn}[Синхронизация]. +|=== + +При возникновении ошибки попробуйте синхронизацию на других учётных записях. Все возможные ошибки будут записаны в файл suitecrm.log. == Блокировка мастера обновления diff --git a/content/admin/releases/7.10.x/_index.en.adoc b/content/admin/releases/7.10.x/_index.en.adoc old mode 100644 new mode 100755 index 2ff36c940..dba86bccd --- a/content/admin/releases/7.10.x/_index.en.adoc +++ b/content/admin/releases/7.10.x/_index.en.adoc @@ -6,25 +6,774 @@ weight: 9890 :toc: :toc-title: :toclevels: 1 +:icons: font -:experimental: +== 7.10.35 + +_Released 17/12/2021_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.10.35.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.10.35.tar.gz[*Source code* (tar.gz)] + +==== icon:lock[] Security + +* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-45903[CVE-2021-45903] - XSS Vulnerability +* CVE: Pending - RCE and CSRF Vulnerability +* CVE: Pending - Privilege Escalation vulnerability +* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-45041[CVE-2021-45041] - Authenticated SQL-Injection in SuiteCRM + +[discrete] + +==== icon:bug[] Bug Fixes + +* PR: https://github.com/salesagility/SuiteCRM/pull/9384[9348] - Fix https://github.com/salesagility/SuiteCRM/issues/9382[#9382] - Outbound Emails editview Unsupported operand types fatal in php 8 +* PR: https://github.com/salesagility/SuiteCRM/pull/9379[9379] - Fix https://github.com/salesagility/SuiteCRM/issues/9374[#9374] - OAuth password creation Unsupported operand types fatal in php8 +* PR: https://github.com/salesagility/SuiteCRM/pull/9087[9087] - Fix #9078 - Allow changing text colors when composing an email +* PR: https://github.com/salesagility/SuiteCRM/pull/9377[9377] - Fix https://github.com/salesagility/SuiteCRM/issues/9376[#9376] - Allow Workflows to run on imported records +* PR: https://github.com/salesagility/SuiteCRM/pull/9030[9030] - Fix #9030 - Campaign Email settings removes Email Settings + +=== icon:heart[] Community + +_Special thanks to everyone who reporting the security issues addressed in this release!_ + +Konstantin Damotsev, Victor Garcia, Manuel Zametter + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors QuickCRM yaroslaw74 mstyp %}} + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.10.34 + +_Released 19/11/2021_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.10.34.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.10.34.tar.gz[*Source code* (tar.gz)] + +==== icon:lock[] Security + +* CVE: Pending - Fixed file check bypass +* CVE: Pending - Local File Inclusion + +[discrete] + +==== icon:bug[] Bug Fixes +* Fix https://github.com/salesagility/SuiteCRM/issues/8432[8432] - Remove index limit from mssql index names upon create and repair. +* PR: https://github.com/salesagility/SuiteCRM/pull/8957[8957] - Fix typo in word administrator +* PR: https://github.com/salesagility/SuiteCRM/pull/9368[9368] - Fix https://github.com/salesagility/SuiteCRM/issues/9217[9217] - Revert "Fix Users index incompatible with MSSQL". +* PR: https://github.com/salesagility/SuiteCRM/pull/9360[9360] - Fix https://github.com/salesagility/SuiteCRM/issues/9358[9358] - Meeting invite notification emails are not sending to all invitees. +* PR: https://github.com/salesagility/SuiteCRM/pull/9361[9361] - Fix https://github.com/salesagility/SuiteCRM/issues/9192[9192]: Fix duplication of folders_rel table entries. +* PR: https://github.com/salesagility/SuiteCRM/pull/9246[9246] - Fix https://github.com/salesagility/SuiteCRM/issues/6994[6994]: Update pollMonitoredInboxesAOP to double check that SugarFolder has been retrieved correctly. +* PR: https://github.com/salesagility/SuiteCRM/pull/9367[9367] - Update PDF template warning + +=== icon:heart[] Community + +_Special thanks to everyone who reporting the security issues addressed in this release!_ + +Victor Garcia + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors SinergiaCRM timo-ecm2 prbt2016 InfoLibre afnieves BKPepe gerdb42 %}} + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.10.33 + +_Released 24/09/2021_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.10.33.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.10.33.tar.gz[*Source code* (tar.gz)] + +==== icon:lock[] Security + +* CVE: Pending - Privilege Escalation vulnerability +* CVE: Pending - Local File Inclusion + +[discrete] + +==== icon:bug[] Bug Fixes + +* PR: https://github.com/salesagility/SuiteCRM/pull/9277[9277] - Issue: https://github.com/salesagility/SuiteCRM/issues/9269[9269] - Fix #9269 - edit view jumps to tab with validation error upon save,if hidden +* PR: https://github.com/salesagility/SuiteCRM/pull/9262[9262] - Fix #9262 - Add the Overview label to Security Groups detailview +* PR: https://github.com/salesagility/SuiteCRM/pull/9286[9286] - Fix #9286 - EmailsComposeView.js Formatting +* PR: https://github.com/salesagility/SuiteCRM/pull/9293[9293] - Fix #9293 - Error on audit save +* PR: https://github.com/salesagility/SuiteCRM/pull/9297[9297] - Fix #9297 - V8 API Auth issues on windows + +=== icon:heart[] Community + +_Special thanks to everyone who reporting the security issues addressed in this release!_ + +Konstantin Damotsev + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors schapsl tsmgeek %}} + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.10.32 + +_Released 20/08/2021_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.10.32.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.10.32.tar.gz[*Source code* (tar.gz)] + +==== icon:lock[] Security + +* https://cwe.mitre.org/data/definitions/1236.html[CWE-1236]: Improper Neutralization of Formula Elements in a CSV File +* https://cwe.mitre.org/data/definitions/284.html[CWE-284]: : Improper Access Control + +[discrete] + +==== icon:bug[] Bug Fixes + +* PR: https://github.com/salesagility/SuiteCRM/pull/8921[8921^] - Link Fix - Upgrade Documentation +* PR: https://github.com/salesagility/SuiteCRM/pull/8922[8922^] - Notes for translators on abbreviations +* PR: https://github.com/salesagility/SuiteCRM/pull/8923[8923^] - Indentation Fix +* PR: https://github.com/salesagility/SuiteCRM/pull/8925[8925^] - Space Typo Fix +* PR: https://github.com/salesagility/SuiteCRM/pull/8929[8929^] - Moving comment next to the string +* PR: https://github.com/salesagility/SuiteCRM/pull/8930[8930^] - https url fix +* PR: https://github.com/salesagility/SuiteCRM/pull/8931[8931^] - SuiteP template translators notes +* PR: https://github.com/salesagility/SuiteCRM/pull/9180[9180^] - Issue: https://github.com/salesagility/SuiteCRM/issues/9179[9179^] - Fix for: #9179 AOR_Charts getShortenedLabel fails on utf8 characters +* PR: https://github.com/salesagility/SuiteCRM/pull/9072[9072^] - Make Projects Importable +* PR: https://github.com/salesagility/SuiteCRM/pull/9102[9102^] - Issue: https://github.com/salesagility/SuiteCRM/issues/4145[4145^] - Fix for: Email Address - "invalid" and "opt_out" options are lost +* PR: https://github.com/salesagility/SuiteCRM/pull/9206[9206^] - Issue: https://github.com/salesagility/SuiteCRM/issues/9205[9205^] - Fix #9205 - Duplicate audit records +* PR: https://github.com/salesagility/SuiteCRM/pull/8534[8534^] - Fix Archive Folder Query +* PR: https://github.com/salesagility/SuiteCRM/pull/8587[8587^] - Add cases to email object_arr +* PR: https://github.com/salesagility/SuiteCRM/pull/8685[8685^] - Only init Currency when saving +* PR: https://github.com/salesagility/SuiteCRM/pull/8732[8732^] - AOR_Reports generating php notices due to undef +* PR: https://github.com/salesagility/SuiteCRM/pull/9044[9044^] - Change pdfheader/pdffooter data type to longtext +* PR: https://github.com/salesagility/SuiteCRM/pull/9084[9084^] - Set default perms on new log file +* PR: https://github.com/salesagility/SuiteCRM/pull/9195[9195^] - Update CaseUpdatesHook.php +* PR: https://github.com/salesagility/SuiteCRM/pull/8485[8485^] - Fix function declaration of TabController::get_key_array() +* PR: https://github.com/salesagility/SuiteCRM/pull/9008[9008^] - Wrong spelling of ProspectLists module +* PR: https://github.com/salesagility/SuiteCRM/pull/9202[9202^] - Issue: https://github.com/salesagility/SuiteCRM/issues/9201[9201^] - Filter form label styling +* PR: https://github.com/salesagility/SuiteCRM/pull/9238[9238^] - Issue: https://github.com/salesagility/SuiteCRM/issues/9237[9237^] - Fix #9237 where dates in aow actions & conditions are not saved or displayed correctly +* PR: https://github.com/salesagility/SuiteCRM/pull/9223[9223^] - Issue: https://github.com/salesagility/SuiteCRM/issues/6997[6997^] - User profile password auto-fill +* PR: https://github.com/salesagility/SuiteCRM/pull/9182[9182^] - Allow filtering Survey campaigns +* PR: https://github.com/salesagility/SuiteCRM/pull/8992[8992^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8991[8991^] - Small bit of duplicate code +* PR: https://github.com/salesagility/SuiteCRM/pull/9007[9007^] - Wrong spelling of AOR_Reports module +* PR: https://github.com/salesagility/SuiteCRM/pull/9069[9069^] - Inline Edit: Help text containing quotes is not correctly displayed +* PR: https://github.com/salesagility/SuiteCRM/pull/8613[8613^] - Improve Contacts Duplicate List +* PR: https://github.com/salesagility/SuiteCRM/pull/8898[8898^] - Retrieve SuiteCRM version in get_server_info +* PR: https://github.com/salesagility/SuiteCRM/pull/9255[9255^] - Issue: https://github.com/salesagility/SuiteCRM/issues/9236[9236^] - Fix issue with email attachments in emails not working + +=== icon:heart[] Community + +_Special thanks to everyone who reporting the security issues addressed in this release!_ + +Hagai Wechsler + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors horus68 gody01 QuickCRM tsmgeek tsitle amariussi adamjakab robinson-j16 %}} + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.10.31 + +_Released 02/06/2021_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.10.31.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.10.31.tar.gz[*Source code* (tar.gz)] + +==== icon:lock[] Security + +* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=2018-19296[CVE-2018-19296^] - Object Injection in PHPMailer + +[discrete] + +==== icon:bug[] Bug Fixes + +* PR: https://github.com/salesagility/SuiteCRM/pull/9149[9149^] Issue: https://github.com/salesagility/SuiteCRM/issues/8319[8319^] - Multiple IMAP Inboxes +* PR: https://github.com/salesagility/SuiteCRM/pull/8731[8731^] Issue: https://github.com/salesagility/SuiteCRM/issues/7285[7285^] - Database failure when filter custom fields by V8 API +* PR: https://github.com/salesagility/SuiteCRM/pull/9123[9123^] - Upgrade PHPMailer +* Issue: https://github.com/salesagility/SuiteCRM/issues/9106[9106^] - JSON Error in related field's popup +* Issue: https://github.com/salesagility/SuiteCRM/issues/9166[9166^] - Fix Missing locale in FullCalender 3.10 +* Fix Users index incompatible with MSSQL +* Fix Php compatibility within Admin ConfigureTabs +* Fix Email Address loading performance +* Fix theme - dashletclose.png loading error in console +* Fix theme - Footer text colour inconsistency +* Fix theme - Menu overflow top module alignment +* Fix theme - Admin settings empty error displays line +* Change populateDefaultValues fatal log on empty field_defs to warning + +=== icon:heart[] Community + +_Special thanks to everyone who reporting the security issues addressed in this release!_ + +Daniel Sundbeck + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors nelem holdusback cekowu YonatanRosemarin %}} + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.10.30 + +_Released 28/04/2021_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.10.30.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.10.30.tar.gz[*Source code* (tar.gz)] + +==== icon:lock[] Security + +* CVE: Pending - XSS Vulnerability +* CVE: Pending - XSS Vulnerability +* CVE: Pending - XSS Vulnerability +* CVE: Pending - XSS Vulnerability +* CVE: Pending - XSS Vulnerability +* CVE: Pending - Fixed Dependency +* CVE: Pending - Fixed stored XSS vulnerability +* CVE: Pending - Fixed stored XSS vulnerability +* CVE: Pending - Fixed file check bypass +* CVE: Pending - Improved file upload checks + +[discrete] + +==== icon:bug[] Bug Fixes + +* PR: https://github.com/salesagility/SuiteCRM/pull/8642[8642^] - Issue: https://github.com/salesagility/SuiteCRM/issues/5107[5107^] - Fix Inline edit date/datetime issue +* PR: https://github.com/salesagility/SuiteCRM/pull/7999[7999^] - Prevent securitygroups mass assign damage +* PR: https://github.com/salesagility/SuiteCRM/pull/8571[8571^] - Remove duplicate code in users detailviewdefs +* PR: https://github.com/salesagility/SuiteCRM/pull/8514[8514^] - Implement effective opcache file clearing +* PR: https://github.com/salesagility/SuiteCRM/pull/8700[8700^] - Various problems in PHPDocs throughout the codebase. +* PR: https://github.com/salesagility/SuiteCRM/pull/9068[9068^] - Issue: https://github.com/salesagility/SuiteCRM/issues/9067[9067^] - Fix the drop down width +* PR: https://github.com/salesagility/SuiteCRM/pull/9093[9093^] - Add Additional api filter option `like` +* PR: https://github.com/salesagility/SuiteCRM/pull/9090[9090^] - User menu alignment +* PR: https://github.com/salesagility/SuiteCRM/pull/8570[8570^] - Issue: https://github.com/salesagility/SuiteCRM/issues/6051[6051] - Modulebuilder labels edit fixes +* PR: https://github.com/salesagility/SuiteCRM/pull/9088[9088^] - Update JQuery JS Library to v3.6.0 +* PR: https://github.com/salesagility/SuiteCRM/pull/9000[9000^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8999[8999^] - Hardcoded 'by' label in calls +* PR: https://github.com/salesagility/SuiteCRM/pull/9035[9035^] - Issue: https://github.com/salesagility/SuiteCRM/issues/9034[9034^] - Business Hours does not work in non-english languages +* PR: https://github.com/salesagility/SuiteCRM/pull/8910[8910^] - Update the V8 Api to allow for upload of documents similar to notes +* PR: https://github.com/salesagility/SuiteCRM/pull/9010[9010^] - Add missing 'view task' label on calendar +* PR: https://github.com/salesagility/SuiteCRM/pull/9003[9003^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8894[8894^] - Add missing label for calendar dashlet +* PR: https://github.com/salesagility/SuiteCRM/pull/9032[9032^] - Prevent Notice Error During Import +* PR: https://github.com/salesagility/SuiteCRM/pull/8206[8206^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8182[8182^] - Update updateTimeDateFields to handle undefined dates +* PR: https://github.com/salesagility/SuiteCRM/pull/9076[9076^] - Issue: https://github.com/salesagility/SuiteCRM/issues/9075[9075^] - Removing deleted related beans via link +* PR: https://github.com/salesagility/SuiteCRM/pull/8988[8988^] - Improve upon solution which doesn't cache incomplete beans +* PR: https://github.com/salesagility/SuiteCRM/pull/9060[9060^] - Project Form action should not be changed if delete is not confirmed +* PR: https://github.com/salesagility/SuiteCRM/pull/9059[9059^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8676[8676^] - New Scheduled Reports does not run +* PR: https://github.com/salesagility/SuiteCRM/pull/9079[9079^] - Issue: https://github.com/salesagility/SuiteCRM/issues/2645[2645^] - Calendar quick create ignores required fields +* PR: https://github.com/salesagility/SuiteCRM/pull/9054[9054^] - Add missing scheduler label for trimSugarFeeds +* PR: https://github.com/salesagility/SuiteCRM/pull/9070[9070^] - Fix php compatibility issues +* PR: https://github.com/salesagility/SuiteCRM/pull/8974[8974^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8956[8956^] - Email compose body not shown in detail view + + +=== icon:heart[] Community + +_Special thanks to everyone who reporting the security issues addressed in this release! + +Cory Billington, Thanhlocpanda of https://vincss.net[VinCSS^] (Member of Vingroup), Hao Wang, Sam Sanoop, Chris Forbes, James Addison + + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors RustyDust topesantos gunnicom pgorod JanSiero duncanf95 jperez-murcia QuickCRM mayerelyashiv lehnerr tsitle dawid-zaroda tsummerer sweettbug3 mubat eliaski staganyi tsmgeek ebogaard %}} + + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.10.29 + +_Released 05/11/2020_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.10.29.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.10.29.tar.gz[*Source code* (tar.gz)] +* https://suitecrm.com/files/162/SuiteCRM-7.11/530/SuiteCRM_Upgrade_Patch_1.0.1.zip[*Upgrade Patch* (zip)] + +=== icon:check[] Release Notes + +Important - This release resolves an important issue in 7.10.28 that can cause issues in many areas of the crm, including in reports, roles and currency. We recommend all users of 7.10.28 to upgrade to this release asap. see issues +https://github.com/salesagility/SuiteCRM/issues/8936[8936^] and https://github.com/salesagility/SuiteCRM/issues/8934[8934^] for more details + +Important - Update 17 March 2021 - The upgrade patch has been updated to version 1.0.1. This update addresses an issue in which the upgrade patch may have prevented the option to select "Next" after a successful system check when upgrading. Special thanks to JanSiero for highlighting this issue and fix. + + +==== icon:bug[] Bug Fixes + +* Issue: https://github.com/salesagility/SuiteCRM/issues/8936[8936^] - +/- get removed from start of text +* Issue: https://github.com/salesagility/SuiteCRM/issues/8934[8934^] - Report main group issues +* Issue: https://github.com/salesagility/SuiteCRM/issues/8391[8391^] - Yesterday period option in reports show correct time +* Issue: https://github.com/salesagility/SuiteCRM/issues/8863[8863^] - Cannot report on Employee Status +* Issue: https://github.com/salesagility/SuiteCRM/issues/8918[8918^] - Regression with download.php image fields +* Issue: https://github.com/salesagility/SuiteCRM/issues/8941[8941^] - Cannot delete reports fields +* Issue: https://github.com/salesagility/SuiteCRM/issues/8826[8826^] - PDF Report contains blank space when using a Main Group and Total + + +=== icon:heart[] Community + + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors Tuckan pgorod QuickCRM %}} + + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.10.28 + +_Released 28/10/2020_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.10.28.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.10.28.tar.gz[*Source code* (tar.gz)] + +=== icon:check[] Release Notes + +Important - This release removes the YUI3 JavaScript Library from the codebase due to security concerns for the discontinued project. +If you have code within your instance that still specifically requires or makes use of YUI3 you made need to update your code or include YUI3 manually, prior to updating to this release. + +==== icon:lock[] Security + +* _Important Security Issue_ +* _Important Security Issue_ +* _Important Security Issue_ +* _Moderate Security Issue_ +* _Moderate Security Issue_ +* _Moderate Security Issue_ +* _Moderate Security Issue_ +* _Moderate Security Issue_ + +Security issues information will be added shortly + +==== icon:star[] Enhancements + +* PR: https://github.com/salesagility/SuiteCRM/issues/8818[8818^] - Add 'Contains' as valid opp for multienum +* PR: https://github.com/salesagility/SuiteCRM/issues/8814[8814^] - Allow custom SugarFieldBase class +* Move TinyMCE Editor to composer + + +==== icon:bug[] Bug Fixes + +* Issue: https://github.com/salesagility/SuiteCRM/issues/7972[7972^] - IMAP import fails with Office 365 +* Issue: https://github.com/salesagility/SuiteCRM/issues/8688[8688^] - Fatal error on install with MySQL 8 +* Issue: https://github.com/salesagility/SuiteCRM/issues/6046[6046^] - DBMS reserved words fail in MySQL8 +* Issue: https://github.com/salesagility/SuiteCRM/issues/8830[8830^] - File names with underscores in download.php +* Issue: https://github.com/salesagility/SuiteCRM/issues/8610[8610^] - Uninitialised variables in ModuleInstaller.php +* Issue: https://github.com/salesagility/SuiteCRM/issues/4435[4435^] - TinyMCE pagebreaks work correctly +* Issue: https://github.com/salesagility/SuiteCRM/issues/8771[8771^] - Silent failure when no PHP-json module installed +* Issue: https://github.com/salesagility/SuiteCRM/issues/8905[8905^] - Report joins fail on one to one relationships +* Issue: https://github.com/salesagility/SuiteCRM/issues/8904[8904^] - Optimistic Locking is not compatible with all field types +* Issue: https://github.com/salesagility/SuiteCRM/issues/8904[8904^] - Optimistic locking module definition incorrectly set on some modules +* Issue: https://github.com/salesagility/SuiteCRM/issues/8903[8903^] - Campaign Bounce email import - better mine type recognition +* Issue: https://github.com/salesagility/SuiteCRM/issues/8882[8882^] - Delegates subpanel select all / select page doesn't work +* Issue: https://github.com/salesagility/SuiteCRM/issues/7306[7306^] - API v8 not working on php-fcgid - Missing /api/.htaccess +* Issue: https://github.com/salesagility/SuiteCRM/issues/8486[8486^] - Rewriting of '.htaccess' file +* Issue: https://github.com/salesagility/SuiteCRM/issues/8535[8535^] - Email To field being deleted on save +* Issue: https://github.com/salesagility/SuiteCRM/issues/8730[8730^] - duplicate Compose Email Modal from Activities subpanel +* Issue: https://github.com/salesagility/SuiteCRM/issues/8641[8641^] - Compose button / Related ID not set when no email +* Issue: https://github.com/salesagility/SuiteCRM/issues/8812[8812^] - Add to target list in Campaign results +* Issue: https://github.com/salesagility/SuiteCRM/issues/8824[8824^] - Too few arguments on SugarWebServiceImpl set_relationship +* Issue: https://github.com/salesagility/SuiteCRM/issues/8677[8677^] - Subpanel end navigation +* Issue: https://github.com/salesagility/SuiteCRM/issues/8888[8888^] - Fixes DynamicField reference +* Issue: https://github.com/salesagility/SuiteCRM/issues/8785[8785^] - Incorrect Syntax in install.php +* Issue: https://github.com/salesagility/SuiteCRM/issues/8795[8795^] - Change log level to warn loading non existing Bean +* Issue: https://github.com/salesagility/SuiteCRM/issues/8819[8819^] - Update OutboundEmail.php to handle deleted rows +* Issue: https://github.com/salesagility/SuiteCRM/issues/6427[6427^] - Stacked Bar chart totals incorrect +* Issue: https://github.com/salesagility/SuiteCRM/issues/8348[8348^] - V8 API CORS prevents DELETE HTTP call +* Issue: https://github.com/salesagility/SuiteCRM/issues/8816[8816^] - module name on logic_hook install +* Issue: https://github.com/salesagility/SuiteCRM/issues/3468[3468^] - Email template retrieving cached beans +* Issue: https://github.com/salesagility/SuiteCRM/issues/8841[8841^] - Change private to protected to fix EmailMan overrides +* Issue: https://github.com/salesagility/SuiteCRM/issues/8490[8490^] - Fix php Notices +* Issue - Calender fails to display event the last over 3 weeks +* Issue - Theme display issues - Header & Footer clean up, Action and List view view buttons + + +=== icon:heart[] Community + +_Special thanks to everyone who reporting the security issues addressed in this release! + +Luis Noriega wizlynx group, M. Cory Billington (@_th3y), Hao Wang, QuickCRM, pgorod & Apple Information Security + + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors tsitle matthewpoer tsummerer maaarghk pribeiro42 gouchaoer IBlasterus JanSiero dominicchinkh Abuelodelanada hannenule mayerelyashiv QuickCRM %}} + + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.10.27 + +_Released 10/06/2020_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.10.27.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.10.27.tar.gz[*Source code* (tar.gz)] +* https://suitecrm.com/files/162/SuiteCRM-7.11/507/SuiteCRM_Upgrade_Patch.zip[*Upgrade Patch* (zip)] + +=== icon:check[] Release Notes + +7.10.27 addresses an issue in 7.10.26 where the change log would fail to display, please refer to the 7.10.26 release note for the further details and changes + +''' + +== 7.10.26 + +_Released 09/06/2020_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.10.26.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.10.26.tar.gz[*Source code* (tar.gz)] +* https://suitecrm.com/files/162/SuiteCRM-7.11/507/SuiteCRM_Upgrade_Patch.zip[*Upgrade Patch* (zip)] + +=== icon:check[] Release Notes + +This release includes an additional patch that you can install if you are having issue upgrading. This allows you apply the enhancements and fixes we have brought in recent release to the upgrade wizard, prior to you upgrading to hopefully resolve many issue we have seen in the community. +To apply the patch download it from the https://suitecrm.com/files/162/SuiteCRM-7.11/507/SuiteCRM_Upgrade_Patch.zip[here] and install via module loader, not via the upgrade wizard. Then proceed to upgrade as normal. + + +==== icon:lock[] Security + +* _Moderate Security Issue_ +* _Moderate Security Issue_ +* _Moderate Security Issue_ +* _Moderate Security Issue_ +* _Moderate Security Issue_ + +Full disclosure of the security issues addressed in this release will be made at a later date + + +==== icon:star[] Enhancements + +* PR: https://github.com/salesagility/SuiteCRM/pull/7795[7795^] - PR: https://github.com/salesagility/SuiteCRM/pull/7806[7806] Custom Extend Core Modules +* PR: https://github.com/salesagility/SuiteCRM/pull/8405[8405^] - Remove deprecated sudo from .travis.yml +* PR: https://github.com/salesagility/SuiteCRM/pull/8506[8506^] - Increase driver timeouts to be a little more lenient +* PR: https://github.com/salesagility/SuiteCRM/pull/8523[8523^] - Update the index on the target list - targets middle table +* PR: https://github.com/salesagility/SuiteCRM/pull/8618[8618^] - Move OAuth2 Encryption Key into config.php +* PR: https://github.com/salesagility/SuiteCRM/pull/8639[8639^] - Display Data table under maps in any language +* PR: https://github.com/salesagility/SuiteCRM/pull/8638[8638^] - Check permissions only on required directories on upgrade system checks + + +==== icon:bug[] Bug Fixes + +* PR: https://github.com/salesagility/SuiteCRM/pull/6669[6669^] - Issue: https://github.com/salesagility/SuiteCRM/issues/5526[5526^] - Fix Inline edit date/datetime issue +* PR: https://github.com/salesagility/SuiteCRM/pull/7056[7056^] - Issue: https://github.com/salesagility/SuiteCRM/issues/3911[3911^] - LDAPAutheticate warnings in log +* PR: https://github.com/salesagility/SuiteCRM/pull/7863[7863^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7723[7723^] - Fix missing campaign analysis graphs +* PR: https://github.com/salesagility/SuiteCRM/pull/8208[8208^] - Issue: https://github.com/salesagility/SuiteCRM/issues/6676[6676^] - Add editview check to stop cacheing issues for dates on aow conditions +* PR: https://github.com/salesagility/SuiteCRM/pull/8257[8257^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8261[8261^] - Handling of temp files during Upgrades +* PR: https://github.com/salesagility/SuiteCRM/pull/8481[8481^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8450[8450^] - Minor bug in GridLayoutMetaDataParser::addField() +* PR: https://github.com/salesagility/SuiteCRM/pull/8483[8483^] - Fix function declaration of SugarFieldTime::save() +* PR: https://github.com/salesagility/SuiteCRM/pull/8504[8504^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8499[8499^] - API V8 issues for password grants SuiteCRM 7.10.22 +* PR: https://github.com/salesagility/SuiteCRM/pull/8511[8511^] - Issue: https://github.com/salesagility/SuiteCRM/issues/5012[5012^] - Remove maxLength from user name in DB config +* PR: https://github.com/salesagility/SuiteCRM/pull/8550[8550^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8549[8549^] - Added CSS to make case updates textfield re-sizeable +* PR: https://github.com/salesagility/SuiteCRM/pull/8559[8559^] - Fix issue for non based on Emails Campaigns +* PR: https://github.com/salesagility/SuiteCRM/pull/8594[8594^] - Fix db convert directly calling abstract function +* PR: https://github.com/salesagility/SuiteCRM/pull/8596[8596^] - Add missing business hours calculation to reports +* PR: https://github.com/salesagility/SuiteCRM/pull/8597[8597^] - Issue: https://github.com/salesagility/SuiteCRM/issues/5836[5836^] - Fix/5836 two factor authentication redirect +* PR: https://github.com/salesagility/SuiteCRM/pull/8598[8598^] - Fix usage of deprecated Redis::delete() function +* PR: https://github.com/salesagility/SuiteCRM/pull/8601[8601^] - Fix PHP notices Fix missing query offset in SugarBean::get_linked_beans() warnings +* PR: https://github.com/salesagility/SuiteCRM/pull/8607[8607^] - Fix missing query offset in SugarBean::get_linked_beans() +* PR: https://github.com/salesagility/SuiteCRM/pull/8629[8629^] - Fix string within sub query +* PR: https://github.com/salesagility/SuiteCRM/pull/8636[8636^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8489[8489^] - No validation when using header save button in AOS_Products +* PR: https://github.com/salesagility/SuiteCRM/pull/8638[8638^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8637[8637^] - Upgrade Wizard fatal error after upgrade on windows +* PR: https://github.com/salesagility/SuiteCRM/pull/8646[8646^] - Fix Report navigation display +* PR: https://github.com/salesagility/SuiteCRM/pull/8647[8647^] - Issue: https://github.com/salesagility/SuiteCRM/issues/5487[5487^] - Report groups repeat for each record +* PR: https://github.com/salesagility/SuiteCRM/pull/8648[8648^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7821[7821^] - Fix Username alignment in all screen widths +* PR: https://github.com/salesagility/SuiteCRM/pull/8651[8651^] - Fix warnings when running upgrade via cli +* PR: https://github.com/salesagility/SuiteCRM/pull/8652[8652^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8643[8643^] - Reports do not work related module custom fields +* PR: https://github.com/salesagility/SuiteCRM/pull/8654[8654^] - Fix naming from SugarCRM Reports to AOR_Reports +* PR: https://github.com/salesagility/SuiteCRM/pull/8655[8655^] - Reports: Remove useless recalculation +* PR: https://github.com/salesagility/SuiteCRM/pull/8659[8659^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7766[7766^] - Invalid depreciated log in SugarBean fixUpFormatting +* PR: https://github.com/salesagility/SuiteCRM/pull/8661[8661^] - Task Status key is displayed in View Summary +* PR: https://github.com/salesagility/SuiteCRM/pull/8755[8755^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7152[7152^] - Fix cases Update text not saving when using html field +* PR: https://github.com/salesagility/SuiteCRM/pull/8758[8758^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8757[8757^] - Time format preference typo + + +=== icon:heart[] Community + +_Special thanks to everyone who reporting the security issues addressed in this release! + +Đào Quốc Vương, Global Ip Action & Connor Shea + + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors gitbnw iDevIt007 QuickCRM lazka 604media marin-h ChangezKhan serfreeman1337 connorshea tsmgeek tsitle %}} + + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.10.25 + +_Released 25/03/2020_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.10.25.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.10.25.tar.gz[*Source code* (tar.gz)] + +=== icon:check[] Release Notes + +==== icon:lock[] Security + +* _Critical Security Vulnerability_ +* _Important Security Issue_ +* _Important Security Issue_ + +Full disclosure of the security issues addressed in this release will be made at a later date + + +==== icon:bug[] Bug Fixes + +* Issue: https://github.com/salesagility/SuiteCRM/issues/5836[5836^] - Two Factor Authentication redirect to User profile +* Issue: https://github.com/salesagility/SuiteCRM/issues/8582[8582^] - DBManager::convert calls abstract function +* Issue: https://github.com/salesagility/SuiteCRM/issues/6676[6676^] - Multiple datetime value condition issues in Workflow / Reports +* Issue: https://github.com/salesagility/SuiteCRM/issues/7011[7011^] - Intial User Login Duplicate Timezone Request / Blank screen +* Issue: https://github.com/salesagility/SuiteCRM/issues/8261[8261^] - Upgrade Issues - Handling of temp files during Upgrades +* Issue: https://github.com/salesagility/SuiteCRM/pull/8483[8483^] - Fix function declaration of SugarFieldTime::save() + +=== icon:heart[] Community + +_Special thanks to all who contributed to this release!_ + +Please https://suitecrm.com/upgrade-suitecrm[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.10.24 + +_Released 14/02/2020_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.10.24.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.10.24.tar.gz[*Source code* (tar.gz)] + +=== icon:check[] Release Notes + +==== icon:lock[] Security + +* https://cve.mitre.org/cgi-bin/cvename.cgi?name=2020-8803[CVE: 2020-8803^] - Local File Inclusion +* https://cve.mitre.org/cgi-bin/cvename.cgi?name=2020-8801[CVE: 2020-8801^] - PHP Object Injections +* https://cve.mitre.org/cgi-bin/cvename.cgi?name=2020-8800[CVE: 2020-8800^] - Second-Order PHP Object Injections +* https://cve.mitre.org/cgi-bin/cvename.cgi?name=2020-8802[CVE: 2020-8802^] - Bean Manipulation + + +==== icon:bug[] Bug Fixes + +* Issue: https://github.com/salesagility/SuiteCRM/issues/8541[8541^] - MySQL Database breaking on special characters +* Backward incompatible config changes + +=== icon:heart[] Community + +_Special thanks to http://karmainsecurity.com/[Egidio Romano^] for reporting the security issues addressed in this release!_ + +Please https://suitecrm.com/upgrade-suitecrm[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.10.23 + +_Released 10/02/2020_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.10.23.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.10.23.tar.gz[*Source code* (tar.gz)] + +[discrete] + +==== icon:clipboard[] Administrators Note 1/2 +You may notice when installing SuiteCRM a new panel which allows for the configuration of different collations and type-sets. This is part of our progression towards resolving issues with special characters and emojis. Currently available sets include utf8 and utf8mb4. + +==== icon:clipboard[] Administrators Note 2/2 +Within this release, we have also resolved a few known issues with the upgrade process; however, they will unfortunately not take effect until the next upgrade cycle. Therefore it is vital that if you encounter any problems while installing that you review and follow the recommended process within the SuiteDocs upgrade debugging page which can be found https://community.suitecrm.com/t/debugging-steps-for-use-in-upgrade-version-prior-to-7-11-11-and-7-10-23/71273[here] + +==== icon:wrench[] Potential breaking change with package container-interop +If you maintain a CRM utilising container-interop for API extension, you should note that this release may require some small changes to routing as seen below: + +Instead of `Interop` +``` +use Interop\Container\ContainerInterface; +``` +Make use of `Psr` +``` +use Psr\Container\ContainerInterface; +``` +[discrete] + +=== icon:check[] Release Notes + +==== icon:lock[] Security + +* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-8787[CVE-2020-8787^] - Bean ID validation strictness +* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-8783[CVE-2020-8783^] - Neutralization of potential vulnerability with use of Special Elements within SQL +* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-8784[CVE-2020-8784^] - Neutralization of potential vulnerability with use of Special Elements within SQL +* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-8785[CVE-2020-8785^] - Neutralization of potential vulnerability with use of Special Elements within SQL +* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-8786[CVE-2020-8786^] - Neutralization of potential vulnerability with use of Special Elements within SQL + +[discrete] + +==== icon:star[] Enhancements + +* PR: https://github.com/salesagility/SuiteCRM/pull/8100[8100^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8099[8099^] - Add a way to hide/show columnChooser in ListViews +* PR: https://github.com/salesagility/SuiteCRM/pull/7879[7879^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7876[7876^] - Render phone fields as links +* PR: https://github.com/salesagility/SuiteCRM/pull/8215[8215^] - Scroll QRFont colour is the same as the search bar bgR to see the 'sync with vardefs' part +* PR: https://github.com/salesagility/SuiteCRM/pull/8164[8164^] - More inclusive language +* PR: https://github.com/salesagility/SuiteCRM/pull/8160[8160^] - Updated CONTRIBUTING.md +* PR: https://github.com/salesagility/SuiteCRM/pull/7798[7798^] - Database character set configuration + +[discrete] + +==== icon:bug[] Bug Fixes + +* PR: https://github.com/salesagility/SuiteCRM/pull/8422[8422^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8421[8421^] - Fix issue with validation on aos settings +* PR: https://github.com/salesagility/SuiteCRM/pull/8395[8395^] - Issue: https://github.com/salesagility/SuiteCRM/issues/6000[6000^] - Notifications not working when using mssql +* PR: https://github.com/salesagility/SuiteCRM/pull/8353[8353^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8351[8351^] - Datepicker missing in massupdate for custom datetime field type +* PR: https://github.com/salesagility/SuiteCRM/pull/8298[8298^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8295[8295^] - Fix sorting icons showing counterwise +* PR: https://github.com/salesagility/SuiteCRM/pull/8285[8285^] - Issue: https://github.com/salesagility/SuiteCRM/issues/6990[6990^] - Run Email Notification not working +* PR: https://github.com/salesagility/SuiteCRM/pull/8274[8274^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8273[8273^] - Check the selected e-mail client +* PR: https://github.com/salesagility/SuiteCRM/pull/8233[8233^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8057[8057^] - Backport various PHP 7.4 fixes +* PR: https://github.com/salesagility/SuiteCRM/pull/8205[8205^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8180[8180^] - Font colour is the same as the search bar bg +* PR: https://github.com/salesagility/SuiteCRM/pull/8053[8053^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7874[7874^] - Unable to use custom _head.tpl file (alternative fix) +* PR: https://github.com/salesagility/SuiteCRM/pull/8139[8139^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8134[8134^] - Logo not in left-hand corner anymore +* PR: https://github.com/salesagility/SuiteCRM/pull/8158[8158^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8151[8151^] - Updating FPEvent unit test to use correct array +* PR: https://github.com/salesagility/SuiteCRM/pull/8181[8181^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7305[7305^] - Scheduled reports execute in the timezone specified +* PR: https://github.com/salesagility/SuiteCRM/pull/8188[8188^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8183[8183^] - Non-group records show on list view if group only access +* PR: https://github.com/salesagility/SuiteCRM/pull/8190[8190^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8173[8173^] - Workflow actions missing in edit and detail view +* PR: https://github.com/salesagility/SuiteCRM/pull/8424[8424^] - Remove 'buggy version check' from php version checker +* PR: https://github.com/salesagility/SuiteCRM/pull/8363[8363^] - Adding fix to silent upgrade's upgrade history save +* PR: https://github.com/salesagility/SuiteCRM/pull/8346[8346^] - Update links +* PR: https://github.com/salesagility/SuiteCRM/pull/8344[8344^] - Email1 field now gets populated through API +* PR: https://github.com/salesagility/SuiteCRM/pull/8340[8340^] - API returns the emailAddress Relationship link +* PR: https://github.com/salesagility/SuiteCRM/pull/8322[8322^] - Remove Schedulers cron instructions from filter pop-up +* PR: https://github.com/salesagility/SuiteCRM/pull/8258[8258^] - Fix "!" in pQuery and add tests +* PR: https://github.com/salesagility/SuiteCRM/pull/8243[8243^] - Clear PHP notice on Home page and improve suitecrm.log message +* PR: https://github.com/salesagility/SuiteCRM/pull/8198[8198^] - Unit test fixes for 7.10.x +* PR: https://github.com/salesagility/SuiteCRM/pull/7832[7832^] - V8 API swagger.json +* PR: https://github.com/salesagility/SuiteCRM/pull/6709[6709^] - Avoid printing js content in CLI commands +* PR: https://github.com/salesagility/SuiteCRM/pull/8458[8458^] - Fix install layout db options +* PR: https://github.com/salesagility/SuiteCRM/pull/8468[8468^] - Fix slim api +* PR: https://github.com/salesagility/SuiteCRM/pull/8193[8193^] - Fixed employees module not appearing in ACL role list +* PR: https://github.com/salesagility/SuiteCRM/pull/8326[8326^] - Logo upload +[discrete] + +==== icon:code-branch[] Development + +* PR: https://github.com/salesagility/SuiteCRM/pull/8231[8231^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7891[7891^] - Clean up include/ tests +* PR: https://github.com/salesagility/SuiteCRM/pull/8218[8218^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7744[7744^] - Remove deprecated functions from utils.php +* PR: https://github.com/salesagility/SuiteCRM/pull/8217[8217^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7744[7744^] - Remove the deprecated load_menu() function in utils.php +* PR: https://github.com/salesagility/SuiteCRM/pull/7807[7807^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7740[7740^] - Replacing the StateChecker with database truncation in tests +* PR: https://github.com/salesagility/SuiteCRM/pull/8379[8379^] - Deprecate _pp functions +* PR: https://github.com/salesagility/SuiteCRM/pull/8378[8378^] - Misc code formatting improvements +* PR: https://github.com/salesagility/SuiteCRM/pull/8350[8350^] - Add tests for splitTime() on TimeDate +* PR: https://github.com/salesagility/SuiteCRM/pull/8314[8314^] - Fix parameter order for asserts in unit tests +* PR: https://github.com/salesagility/SuiteCRM/pull/8300[8300^] - Add tests for TimeDate class +* PR: https://github.com/salesagility/SuiteCRM/pull/8313[8313^] - Add more TimeDate tests +* PR: https://github.com/salesagility/SuiteCRM/pull/8299[8299^] - Add tests and PHPDocs for return_bytes function +* PR: https://github.com/salesagility/SuiteCRM/pull/8296[8296^] - A few more little fixes for the formatting in the test suite. +* PR: https://github.com/salesagility/SuiteCRM/pull/8283[8283^] - Unit test cleanup +* PR: https://github.com/salesagility/SuiteCRM/pull/8253[8253^] - Remove some old code referencing PHP 5.3 +* PR: https://github.com/salesagility/SuiteCRM/pull/8252[8252^] - Deprecate various utils functions that are unused +* PR: https://github.com/salesagility/SuiteCRM/pull/8249[8249^] - Add unit tests for is_admin() function +* PR: https://github.com/salesagility/SuiteCRM/pull/8236[8236^] - Update the Travis Code Coverage job +* PR: https://github.com/salesagility/SuiteCRM/pull/8235[8235^] - Clean up misc unit tests +* PR: https://github.com/salesagility/SuiteCRM/pull/8234[8234^] - Add tests for check_php_version +* PR: https://github.com/salesagility/SuiteCRM/pull/8216[8216^] - Add a PHPDoc comment and test to unencodeMultienum() +* PR: https://github.com/salesagility/SuiteCRM/pull/8156[8156^] - tests: throw an error in case exit() is called during testing +* PR: https://github.com/salesagility/SuiteCRM/pull/8477[8477^] - Fix/Avoid WebDriver Timeouts in Travis createModule Tests +* PR: https://github.com/salesagility/SuiteCRM/pull/8509[8509^] - Fixing typo in seperator/separator change +* PR: https://github.com/salesagility/SuiteCRM/pull/8518[8518^] - Fix backwards compatibility with seperator/separator css +* PR: https://github.com/salesagility/SuiteCRM/pull/7580[7580^] - Update export_excel_compatible to work with all Excel versions +* PR: https://github.com/salesagility/SuiteCRM/pull/8297[8297^] - Add PHPDoc and deprecate unTranslateNum +* PR: https://github.com/salesagility/SuiteCRM/pull/8310[8310^] - Backport more PHP 7.4 fixes +* PR: https://github.com/salesagility/SuiteCRM/pull/8152[8152^] - Update html-purifier to 4.12 +* PR: https://github.com/salesagility/SuiteCRM/pull/8161[8161^] - Fix a PHP warning in Meeting.php +[discrete] + +=== icon:heart[] Community + +_Special thanks to http://karmainsecurity.com/[Egidio Romano^] for reporting the security issues addressed in this release!_ + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors re8260 connorshea marin-h ebogaard lazka crgrieve Abuelodelanada dominicchinkh kichloo %}} + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' == 7.10.22 _Released 11/11/2019_ -=== pass:[] Assets +=== icon:box-open[] Assets * https://github.com/salesagility/SuiteCRM/archive/v7.10.22.zip[*Source code* (zip)] * https://github.com/salesagility/SuiteCRM/archive/v7.10.22.tar.gz[*Source code* (tar.gz)] -=== pass:[] Release Notes +=== icon:check[] Release Notes -==== pass:[] Security +==== icon:lock[] Security * CVE: Unassigned - SQL Injection -==== pass:[] Bug Fixes +==== icon:bug[] Bug Fixes * PR: https://github.com/salesagility/SuiteCRM/pull/8185[8185^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7946[7946^] - Removed unnecessary JSSource files * PR: https://github.com/salesagility/SuiteCRM/pull/8187[8187^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8183[8183^] - non-group records show on list view if group only access @@ -43,21 +792,21 @@ To report any security issues please follow our Security Process and send them d _Released 04/11/2019_ -=== pass:[] Assets +=== icon:box-open[] Assets * https://github.com/salesagility/SuiteCRM/archive/v7.10.21.zip[*Source code* (zip)] * https://github.com/salesagility/SuiteCRM/archive/v7.10.21.tar.gz[*Source code* (tar.gz)] -=== pass:[] Release Notes +=== icon:check[] Release Notes -==== pass:[] Security +==== icon:lock[] Security * CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-18782[CVE-2019-18782^] - .htaccess Improvements * CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-18785[CVE-2019-18785^] - API Access Token and Credential fix -* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-18784[CVE-2019-18784^] - SQL Injections +* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-18784[CVE-2019-18784^] - Neutralization of potential vulnerability with use of Special Elements within SQL [discrete] -==== pass:[] Enhancements +==== icon:star[] Enhancements * PR: https://github.com/salesagility/SuiteCRM/pull/7198[7198^] - Add Robo API commands * PR: https://github.com/salesagility/SuiteCRM/pull/5464[5464^] - Filter email templates on Events @@ -71,7 +820,7 @@ _Released 04/11/2019_ [discrete] -==== pass:[] Bug Fixes +==== icon:bug[] Bug Fixes * PR: https://github.com/salesagility/SuiteCRM/pull/8154[8154^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8153[8153^] - SQL query in the ACLAction code * PR: https://github.com/salesagility/SuiteCRM/pull/8151[8151^] - Resolve issue with email templates @@ -198,7 +947,7 @@ _Released 04/11/2019_ [discrete] -==== pass:[] Development +==== icon:code-branch[] Development * PR: https://github.com/salesagility/SuiteCRM/pull/8000[8000^] - More PHP 7.4 array accessor deprecations * PR: https://github.com/salesagility/SuiteCRM/pull/6750[6750^] - Issue: https://github.com/salesagility/SuiteCRM/issues/4754[4754^] - Remove PHP4 style constructors @@ -207,27 +956,11 @@ _Released 04/11/2019_ [discrete] -=== pass:[] Community +=== icon:heart[] Community _Special thanks to the following members for their contributions and participation in this release!_ -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] - +{{% ghcontributors connorshea 604media tsummerer re8260 lazka Abuelodelanada dominicchinkh JanSiero QuickCRM HVStechnik lex111 Kishlin ognjen-petrovic ApatheticCosmos akshitsarin grahambrown11 00MB IvanArjona ozdemirburak mirajkovic steffinstanly %}} Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. @@ -240,21 +973,21 @@ To report any security issues please follow our Security Process and send them d _Released 23/08/2019_ -=== pass:[] Assets +=== icon:box-open[] Assets * https://github.com/salesagility/SuiteCRM/archive/v7.10.20.zip[*Source code* (zip)] * https://github.com/salesagility/SuiteCRM/archive/v7.10.20.tar.gz[*Source code* (tar.gz)] -=== pass:[] Release Notes +=== icon:check[] Release Notes -==== pass:[] Security +==== icon:lock[] Security * CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-14752[CVE-2019-14752^] - Reflected XSS * CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-18783[CVE-2019-18783^] - Unintended public exposure of files * CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-14454[CVE-2019-14454^] - Employee module does not implement ACL [discrete] -==== pass:[] Enhancements +==== icon:star[] Enhancements * PR: https://github.com/salesagility/SuiteCRM/pull/7702[7702 ] - Issue: https://github.com/salesagility/SuiteCRM/issues/7696[7696 ] - Update README * PR: https://github.com/salesagility/SuiteCRM/pull/7698[7698 ] - Issue: https://github.com/salesagility/SuiteCRM/issues/7581[7581 ] - SuiteBot config.yml @@ -281,7 +1014,7 @@ Plugin files are still usable in the same way as before – at `./include/Smarty [discrete] -==== pass:[] Bug Fixes +==== icon:bug[] Bug Fixes * PR: https://github.com/salesagility/SuiteCRM/pull/7719[7719 ] - Fix/backwards compatibility * PR: https://github.com/salesagility/SuiteCRM/pull/7718[7718 ] - Issue: https://github.com/salesagility/SuiteCRM/issues/6982[6982 ] - New user password not being generated @@ -296,15 +1029,11 @@ Plugin files are still usable in the same way as before – at `./include/Smarty * PR: https://github.com/salesagility/SuiteCRM/pull/7610[7610 ] - Fixed error message css + email warning config option [discrete] -=== pass:[] Community +=== icon:heart[] Community _Special thanks to the following members for their contributions and participation in this release!_ -pass:[] - -pass:[] - -pass:[] +{{% ghcontributors JanSiero 604media connorshea %}} ''' @@ -318,27 +1047,27 @@ To report any security issues please follow our Security Process and send them d _Released 31st July 2019_ -=== pass:[] Assets +=== icon:box-open[] Assets * https://github.com/salesagility/SuiteCRM/archive/v7.10.19.zip[*Source code* (zip)] * https://github.com/salesagility/SuiteCRM/archive/v7.10.19.tar.gz[*Source code* (tar.gz)] -=== pass:[] Release Notes +=== icon:check[] Release Notes -==== pass:[] Security +==== icon:lock[] Security [discrete] * https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-13335[#CVE-2019-13335 ] - *Security Issue* - Fixed SSRF * *Security Issue* - Fixed privilege escalation -==== pass:[] Enhancements +==== icon:star[] Enhancements * https://github.com/salesagility/SuiteCRM/pull/7374[#7374 ] Robo test-running commands * https://github.com/salesagility/SuiteCRM/pull/7474[#7474 ] SecuritySuite 3.1.16 * https://github.com/salesagility/SuiteCRM/pull/7503[#7503 ] Scheduled Reports: Enable security groups support and add the subpanel -==== pass:[] Bug Fixes +==== icon:bug[] Bug Fixes * https://github.com/salesagility/SuiteCRM/issues/3756[#3756 ] Fixed #3756 - Calendar pop-ups now auto close after 500ms * https://github.com/salesagility/SuiteCRM/pull/6850[#6850 ] SAML2: Use php-saml from composer @@ -368,7 +1097,7 @@ _Released 31st July 2019_ * https://github.com/salesagility/SuiteCRM/pull/7536[#7536 ] Cleanup files created by acceptance tests between test runs * https://github.com/salesagility/SuiteCRM/issues/7304[#7304 ] Fixed #7304 - ListView: Fix selection count for the "Select All" case * https://github.com/salesagility/SuiteCRM/pull/7541[#7541 ] ListView: Fix the selection count when executing an action without any selection -* https://github.com/salesagility/SuiteCRM/pull/7542[#7542 ] ListView: Fix selection when switch from "select all" to "select page" +* https://github.com/salesagility/SuiteCRM/pull/7542[#7542 ] ListView: Fix selection when switch from "select all" to "select page" * https://github.com/salesagility/SuiteCRM/pull/7550[#7550 ] SugarWidgetSubPanelEmailLink: Fix missing opt-in ticks after inline editing * https://github.com/salesagility/SuiteCRM/pull/7553[#7553 ] sugar_3.js: Remove unused send_form_for_emails() * https://github.com/salesagility/SuiteCRM/issues/7554[#7554 ] Fixed email attachment icon @@ -391,33 +1120,15 @@ _Released 31st July 2019_ * https://github.com/salesagility/SuiteCRM/pull/7607[#7607 ] Remove lastView variables from tests * https://github.com/salesagility/SuiteCRM/issues/7599[#7599 ] Fixed #7599 - Unwanted email generated in case creation & update * https://github.com/salesagility/SuiteCRM/issues/7608[#7608 ] Fixed #7608 - A non-numeric value encountered at ListViewSubPanel.php -* https://github.com/salesagility/SuiteCRM/pull/7624[#7624 ] Fixed email settings "data error" +* https://github.com/salesagility/SuiteCRM/pull/7624[#7624 ] Fixed email settings "data error" * https://github.com/salesagility/SuiteCRM/issues/6996[#6996 ] Escaped strings issue, breaks "My favorites" filters and perhaps other things * https://github.com/salesagility/SuiteCRM/pull/7639[#7639 ] Fixed DB failure with activities subpanel -=== pass:[] Community +=== icon:heart[] Community _Special thanks to all members for their contributions and participation in this release!_ -pass:[] - -pass:[] - -pass:[] - -pass:[] - -pass:[] - -pass:[] - -pass:[] - -pass:[] - -pass:[] - -pass:[] +{{% ghcontributors connorshea lazka 604media marin-h gody01 Abuelodelanada eggsurplus sanchezfauste adriangibanelbtactic ebogaard %}} ''' @@ -892,15 +1603,9 @@ Please https://suitecrm.com/download[visit the official website] to find the app [[anchor-7.10.11-community]] -_Special thanks to the following members for their contributions!_ +_Special thanks to LEAP-nishit and the following members for their contributions!_ -* https://github.com/gunnicom[gunnicom] -* https://github.com/LEAP-nishit[LEAP-nishit] -* https://github.com/lazka[lazka] -* https://github.com/rediansoftware[rediansoftware] -* https://github.com/QuickCRM[QuickCRM] -* https://github.com/AussieGuy0[AussieGuy0] -* https://github.com/apoonawa[apoonawa] +{{% ghcontributors gunnicom lazka rediansoftware QuickCRM AussieGuy0 apoonawa %}} That's a total of **12 community merges** across the releases! Well done everyone! @@ -1774,3 +2479,5 @@ code* (tar.gz)] *This is a Beta release and should not be used in a production environment.* ''' + + diff --git a/content/admin/releases/7.11.x/_index.en.adoc b/content/admin/releases/7.11.x/_index.en.adoc old mode 100644 new mode 100755 index 34df2500d..29a1521dc --- a/content/admin/releases/7.11.x/_index.en.adoc +++ b/content/admin/releases/7.11.x/_index.en.adoc @@ -6,25 +6,765 @@ weight: 9880 :toc: :toc-title: :toclevels: 1 +:icons: font -:experimental: +== 7.11.23 + +_Released 19/11/2021_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.11.23.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.11.23.tar.gz[*Source code* (tar.gz)] + +==== icon:lock[] Security + +* CVE: Pending - Fixed file check bypass +* CVE: Pending - Local File Inclusion + +[discrete] + +==== icon:bug[] Bug Fixes + +* Fix https://github.com/salesagility/SuiteCRM/issues/8432[8432] - Remove index limit from mssql index names upon create and repair. +* PR: https://github.com/salesagility/SuiteCRM/pull/8957[8957] - Fix typo in word administrator +* PR: https://github.com/salesagility/SuiteCRM/pull/9368[9368] - Fix https://github.com/salesagility/SuiteCRM/issues/9217[9217] - Revert "Fix Users index incompatible with MSSQL". +* PR: https://github.com/salesagility/SuiteCRM/pull/9360[9360] - Fix https://github.com/salesagility/SuiteCRM/issues/9358[9358] - Meeting invite notification emails are not sending to all invitees. +* PR: https://github.com/salesagility/SuiteCRM/pull/9361[9361] - Fix https://github.com/salesagility/SuiteCRM/issues/9192[9192]: Fix duplication of folders_rel table entries. +* PR: https://github.com/salesagility/SuiteCRM/pull/9246[9246] - Fix https://github.com/salesagility/SuiteCRM/issues/6994[6994]: Update pollMonitoredInboxesAOP to double check that SugarFolder has been retrieved correctly. +* PR: https://github.com/salesagility/SuiteCRM/pull/9367[9367] - Update PDF template warning + +=== icon:heart[] Community + +_Special thanks to everyone who reporting the security issues addressed in this release!_ + +Victor Garcia + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors SinergiaCRM timo-ecm2 prbt2016 InfoLibre afnieves BKPepe gerdb42 %}} + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.11.22 + +_Released 24/09/2021_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.11.22.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.11.22.tar.gz[*Source code* (tar.gz)] + +==== icon:lock[] Security + +* CVE: Pending - Privilege Escalation vulnerability +* CVE: Pending - Local File Inclusion + +[discrete] + +==== icon:bug[] Bug Fixes + +* PR: https://github.com/salesagility/SuiteCRM/pull/9277[9277] - Issue - https://github.com/salesagility/SuiteCRM/issues/9269[9269] - Fix #9269 - edit view jumps to tab with validation error upon save,if hidden +* PR: https://github.com/salesagility/SuiteCRM/pull/9259[9259] - Issue: https://github.com/salesagility/SuiteCRM/issues/9269[9269] - Fix #9257 Adjusting references and tests to reflect updated GoogleAPIalias +* PR: https://github.com/salesagility/SuiteCRM/pull/9262[9262] - Fix #9262 - Add the Overview label to Security Groups detailview +* PR: https://github.com/salesagility/SuiteCRM/pull/9286[9286] - Fix #9286 - EmailsComposeView.js Formatting +* PR: https://github.com/salesagility/SuiteCRM/pull/9293[9293] - Fix #9293 - Error on audit save +* PR: https://github.com/salesagility/SuiteCRM/pull/9297[9297] - Fix #9297 - V8 API Auth issues on windows + +=== icon:heart[] Community + +_Special thanks to everyone who reporting the security issues addressed in this release!_ + +Konstantin Damotsev + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors schapsl tsmgeek %}} + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.11.21 + +_Released 20/08/2021_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.11.21.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.11.21.tar.gz[*Source code* (tar.gz)] + +==== icon:lock[] Security + +* https://cwe.mitre.org/data/definitions/1236.html[CWE-1236]: Improper Neutralization of Formula Elements in a CSV File +* https://cwe.mitre.org/data/definitions/284.html[CWE-284]: : Improper Access Control + +[discrete] + +==== icon:bug[] Bug Fixes + +* PR: https://github.com/salesagility/SuiteCRM/pull/8716[8716^] - Correct Layout of date fields +* PR: https://github.com/salesagility/SuiteCRM/pull/8921[8921^] - Link Fix - Upgrade Documentation +* PR: https://github.com/salesagility/SuiteCRM/pull/8922[8922^] - Notes for translators on abbreviations +* PR: https://github.com/salesagility/SuiteCRM/pull/8923[8923^] - Indentation Fix +* PR: https://github.com/salesagility/SuiteCRM/pull/8925[8925^] - Space Typo Fix +* PR: https://github.com/salesagility/SuiteCRM/pull/8929[8929^] - Moving comment next to the string +* PR: https://github.com/salesagility/SuiteCRM/pull/8930[8930^] - https url fix +* PR: https://github.com/salesagility/SuiteCRM/pull/8931[8931^] - SuiteP template translators notes +* PR: https://github.com/salesagility/SuiteCRM/pull/9180[9180^] - Issue: https://github.com/salesagility/SuiteCRM/issues/9179[9179^] - Fix for: #9179 AOR_Charts getShortenedLabel fails on utf8 characters +* PR: https://github.com/salesagility/SuiteCRM/pull/9072[9072^] - Make Projects Importable +* PR: https://github.com/salesagility/SuiteCRM/pull/9102[9102^] - Issue: https://github.com/salesagility/SuiteCRM/issues/4145[4145^] - Fix for: Email Address - "invalid" and "opt_out" options are lost +* PR: https://github.com/salesagility/SuiteCRM/pull/9206[9206^] - Issue: https://github.com/salesagility/SuiteCRM/issues/9205[9205^] - Fix #9205 - Duplicate audit records +* PR: https://github.com/salesagility/SuiteCRM/pull/8534[8534^] - Fix Archive Folder Query +* PR: https://github.com/salesagility/SuiteCRM/pull/8587[8587^] - Add cases to email object_arr +* PR: https://github.com/salesagility/SuiteCRM/pull/8685[8685^] - Only init Currency when saving +* PR: https://github.com/salesagility/SuiteCRM/pull/8732[8732^] - AOR_Reports generating php notices due to undef +* PR: https://github.com/salesagility/SuiteCRM/pull/9044[9044^] - Change pdfheader/pdffooter data type to longtext +* PR: https://github.com/salesagility/SuiteCRM/pull/9084[9084^] - Set default perms on new log file +* PR: https://github.com/salesagility/SuiteCRM/pull/9195[9195^] - Update CaseUpdatesHook.php +* PR: https://github.com/salesagility/SuiteCRM/pull/8485[8485^] - Fix function declaration of TabController::get_key_array() +* PR: https://github.com/salesagility/SuiteCRM/pull/9008[9008^] - Wrong spelling of ProspectLists module +* PR: https://github.com/salesagility/SuiteCRM/pull/9202[9202^] - Issue: https://github.com/salesagility/SuiteCRM/issues/9201[9201^] - Filter form label styling +* PR: https://github.com/salesagility/SuiteCRM/pull/9238[9238^] - Issue: https://github.com/salesagility/SuiteCRM/issues/9237[9237^] - Fix #9237 where dates in aow actions & conditions are not saved or displayed correctly +* PR: https://github.com/salesagility/SuiteCRM/pull/9223[9223^] - Issue: https://github.com/salesagility/SuiteCRM/issues/6997[6997^] - User profile password auto-fill +* PR: https://github.com/salesagility/SuiteCRM/pull/9182[9182^] - Allow filtering Survey campaigns +* PR: https://github.com/salesagility/SuiteCRM/pull/8992[8992^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8991[8991^] - Small bit of duplicate code +* PR: https://github.com/salesagility/SuiteCRM/pull/9007[9007^] - Wrong spelling of AOR_Reports module +* PR: https://github.com/salesagility/SuiteCRM/pull/9069[9069^] - Inline Edit: Help text containing quotes is not correctly displayed +* PR: https://github.com/salesagility/SuiteCRM/pull/8613[8613^] - Improve Contacts Duplicate List +* PR: https://github.com/salesagility/SuiteCRM/pull/8898[8898^] - Retrieve SuiteCRM version in get_server_info + +=== icon:heart[] Community + +_Special thanks to everyone who reporting the security issues addressed in this release!_ + +Hagai Wechsler + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors horus68 gody01 QuickCRM tsmgeek tsitle amariussi adamjakab robinson-j16 %}} + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.11.20 + +_Released 02/06/2021_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.11.20.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.11.20.tar.gz[*Source code* (tar.gz)] + +==== icon:lock[] Security + +* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=2018-19296[CVE-2018-19296^] - Object Injection in PHPMailer + +[discrete] + +==== icon:bug[] Bug Fixes + +* PR: https://github.com/salesagility/SuiteCRM/pull/8731[8731^] Issue: https://github.com/salesagility/SuiteCRM/issues/7285[7285^] - Database failure when filter custom fields by V8 API +* PR: https://github.com/salesagility/SuiteCRM/pull/9149[9149^] Issue: https://github.com/salesagility/SuiteCRM/issues/8319[8319^] - Multiple IMAP Inboxes +* Issue: https://github.com/salesagility/SuiteCRM/issues/9106[9106^] - JSON Error in related field's popup +* Issue: https://github.com/salesagility/SuiteCRM/issues/9166[9166^] - Fix Missing locale in FullCalender 3.10 +* Fix Users index incompatible with MSSQL +* Fix Php compatibility within Admin ConfigureTabs +* Fix Email Address loading performance +* Fix theme - dashletclose.png loading error in console +* Fix theme - Footer text colour inconsistency +* Fix theme - Menu overflow top module alignment +* Fix theme - Admin settings empty error displays line +* Change populateDefaultValues fatal log on empty field_defs to warning + +=== icon:heart[] Community + +_Special thanks to everyone who reporting the security issues addressed in this release!_ + +Daniel Sundbeck + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors cekowu nelem holdusback YonatanRosemarin %}} + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.11.19 + +_Released 28/04/2021_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.11.19.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.11.19.tar.gz[*Source code* (tar.gz)] + +==== icon:lock[] Security + +* CVE: Pending - XSS Vulnerability +* CVE: Pending - XSS Vulnerability +* CVE: Pending - XSS Vulnerability +* CVE: Pending - XSS Vulnerability +* CVE: Pending - XSS Vulnerability +* CVE: Pending - Fixed Dependency +* CVE: Pending - Fixed stored XSS vulnerability +* CVE: Pending - Fixed stored XSS vulnerability +* CVE: Pending - Fixed file check bypass +* CVE: Pending - Improved file upload checks + +[discrete] + +==== icon:bug[] Bug Fixes + +* PR: https://github.com/salesagility/SuiteCRM/pull/8642[8642^] - Issue: https://github.com/salesagility/SuiteCRM/issues/5107[5107^] - Fix Inline edit date/datetime issue +* PR: https://github.com/salesagility/SuiteCRM/pull/7999[7999^] - Prevent securitygroups mass assign damage +* PR: https://github.com/salesagility/SuiteCRM/pull/8571[8571^] - Remove duplicate code in users detailviewdefs +* PR: https://github.com/salesagility/SuiteCRM/pull/8514[8514^] - Implement effective opcache file clearing +* PR: https://github.com/salesagility/SuiteCRM/pull/8700[8700^] - Various problems in PHPDocs throughout the codebase. +* PR: https://github.com/salesagility/SuiteCRM/pull/9068[9068^] - Issue: https://github.com/salesagility/SuiteCRM/issues/9067[9067^] - Fix the drop down width +* PR: https://github.com/salesagility/SuiteCRM/pull/9093[9093^] - Add Additional api filter option `like` +* PR: https://github.com/salesagility/SuiteCRM/pull/9090[9090^] - User menu alignment +* PR: https://github.com/salesagility/SuiteCRM/pull/8570[8570^] - Issue: https://github.com/salesagility/SuiteCRM/issues/6051[6051] - Modulebuilder labels edit fixes +* PR: https://github.com/salesagility/SuiteCRM/pull/9088[9088^] - Update JQuery JS Library to v3.6.0 +* PR: https://github.com/salesagility/SuiteCRM/pull/9000[9000^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8999[8999^] - Hardcoded 'by' label in calls +* PR: https://github.com/salesagility/SuiteCRM/pull/9035[9035^] - Issue: https://github.com/salesagility/SuiteCRM/issues/9034[9034^] - Business Hours does not work in non-english languages +* PR: https://github.com/salesagility/SuiteCRM/pull/8910[8910^] - Update the V8 Api to allow for upload of documents similar to notes +* PR: https://github.com/salesagility/SuiteCRM/pull/9010[9010^] - Add missing 'view task' label on calendar +* PR: https://github.com/salesagility/SuiteCRM/pull/9003[9003^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8894[8894^] - Add missing label for calendar dashlet +* PR: https://github.com/salesagility/SuiteCRM/pull/9032[9032^] - Prevent Notice Error During Import +* PR: https://github.com/salesagility/SuiteCRM/pull/8206[8206^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8182[8182^] - Update updateTimeDateFields to handle undefined dates +* PR: https://github.com/salesagility/SuiteCRM/pull/9076[9076^] - Issue: https://github.com/salesagility/SuiteCRM/issues/9075[9075^] - Removing deleted related beans via link +* PR: https://github.com/salesagility/SuiteCRM/pull/8988[8988^] - Improve upon solution which doesn't cache incomplete beans +* PR: https://github.com/salesagility/SuiteCRM/pull/7884[7884^] - Issue: https://github.com/salesagility/SuiteCRM/issues/6800[6800^] - Elasticsearch: Elastic index name is hardcoded +* PR: https://github.com/salesagility/SuiteCRM/pull/9060[9060^] - Project Form action should not be changed if delete is not confirmed +* PR: https://github.com/salesagility/SuiteCRM/pull/9059[9059^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8676[8676^] - New Scheduled Reports does not run +* PR: https://github.com/salesagility/SuiteCRM/pull/9079[9079^] - Issue: https://github.com/salesagility/SuiteCRM/issues/2645[2645^] - Calendar quick create ignores required fields +* PR: https://github.com/salesagility/SuiteCRM/pull/9054[9054^] - Add missing scheduler label for trimSugarFeeds +* PR: https://github.com/salesagility/SuiteCRM/pull/9070[9070^] - Fix php compatibility issues +* PR: https://github.com/salesagility/SuiteCRM/pull/8974[8974^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8956[8956^] - Email compose body not shown in detail view +* PR: https://github.com/salesagility/SuiteCRM/pull/9096[9096^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7772[7772^] - Only index ElasticSearch when enabled +* PR: https://github.com/salesagility/SuiteCRM/pull/9101[9101^] - Fix LangText exception breaking ElasticSearch +* PR: https://github.com/salesagility/SuiteCRM/pull/8513[8513^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8472[8472^] - No or not complete Searchresults using elasticsearch engine +* PR: https://github.com/salesagility/SuiteCRM/pull/8981[8981^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8916[8916^] - Misspelled elasticsearch labels +* PR: https://github.com/salesagility/SuiteCRM/pull/9080[9080^] - Update config for google/apiclient at composer.json + +=== icon:heart[] Community + +_Special thanks to everyone who reporting the security issues addressed in this release! + +Cory Billington, Thanhlocpanda of https://vincss.net[VinCSS^] (Member of Vingroup), Hao Wang, Sam Sanoop, Chris Forbes, James Addison + + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors RustyDust topesantos gunnicom pgorod JanSiero duncanf95 jperez-murcia QuickCRM mayerelyashiv lehnerr tsitle dawid-zaroda tsummerer sweettbug3 mubat eliaski staganyi tsmgeek ebogaard %}} + + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.11.18 + +_Released 05/11/2020_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.11.18.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.11.18.tar.gz[*Source code* (tar.gz)] +* https://suitecrm.com/files/162/SuiteCRM-7.11/530/SuiteCRM_Upgrade_Patch_1.0.1.zip[*Upgrade Patch* (zip)] + +=== icon:check[] Release Notes + +Important - This release resolves an important issue in 7.11.16 and 7.11.17 that can cause issues in many areas of the crm, including in reports, roles and currency. We recommend all users of 7.11.16 and 7.11.17 to upgrade to this release asap. see issues +https://github.com/salesagility/SuiteCRM/issues/8936[8936^] and https://github.com/salesagility/SuiteCRM/issues/8934[8934^] for more details + +Important - Update 17 March 2021 - The upgrade patch has been updated to version 1.0.1. This update addresses an issue in which the upgrade patch may have prevented the option to select "Next" after a successful system check when upgrading. Special thanks to JanSiero for highlighting this issue and fix. + +==== icon:bug[] Bug Fixes + +* Issue: https://github.com/salesagility/SuiteCRM/issues/8936[8936^] - +/- get removed from start of text +* Issue: https://github.com/salesagility/SuiteCRM/issues/8934[8934^] - Report main group issues +* Issue: https://github.com/salesagility/SuiteCRM/issues/8391[8391^] - Yesterday period option in reports show correct time +* Issue: https://github.com/salesagility/SuiteCRM/issues/8863[8863^] - Cannot report on Employee Status +* Issue: https://github.com/salesagility/SuiteCRM/issues/8918[8918^] - Regression with download.php image fields +* Issue: https://github.com/salesagility/SuiteCRM/issues/8941[8941^] - Cannot delete reports fields +* Issue: https://github.com/salesagility/SuiteCRM/issues/8826[8826^] - PDF Report contains blank space when using a Main Group and Total + + +=== icon:heart[] Community + + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors Tuckan pgorod QuickCRM %}} + + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.11.17 + +_Released 29/10/2020_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.11.17.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.11.17.tar.gz[*Source code* (tar.gz)] +* https://suitecrm.com/files/162/SuiteCRM-7.11/507/SuiteCRM_Upgrade_Patch.zip[*Upgrade Patch* (zip)] + +=== icon:check[] Release Notes + +7.11.17 addresses an issue in 7.11.16 where Email compose body field was missing after upgrade to 7.11.16, please refer to the 7.11.16 release note for the further details and changes + +==== icon:bug[] Bug Fixes + +* Issue: https://github.com/salesagility/SuiteCRM/issues/8913[8913^] - Email compose body field missing after upgrade to 7.11.16 + +''' + +== 7.11.16 + +_Released 28/10/2020_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.11.16.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.11.16.tar.gz[*Source code* (tar.gz)] + +=== icon:check[] Release Notes + +Important - This release removes the YUI3 JavaScript Library from the codebase due to security concerns for the discontinued project. +If you have code within your instance that still specifically requires or makes use of YUI3 you made need to update your code or include YUI3 manually, prior to updating to this release. + +==== icon:lock[] Security + +* _Important Security Issue_ +* _Important Security Issue_ +* _Important Security Issue_ +* _Moderate Security Issue_ +* _Moderate Security Issue_ +* _Moderate Security Issue_ +* _Moderate Security Issue_ +* _Moderate Security Issue_ + +Security issues information will be added shortly + +==== icon:star[] Enhancements + +* PR: https://github.com/salesagility/SuiteCRM/issues/8818[8818^] - Add 'Contains' as valid opp for multienum +* PR: https://github.com/salesagility/SuiteCRM/issues/8814[8814^] - Allow custom SugarFieldBase class +* Move TinyMCE Editor to composer + + +==== icon:bug[] Bug Fixes + +* Issue: https://github.com/salesagility/SuiteCRM/issues/7972[7972^] - IMAP import fails with Office 365 +* Issue: https://github.com/salesagility/SuiteCRM/issues/8688[8688^] - Fatal error on install with MySQL 8 +* Issue: https://github.com/salesagility/SuiteCRM/issues/6046[6046^] - DBMS reserved words fail in MySQL8 +* Issue: https://github.com/salesagility/SuiteCRM/issues/8830[8830^] - File names with underscores in download.php +* Issue: https://github.com/salesagility/SuiteCRM/issues/8610[8610^] - Uninitialised variables in ModuleInstaller.php +* Issue: https://github.com/salesagility/SuiteCRM/issues/4435[4435^] - TinyMCE pagebreaks work correctly +* Issue: https://github.com/salesagility/SuiteCRM/issues/8771[8771^] - Silent failure when no PHP-json module installed +* Issue: https://github.com/salesagility/SuiteCRM/issues/8905[8905^] - Report joins fail on one to one relationships +* Issue: https://github.com/salesagility/SuiteCRM/issues/8904[8904^] - Optimistic Locking is not compatible with all field types +* Issue: https://github.com/salesagility/SuiteCRM/issues/8904[8904^] - Optimistic locking module definition incorrectly set on some modules +* Issue: https://github.com/salesagility/SuiteCRM/issues/8903[8903^] - Campaign Bounce email import - better mine type recognition +* Issue: https://github.com/salesagility/SuiteCRM/issues/8882[8882^] - Delegates subpanel select all / select page doesn't work +* Issue: https://github.com/salesagility/SuiteCRM/issues/7306[7306^] - API v8 not working on php-fcgid - Missing /api/.htaccess +* Issue: https://github.com/salesagility/SuiteCRM/issues/8486[8486^] - Rewriting of '.htaccess' file +* Issue: https://github.com/salesagility/SuiteCRM/issues/8535[8535^] - Email To field being deleted on save +* Issue: https://github.com/salesagility/SuiteCRM/issues/8730[8730^] - duplicate Compose Email Modal from Activities subpanel +* Issue: https://github.com/salesagility/SuiteCRM/issues/8641[8641^] - Compose button / Related ID not set when no email +* Issue: https://github.com/salesagility/SuiteCRM/issues/8812[8812^] - Add to target list in Campaign results +* Issue: https://github.com/salesagility/SuiteCRM/issues/8824[8824^] - Too few arguments on SugarWebServiceImpl set_relationship +* Issue: https://github.com/salesagility/SuiteCRM/issues/8677[8677^] - Subpanel end navigation +* Issue: https://github.com/salesagility/SuiteCRM/issues/8888[8888^] - Fixes DynamicField reference +* Issue: https://github.com/salesagility/SuiteCRM/issues/8785[8785^] - Incorrect Syntax in install.php +* Issue: https://github.com/salesagility/SuiteCRM/issues/8795[8795^] - Change log level to warn loading non existing Bean +* Issue: https://github.com/salesagility/SuiteCRM/issues/8819[8819^] - Update OutboundEmail.php to handle deleted rows +* Issue: https://github.com/salesagility/SuiteCRM/issues/6427[6427^] - Stacked Bar chart totals incorrect +* Issue: https://github.com/salesagility/SuiteCRM/issues/8348[8348^] - V8 API CORS prevents DELETE HTTP call +* Issue: https://github.com/salesagility/SuiteCRM/issues/8816[8816^] - module name on logic_hook install +* Issue: https://github.com/salesagility/SuiteCRM/issues/3468[3468^] - Email template retrieving cached beans +* Issue: https://github.com/salesagility/SuiteCRM/issues/8841[8841^] - Change private to protected to fix EmailMan overrides +* Issue: https://github.com/salesagility/SuiteCRM/issues/8490[8490^] - Fix php Notices +* Issue - Calender fails to display event the last over 3 weeks +* Issue - Theme display issues - Header & Footer clean up, Action and List view view buttons + + +=== icon:heart[] Community + +_Special thanks to everyone who reporting the security issues addressed in this release! + +Luis Noriega wizlynx group, M. Cory Billington (@_th3y), Hao Wang, QuickCRM, pgorod & Apple Information Security + + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors tsitle matthewpoer tsummerer maaarghk pribeiro42 gouchaoer IBlasterus JanSiero dominicchinkh Abuelodelanada hannenule mayerelyashiv QuickCRM %}} + + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.11.15 + +_Released 10/06/2020_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.11.15.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.11.15.tar.gz[*Source code* (tar.gz)] +* https://suitecrm.com/files/162/SuiteCRM-7.11/507/SuiteCRM_Upgrade_Patch.zip[*Upgrade Patch* (zip)] + +=== icon:check[] Release Notes + +7.11.15 addresses an issue in 7.11.14 where the change log would fail to display, please refer to the 7.11.14 release note for the further details and changes + +''' + + +== 7.11.14 + +_Released 09/06/2020_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.11.14.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.11.14.tar.gz[*Source code* (tar.gz)] +* https://suitecrm.com/files/162/SuiteCRM-7.11/507/SuiteCRM_Upgrade_Patch.zip[*Upgrade Patch* (zip)] + +=== icon:check[] Release Notes + +This release includes an additional patch that you can install if you are having issue upgrading. This allows you apply the enhancements and fixes we have brought in recent release to the upgrade wizard, prior to you upgrading to hopefully resolve many issue we have seen in the community. +To apply the patch download it from the https://suitecrm.com/files/162/SuiteCRM-7.11/507/SuiteCRM_Upgrade_Patch.zip[here] and install via module loader, not via the upgrade wizard. Then proceed to upgrade as normal. + + +==== icon:lock[] Security + +* _Moderate Security Issue_ +* _Moderate Security Issue_ +* _Moderate Security Issue_ +* _Moderate Security Issue_ +* _Moderate Security Issue_ + +Full disclosure of the security issues addressed in this release will be made at a later date + + +==== icon:star[] Enhancements + +* PR: https://github.com/salesagility/SuiteCRM/pull/7795[7795^] - PR: https://github.com/salesagility/SuiteCRM/pull/7806[7806] Custom Extend Core Modules +* PR: https://github.com/salesagility/SuiteCRM/pull/8405[8405^] - Remove deprecated sudo from .travis.yml +* PR: https://github.com/salesagility/SuiteCRM/pull/8506[8506^] - Increase driver timeouts to be a little more lenient +* PR: https://github.com/salesagility/SuiteCRM/pull/8523[8523^] - Update the index on the target list - targets middle table +* PR: https://github.com/salesagility/SuiteCRM/pull/8618[8618^] - Move OAuth2 Encryption Key into config.php +* PR: https://github.com/salesagility/SuiteCRM/pull/8639[8639^] - Display Data table under maps in any language +* PR: https://github.com/salesagility/SuiteCRM/pull/8638[8638^] - Check permissions only on required directories on upgrade system checks + + +==== icon:bug[] Bug Fixes + +* PR: https://github.com/salesagility/SuiteCRM/pull/6669[6669^] - Issue: https://github.com/salesagility/SuiteCRM/issues/5526[5526^] - Fix Inline edit date/datetime issue +* PR: https://github.com/salesagility/SuiteCRM/pull/7056[7056^] - Issue: https://github.com/salesagility/SuiteCRM/issues/3911[3911^] - LDAPAutheticate warnings in log +* PR: https://github.com/salesagility/SuiteCRM/pull/7863[7863^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7723[7723^] - Fix missing campaign analysis graphs +* PR: https://github.com/salesagility/SuiteCRM/pull/8208[8208^] - Issue: https://github.com/salesagility/SuiteCRM/issues/6676[6676^] - Add editview check to stop cacheing issues for dates on aow conditions +* PR: https://github.com/salesagility/SuiteCRM/pull/8257[8257^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8261[8261^] - Handling of temp files during Upgrades +* PR: https://github.com/salesagility/SuiteCRM/pull/8481[8481^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8450[8450^] - Minor bug in GridLayoutMetaDataParser::addField() +* PR: https://github.com/salesagility/SuiteCRM/pull/8483[8483^] - Fix function declaration of SugarFieldTime::save() +* PR: https://github.com/salesagility/SuiteCRM/pull/8504[8504^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8499[8499^] - API V8 issues for password grants SuiteCRM 7.10.22 +* PR: https://github.com/salesagility/SuiteCRM/pull/8511[8511^] - Issue: https://github.com/salesagility/SuiteCRM/issues/5012[5012^] - Remove maxLength from user name in DB config +* PR: https://github.com/salesagility/SuiteCRM/pull/8550[8550^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8549[8549^] - Added CSS to make case updates textfield re-sizeable +* PR: https://github.com/salesagility/SuiteCRM/pull/8559[8559^] - Fix issue for non based on Emails Campaigns +* PR: https://github.com/salesagility/SuiteCRM/pull/8594[8594^] - Fix db convert directly calling abstract function +* PR: https://github.com/salesagility/SuiteCRM/pull/8596[8596^] - Add missing business hours calculation to reports +* PR: https://github.com/salesagility/SuiteCRM/pull/8597[8597^] - Issue: https://github.com/salesagility/SuiteCRM/issues/5836[5836^] - Fix/5836 two factor authentication redirect +* PR: https://github.com/salesagility/SuiteCRM/pull/8598[8598^] - Fix usage of deprecated Redis::delete() function +* PR: https://github.com/salesagility/SuiteCRM/pull/8601[8601^] - Fix PHP notices Fix missing query offset in SugarBean::get_linked_beans() warnings +* PR: https://github.com/salesagility/SuiteCRM/pull/8607[8607^] - Fix missing query offset in SugarBean::get_linked_beans() +* PR: https://github.com/salesagility/SuiteCRM/pull/8629[8629^] - Fix string within sub query +* PR: https://github.com/salesagility/SuiteCRM/pull/8635[8635^] - Download link displayed twice. No Delete link in Diagnostic +* PR: https://github.com/salesagility/SuiteCRM/pull/8636[8636^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8489[8489^] - No validation when using header save button in AOS_Products +* PR: https://github.com/salesagility/SuiteCRM/pull/8638[8638^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8637[8637^] - Upgrade Wizard fatal error after upgrade on windows +* PR: https://github.com/salesagility/SuiteCRM/pull/8646[8646^] - Fix Report navigation display +* PR: https://github.com/salesagility/SuiteCRM/pull/8647[8647^] - Issue: https://github.com/salesagility/SuiteCRM/issues/5487[5487^] - Report groups repeat for each record +* PR: https://github.com/salesagility/SuiteCRM/pull/8648[8648^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7821[7821^] - Fix Username alignment in all screen widths +* PR: https://github.com/salesagility/SuiteCRM/pull/8651[8651^] - Fix warnings when running upgrade via cli +* PR: https://github.com/salesagility/SuiteCRM/pull/8652[8652^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8643[8643^] - Reports do not work related module custom fields +* PR: https://github.com/salesagility/SuiteCRM/pull/8654[8654^] - Fix naming from SugarCRM Reports to AOR_Reports +* PR: https://github.com/salesagility/SuiteCRM/pull/8655[8655^] - Reports: Remove useless recalculation +* PR: https://github.com/salesagility/SuiteCRM/pull/8659[8659^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7766[7766^] - Invalid depreciated log in SugarBean fixUpFormatting +* PR: https://github.com/salesagility/SuiteCRM/pull/8661[8661^] - Task Status key is displayed in View Summary +* PR: https://github.com/salesagility/SuiteCRM/pull/8754[8754^] - Remove unused google service from the vendor directory +* PR: https://github.com/salesagility/SuiteCRM/pull/8755[8755^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7152[7152^] - Fix cases Update text not saving when using html field +* PR: https://github.com/salesagility/SuiteCRM/pull/8758[8758^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8757[8757^] - Time format preference typo + + +=== icon:heart[] Community + +_Special thanks to everyone who reporting the security issues addressed in this release! + +Đào Quốc Vương, Global Ip Action & Connor Shea + + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors gitbnw iDevIt007 QuickCRM lazka 604media marin-h ChangezKhan serfreeman1337 connorshea tsmgeek tsitle %}} + + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + + +''' + +== 7.11.13 + +_Released 25/03/2020_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.11.13.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.11.13.tar.gz[*Source code* (tar.gz)] + +=== icon:check[] Release Notes + +==== icon:lock[] Security + +* _Critical Security Vulnerability_ +* _Important Security Issue_ +* _Important Security Issue_ + +Full disclosure of the security issues addressed in this release will be made at a later date + + +==== icon:bug[] Bug Fixes + +* Issue: https://github.com/salesagility/SuiteCRM/issues/5836[5836^] - Two Factor Authentication redirect to User profile +* Issue: https://github.com/salesagility/SuiteCRM/issues/8582[8582^] - DBManager::convert calls abstract function +* Issue: https://github.com/salesagility/SuiteCRM/issues/6676[6676^] - Multiple datetime value condition issues in Workflow / Reports +* Issue: https://github.com/salesagility/SuiteCRM/issues/7011[7011^] - Intial User Login Duplicate Timezone Request / Blank screen +* Issue: https://github.com/salesagility/SuiteCRM/issues/8261[8261^] - Upgrade Issues - Handling of temp files during Upgrades +* Issue: https://github.com/salesagility/SuiteCRM/pull/8483[8483^] - Fix function declaration of SugarFieldTime::save() + +=== icon:heart[] Community + +_Special thanks to all who contributed to this release!_ + +Please https://suitecrm.com/upgrade-suitecrm[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.11.12 + +_Released 14/02/2020_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.11.12.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.11.12.tar.gz[*Source code* (tar.gz)] + +=== icon:check[] Release Notes + +==== icon:lock[] Security + +* https://cve.mitre.org/cgi-bin/cvename.cgi?name=2020-8803[CVE: 2020-8803^] - Local File Inclusion +* https://cve.mitre.org/cgi-bin/cvename.cgi?name=2020-8801[CVE: 2020-8801^] - PHP Object Injections +* https://cve.mitre.org/cgi-bin/cvename.cgi?name=2020-8800[CVE: 2020-8800^] - Second-Order PHP Object Injections +* https://cve.mitre.org/cgi-bin/cvename.cgi?name=2020-8802[CVE: 2020-8802^] - Bean Manipulation + + +==== icon:bug[] Bug Fixes + +* Issue: https://github.com/salesagility/SuiteCRM/issues/8541[8541^] - MySQL Database breaking on special characters +* Backward incompatible config changes + +=== icon:heart[] Community + +_Special thanks to http://karmainsecurity.com/[Egidio Romano^] for reporting the security issues addressed in this release!_ + +Please https://suitecrm.com/upgrade-suitecrm[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.11.11 + +_Released 10/02/2020_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.11.11.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.11.11.tar.gz[*Source code* (tar.gz)] + +[discrete] + +==== icon:clipboard[] Administrators Note 1/2 +You may notice when installing SuiteCRM a new panel which allows for the configuration of different collations and type-sets. This is part of our progression towards resolving issues with special characters and emojis. Currently available sets include utf8 and utf8mb4. + +==== icon:clipboard[] Administrators Note 2/2 +Within this release, we have also resolved a few known issues with the upgrade process; however, they will unfortunately not take effect until the next upgrade cycle. Therefore it is vital that if you encounter any problems while installing that you review and follow the recommended process within the SuiteDocs upgrade debugging page which can be found https://community.suitecrm.com/t/debugging-steps-for-use-in-upgrade-version-prior-to-7-11-11-and-7-10-23/71273[here] + +==== icon:wrench[] Potential breaking change with package container-interop +If you maintain a CRM utilising container-interop for API extension, you should note that this release may require some small changes to routing as seen below: + +Instead of `Interop` +``` +use Interop\Container\ContainerInterface; +``` +Make use of `Psr` +``` +use Psr\Container\ContainerInterface; +``` + + + +[discrete] + +=== icon:check[] Release Notes + +==== icon:lock[] Security + +* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-8787[CVE-2020-8787^] - Bean ID validation strictness +* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-8783[CVE-2020-8783^] - Neutralization of potential vulnerability with use of Special Elements within SQL +* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-8784[CVE-2020-8784^] - Neutralization of potential vulnerability with use of Special Elements within SQL +* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-8785[CVE-2020-8785^] - Neutralization of potential vulnerability with use of Special Elements within SQL +* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-8786[CVE-2020-8786^] - Neutralization of potential vulnerability with use of Special Elements within SQL + +[discrete] + +==== icon:star[] Enhancements + +* PR: https://github.com/salesagility/SuiteCRM/pull/8100[8100^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8099[8099^] - Add a way to hide/show columnChooser in ListViews +* PR: https://github.com/salesagility/SuiteCRM/pull/7879[7879^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7876[7876^] - Render phone fields as links +* PR: https://github.com/salesagility/SuiteCRM/pull/8215[8215^] - Scroll QR&R to see the 'sync with vardefs' part +* PR: https://github.com/salesagility/SuiteCRM/pull/8164[8164^] - More inclusive language +* PR: https://github.com/salesagility/SuiteCRM/pull/8160[8160^] - Updated CONTRIBUTING.md +* PR: https://github.com/salesagility/SuiteCRM/pull/7798[7798^] - Database character set configuration + +[discrete] + +==== icon:bug[] Bug Fixes + +* PR: https://github.com/salesagility/SuiteCRM/pull/8422[8422^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8421[8421^] - Fix issue with validation on aos settings +* PR: https://github.com/salesagility/SuiteCRM/pull/8395[8395^] - Issue: https://github.com/salesagility/SuiteCRM/issues/6000[6000^] - Notifications not working when using mssql +* PR: https://github.com/salesagility/SuiteCRM/pull/8353[8353^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8351[8351^] - Datepicker missing in massupdate for custom datetime field type +* PR: https://github.com/salesagility/SuiteCRM/pull/8298[8298^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8295[8295^] - Fix sorting icons showing counterwise +* PR: https://github.com/salesagility/SuiteCRM/pull/8285[8285^] - Issue: https://github.com/salesagility/SuiteCRM/issues/6990[6990^] - Run Email Notification not working +* PR: https://github.com/salesagility/SuiteCRM/pull/8274[8274^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8273[8273^] - Check the selected e-mail client +* PR: https://github.com/salesagility/SuiteCRM/pull/8233[8233^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8057[8057^] - Backport various PHP 7.4 fixes +* PR: https://github.com/salesagility/SuiteCRM/pull/8205[8205^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8180[8180^] - Font colour is the same as the search bar bg +* PR: https://github.com/salesagility/SuiteCRM/pull/8053[8053^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7874[7874^] - Unable to use custom _head.tpl file (alternative fix) +* PR: https://github.com/salesagility/SuiteCRM/pull/8139[8139^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8134[8134^] - Logo not in left-hand corner anymore +* PR: https://github.com/salesagility/SuiteCRM/pull/8158[8158^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8151[8151^] - Updating FPEvent unit test to use correct array +* PR: https://github.com/salesagility/SuiteCRM/pull/8181[8181^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7305[7305^] - Scheduled reports execute in the timezone specified +* PR: https://github.com/salesagility/SuiteCRM/pull/8188[8188^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8183[8183^] - Non-group records show on list view if group only access +* PR: https://github.com/salesagility/SuiteCRM/pull/8190[8190^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8173[8173^] - Workflow actions missing in edit and detail view +* PR: https://github.com/salesagility/SuiteCRM/pull/8424[8424^] - Remove 'buggy version check' from php version checker +* PR: https://github.com/salesagility/SuiteCRM/pull/8363[8363^] - Adding fix to silent upgrade's upgrade history save +* PR: https://github.com/salesagility/SuiteCRM/pull/8346[8346^] - Update links +* PR: https://github.com/salesagility/SuiteCRM/pull/8344[8344^] - Email1 field now gets populated through API +* PR: https://github.com/salesagility/SuiteCRM/pull/8340[8340^] - API returns the emailAddress Relationship link +* PR: https://github.com/salesagility/SuiteCRM/pull/8322[8322^] - Remove Schedulers cron instructions from filter pop-up +* PR: https://github.com/salesagility/SuiteCRM/pull/8258[8258^] - Fix "!" in pQuery and add tests +* PR: https://github.com/salesagility/SuiteCRM/pull/8243[8243^] - Clear PHP notice on Home page and improve suitecrm.log message +* PR: https://github.com/salesagility/SuiteCRM/pull/8198[8198^] - Unit test fixes for 7.10.x +* PR: https://github.com/salesagility/SuiteCRM/pull/7832[7832^] - V8 API swagger.json +* PR: https://github.com/salesagility/SuiteCRM/pull/6709[6709^] - Avoid printing js content in CLI commands +* PR: https://github.com/salesagility/SuiteCRM/pull/8458[8458^] - Fix install layout db options +* PR: https://github.com/salesagility/SuiteCRM/pull/8468[8468^] - Fix slim api +* PR: https://github.com/salesagility/SuiteCRM/pull/8193[8193^] - Fixed employees module not appearing in ACL role list +* PR: https://github.com/salesagility/SuiteCRM/pull/8326[8326^] - Logo upload + +[discrete] + +==== icon:code-branch[] Development + +* PR: https://github.com/salesagility/SuiteCRM/pull/8231[8231^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7891[7891^] - Clean up include/ tests +* PR: https://github.com/salesagility/SuiteCRM/pull/8218[8218^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7744[7744^] - Remove deprecated functions from utils.php +* PR: https://github.com/salesagility/SuiteCRM/pull/8217[8217^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7744[7744^] - Remove the deprecated load_menu() function in utils.php +* PR: https://github.com/salesagility/SuiteCRM/pull/7807[7807^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7740[7740^] - Replacing the StateChecker with database truncation in tests +* PR: https://github.com/salesagility/SuiteCRM/pull/8379[8379^] - Deprecate _pp functions +* PR: https://github.com/salesagility/SuiteCRM/pull/8378[8378^] - Misc code formatting improvements +* PR: https://github.com/salesagility/SuiteCRM/pull/8350[8350^] - Add tests for splitTime() on TimeDate +* PR: https://github.com/salesagility/SuiteCRM/pull/8314[8314^] - Fix parameter order for asserts in unit tests +* PR: https://github.com/salesagility/SuiteCRM/pull/8300[8300^] - Add tests for TimeDate class +* PR: https://github.com/salesagility/SuiteCRM/pull/8313[8313^] - Add more TimeDate tests +* PR: https://github.com/salesagility/SuiteCRM/pull/8299[8299^] - Add tests and PHPDocs for return_bytes function +* PR: https://github.com/salesagility/SuiteCRM/pull/8296[8296^] - A few more little fixes for the formatting in the test suite. +* PR: https://github.com/salesagility/SuiteCRM/pull/8283[8283^] - Unit test cleanup +* PR: https://github.com/salesagility/SuiteCRM/pull/8253[8253^] - Remove some old code referencing PHP 5.3 +* PR: https://github.com/salesagility/SuiteCRM/pull/8252[8252^] - Deprecate various utils functions that are unused +* PR: https://github.com/salesagility/SuiteCRM/pull/8249[8249^] - Add unit tests for is_admin() function +* PR: https://github.com/salesagility/SuiteCRM/pull/8236[8236^] - Update the Travis Code Coverage job +* PR: https://github.com/salesagility/SuiteCRM/pull/8235[8235^] - Clean up misc unit tests +* PR: https://github.com/salesagility/SuiteCRM/pull/8234[8234^] - Add tests for check_php_version +* PR: https://github.com/salesagility/SuiteCRM/pull/8216[8216^] - Add a PHPDoc comment and test to unencodeMultienum() +* PR: https://github.com/salesagility/SuiteCRM/pull/8156[8156^] - tests: throw an error in case exit() is called during testing +* PR: https://github.com/salesagility/SuiteCRM/pull/8477[8477^] - Fix/Avoid WebDriver Timeouts in Travis createModule Tests +* PR: https://github.com/salesagility/SuiteCRM/pull/8509[8509^] - Fixing typo in seperator/separator change +* PR: https://github.com/salesagility/SuiteCRM/pull/8518[8518^] - Fix backwards compatibility with seperator/separator css +* PR: https://github.com/salesagility/SuiteCRM/pull/7580[7580^] - Update export_excel_compatible to work with all Excel versions +* PR: https://github.com/salesagility/SuiteCRM/pull/8297[8297^] - Add PHPDoc and deprecate unTranslateNum +* PR: https://github.com/salesagility/SuiteCRM/pull/8310[8310^] - Backport more PHP 7.4 fixes +* PR: https://github.com/salesagility/SuiteCRM/pull/8152[8152^] - Update html-purifier to 4.12 +* PR: https://github.com/salesagility/SuiteCRM/pull/8161[8161^] - Fix a PHP warning in Meeting.php +[discrete] + +=== icon:heart[] Community + +_Special thanks to http://karmainsecurity.com/[Egidio Romano^] for reporting the security issues addressed in this release!_ + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors re8260 connorshea marin-h ebogaard lazka crgrieve Abuelodelanada dominicchinkh kichloo %}} + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' == 7.11.10 _Released 11/11/2019_ -=== pass:[] Assets +=== icon:box-open[] Assets * https://github.com/salesagility/SuiteCRM/archive/v7.11.10.zip[*Source code* (zip)] * https://github.com/salesagility/SuiteCRM/archive/v7.11.10.tar.gz[*Source code* (tar.gz)] -=== pass:[] Release Notes +=== icon:check[] Release Notes -==== pass:[] Security +==== icon:lock[] Security * CVE: Unassigned - SQL Injection -==== pass:[] Bug Fixes +==== icon:bug[] Bug Fixes * PR: https://github.com/salesagility/SuiteCRM/pull/8185[8185^] - Issue: https://github.com/salesagility/SuiteCRM/issues/7946[7946^] - Removed unnecessary JSSource files * PR: https://github.com/salesagility/SuiteCRM/pull/8187[8187^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8183[8183^] - Non-group records show on list view if group only access @@ -43,21 +783,22 @@ To report any security issues please follow our Security Process and send them d _Released 04/11/2019_ -=== pass:[] Assets +=== icon:box-open[] Assets * https://github.com/salesagility/SuiteCRM/archive/v7.11.9.zip[*Source code* (zip)] * https://github.com/salesagility/SuiteCRM/archive/v7.11.9.tar.gz[*Source code* (tar.gz)] -=== pass:[] Release Notes +=== icon:check[] Release Notes -==== pass:[] Security +==== icon:lock[] Security * CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-18782[CVE-2019-18782^] - .htaccess Improvements * CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-18785[CVE-2019-18785^] - API Access Token and Credential fix -* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-18784[CVE-2019-18784^] - SQL Injections +* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-18784[CVE-2019-18784^] - Neutralization of potential vulnerability with use of Special Elements within SQL + [discrete] -==== pass:[] Enhancements +==== icon:star[] Enhancements * PR: https://github.com/salesagility/SuiteCRM/pull/7198[7198^] - Add Robo API commands * PR: https://github.com/salesagility/SuiteCRM/pull/5464[5464^] - Filter email templates on Events @@ -72,7 +813,7 @@ _Released 04/11/2019_ [discrete] -==== pass:[] Bug Fixes +==== icon:bug[] Bug Fixes * PR: https://github.com/salesagility/SuiteCRM/pull/8154[8154^] - Issue: https://github.com/salesagility/SuiteCRM/issues/8153[8153^] - SQL query in the ACLAction code * PR: https://github.com/salesagility/SuiteCRM/pull/8151[8151^] - Resolve issue with email templates @@ -203,7 +944,7 @@ _Released 04/11/2019_ [discrete] -==== pass:[] Development +==== icon:code-branch[] Development * PR: https://github.com/salesagility/SuiteCRM/pull/8000[8000^] - More PHP 7.4 array accessor deprecations * PR: https://github.com/salesagility/SuiteCRM/pull/6750[6750^] - Issue: https://github.com/salesagility/SuiteCRM/issues/4754[4754^] - Remove PHP4 style constructors @@ -212,27 +953,11 @@ _Released 04/11/2019_ [discrete] -=== pass:[] Community +=== icon:heart[] Community _Special thanks to the following members for their contributions and participation in this release!_ -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] -pass:[] - +{{% ghcontributors connorshea 604media tsummerer re8260 lazka Abuelodelanada dominicchinkh JanSiero QuickCRM HVStechnik lex111 Kishlin ognjen-petrovic ApatheticCosmos akshitsarin grahambrown11 00MB IvanArjona ozdemirburak mirajkovic steffinstanly %}} Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. @@ -244,21 +969,21 @@ To report any security issues please follow our Security Process and send them d _Released 23/08/2019_ -=== pass:[] Assets +=== icon:box-open[] Assets * https://github.com/salesagility/SuiteCRM/archive/v7.11.8.zip[*Source code* (zip)] * https://github.com/salesagility/SuiteCRM/archive/v7.11.8.tar.gz[*Source code* (tar.gz)] -=== pass:[] Release Notes +=== icon:check[] Release Notes -==== pass:[] Security +==== icon:lock[] Security * CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-14752[CVE-2019-14752^] - Reflected XSS * CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-18783[CVE-2019-18783^] - Unintended public exposure of files * CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-14454[CVE-2019-14454^] - Employee module does not implement ACL [discrete] -==== pass:[] Enhancements +==== icon:star[] Enhancements * PR: https://github.com/salesagility/SuiteCRM/pull/7702[7702 ] - Issue: https://github.com/salesagility/SuiteCRM/issues/7696[7696 ] - Update README * PR: https://github.com/salesagility/SuiteCRM/pull/7698[7698 ] - Issue: https://github.com/salesagility/SuiteCRM/issues/7581[7581 ] - SuiteBot config.yml @@ -285,7 +1010,7 @@ Plugin files are still usable in the same way as before – at `./include/Smarty [discrete] -==== pass:[] Bug Fixes +==== icon:bug[] Bug Fixes * PR: https://github.com/salesagility/SuiteCRM/pull/7719[7719 ] - Fix/backwards compatibility * PR: https://github.com/salesagility/SuiteCRM/pull/7718[7718 ] - Issue: https://github.com/salesagility/SuiteCRM/issues/6982[6982 ] - New user password not being generated @@ -300,15 +1025,11 @@ Plugin files are still usable in the same way as before – at `./include/Smarty * PR: https://github.com/salesagility/SuiteCRM/pull/7610[7610 ] - Fixed error message css + email warning config option [discrete] -=== pass:[] Community +=== icon:heart[] Community _Special thanks to the following members for their contributions and participation in this release!_ -pass:[] - -pass:[] - -pass:[] +{{% ghcontributors JanSiero 604media connorshea %}} ''' @@ -322,27 +1043,27 @@ To report any security issues please follow our Security Process and send them d _Released 31st July 2019_ -=== pass:[] Assets +=== icon:box-open[] Assets * https://github.com/salesagility/SuiteCRM/archive/v7.11.7.zip[*Source code* (zip)] * https://github.com/salesagility/SuiteCRM/archive/v7.11.7.tar.gz[*Source code* (tar.gz)] -=== pass:[] Release Notes +=== icon:check[] Release Notes -==== pass:[] Security +==== icon:lock[] Security [discrete] * https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-13335[#CVE-2019-13335 ] - *Security Issue* - Fixed SSRF * *Security Issue* - Fixed privilege escalation -==== pass:[] Enhancements +==== icon:star[] Enhancements * https://github.com/salesagility/SuiteCRM/pull/7374[#7374 ] Robo test-running commands * https://github.com/salesagility/SuiteCRM/pull/7474[#7474 ] SecuritySuite 3.1.16 * https://github.com/salesagility/SuiteCRM/pull/7503[#7503 ] Scheduled Reports: Enable security groups support and add the subpanel -==== pass:[] Bug Fixes +==== icon:bug[] Bug Fixes * https://github.com/salesagility/SuiteCRM/issues/3756[#3756 ] Fixed #3756 - Calendar pop-ups now auto close after 500ms * https://github.com/salesagility/SuiteCRM/pull/6850[#6850 ] SAML2: Use php-saml from composer @@ -372,7 +1093,7 @@ _Released 31st July 2019_ * https://github.com/salesagility/SuiteCRM/pull/7536[#7536 ] Cleanup files created by acceptance tests between test runs * https://github.com/salesagility/SuiteCRM/issues/7304[#7304 ] Fixed #7304 - ListView: Fix selection count for the "Select All" case * https://github.com/salesagility/SuiteCRM/pull/7541[#7541 ] ListView: Fix the selection count when executing an action without any selection -* https://github.com/salesagility/SuiteCRM/pull/7542[#7542 ] ListView: Fix selection when switch from "select all" to "select page" +* https://github.com/salesagility/SuiteCRM/pull/7542[#7542 ] ListView: Fix selection when switch from "select all" to "select page" * https://github.com/salesagility/SuiteCRM/pull/7550[#7550 ] SugarWidgetSubPanelEmailLink: Fix missing opt-in ticks after inline editing * https://github.com/salesagility/SuiteCRM/pull/7553[#7553 ] sugar_3.js: Remove unused send_form_for_emails() * https://github.com/salesagility/SuiteCRM/issues/7554[#7554 ] Fixed email attachment icon @@ -394,33 +1115,15 @@ _Released 31st July 2019_ * https://github.com/salesagility/SuiteCRM/pull/7607[#7607 ] Remove lastView variables from tests * https://github.com/salesagility/SuiteCRM/issues/7599[#7599 ] Fixed #7599 - Unwanted email generated in case creation & update * https://github.com/salesagility/SuiteCRM/issues/7608[#7608 ] Fixed #7608 - A non-numeric value encountered at ListViewSubPanel.php -* https://github.com/salesagility/SuiteCRM/pull/7624[#7624 ] Fixed email settings "data error" +* https://github.com/salesagility/SuiteCRM/pull/7624[#7624 ] Fixed email settings "data error" * https://github.com/salesagility/SuiteCRM/issues/6996[#6996 ] Escaped strings issue, breaks "My favorites" filters and perhaps other things * https://github.com/salesagility/SuiteCRM/pull/7639[#7639 ] Fixed DB failure with activities subpanel -=== pass:[] Community +=== icon:heart[] Community _Special thanks to all members for their contributions and participation in this release!_ -pass:[] - -pass:[] - -pass:[] - -pass:[] - -pass:[] - -pass:[] - -pass:[] - -pass:[] - -pass:[] - -pass:[] +{{% ghcontributors connorshea lazka 604media marin-h gody01 Abuelodelanada eggsurplus sanchezfauste adriangibanelbtactic ebogaard %}} ''' @@ -995,23 +1698,10 @@ In total, we have merged a **MASSIVE 69 PULL REQUESTS** with **24** of these fro {{% /notice %}} -Special thanks to the following members for their contributions and participation in this release +Special thanks to LEAP-nishit and the following members for their contributions and participation in this release (in order of most Pull Requests contributed). + -. https://github.com/lazka[lazka] -. https://github.com/Abuelodelanada[Abuelodelanada] -. https://github.com/urdhvatech[urdhvatech] -. https://github.com/gmblake[gmblake] -. https://github.com/machinecha[machinecha] -. https://github.com/GFanta[GFanta] -. https://github.com/Jorilx[Jorilx] -. https://github.com/QuickCRM[QuickCRM] -. https://github.com/connorshea[connorshea] -. https://github.com/LionelBino[LionelBino] -. https://github.com/hieuhoanghd[hieuhoanghd] -. https://github.com/jsamelko[jsamelko] -. https://github.com/LEAP-nishit[LEAP-nishit] + - +{{% ghcontributors lazka Abuelodelanada urdhvatech gmblake machinecha g-fantini Jorilx QuickCRM connorshea LionelBino hieuhoanghd jsamelko %}} Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade. @@ -1081,24 +1771,9 @@ via email security@suitecrm.com. Please https://suitecrm.com/download-latest-pre-release-suitecrm/[visit the official website] to find the pre-production appropriate upgrade. -_Special thanks to the following members for their contributions and participation in this release!_ +_Special thanks to LEAP-nishit and the following members for their contributions and participation in this release!_ -* https://github.com/Abuelodelanada[Abuelodelanada] -* https://github.com/adriangibanelbtactic[adriangibanelbtactic] -* https://github.com/ApatheticCosmos[ApatheticCosmos] -* https://github.com/ChangezKhan[ChangezKhan] -* https://github.com/hieuhoanghd[hieuhoanghd] -* https://github.com/horus68[horus68] -* https://github.com/JanSiero[JanSiero] -* https://github.com/Jorilx[Jorilx] -* https://github.com/jsamelko[jsamelko] -* https://github.com/lazka[lazka] -* https://github.com/LEAP-nishit[LEAP-nishit] -* https://github.com/likhobory[likhobory] -* https://github.com/LionelBino[LionelBino] -* https://github.com/Mausino[Mausino] -* https://github.com/pribeiro42[pribeiro42] -* https://github.com/urdhvatech[urdhvatech] +{{% ghcontributors Abuelodelanada adriangibanelbtactic ApatheticCosmos ChangezKhan hieuhoanghd horus68 JanSiero Jorilx jsamelko lazka likhobory LionelBino Mausino pribeiro42 urdhvatech %}} To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com @@ -1107,4 +1782,4 @@ Lastly a big thank you to the community for testing and confirming pull requests our 17-18th December 2018 Pull Request Party. This release is the result of the hard work and effort everyone put into the project! -''' + diff --git a/content/admin/releases/7.12.x/_index.en.adoc b/content/admin/releases/7.12.x/_index.en.adoc new file mode 100644 index 000000000..fe152d1bb --- /dev/null +++ b/content/admin/releases/7.12.x/_index.en.adoc @@ -0,0 +1,196 @@ +--- +title: "7.12.x Releases" +weight: 9870 +--- + +:toc: +:toc-title: +:toclevels: 1 +:icons: font + +== 7.12.2 + +_Released 17/12/2021_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.12.2.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.12.2.tar.gz[*Source code* (tar.gz)] + +==== icon:lock[] Security + +* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-45903[CVE-2021-45903] - XSS Vulnerability +* CVE: Pending - RCE and CSRF Vulnerability +* CVE: Pending - Privilege Escalation vulnerability +* CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-45041[CVE-2021-45041] - Authenticated SQL-Injection in SuiteCRM + +[discrete] + +==== icon:bug[] Bug Fixes + +* PR: https://github.com/salesagility/SuiteCRM/pull/9384[9348] - Fix https://github.com/salesagility/SuiteCRM/issues/9382[#9382] - Outbound Emails editview Unsupported operand types fatal in php 8 +* PR: https://github.com/salesagility/SuiteCRM/pull/9379[9379] - Fix https://github.com/salesagility/SuiteCRM/issues/9374[#9374] - OAuth password creation Unsupported operand types fatal in php8 +* PR: https://github.com/salesagility/SuiteCRM/pull/9087[9087] - Fix #9078 - Allow changing text colors when composing an email +* PR: https://github.com/salesagility/SuiteCRM/pull/9377[9377] - Fix https://github.com/salesagility/SuiteCRM/issues/9376[#9376] - Allow Workflows to run on imported records +* PR: https://github.com/salesagility/SuiteCRM/pull/9030[9030] - Fix #9030 - Campaign Email settings removes Email Settings +* PR: https://github.com/salesagility/SuiteCRM/pull/9395[9359] - Fix https://github.com/salesagility/SuiteCRM/issues/9383[9383] - Unsupported each function in php8. +* PR: https://github.com/salesagility/SuiteCRM/pull/9393[9393] - Fix email message modal buttons + +=== icon:heart[] Community + +_Special thanks to everyone who reporting the security issues addressed in this release!_ + +Konstantin Damotsev, Victor Garcia, Manuel Zametter + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors QuickCRM yaroslaw74 mstyp peterkracik fcorluka %}} + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.12.1 + +_Released 19/11/2021_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.12.1.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.12.1.tar.gz[*Source code* (tar.gz)] + +==== icon:lock[] Security + +* CVE: Pending - Fixed file check bypass +* CVE: Pending - Local File Inclusion + +[discrete] + +==== icon:star[] Enhancements +* PR: https://github.com/salesagility/SuiteCRM/pull/9369[9369] - Prevent Email Reminders for Disabled User + +==== icon:bug[] Bug Fixes + +* Fix https://github.com/salesagility/SuiteCRM/issues/8432[8432] - Remove index limit from mssql index names upon create and repair. +* PR: https://github.com/salesagility/SuiteCRM/pull/9334[9334] - Implement PDF extension +* PR: https://github.com/salesagility/SuiteCRM/pull/9347[9347] - Fix rebuild scss Robo command +* PR: https://github.com/salesagility/SuiteCRM/pull/9357[9357] - Use wildcard rather than the defunct "_all" field +* PR: https://github.com/salesagility/SuiteCRM/pull/9351[9351] - Fix https://github.com/salesagility/SuiteCRM/issues/9119[9119] - Rebuild theme cache after custom property changed in Studio +* PR: https://github.com/salesagility/SuiteCRM/pull/9368[9368] - Fix https://github.com/salesagility/SuiteCRM/issues/9217[9217] - Revert "Fix Users index incompatible with MSSQL". +* PR: https://github.com/salesagility/SuiteCRM/pull/9360[9360] - Fix https://github.com/salesagility/SuiteCRM/issues/9358[9358] - Meeting invite notification emails are not sending to all invitees. +* PR: https://github.com/salesagility/SuiteCRM/pull/9361[9361] - Fix https://github.com/salesagility/SuiteCRM/issues/9192[9192]: Fix duplication of folders_rel table entries. +* PR: https://github.com/salesagility/SuiteCRM/pull/9246[9246] - Fix https://github.com/salesagility/SuiteCRM/issues/6994[6994]: Update pollMonitoredInboxesAOP to double check that SugarFolder has been retrieved correctly. +* PR: https://github.com/salesagility/SuiteCRM/pull/9367[9367] - Update PDF template warning + +=== icon:heart[] Community + +_Special thanks to the following members for their contributions and participation in this release!_ + +{{% ghcontributors SinergiaCRM timo-ecm2 prbt2016 InfoLibre afnieves BKPepe gerdb42 tsmgeek %}} + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + +== 7.12 + +_Released 28/10/2021_ + +=== Update 04/11/2021 + +Upgrade Packages have been revised to address an issue https://github.com/salesagility/SuiteCRM/issues/9340[#9340] where upgrades could only be performed on php 7.3.x. The revised upgrade packages have been posted to the release section on the main website https://suitecrm.com/upgrade-suitecrm/[here]. + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.12.0.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.12.0.tar.gz[*Source code* (tar.gz)] + +==== icon:star[] Enhancements + +* PR: https://github.com/salesagility/SuiteCRM/pull/9244[9244^] - PDF Engine Selection +- MPDF License has be found to no longer be compliant with AGPL3 and due to this the MPDF will not be included in new installs. +MPDF will not be removed on upgrade, but the system will default to a new engine, with an option to revert back to the MDPF if required. +* PR: https://github.com/salesagility/SuiteCRM/pull/9185[9185^] - Noon Theme +* PR: https://github.com/salesagility/SuiteCRM/pull/9298[9298^] - Implement TCPDFEngine +* PR: https://github.com/salesagility/SuiteCRM/pull/9208[9208^] - Implement standard PDF Engines +* PR: https://github.com/salesagility/SuiteCRM/pull/9187[9187^] - Composer 2.0 +* PR: https://github.com/salesagility/SuiteCRM/pull/9291[9291^] - Allow configuring the Calendar name for the Google Sync via config +* PR: https://github.com/salesagility/SuiteCRM/pull/9171[9171^] - Upgrade ElasticSearch to 7.x +- This is the new minimum ElasticSearch version that is required for update. +* PR: https://github.com/salesagility/SuiteCRM/pull/9170[9170^] - PHPUnit/Codeception Upgrade +* PR: https://github.com/salesagility/SuiteCRM/pull/9159[9159^] - Implement standard SearchEngines +* PR: https://github.com/salesagility/SuiteCRM/pull/9172[9172^] - Malicious File Scanning +* PR: https://github.com/salesagility/SuiteCRM/pull/9095[9095^] - Consolidate global search settings (AOD, Basic) + + +==== Other Notable Changes + +* PR: https://github.com/salesagility/SuiteCRM/pull/9094[9094^] - AOD (Lucene) has been Deprecated to be removed in SuiteCRM 8.0 +* PR: https://github.com/salesagility/SuiteCRM/pull/9321[9321^] - Fix TCPDF Scale +* PR: https://github.com/salesagility/SuiteCRM/pull/9333[9333^] - Deprecate TCPDF +* PR: https://github.com/salesagility/SuiteCRM/pull/9335[9335^] - Fix PDF Engine Comparability issues +* PR: https://github.com/salesagility/SuiteCRM/pull/9186[9186^] - Fix missing default config values +* PR: https://github.com/salesagility/SuiteCRM/pull/9188[9188^] - Fix PDF_Lib constructors +* PR: https://github.com/salesagility/SuiteCRM/pull/9324[9324^] - Fix search result hits +* PR: https://github.com/salesagility/SuiteCRM/pull/9318[9318^] - Fix TCPDF Name +* PR: https://github.com/salesagility/SuiteCRM/pull/9310[9310^] - Fix SearchFormView visible options +* PR: https://github.com/salesagility/SuiteCRM/pull/9309[9309^] - Update workflow acceptance test +* PR: https://github.com/salesagility/SuiteCRM/pull/9296[9296^] - Fix CleanCSVTest return types +* PR: https://github.com/salesagility/SuiteCRM/pull/9306[9306^] - Fix filepath for mPDF class +* PR: https://github.com/salesagility/SuiteCRM/pull/9294[9294^] - Fix/noon styling issues +* PR: https://github.com/salesagility/SuiteCRM/pull/9083[9083^] - Update minimum required PHP to v7.3.0 +* All default config value now set on install +* utf8mb4 charset and utf8mb4_general_ci collation now the default on MySQL Databases on new installs + +=== icon:heart[] Community + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' + + +== 7.12-rc + +_Released 05/10/2021_ + +=== icon:box-open[] Assets + +* https://github.com/salesagility/SuiteCRM/archive/v7.12-rc.zip[*Source code* (zip)] +* https://github.com/salesagility/SuiteCRM/archive/v7.12-rc.tar.gz[*Source code* (tar.gz)] + +==== icon:star[] Enhancements + +* PR: https://github.com/salesagility/SuiteCRM/pull/9244[9244^] - PDF Engine Selection +- MPDF License has be found to no longer be compliant with AGPL3 and due to this the MPDF will not be included in new installs. +MPDF will not be removed on upgrade, but the system will default to a new engine, with an option to revert back to the MDPF if required. +* PR: https://github.com/salesagility/SuiteCRM/pull/9185[9185^] - Noon Theme +* PR: https://github.com/salesagility/SuiteCRM/pull/9298[9298^] - Implement TCPDFEngine +* PR: https://github.com/salesagility/SuiteCRM/pull/9208[9208^] - Implement standard PDF Engines +* PR: https://github.com/salesagility/SuiteCRM/pull/9187[9187^] - Composer 2.0 +* PR: https://github.com/salesagility/SuiteCRM/pull/9171[9171^] - Upgrade ElasticSearch to 7.x +- This is the new minimum ElasticSearch version that is required for update. +* PR: https://github.com/salesagility/SuiteCRM/pull/9170[9170^] - PHPUnit/Codeception Upgrade +* PR: https://github.com/salesagility/SuiteCRM/pull/9159[9159^] - Implement standard SearchEngines +* PR: https://github.com/salesagility/SuiteCRM/pull/9095[9095^] - Consolidate global search settings (AOD, Basic) + + +==== Other Notable Changes + +* PR: https://github.com/salesagility/SuiteCRM/pull/9094[9094^] - AOD (Lucene) has been Deprecated to removed in SuiteCRM 8.0 +* PR: https://github.com/salesagility/SuiteCRM/pull/9083[9083^] - Update minimum required PHP to v7.3.0 +* All default config value now set on install +* utf8mb4 charset and utf8mb4_general_ci collation now the default on MySQL Databases on new installs + +=== icon:heart[] Community + +Please https://suitecrm.com/download[visit the official website] to find the appropriate upgrade package. + +To report any security issues please follow our Security Process and send them directly to us via email security@suitecrm.com + +''' diff --git a/content/admin/releases/7.9.x/_index.en.adoc b/content/admin/releases/7.9.x/_index.en.adoc index 438ad8dd9..5cb429f7f 100644 --- a/content/admin/releases/7.9.x/_index.en.adoc +++ b/content/admin/releases/7.9.x/_index.en.adoc @@ -809,7 +809,7 @@ https://suitecrm.com/download[visit the official website] to find the appropriate upgrade. Checkout our -https://suitecrm.com/forum/announcements/14874-suitecrm-7-9-2-maintenance-patch-now-available[SuiteCRM] +https://community.suitecrm.com/t/suitecrm-7-9-2-maintenance-patch-now-available/47093[SuiteCRM] forum announcement. We have also updated our Security Process asking the community to send @@ -1024,4 +1024,4 @@ code* (tar.gz)] The focus of SuiteCRM 7.9 is to introduce a new and responsive Email Client and enhancements for Campaigns Email Template editor. -''' \ No newline at end of file +''' diff --git a/content/admin/releases/_index.ru.adoc b/content/admin/releases/_index.ru.adoc index b6b0d240c..d06809365 100644 --- a/content/admin/releases/_index.ru.adoc +++ b/content/admin/releases/_index.ru.adoc @@ -8,7 +8,7 @@ weight: 10000 {{% notice note %}} Полная история изменений системы link:../../../admin/releases/[представлена] в англоязычном разделе документации. + -Краткая история основных нововведений и изменений системы link:https://suitecrm.com/suitecrm/forum/suitecrm-forum-russian-general-discussion/17973-suitecrm[представлена^] в русскоязычном разделе форума. +Краткая история основных нововведений и изменений системы link:https://community.suitecrm.com/t/suitecrm/54809[представлена^] в русскоязычном разделе форума. {{% /notice %}} diff --git a/content/admin/suitecrm-analytics/SCRM-Analytics.adoc b/content/admin/suitecrm-analytics/SCRM-Analytics.adoc index 37e7bcdfa..6ad25a0c6 100644 --- a/content/admin/suitecrm-analytics/SCRM-Analytics.adoc +++ b/content/admin/suitecrm-analytics/SCRM-Analytics.adoc @@ -159,7 +159,7 @@ to the hostname or IP address of the server in your web browser. By default the web application is listening on port `8080` so for example, your server may be available on `http://localhost:8080/suitecrmanalytics`. -Check out the link:../../../user/suitecrm-analytics/getting-started/[SuiteCRM Analytics User Guide] for +Check out the link:../../../user/suitecrm-analytics/1.1/scrm-analytics-getting-started[SuiteCRM Analytics User Guide] for more information on the application. diff --git a/content/admin/suitecrm-analytics/SCRM-Analytics.ru.adoc b/content/admin/suitecrm-analytics/SCRM-Analytics.ru.adoc index 705ede2ea..354f71202 100644 --- a/content/admin/suitecrm-analytics/SCRM-Analytics.ru.adoc +++ b/content/admin/suitecrm-analytics/SCRM-Analytics.ru.adoc @@ -149,4 +149,4 @@ org.apache.catalina.startup.Catalina.start Server startup in N ms По умолчанию веб-приложение прослушивает порт *8080*, поэтому, например, ваш сервер может быть доступен по адресу http://localhost:8080/suitecrmanalytics. -Детальная информация о работе с веб-приложением описана в link:../../../user/suitecrm-analytics/getting-started[этом] разделе документации. +Детальная информация о работе с веб-приложением описана в link:../../../user/suitecrm-analytics/1.1/scrm-analytics-getting-started[этом] разделе документации. diff --git a/content/blog/_index.en.md b/content/blog/_index.en.md index 083276e77..c8e9037a7 100644 --- a/content/blog/_index.en.md +++ b/content/blog/_index.en.md @@ -1,5 +1,5 @@ --- title: "Technical Blog" -weight: 50 +weight: 60 pre: " " --- diff --git a/content/blog/_index.es.md b/content/blog/_index.es.md new file mode 100644 index 000000000..4dcd730dc --- /dev/null +++ b/content/blog/_index.es.md @@ -0,0 +1,8 @@ +--- +title: "Blog Técnico" +weight: 60 +pre: " " +--- + + + diff --git a/content/blog/_index.ru.md b/content/blog/_index.ru.md index ff9c8937f..6875c13e7 100644 --- a/content/blog/_index.ru.md +++ b/content/blog/_index.ru.md @@ -1,5 +1,5 @@ --- title: "Блог разработчиков" -weight: 50 +weight: 60 pre: " " --- \ No newline at end of file diff --git a/content/blog/larger-upgrades.adoc b/content/blog/larger-upgrades.adoc index d198e0383..aa1393f0d 100644 --- a/content/blog/larger-upgrades.adoc +++ b/content/blog/larger-upgrades.adoc @@ -181,7 +181,7 @@ and should never be considered as fully done, as with any large software project Ideally, you would now have the processes in place so that you could upgrade sooner and more often, without taking any particularly worrying risks. -Please also ask in the https://suitecrm.com/suitecrm/forum[Forums^] about any Issues you find. If after some triage in the Forums you realize you +Please also ask in the https://community.suitecrm.com[Forums^] about any Issues you find. If after some triage in the Forums you realize you found a bug in the software, please make sure you raise it on our https://github.com/salesagility/SuiteCRM/issues[GitHub repository^]. diff --git a/content/blog/larger-upgrades.ru.adoc b/content/blog/larger-upgrades.ru.adoc index 27fd347b5..928c0421b 100644 --- a/content/blog/larger-upgrades.ru.adoc +++ b/content/blog/larger-upgrades.ru.adoc @@ -165,6 +165,6 @@ image:upgrading-strategies.png[Диаграмма стратегий обнов Стремитесь поддерживать работоспособность и актуальность установленной системы, поскольку постоянно продолжаются исправления безопасности и обнаруженных ошибок, и этот процесс не следует считать полностью завершённым, как обычно и происходит с любым крупным программным проектом. -Пожалуйста, сообщайте на https://suitecrm.com/suitecrm/forum[форуме^] о любых обнаруженных проблемах. +Пожалуйста, сообщайте на https://community.suitecrm.com[форуме^] о любых обнаруженных проблемах. Если вы обнаружили ошибку в программном обеспечении, и вы не нашли её описания на форуме, пожалуйста, заведите соответствующий тикет в нашем https://github.com/salesagility/SuiteCRM/issues[Github-репозитории^]. \ No newline at end of file diff --git a/content/community/Code of Conduct.adoc b/content/community/Code of Conduct.adoc index e138b0e70..6de25eb69 100644 --- a/content/community/Code of Conduct.adoc +++ b/content/community/Code of Conduct.adoc @@ -17,7 +17,7 @@ We understand that in order to have a healthy and inclusive community we need to . **Be objective**. We’re dealing mostly with technical issues here: emotions are human, but please know that negative emotions don’t solve technical problems. Assume other people have the best intentions. -. **Be responsible.** Ensure that the consequences of your actions are for the good of the project and community. Respect security best-practices and aim for solid, maintainable solutions. If you know of any security issues in SuiteCRM, you can email mailto:security@suitecrm.com[security@suitecrm.com]. +. **Be responsible.** Ensure that the consequences of your actions are for the good of the project and community. We are community agnostic but we expect users from other communities to be transparent of their affiliation and be conscious of their actions to not detract from the project for personal gain. Members should also respect security best-practices and aim for solid, maintainable solutions. If you know of any security issues in SuiteCRM, you can email mailto:security@suitecrm.com[security@suitecrm.com]. . **Help people learn**. We welcome people of all levels of knowledge. Not understanding basic SuiteCRM features or not knowing how to search for a solution is normal in the beginning, we’ve all been there. diff --git a/content/community/Raising Issues.adoc b/content/community/Raising Issues.adoc deleted file mode 100644 index 5aadcb693..000000000 --- a/content/community/Raising Issues.adoc +++ /dev/null @@ -1,70 +0,0 @@ ---- -Title: Raising Issues -Weight: 20 ---- - -== Raising Issues - -An issue is an area where you can feel the project could be improved, -for example, you could report a problem or bug you've encountered while -using the software, a feature you feel is missing, or a gap in the -project's documentation. - -When raising issues via our GitHub repository ensure you state the issue -clearly with a full description of steps to reproduce, what version(s) -of SuiteCRM the issue was found in and; if relevant what platform it is -running on and a screenshot of the issue. This will allow any -contributor to easily identify and potentially address the issue. Here -is the GitHub guide to all things issues. - -Good example of a raised issue: - -https://github.com/salesagility/SuiteCRM/issues/1519[https://github.com/salesagility/SuiteCRM/issues/1519] - -== Security - -We take Security seriously here at SuiteCRM so if you have discovered a -security risk report it by emailing security@suitecrm.com. This will be -delivered to the product team who handle security issues. *Please don't -disclose security bugs publicly* until they have been handled by the -security team. - -Your email will be acknowledged within 24 hours during the business week -(Mon - Fri), and you’ll receive a more detailed response to your email -within 72 hours during the business week (Mon - Fri) indicating the next -steps in handling your report. - -== Labelling - -We have a number of labels that we tag issues with to define it's type, -priority, and action. - -[discrete] -===== Type: - -* bug -* duplicate -* invalid -* question -* suggestion - -[discrete] -===== Priority: - -* Low Priority -* Medium Priority -* High Priority - -[discrete] -===== Action: - -* Resolved: Next Release -* Fixed Proposed -* Pending Input -* Wrong Branch -* In Review - -We encourage users whom feel an issue should be raised as a higher -priority for a next release that they should make a comment to that -affect. This also applies to incorrect labelling. - diff --git a/content/community/contributing-code/Contributor Agreement.adoc b/content/community/contributing-code/Contributor Agreement.adoc index 7daafb667..304e0be10 100644 --- a/content/community/contributing-code/Contributor Agreement.adoc +++ b/content/community/contributing-code/Contributor Agreement.adoc @@ -6,7 +6,7 @@ Title: Contributor Agreement == Where can I find the Contributor Agreement? You can find the contributor agreement -https://www.clahub.com/agreements/salesagility/SuiteCRM[here]. +https://cla.suitecrm.com/salesagility/SuiteCRM[here]. == What is the Contributor Agreement? diff --git a/content/community/contributing-code/_index.ru.adoc b/content/community/contributing-code/_index.ru.adoc index f5ad21c2c..39ea7f4b6 100644 --- a/content/community/contributing-code/_index.ru.adoc +++ b/content/community/contributing-code/_index.ru.adoc @@ -14,9 +14,9 @@ Weight: 10 {{% notice info %}} -Значительная часть данного раздела не русифицирована, для перехода к оригинальному описанию нажмите link:https://docs.suitecrm.com/community/contributing-code[здесь]. + +Значительная часть данного раздела не русифицирована, для перехода к оригинальному описанию нажмите link:../../../community/contributing-code[здесь]. + Желающие внести свой вклад в создании русскоязычной документации могут ознакомиться с деталями в link:../../../community/contributing-to-docs[этом] разделе. + -Обсудить документацию можно в link:https://suitecrm.com/suitecrm/forum/suitecrm-forum-russian-general-discussion/17907-suitecrm#60470[русскоязычном разделе форума^]. +Обсудить документацию можно в link:https://community.suitecrm.com/t/suitecrm/12906[русскоязычном разделе форума^]. {{% /notice %}} diff --git a/content/community/contributing-to-docs/guidelines.adoc b/content/community/contributing-to-docs/guidelines.adoc index c39721ac9..8dd66164e 100644 --- a/content/community/contributing-to-docs/guidelines.adoc +++ b/content/community/contributing-to-docs/guidelines.adoc @@ -79,18 +79,27 @@ Example sentence indicating you can press a btn:[Save] on the user interface. ``` :imagesdir: /images/en/admin ``` -This directory should be specified as an absolute path (starting with a `/`), not relative (like `../../images`). +For images, this directory should be specified as an absolute path (starting +with a `/`), not relative like `../../images`. Note that this guideline is just for images, +it doesn't apply for links to pages, which should be relative. -- Including an automatically generated *Table of Contents* of the sections inside this file: +- Including an automatically generated *Table of Contents* of the sections inside this file:https://learn.netlify.com/en/shortcodes/children/ ``` :toc: ``` -- Including an automatically generated *Table of Contents* of the pages in directory levels below the current page -(used in pages that have a sub-directory). +- Including an automatically generated *Table of Contents* of the pages in directory levels below the current page, +to be used in pages that have a sub-directory. (This is a shorcode provided by link:https://learn.netlify.com/en/shortcodes/children/[our Theme^]). ``` {{%/* children depth="3" showhidden="true" */%}} ``` +- Including an automatically generated *List of GitHub Contributors* (for the *Release Notes* pages). You can +list an indefinte number of contributors. (This is a shortcode +link:https://github.com/salesagility/SuiteDocs/blob/master/layouts/shortcodes/ghcontributors.html[defined in our own site^]), +and can serve as an example if you want to create others). +``` +{{%/* ghcontributors username1 username2 */%}} +``` == Content diff --git a/content/community/contributing-to-docs/local-setup.ru.adoc b/content/community/contributing-to-docs/local-setup.ru.adoc index 4713143c5..781a03a99 100644 --- a/content/community/contributing-to-docs/local-setup.ru.adoc +++ b/content/community/contributing-to-docs/local-setup.ru.adoc @@ -35,14 +35,14 @@ sudo apt-get install git Для загрузки последней версии Hugo может быть использована следующая команда: -[source, shell] +[source,shell] wget https://github.com`wget -qO- https://github.com/gohugoio/hugo/releases/latest | grep -oE -m 1 '\/gohugoio\/hugo\/releases\/download\/v[0-9]+.[0-9]+.[0-9]*\/hugo_[0-9]+.[0-9]+.[0-9]*_Linux-64bit.deb'` При необходимости можно загрузить пакет другой версии с link:https://github.com/gohugoio/hugo/releases[этой^] страницы репозитория. Установите скачанный пакет. Если в папке находится только один пакет Hugo, можно воспользоваться командой -[source, shell] +[source,shell] sudo dpkg -i hugo*.deb diff --git a/content/community/contributing-to-docs/simple-edit.ru.adoc b/content/community/contributing-to-docs/simple-edit.ru.adoc index 951cb07fc..d7d4ff569 100644 --- a/content/community/contributing-to-docs/simple-edit.ru.adoc +++ b/content/community/contributing-to-docs/simple-edit.ru.adoc @@ -17,6 +17,7 @@ ifdef::env-github[:imagesdir: ./../../../../master/static/images/ru/community] ifdef::env-github[:btn:] +Любой желающий при необходиммости может отредактировать любую страницу документации и предоставить внесённые изменения на рассмотрение сообщества. Редактировать страницу можно непосредственно на сайте GitHub, где хранится репозиторий с данным справочным руководством. @@ -60,7 +61,7 @@ image:CreatePullRequest.png[Запрос на принятие изменени ''' Здесь предоставлена информация для "быстрого старта". Если вы готовы использовать дополнительные возможности Asciidoc для оформления текста, - а так же всю мощь функционала GitHub - обратитесь к link:../local-setup/#_Полезные_ссылки[соответствующим руководствам]. + а так же всю мощь функционала GitHub - обратитесь к link:../local-setup/#_полезные_ссылки[соответствующим руководствам]. Если вы планируете редактировать большое количество страниц, то удобнее всего это сделать link:../local-setup/[локально]. diff --git a/content/community/contributing-to-docs/simple-issue.adoc b/content/community/contributing-to-docs/simple-issue.adoc index 373be8473..2f854e168 100644 --- a/content/community/contributing-to-docs/simple-issue.adoc +++ b/content/community/contributing-to-docs/simple-issue.adoc @@ -34,7 +34,7 @@ You are taken to GitHub where a text editor will allow you to edit the Issue. image:28EditIssue.png[title="Edit Issue"] It's important to realize that these Issues are about the Documentation page, not about SuiteCRM itself. -So please direct any technical questions or feature requests to the http://suitecrm.com/forum[Forums^]. +So please direct any technical questions or feature requests to the https://community.suitecrm.com[Forums^]. Here, you can ask about something that needs to be clarified in the Documentation, suggest an additional aspect to cover in this page, or tell us about anything that diff --git a/content/community/contributing-to-docs/simple-issue.es.adoc b/content/community/contributing-to-docs/simple-issue.es.adoc index 94ecf482b..71efa8731 100644 --- a/content/community/contributing-to-docs/simple-issue.es.adoc +++ b/content/community/contributing-to-docs/simple-issue.es.adoc @@ -34,7 +34,7 @@ You are taken to GitHub where a text editor will allow you to edit the Issue. image:28EditIssue.png[title="Edit Issue"] It's important to realize that these Issues are about the Documentation page, not about SuiteCRM itself. -So please direct any technical questions or feature requests to the http://suitecrm.com/forum[Forums^]. +So please direct any technical questions or feature requests to the https://community.suitecrm.com[Forums^]. Here, you can ask about something that needs to be clarified in the Documentation, suggest an additional aspect to cover in this page, or tell us about anything that diff --git a/content/community/contributing-to-docs/simple-issue.ru.adoc b/content/community/contributing-to-docs/simple-issue.ru.adoc index 3d61b4bc0..1f201268c 100644 --- a/content/community/contributing-to-docs/simple-issue.ru.adoc +++ b/content/community/contributing-to-docs/simple-issue.ru.adoc @@ -33,7 +33,7 @@ image:AddIssue.png[Ошибка] . Введите необходимое сообщение, используя встроенный текстовый редактор GitHub. {{% notice note %}} -Если сообщение не имеет прямого отношения к сайту документации и в нем обсуждаются ошибки в работе SuiteCRM, то его следует разместить либо на http://suitecrm.com/forum[официальном форуме^], либо на сайте https://github.com/salesagility/SuiteCRM/issues/new[GitHub^]. +Если сообщение не имеет прямого отношения к сайту документации и в нем обсуждаются ошибки в работе SuiteCRM, то его следует разместить либо на https://community.suitecrm.com[официальном форуме^], либо на сайте https://github.com/salesagility/SuiteCRM/issues/new[GitHub^]. {{% /notice %}} Таким образом, если вам необходимо что-либо уточнить в документации, осветить на странице более детально какой-либо аспект, diff --git a/content/community/raising-issues.adoc b/content/community/raising-issues.adoc new file mode 100644 index 000000000..f68fa27e5 --- /dev/null +++ b/content/community/raising-issues.adoc @@ -0,0 +1,117 @@ +--- +Title: Raising Issues +Weight: 10 +--- + +:experimental: + +== Raising Issues + +An issue is an area where you can feel the project could be improved, +for example, you could report a problem or bug you've encountered while +using the software, a feature you feel is missing, or a gap in the +project's documentation. + +When raising issues via our GitHub repository ensure you state the issue +clearly with a full description of steps to reproduce, what version(s) +of SuiteCRM the issue was found in and; if relevant what platform it is +running on and a screenshot of the issue. This will allow any +contributor to easily identify and potentially address the issue. Here +is the GitHub guide to all things issues. + +Here is a https://github.com/salesagility/SuiteCRM/issues/8535[good example of a raised issue^]. + +== Security + +We take Security seriously here at SuiteCRM so if you have discovered a +security risk report it by emailing security@suitecrm.com. This will be +delivered to the product team who handle security issues. *Please don't +disclose security bugs publicly* until they have been handled by the +security team. + +Your email will be acknowledged within 24 hours during the business week +(Mon - Fri), and you’ll receive a more detailed response to your email +within 72 hours during the business week (Mon - Fri) indicating the next +steps in handling your report. + + +== GitHub Labels + +=== Types of Issue Labels + +You can click the labels below to see the list of actual Issues on Github that are +currently marked with that label. + +[frame=none, cols="40,60"] +|=== + +|btn:[https://github.com/salesagility/SuiteCRM/labels/bug[bug]]| Confirmed or very likely to be a bug. + +|btn:[https://github.com/salesagility/SuiteCRM/labels/Low%20Priority[Low priority]]| Low impact (e.g. visual only, typos, alignments). + +|btn:[https://github.com/salesagility/SuiteCRM/labels/Medium%20Priority[Medium Priority]]| Medium impact blocker with a workaround. + +|btn:[https://github.com/salesagility/SuiteCRM/labels/High%20Priority[High Priority]]| A high impact blocker with no workaround. + +|btn:[https://github.com/salesagility/SuiteCRM/labels/Fix%20Proposed[Fix Proposed]]| Issues with a related pull request. + +|btn:[https://github.com/salesagility/SuiteCRM/labels/Pending%20Input[Pending Input]]| Pending input from issue raiser. + +|btn:[https://github.com/salesagility/SuiteCRM/labels/Language[Language]]| Issues relating to language files + +|btn:[https://github.com/salesagility/SuiteCRM/labels/Suggestion[Suggestion]]| Suggestions that will later be moved to https://trello.com/b/Ht7LbMqw/suitecrm-suggestion-box[Trello^] + +|btn:[https://github.com/salesagility/SuiteCRM/labels/Question[Question]]| General questions (Should usually be posted to the community forum instead) + +|btn:[https://github.com/salesagility/SuiteCRM/labels/Resolved%3A%20Next%20Release[Resolved: next release]]| Solved issues that will be closed after the next release. + +|btn:[https://github.com/salesagility/SuiteCRM/labels/invalid[Invalid]]| Issues that are invalid or non-reproducible. + +|btn:[https://github.com/salesagility/SuiteCRM/labels/Duplicate[Duplicate]]| Issues which are duplicates of other issues. +|=== + +We encourage users who feel an issue should be raised as a higher +priority for a next release that they should make a comment to that +effect. This also applies to incorrect labelling. + + +=== Types of Pull Request Labels + +You can click the labels below to see the list of actual Pull Requests on Github that are +currently marked with that label. + +[frame=none, cols="40,60"] +|=== + +|btn:[https://github.com/salesagility/SuiteCRM/pulls?q=is%3Aopen+is%3Apr+label%3AAssessed[Assessed]]| +Pull requests that have been confirmed to fix the original issue by a SalesAgility member. + +|btn:[https://github.com/salesagility/SuiteCRM/pulls?q=is%3Aopen+is%3Apr+label%3A%22Ready%20to%20Merge%22[Ready to Merge]]| +Pull requests that have both been assessed and code reviewed by SalesAgility. + +|btn:[https://github.com/salesagility/SuiteCRM/pulls?q=is%3Aopen+is%3Apr+label%3A%22Requires%20Tests%22[Requires Tests]]| +Pull requests that require addition acceptance or unit tests before they can be merged. + +|btn:[https://github.com/salesagility/SuiteCRM/pulls?q=is%3Aopen+is%3Apr+label%3A%22Contribution%20Community%22[Community Contribution]]| +Pull requests that have been created by a member of the community. + +|btn:[https://github.com/salesagility/SuiteCRM/pulls?q=is%3Aopen+is%3Apr+label%3AEnhancement[Enhancement]]| +Pull requests that add additional features or functionality. These pull requests will need to be reviewed by SalesAgility. + + +|btn:[https://github.com/salesagility/SuiteCRM/pulls?q=is%3Aopen+is%3Apr+label%3A%22In%20Review%22[In Review]]| +Currently in-review and requires additional work from creator + +|btn:[https://github.com/salesagility/SuiteCRM/pulls?q=is%3Aopen+is%3Apr+label%3A%22Wrong%20Branch%22[Wrong Branch]]| +Pull requests that have been created to the wrong branch. + +|btn:[https://github.com/salesagility/SuiteCRM/pulls?q=is%3Aopen+is%3Apr+label%3ADuplicate[Duplicate]]| +Duplicate of other pull requests. + +|=== + + + + + + diff --git a/content/developer/Appendix A - Code Examples.adoc b/content/developer/Appendix A - Code Examples.adoc deleted file mode 100644 index 2feabf23e..000000000 --- a/content/developer/Appendix A - Code Examples.adoc +++ /dev/null @@ -1,173 +0,0 @@ - ---- -weight: 20 -title: "Appendix A - Code Examples" ---- - -= 20. Appendix A - Code Examples - -== Metadata - -This is an example of setting up a function subpanel (see the -link:../metadata/[Metadata] chapter for more -information). - -In this example the cases module has a custom field `incident_code_c` -which is used to track cases with the same root cause. We’ll add a -subpanel to show all cases that have the same `incident_code_c`. - -Initially we add to the `subpanel_setup` section of Cases by creating -the following file in -`custom/Extension/modules/Cases/Ext/Layoutdefs/IncidentLayoutdefs.php` - -.Example A.1: IncidentLayoutdefs.php -[source,php] ----- - 'Cases', - 'title_key' => 'LBL_INCIDENT_CASES', - 'subpanel_name' => 'default', - 'get_subpanel_data' => 'function:get_cases_by_incident', - 'function_parameters' => - array('import_function_file' => 'custom/modules/Cases/IncidentUtils.php',), - "generate_select" => true, -); ----- - - - -Next we create the file which will define our `get_cases_by_incident` -function `custom/modules/Cases/IncidentUtils.php`. - -.Example A.2: IncidentUtils.php -[source,php] ----- -controller->bean; - $incidentCode = $db->quote($bean->incident_code_c); - //Create the SQL array - $ret = array(); - $ret['select'] = ' SELECT id FROM cases '; - $ret['from'] = ' FROM cases '; - $ret['join'] = ""; - //Get all cases where the incident code matches but exclude the current case. - $ret['where']="WHERE cases.deleted = 0 AND cases_cstm.incident_code_c = '{$incidentCode}' AND cases.id != '{$bean->id}'"; - return $ret; -} ----- - - - -== Module Installer - -The following is a basic example manifest file. See the -link:../module-installer/[Module Installer] chapter. - -.Example A.3: Example manifest file -[source,php] ----- -$manifest = array( - 'name' => 'Example manifest', - 'description' => 'A basic manifest example', - 'version' => '1.2.3', - 'author' => 'Jim Mackin', - 'readme' => 'This is a manifest example for the SuiteCRM for Developers book', - 'acceptable_sugar_flavors' => array('CE'), - 'acceptable_sugar_versions' => array( - 'exact_matches' => array('6.5.20',), - ), - 'dependencies' => array( - array( - 'id_name' => 'hello_world', - 'version' => '3.2.1' - ), - ), - 'icon' => 'ManifestExample.png', - 'is_uninstallable' => true, - 'published_date' => '2015-05-05', - 'type' => 'module', - 'remove_tables' => 'prompt', - ); - $installdefs = array( - 'id' => 'suitecrmfordevelopers_example_manifest', - 'image_dir' => '/images/', - 'copy' => array( - array( - 'from' => '/modules/ExampleModule', - 'to' => 'modules/ExampleModule', - ), - ), - 'dashlets' => array( - array( - 'from' => '/modules/ExampleModule/Dashlets/', - 'name' => 'ExampleModuleDashlet' - ) - ), - 'language' => array( - array( - 'from' => 'application/language/en_us.examplemoduleadmin.php', - 'to_module' => 'application', - 'language' => 'en_us' - ), - array( - 'from' => '/modules/Accounts/language/en_us.examplemodule.php', - 'to_module' => 'Accounts', - 'language' => 'en_us' - ), - array( - 'from' => '/application/language/es_es.examplemoduleadmin.php', - 'to_module' => 'application', - 'language' => 'es_es' - ), - array( - 'from' => '/modules/Accounts/language/es_es.examplemodule.php', - 'to_module' => 'Accounts', - 'language' => 'es_es' - ), - ), - 'custom_fields' => array( - array( - 'name' => 'example_field', - 'label' => 'Example Field', - 'type' => 'varchar', - 'max_size' => 100, - 'module' => 'Accounts', - ), - ), - 'vardefs' => array( - array( - 'from' => 'modules/Accounts/vardefs/examplemodule_vardefs.php', - 'to_module' => 'Accounts', - ), - ), - 'beans' => array( - array( - 'module' => 'ExampleModule', - 'class' => 'ExampleModule', - 'path' => 'modules/ExampleModule/ExampleModule.php', - ), - ), - 'logic_hooks' => array( - array( - 'module' => 'Accounts', - 'hook' => 'before_save', - 'order' => 100, - 'description' => 'Example module before save hook', - 'file' => 'modules/ExampleModule/ExampleModuleHook.php', - 'class' => 'ExampleModuleLogicHooks', - 'function' => 'accounts_before_save', - ), - ), - 'administration' => array( - array( - 'from' => 'modules/administration/examplemodule_admin.php', - ), - ), - ); - $upgrade_manifest = array( -); ----- diff --git a/content/developer/Extension Framework.adoc b/content/developer/Extension Framework.adoc index f1dc4629b..4a0fe005b 100644 --- a/content/developer/Extension Framework.adoc +++ b/content/developer/Extension Framework.adoc @@ -135,10 +135,10 @@ look like: ---- "sports_list", - "extdir" => "SportsList", - "file" => 'sportslist.ext.php', - "module" => ""); + "section" => "sports_list", + "extdir" => "SportsList", + "file" => 'sportslist.ext.php', + "module" => ""); ---- Now when a *Quick Repair and Rebuild* is run any files in `custom/Extension/application/Ext/SportsList/` will be consolidated @@ -147,3 +147,16 @@ into `custom/application/Ext/SportsList/sportslist.ext.php`. On its own this file will not do anything but you are now able to write custom code that checks the consolidated file rather than having to worry about searching for customisations. +== Composer Extensions + +In order to add your own packages to Composer, you can define them in files named like this: + +`custom/Extension/application/Ext/Composer/\*/*.json` + +An example could be +`custom/Extension/application/Ext/Composer/MyProject/AddToComposer.json` + +Run a `composer install --no-dev` after adding this, and then again after each time you upgrade SuiteCRM. + +These Composer extensions are handled not by SuiteCRM directly, but rather by the Composer +link:https://github.com/wikimedia/composer-merge-plugin[merge-plugin^]. diff --git a/content/developer/Further Resources.adoc b/content/developer/Further Resources.adoc index 02a83f1e0..0cc74c192 100644 --- a/content/developer/Further Resources.adoc +++ b/content/developer/Further Resources.adoc @@ -1,6 +1,6 @@ --- -weight: 19 title: "Further Resources" +weight: 200 --- :experimental: @@ -14,16 +14,16 @@ developing with SuiteCRM. == SuiteCRM Website -The SuiteCRM website http://suitecrm.com[SuiteCRM.com] has many +The SuiteCRM website http://suitecrm.com[suitecrm.com^] has many excellent resources including: -* https://suitecrm.com/forum/index[SuiteCRM forums] - Come and say hi! -* https://suitecrm.com/suitecrm/blog[SuiteCRM Blog] -* https://suitecrm.com/wiki/index.php/Main_Page[SuiteCRM Wiki] +* https://community.suitecrm.com[SuiteCRM Community Forums^] - Come and say hi! +* https://suitecrm.com/about/newsroom/news/[SuiteCRM Blog^] == External SuiteCRM Resources -https://github.com/salesagility/SuiteCRM[SuiteCRM GitHub] - The SuiteCRM source code is hosted on GitHub. Here you can get bleeding edge code changes and even contribute code. +https://github.com/salesagility/SuiteCRM[SuiteCRM GitHub^] - The SuiteCRM source code is hosted on GitHub. +Here you can get bleeding edge code changes and even contribute code. == SugarCRM Resources @@ -32,29 +32,29 @@ edition and much of the documentation is still valid. The appropriate version for SuiteCRM information is 6.5. Versions of documentation higher than this (i.e. 7) will probably not be relevant. -* https://support.sugarcrm.com/Documentation/Unsupported_Versions/Sugar_6.5/[SugarCRM version 6.5 Developer docs] -* https://community.sugarcrm.com/community/developer[SugarCRM Developer Blog] +* https://support.sugarcrm.com/Documentation/Unsupported_Versions/Sugar_6.5/[SugarCRM version 6.5 Developer docs^] +* https://community.sugarcrm.com/community/developer[SugarCRM Developer Blog^] == Technical Links -* https://www.php.net[PHP] - The main language used by SuiteCRM -* https://www.smarty.net/[Smarty] - The templating language used throughout SuiteCRM. -* https://xdebug.org[XDebug] - Debugging/profiling extension for PHP -* https://git-scm.com/[Git] - Distributed version control system -* https://yuilibrary.com/[YUI] - Legacy Javascript library used in SuiteCRM -* https://jquery.com/[JQuery] - Javascript library used in SuiteCRM - to +* https://www.php.net[PHP^] - The main language used by SuiteCRM +* https://www.smarty.net/[Smarty^] - The templating language used throughout SuiteCRM. +* https://xdebug.org[XDebug^] - Debugging/profiling extension for PHP +* https://git-scm.com/[Git^] - Distributed version control system +* https://yuilibrary.com/[YUI^] - Legacy Javascript library used in SuiteCRM +* https://jquery.com/[JQuery^] - Javascript library used in SuiteCRM - to be preferred over YUI. -* https://github.com/PHPMailer/PHPMailer[PHPMailer] Email library used +* https://github.com/PHPMailer/PHPMailer[PHPMailer^] Email library used in SuiteCRM -* http://php.net/manual/en/book.apc.php[APC] - Alternative PHP Cache. +* http://php.net/manual/en/book.apc.php[APC^] - Alternative PHP Cache. PHP Opcode cache supported by SuiteCRM -* https://www.php.net/manual/en/book.wincache.php[WinCache] - Windows PHP +* https://www.php.net/manual/en/book.wincache.php[WinCache^] - Windows PHP cache. PHP Opcode cache supported by SuiteCRM -* https://www.jetbrains.com/phpstorm/[PHPStorm] - PHP IDE (Paid) -* https://eclipse.org/pdt/[Eclipse PHP Development Tools] - PHP IDE +* https://www.jetbrains.com/phpstorm/[PHPStorm^] - PHP IDE (Paid) +* https://eclipse.org/pdt/[Eclipse PHP Development Tools^] - PHP IDE (Free and Open Source) == Other Links -* https://salesagility.com/[SalesAgility] - The company behind SuiteCRM. -* http://www.jsmackin.co.uk[Jim Mackin] - Me :) link:../further-resources[↩] +* https://salesagility.com/[SalesAgility^] - The company behind SuiteCRM. +* http://www.jsmackin.co.uk[Jim Mackin^] - Personal website of the original author of this Developer Guide. diff --git a/content/developer/Introduction.adoc b/content/developer/Introduction.adoc index 502e47468..c523c07e5 100644 --- a/content/developer/Introduction.adoc +++ b/content/developer/Introduction.adoc @@ -49,17 +49,13 @@ as `Accounts` or `MyNewFile`). == Setting up SuiteCRM -In this guide we’ll be using SuiteCRM v7.1.5 which is the latest at time -of writing. For up to date versions of the installation instructions see -the SuiteCRM wiki at -https://suitecrm.com/wiki/index.php/Installation[suitecrm.com/wiki/index.php/Installation]. - [discrete] -==== Website +==== Downloading and Installing + +Visit the product's website to download the +https://suitecrm.com/download/[SuiteCRM installer]. -The SuiteCRM installer can be found at -https://suitecrm.com/[SuiteCRM.com]. I would recommend SuiteCRM MAX as I -prefer to start with a full interface and customise it as needed. +In the Administration guide you will find link:../../admin/installation-guide/downloading-installing/[Installation instructions]. [discrete] ==== GitHub diff --git a/content/developer/Metadata.adoc b/content/developer/Metadata.adoc index a6a1f1807..64bf5a5b1 100644 --- a/content/developer/Metadata.adoc +++ b/content/developer/Metadata.adoc @@ -3,6 +3,8 @@ weight: 6 title: "Metadata" --- +:toc: + = 6. Metadata == Intro @@ -665,8 +667,7 @@ entry for each subpanel usually has the following defined: the form `function:theFunctionName`. Additionally you can specify the location of the function and any additional parameters that are needed by using the `function_parameters` key. An example of a subpanel which - uses a function can be found in link:../appendix-a-code-examples/[Appendix - A]. + uses a function can be found below. `function_parameters`:: Specifies the parameters for a subpanel which gets it’s information from a function (see + @@ -794,4 +795,57 @@ used to confirm if a module should be shown in studio for user tweaking. Note that, unlike other metadata files, the file in `modules//metadata/studio.php` will be the only one checked. A file in `custom/modules//metadata/studio.php` will have no -effect. link:../metadata[↩] +effect. + +== Code Example + +This is an example of setting up a function subpanel using Metadata. + +In this example the cases module has a custom field `incident_code_c` +which is used to track cases with the same root cause. We’ll add a +subpanel to show all cases that have the same `incident_code_c`. + +Initially we add to the `subpanel_setup` section of Cases by creating +the following file in +`custom/Extension/modules/Cases/Ext/Layoutdefs/IncidentLayoutdefs.php` + +.Example A.1: IncidentLayoutdefs.php +[source,php] +---- + 'Cases', + 'title_key' => 'LBL_INCIDENT_CASES', + 'subpanel_name' => 'default', + 'get_subpanel_data' => 'function:get_cases_by_incident', + 'function_parameters' => + array('import_function_file' => 'custom/modules/Cases/IncidentUtils.php',), + "generate_select" => true, +); +---- + + + +Next we create the file which will define our `get_cases_by_incident` +function `custom/modules/Cases/IncidentUtils.php`. + +.Example A.2: IncidentUtils.php +[source,php] +---- +controller->bean; + $incidentCode = $db->quote($bean->incident_code_c); + //Create the SQL array + $ret = array(); + $ret['select'] = ' SELECT id FROM cases '; + $ret['from'] = ' FROM cases '; + $ret['join'] = ""; + //Get all cases where the incident code matches but exclude the current case. + $ret['where']="WHERE cases.deleted = 0 AND cases_cstm.incident_code_c = '{$incidentCode}' AND cases.id != '{$bean->id}'"; + return $ret; +} +---- + diff --git a/content/developer/Module Installer.adoc b/content/developer/Module Installer.adoc index 2b55d90aa..700c97a44 100644 --- a/content/developer/Module Installer.adoc +++ b/content/developer/Module Installer.adoc @@ -4,6 +4,8 @@ weight: 15 title: "Module Installer" --- +:toc: + = 15. Module Installer As detailed in the other chapters of this book there are many ways to @@ -19,8 +21,7 @@ to install the package. == manifest.php The `manifest.php` file contains the definition of three arrays. Let’s -look at each of these arrays in turn. See -link:../appendix-a-code-examples/[Appendix A] for the full sample +look at each of these arrays in turn. See below for a full sample `manifest.php` file. {{% notice info %}} @@ -410,3 +411,113 @@ functionality. `scripts/post_uninstall.php`:: A PHP script which defines a method `post_uninstall()`. This method will be called after the package is uninstalled. link:../module-installer[↩] + +== Sample manifest file + +The following is a basic example manifest file. + +.Example A.3: Example manifest file +[source,php] +---- +$manifest = array( + 'name' => 'Example manifest', + 'description' => 'A basic manifest example', + 'version' => '1.2.3', + 'author' => 'Jim Mackin', + 'readme' => 'This is a manifest example for the SuiteCRM for Developers book', + 'acceptable_sugar_flavors' => array('CE'), + 'acceptable_sugar_versions' => array( + 'exact_matches' => array('6.5.20',), + ), + 'dependencies' => array( + array( + 'id_name' => 'hello_world', + 'version' => '3.2.1' + ), + ), + 'icon' => 'ManifestExample.png', + 'is_uninstallable' => true, + 'published_date' => '2015-05-05', + 'type' => 'module', + 'remove_tables' => 'prompt', + ); + $installdefs = array( + 'id' => 'suitecrmfordevelopers_example_manifest', + 'image_dir' => '/images/', + 'copy' => array( + array( + 'from' => '/modules/ExampleModule', + 'to' => 'modules/ExampleModule', + ), + ), + 'dashlets' => array( + array( + 'from' => '/modules/ExampleModule/Dashlets/', + 'name' => 'ExampleModuleDashlet' + ) + ), + 'language' => array( + array( + 'from' => 'application/language/en_us.examplemoduleadmin.php', + 'to_module' => 'application', + 'language' => 'en_us' + ), + array( + 'from' => '/modules/Accounts/language/en_us.examplemodule.php', + 'to_module' => 'Accounts', + 'language' => 'en_us' + ), + array( + 'from' => '/application/language/es_es.examplemoduleadmin.php', + 'to_module' => 'application', + 'language' => 'es_es' + ), + array( + 'from' => '/modules/Accounts/language/es_es.examplemodule.php', + 'to_module' => 'Accounts', + 'language' => 'es_es' + ), + ), + 'custom_fields' => array( + array( + 'name' => 'example_field', + 'label' => 'Example Field', + 'type' => 'varchar', + 'max_size' => 100, + 'module' => 'Accounts', + ), + ), + 'vardefs' => array( + array( + 'from' => 'modules/Accounts/vardefs/examplemodule_vardefs.php', + 'to_module' => 'Accounts', + ), + ), + 'beans' => array( + array( + 'module' => 'ExampleModule', + 'class' => 'ExampleModule', + 'path' => 'modules/ExampleModule/ExampleModule.php', + ), + ), + 'logic_hooks' => array( + array( + 'module' => 'Accounts', + 'hook' => 'before_save', + 'order' => 100, + 'description' => 'Example module before save hook', + 'file' => 'modules/ExampleModule/ExampleModuleHook.php', + 'class' => 'ExampleModuleLogicHooks', + 'function' => 'accounts_before_save', + ), + ), + 'administration' => array( + array( + 'from' => 'modules/administration/examplemodule_admin.php', + ), + ), + ); + $upgrade_manifest = array( +); +---- + diff --git a/content/developer/Translate strings.adoc b/content/developer/Translate strings.adoc index a6ebaf3ac..3ef75cef6 100644 --- a/content/developer/Translate strings.adoc +++ b/content/developer/Translate strings.adoc @@ -1,5 +1,6 @@ --- Title: Translate strings +weight: 190 --- = LangText class diff --git a/content/developer/Views.adoc b/content/developer/Views.adoc index a811da1a5..26dc26031 100644 --- a/content/developer/Views.adoc +++ b/content/developer/Views.adoc @@ -165,7 +165,7 @@ most common ones to override are: alter this behaviour or to output anything after the main display. You usually want to call parent::display(); to ensure that the display code is run (unless, of course, you are adding your own display - logic). link:../views + logic). === Customising with Smarty templates diff --git a/content/developer/_index.ru.adoc b/content/developer/_index.ru.adoc index 9976d8add..356c640e7 100644 --- a/content/developer/_index.ru.adoc +++ b/content/developer/_index.ru.adoc @@ -9,7 +9,7 @@ pre: "4. " {{% notice info %}} -Содержимое раздела не русифицировано, для переходя к оригинальному описанию нажмите link:https://docs.suitecrm.com/developer[здесь]. + +Содержимое раздела не русифицировано, для переходя к оригинальному описанию нажмите link:../../developer[здесь]. + Желающие внести свой вклад в создании русскоязычной документации могут ознакомиться с деталями в link:../community/contributing-to-docs[этом] разделе. + -Обсудить документацию можно в link:https://suitecrm.com/suitecrm/forum/suitecrm-forum-russian-general-discussion/17907-suitecrm#60470[русскоязычном разделе форума^]. +Обсудить документацию можно в link:https://community.suitecrm.com/t/suitecrm/12906[русскоязычном разделе форума^]. {{% /notice %}} diff --git a/content/developer/api/API-4_1.adoc b/content/developer/api/API-4_1.adoc index fed33abac..7a6d01e1e 100644 --- a/content/developer/api/API-4_1.adoc +++ b/content/developer/api/API-4_1.adoc @@ -108,8 +108,8 @@ a post argument. The arguments to the REST API calls are: `method`:: - The method which will be called, i.e. `login` or `get_entry_list`. See - link:../../appendix-b-api-methods/[Appendix B] for a list of API methods. + The method which will be called, i.e. `login` or `get_entry_list`. See the + link:../api-v4.1-methods[list of API v4.1 methods]. `input_type`:: The input type of the rest_data. This is usually `JSON` but can also be `Serialize`. @@ -203,7 +203,7 @@ print_r($result); For a full list of API methods and their arguments see -link:../../appendix-b-api-methods/[Appendix B]. +link:../api-v4.1-methods[here]. == Adding custom API methods diff --git a/content/developer/api/Developer-setup-guide/Getting Available Resources.adoc b/content/developer/api/Developer-setup-guide/Getting Available Resources.adoc index 2b06911d0..f882d2e16 100644 --- a/content/developer/api/Developer-setup-guide/Getting Available Resources.adoc +++ b/content/developer/api/Developer-setup-guide/Getting Available Resources.adoc @@ -9,4 +9,4 @@ To see what resources and authentication methods are available, you can retrieve the https://swagger.io/specification/[swagger documentation]: [source] -GET {{suitecrm.url}}/Api/V8/meta/swagger.json +GET {{suitecrm.url}}/Api/docs/swagger/swagger.json diff --git a/content/developer/api/Developer-setup-guide/Introduction.adoc b/content/developer/api/Developer-setup-guide/Introduction.adoc index 4d50d31f0..cb5479cbb 100644 --- a/content/developer/api/Developer-setup-guide/Introduction.adoc +++ b/content/developer/api/Developer-setup-guide/Introduction.adoc @@ -3,11 +3,9 @@ title: Introduction weight: 10 --- -:imagesdir: /images/en/developer +SuiteCRM API version 8 exposes a set of resources, to be consumed by clients who wish to harness +the powerful CRM functionality provided by SuiteCRM. - -== Introduction -SuiteCRM API version 8 exposes a set of resources, to be consumed by clients who wish to harness the powerful CRM functionality provided by SuiteCRM. -The API framework employs a Restful design to facilitate the http://jsonapi.org/format/1.0/[JSON API 1.0] standard messages over HTTPS. It includes -meta objects to provide functionality which is not yet defined in the JSON API 1.0 standard. The SuiteCRM API is secured by the OAuth 2 Server -provided in SuiteCRM. +The API framework employs a Restful design to facilitate the http://jsonapi.org/format/1.0/[JSON API 1.0] +standard messages over HTTPS. It includes meta objects to provide functionality which is not yet defined +in the JSON API 1.0 standard. The SuiteCRM API is secured by the OAuth 2 Server provided in SuiteCRM. diff --git a/content/developer/api/Developer-setup-guide/JSON-API.adoc b/content/developer/api/Developer-setup-guide/JSON-API.adoc index 1ea0cc89c..70d83ebc9 100644 --- a/content/developer/api/Developer-setup-guide/JSON-API.adoc +++ b/content/developer/api/Developer-setup-guide/JSON-API.adoc @@ -41,13 +41,33 @@ Also, you have to be sure that the config files are owned by PHP. [source,php] sudo chown www-data:www-data p*.key -=== Update encryption key -OAuth2’s AuthorizationServer needs to set an encryption key for security reasons. For doing this, please, go to Api/Core/Config/ApiConfig.php and find "const OAUTH2_ENCRYPTION_KEY". +=== OAUTH2 encryption key +OAuth2’s AuthorizationServer needs to set an encryption key for security reasons. +This key has been gererated during the SuiteCRM installation and stored in the config.php under "oauth2_encryption_key". +If you would like to change its value you may generate a new one by running +[source,php] +php -r 'echo base64_encode(random_bytes(32)), PHP_EOL;' + +and then store the output in the config.php -Now update its value with generating a new one using `base64_encode(random_bytes(32))` +Current releases all use the value directly from `config.php` + +Older versions updated the file `/Api/Core/Config/Apiconfig.php` with the value from `config.php` when running a repair and rebuild. +If any issues arise and you are troubleshooting it may be worth taking a look there. If you need more information about this issue, https://oauth2.thephpleague.com/v5-security-improvements/[please visit this page]. +=== Verify if rewrite module is installed and activated +It is necessary to verify if '**mod_rewrite**' module of Apache server is enabled. Make sure to **enable** and activate it. This process depends on Operating System, installed versions of software etc. Please check this stackoverflow's answers https://stackoverflow.com/questions/7337724/how-to-check-whether-mod-rewrite-is-enable-on-server/10891317#10891317/[1], https://stackoverflow.com/questions/18310183/how-to-check-for-mod-rewrite-on-php-cgi/27589801#27589801/[2] to get directions how to enable the module. + +Also, for the SuiteCRM location (root{/var/www} or subdir{/var/www/subdir}) one should change **AllowOverride** directive inside Directory directive from **None** to **All** to assure that rewrite rules of .htaccess work: +[source,apache] + + Options Indexes FollowSymLinks + AllowOverride All + Require all granted + + == Authentication SuiteCRM Api allows two kind of grant types: @@ -89,7 +109,7 @@ Fields can filter on attribute object. Allowed keys are valid bean properties. Example: [source,php] -{{suitecrm.url}}/V8/module/Accounts/11a71596-83e7-624d-c792-5ab9006dd493?fields[Accounts]=name,account_type +{{suitecrm.url}}/Api/V8/module/Accounts/11a71596-83e7-624d-c792-5ab9006dd493?fields[Accounts]=name,account_type Result: @@ -122,7 +142,7 @@ Page can filter beans and set pagination. Allowed key are *number* and *size*. Example: [source,php] -{{suitecrm.url}}/V8/module/Accounts?fields[Account]=name,account_type&page[number]=3&page[size]=1 +{{suitecrm.url}}/Api/V8/module/Accounts?fields[Account]=name,account_type&page[number]=3&page[size]=1 Result: @@ -166,7 +186,7 @@ Sorting is set to ASC by default. If the property is prefixed with hyphen, the s Example: [source,php] -{{suitecrm.url}}/V8/module/Accounts?sort=-name +{{suitecrm.url}}/Api/V8/module/Accounts?sort=-name Result: @@ -234,7 +254,14 @@ LTE = '<='; Example: [source,php] -{{suitecrm.url}}/V8/module/Accounts?fields[Accounts]=name,account_type&filter[operator]=and&filter[account_type][eq]=Customer +{{suitecrm.url}}/Api/V8/module/Accounts?fields[Accounts]=name,account_type&filter[operator]=and&filter[account_type][eq]=Customer + +Example: + +[source,php] +{{suitecrm.url}}/Api/V8/module/Accounts?filter[account_type][eq]=Customer + + Result: @@ -247,36 +274,46 @@ Result: === Logout [source,php] -POST {{suiteCRM.url}}/V8/logout +POST {{suiteCRM.url}}/Api/V8/logout + +=== Modules + +[source,php] +GET {{suiteCRM.url}}/Api/V8/meta/modules + +=== Module Fields + +[source,php] +GET {{suiteCRM.url}}/Api/V8/meta/fields/{moduleName} === Get a module by ID [source,php] -GET {{suitecrm.url}}/V8/module/{moduleName}/{id} +GET {{suitecrm.url}}/Api/V8/module/{moduleName}/{id} Available parameters: fields Example: [source,php] -V8/module/Accounts/11a71596-83e7-624d-c792-5ab9006dd493?fields[Accounts]=name,account_type +Api/V8/module/Accounts/11a71596-83e7-624d-c792-5ab9006dd493?fields[Accounts]=name,account_type === Get collection of modules [source,php] -GET {{suitecrm.url}}/V8/module/{moduleName} +GET {{suitecrm.url}}/Api/V8/module/{moduleName} Available parameters: fields, page, sort, filter Example: [source,php] -V8/module/Accounts?fields[Accounts]=name,account_type&page[size]=4&page[number]=4 +Api/V8/module/Accounts?fields[Accounts]=name,account_type&page[size]=4&page[number]=4 === Create a module record [source,php] -POST {{suitecrm.url}}/V8/module +POST {{suitecrm.url}}/Api/V8/module Example body: @@ -284,7 +321,6 @@ Example body: { "data": { "type": "Accounts", - "id": "86ee02b3-96d2-47b3-bd6d-9e1035daff3a", "attributes": { "name": "Test account" } @@ -294,7 +330,7 @@ Example body: === Update a module record [source,php] -PATCH {{suitecrm.url}}/V8/module +PATCH {{suitecrm.url}}/Api/V8/module Example body: @@ -312,24 +348,22 @@ Example body: === Delete a module record [source,php] -DELETE {{suitecrm.url}}/V8/module/{moduleName}/{id} +DELETE {{suitecrm.url}}/Api/V8/module/{moduleName}/{id} === Get relationship [source,php] -GET {{suitecrm.url}}/V8/module/{moduleName}/relationships/{relation} - -Available parameters: fields, page, sort, filter +GET {{suitecrm.url}}/Api/V8/module/{moduleName}/{id}/relationships/{relatedModuleName} Example: [source,php] -V8/module/Accounts?fields[Accounts]=name,account_type&page[size]=4&page[number]=4 +Api/V8/module/Accounts/129a096c-5983-1d59-5ddf-5d95ec91c144/relationships/Accounts === Create relationship [source,php] -POST {{suitecrm.url}}/V8/module/{moduleName}/relationships/{relation} +POST {{suitecrm.url}}/Api/V8/module/{moduleName}/relationships Example body: @@ -337,7 +371,8 @@ Example body: ---- { "data": { - "type": "contacts" + "type": "Contacts", + "id": "129a096c-5983-1d59-5ddf-5d95ec91c144" } } ---- @@ -345,14 +380,10 @@ Example body: === Delete relationship [source,php] -POST {{suitecrm.url}}/V8/module/{moduleName}/{id}/relationships +DELETE {{suitecrm.url}}/Api/V8/module/{moduleName}/{id}/relationships/{relatedModule}/{relatedBeanId} -Example body: +Example: + +[source,php] +/Api/V8/module/Accounts/129a096c-5983-1d59-5ddf-5d95ec91c144/relationships/Accounts/11a71596-83e7-624d-c792-5ab9006dd493 -[source,json] -{ - "data": { - "type": "contacts", - "id": "67267a29-ef0d-a14d-e11a-5b02edd1b180" - } -} diff --git a/content/developer/api/Developer-setup-guide/Requirements.adoc b/content/developer/api/Developer-setup-guide/Requirements.adoc index f86c35bbe..a19a4757d 100644 --- a/content/developer/api/Developer-setup-guide/Requirements.adoc +++ b/content/developer/api/Developer-setup-guide/Requirements.adoc @@ -8,8 +8,10 @@ weight: 20 In order to prevent man-in-the-middle attacks, the authorization server MUST require the use of TLS with server authentication as defined by https://tools.ietf.org/html/rfc2818[RFC2818] for any request sent to the -authorization and token endpoints. The client MUST validate the -authorization server’s TLS certificate as defined by +authorization and token endpoints. + +The client MUST validate the +authorization server's TLS certificate as defined by https://tools.ietf.org/html/rfc6125[RFC6125] and in accordance with its requirements for server identity authentication. diff --git a/content/developer/Appendix B - API Methods.adoc b/content/developer/api/api-v4.1-methods.adoc similarity index 99% rename from content/developer/Appendix B - API Methods.adoc rename to content/developer/api/api-v4.1-methods.adoc index adce2b3a0..c818718fa 100644 --- a/content/developer/Appendix B - API Methods.adoc +++ b/content/developer/api/api-v4.1-methods.adoc @@ -1,10 +1,10 @@ --- weight: 21 -title: "Appendix B - API Methods" +title: "API v4.1 Methods" --- -= 21. Appendix B - API Methods += API v4.1 Methods == Methods diff --git a/content/developer/automatedtasks/Sass.adoc b/content/developer/automatedtasks/Sass.adoc index caee21f3a..b17686a8f 100644 --- a/content/developer/automatedtasks/Sass.adoc +++ b/content/developer/automatedtasks/Sass.adoc @@ -23,10 +23,10 @@ Open Command Prompt and run robo Open terminal and run robo -`./vendor/bin/robo build:suite-p --color_scheme=[ColorName]` +`./vendor/bin/robo build:suite-p --color-scheme=[ColorName]` === Build a specific SuiteP Color (Command Prompt): Open Command Prompt and run robo -`.\vendor\bin\robo build:suite-p --color_scheme=[ColorName]` +`.\vendor\bin\robo build:suite-p --color-scheme=[ColorName]` diff --git a/content/developer/database-schema.adoc b/content/developer/database-schema.adoc new file mode 100644 index 000000000..51275572f --- /dev/null +++ b/content/developer/database-schema.adoc @@ -0,0 +1,173 @@ +--- +title: Database Schema +weight: 195 +--- + +:imagesdir: /images/en/developer/database-schema + +== SchemaSpy tables and diagrams + +To learn about our database structure, with its tables and relationships, +please visit the link:++https://schema--suitecrm-docs.netlify.com/schema++[SuiteCRM Database Schema^], +generated with SchemaSpy. + +image:schemaspy.png[link="https://schema--suitecrm-docs.netlify.com/schema", SchemaSpy screenshot, window="_blank"] + +== General principles and sample SQL queries + +{{% notice warning %}} +Some of the queries provided below delete data from your database. Use at your own risk, and be sure +to create full backups before trying them. A single mistaken SQL query can produce irreparable +damage to your database. +{{% /notice %}} + +=== Unique identifiers + +SuiteCRM uses UUID's for its unique identifiers. They look like this: `46c35607-bcad-c7f1-1745-558d6b858b27`. +They can be generated in SQL and inserted into other queries as a sub-select: + +[source,sql] +---- +UPDATE some_table SET id=(SELECT uuid()); +---- + +Historically, since the SugarCRM days, these id's have followed this format, but in practice _any_ format +was allowed, numeric, string, etc., as long as it was unique. This sometimes greatly facilitates imports +by allowing previous numbering schemes to be maintained. + +=== Custom Fields + +Custom fields get saved in tables with the same name as the module they are defined in, but with an +appended suffix `_cstm`. + +Each custom field will have the name you entered for it in Studio, with a suffix `_c`. + +Here is a sample query to join a module's table with some custom fields (in this case, a field called +**age** when created in Studio): + +[source,sql] +---- +SELECT first_name, last_name, contacts_cstm.age_c + FROM `contacts` + LEFT JOIN contacts_cstm + ON contacts.id = contacts_cstm.id_c +---- + +List orphaned records from `contacts_cstm`, where the base record is not present, but a row for it still +exists in the custom table: + +[source,sql] +---- +SELECT * -- DELETE ChildTable + FROM contacts_cstm ChildTable + LEFT JOIN contacts ParentTable + ON ChildTable.id_c = ParentTable.id + WHERE ParentTable.id IS NULL +---- + +That query is a SELECT, but if you change the first line to what is after the comment (`--`), +it will delete those rows. Please read the warning above and decide responsibly. + +=== Relationships + +SuiteCRM does not rely on the database engine to enforce relationships (foreign key constraints, etc). +All these things are handled at application level in our own PHP code. + +In general, SuiteCRM also does not do any cascaded updates or cascaded deletes, there are only a few +exceptions for some particular cases. This means that you might need some periodic database clean-up. +There is a "Prune database on the 1st of month" scheduled job that handles some of these tasks, +but you need to evaluate your own case in order to decide on the appropriate house-cleaning tasks. +There is no "one-size-fits-all" solution for this, so each implementation should take the necessary +steps for its own case. + +There is a table called `relationships` which contains metadata information retrieved from the **vardefs**. + +==== Typical ways to JOIN tables + +A few sample queries should suffice to give you an idea of how SuiteCRM tables typically reference each other: + +. The query to get data from a **custom field** that was given above; ++ +. Traversing a **Flex Relate** field where several connected record types are allowed. The `parent_type` +field contains the name of the related module, while the `parent_id` is a foreign key into that module's table: ++ +[source,sql] +---- +SELECT accounts.name, calls.name, calls.status + FROM accounts + INNER JOIN calls ON + calls.parent_type = 'Accounts' AND + calls.parent_id = accounts.id AND + calls.deleted = 0 + WHERE accounts.deleted = 0 +---- ++ +. A query to traverse a **many-to-many relationship** using a middle table. In this example, a list of +account names and linked contacts: ++ +image:schema.png[Schema] ++ +[source,sql] +---- +SELECT accounts.name, contacts.first_name, contacts.last_name + FROM accounts + INNER JOIN accounts_contacts + ON (accounts.id = accounts_contacts.account_id AND accounts_contacts.deleted = 0) + INNER JOIN contacts + ON (contacts.id = accounts_contacts.contact_id AND contacts.deleted = 0) + WHERE accounts.deleted = 0 + ORDER BY accounts.name +---- ++ +. Traversing the **`email_addresses` relationship** to get the email addresses of Users (easily adaptable for +other modules, like Contacts, Leads, etc). ++ +[source,sql] +---- +SELECT users.user_name, + email_address + FROM users + LEFT JOIN email_addr_bean_rel + ON email_addr_bean_rel.bean_id=users.id + AND email_addr_bean_rel.bean_module = 'Users' + AND email_addr_bean_rel.primary_address = 1 + AND email_addr_bean_rel.deleted = 0 + LEFT JOIN email_addresses + ON email_addresses.id = email_addr_bean_rel.email_address_id + AND email_addresses.deleted = 0 +---- + +==== Cleaning up Relationships to deleted records + +When you delete a record from a module, in many cases SuiteCRM does not delete all the associated records, +because it is impossible to decide which should or should not be removed without knowing the specifics of each +business. Not deleting is _generically_ the sensible, conservative approach. But if you decide in your +case you need to remove some left-overs from previously existing records, then the following should help you. + +Here is a sample query to look for orphaned records, in this case security groups entries referring +to missing records: + +[source,sql] +---- +SELECT record_id, module, s.deleted, c.last_name, c.deleted + FROM securitygroups_records s + LEFT JOIN contacts c + ON s.record_id = c.id + WHERE c.id IS NULL AND + s.module='Contacts' +---- + +This query can easily be turned into a DELETE in order to remove these records. + +You might also make a simpler delete of rows where `deleted='1'`, where the relationship itself was deleted, +even if the `record_id` still exists: + +[source,sql] +---- +SELECT record_id, module, deleted + FROM securitygroups_records + WHERE module='Contacts' AND deleted='1' +---- + + + diff --git a/content/user/Appendix A.pt.adoc b/content/user/Appendix A.pt.adoc new file mode 100644 index 000000000..4a2b74772 --- /dev/null +++ b/content/user/Appendix A.pt.adoc @@ -0,0 +1,496 @@ +--- +Title: Apêndice A +Weight: 300 +hidden: true +--- + +:imagesdir: /images/en/user + += Apêndice A + +== Lista de Campos de Contactos + +[cols="25,10,25", width="60%", options="header"] +|==== +s|Etiqueta s|Obrigatório s|Tipo + +s|ID: |Sim |ID + +s|Nome: | |Saudação + Nome Próprio + Apelido + +s|Criado em: | |Data/Hora + +s|Modificado em: | |Data/Hora + +s|Modificado por: | |Relacionamento - Utilizadores + +s|Criado por: | |Relacionamento - Utilizadores + +s|Descrição: | |Área de Texto + +s|Utilizador atribuído: | |Relacionamento - Users + +s|Saudação | |Lista de Opções + +s|Nome Próprio: | |Campo de texto + +s|Apelido: |Sim |Campo de texto + +s|Título: | |Campo de texto + +s|Departamento: | |Campo de texto + +s|Não Telefonar: | |Caixa de verificação + +s|Telefone de Casa: | |Telefone + +s|Telemóvel: | |Telefone + +s|Telefone de Trabalho: | |Telefone + +s|Outro Telefone: | |Telefone + +s|Fax: | |Telefone + +s|Endereço de Email: | |Campo de texto + +s|Outro Endereço de Email: | |Campo de texto + +s|Email Inválido: | |Caixa de verificação + +s|Não receber email: | |Caixa de verificação + +s|Endereço Primário - Rua: | |Campo de texto + +s|Endereço Primário - Rua 2: | |Campo de texto + +s|Endereço Primário - Rua 3: | |Campo de texto + +s|Endereço Primário - Localidade: | |Campo de texto + +s|Endereço Primário - Estado: | |Campo de texto + +s|Endereço Primário - Código Postal: | |Campo de texto + +s|Endereço Primário - País: | |Campo de texto + +s|Endereço Alternativo - Rua: | |Campo de texto + +s|Endereço Alternativo - Rua 2: | |Campo de texto + +s|Endereço Alternativo - Rua 3: | |Campo de texto + +s|Endereço Alternativo - Localidade: | |Campo de texto + +s|Endereço Alternativo - Estado: | |Campo de texto + +s|Endereço Alternativo - Código Postal: | |Campo de texto + +s|Endereço Alternativo - País: | |Campo de texto + +s|Assistente: | |Campo de texto + +s|Telefone de Assistente: | |Telefone + +s|Endereço de Email: | |Email + +s|Referido por: | |Campo de texto + +s|Fonte da Lead: | |Lista de Opções + +s|Descrição da Fonte da Lead: | |Área de Texto + +s|Estado: | |Lista de Opções + +s|Descrição do Estado: | |Área de Texto + +s|Reporta a: | |Relacionamento - Leads + +s|Nome da Conta: | |Campo de texto + +s|Nome da Oportunidade: | |Campo de texto + +s|Valor da Oportunidade: | |Campo de texto + +s|Campanha: | |Relacionamento - Campaigns + +s|Data de Nascimento: | |Date +|==== + +== Lista de Campos de Leads + +[cols="25,10,25", width="60%", options="header"] +|==== +s|Etiqueta s|Obrigatório s|Tipo + +s|ID: |Sim |ID + +s|Nome: | |Saudação + Nome Próprio + Apelido + +s|Criado em: | |Data/Hora + +s|Modificado em: | |Data/Hora + +s|Modificado por: | |Relacionamento - Users + +s|Criado por: | |Relacionamento - Users + +s|Descrição: | |Área de Texto + +s|Utilizador atribuído: | |Relacionamentos - Users + +s|Saudação | |Lista de Opções + +s|Nome Próprio: | |Campo de texto + +s|Apelido: |Sim |Campo de texto + +s|Título: | |Campo de texto + +s|Departamento: | |Campo de texto + +s|Não Telefonar: | |Caixa de verificação + +s|Telefone de Casa: | |Telefone + +s|Telemóvel: | |Telefone + +s|Telefone de Trabalho: | |Telefone + +s|Outro Telefone: | |Telefone + +s|Fax: | |Telefone + +s|Endereço de Email: | |Campo de texto + +s|Outro Endereço de Email | |Campo de texto + +s|Email Inválido: | |Caixa de verificação: + +s|Não receber email: | |Caixa de verificação + +s|Endereço Primário - Rua: | |Campo de texto + +s|Endereço Primário - Rua 2: | |Campo de texto + +s|Endereço Primário - Rua 3: | |Campo de texto + +s|Endereço Primário - Localidade: | |Campo de texto + +s|Endereço Primário - Estado: | |Campo de texto + +s|Endereço Primário - Código Postal: | |Campo de texto + +s|Endereço Primário - País: | |Campo de texto + +s|Endereço Alternativo - Rua: | |Campo de texto + +s|Endereço Alternativo - Rua 2: | |Campo de texto + +s|Endereço Alternativo - Rua 3: | |Campo de texto + +s|Endereço Alternativo - Localidade: | |Campo de texto + +s|Endereço Alternativo - Código Postal: | |Campo de texto + +s|Endereço Alternativo - País: | |Campo de texto + +s|Assistente: | |Campo de texto + +s|Telefone de Assistente: | |Telefone + +s|Endereço de Email: | |Email + +s|Referido Por: | |Campo de texto + +s|Fonte da Lead: | |Lista de Opções + +s|Descrição da Fonte da Lead: | |Área de Texto + +s|Estado: | |Lista de Opções + +s|Descrição do Estado: | |Área de Texto + +s|Reporta a: | |Relacionamento - Leads + +s|Nome da Conta: | |Campo de texto + +s|Nome da Oportunidade: | |Campo de texto + +s|Valor da Oportunidade | |Campo de texto + +s|Campanha | |Relacionamento - Campaigns + +s|Data de Nascimento | |Data +|==== + +== Lista de Campos de Targets + +[cols="25,10,25", width="60%", options="header"] +|==== +s|Etiqueta s|Obrigatório s|Tipo + +s|ID: |Sim |ID + +s|Criado em: | |Saudação + Nome Próprio + Apelido + +s|Modificado em: | |Data/Hora + +s|Modificado por: | |Relacionamento - Users + +s|Criado por: | |Relacionamento - Users + +s|Descrição: | |Área de Texto + +s|Atribuído a: | |Relacionamento - Users + +s|Saudação: | |Lista de Opções + +s|Nome Próprio: | |Campo de texto + +s|Apelido: |Sim |Campo de texto + +s|Título: | |Campo de texto + +s|Departamento | |Campo de texto + +s|Não Telefonar: | |Caixa de verificação + +s|Telefone de Casa: | |Telefone + +s|Telemóvel | |Telefone + +s|Telefone de Trabalho: | |Telefone + +s|Outro Telefone: | |Telefone + +s|Fax: | |Telefone + +s|Endereço de Email | |Email + +s|Outro Endereço de Email: | |Email + +s|Email Inválido: | |Caixa de verificação + +s|Não receber email: | |Caixa de verificação + +s|Endereço Primário - Rua: | |Campo de texto + +s|Endereço Primário - Rua 2: | |Campo de texto + +s|Endereço Primário - Rua 3: | |Campo de texto + +s|Endereço Primário - Localidade: | |Campo de texto + +s|Endereço Primário - Estado: | |Campo de texto + +s|Endereço Primário - Código Postal: | |Campo de texto + +s|Endereço Primário - País: | |Campo de texto + +s|Endereço Alternativo - Rua: | |Campo de texto + +s|Endereço Alternativo - Rua 2: | |Campo de texto + +s|Endereço Alternativo - Rua 3: | |Campo de texto + +s|Endereço Alternativo - Localidade: | |Campo de texto + +s|Endereço Alternativo - Código Postal: | |Campo de texto + +s|Endereço Alternativo - País: | |Campo de texto + +s|Assistente: | |Campo de texto + +s|Telefone de Assistente: | |Telefone + +s|Data de Nascimento: | |Data + +s|Nome da Conta: | |Campo de texto +|==== + +== Lista de Campos de Contas + +[cols="25,10,25", width="60%", options="header"] +|==== +s|Etiqueta s|Obrigatório s|Tipo + +s|ID: |Sim |ID + +s|Nome: |Sim |Nome + +s|Criado em | |Data/Hora + +s|Modificado em | |Data/Hora + +s|Modificado por: | |Relacionamento - Users + +s|Descrição | |Área de Texto + +s|Eliminado: | |Caixa de verificação + +s|Utilizador Atribuído | |Relacionamento - Users + +s|Tipo: | |Lista de Opções + +s|Indústria: | |Lista de Opções + +s|Volume de Vendas | |Campo de texto + +s|Fax | |Telefone + +s|Endereço de Facturação - Rua: | |Campo de texto + +s|Endereço de Facturação - Rua 2: | |Campo de texto + +s|Endereço de Facturação - Rua 3: | |Campo de texto + +s|Endereço de Facturação - Rua 4: | |Campo de texto + +s|Endereço de Facturação - Localidade: | |Campo de texto + +s|Endereço de Facturação - Estado: | |Campo de texto + +s|Endereço de Facturação - Código Postal: | |Campo de texto + +s|Endereço de Facturação - País: | |Campo de texto + +s|Classificação: | |Campo de texto + +s|Telefone de Trabalho: | |Telefone + +s|Telefone alternativo: | |Telefone + +s|Website: | |URL + +s|Proprietários: | |Campo de texto + +s|Funcionários | |Campo de texto + +s|Símbolo da Bolsa | |Campo de texto + +s|Endereço de Envio - Rua: | |Campo de texto + +s|Endereço de Envio - Rua 2: | |Campo de texto + +s|Endereço de Envio - Rua 3: | |Campo de texto + +s|Endereço de Envio - Rua 4: | |Campo de texto + +s|Endereço de Envio - Localidade: | |Campo de texto + +s|Endereço de Envio - Estado: | |Campo de texto + +s|Endereço de Envio - Código Postal: | |Campo de texto + +s|Endereço de Envio - País: | |Campo de texto + +s|Endereço de Email: | |Email + +s|Outros Emails | |Email + +s|Código CAE: | |Campo de texto + +s|Membro De: | |Relacionamento - Contas + +s|Não receber email: | |Caixa de verificação + +s|Email Inválido: | |Caixa de verificação +|==== + +== Lista de Campos de Oportunidades + +image:Opportunities.png[Opportunities.png,title="Opportunities.png"] + +== Lista de Campos de Produtos + +image:Products.png[Products.png,title="Products.png"] + +== Lista de Campos de Categorias de Produto + +image:Product_Categories.png[Product_Categories.png,title="Product_Categories.png"] + +== Lista de Campos de Orçamentos + +image:Quotes.png[Quotes.png,title="Quotes.png"] + +== Lista de Campos de Facturas + +image:Invoices.png[Invoices.png,title="Invoices.png"] + +== Lista de Campos de Contratos + +image:Contracts.png[Contracts.png,title="Contracts.png"] + +== Lista de Campos de Items de Lista + +image:Line_Items.png[Line_Items.png,title="Line_Items.png"] + +== Lista de Campos de Groupos + +image:Groups.png[Groups.png,title="Groups.png"] + +== Lista de Campos de Modelos de PDF + +image:PDF_Templates.png[PDF_Templates.png,title="PDF_Templates.png"] + +== Lista de Campos de Ocorrências + +image:Cases.png[Cases.png,title="Cases.png"] + +== Lista de Campos de Notas + +image:Notes.png[Notes.png,title="Notes.png"] + +== Lista de Campos de Chamadas + +image:Calls.png[Calls.png,title="Calls.png"] + +== Lista de Campos de Emails + +image:Emails.png[Emails.png,title="Emails.png"] + +== Lista de Campos de Reuniões + +image:Meetings.png[Meetings.png,title="Meetings.png"] + +== Lista de Campos de Tarefas + +image:Tasks.png[Tasks.png,title="Tasks.png"] + +== Lista de Campos de Projectos + +image:Projects.png[Projects.png,title="Projects.png"] + +== Lista de Campos de Tarefas de Projecto + +image:Project_Tasks.png[Project_Tasks.png,title="Project_Tasks.png"] + +== Lista de Campos de Campanhas + +image:Campaigns.png[Campaigns.png,title="Campaigns.png"] + +== Lista de Campos de Listas de Targets + +image:Target_Lists.png[Target_Lists.png,title="Target_Lists.png"] + +== Lista de Campos de Modelos de Email + +image:Email_Templates.png[Email_Templates.png,title="Email_Templates.png"] + +== Lista de Campos de Documentos + +image:Documents.png[Documents.png,title="Documents.png"] + +== Lista de Campos de Eventos + +image:Events.png[Events.png,title="Events.png"] + +== Lista de Campos de Localizações + +image:Locations.png[Locations.png,title="Locations.png"] + +== Lista de Campos de Utilizadores + +image:Users.png[Users.png,title="Users.png"] + diff --git a/content/user/JJW Maps.pt.adoc b/content/user/JJW Maps.pt.adoc new file mode 100644 index 000000000..601ccdb5f --- /dev/null +++ b/content/user/JJW Maps.pt.adoc @@ -0,0 +1,17 @@ +--- +Title: JJW Maps +Weight: 290 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +:imagesdir: ./../../images/en/user + += JJW Maps + +JJW Maps fornece funcionalidades de mapeamento para o SuiteCRM. JJW Maps +é um módulo de terceira parte, desenvolvido por http://www.jjwdesign.com/[JJW Design]. + +Documentação e laçamentos são mantidos na +http://www.jjwdesign.com/google-maps-for-sugarcrm/[página de projecto de JJW Maps]. diff --git a/content/user/JJW Maps.ru.adoc b/content/user/JJW Maps.ru.adoc index bd67c0c29..745d84422 100644 --- a/content/user/JJW Maps.ru.adoc +++ b/content/user/JJW Maps.ru.adoc @@ -87,7 +87,7 @@ image:image6.png[Метки] Для создания метки выполните следующее: :: . В меню модуля *Метки* выберите пункт *Добавить метку*. Также метку можно добавить на ранее созданную карту, воспользовавшись -link:../introduction/user-interface/views/#_Субпанели[субпанелью] *Метки* в Форме просмотра карты. +link:../introduction/user-interface/views/#_субпанели[субпанелью] *Метки* в Форме просмотра карты. . Из списка меток выберите подходящую и разместите её на карте. При перемещении метки по карте автоматически определяются её географические координаты и ориентировочный адрес расположения. . Заполните необходимые поля и нажмите на кнопку {btn}[Сохранить]. @@ -101,7 +101,7 @@ image:image7.png[Участки карт] Для создания участка выполните следующее: :: . В меню модуля *Участки карт* выберите пункт *Создать участок*. Также участок можно добавить на ранее созданную карту, воспользовавшись -link:../introduction/user-interface/views/#_Субпанели[субпанелью] *Участки карт* в Форме просмотра карты. +link:../introduction/user-interface/views/#_субпанели[субпанелью] *Участки карт* в Форме просмотра карты. . На выбранном участке карты поставьте метки, для завершения создания участка нажмите на первой установленной метке. При необходимости площадь созданного участка можно изменить, перемещая метки участка по карте, при этом автоматически определяются их географические координаты. Воспользуйтесь кнопкой {btn}[Сбросить], если необходимо создать участок заново. . По окончании создания участка нажмите на кнопку {btn}[Использовать координаты участка карты]. . Заполните необходимые поля и нажмите на кнопку {btn}[Сохранить]. @@ -114,7 +114,7 @@ link:../introduction/user-interface/views/#_Субпанели[субпанел image:image8.png[Кэш адресов] Процесс геокодирования может быть настроен администратором SuiteCRM и детально описан в разделе -link:../../admin/administration-panel/google-maps/#_Геокодирование_адресов[Геокодирование адресов]. +link:../../admin/administration-panel/google-maps/#_геокодирование_адресов[Геокодирование адресов]. Здесь же при необходимости может быть осуществлён импорт геокодированных адресов, выполненный во внешнем приложении. Для этого в меню действий модуля выберите пункт *Импорт* и следуйте указаниям мастера импорта. == Управление записями в модулях карт @@ -122,9 +122,9 @@ link:../../admin/administration-panel/google-maps/#_Геокодирование В модулях карт вы можете выполнять следующие действия: * Сортировка списка записей, для этого нажмите на значок в заголовке сортируемого столбца, для обратной сортировки нажмите на значок ещё раз. -* Добавление записи в избранное – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. За дополнительной информацией обратитесь к разделу link:../introduction/user-interface/navigation-elements/#_Избранное[Избранное]. -* Редактирование или удаление информации сразу о нескольких записях, для этого используйте link:../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. -* link:../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт] записей, для этого в меню над выбранными записями выберите пункт *Экспортировать*. +* Добавление записи в избранное – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. За дополнительной информацией обратитесь к разделу link:../introduction/user-interface/navigation-elements/#_избранное[Избранное]. +* Редактирование или удаление информации сразу о нескольких записях, для этого используйте link:../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. +* link:../introduction/user-interface/record-management/#_экспорт_данных[Экспорт] записей, для этого в меню над выбранными записями выберите пункт *Экспортировать*. * Просмотр детальной информации о записи, для этого нажмите на названии записи в общем списке. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../introduction/user-interface/in-line-editing/[быструю правку]. * Дублирование записи, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих записей, вы можете изменить продублированную информацию с целью создания новой записи. diff --git a/content/user/Security Suite (Groups).adoc b/content/user/Security Suite (Groups).adoc index 54f57f727..5b07ced95 100644 --- a/content/user/Security Suite (Groups).adoc +++ b/content/user/Security Suite (Groups).adoc @@ -59,8 +59,8 @@ securitygroups_records table if doing a one-time initial setup. If your users should only typically see their own records then the role assigned to the group would be configured to have Owner only rights. A -manager who is a part of the group, but who should see be able to see -all records in the group would have a role directly assigned to you +manager who is a part of the group and who should also be able to see +all records in the group would have a role directly assigned to the manager's record that gives Group access. For more help check out this @@ -76,9 +76,8 @@ Roles determine what a user can do with a record once they have access to it. == A Typical Hierarchy Setup Although SecuritySuite can handle any organizational structure, the most -common scenario it is used for is one where the owner can see -everything, managers can see both their own records and those of their -team, and team members can only see their own records. +common scenario is one where the owner can see everything, managers can see both their +own records as well as those of their team, and team members can only see their own records. === The Scenario diff --git a/content/user/Security Suite (Groups).pt.adoc b/content/user/Security Suite (Groups).pt.adoc new file mode 100644 index 000000000..0d76b0ac1 --- /dev/null +++ b/content/user/Security Suite (Groups).pt.adoc @@ -0,0 +1,242 @@ +--- +Title: Security Suite (Groups) +Weight: 280 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +:imagesdir: ./../../images/en/user + += Security Suite (Groups) + +O Security Suite permite controlar o acesso dos utilizadores. Permite +retringir dados sensíveis presentes no SuiteCRM a equipas específicas +(grupos). +O SecuritySuite tem imensas opções de confirguração para se ajustar às +suas necessidades. Escolha um dos modos de atribuição automática para +garantir que os utilizadores acedem sempre aos dados que precisam. + +== Criação de Grupos + +Os Administradores do Sistema podem acresentar grupos e roles ou +definir as preferências de Grupos de Segurança nas Definições do +Security Suite no topo da página de administração. + +image:167Create_groups.png[title="Criação de Grupos"] + +== Permitir a criação de grupos por não administradores + +Os Administradores do Sistema podem permitir que utilizadores +não-administradores adicionem grupos a registos. Isto consegue-se do +seguinte modo: + +1. Navegue para Configurar Tabs. Acrescente Security Groups às tabs a mostrar. +2. Corra o Reparar Roles, dentro do Admin->Reparar, para poder atribuir +permissões aos Grupos de Segurança. +3. Edite o(s) role(s) para Permitir Gestão de Grupos de Segurança. +4. Edite o(s) role(s) para definir Todos ou Grupo na permissão de Listar da +Gestão de Grupos de Segurança, como desejado. + +== Configurar definições do SecuritySuite + +O SecuritySuite é muito configurável e suporta quase todas as situações. +Devido a esta característica a curva de aprendizagem pode ser mais íngreme e +necessitar de algum tempo para compreender o que cada opção faz e como pode +ser usada para os seus propósitos. Pode encontrar a página de configuração +através da página de Administração: Admin->SecuritySuite Settings. + +== Definição de Grupos + +Há 3 passos essenciais para definir Grupos de modo a que funcionem +correctamente. + +1. Criar um grupo para cada equipa de utilizadores e atribuir os utilizadores +ao grupo apropriado. +2. Criar um role e seleccionar Grupo como nível de acesso nas células apropriadas, +na grelha. Atribuir esse role a cada grupo +3. Acrescentar os grupos aos registos na sua instância do SuiteCRM. Pode usar a +opção "Atribuição em Massa" da vista de Lista para o conseguir. A partir daqui os +grupos serão herdados automaticamente de acordo com as definições do SecuritySuite. +Pode também usar logic hooks, workflow, ou fazer um insert directo à tabela +securitygroups_records da base de dados se o fizer na instalação. + +Se os seus utilizadores devem ver apenas os seus registos, o role atribuído ao +grupo deverá ser configurado para ter direitos de Apenas Dono. Um gestor que +faça parte do grupo, mas que também deverá ter permissões para ver todos os +registos além dos seus deve ter um role directamente atribuído ao registo que +permita acesso de Grupo. + +Para mais ajuda, veja este +https://www.youtube.com/watch?v=yJ-BzM3GTgA[Vídeo de Introdução^]. + +Os roles determinam o que um utilizador pode fazer com um registo a que tenham acesso. + +1. Criar os roles +2. Editar o(s) role(s) para permitr Gestão de Grupos de Segurança +3. Editar o(s) role(s) para definir Listar para Todos ou Grupo na Gestão de Grupos de Segurança conforme desejado + +== Uma definição hierárquica típica + +Apesar do SecuritySuite poder tratar de qualquer estrutura organizacional, o +cenário mais comum é quando existe um utilizador com permissões para +consultar todos os registos, gestores que podem ver todos os registos +da sua equipa e membros de equipa que podem apenas ver os seus registos. + +=== O Cenário + +Esta empresa tem duas equipas de vendas: Este e Oeste. A dona, Joana, deve +poder consultar todos os registos. A equipa Este é liderada pelo Guilherme +e a Oeste pela Sara. Ambos devem poder consultar todos os registos da sua +equipa, o Guilherme vê tudo sobre a equipa Este e a Sara tudo o que é +relacionado com a equipa Oeste. Os restantes membros das equipas só podem +ver os seus próprios registos. + +=== Definir os Grupos + +1. Criar um grupo chamado "Vendas Este" +2. Acrescentar a este grupo o Guilherme e os membros da equipa +3. Criar um grupo chamado "Vendas Oeste" +4. Acrescentar a este grupo a Sara e os membros da equipa + +=== Definir os Roles + +1. Criar um role chamado "Todos" e definir permissões para "Tudo"._Dica: +Clicar no cabeçalho de qualquer coluna na grelha de roles para poder +definir as permissões para toda a coluna ao mesmo tempo_ +2. Atribuir o role "Todos" directamente à conta do utilizador Joana +3. Criar um role chamado "Só Grupo" com permissões "Grupo" para todos +os módulos +4. Atribuir o role "Só Grupo" directamente aos utilizadores Guilherme e Sara +5. Criar um role chamado "Só Meus" com permissões "Dono" para todos os +módulos +6. Atribuir o role "Só Meus" aos grupos "Vendas Este" e "Vendas Oeste" + +=== Atribuir os Grupos + +Esta instância já tem algumas Leads por isso vamos associá-las aos grupos +apropriados. + +1. Vá à vista de lista de Leads e pesquise Leads que devam pertencer ao +grupo "Vendas Este" +2. Marque as Leads apropriadas e no painel de "Atribuição em Massa" +escolha "Vendas Este" e clique em "Atribuir" +3. Repetir para equipa de "Vendas Oeste" + +{{% notice note %}} +A partir daqui os grupos serão automaticamente herdados pelos novos +registos de Chamadas, Contactos, Notas, etc baseado nas definições +configuradas do SecuritySuite. Se, quando começar a usar o +SecuritySuite, a instância de SuiteCRM já incluir muitos registos +poderá necessitar de algum trabalho inicial para atribuir os grupos +aos registos relevantes. +Pode usar a funcionalidade de "Atribuição em Massa" da Vista de Lista +ou inserções directas na tabela securitygroups_records da base de +dados. Confira os dados existentes nessa tabela para entender a +formatação necessária. Esta última opção requer conhecimentos de SQL. +{{% /notice %}} + +=== Verificar as Definições + +Estas definições determinam como funciona o SecuritySuite. No painel de +"Regras de Herança de Grupos" os valores pré-definidos de +"Herdar do utilzador que criou", "Herdar do utilizador atribuído" e de +"Herdar de registo pai" servem perfeitamente para este cenário. + +Qualquer Lead que seja criada irá ter automaticamente atribuídos os +grupos baseado em quem a criou e a quem é atribuída. Se, posteriormente, +for criada uma Chamada para essa Lead, a Chamada irá herdar os grupos +atribuídos à Lead (registo pai) bem como os grupos do utilizador que a +criou e do que lhe for atribuído. + +Outra definição impostante é "Direitos Rigorosos". No cenário apresentado, +os valores pré-definidos irão fazer com que, na vista de Lista, os gestores +da equipa não consigam clicar nos links das Leads dos grupos. Em muitos +casos irá querer desmarcar esta opção para que a atribuição de grupos +funcione efectivamente como mostrado. + +=== É isso! + +A parte mais complicada é sempre a definição inicial. Após ter as +configurações definidas irá correr sem problemas. + +Tem uma estrutura mais complicada? Aplique os mesmos princípios aqui +enunciados para cada nível de hierarquia. O truque é criar os grupos +no nível mais baixo da estrutura e criar o resto de baixo para cima. + +== Opções Avançadas + +Os administradores de sistema do SuiteCRM podem configurar muitas opções +avançadas para o Security Suite. Isto permite controlar os diversos +acessos e permissões, herança de registos, filtros e mais. + +image:168Security_group_management.png[title="Advanced Options"] + +=== Direitos Aditivos + +O utilizador obtém os direitos mais abrangentes de todos os roles +atribuídos ao utilizador ou grupos a que pertence + +=== Direitos Rigorosos + +Se um utilizador for membro de diversos grupos, apenas as permissões do +grupo a que pertence o registo são relevantes. + +=== Popup Grupo de Novo utilizador + +Ao criar um novo utilizador mostrar um popup com os Grupos de Segurança +para atribuir o utilizador a um ou mais grupos. + +=== Precedência de Role de Utilizador + +Indica se os roles atribuídos directamente aos utilizadores têm +precedência sobre roles atribuídos a grupos. + +=== Filtrar Lista de Utilizadores + +Utilizadores não-administadores podem atribuir registos apenas a +utilizadores do(s) mesmo(s) grupo(s) + +=== Popup de Selecção de Grupo + +Quando um registo é criado por um utilizador que pertence a mais que um +grupo, apresentar um popup de selecção de grupo, ou, pelo contrário, +herda do grupo. As regras de herança só serão usadas para registos +criados pelo sistema (p.e. Workflows, etc). + +=== Usar Selecção de Grupo do Criador + +Acrescenta um painel ao écran de criação de registos se o utilizador +pertencer a mais que um grupo, para que o utilizador possa escolher a +que grupo pertence o registo a ser criado. Se um utilizador pertencer +apenas a um grupo, aplicam-se as regras normais de herança. + +{{% notice note %}} +O novo registo irá na mesma herdar do utilizador atribuído ou do +registo pai se estas opções estiverem definidas. Esta definição +apenas se sobrepõe a definição de utilizador criador. +{{% /notice %}} + +=== Herda do utilizador criador + +O registo irá herdar todos os grupos atribuídos ao utilizador que o criou. + +=== Herdar do utilizador atribuído + +O registo irá herdar todos os grupo do utilizador atribuído ao registo. +Outros grupos atribuídos ao registo NÃO serão removidos. + +=== Herda do Registo Pai + +p.e. Se um caso for aberto para um contacto, o caso irá herdar os grupos +associados ao contacto. + +=== Grupos padrão para Novos Registos + +Define grupos que terão que ser sempre atribuídos sempre que um +novo registo seja criado. + +=== Conta de recepção de email + +Apenas permite acesso a contas de recepção de email que pertençam ao +mesmo grupo que o utilizador. diff --git a/content/user/Security Suite (Groups).ru.adoc b/content/user/Security Suite (Groups).ru.adoc index 7658ca2c0..a08e29988 100644 --- a/content/user/Security Suite (Groups).ru.adoc +++ b/content/user/Security Suite (Groups).ru.adoc @@ -14,19 +14,19 @@ ifdef::env-github[:imagesdir: ./../../../master/static/images/ru/admin/Users] При помощи Групп пользователей можно осуществлять контроль доступа пользователей к записям системы. Каждая запись в системе может быть присвоена определённой группе (или нескольким группам) через соответствующую -link:../introduction/user-interface/views/#_Субпанели[субпанель] в Форме просмотра записи, либо через панель -link:../introduction/user-interface/record-management/#_Массовое_обновление_записей[Массового обновления] в Форме списка. В свою очередь каждой группе может быть назначено несколько -link:../../admin/administration-panel/users/#_Роли_и_группы_пользователей[Ролей]. Такой механизм позволяет достаточно гибко распределять права доступа на уровне отдельных записей системы. +link:../introduction/user-interface/views/#_субпанели[субпанель] в Форме просмотра записи, либо через панель +link:../introduction/user-interface/record-management/#_массовое_обновление_записей[Массового обновления] в Форме списка. В свою очередь каждой группе может быть назначено несколько +link:../../admin/administration-panel/users/#_роли_и_группы_пользователей[Ролей]. Такой механизм позволяет достаточно гибко распределять права доступа на уровне отдельных записей системы. image:image14.png[Добавление записи в группу] Например, если пользователям необходимо иметь доступ только к собственным записям, то они помещаются в группу, где действия над записями могут выполнять только ВЛАДЕЛЬЦЫ. Если в эту же группу входит менеджер, которому необходимо иметь доступ ко всем записям пользователей текущей группы, то ему дополнительно назначается отдельная Роль, имеющая соответствующие права. При этом в панели администратора в разделе -link:../../admin/administration-panel/users/#_Управление_Группами_пользователей[Управление Группами пользователей] должна быть включена опция *Приоритет ролей пользователя*. +link:../../admin/administration-panel/users/#_управление_группами_пользователей[Управление Группами пользователей] должна быть включена опция *Приоритет ролей пользователя*. Более детально пример настройки прав доступа рассматривается в -link:../../admin/administration-panel/users/#_Пример_настройки_прав_доступа[Руководстве администратора]. +link:../../admin/administration-panel/users/#_пример_настройки_прав_доступа[Руководстве администратора]. Если пользователям необходимо работать не только с СУЩЕСТВУЮЩИМИ группами, но и создавать НОВЫЕ группы, то это можно сделать в модуле *Группы пользователей*. Модуль доступен пользователям системы в том случае, если администратор SuiteCRM включил его отображение и настроил соответствующие Роли в -link:../../admin/administration-panel/users/#_Создание_Групп_пользователями_БЕЗ_административных_прав[панели администрирования]. +link:../../admin/administration-panel/users/#_создание_групп_пользователями_без_административных_прав[панели администрирования]. Создание и назначение Ролей доступно только администратору SuiteCRM. diff --git a/content/user/_index.pt.adoc b/content/user/_index.pt.adoc new file mode 100644 index 000000000..9c822ba55 --- /dev/null +++ b/content/user/_index.pt.adoc @@ -0,0 +1,11 @@ +--- +title: "Guia de Utilizador" +weight: 10 +pre: "1. " +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +=== Índice +{{% children depth="3" showhidden="false" %}} diff --git a/content/user/advanced-modules/Cases with Portal.ru.adoc b/content/user/advanced-modules/Cases with Portal.ru.adoc index c96fdf75f..068205510 100644 --- a/content/user/advanced-modules/Cases with Portal.ru.adoc +++ b/content/user/advanced-modules/Cases with Portal.ru.adoc @@ -29,7 +29,7 @@ link:../../core-modules/cases[Обращений] может быть интег == Настройка портала Настройка параметров портала со стороны SuiteCRM описана в разделе -link:../../../admin/administration-panel/advanced-openadmin/#_Настройка_портала[Настройка портала]. +link:../../../admin/administration-panel/advanced-openadmin/#_настройка_портала[Настройка портала]. Для установки в Joomla! скачанного расширения выполните следующее: @@ -54,7 +54,7 @@ image:image6.png[Создание пользователя портала] {{% notice note %}} Пункт *Создать пользователя портала* отображается только в том случае, если настроены -link:../../../admin/administration-panel/advanced-openadmin/#_Настройка_портала[параметры портала]. +link:../../../admin/administration-panel/advanced-openadmin/#_настройка_портала[параметры портала]. {{% /notice %}} После чего пользователь будет создан в Joomla!, а на E-mail контакта будут оправлены соответствующие учётные данные. @@ -67,7 +67,7 @@ image:image7.png[Создание обращения из портала] {{% notice note %}} Если необходимо отредактировать элементы полей со списками – сделайте это в -link:../../../admin/administration-panel/developer-tools/#_Редактор_комбобоксов[Редакторе комбобоксов] SuiteCRM, после чего *обязательно* почистите кэш в Joomla! +link:../../../admin/administration-panel/developer-tools/#_редактор_комбобоксов[Редакторе комбобоксов] SuiteCRM, после чего *обязательно* почистите кэш в Joomla! {{% /notice %}} Созданное в портале Обращение появится в перечне записей модуля *Обращения* SuiteCRM, где с ним можно продолжить работу. diff --git a/content/user/advanced-modules/Events.ru.adoc b/content/user/advanced-modules/Events.ru.adoc index cabc5ae0e..e489398a6 100644 --- a/content/user/advanced-modules/Events.ru.adoc +++ b/content/user/advanced-modules/Events.ru.adoc @@ -30,7 +30,7 @@ image:image1.png[Места] image:image2.png[События] Если у создаваемых событий отсутствует субпанель *Места*, то для указания нескольких мест для одного события необходимо в Студии добавить связь типа *многие-ко-многим*. Детальную информацию о связях между модулями вы можете посмотреть в разделе -link:../../../admin/administration-panel/developer-tools/#_Создание_и_редактирование_связей[Создание и редактирование связей]. +link:../../../admin/administration-panel/developer-tools/#_создание_и_редактирование_связей[Создание и редактирование связей]. == Создание записи о месте проведения события @@ -126,9 +126,9 @@ image:image9.png[Выбор статуса участников] В модуле вы можете выполнять следующие действия: * Сортировка списка записей, для этого нажмите на значок в заголовке сортируемого столбца, для обратной сортировки нажмите на значок ещё раз. -* Добавление записи в избранное – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. За дополнительной информацией обратитесь к разделу link:../../introduction/user-interface/navigation-elements/#_Избранное[Избранное]. -* Редактирование или удаление информации сразу о нескольких записях, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. -* link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт] записей, для этого в меню над выбранными записями выберите пункт *Экспортировать*. +* Добавление записи в избранное – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. За дополнительной информацией обратитесь к разделу link:../../introduction/user-interface/navigation-elements/#_избранное[Избранное]. +* Редактирование или удаление информации сразу о нескольких записях, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. +* link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт] записей, для этого в меню над выбранными записями выберите пункт *Экспортировать*. * Просмотр детальной информации о месте или событии, для этого нажмите на названии места или события в общем списке. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. * Дублирование информации о месте или событии, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих записей, вы можете изменить продублированную информацию с целью создания нового места или события. diff --git a/content/user/advanced-modules/KnowledgeBase.ru.adoc b/content/user/advanced-modules/KnowledgeBase.ru.adoc index 4d56b515f..4d640f419 100644 --- a/content/user/advanced-modules/KnowledgeBase.ru.adoc +++ b/content/user/advanced-modules/KnowledgeBase.ru.adoc @@ -62,12 +62,12 @@ image:image2.png[Категории статей базы знаний] Вы можете выполнять следующие действия: * Сортировка списка записей, для этого нажмите на значок в заголовке сортируемого столбца, для обратной сортировки нажмите на значок ещё раз. -* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_Избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. -* Редактирование или удаление информации сразу в нескольких записях, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. +* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. +* Редактирование или удаление информации сразу в нескольких записях, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. * Просмотр детальной информации по записи, для этого нажмите на названии статьи или категории в общем списке. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. * Дублирование информации, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих записей, вы можете изменить продублированную информацию с целью создания новой записи. -* link:../../introduction/user-interface/record-management/#_Объединение_дублирующихся_записей[Объединение дубликатов], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт *Объединить*. +* link:../../introduction/user-interface/record-management/#_объединение_дублирующихся_записей[Объединение дубликатов], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт *Объединить*. * Удаление записи, для этого нажмите на кнопку {btn}[Удалить]. * Отслеживание изменений введённой информации, для этого нажмите на кнопку {btn}[Просмотр журнала изменений] в форме просмотра. Если в журнале необходимо изменить перечень контролируемых полей - сделайте это в Студии, настроив параметр link:../../../admin/administration-panel/developer-tools/#Audit[*Аудит*] соответствующего поля. * Поиск информации - используйте link:../../introduction/user-interface/search[Фильтры или Расширенные фильтры] в Форме списка модуля. diff --git a/content/user/advanced-modules/PDFTemplates.ru.adoc b/content/user/advanced-modules/PDFTemplates.ru.adoc index 0e32b78a6..fa5f2af60 100644 --- a/content/user/advanced-modules/PDFTemplates.ru.adoc +++ b/content/user/advanced-modules/PDFTemplates.ru.adoc @@ -39,7 +39,7 @@ PDF-шаблон:: Укажите название создаваемого ша a|{{% notice note %}} При добавлении нового элемента в список комбобокса *_pdf_template_type_dom_* название добавляемого ключа должно совпадать с названием модуля на английском языке. В следующем примере в перечень добавляется пункт *Адресаты*. + Детальная информация о добавлении нового элемента в комбобокс описана в разделе -link:../../../admin/administration-panel/developer-tools/#_Редактор_комбобоксов[Редактор комбобоксов]. +link:../../../admin/administration-panel/developer-tools/#_редактор_комбобоксов[Редактор комбобоксов]. {{% /notice %}} |image:image2.png[Добавление нового элемента в список комбобокса] |=== @@ -107,9 +107,9 @@ image:image10.png[Отправить по почте в виде PDF] В модуле вы можете выполнять следующие действия: :: * Поиск шаблона - используйте link:../../introduction/user-interface/search[Фильтры или Расширенные фильтры] в Форме списка модуля. -* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_Избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. -* link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт] шаблонов, для этого в форме списка выберите необходимые записи и в меню над выбранными записями выберите пункт *Экспортировать*. -* Редактирование или удаление информации сразу о нескольких шаблонах, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. +* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. +* link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт] шаблонов, для этого в форме списка выберите необходимые записи и в меню над выбранными записями выберите пункт *Экспортировать*. +* Редактирование или удаление информации сразу о нескольких шаблонах, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. * Просмотр детальной информации о шаблоне, для этого нажмите на названии шаблона в общем списке. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. * Дублирование шаблона, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих записей, вы можете изменить продублированную информацию с целью создания нового шаблона. diff --git a/content/user/advanced-modules/Reports.adoc b/content/user/advanced-modules/Reports.adoc index 53f26f6e2..47e5a22a1 100644 --- a/content/user/advanced-modules/Reports.adoc +++ b/content/user/advanced-modules/Reports.adoc @@ -43,35 +43,35 @@ configure for those fields: * *Display* – True or false option. Allows you to specify whether this field should be displayed on the report, or hidden. Users may wish to add fields to perform a function/sort/group/total but may not wish to -show this on the Report.
+show this on the Report. * *Link* – True or false option. Allows you to make the field a link. Setting this option to true will hyperlink the field on the Detail View of the report, allowing you to click on the record. This will navigate you to the appropriate record. For example, linking the Opportunity Name -will take you to the Detail View of that Opportunity.
+will take you to the Detail View of that Opportunity. * *Label* – This is the label that will be displayed for the Column/Field on the Report. You can change the label from the default to any -alphanumerical value.
+alphanumerical value. * *Function* - Provides five options: Count, Minimum, Maximum, Sum and Average. Allows you to perform functions on alphanumerical fields. Users may wish to calculate the average Opportunity Amount, or Count total -Opportunities at a given Sales Stage.
+Opportunities at a given Sales Stage. * *Sort* – Ascending or Descending. Allows you to select whether to sort the field/column descending or ascending. This can be done for all -fields.
+fields. * *Group* – True or false option. Allows you to group by this field. For example, you may wish to group by Sales Stage when reporting on an -Opportunity.
+Opportunity. * *Total* – Provides three options: Count, Sum and Average. This allows users to perform total calculations on numerical fields. This is useful for financial reporting such as the total value of all Opportunities at -a given Sales Stage.
+a given Sales Stage. [discrete] ===== Adding Conditions diff --git a/content/user/advanced-modules/Reports.ru.adoc b/content/user/advanced-modules/Reports.ru.adoc index 01bdebc4f..f1d1c9796 100644 --- a/content/user/advanced-modules/Reports.ru.adoc +++ b/content/user/advanced-modules/Reports.ru.adoc @@ -66,7 +66,7 @@ image:image4.png[Тестовый пример-2] === Добавление условий Для добавления условий в отчёт нажмите на кнопку {btn}[Условия] и переместите желаемые поля в область конструктора условий. Перечень параметров, который можно настроить для поля, зависит от типа добавляемого в условия поля. Детальная информация о доступных параметрах описана в разделе -link:../workflow/#_Условия_выполнения_процесса[Условия выполнения процесса]. +link:../workflow/#_условия_выполнения_процесса[Условия выполнения процесса]. На примере предыдущего рисунка добавим в отчёт следующие условия: @@ -114,7 +114,7 @@ image:image8.png[Добавление диаграмм-графики] == Отображение отчётов в дашлетах Напомним, что на основной закладке SuiteCRM может отображаться несколько аналогичных -link:../../introduction/user-interface/home-page/#_Управление_дашлетами[дашлетов] в различной конфигурации, что позволяет отобразить множество отчётов с различными диаграммами. +link:../../introduction/user-interface/home-page/#_управление_дашлетами[дашлетов] в различной конфигурации, что позволяет отобразить множество отчётов с различными диаграммами. Для добавления дашлета перейдите на основную закладку SuiteCRM, в меню *Действия* нажмите на кнопку {btn}[Добавить дашлет] и выберите дашлет *Отчёты*. @@ -145,7 +145,7 @@ image:image11.png[Отчёты по расписанию] Отчёт:: Укажите отчёт, на основе правил которого будет создаваться отчёт по расписанию Расписание:: Укажите время и периодичность рассылки отчёта. Данные могут рассылаться ежедневно, еженедельно или ежемесячно. При необходимости расписание можно указать в link:https://ru.wikipedia.org/wiki/Cron#crontab[crontab^]-нотации. Получатели:: Укажите электронные адреса, на которые будет осуществляться рассылка. Можно указать произвольный адрес, пользователя системы, Группу пользователей или пользователей Роли на адреса которых будут отправлены данные. Детальная информация о Ролях и Группах пользователей описана в разделе -link:../../../admin/administration-panel/users/#_Роли_и_группы_пользователей[Роли и группы пользователей]. +link:../../../admin/administration-panel/users/#_роли_и_группы_пользователей[Роли и группы пользователей]. Описание:: Краткое описание отчёта. Вы всегда можете посмотреть время последнего запуска отчёта, просмотрев субпанель *Отчёт по расписанию* соответствующего отчёта. @@ -154,9 +154,9 @@ link:../../../admin/administration-panel/users/#_Роли_и_группы_пол В модуле вы можете выполнять следующие действия: * Сортировка списка записей, для этого нажмите на значок в заголовке сортируемого столбца, для обратной сортировки нажмите на значок ещё раз. -* Добавление записи в избранное – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. За дополнительной информацией обратитесь к разделу link:../../introduction/user-interface/navigation-elements/#_Избранное[Избранное]. -* Редактирование или удаление информации сразу о нескольких отчётах, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. -* link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт] записей, для этого в меню над выбранными записями выберите пункт *Экспортировать*. +* Добавление записи в избранное – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. За дополнительной информацией обратитесь к разделу link:../../introduction/user-interface/navigation-elements/#_избранное[Избранное]. +* Редактирование или удаление информации сразу о нескольких отчётах, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. +* link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт] записей, для этого в меню над выбранными записями выберите пункт *Экспортировать*. * Сохранить в PDF, для этого в меню действий Формы просмотра отчёта выберите аналогичный пункт. * Просмотр детальной информации об отчёте, для этого нажмите на названии отчёта в общем списке. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. diff --git a/content/user/advanced-modules/Reschedule.ru.adoc b/content/user/advanced-modules/Reschedule.ru.adoc index bae7d2a1a..8eeb6188a 100644 --- a/content/user/advanced-modules/Reschedule.ru.adoc +++ b/content/user/advanced-modules/Reschedule.ru.adoc @@ -21,7 +21,7 @@ link:../../core-modules/calls[звонок] по какой-либо причи image:image9.png[Отложенные звонки-меню] По умолчанию предлагается всего две причины переноса звонка, но, при необходимости, вы можете расширить этот список в Студии, дополнив соответствующее поле со списком (call_reschedule_dom) необходимыми элементами. За дополнительной информацией об изменении полей со списками обратитесь к разделу -link:../../../admin/administration-panel/developer-tools/#_Редактор_комбобоксов[Редактор комбобоксов]. +link:../../../admin/administration-panel/developer-tools/#_редактор_комбобоксов[Редактор комбобоксов]. image:image10.png[Фиксация отложенного звонка] diff --git a/content/user/advanced-modules/Sales.ru.adoc b/content/user/advanced-modules/Sales.ru.adoc index 8c4d6d515..77c0ff721 100644 --- a/content/user/advanced-modules/Sales.ru.adoc +++ b/content/user/advanced-modules/Sales.ru.adoc @@ -32,7 +32,7 @@ ifdef::env-github[:btn:] image:image1.png[Товары] При необходимости вы можете внести дополнительную информацию о товаре, -link:../../../admin/administration-panel/developer-tools/#_Создание_и_редактирование_полей[добавив требуемые поля через Студию]. При большом количестве товаров весь перечень может быть разбит на категории (см. ниже). +link:../../../admin/administration-panel/developer-tools/#_создание_и_редактирование_полей[добавив требуемые поля через Студию]. При большом количестве товаров весь перечень может быть разбит на категории (см. ниже). === Создание записи о товаре @@ -49,7 +49,7 @@ image:image2.png[Создание записи о товаре] Артикул:: Укажите артикул товара. Тип:: Может быть представлен в виде товара или услуги. Валюта:: Укажите необходимую валюту. Перечень валют может быть настроен в панели администрирования, детальная информация описана в разделе -link:../../../admin/administration-panel/system/#_Валюта[Валюта]. +link:../../../admin/administration-panel/system/#_валюта[Валюта]. Себестоимость:: Укажите себестоимость товара. Цена по прайсу:: Укажите розничную стоимость товара. Контакт:: При необходимости укажите контакт, связанный с информацией о товаре. @@ -75,11 +75,11 @@ image:image3.png[Категории товаров] Поиск товара:: Используйте link:../../introduction/user-interface/search[Фильтры или Расширенные фильтры] в Форме списка модуля. -Добавление записи в link:../../introduction/user-interface/navigation-elements/#_Избранное[избранное]:: Пользователь получает возможность быстрого доступа к наиболее важной для него информации. +Добавление записи в link:../../introduction/user-interface/navigation-elements/#_избранное[избранное]:: Пользователь получает возможность быстрого доступа к наиболее важной для него информации. -link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт] записей о товарах:: Для этого в форме списка выберите необходимые записи и в меню над выбранными записями выберите пункт *Экспортировать*. +link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт] записей о товарах:: Для этого в форме списка выберите необходимые записи и в меню над выбранными записями выберите пункт *Экспортировать*. Редактирование или удаление информации сразу о нескольких товарах:: Для этого используйте -link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. +link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. Просмотр детальной информации по товару:: Для этого нажмите на названии товара в общем списке. Редактирование данных:: Для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. @@ -88,7 +88,7 @@ link:../../introduction/user-interface/in-line-editing/[быструю прав Отслеживание изменений введённой информации:: Для этого нажмите на кнопку {btn}[Просмотр журнала изменений] в форме просмотра. Если в журнале необходимо изменить перечень контролируемых полей - сделайте это в Студии, настроив параметр link:../../../admin/administration-panel/developer-tools/#Audit[*Аудит*] соответствующего поля. Просмотр и редактирование связанной с товаром информации:: Для этого воспользуйтесь -link:../../introduction/user-interface/views/#_Субпанели[субпанелями]. +link:../../introduction/user-interface/views/#_субпанели[субпанелями]. == Предложения @@ -106,10 +106,10 @@ image:image5.png[Создание предложения] Предложение:: Укажите название предложения. Номер предложения:: Присваивается автоматически, предварительно настроить нумерацию можно в -link:../../../admin/administration-panel/advanced-openadmin/#_Настройка_модулей_продаж[панели Администрирования]. +link:../../../admin/administration-panel/advanced-openadmin/#_настройка_модулей_продаж[панели Администрирования]. Сделка:: Выберите сделку, связанную с текущим предложением. Стадия предложения:: Из выпадающего списка выберите стадию предложения. Если необходимая стадия отсутствует в списке – она может быть добавлена через Студию. За дополнительной информацией об изменении полей со списками обратитесь к разделу -link:../../../admin/administration-panel/developer-tools/#_Редактор_комбобоксов[Редактор комбобоксов]. +link:../../../admin/administration-panel/developer-tools/#_редактор_комбобоксов[Редактор комбобоксов]. Действительно до:: Укажите дату, до которой предложение будет действительно. Статус предложения:: Меняется автоматически при <>. Ответственный(ая):: Выберите ответственного за текущее предложение. @@ -119,7 +119,7 @@ link:../../../admin/administration-panel/developer-tools/#_Редактор_ко Контакт / Контрагент:: Контакт и контрагент, связанные с текущим предложением. При выборе контрагента адресные поля автоматически заполняются данными выбранного контрагента. [start=3] - . В средней части Формы редактирования при необходимости заполните адресные данные ( расчётный и отгрузочный адреса) + . В средней части Формы редактирования при необходимости заполните адресные данные (расчётный и отгрузочный адреса) === Добавление позиций в предложение @@ -133,7 +133,7 @@ image:image6.png[Добавление позиций в предложение] {{% notice note %}} Возможность создания групп позиций доступна только в том случае, если в -link:../../../admin/administration-panel/advanced-openadmin/#_Настройка_модулей_продаж[панели Администрирования] включена опция *Возможность группировки позиций*. +link:../../../admin/administration-panel/advanced-openadmin/#_настройка_модулей_продаж[панели Администрирования] включена опция *Возможность группировки позиций*. {{% /notice %}} === Управление предложениями @@ -143,11 +143,11 @@ link:../../../admin/administration-panel/advanced-openadmin/#_Настройка Поиск предложения:: Используйте link:../../introduction/user-interface/search[Фильтры или Расширенные фильтры] в Форме списка модуля. -Добавление записи в link:../../introduction/user-interface/navigation-elements/#_Избранное[избранное]:: Пользователь получает возможность быстрого доступа к наиболее важной для него информации. +Добавление записи в link:../../introduction/user-interface/navigation-elements/#_избранное[избранное]:: Пользователь получает возможность быстрого доступа к наиболее важной для него информации. -link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт] записей о предложениях:: Для этого в форме списка выберите необходимые записи и в меню над выбранными записями выберите пункт *Экспортировать*. +link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт] записей о предложениях:: Для этого в форме списка выберите необходимые записи и в меню над выбранными записями выберите пункт *Экспортировать*. Редактирование или удаление информации сразу о нескольких предложениях:: Для этого используйте -link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. +link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. Просмотр детальной информации по предложению:: Для этого нажмите на названии предложения в общем списке. Редактирование данных:: Для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. @@ -156,9 +156,9 @@ link:../../introduction/user-interface/in-line-editing/[быструю прав Отслеживание изменений введённой информации:: Для этого нажмите на кнопку {btn}[Просмотр журнала изменений] в форме просмотра. Если в журнале необходимо изменить перечень контролируемых полей - сделайте это в Студии, настроив параметр link:../../../admin/administration-panel/developer-tools/#Audit[*Аудит*] соответствующего поля. Просмотр и редактирование связанной с предложением информации:: Для этого воспользуйтесь -link:../../introduction/user-interface/views/#_Субпанели[субпанелями]. +link:../../introduction/user-interface/views/#_субпанели[субпанелями]. Поиск дубликатов:: Для этого в меню действий Формы просмотра выберите пункт *Поиск дубликатов*. Подробно процесс поиска схожих записей описан в разделе -link:../../introduction/user-interface/record-management/#_Объединение_дублирующихся_записей[Объединение дублирующихся записей]. +link:../../introduction/user-interface/record-management/#_объединение_дублирующихся_записей[Объединение дублирующихся записей]. [discrete] ==== Также через меню действий доступно множество дополнительных функций, в том числе: @@ -173,9 +173,9 @@ link:../../core-modules/emails[E-mail]. Создать сделку:: Создание сделки на основе данных текущего предложения. Более детальная информация о Сделках описана в разделе link:../../core-modules/opportunities[Сделки]. Создать договор:: Создание договора на основе данных текущего предложения. Более детальная информация о Договорах описана в разделе -link:../../advanced-modules/sales/#_Договоры[Договоры].[[convert-to-invoices]] +link:../../advanced-modules/sales/#_договоры[Договоры].[[convert-to-invoices]] Преобразовать в счёт:: Создание счета на основе данных текущего предложения, при этом статус предложения будет автоматически изменён на *Преобразовано в счёт*. Более детальная информация о Счетах описана в разделе -link:../../advanced-modules/sales/#_Счета[Счета]. +link:../../advanced-modules/sales/#_счета[Счета]. == Счета @@ -187,14 +187,14 @@ image:image8.png[Счета] === Создание счета Счёт может быть как преобразован из ранее созданного -link:../../advanced-modules/sales/#_Предложения[Предложения], так и создан с нуля. Для создания счета выполните следующее: +link:../../advanced-modules/sales/#_предложения[Предложения], так и создан с нуля. Для создания счета выполните следующее: . В меню модуля *Счета* выберите опцию *Создать счёт*. . В верхней части Формы редактирования заполните поля, содержащие общую информацию о счёте: Счёт:: Укажите название счёта. Номер счёта:: Присваивается автоматически, предварительно настроить нумерацию можно в -link:../../../admin/administration-panel/advanced-openadmin/#_Настройка_модулей_продаж[панели Администрирования]. +link:../../../admin/administration-panel/advanced-openadmin/#_настройка_модулей_продаж[панели Администрирования]. Номер предложения:: Укажите номер Предложения, если создаваемый счёт связан с каким-либо коммерческим предложением. Крайний срок платежа:: Укажите дату, после которой выставленный счёт перестанет быть актуальным. @@ -222,7 +222,7 @@ image:image10.png[Добавление позиций в счёт] {{% notice note %}} Возможность создания групп позиций доступна только в том случае, если в -link:../../../admin/administration-panel/advanced-openadmin/#_Настройка_модулей_продаж[панели Администрирования] включена опция *Возможность группировки позиций*. +link:../../../admin/administration-panel/advanced-openadmin/#_настройка_модулей_продаж[панели Администрирования] включена опция *Возможность группировки позиций*. {{% /notice %}} === Управление счетами @@ -232,11 +232,11 @@ link:../../../admin/administration-panel/advanced-openadmin/#_Настройка Поиск счёта:: Используйте link:../../introduction/user-interface/search[Фильтры или Расширенные фильтры] в Форме списка модуля. -Добавление записи в link:../../introduction/user-interface/navigation-elements/#_Избранное[избранное]:: Пользователь получает возможность быстрого доступа к наиболее важной для него информации. +Добавление записи в link:../../introduction/user-interface/navigation-elements/#_избранное[избранное]:: Пользователь получает возможность быстрого доступа к наиболее важной для него информации. -link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт] счетов:: Для этого в форме списка выберите необходимые записи и в меню над выбранными записями выберите пункт *Экспортировать*. +link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт] счетов:: Для этого в форме списка выберите необходимые записи и в меню над выбранными записями выберите пункт *Экспортировать*. Редактирование или удаление информации сразу о нескольких счетах:: Для этого используйте -link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. +link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. Просмотр детальной информации о счёте:: Для этого нажмите на названии контакта в общем списке. Редактирование данных:: Для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. @@ -245,9 +245,9 @@ link:../../introduction/user-interface/in-line-editing/[быструю прав Отслеживание изменений введённой информации:: Для этого нажмите на кнопку {btn}[Просмотр журнала изменений] в форме просмотра. Если в журнале необходимо изменить перечень контролируемых полей - сделайте это в Студии, настроив параметр link:../../../admin/administration-panel/developer-tools/#Audit[*Аудит*] соответствующего поля. Просмотр и редактирование связанной со счётом информации:: Для этого воспользуйтесь -link:../../introduction/user-interface/views/#_Субпанели[субпанелями]. +link:../../introduction/user-interface/views/#_субпанели[субпанелями]. Поиск дубликатов:: Для этого в меню действий Формы просмотра выберите пункт *Поиск дубликатов*. Подробно процесс поиска схожих записей описан в разделе -link:../../introduction/user-interface/record-management/#_Объединение_дублирующихся_записей[Объединение дублирующихся записей]. +link:../../introduction/user-interface/record-management/#_объединение_дублирующихся_записей[Объединение дублирующихся записей]. [discrete] ==== Также через меню действий доступно множество дополнительных функций, в том числе: @@ -270,7 +270,7 @@ image:image12.png[Договоры] === Создание договора Договор может быть как создан на основе ранее созданного -link:../../advanced-modules/sales/#_Предложения[Предложения], так и с нуля. Для создания договора выполните следующее: +link:../../advanced-modules/sales/#_предложения[Предложения], так и с нуля. Для создания договора выполните следующее: . В меню модуля *Договоры* выберите опцию *Создать договор*. . В верхней части Формы редактирования заполните поля, содержащие следующую информацию о договоре: @@ -283,18 +283,18 @@ image:image13.png[Создание договора] Дата начала:: Дата начала действия договора. Дата окончания:: Дата окончания действия договора. Уведомление об окончании срока действия:: Автоматически проставляется дата, рассчитанная на основании соответствующего параметра, указанного в -link:../../../admin/administration-panel/advanced-openadmin/#_Настройка_модулей_продаж[панели Администрирования]. При наступлении указанных даты и времени ответственному будет отправлено соответствующее уведомление. +link:../../../admin/administration-panel/advanced-openadmin/#_настройка_модулей_продаж[панели Администрирования]. При наступлении указанных даты и времени ответственному будет отправлено соответствующее уведомление. Ответственный(ая):: Выберите ответственного за текущий договор. Описание:: Введите краткое описание договора. Контакт / Контрагент:: Контакт и контрагент, связанные с текущим договором. Сделка:: Сделка, связанная с текущим договором. Тип договора:: По умолчанию типы договора отсутствуют, при необходимости, вы можете расширить этот список в Студии, дополнив соответствующее поле со списком (contract_type_list) необходимыми элементами. За дополнительной информацией об изменении полей со списками обратитесь к разделу -link:../../../admin/administration-panel/developer-tools/#_Редактор_комбобоксов[Редактор комбобоксов]. +link:../../../admin/administration-panel/developer-tools/#_редактор_комбобоксов[Редактор комбобоксов]. === Добавление позиций в договор В нижней части Формы редактирования выберите необходимые товары и услуги. Детальная информация о добавлении позиций была описана выше, см. раздел -link:../../advanced-modules/sales/#_Предложения[Предложения]. +link:../../advanced-modules/sales/#_предложения[Предложения]. === Управление договорами @@ -303,11 +303,11 @@ link:../../advanced-modules/sales/#_Предложения[Предложени Поиск договора:: Используйте link:../../introduction/user-interface/search[Фильтры или Расширенные фильтры] в Форме списка модуля. -Добавление записи в link:../../introduction/user-interface/navigation-elements/#_Избранное[избранное]:: Пользователь получает возможность быстрого доступа к наиболее важной для него информации. +Добавление записи в link:../../introduction/user-interface/navigation-elements/#_избранное[избранное]:: Пользователь получает возможность быстрого доступа к наиболее важной для него информации. -link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт] договоров:: Для этого в форме списка выберите необходимые записи и в меню над выбранными записями выберите пункт *Экспортировать*. +link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт] договоров:: Для этого в форме списка выберите необходимые записи и в меню над выбранными записями выберите пункт *Экспортировать*. Редактирование или удаление информации сразу о нескольких договорах:: Для этого используйте -link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. +link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. Просмотр детальной информации о договоре:: Для этого нажмите на названии контакта в общем списке. Редактирование данных:: Для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. @@ -316,9 +316,9 @@ link:../../introduction/user-interface/in-line-editing/[быструю прав Отслеживание изменений введённой информации:: Для этого нажмите на кнопку {btn}[Просмотр журнала изменений] в форме просмотра. Если в журнале необходимо изменить перечень контролируемых полей - сделайте это в Студии, настроив параметр link:../../../admin/administration-panel/developer-tools/#Audit[*Аудит*] соответствующего поля. Просмотр и редактирование связанной с договором информации:: Для этого воспользуйтесь -link:../../introduction/user-interface/views/#_Субпанели[субпанелями]. +link:../../introduction/user-interface/views/#_субпанели[субпанелями]. Поиск дубликатов:: Для этого в меню действий Формы просмотра выберите пункт *Поиск дубликатов*. Подробно процесс поиска схожих записей описан в разделе -link:../../introduction/user-interface/record-management/#_Объединение_дублирующихся_записей[Объединение дублирующихся записей]. +link:../../introduction/user-interface/record-management/#_объединение_дублирующихся_записей[Объединение дублирующихся записей]. [discrete] ==== Также через меню действий доступно несколько дополнительных функций, в том числе: diff --git a/content/user/advanced-modules/Workflow Calculated Fields.ru.adoc b/content/user/advanced-modules/Workflow Calculated Fields.ru.adoc index 4f444f465..a43317059 100644 --- a/content/user/advanced-modules/Workflow Calculated Fields.ru.adoc +++ b/content/user/advanced-modules/Workflow Calculated Fields.ru.adoc @@ -3,6 +3,7 @@ Title: Вычисления в полях процессов Weight: 245 --- +:author: likhobory :email: likhobory@mail.ru :toc: @@ -58,7 +59,7 @@ image:image16.png[Основные и связанные параметры] {{% notice info %}} Дополнительная информация о настройке ключей и видимых значений описана в разделе -link:../../../admin/administration-panel/developer-tools/#_Создание_стандартного_комбобокса[Создание стандартного комбобокса]. +link:../../../admin/administration-panel/developer-tools/#_создание_стандартного_комбобокса[Создание стандартного комбобокса]. {{% /notice %}} Для удаления параметра нажмите на кнопку справа от соответствующей записи. @@ -77,7 +78,7 @@ image:image17.png[Добавление основного параметра] {{% notice info %}} Дополнительная информация о связях описана в разделе -link:../../../admin/administration-panel/developer-tools/#_Создание_и_редактирование_связей[Создание и редактирование связей]. +link:../../../admin/administration-panel/developer-tools/#_создание_и_редактирование_связей[Создание и редактирование связей]. {{% /notice %}} Для добавления связанного параметра выберите модуль, связанный с контролируемым, затем в соседнем списке выберите необходимое поле и нажмите на кнопку {btn}[Добавить связанный параметр], после чего в таблице параметров появится соответствующая запись. @@ -92,7 +93,7 @@ image:image18.png[Добавление связанного параметра] {{% notice info %}} Дополнительная информация о настройке ключей и видимых значений описана в разделе -link:../../../admin/administration-panel/developer-tools/#_Создание_стандартного_комбобокса[Создание стандартного комбобокса]. +link:../../../admin/administration-panel/developer-tools/#_создание_стандартного_комбобокса[Создание стандартного комбобокса]. {{% /notice %}} == Добавление формулы вычисляемого поля @@ -1263,7 +1264,7 @@ $sugar_config['SweeterCalc']['DebugFileName'] = 'SweeterSyncDebug.log'; *Предварительная подготовка* Поскольку в стандартном модуле *Сделки* поле *Сроки выплат* отсутствует, необходимо предварительно создать и настроить необходимый функционал в -link:../../../admin/administration-panel/developer-tools/#_Редактор_комбобоксов[редакторе комбобоксов]. Создадим комбобокс с тремя элементами, в качестве ключа указывая необходимое количество месяцев: +link:../../../admin/administration-panel/developer-tools/#_редактор_комбобоксов[редакторе комбобоксов]. Создадим комбобокс с тремя элементами, в качестве ключа указывая необходимое количество месяцев: [cols=",",options="header"] |=== @@ -1279,7 +1280,7 @@ link:../../../admin/administration-panel/developer-tools/#_Редактор_ко {{% notice info %}} Детально работа с полями в Студии описана в разделе -link:../../../admin/administration-panel/developer-tools/#_Создание_и_редактирование_полей[Создание и редактирование полей]. +link:../../../admin/administration-panel/developer-tools/#_создание_и_редактирование_полей[Создание и редактирование полей]. {{% /notice %}} *Настройка процесса* @@ -1327,7 +1328,7 @@ image:image32.png[Форма просмотра тестовой сделки п *Предварительная подготовка* Поскольку в стандартном модуле *Контакты* поле *Льготная категория* отсутствует, необходимо предварительно создать и настроить необходимый функционал в -link:../../../admin/administration-panel/developer-tools/#_Редактор_комбобоксов[редакторе комбобоксов]. Создадим комбобокс с тремя элементами, в качестве ключа указывая номер категории: +link:../../../admin/administration-panel/developer-tools/#_редактор_комбобоксов[редакторе комбобоксов]. Создадим комбобокс с тремя элементами, в качестве ключа указывая номер категории: [cols=",",options="header"] |=== @@ -1343,18 +1344,18 @@ link:../../../admin/administration-panel/developer-tools/#_Редактор_ко {{% notice info %}} Детально работа с полями в Студии описана в разделе -link:../../../admin/administration-panel/developer-tools/#_Создание_и_редактирование_полей[Создание и редактирование полей]. +link:../../../admin/administration-panel/developer-tools/#_создание_и_редактирование_полей[Создание и редактирование полей]. {{% /notice %}} -Настройка процесса +*Настройка процесса* Настроим основные параметры процесса согласно таблице: [cols=",",options="!header"] |=== -a|*Процесс:* Любое название |Контролируемый модуль: Договоры - |*Статус:* Активен |Запускать: Только при сохранении записи - |*Запускать для:* Всех записей|Многократный запуск: Да +a|*Процесс:* Любое название |*Контролируемый модуль:* Договоры + |*Статус:* Активен |*Запускать:* Только при сохранении записи + |*Запускать для:* Всех записей|*Многократный запуск:* Да |=== Не будем добавлять в Процесс какие-либо условия, поскольку предполагается, что Процесс будет выполняться для всех Договоров. @@ -1381,3 +1382,94 @@ image:image34.png[Форма редактирования тестового к При сохранении Договора будет автоматически указана предоставляемая скидка: image:image35.png[Форма просмотра тестового контакта при расчёте скидки по договору] + +=== Добавление сообщения о преобразованном Предварительном контакте в список уведомлений + +*Сценарий* + +Допустим, после преобразования *Предварительного контакта* в *Контрагента* необходимо автоматически уведомлять об этом определённого пользователя SuiteCRM, но не по электронной почте, а через список пропущенных link:../../introduction/user-interface/desktop-notifications[уведомлений]. + +*Предварительная подготовка* + +В Студии для модуля *Контрагенты* добавляем новое текстовое поле, например - *internal_link*, в котором будет храниться ссылка на автоматически создаваемого Контрагента. Эта ссылка будет отображаться в окне уведомлений. + +image:image36.png[Добавление текстового поля в модуль Контрагенты] + +*Настройка процесса* + +Настроим основные параметры процесса согласно таблице: + +[cols=",",options="!header"] +|=== +a|*Процесс:* Любое название |*Контролируемый модуль:* Предварит. контакты + |*Статус:* Активен |*Запускать:* Всегда + |*Запускать для:* Изменяемых записей|*Многократный запуск:* Нет +|=== + +Процесс будет запускаться при изменении статуса Предварительного контакта на *Преобразован*. + + +[discrete] +==== Добавление условий + + . В разделе условий выполнения процесса нажимаем кнопку {btn}[Добавить условие]. + . Выбираем модуль *Предварит. контакты*, в списке полей выбираем значение *Преобразован*. + . В качестве оператора сравнения оставляем значение *Равно*, в поле *Тип* выбираем *Значение* и отмечаем чекбокс. + +Созданное условие должно выглядеть следующим образом: + +image:image37.png[Примеры процессов4-Добавление условий] + +[discrete] +==== Добавление действий + +Добавим два действия: первое - создаёт ссылку на созданного Контрагента, второе - создаёт уведомление, добавляет в него созданную ссылку и дополнительные данные. + +Нажмём на кнопку {btn}[Добавить действия] и из списка выберем пункт *Выполнить вычисления в полях*. + +В поле *Краткое описание действия* вводим соответствующее название, например: «Создание ссылки на Контрагента». + +В основных параметрах: + +* В разделе *Основные параметры* выбираем поле *ID контрагента* и нажимаем кнопку {btn}[Добавить основной параметр]. +* В разделе *Формулы* выбираем созданное ранее поле *internal_link* и нажимаем кнопку {btn}[Добавить формулу] + +В качестве текста формулы вводим: *index.php?module=Accounts&action=DetailView&record={P0}*. + +В конечном итоге первое действие будет выглядеть следующим образом: + +image:image38.png[Расчёт скидки по Договору-Добавление действий] + +Ещё раз нажмём на кнопку {btn}[Добавить действия] и из списка выберем пункт *Создать запись*. + +В поле *Краткое описание действия* вводим соответствующее название, например: «Добавление сообщения в Уведомления». + +В списке *Тип записи* выбираем модуль *Уведомления*. + +Добавим следующие поля согласно таблице: + +[cols="2,1s,2",options="header"] +|=== +a|Поле |Тип |Содержание + |*Ответственный(ая)* |Значение|Выбор пользователя, у которого будет отображаться уведомление. + |*Описание* |Значение|Текст описания. + |*Название* |Поле |Контрагент + |*Прочитано* |Значение|Нет + |*Тип* (выбираем ПЕРВОЕ поле)|Значение|Текст заголовка уведомления. + |*Тип* (выбираем ВТОРОЕ поле)|Значение|*info* или *warn* (один из двух типов уведомления) + |*Тип* (выбираем ТРЕТЬЕ поле)|Поле |*internal_link* +|=== + +В конечном итоге второе действие будет выглядеть следующим образом: + +image:image39.png[Примеры процессов4-Добавление действий] + +После преобразования Предварительного контакта в Контрагента у указанного в настройка Процесса ответственного появится новое уведомление, например: + +image:image40.png[Добавление нового уведомления со ссылкой на Контрагента] + +Нажав на заголовок сообщения, пользователь перейдёт к созданной записи. + +{{% notice tip %}} +При необходимости подобное уведомление можно создать https://community.suitecrm.com/t/how-to-create-notifications-by-using-workflows-logic-hooks/70809[программно^], используя link:../../../../developer/logic-hooks[logic hooks^]. +{{% /notice %}} diff --git a/content/user/advanced-modules/Workflow.adoc b/content/user/advanced-modules/Workflow.adoc index 288208ece..e167b6b66 100644 --- a/content/user/advanced-modules/Workflow.adoc +++ b/content/user/advanced-modules/Workflow.adoc @@ -36,22 +36,22 @@ example, when an Account is created/edited. to deactivate a Workflow without having to delete it. * *Run* – This controls the way the Workflow is triggered. + -[cols="20,80"] +[cols="20s,80"] |================================================================ -|*On Save* | The Workflow will run immediately for a given record when a save action occurs in the module specified. -|*On Scheduler* | The Workflow will be started from the Scheduler Job *Process Workflow Tasks*, +|On Save | The Workflow will run immediately for a given record when a save action occurs in the module specified. +|On Scheduler | The Workflow will be started from the Scheduler Job *Process Workflow Tasks*, the next time the job runs, and will apply to every record in the module, restricted by the *Run on* property and by the Workflow's conditions. -|*Always* | The Workflow will run on both the situations described above. +|Always | The Workflow will run on both the situations described above. |================================================================ + * *Run On* – This specifies the selection of records for which the Workflow will be executed. + -[cols="20,80"] +[cols="20s,80"] |================================================================ -|*New Records* | The Workflow will run only for new records being created. -|*Modified Records* | The Workflow will run only for records that were already created and are being changed. -|*All Records* | +|New Records | The Workflow will run only for new records being created. +|Modified Records | The Workflow will run only for records that were already created and are being changed. +|All Records a| - For *On Save* workflows, this means the Workflow will run for both new and modified records. + - For *On Scheduler* Workflows, this means the Workflow will go through every record in the module, even old ones that weren't changed. @@ -65,11 +65,11 @@ if your module has many records. These operations will run in the background, bu This allows you to control whether you want the Workflow actions to run only once for each record, or repeatedly, as the Worfklow is triggered again. + + -[cols="20,80"] +[cols="20s,80"] |================================================================ -|*Unchecked* | The Workflow will be blocked from running against any record that has already +|Unchecked | The Workflow will be blocked from running against any record that has already been handled by the current Workflow in the past. -|*Checked* | The Workflow will run against every record, regardless of whether that record has already +|Checked | The Workflow will run against every record, regardless of whether that record has already been handled by the current Workflow in the past. {{% notice tip %}} It is wise to consider whether there are enough restrictions in place so that this diff --git a/content/user/advanced-modules/Workflow.ru.adoc b/content/user/advanced-modules/Workflow.ru.adoc index 993cfbe7c..5519fc093 100644 --- a/content/user/advanced-modules/Workflow.ru.adoc +++ b/content/user/advanced-modules/Workflow.ru.adoc @@ -22,8 +22,8 @@ ifdef::env-github[:btn:] = Процессы -Данный модуль позволяет автоматически совершать различные действия при добавлении/изменении данных в системе, а также по расписанию -link:../../../admin/administration-panel/system/#_Планировщик[планировщика], настроенному в панели Администрирования. +Данный модуль позволяет автоматически совершать различные действия при добавлении/изменении данных в системе, а также при импорте записей и по расписанию +link:../../../admin/administration-panel/system/#_планировщик[планировщика], настроенному в панели Администрирования. image:image1.png[Процессы] @@ -49,10 +49,46 @@ image:image2.png[Создание процесса] Ответственный(ая):: Введите имя ответственного. По умолчанию ответственным являетесь вы. Для назначения другого пользователя нажмите кнопку и из появившегося списка выберите желаемого пользователя. Контролируемый модуль:: Список всех доступных модулей системы. Выберите необходимый модуль, при создании/изменении записи которого должен запускаться создаваемый Процесс. Статус:: Укажите статус Процесса. Выполняться будут только активные процессы. -Запускать:: Укажите условие запуска – *Всегда*, *Только при сохранении записи*, либо *Только в рабочее время*. В последнем случае должен быть настроен -link:../../../admin/administration-panel/advanced-openadmin/#_Настройка_графика_работы[график работы организации]. -Запускать для:: Процесс может запускаться для ВСЕХ записей, только для СОЗДАВАЕМЫХ записей, либо только для ИЗМЕНЯЕМЫХ записей. -Многократный запуск:: Многократный запуск процесса актуален в том случае, когда одно из указанный действий Процесса «сводит на нет» одно из указанных условий запуска Процесса. +Запускать:: Укажите условие запуска: + +[cols="1s,7",options="!header"] +|=== + |При сохранении записи |Процесс запускается при сохранении записи + |По заданию link:../../../admin/administration-panel/system/#_планировщик[планировщика] |Процесс запускается при соответствующей настройке планировщика (см. задание *Выполнять настроенные процессы / Process Workflow Tasks*) и выполняется для каждой записи указанного модуля, ограничиваясь лишь параметром *Запускать для* и настроенными условиями выполнения Процесса. + |Всегда |Процесс запускается для обоих случаев, описанных выше +|=== + +Запускать для:: Выбор типа записей, для которых будет выполняться Процесс, а именно: + +[cols="1s,7",options="!header"] +|=== + |Создаваемых записей + |Процесс запускается при создании записи + |Изменяемых записей |Процесс запускается при изменении уже существующей записи + |Всех записей +a| + * Если установлено условие *При сохранении записи*, то Процесс выполняется и для создаваемых, и для изменяемых записей + * Если установлено условие *По заданию планировщика*, то Процесс выполняется для *всех* существующих записей: и изменяемых, и неизменяемых, и создаваемых + +{{% notice tip %}} +Если Процесс выполняется *По заданию планировщика* для *Всех записей*, то эта операция может затянуться, если модуль содержит много записей. И хотя Процесс будет выполняться в фоновом режиме, в процессе выполнения задания могут потребляться значительные ресурсы сервера, поэтому лучше всего запускать подобные задания в нерабочее время. +{{% /notice %}} +|=== + +Многократный запуск:: При выполнении Процесс отслеживает каждую запись, к которой он уже был применён ранее. Этот параметр позволяет вам либо запускать действия Процесса только один раз для каждой записи, либо выполнять действия многократно, если по логике настроек требуется их повтор (см. таблицу ниже). + +[cols="1s,7",options="!header"] +|=== + |Параметр не установлен |Процесс будет остановлен, если запись только что была обработана в рамках текущего Процесса. + |Параметр установлен |Процесс будет запущен снова, вне зависимости от того, была ли запись только что обработана в рамках текущего Процесса. +{{% notice tip %}} +Рассмотрите вопрос о вводе ограничений, чтобы установленный параметр многократного запуска не приводил к постоянным перезапускам Процесса. +Например, настройте Процесс так, чтобы одно из указанных *действий* отменяло (прямо или косвенно) одно из указанных *условий*; или чтобы Процесс был настроен на конкретные записи, выполняясь при их создании/изменении/сохранении. +{{% /notice %}} +|=== + +Запускать при импорте:: Запуск Процесса при импорте записей в выбранный модуль. + Описание:: Введите краткое описание Процесса. === Условия выполнения процесса @@ -60,9 +96,9 @@ link:../../../admin/administration-panel/advanced-openadmin/#_Настройка [start=3] . В средней части Формы редактирования заполните условия выполнения Процесса. Создание условий доступно только после указания контролируемого модуля. -Нажмите на кнопку {btn}[Добавить условие] и введите необходимые данные.Количество добавляемых условий не ограничено. +Нажмите на кнопку {btn}[Добавить условие] и введите необходимые данные. Количество добавляемых условий не ограничено. -В следующем примере добавляется условие для модуля *Встречи* - процесс будет запущен в том случае, если тема встречи содержит слово *совещание*: +В следующем примере добавляется условие для модуля *Встречи* - процесс будет запущен в том случае, если тема встречи содержит только слово *совещание*: image:image3.png[Условия выполнения процесса] @@ -73,7 +109,7 @@ image:image3.png[Условия выполнения процесса] Оператор сравнения:: В зависимости от выбранного поля доступны различные операторы сравнения. Если поле НЕ содержит дату или цифровое значение, то доступны следующие операторы: *Равно*, *Не равно*, *Содержит*, *Начинается с*, *Оканчивается на*, *Пустое*. Если поле цифровое или содержит дату, то возможны следующие условия: *Равно*, *Не равно*, *Больше*, *Меньше*, *Больше или равно*, *Меньше или равно*, *Пустое*. {{% notice note %}} -Тип поля не всегда может соответствовать его названию. Например, в модуле *Контрагенты* стандартное поле *Число сотрудников* указано не как целочисленное, а как текстовое. Типы доступных полей модуля вы можете просмотреть в Студии. Тип ранее созданного поля в Студии изменить нельзя, но администратор SuiteCRM может создать link:../../../admin/administration-panel/developer-tools/#_Создание_и_редактирование_полей[новое поле] с требуемым типом и добавить его в макет соответствующей Формы. +Тип поля не всегда может соответствовать его названию. Например, в модуле *Контрагенты* стандартное поле *Число сотрудников* указано не как целочисленное, а как текстовое. Типы доступных полей модуля вы можете просмотреть в Студии. Тип ранее созданного поля в Студии изменить нельзя, но администратор SuiteCRM может создать link:../../../admin/administration-panel/developer-tools/#_создание_и_редактирование_полей[новое поле] с требуемым типом и добавить его в макет соответствующей Формы. {{% /notice %}} Тип:: Тип условия, в зависимости от типа выбранного поля доступны следующие варианты: @@ -159,7 +195,7 @@ image:image13.png[Указать заполняемые поля] {{% notice info %}} Детальная информация о Ролях и Группах описана в разделе -link:../../../admin/administration-panel/users/#_Роли_и_группы_пользователей[Роли и группы пользователей]. +link:../../../admin/administration-panel/users/#_роли_и_группы_пользователей[Роли и группы пользователей]. {{% /notice %}} В указанном ниже примере создаётся запись в модуле *Задачи* со следующими заполненными полями: @@ -173,7 +209,7 @@ image:image14.png[Пример создания записи] ==== Изменение записи -В данном случае используется тот же функционал, что и при создании записи, но вместо создания новой записи происходит изменение уже существующей: могут быть изменены значения полей записи, добавлены связи с другими записями. +В данном случае используется тот же функционал, что и при создании записи, но вместо создания новой записи происходит изменение уже существующей: могут быть изменены значения полей записи, добавлены связи с другими записями. ==== Отправка E-mail @@ -181,6 +217,10 @@ image:image14.png[Пример создания записи] В данном случае выполнение Процесса приведёт к отправке на указанные адреса электронных писем, созданных на основе link:../../core-modules/emailtemplates[шаблонов]. Для отправки писем индивидуально каждому пользователю – отметьте соответствующую опцию, в противном случае каждый получатель будет видеть адресные данные всех указанных адресатов. +{{% notice note %}} +Письма всегда будут отправляться с системного почтового адреса. Указанные в профиле пользователя электронные адреса в этом случае не используются, поскольку Процесс может выполняться по заданию Планировщика, без привязки к конкретному пользователю. +{{% /notice %}} + image:image15.png[Отправка E-mail] При указании адресатов возможны следующие варианты: @@ -193,7 +233,7 @@ image:image15.png[Отправка E-mail] {{% notice info %}} Детальная информация о Ролях и Группах описана в разделе -link:../../../admin/administration-panel/users/#_Роли_и_группы_пользователей[Роли и группы пользователей]. +link:../../../admin/administration-panel/users/#_роли_и_группы_пользователей[Роли и группы пользователей]. {{% /notice %}} ==== Вычисления в полях @@ -215,17 +255,19 @@ image:image22.png[Удаление записи внутри действия] В нижней части Формы просмотра каждого процесса расположена субпанель *Контроль процесса*, отображающая информацию о выполнении текущего процесса, содержащую в том числе: название записи, запустившей процесс, статус выполнения процесса, дату и время выполнения процесса. image:image23.png[Контроль процесса] - + +Вы также можете просмотреть информацию о выполнении всех настроенных Процессов, выбрав пункт *Контроль процессов* в меню модуля *Процессы*. + == Управление информацией о процессах [discrete] ==== В модуле вы можете выполнять следующие действия: * Сортировка списка записей, для этого нажмите на значок в заголовке сортируемого столбца, для обратной сортировки нажмите на значок ещё раз. -* Добавление записи в избранное – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. За дополнительной информацией обратитесь к разделу link:../../introduction/user-interface/navigation-elements/#_Избранное[Избранное]. -* Редактирование или удаление информации сразу о нескольких процессах, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. -* link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт] записей, для этого в меню над выбранными записями выберите пункт *Экспортировать*. -* link:../../introduction/user-interface/record-management/#_Поиск_и_объединение_схожих_записей[Поиск дубликатов], для этого в меню действий Формы просмотра выберите пункт *Поиск дубликатов*.. +* Добавление записи в избранное – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. За дополнительной информацией обратитесь к разделу link:../../introduction/user-interface/navigation-elements/#_избранное[Избранное]. +* Редактирование или удаление информации сразу о нескольких процессах, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. +* link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт] записей, для этого в меню над выбранными записями выберите пункт *Экспортировать*. +* link:../../introduction/user-interface/record-management/#_поиск_и_объединение_схожих_записей[Поиск дубликатов], для этого в меню действий Формы просмотра выберите пункт *Поиск дубликатов*. * Просмотр детальной информации о процессе, для этого нажмите на названии процесса в общем списке. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. * Дублирование информации о процессе, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих записей, вы можете изменить продублированную информацию с целью создания нового процесса. @@ -270,9 +312,9 @@ image:image24.png[Примеры процессов1-Добавление усл image:image25.png[Примеры процессов1-Добавление действий] -=== Уведомление о поступивших обращениях +=== Уведомление по электронной почте о поступивших обращениях -В данном примере показано пошаговое создание процесса, автоматически отправляющего уведомления двум пользователям (ответственному за обращение и дополнительно указанному пользователю) в том случае, если открытое обращение не обновлялось в течение двух дней: +В данном примере показано пошаговое создание процесса, автоматически отправляющего уведомления на почту двум пользователям (ответственному за обращение и дополнительно указанному пользователю) в том случае, если открытое обращение не обновлялось в течение двух дней: . В модуле процессы выбираем действие *Создать процесс* . Присваиваем процессу подходящее название, например: «Напоминание об обращении». @@ -293,7 +335,7 @@ image:image25.png[Примеры процессов1-Добавление дей . В качестве оператора сравнения оставляем значение *Равно*, в поле *Тип* выбираем *Мультивыбор*. . В списке значений выбираем элементы, соответствующие открытому обращению, в данном случае это *Новое* и *Назначенное*. -Созданное условие должно выглядеть следующим образом. +Созданное условие должно выглядеть следующим образом: image:image26.png[Примеры процессов2-Добавление условий] @@ -365,8 +407,6 @@ image:image28.png[Примеры процессов3-Добавление усл . Появятся два дополнительных поля. В среднем поле выбираем *Поле*. . В крайнем правом поле выбираем Ответственный(ая)» - при этом создаётся связь между назначенным ответственным Предварительного контакта и звонком. -Созданные действия будут выглядеть следующим образом: +Созданные действия будут выглядеть следующим образом: image:image29.png[Примеры процессов3-Добавление действий] - - \ No newline at end of file diff --git a/content/user/core-modules/Accounts.pt.adoc b/content/user/core-modules/Accounts.pt.adoc new file mode 100644 index 000000000..52d00c86a --- /dev/null +++ b/content/user/core-modules/Accounts.pt.adoc @@ -0,0 +1,73 @@ +--- +Title: Contas +Weight: 70 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + += Contas + +O módulo Contas é um dos módulos base a partir do qual se podem criar +associações com a maioria dos registos no SuiteCRM. É possível criar um +relacionamento com Contactos, Leads Convertidas, Oportunidades, Actividades tais +como Emails ou Reuniões e Ocorrências. Por norma as Contas do SuiteCRM guardam +toda a informação sobre empresas e organizações com que a sua organização +interage. No mundo real, uma Conta pode ser uma entidade de negócio que seja um +Prospector Comercial, um Cliente, um Fornecedor ou um Vendedor e pode ser usada +para ir mantendo um registo das diversas interacções entre a sua organização e +essas entidades. + +== Accções de Contas + +Pode aceder às acções de contas a partir do menu do módulo de Contas ou através +da Sidebar. As acções disponíveis são as seguintes: + +* *Criar Conta* – Ao clicar, é apresentado um formulário que lhe permite criar +um novo registo de Conta. +* *Ver Contas* – Ao clicar, é-lhe apresentada a Vista de Lista do módulo de +Contas. Permite-lhe procurar e ver a lista de registos de Contas. +* *Importar Contas* – Apresenta-lhe o wizard de Importação para o módulo de +Contas. Para mais informação veja +link:./../../introduction/user-interface/record-management/#_importing_records[Importar + Registos]. + +Para ver a lista completa de campos ao criar uma Conta, Veja +link:./../../appendix-a/#_accounts_field_list[Lista de Campos de Contas]. + +== Gerir Contas + +* Para ordenar registos na Vista de Lista de Contas, clique em qualquer título +de coluna ordenável. Irá ordenar a coluna de modo ascendente ou descendente. +* Para procurar por uma Conta, veja a secção de +link:./../../introduction/user-interface/search[Pesquisa] deste guia. +* Para actualizar alguns ou todos os registos de Contas na Vista de Lista, use o +painel de Actualização em Massa tal como descrito na secção +link:./../../introduction/user-interface/record-management/#_mass_updating_records[Actualização +em Massa de Registos] deste guia. +* Para duplicar uma Conta, pode clicar o botão Duplicar na Vista de Detalhe e +depois guardar o registo duplicado. +* Para juntar registos duplicados, seleccione os registos na VIsta de Lista de +Contas, clique no link Juntar no menu pendente de acção, e siga o processo. Para +mais informação sobre Juntar Diplicados, veja a secção +link:./../../introduction/user-interface/record-management/#_merging_records[Juntar +Registos] deste guia. +* Para eliminar uma ou mais Contas, pode seleccionar vário registos a partir da +Vista de Lista e depois clicar em eliminar. Pode também eliminar uma Conta a +partir da Vista de Detalhe clicando no botão Deleted. Para um guia mais +detalhado sobre eliminação de registos, veja a secção +link:./../../introduction/user-interface/record-management/#_deleting_records[Eliminar +Registos] deste guia. +* Para ver os detalhes de uma Conta, clique no Nome da Conta na Vista de Lista. +Irá abrir o registo na Vista de Detalhe. +* Para editar os detalhes de uma Conta, clique no ícone de Editar na Vista de +Lista ou no botão de Editar na Vista de Detalhes, faça as alterações pretendidas +e clique em Guardar. +* Para um guia detalhado sobre a importação e exportação de Contas, vejas as +secções +link:./../../introduction/user-interface/record-management/#_importing_records[Importar +Registos] e +link:./../../introduction/user-interface/record-management/#_exporting_records[Exportar +Registos] deste guia. +* Para verificar todas as alterações feitas a campos auditados, pode clicar no +botão Ver Alterações das Vistas de Detalhe ou Edição das Contas. diff --git a/content/user/core-modules/Accounts.ru.adoc b/content/user/core-modules/Accounts.ru.adoc index b0a3ed96f..c017be0b2 100644 --- a/content/user/core-modules/Accounts.ru.adoc +++ b/content/user/core-modules/Accounts.ru.adoc @@ -30,7 +30,7 @@ image:image1.png[Контрагенты] Контрагенты :: Выберите эту опцию для просмотра существующих контрагентов. Создать контрагента :: Выберите эту опцию для создания нового контрагента. Импорт контрагентов :: Выберите эту опцию, если необходимо -link:../../introduction/user-interface/record-management/#_Импорт_данных[импортировать] информацию о контрагентах из внешнего приложения или файла. +link:../../introduction/user-interface/record-management/#_импорт_данных[импортировать] информацию о контрагентах из внешнего приложения или файла. @@ -47,7 +47,7 @@ image:image2.png[Создание контрагента] Рабочий тел.:: Введите рабочий телефон контрагента. Факс:: Введите номер факса. Другой тел.:: Введите номер другого телефона, если таковой имеется. По умолчанию данное поле отсутствует на странице, но может быть добавлено через -link:../../../admin/administration-panel/developer-tools/#_Студия[Студию]. +link:../../../admin/administration-panel/developer-tools/#_студия[Студию]. Сайт:: Введите адрес веб-сайта контрагента. Адресная информация:: Введите основной и (при необходимости) отгрузочный адреса. Для копирования данных основного адреса в поле *Отгрузочный адрес* отметьте опцию *Копировать адрес слева*. E-mail:: Введите адрес электронной почты контрагента. Чтобы добавить дополнительные адреса электронной почты, нажмите на кнопку с изображением плюса. Вы можете добавить несколько адресов электронной почты. @@ -81,21 +81,21 @@ SIC / ОКВЭД:: Введите стандартный отраслевой и В модуле вы можете выполнять следующие действия: :: * Сортировка списка записей, для этого нажмите на значок в заголовке сортируемого столбца, для обратной сортировки нажмите на значок ещё раз. * Поиск контрагента - используйте link:../../introduction/user-interface/search[Фильтры или Расширенные фильтры] в Форме списка модуля. -* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_Избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. -* link:../../introduction/user-interface/record-management/#_Импорт_данных[Импорт записей], для этого нажмите на кнопку {btn}[Импорт контрагентов], расположенную в меню модуля. +* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. +* link:../../introduction/user-interface/record-management/#_импорт_данных[Импорт записей], для этого нажмите на кнопку {btn}[Импорт контрагентов], расположенную в меню модуля. * Добавление контрагентов в список link:../targets[адресатов] – в Форме списка отметьте необходимые записи и выберите в меню действий пункт *Добавить в список адресатов*. * Добавление всех контактов контрагента в список link:../targets[адресатов] – в Форме списка отметьте необходимые записи и выберите в меню действий пункт *Добавить контакты в список адресатов*. * Создание документа в формате PDF - отметьте необходимые записи (если открыта Форма списка) и выберите в меню действий пункт *Создать письмо (PDF)*, либо сразу выберите этот пункт в меню, если открыта Форма просмотра записи, после чего выберите необходимый link:../../advanced-modules/pdftemplates[PDF-шаблон]. -* link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт записей], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт *Экспортировать*. -* link:../../introduction/user-interface/record-management/#_Объединение_дублирующихся_записей[Объединение дубликатов], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт *Объединить*. -* link:../../introduction/user-interface/record-management/#_Поиск_и_объединение_схожих_записей[Поиск дубликатов], для этого в меню действий Формы просмотра выберите пункт *Поиск дубликатов*. +* link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт записей], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт *Экспортировать*. +* link:../../introduction/user-interface/record-management/#_объединение_дублирующихся_записей[Объединение дубликатов], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт *Объединить*. +* link:../../introduction/user-interface/record-management/#_поиск_и_объединение_схожих_записей[Поиск дубликатов], для этого в меню действий Формы просмотра выберите пункт *Поиск дубликатов*. * Просмотр информации о выбранных записях в link:../../jjw-maps[картах Google], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт *Показать на карте*. -* Редактирование или удаление информации сразу о нескольких контрагентах, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. +* Редактирование или удаление информации сразу о нескольких контрагентах, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. * Просмотр детальной информации по контрагенту, для этого нажмите на названии контрагента в общем списке. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. * Дублирование информации о контакте, для этого в Форме просмотра записи нажмите на кнопку {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих записей с целью создания нового контрагента. * Удаление контрагента, для этого нажмите на кнопку {btn}[Удалить]. * Отслеживание изменений введённой информации, для этого нажмите на кнопку {btn}[Просмотр журнала изменений] в форме просмотра. Если в журнале необходимо изменить перечень контролируемых полей - сделайте это в Студии, настроив параметр link:../../../admin/administration-panel/developer-tools/#Audit[*Аудит*] соответствующего поля. -* Просмотр и редактирование связанной с контрагентом информации, для этого воспользуйтесь link:../../introduction/user-interface/views/#_Субпанели[субпанелями]. +* Просмотр и редактирование связанной с контрагентом информации, для этого воспользуйтесь link:../../introduction/user-interface/views/#_субпанели[субпанелями]. diff --git a/content/user/core-modules/Bugs.pt.adoc b/content/user/core-modules/Bugs.pt.adoc new file mode 100644 index 000000000..e4b3526a2 --- /dev/null +++ b/content/user/core-modules/Bugs.pt.adoc @@ -0,0 +1,107 @@ +--- +Title: Bugs +Weight: 195 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +:experimental: //// this is here to allow btn:[] syntax used below + +:imagesdir: /images/en/user + + += Bugs + +Use este módulo para descrever e acompanhar Bugs. Ao criar um registo de Bug, +pode descrever em maior detalhe o problema que causou +link:../cases[ocorrências], e descreva possíveis soluções na +link:../../advanced-modules/knowledgebase[Base de Conhecimento]. + +image:Bugs(Errors).png[Bugs] + +O que é descrito como Bug pode ser qualquer coisa: +podem estar associados a uma versão (ou modelo) de um produto tangível e a uma +versão de lançamento de um software. +Um utilizador com acesso administrativo pode alterar a lista de versões +disponíveis. +Após descrever o Bug, pode associá-lo a um pedido (na Vista de Detalhe, no +subpainel *da Aplicação*), e com a versão do produto (directamente no formulário +de Edição do Bug). + +{{% notice note %}} +Por padrão, este módulo está escondido, para o mostrar deverá contactar alguém +com acesso administrativo. +{{% /notice %}} + +Pode criar a descrição do Bug directamene no sistema ou importar a descrição a +partir de um ficheiro de texto, encontra mais informação sobre este tópico veja +a secção. +link:../../introduction/user-interface/record-management/#_importing_records[Importação +de Dados]. + +== Descrição do Bug + . No menu do módulo, seleccione *Reportar Bug* . + . Na página de descrição do Bug, complete os seguintes campos.: + +Assunto:: Indique o nome (curta descrição) do Bug. +Prioridade:: Escolha uma das prioridades apresentdas, da lista pendente, que +reflita a urgência da resolução do problema. +Estado:: Escolha o estado, da lista pendente. +Tipo:: Escolha o tipo da lista pendente: Bug ou Funcionalidade. +Fonte:: Da lista pendente, escolha a fonte da detecção do Bug. +Categoria:: Da lista pendente, seleccione a categoria com que este Bug pode +estar relacionado. + +{{% notice tip %}} +Todos os valores ​​das listas pendentes podem ser alterados se +necessário. Portanto, se houver necessidade de algum valor que lá não se +encontre, pode ser adicionado no Estúdio. Para mais informações sobre como +modificar as listas de opções, veja +link:../../../admin/administration-panel/developer-tools/[Editor de opções]. +{{% /notice %}} + +Detectado na versão :: Escolha a versão do produto em que este Bug foi detectado +a partir da lista pendente. + +image:Bugs Description.png[Descrição do Bug] + +Resolução:: Da lista pendente, escolha a resolução. +Resolvido na versão:: Escolha, da lista pendente, a versão do produto onde foi +resolvido este Bug.. +Nota:: A lista de versões pode ser confoigurada por utilizadores com acesso +administrativo. Para informações detalhadas, veja a secção +link:../../../developer/best-practices/[Controlo de Versões]. +Descrição :: Escreva uma descrição completa do problema. +Registo :: Indique as medidas tomadas para a resolução do problema. + +Atribuído a :: Indique a pessoa atribuída ao Bug. Por padrão, é-lhe atribuído. + +[start=3] + . Clique no botão btn:[Guardar] para guardar as informações recolhidas; + clique no botão btn:[Cancelar] para voltar à lista de sem guardar a informação. +Depois de guardar as informações do Bug, pode associá-lo com ocorrências novas +ou antigas, Contactos ou Contas. + +== Gestão de Bugs + +No módulo pode realizar as seguintes acções : + +* Ordenar a lista de registos. Para isto, clique no ícone no cabeçalho da coluna a ordenar. Para ordenar em ordem inversa, clique no ícone novamente. +* Editar ou eliminar informação relativa a vários Bugs ao mesmo tempo, através do link:../../introduction/user-interface/record-management/#_mass_updating_records[painel +de actualização em massa]. +* link:../../introduction/user-interface/record-management/#_importing_records[Importar] informação de Bugs, para o conseguir, clique no botão btn:[Importar], localizado +no menu do módulo. +* link:../../introduction/user-interface/record-management/#_merging_records[Juntar Duplicados], Para isto, seleccione os registos relevantes na Vista de Lista e +seleccione a opção *Combinar*. +* Ver informação detalhada acerca do Bug, para isso, clique no nome do Bug na Vista de Lista +* Editar dados, para isto clique no botão btn:[Corrigir], ou na Vista de Edição ou na Vista de Lista. Pode também executar a +link:../../introduction/user-interface/in-line-editing/[Edição rápida]. +* Duplicação da informação do Bug, para isto, seleccione btn:[Duplicar]. A duplicação é um modo conveniente de criar registos semelhantes, pode depois alterar a informação duplicada para criar a descrição de um novo Bug. +* Para eliminar um registo, clique no botão btn:[Eliminar]. +* Acompanhar as alterações à informação inserida. Para isso, clique no botão btn:[Ver Registo de Alterações] na vista de Detalhes. Se for necessário alterar os campos a acompanhar - fazer essa alteração no Estúdio alterando o parâmetro link:../../../admin/administration-panel/developer-tools/[*Аuditar*] do campo correspondente. +* link:../../introduction/user-interface/record-management/#_exporting_records[Exportar] informação de erros, para isso, seleccionar os registos necessários na vista de lista e seleccionar a opção *Exportar* no menu acima dos registos seleccionados. +* Ver e editar informação relaccionada com Bug, através dos link:../../introduction/user-interface/views/[Sub-panéis]. +* Arquivar os emails relacionados com o Bug actual. Para isto, use o botão btn:[Enviar o email para o arquivo] no sub-painel *História* . +* Procurar informação acerca dos Bugs - use os link:../../introduction/user-interface/search[Filtros ou Filtros Avançados] no formulário de lista do módulo. Para pesquisar apenas os seus registos, seleccione a opção *Os Meus registos*, para pesquisar Bugs activos (novos, atribuídos, à espera de decisão) marque a opção *Activos*. + diff --git a/content/user/core-modules/Bugs.ru.adoc b/content/user/core-modules/Bugs.ru.adoc index dfa28b3b5..98d034e50 100644 --- a/content/user/core-modules/Bugs.ru.adoc +++ b/content/user/core-modules/Bugs.ru.adoc @@ -32,7 +32,7 @@ image:image1.png[Ошибки] {{% /notice %}} Вы можете создать описание ошибки как непосредственно в системе, так и импортировать описание из текстового файла, более подробная информация на эту тему описана в разделе -link:../../introduction/user-interface/record-management/#_Импорт_данных[Импорт данных]. +link:../../introduction/user-interface/record-management/#_импорт_данных[Импорт данных]. == Описание ошибки . В меню модуля выберите пункт *Новая ошибка*. @@ -47,7 +47,7 @@ link:../../introduction/user-interface/record-management/#_Импорт_данн {{% notice tip %}} Все значения полей со списками при необходимости могут быть отредактированы. Так что если в выпадающем списке нет необходимого значения – оно может быть добавлено в Студии. За дополнительной информацией об изменении полей со списками обратитесь к разделу -link:../../../admin/administration-panel/developer-tools/#_Редактор_комбобоксов[Редактор комбобоксов]. +link:../../../admin/administration-panel/developer-tools/#_редактор_комбобоксов[Редактор комбобоксов]. {{% /notice %}} Обнаружено в версии:: Из выпадающего списка выберите версию продукта, в которой была обнаружена данная ошибка. @@ -74,17 +74,17 @@ link:../../../admin/administration-panel/release[Управление верси В модуле вы можете выполнять следующие действия: * Сортировка списка записей, для этого нажмите на значок в заголовке сортируемого столбца, для обратной сортировки нажмите на значок ещё раз. -* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_Избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. -* Редактирование или удаление информации сразу о нескольких ошибках, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. -* link:../../introduction/user-interface/record-management/#_Импорт_данных[Импорт] информации об ошибках, для этого нажмите на кнопку {btn}[Импорт ошибок], расположенную в меню модуля. -* link:../../introduction/user-interface/record-management/#_Объединение_дублирующихся_записей[Объединение дубликатов], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт *Объединить*. +* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. +* Редактирование или удаление информации сразу о нескольких ошибках, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. +* link:../../introduction/user-interface/record-management/#_импорт_данных[Импорт] информации об ошибках, для этого нажмите на кнопку {btn}[Импорт ошибок], расположенную в меню модуля. +* link:../../introduction/user-interface/record-management/#_объединение_дублирующихся_записей[Объединение дубликатов], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт *Объединить*. * Просмотр детальной информации об ошибке, для этого нажмите на названии ошибки в Форме списка. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. * Дублирование информации об ошибке, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих записей, вы можете изменить продублированную информацию с целью создания описания новой ошибки. * Удаление описания ошибки, для этого нажмите на кнопку {btn}[Удалить]. * Отслеживание изменений введённой информации, для этого нажмите на кнопку {btn}[Просмотр журнала изменений] в форме просмотра. Если в журнале необходимо изменить перечень контролируемых полей - сделайте это в Студии, настроив параметр link:../../../admin/administration-panel/developer-tools/#Audit[*Аудит*] соответствующего поля. -* link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт] информации об ошибках, для этого в форме списка выберите необходимые записи и в меню над выбранными записями выберите пункт *Экспортировать*. -* Просмотр и редактирование связанной с ошибкой информации, для этого воспользуйтесь link:../../introduction/user-interface/views/#_Субпанели[субпанелями]. +* link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт] информации об ошибках, для этого в форме списка выберите необходимые записи и в меню над выбранными записями выберите пункт *Экспортировать*. +* Просмотр и редактирование связанной с ошибкой информации, для этого воспользуйтесь link:../../introduction/user-interface/views/#_субпанели[субпанелями]. * Архивирование связанных с текущей ошибкой электронных писем, для этого в Форме просмотра ошибки на субпанели *История* воспользуйтесь кнопкой {btn}[Отправить E-mail в архив]. * Поиск информации об ошибках - используйте link:../../introduction/user-interface/search[Фильтры или Расширенные фильтры] в Форме списка модуля. Для поиска только ваших записей отметьте опцию *Мои записи*, для поиска актуальных ошибок (новая, назначена, ожидание решения) отметьте опцию *Актуальные*. diff --git a/content/user/core-modules/Calendar.pt.adoc b/content/user/core-modules/Calendar.pt.adoc new file mode 100644 index 000000000..d6f0a1229 --- /dev/null +++ b/content/user/core-modules/Calendar.pt.adoc @@ -0,0 +1,32 @@ +--- +Title: Calendário +Weight: 110 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + += Calendário + +O módulo de Calendário no SuiteCRM permite-lhe gerir o seu tempo ao permitir +marcar Reuniões, Chamadas e Tarefas. Os Calendários podem ser partilhados de +modo a que outros utilizadores possam ver as suas actvidades planeadas. Se o +utilizador for um participante destas actividades ou tiver uma Tarefa atribuída, +estas serão mostradas no seu Calendário. + +== Acçoes de Calendário + +Pode aceder às acções de Calendário a partir do menu pendente do módulo de +Calendário ou a partir da Sidebar. As seguintes acções estão disponíveis: + +* *Marcar Reuniões* – É apresentado um novo formulário na Vista de Edição do +módulo de Reuniões para permitir a criação de um novo registo de Reunião. Este +registo irá aparecer no Calendário. +* *Marcar Chamadas* – É apresentado um novo formulário na Vista de Edição do +módulo de Chamadas para permitir a criação de um novo registo de Chamada. Este +registo irá aparecer no Calendário. +* *Criar Tarefa* – É apresentado um novo formulário na Vista de Edição do +módulo de Tarefas para permitir a criação de um novo registo de Tarefa. Este +registo irá aparecer no Calendário. +* *Hoje* – Redirecciona a vista para o formato de Dia, no dia actual. + diff --git a/content/user/core-modules/Calendar.ru.adoc b/content/user/core-modules/Calendar.ru.adoc index 4be83f20f..ac17c7afe 100644 --- a/content/user/core-modules/Calendar.ru.adoc +++ b/content/user/core-modules/Calendar.ru.adoc @@ -83,9 +83,9 @@ image:image5.png[Настройка параметров календаря] {{% notice tip %}} По умолчанию в системе первым днём недели установлено воскресенье, оно же отображается первым днём недели в модуле *Календарь*. + Вы можете сменить его на понедельник в разделе -link:../../introduction/managing-user-accounts/#_Настройки_календаря[Настройки календаря] на странице настроек пользователя. +link:../../introduction/managing-user-accounts/#_настройки_календаря[Настройки календаря] на странице настроек пользователя. {{% /notice %}} Вы можете создать -link:../../introduction/managing-user-accounts/#_Настройки_календаря[публичный ключ] и позволить пользователям других приложений (например, Microsoft Outlook) просматривать мероприятия, указанные в вашем календаре. +link:../../introduction/managing-user-accounts/#_настройки_календаря[публичный ключ] и позволить пользователям других приложений (например, Microsoft Outlook) просматривать мероприятия, указанные в вашем календаре. diff --git a/content/user/core-modules/Calls.pt.adoc b/content/user/core-modules/Calls.pt.adoc new file mode 100644 index 000000000..f60be18ca --- /dev/null +++ b/content/user/core-modules/Calls.pt.adoc @@ -0,0 +1,70 @@ +--- +Title: Chamadas +Weight: 120 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +:experimental: + += Chamadas + +O módulo de Chamadas do SuiteCRM permite que os utilizadores programem e +registem chamdas efectuadas e recebidas nas quais tenham participado. + +== Açções de Chamadas + +Pode aceder às acções de Chamadas a partir do menu pendente do módulo de +Chamadas ou através da Sidebar. As acções de chamadas são: + +* *Registar Chamada* – É apresentado um novo formulário na Vista de Edição +para permitir a criação de um novo registo de chamada. +* *Ver Chamadas* – Apresenta a Vista de Lista para o módulo de Chamadas. Isto +permite-lhe pesquisar e apresentar registos de Chamadas. +* *Import Calls* – Apresenta o Assistente de Importação para o módulo de +Chamadas. Para mais informação, ver link:./../../introduction/user-interface/record-management/#_importing_records[Importar Registos]. + +Para ver a lista completa dos campos disponíveis ao registar uma Chamada, Ver +link:./../../appendix-a/#_calls_field_list[Lista de Campos de Chamadas]. + +== Gerir Chamadas + +* Para ordenar os registos de Chamadas na Vista de Lista, clique em qualquer +título de coluna ordenável. Irá ordenar a coluna de modo ascendente ou +descendente. +* Para procurar por uma Chamada, veja a secção +link:./../../introduction/user-interface/search[Pesquisa] deste guia. +* Para actualizar algumas ou todas as Chamadas na Vista de Lista, use o Painel +de Actualização em Massa tal como descrito na secção +link:./../../introduction/user-interface/record-management/#_mass_updating_records[Actualização +em Massa de Registos] deste guia. +* Para duplicar uma Chamada, pode clicar no botão Duplicar na Vista de Detalhe e +em seguida guardar o regiso duplicado. +* Para encerrar uma Chamada, clique no ícone 'x' na Vista de Lista de Chamadas. +Pode também clicar no botão Encerrar na Vista de Detalhe de uma Chamada. Pode +ainda clicar no botão Encerrar e Criar Nova. Esta acção irá encerrar a Chamada +que estiver a consultar e apresentar a Vista de Edição onde poderá criar um novo +registo. +* Para Reagendar uma chamada, pode clicar no botão Reagendar na Vista de +Detalhes da Chamada. Para um guia detalhado em reagendamento de chamadas, veja a +secção link:./../../advanced-modules/reschedule/[Reagendar] deste guia. +* Para eliminar uma ou mais Chamadas, pode seleccionar vários registos na Vista +de Lista e clicar em Eliminar. Pode também eliminar uma chamada clicando no +botão Eliminar na Vista de Detalhe. Para um guia mais detahado sobre a +eliminação de chamadas, veja a secção +link:./../../introduction/user-interface/record-management/#_deleting_records[Eliminar +Registos] deste guia. +* Para ver os detalhes de uma Chamada, clique no Assunto da Chamada na Vista de +Lista. Irá abrir a Vista de Detalhe do registo. +* Para editar os detalhes da Chamada, clique no ícone Editar na Vista d eLista +ou no botão Editar na Vista de Detalhe, faça as alterações necessárias e clique +em Guardar. +* Para um guia detalhado sobre a importação e exportação de Chamadas, veja as +secções +link:./../../introduction/user-interface/record-management/#_importing_records[Importar +Registos] e +link:./../../introduction/user-interface/record-management/#_exporting_records[Exportar +Registos] deste guia. +* Para acompanhar todas as alterações aos campos auditados, clique no botão Ver +Alterações na vista de Detalhe ou Vista de Edição do registo de Chamada. diff --git a/content/user/core-modules/Calls.ru.adoc b/content/user/core-modules/Calls.ru.adoc index 5a7dc0e65..ee300374a 100644 --- a/content/user/core-modules/Calls.ru.adoc +++ b/content/user/core-modules/Calls.ru.adoc @@ -58,7 +58,7 @@ image:image2.png[Назначение звонка] Статус:: Из выпадающего списка выберите вариант статуса: Входящий::: Выберите опцию, если звонок входящий. Исходящий::: Выберите опцию, если звонок исходящий. -Запланирован::: Выберите эту опцию, если звонок только запланирован. +В планах::: Выберите эту опцию, если звонок только запланирован. Состоялся::: Выберите эту опцию, если звонок состоялся. Не состоялся::: Выберите эту опцию, если звонок не состоялся. Дата начала:: С помощью календаря укажите дату, с помощью рядом расположенных выпадающих списков укажите время начала телефонной конференции. @@ -68,7 +68,7 @@ image:image2.png[Назначение звонка] Напоминание:: После нажатия на кнопку {btn}[Добавить напоминание], вы можете напомнить о предстоящем мероприятии всем приглашённым на него участникам. Напоминания могут быть выполнены двумя способами: либо в виде отправки электронного письма на адреса участников, либо в виде всплывающего уведомления браузера. Если на странице настроек пользователя выставлены опции -link:../../introduction/managing-user-accounts/#_Дополнительно[напоминания о мероприятии], то система будет автоматически выставлять параметры при добавлении нового напоминания: +link:../../introduction/managing-user-accounts/#_дополнительно[напоминания о мероприятии], то система будет автоматически выставлять параметры при добавлении нового напоминания: image:image3.png[Добавление напоминания] @@ -82,7 +82,7 @@ image:image3.png[Добавление напоминания] . Добавьте приглашённых как это описано в разделе <<Добавление приглашённых>>. . Нажмите на кнопку {btn}[Сохранить] для сохранения введённой информации; нажмите на кнопку {btn}[Отказаться] для возврата к списку звонков без сохранения введённой информации. . Нажмите на кнопку {btn}[Сохранить и отправить приглашения] для рассылки приглашений всем участникам телефонной конференции. - . Для создания копии звонка нажмите на кнопку {btn}[Закрыть и создать копию], в этом случае оригинальная запись звонка закроется и ей будет присвоен статус *Состоялся*. Новая запись будет содержать ту же информацию, что и оригинальная запись, за исключением статуса, которому по умолчанию будет присвоено значение *Запланирован*. + . Для создания копии звонка нажмите на кнопку {btn}[Закрыть и создать копию], в этом случае оригинальная запись звонка закроется и ей будет присвоен статус *Состоялся*. Новая запись будет содержать ту же информацию, что и оригинальная запись, за исключением статуса, которому по умолчанию будет присвоено значение *В планах*. == Добавление приглашённых @@ -117,7 +117,7 @@ image:image5.png[Дашлет со звонками] |=== {{% notice tip %}}Вы можете быстро назначить звонок непосредственно в календаре. За более подробной информацией обратитесь к разделу -link:../../core-modules/calendar/#_Быстрое_добавление_мероприятия_в_календаре[Быстрое добавление мероприятия в календаре]. +link:../../core-modules/calendar/#_быстрое_добавление_мероприятия_в_календаре[Быстрое добавление мероприятия в календаре]. {{% /notice %}} @@ -126,9 +126,9 @@ link:../../core-modules/calendar/#_Быстрое_добавление_меро В модуле вы можете выполнять следующие действия: * Сортировка списка записей, для этого нажмите на значок в заголовке сортируемого столбца, для обратной сортировки нажмите на значок ещё раз. -* Редактирование или удаление информации сразу о нескольких звонках, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. -* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_Избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. -* link:../../introduction/user-interface/record-management/#_Импорт_данных[Импорт] информации о звонках, для этого нажмите на кнопку {btn}[Импорт звонков], расположенную в меню модуля. +* Редактирование или удаление информации сразу о нескольких звонках, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. +* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. +* link:../../introduction/user-interface/record-management/#_импорт_данных[Импорт] информации о звонках, для этого нажмите на кнопку {btn}[Импорт звонков], расположенную в меню модуля. * Просмотр детальной информации о звонке, для этого нажмите на названии звонка в списке звонков. Кроме того, основная информация о звонке будет отображаться в форме *Подробности* при наведении указателя мыши на значок , который расположен справа от каждой записи. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. * Дублирование информации о звонке, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих записей, вы можете изменить продублированную информацию с целью назначения нового звонка. diff --git a/content/user/core-modules/Campaigns.pt.adoc b/content/user/core-modules/Campaigns.pt.adoc new file mode 100644 index 000000000..0376fc50c --- /dev/null +++ b/content/user/core-modules/Campaigns.pt.adoc @@ -0,0 +1,419 @@ +--- +Title: Campanhas +Weight: 190 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +:imagesdir: /images/en/user +:experimental: ////this is here to allow btn:[]syntax used below + +:toc: + += Campanhas + +== Visão Global + +O módulo de Campanhas no *SuiteCRM* pode ser uma poderosa ferramenta de +marketing e publicidade para a sua organização, permitindo a criação e o +acompanhamento de campanhas de marketing, sejam elas baseadas em email ou +noutros meios, dirigidas para actuais e potenciais clientes. + +Com as ferramentas de acompanhamento incluídas no módulo de Campanhas pode +monitorizar as respostas à sua campanha, em tempo real, permitindo uma visão do +Retorno de Investimento (ROI) e outras métricas úteis. Por sua vez, isto +permitir-lhe-á planear mais eficazmente a sua estratégia de marketing e +publicidade ao perceber quais as campanhas que melhor funcionam. + +* Para ver a lista completa dos campos disponíveis ao criar uma Campanha, veja a +* link:./../../appendix-a/#_campaigns_field_list[Lista de Campos de Campanha]. + +{{% notice note %}} +Irá necessitar de configurar as suas contas de saída de email e de tratamento de +bounce de email para enviar campanhas baseadas em email. Veja as Definições de +Email para mais informação de como fazer isto. + +Os emaisl de campanhas são enviados através de uma tarefa agendada. Tem que se +assegurar que o agendador de tarefas está propriamente configurado. +{{% /notice %}} + +== Criar uma Campanha + +No módulo de *Campanhas*, seleccione *Criar Campanha* a partir da barra lateral +ou do menu pendente do módulo para iniciar o *Assistente de Campanhas*. + +image:CampaignsSidebarCreate.png[title="Criar uma Campanha"] + +Seleccionar a campanha que deseja criar: "Newsletter", "Email", +link:../surveys/[Inquérito] (A partir do *SuiteCRM 7.10*) or *Campanhas não +baseadas em Email*. As campanhas não baseadas em email permitem-lhe manter +registos das campanhas que ocorrem fora do *SuiteCRM* (e.g. televendas ou rádio). + +image:CampaignTypes.png[title="Seleccionar campanha"] + +{{% notice nota %}} +Note que para uma camapanha do tipo "Inquérito" é necessário criar antecipadamente +o inquérito para depois associar à campanha. +{{% /notice %}} + +=== Cabeçalho da Campanha + +A primeira página do *Assistente de Campanha* é a página do *Cabeçalho da +Campanha*. +image:CampaignHeader.png[title="Cabeçalho de Campanha"] + +Indique aqui um nome para a campanha e defina o estado (*Em Planeamento*, +*Activo*, *Inactivo*, *Terminada*). + +Acrescente uma descrição opcional. + +A camapnha será atribuída, por pré-definição, ao utilizador que a define. Altere +aqui se necessário. + +==== Camapnha de Inquérito (a partir do *SuiteCRM 7.10*) + +Para uma campanha de *Inquériot* necessita de relacionar a campanha com um +inquérito existente, Veja link:../surveys/[Inquéritos] para informação sobre +como criar um inquérito. +image:CampaignSurveyHeader.png[title="Selecionar inquérito para a campanha"] + +==== Campanhas não baseadas em email + +Para uma campanha *Não Baseada em Email* pode, opcionalmente, selecionar o tipo +de campanha. + +image:CampaignsNonEmailTypes.png[title="Adicionar o tipo para campanha não-baseade em email"] + +==== Orçamento de Campanha +Os detalhes, opcionais, do orçamento da campanha estão mais abaixo na página. +Estes valores serão usados para o cálculo do ROI. + +Para campanhas não-baseadas em email, esta secção aparece na página seguinte. + +image:CampaignBudget.png[title="Orçamento de Campanha"] + +Clique em btn:[SEGUINTE] no topo da página para contiuar. + +=== Listas de Alvos (Targets) + +O próximo passo é identificar a(s) *Lista(s) de Alvos*. +As listas existentes serão apresentadas em *Adicionar Lista de Alvos Existente*. + +Clique no nome da lista para a adicionar à campanha. As listas adicionadas à +campanha serão apresentadas no painel do lado direito. + +Para remover uma lista de alvis, clique em btn:[rem] + +image:CampaignsTargetList.png[title="Listas de Alvos"] + +==== Criar Lista de Alvos + +Se ainda não criou uma lista de alvos ou deseja usar uma nova lista, pode criar +aqui uma lista vazia e povoá-la após ter completado o resto da definição da +campanha. Veja link:../target-lists/[Listas de Alvos] para mais informação sobre +os tipos de listas e como usá-los. + +image:80E-mail_campaign.png[title="LIsta de Alvos"] + +Indique um nome para a nova lista e seleccione o tipo. Note que irá necessitar +de ter pelo menos um tipo 'padrão' de lista de alvos atribuido à campanha. + +Clique btn:[CRIAR] + +=== Modelos + +O modelo é a mensgagem que será enviada à sua lista de alvos. Pode seleccionar +ou alterar um modelo de email existente ou criar um novo. Veja a secção de +Modelos de Email do guia de utilizador para mais informação. + +{{% notice tip %}}O editor de modelos usado para criar e editar os modelos de +email pode ser seleccionado nas +link:../../introduction/managing-user-accounts/#_user_profile_email_settings[definições +de email do utilizador]. A definição padrão (Mozaik) é mostrada nas capturas de +écran seguintes. {{% /notice %}} + +image:81Campaign_template.png[title="Modelo de Assistente de Campanha"] + +* *Escolher um modelo existente* – Pode seleccionar um dos Modelos de Email já +existentes da lista pendente. +* *Criar um novo modelo* – Criar um novo modello de email a partir do zero. +* *Copiar um modelo existente* – Permite-lhe secleccionar um modelo existente e +usá-lo como base para fazer alterações + +O editor de modelos de email no rodapé da página mostra como o seu modelo irá +aparecer. Arraste e largue os diferentes componentes do layout a partir da área +à esquerda para a área da direita, onde poder ser editados. + +image:Email_Template_Editor.png[title="Editor de Modelos de Email"] + +Clicar num componente irá mostrar o menu de edição. Este menu apresenta uma +série de opções que permite a personalização do layout e aparência do seu +modelo. Pode escolher o tipo de letra, formato, cores, alinhamento de texto, e +pode ainda incluir imagens e vídeos. + +image:85Campaign_template.png[title="Editor WYSIWYG"] + +{{%notice tip%}}Insira HTML Insert clicando em Ferramentas > Código Fonte{{%/notice%}} + +==== Variáveis de Email + +image:84Campaign_template.png[title="Variáveis de email"] + +=== URLs de Rastreio + +Os URLs de rastreio podem ser usados para inserir uma ligação para o website da +sua organização ou um link directo a um produto que tenha lançado recentemente, +por exemplo. Um id único é adicionado ao link para cada destinatário o que +permite ao *SuiteCRM* rastrear cliques. A informação assim obtida pode ser +consultada na página de estado da campanha. + +image:83Campaign_template.png[title="URL de Rastreio"] + +To add your own tracker URL link, click btn:[CREATE TRACKER] + +image:CampaignsCreateTracker2.png[title="Create tracker"] + +Specify the text to display as the link, and the URL. + +Clique btn:[CRIAR RASTREADOR] + +Acrescente o(s) seu(s) rastreador(es) ao modelo como as outras variáveis. Clique +dentro do modelo, na localização desejada, e depois escolha o rastreador na +lista pendentee clique em btn:[ INSERIR RASTREADOR] + +==== URLs de Rstreaor de saída + +Um link de saída permite que o destinatário escolha sair da lista de futuros +emails de marketing, um link de saída padrão será automaticamente ao modelo. +Pode substituir este padrão por um outro texto de Saída ao adicionar um +rastreador de saída personalizado. + +Clique btn:[CRIAR RASTREADOR] + +image:CampaignsOptOutTracker.png[title="Criar rastreador de saída"] + +Indique o texto que deseja para o seu link de saída. + +Marque a caixa de verificação do Link de Saída. Note que não pode editar o URL +de rastreamento propriamente dito, apenas o texto. + +Acrescente o seu rastreador ao modelo tal como se fosse uma varável. Clique +dentro do modelo na localização desejada, e depois seleccione o rastreador na +lista pendente e clique em btn:[ INSERIR RASTREADOR] + +Quando o seu modelo email estiver completo, clique em btn:[GUARDAR]. + +Clique em btn:[SEGUINTE] no topo da página para continuar. + +=== Marketing + +Na secção de Marketing do Assistente de Campanha deve indicar as definições de +email para a campanha, e definir um horário para enviar os emails. + +image:CampaignsMarketing.png[title="Assistente de Campanha: Marketing"] + +[cols="20,80", frame = "none", grid = "none"] +|=== +|*Nome do Email Marketing*|Indique um nome para este envio de campanha. Isto +permite re-enviar a camṕanha mais tarde, ou para um conjunto diferente de +destinatários, ou com outro modelo. A campanha irá armazenar detalhes de estado +separados para cada registo, e estes podem ser seleccionados na página de +estado da campanha. +|*Conta de tratamento de Devolvidos*|Escolha a conta definida para tratamento +dos emails devolvidos. +|*Conta de Envio de Email*|A definição padrão é a conta definida no sistema para +envio de mail. +|*Agendamento*|Os emails de campanha serão postos em fila para ser enviados na +data e hora especificado e serão enviados na execução seguinte do trabalho +*Correr Envio Nocturno de Email de Campanhas*. +|=== + +Quando tiver preenchido todos os detalhes, clique em btn:[SEGUINTE] no topo da +página para continuar. + +=== Envio de Email e Sumário + +A página de Sumário inclui uma lista de verificação que indica ou não se cada +secção do Assistente de Campanha foi completado de modo satizfatório. + +[cols="20,80", frame = "none", grid = "none"] +|=== +|image:CampaignsGreenTick.png[title="Secção de Campanha completada"]|Se uma +secção estiver completa, é mostrado um ícone de marca de verificação verde. +|image:CampaignsRedCross.png[title="Secção de Campainha incompleta"]|Secções +incompletas são mostradas com uma cruz vermelha. Estas irão necessitar de +intervenção para as resolver antes da campanha poder avançar. +|=== + +image:CampaignsSummary.png[title="Sumário de Campanha"] + +No exemplo acima, a secção *Escolher Alvos* não foi completada correctamente, +tal como indicado pelo ícone da cruz vermelha. Poderia ser resolvido através da +definição de uma lista de alvos 'padrão' com pelo menos uma entrada. + +Clique na linha correspondente à entrada incompleta na lista para aceder à +secção correspondente. + +Quando se tiver assegurado que todas as secções estão completas tem três opções: + +* *Enviar Mail à Hora Agendada* – Assim que tiver a certeza que todas as secções +da campanha estão definidas correctamente e o estado de campanha esttiver +definido para *Activo*, clique para enviar os emails de campanha. Os emails +serão postos em fila à hpra agendada, e será enviado aos destinatários na +execução seguinte do trabalho *Correr Envio Nocturno de Email de Campanha*. +* *Enviar Email de Marketing como Teste* – Se especificou uma lista de alvos do +tipo 'teste', irá enviar a campanha para os endereços apenas na lista de teste. +Ao fazer isto, pode ver a campanha como destinatário e verificar que aparece +como pretendido, antes da enviar para os destinatários reais. As entradas de +teste (vistas, cliques, etc...) geradas podem ser removidas posteriormente +através da página de <>. +* *Ver Detalhes* – Mostra a Vista de Detalhe da campanha que acabou de criar. + +== Estado da Campanha e Acompanhamento de Resposta +Na vista de Detalhe clique em btn:[VER ESTADO] +[cols="60,40", frame = "none", grid = "none"] +|=== +|OU, da vista de Lista, clique no ícone de +estado|image:CampaignsViewStatusIcon.png[title="ícone de estado"] +|=== + +A página de estado da campanha apresenta uma vista geral dos detalhes da +campanha e também uma representação gráfica da resposta da campanha. Esta +informação inclui o número de mensagens enviada, mensagens devolvidas, número de +vistas, pedidos de saída e cliques. + +image:CampaignStatus3.png[title="Estado de Campanha"] + +Informação detalhada pode ser consultada nos subpainéis sob o gráfico, com +detalhe de respostas por registo. Assim pode consultar quem viu o seu email ou +clicou numa ligação, ou como responderam a um inquérito, por exemplo. + +image:CampaignsStatusViewedMessage.png[title="Mensagens Vistas"] + +Se a campanha inclui um <> +poderá ver os detalhes de qualquer lead criado através fo formulário web no +subpainel *Leads Criados*. + +image:CampaignsLeadsCreated.png[title="Leads de Campanha criadas"] + +Estes registos podem ser acrescentados a uma nova lista de alvos ao clicar em +btn:[Acrescentar a Lista de Alvos] Isto permite-lhe criar novas campanhas, mais +focadas, baseadas nas respostas obtidas. + +[discrete] +=== Apagar Entradas de Teste + +Clique em btn:[APAGAR ENTRADAS DE TESTE] para remover quaisquer entradas na +página de estado de campanha que foram geradas durante o teste com uma +link:../target-lists/[lista de alvos] do tipo 'teste'. + +== Acompanhamento do ROI da Campanha + +O acompanhamento do ROI da campanha pode ser consultado a partir da página de +detalhes da da campanha ou da página de estado clicando em btn:[VER ROI] + +Esta página apresenta uma representação gráfica do Retorno de Investimento +(ROI), permitindo-lhe visualizar rapidamente como o dinheiro gasto com a +camapanha se traduziu em potenciais negócios. + +image:CampaignsROIChart.png[title="Detalhes de Retorno de Investimento"] + +{{%notice tip%}}Acrescente ou altera detalhes de orçamento para a campanha +clicando em Lanças o Assistente e acedendo à aba de Cabeçalho de Campanha.{{%/notice%}} + +== Formulário Web To Person + +A funcionalidade *Criar Formulario de Pessoa* permite criar um formulário +baseado na web que irá criar um registo de link:../leads/[Lead], +link:../contacts/[Contacto] ou link:../targets/[Alov] no *SuiteCRM* a partir da +informação submetida no formulaŕio. Estes registos podem ser atribuídos a um +utilizador e estão ligaods a uma campanha de modo que as respostas podem ser +acompahadas. + +{{%notice note%}}Irá necessitar de relacionar o formulário Web-to-Person com uma +campanha existente. Veja a secção <<#_create_a_campaign, Criar uma Campanha>> +para instruções sobre como o fazer. Uma campanha do tipo não-baseada em email é +apropriada para esta situação{{%/notice%}} + +Clique em *Criar Formulário de Pessoa* no menu lateral, ou seleccione *Criar +Formulário de Pessoa* no menu pendente de *Campanhas* para abrir o assistente. + +image:CampaignsSidebarCreateForm.png[title="Criar Formulário de Pessoa"] + +[discrete] +=== Assistente de Criação de Formulaŕio de Pessoa + +Seleccione o tipo de registo que deseja criar a partir do formulário da web: +*Lead*, *Contacto* ou *Alvo*, da lista pendente. A lista de campos disponíveis +será automaticamnte actualizada de acordo com a sua escolha. Use a barra de +scroll para ver a lista completa de campos disponíveis. + +image:CampaignsCreatePerson1.png[title="Criar Formulário de Pessoa - seleccionar +campos"] + +Arraste e largue os campos que deseja incluir no formulário para as colunas +vazias do formulário. Tem a opção de layout numa ou duas colunas. Tem que +incluir todo os campos obrigatórios (os indicados com um asterisco* e destacados +na lista). + +Clique em btn:[ACRESCENTAR TODOS OS CAMPOS] para acrescentar todos os campos ao +formulário. Clicar em btn:[RESET DE TODOS OS CAMPOS] irá remover todos os campos +das colunas de layout. + +image:CampaignsCreatePerson2.png[title="Criar Formulário de Pessoa - seleccionar +campos"] + +Quando todos os campos desejados forem acrescentados, clique em btn:[SEGUINTE] +para continuar. + +[discrete] +==== Criar Formulário Pesoa – Informação Adicional + +image:CampaignsCreatePerson3.png[title="Informação Adicional"] + +Configure a aparência do formulário web com a adição de um cabeçalho ou rodapé e +mude o texto do botão de submissão, se desejado. + +*URL de Redireccionamento*: Indique um link personalizado para ser mostrado ao +submeter o formulário. + +*Camapnha Relacionada*: Tem que relacionar o formulário com uma campanha +existente. Clique em btn:[SELECCIONAR] para seleccionar a campanha no popup. + +Quando estiver completo, clique em btn:[GERAR FORMULÁRIO] + +[discrete] +==== Criar Formulário de Pessoa – Editor + +O passo final do Assistente de Criação de Formulário de Pessoa permite-lhe +formatar o formulário web com o editor. O tipo de letra pode ser seleccionado, +as cores alteradas, o alinhamento do texto definido e figuras podem ser +inseridas. +Veja e edite o HTML directamente ao clicar na ligação HTML na barra de +ferramentas. + +image:CampaignsCreatePerson4.png[title="Formulário web"] + +Quando estiver satisfeito com a aparência do seu formulário web, clique em +btn:[GUARDAR FORMULÁRIO WEB] + +[discrete] +==== Guardar Formulário +Para guardar o formulário web que acabou de gerar, pode: + +* Clicar no link *Formulário Web to Person* para descarregar o formulário para a +sua pasta de Trasnferências *OU* +* Copiar e guardar o HTML para uma página existente. Tome nota da linha a +incluir na secção da página. + +image:CampaignsCreatePerson5.png[title="Descarregar formulário"] + +{{%notice warning%}}Por favor, tome nota que o formulário web não será guardado +em nenhum sítio do *SuiteCRM*. Para garantir que o formulário é guardado de +acordo com um dos métodos descritos acima.{{%/notice%}} + + + + diff --git a/content/user/core-modules/Campaigns.ru.adoc b/content/user/core-modules/Campaigns.ru.adoc index a411605a7..45f86b3ba 100644 --- a/content/user/core-modules/Campaigns.ru.adoc +++ b/content/user/core-modules/Campaigns.ru.adoc @@ -44,13 +44,13 @@ ifdef::env-github[:btn:] Для осуществления рассылки электронной почты администратор SuiteCRM должен предварительно выполнить ряд задач, а именно: . Настроить сервер исходящей почты, как это описано в разделе -link:../../../admin/administration-panel/email/#_Исходящие_e_mail[Исходящие E-mail]. +link:../../../admin/administration-panel/email/#_исходящие_e_mail[Исходящие E-mail]. . Указать количество писем, отправляемых одномоментно при пакетной рассылке, как это описано в разделе -link:../../../admin/administration-panel/email/#_Параметры_рассылки_e_mail[Параметры рассылки E-mail]. +link:../../../admin/administration-panel/email/#_параметры_рассылки_e_mail[Параметры рассылки E-mail]. . Настроить учётные записи для возвращаемой почты, как это описано в разделе -link:../../../admin/administration-panel/email/#_Настройки_учётной_записи_для_обработки_возвращаемой_почты[Настройки учётной записи для обработки возвращаемой почты]. Это необходимо для обработки вернувшихся к вам писем. Данные письма будут содержать уникальный идентификатор маркетинговой кампании в отличие от обычных писем, получаемых вами напрямую от адресатов. +link:../../../admin/administration-panel/email/#_настройки_учётной_записи_для_обработки_возвращаемой_почты[Настройки учётной записи для обработки возвращаемой почты]. Это необходимо для обработки вернувшихся к вам писем. Данные письма будут содержать уникальный идентификатор маркетинговой кампании в отличие от обычных писем, получаемых вами напрямую от адресатов. . Настроить задания планировщика для запуска ночных массовых рассылок писем и для проверки почтовых ящиков для возвращаемых писем, как это описано в разделе -link:../../../admin/administration-panel/system/#_Настройка_заданий_планировщика[Настройка заданий планировщика]. +link:../../../admin/administration-panel/system/#_настройка_заданий_планировщика[Настройка заданий планировщика]. == Создание маркетинговой кампании @@ -74,7 +74,7 @@ image:image1.png[Создание маркетинговой кампании] В случае рассылки информационных бюллетеней вы отправляете информацию адресатам, находящимся в единственном списке адресатов. При проведении опроса вы отправляете адресатам форму с заранее созданным опросом; результаты проведённого опроса автоматически сохраняются в системе для последующего анализа. Процесс создания опросов описан в одноимённом разделе -link:../surveys/#_Создание_опроса[Создание опроса]. +link:../surveys/#_создание_опроса[Создание опроса]. После выбора типа маркетинговой кампании нажмите кнопку {btn}[Вперёд]. @@ -187,7 +187,7 @@ image:image9.png[Параметры рассылки] Учётная запись для обработки возвращаемых писем:: Из выпадающего списка выберите учётную запись для возвращаемых писем. Учётная запись исходящей почты:: Из выпадающего списка выберите учётную запись для отправки исходящей почты. Дата и время начала:: Воспользуйтесь календарём и введите дату и время начала рассылки. - От:: Введите название организации или имя человека, от имени которого осуществляется рассылка. + Имя отправителя:: Введите название организации или имя человека, от имени которого осуществляется рассылка. E-mail отправителя:: При необходимости укажите электронный адрес, который будет указан в получаемых письмах в качестве отправителя. Имя для ответа:: Введите имя, для которого будет направлен ответ. E-mail для ответа:: При необходимости укажите электронный адрес, на который будет отправлено ответное письмо. @@ -281,7 +281,7 @@ image:image15.png[Диагностика настроек маркетингов {{% /notice %}} При создании веб-формы её исходный код сохраняется в папке *_/cache/generated_forms_*, откуда он может быть взят и скопирован в необходимый файл. Вы можете просматривать и редактировать создаваемые веб-формы при помощи встроенного в систему редактора. При необходимости добавления в веб-форму новых полей, отсутствующих в стандартном списке – обратитесь к администратору SuiteCRM или добавьте новые поля согласно описанию в разделе -link:../../../admin/administration-panel/developer-tools/#_Создание_и_редактирование_полей[Создание и редактирование полей]. +link:../../../admin/administration-panel/developer-tools/#_создание_и_редактирование_полей[Создание и редактирование полей]. [discrete] ==== Для создания веб-формы выполните следующее: @@ -336,7 +336,7 @@ link:../targets[адресата]. В модуле доступны следующие действия: * Сортировка списка записей, для этого нажмите на значок в заголовке сортируемого столбца, для обратной сортировки нажмите на значок ещё раз. -* Обновление информации сразу о нескольких маркетинговых кампаниях, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. +* Обновление информации сразу о нескольких маркетинговых кампаниях, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. * Просмотр детальной информации о маркетинговой кампании, для этого нажмите на названии маркетинговой кампании в списке маркетинговых кампаний. * Редактирование маркетинговой кампании, для этого в форме просмотра нажмите на кнопку {btn}[Править]. * Дублирование информации о маркетинговой кампании, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих записей, вы можете изменить продублированную информацию с целью создания новой маркетинговой кампании. @@ -346,5 +346,5 @@ link:../targets[адресата]. * Помещение рассылки маркетинговой кампании в очередь рассылки, этого в форме просмотра нажмите на кнопку {btn}[Разослать E-mail], отметьте интересующие вас рассылки и нажмите на кнопку {btn}[Отправить]. * Просмотр статуса маркетинговой кампании. За более подробной информацией обратитесь к разделу <<Просмотр статуса маркетинговой кампании>>. * Отслеживание изменений введённой информации, для этого нажмите на кнопку {btn}[Просмотр журнала изменений]в форме просмотра маркетинговой кампании. Если в журнале необходимо изменить перечень контролируемых полей - сделайте это в Студии, настроив параметр link:../../../admin/administration-panel/developer-tools/#Audit[*Аудит*] соответствующего поля. -* link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт] записей, для этого в форме списка выберите необходимые записи и в меню над выбранными записями выберите пункт *Экспортировать*. -* Просмотр и редактирование связанной с маркетинговой кампанией информации, для этого воспользуйтесь link:../../introduction/user-interface/views/#_Субпанели[субпанелями]. +* link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт] записей, для этого в форме списка выберите необходимые записи и в меню над выбранными записями выберите пункт *Экспортировать*. +* Просмотр и редактирование связанной с маркетинговой кампанией информации, для этого воспользуйтесь link:../../introduction/user-interface/views/#_субпанели[субпанелями]. diff --git a/content/user/core-modules/Cases.pt.adoc b/content/user/core-modules/Cases.pt.adoc new file mode 100644 index 000000000..0f1299f95 --- /dev/null +++ b/content/user/core-modules/Cases.pt.adoc @@ -0,0 +1,77 @@ +--- +Title: Ocorrências +Weight: 200 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + + += Ocorrências + +No SuiteCRM, Ocorrências são usadas para registar interacções com Clientes +quando estes pedem ajuda ou conselho, por exemplo, numa função de Suporte ou +Vendas. Uma Ocorrência pode ser criada, actualizada quando um Utilizador está a +trabalhar no problema, atribuída a outro Utilizador ou fechada quando ficar +resolvida. A cada etapa da Ocorrência, o Utilizador pode acompanhar e actualizar +a conversação de modo a que se crie um registo claro do que ocorreu. As +Ocorrências podem ser associadas a outros registos como Contas, Contactos e +Bugs. + +== Acções de Ocorrências + +Pode aceder as acções de Ocorrências a partir do menu pendente do módulo ou +através do menu lateral. As acções são: + +* *Criar Ocorrência* – É apresentado um novo formulário na Vista de Edição para +permitir a criação de um novo registo. +* *Ver Ocorrências* – Mostra a Vista de Lista do módulo Ocorrências. Esta vista +permite-lhe pesquisar e elencar registos de Ocorrência. +* *Importar Ocorrências* – Apresenta o Assistente de Importação para o módulo de +Ocorrências. Para mais informação, ver +link:./../../introduction/user-interface/record-management/#_importing_records[Importar +Registos]. + +Para ver a lista completa de campos disponíveis ao criar uma Ocorrência, ver +link:./../../appendix-a/#_cases_field_list[Lista de Campos de Ocorrências]. + +Funcionalidade avançada para Ocorrências pode ser consultada na secção +link:./../../advanced-modules/cases-with-portal/[Ocorrências com o Portal] deste +Guia de Utilizador. + +== Getão de Ocorrências + +* Para ordernar os registos na Vista de Lista, clique no titulo de uma coluna +que seja ordenável. Irá ordenar de modo ascendente ou descendente. +* Para procurar uma Ocorrência, veja a secção de +link:./../../introduction/user-interface/search[Pesquisa] deste guia. +* Para actualizar algumas ou todas as Ocorrências da Vista de Lista, use o +painel de Actualização em Massa como descrito na secção +link:./../../introduction/user-interface/record-management/#_mass_updating_records[Actualização +em Massa de Registos] deste guia. +* Para duplicar uma Ocorrência, pode clicar no botão Duplicar na Vista de +Detalhe e depois guarde o registo duplicado. +* Para juntar Ocorrências, seleccione os registos na Vista de Lista das +Ocorrências, clique no link para Juntar no menu pendente de Acções, e siga o +processo de união de registos. Para mais informação na União de Duplicados, veja +a secção +link:./../../introduction/user-interface/record-management/#_merging_records[União +de Registos] deste guia. +* Para apagar uma ou mais Ocorrências, pode seleccionar vários registos na Vista +de Lista e clique em Apagar. Pode também eliminar uma Ocorrência a partir da +Vista de Detalhe através do botão Apagar. Para um guia mais detalhe sobre a +eliminação de registos, veja a secção +link:./../../introduction/user-interface/record-management/#_deleting_records[Eliminar +Registos] deste guia. +* Para ver os detalhes de uma Ocorrência, clique no Assunto da Ocorrência na +Vista de Lista. Isto irá mostrar o registo na Vista de Detalhe. +* Para editar os detalhes da Ocorrência, clique no ícone Editar na Vista de +Lista, faça as alterações desejadas, e clique em Guardar. +* Para um guia detalhado sobre a importação e exportaçãod e Ocorrências, veja as +secções +link:./../../introduction/user-interface/record-management/#_importing_records[Importar +Registos] e +link:./../../introduction/user-interface/record-management/#_exporting_records[Exportar +Registos] neste guia. +* Para acompanhar todas as alterações aos campos auditados, pode clicar em Ver +Registo de Alterações na Vista de Detalhes ou Vista de Edição. diff --git a/content/user/core-modules/Cases.ru.adoc b/content/user/core-modules/Cases.ru.adoc index b5a9a9cbc..ad32dd616 100644 --- a/content/user/core-modules/Cases.ru.adoc +++ b/content/user/core-modules/Cases.ru.adoc @@ -32,9 +32,9 @@ link:../../advanced-modules/knowledgebase[Базу знаний] SuiteCRM, то image:image1.png[Обращения] Имеется возможность импортирования обращений из текстового файла, для этого из меню модуля выберите пункт *Импорт обращений*. Более подробная информация на эту тему описана в разделе -link:../../introduction/user-interface/record-management/#_Импорт_данных[Импорт данных]. +link:../../introduction/user-interface/record-management/#_импорт_данных[Импорт данных]. Также имеется возможность автоматического создания обращений из входящих писем, более подробная информация на эту тему описана в разделе -link:../../../admin/administration-panel/email/#_Настройки_групповой_учётной_записи[Настройки групповой учётной записи]. +link:../../../admin/administration-panel/email/#_настройки_групповой_учётной_записи[Настройки групповой учётной записи]. == Создание обращений @@ -78,7 +78,7 @@ link:../../core-modules/documents[документы] SuiteCRM, так и вне == Изменение списка статусов обращений Обратите внимание на параметры обращения *Состояние* и *Статус*. Отображаемые варианты статуса напрямую зависят от состояния обращения (Открыто или Закрыто). Если требуется добавить новые значения в список статуса обращения через редактор комбобоксов, то при редактировании комбобокса *case_status_dom* в паре *Ключ-Видимое значение* добавляйте к новому ключу элемента обязательный префикс *Open_* или *Close_*. За дополнительной информацией об изменении списка обратитесь к разделу -link:../../../admin/administration-panel/developer-tools/#_Редактор_комбобоксов[Редактор комбобоксов]. +link:../../../admin/administration-panel/developer-tools/#_редактор_комбобоксов[Редактор комбобоксов]. В следующем примере добавлен новый элемент в список статуса для состояния *Открыто*: слева отображён новый элемент списка в редакторе комбобокса, справа – результат в виде нового варианта статуса в Форме редактирования Обращения. @@ -89,18 +89,18 @@ image:image10.png[Изменение списка статусов обраще В модуле вы можете выполнять следующие действия: * Сортировка списка записей, для этого нажмите на значок в заголовке сортируемого столбца, для обратной сортировки нажмите на значок ещё раз. -* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_Избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. +* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. * Просмотр информации о выбранных записях в link:../../jjw-maps[картах Google], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт *Показать на карте*. -* Редактирование или удаление информации сразу о нескольких обращениях, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. +* Редактирование или удаление информации сразу о нескольких обращениях, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. * Просмотр детальной информации об обращении, для этого нажмите на названии обращения в общем списке. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. -* link:../../introduction/user-interface/record-management/#_Импорт_данных[Импорт] информации об обращениях, для этого нажмите на кнопку {btn}[Импорт обращений], расположенную в меню модуля. -* link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт] записей, для этого в форме списка выберите необходимые сделки и в меню над выбранными записями выберите пункт *Экспортировать*. +* link:../../introduction/user-interface/record-management/#_импорт_данных[Импорт] информации об обращениях, для этого нажмите на кнопку {btn}[Импорт обращений], расположенную в меню модуля. +* link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт] записей, для этого в форме списка выберите необходимые сделки и в меню над выбранными записями выберите пункт *Экспортировать*. * Дублирование информации об обращении, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих записей, вы можете изменить продублированную информацию с целью создания нового обращения. -* link:../../introduction/user-interface/record-management/#_Объединение_дублирующихся_записей[Объединение дубликатов], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт *Объединить*. +* link:../../introduction/user-interface/record-management/#_объединение_дублирующихся_записей[Объединение дубликатов], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт *Объединить*. * Удаление обращения, для этого нажмите на кнопку {btn}[Удалить]. * Отслеживание изменений введённой информации, для этого нажмите на кнопку {btn}[Просмотр журнала изменений] в форме просмотра. Если в журнале необходимо изменить перечень контролируемых полей - сделайте это в Студии, настроив параметр link:../../../admin/administration-panel/developer-tools/#Audit[*Аудит*] соответствующего поля. -* Просмотр и редактирование связанной с обращением информации, для этого воспользуйтесь link:../../introduction/user-interface/views/#_Субпанели[субпанелями]. +* Просмотр и редактирование связанной с обращением информации, для этого воспользуйтесь link:../../introduction/user-interface/views/#_субпанели[субпанелями]. * Архивирование связанных с текущим обращением электронных писем, для этого в Форме просмотра обращения на субпанели *История* воспользуйтесь кнопкой {btn}[Отправить E-mail в архив]. * Поиск информации об обращении - используйте link:../../introduction/user-interface/search[Фильтры или Расширенные фильтры] в Форме списка модуля. Для поиска только ваших записей отметьте опцию *Мои записи*, для поиска актуальных обращений (новых, назначенных, ожидающих решения) отметьте опцию *Актуальные*. diff --git a/content/user/core-modules/Contacts.ru.adoc b/content/user/core-modules/Contacts.ru.adoc index a41cbbcee..197ab7f0e 100644 --- a/content/user/core-modules/Contacts.ru.adoc +++ b/content/user/core-modules/Contacts.ru.adoc @@ -35,7 +35,7 @@ image:image1.png[Контакты] Создать из vCard:: Выберите эту опцию, чтобы импортировать информацию из vCard. Контакты:: Выберите эту опцию для просмотра существующих контактов. Импорт:: Выберите эту опцию для импортирования информации о контактах из внешнего приложения или файла. За дополнительной информацией обратитесь к разделу -link:../../introduction/user-interface/record-management/#_Импорт_данных[Импорт данных]. +link:../../introduction/user-interface/record-management/#_импорт_данных[Импорт данных]. == Создание контакта @@ -86,7 +86,7 @@ link:../../modules/confirmed-opt-in-settings[рассылках]. {{% notice note %}} Вы можете создать новый контакт через -link:../campaigns/#_Создание_Веб_формы_регистрации[Веб-форму регистрации] контакта. Введённая в форму информация сохраняется в базе данных SuiteCRM. +link:../campaigns/#_создание_веб_формы_регистрации[Веб-форму регистрации] контакта. Введённая в форму информация сохраняется в базе данных SuiteCRM. {{% /notice %}} == Управление информацией о контактах @@ -94,24 +94,24 @@ link:../campaigns/#_Создание_Веб_формы_регистрации[В В модуле вы можете выполнять следующие действия: :: * Сортировка списка записей, для этого нажмите на значок в заголовке сортируемого столбца, для обратной сортировки нажмите на значок ещё раз. * Поиск контакта - используйте link:../../introduction/user-interface/search[Фильтры или Расширенные фильтры] в Форме списка модуля. -* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_Избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. +* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. * Добавление контактов в список link:../targets[адресатов] – в Форме списка отметьте необходимые записи и выберите в меню действий пункт *Добавить в список адресатов*. -* link:../../introduction/user-interface/record-management/#_Импорт_данных[Импорт] контакта с использованием vCard, следуйте описанию в разделе <<Использование vCards для импорта контактов>>. +* link:../../introduction/user-interface/record-management/#_импорт_данных[Импорт] контакта с использованием vCard, следуйте описанию в разделе <<Использование vCards для импорта контактов>>. * Экспорт контакта в формате vCard. В Форме просмотра контакта нажмите на кнопку {btn}[vCard], расположенную справа от ФИО контакта. Появится диалоговое окно, предлагающее сохранить файл или открыть его в ассоциированном приложении. -* Получение данных контрагента, используя внешний источник данных. Для получения дополнительной информации об источниках данных см. раздел link:../../introduction/user-interface/record-management/#_Интеграция_данных_системы_с_внешними_данными[Интеграция данных системы с внешними данными]. -* link:../../introduction/user-interface/record-management/#_Импорт_данных[Импорт] записей, для этого нажмите на кнопку {btn}[Импорт контактов], расположенную в меню модуля. +* Получение данных контрагента, используя внешний источник данных. Для получения дополнительной информации об источниках данных см. раздел link:../../introduction/user-interface/record-management/#_интеграция_данных_системы_с_внешними_данными[Интеграция данных системы с внешними данными]. +* link:../../introduction/user-interface/record-management/#_импорт_данных[Импорт] записей, для этого нажмите на кнопку {btn}[Импорт контактов], расположенную в меню модуля. * Создание документа в формате PDF - отметьте необходимые записи (если открыта Форма списка) и выберите пункт *Создать письмо (PDF)* в меню действий (или сразу выберите этот пункт в меню, если открыта Форма просмотра записи), после чего выберите необходимый link:../../advanced-modules/pdftemplates[PDF-шаблон]. -* link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт] записей, для этого в форме списка выберите необходимые записи и в меню над выбранными записями выберите пункт *Экспортировать*. -* link:../../introduction/user-interface/record-management/#_Объединение_дублирующихся_записей[Объединение дубликатов], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт *Объединить*. -* link:../../introduction/user-interface/record-management/#_Поиск_и_объединение_схожих_записей[Поиск дубликатов], для этого в меню действий Формы просмотра выберите пункт *Поиск дубликатов*. +* link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт] записей, для этого в форме списка выберите необходимые записи и в меню над выбранными записями выберите пункт *Экспортировать*. +* link:../../introduction/user-interface/record-management/#_объединение_дублирующихся_записей[Объединение дубликатов], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт *Объединить*. +* link:../../introduction/user-interface/record-management/#_поиск_и_объединение_схожих_записей[Поиск дубликатов], для этого в меню действий Формы просмотра выберите пункт *Поиск дубликатов*. * Просмотр информации о выбранных записях в link:../../jjw-maps[картах Google], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт *Показать на карте*. -* Редактирование или удаление информации сразу о нескольких контактах, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. +* Редактирование или удаление информации сразу о нескольких контактах, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. * Просмотр детальной информации по контакту, для этого нажмите на названии контакта в общем списке. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. * Дублирование информации о контакте, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих записей, вы можете изменить продублированную информацию с целью создания нового контакта. * Удаление контакта, для этого нажмите на кнопку {btn}[Удалить]. * Отслеживание изменений введённой информации, для этого нажмите на кнопку {btn}[Просмотр журнала изменений] в форме просмотра. Если в журнале необходимо изменить перечень контролируемых полей - сделайте это в Студии, настроив параметр link:../../../admin/administration-panel/developer-tools/#Audit[*Аудит*] соответствующего поля. -* Просмотр и редактирование связанной с контактом информации, для этого воспользуйтесь link:../../introduction/user-interface/views/#_Субпанели[субпанелями]. +* Просмотр и редактирование связанной с контактом информации, для этого воспользуйтесь link:../../introduction/user-interface/views/#_субпанели[субпанелями]. == Использование vCards для импорта контактов @@ -125,6 +125,6 @@ link:../campaigns/#_Создание_Веб_формы_регистрации[В == Настройка экспорта контактов в формат vCard -По умолчанию экспорт контактов в формат vCard недоступен. Администратору SuiteCRM необходимо в *Форме просмотра* контакта заменить поля *Имя* и *Фамилия* на общее поле *ФИО*, используя link:../../../admin/administration-panel/developer-tools/#_Редактирование_Формы_просмотра_Формы_редактирования_и_Формы_быстрого_ввода[Студию], после чего кнопка {btn}[vCard] будет доступна справа от поля *ФИО*. +По умолчанию экспорт контактов в формат vCard недоступен. Администратору SuiteCRM необходимо в *Форме просмотра* контакта заменить поля *Имя* и *Фамилия* на общее поле *ФИО*, используя link:../../../admin/administration-panel/developer-tools/#_редактирование_формы_просмотра_формы_редактирования_и_формы_быстрого_ввода[Студию], после чего кнопка {btn}[vCard] будет доступна справа от поля *ФИО*. diff --git a/content/user/core-modules/Documents.ru.adoc b/content/user/core-modules/Documents.ru.adoc index f50a3c65f..38a151fb2 100644 --- a/content/user/core-modules/Documents.ru.adoc +++ b/content/user/core-modules/Documents.ru.adoc @@ -59,16 +59,16 @@ image:image2.png[Создание документа] В модуле вы можете выполнять следующие действия: * Сортировка списка записей, для этого нажмите на значок в заголовке сортируемого столбца, для обратной сортировки нажмите на значок ещё раз. -* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_Избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. -* Редактирование или удаление информации сразу о нескольких документах, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. +* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. +* Редактирование или удаление информации сразу о нескольких документах, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. * Просмотр детальной информации о документе, для этого нажмите на названии документа в общем списке. * Просмотр вложения документа; Информацию об обновлении вложения смотрите в разделе <<Обновление версии вложения>>. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. * Дублирование информации о документе, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих документов, вы можете изменить продублированную информацию с целью создания нового документа. * Удаление документа, для этого нажмите на кнопку {btn}[Удалить]. * Отслеживание изменений введённой информации, для этого нажмите на кнопку {btn}[Просмотр журнала изменений] в форме просмотра. Если в журнале необходимо изменить перечень контролируемых полей - сделайте это в Студии, настроив параметр link:../../../admin/administration-panel/developer-tools/#Audit[*Аудит*] соответствующего поля. -* link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт] записей, для этого в форме списка выберите необходимые документы и в меню над выбранными записями выберите пункт *Экспортировать*. -* Просмотр и редактирование связанной с документами информации, для этого воспользуйтесь link:../../introduction/user-interface/views/#_Субпанели[субпанелями]. +* link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт] записей, для этого в форме списка выберите необходимые документы и в меню над выбранными записями выберите пункт *Экспортировать*. +* Просмотр и редактирование связанной с документами информации, для этого воспользуйтесь link:../../introduction/user-interface/views/#_субпанели[субпанелями]. === Обновление версии вложения diff --git a/content/user/core-modules/EmailTemplates.ru.adoc b/content/user/core-modules/EmailTemplates.ru.adoc index d36869106..058d20f66 100644 --- a/content/user/core-modules/EmailTemplates.ru.adoc +++ b/content/user/core-modules/EmailTemplates.ru.adoc @@ -29,20 +29,20 @@ link:../../core-modules/bugs[Ошибки] вы можете отправить {{% notice tip %}} Для редактирования шаблона могут быть использованы различные текстовые редакторы. При необходимости вы можете выбрать редактор в -link:../../introduction/managing-user-accounts/#_Настройка_почтовых_параметров_пользователя[настройках пользователя]. +link:../../introduction/managing-user-accounts/#_настройка_почтовых_параметров_пользователя[настройках пользователя]. {{% /notice %}} Для шаблонов писем, используемых при рассылке, введите сообщение и, при необходимости, добавьте в него специальные переменные, например, переменные, отвечающие за имена и адреса клиентов. Система вставит эти переменные в шаблон, чтобы на его основе создать персональное письмо для каждого адресата. При создании шаблона вы можете вставлять в него изображения, а также прикреплять к нему как внешние файлы, так и link:../documents/[документы] SuiteCRM. Также при создании шаблона письма, используемого при рассылке, вы можете добавить в него адрес (URL) -link:../../core-modules/campaigns/#_Добавление_трекера_ссылок[трекера] для отслеживания активности проводимой кампании. +link:../../core-modules/campaigns/#_добавление_трекера_ссылок[трекера] для отслеживания активности проводимой кампании. == Создание шаблона электронного письма image:image2.png[Создание шаблона электронного письма] В меню модуля *E-mail* выберите пункт *Создать шаблон E-mail*. Также новый шаблон может быть создан -link:../../core-modules/campaigns/#_Выбор_шаблона_электронного_письма[в процессе создания/редактирования маркетинговой кампании]. Для этого в Форме просмотра маркетинговой кампании перейдите к субпанели *Рассылки E-mail*, нажмите на кнопку {btn}[Создать] и на странице выбора шаблона отметьте пункт *Создать шаблон*. +link:../../core-modules/campaigns/#_выбор_шаблона_электронного_письма[в процессе создания/редактирования маркетинговой кампании]. Для этого в Форме просмотра маркетинговой кампании перейдите к субпанели *Рассылки E-mail*, нажмите на кнопку {btn}[Создать] и на странице выбора шаблона отметьте пункт *Создать шаблон*. [discrete] ==== Заполните следующие поля: @@ -72,5 +72,5 @@ image:image3.png[Вложения] * Редактирование шаблона, для этого в форме просмотра шаблона Нажмите на кнопку {btn}[Править]. * Дублирование шаблона, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих шаблонов, вы можете изменить продублированную информацию с целью создания нового шаблона. * Удаление шаблона, для этого в форме просмотра шаблона нажмите на кнопку {btn}[Удалить]. -* link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт] шаблонов, для этого в форме списка выберите необходимые шаблоны и в меню над выбранными записями выберите пункт *Экспортировать*. +* link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт] шаблонов, для этого в форме списка выберите необходимые шаблоны и в меню над выбранными записями выберите пункт *Экспортировать*. diff --git a/content/user/core-modules/Emails.ru.adoc b/content/user/core-modules/Emails.ru.adoc index ebcc59319..7a480c7cf 100644 --- a/content/user/core-modules/Emails.ru.adoc +++ b/content/user/core-modules/Emails.ru.adoc @@ -19,9 +19,15 @@ ifdef::env-github[:imagesdir: ./../../../../master/static/images/ru/user/core-mo ifdef::env-github[:btn:] - = E-mail +{{% notice note %}} +Раздел актуален для SuiteCRM версий 7.9 и выше. Для предыдущих версий системы актуально link:../emails-lts[это] описание. +{{% /notice %}} + +{{% notice warning %}} +При обновлении SuiteCRM с версий 7.8 и более ранних необходимо выполнить link:../../../admin/installation-guide/using-the-upgrade-wizard/#_синхронизация_учётных_записей_входящей_почты[синхронизацию учётных записей входящей почты]. +{{% /notice %}} Данный модуль может быть использован для управления вашей электронной почтой. @@ -147,13 +153,13 @@ image:image5.png[Параметры сервера исходящей почты == Описание элементов интерфейса Форма списка электронной почты содержит как стандартные элементы (например, элементы -link:../../introduction/user-interface/views/#_Навигация_и_сортировка[навигации и сортировки записей]), так и специфические значки и кнопки: +link:../../introduction/user-interface/views/#_навигация_и_сортировка[навигации и сортировки записей]), так и специфические значки и кнопки: [horizontal] image:image1a.png[Кнопка переключения между учётными записями]:: Кнопка переключения между учётными записями электронной почты и выбора почтовой папки. image:image1b.png[Непрочитанные сообщения]:: Непрочитанные сообщения отображаются на пурпурном фоне. image:image1c.png[Письма с вложениями]:: Этим значком помечаются письма с вложениями. -image:image1d.png[Импортированные письма]:: Этим значком помечаются письма, <<_Импорт_писем_в_систему,импортированные>> в систему. +image:image1d.png[Импортированные письма]:: Этим значком помечаются письма, <<Импорт писем в систему,импортированные>> в систему. image:image1e.png[Важные письма]:: Этим значком помечаются *важные* письма. Панель кнопок содержит следующие элементы: @@ -163,17 +169,17 @@ image:image1e.png[Важные письма]:: Этим значком поме |image:image1f.png[Меню действий]|Меню действий - используется для массовой работы с письмами: <<Импорт писем в систему,импорт писем в систему>>, установка отметок *прочитанное/непрочитанное*, *важное/обычное*. |image:image1g.png[Создание нового письма]|<<Создание и отправка электронных писем,Создание нового письма>>. |image:image1h.png[Открытие профиля текущего пользователя]|Открытие профиля текущего пользователя. В нижней части закладки *Профиль пользователя* расположена кнопка -link:../../introduction/managing-user-accounts/#_Настройка_почтовых_параметров_пользователя[настройки почтовых параметров]. +link:../../introduction/managing-user-accounts/#_настройка_почтовых_параметров_пользователя[настройки почтовых параметров]. |image:image1i.png[Получение почты]|Получение почты -link:./#_Учётные_записи[персональной учётной записи]. +link:./#_учётные_записи[персональной учётной записи]. *Обратите внимание:* проверка групповой учётной записи происходит автоматически по расписанию -link:../../../admin/administration-panel/system/#_Планировщик[планировщика]. +link:../../../admin/administration-panel/system/#_планировщик[планировщика]. |image:image1j.png[Выбор почтовой папки]| Выбор почтовой папки. Повторяет функционал кнопки переключения между -link:./#_Учётные_записи[учётными записями]. +link:./#_учётные_записи[учётными записями]. |image:image1k.png[Фильтрация писем]| -link:../../introduction/user-interface/search/#_Фильтр[Фильтрация] писем по указанным критериям. +link:../../introduction/user-interface/search/#_фильтр[Фильтрация] писем по указанным критериям. |image:image1l.png[]|Настройка колонок - настройка видимости и порядка расположения колонок -link:../../introduction/user-interface/views/#_Форма_списка[Формы списка]. +link:../../introduction/user-interface/views/#_форма_списка[Формы списка]. |=== @@ -253,6 +259,8 @@ link:../documents[документы]. [cols=",",options="!header"] |======== +|По умолчанию все письма, загружаемые с почтового сервера, лишь *отображаются* в системе, не сохраняясь в базе данных SuiteCRM. С одной стороны это позволяет уменьшить объём данных, хранимых в системе, с другой стороны - над такими почтовыми записями можно выполнять лишь ряд ограниченных действий, в то время как сохранённые записи предоставляют гораздо больше возможностей. Для сохранения писем в системе необходимо выполнить их импорт. +|image:image9a.png[Перечень действий над неимпортированными письмами] |Импортирование писем позволяет вам более гибко управлять ими в системе. Вы можете назначать импортированные письма другим пользователям, создавать на их основе различные записи системы при помощи соответствующих пунктов меню *Действия*. |image:image9.png[Перечень действий над импортированными письмами] |======== @@ -268,14 +276,26 @@ link:../documents[документы]. image:image8.png[Импорт писем в систему] Ответственный(ая):: Введите ответственного пользователя. -Связано с:: При необходимости выберите модуль и нажмите на кнопку {btn}[Выбрать] для выбора соответствующей записи, которая будет связана с письмом. +Связано с:: При необходимости выберите модуль и нажмите на кнопку {btn}[Выбрать] для выбора соответствующей записи, которая будет связана с письмом. Если производится импорт сразу нескольких писем из меню *Действия*, то ВСЕ выбранные письма будут связаны с одной записью. Если необходимо связать разные письма с различными записями системы, то выполняйте импорт в несколько этапов, связывая необходимые письма с определёнными записями в системе. [start=3] . Нажмите на кнопку {btn}[ОК] для импорта письма в базу данных системы; нажмите на кнопку {btn}[Отказаться] для отмены импорта. -Если необходимо выполнить одновременный импорт сразу нескольких писем - отметьте необходимые записи в Форме списка и в меню *Действия* выберите пункт *Импорт*. +Если необходимо выполнить одновременный импорт сразу нескольких писем - отметьте необходимые записи в Форме списка и в меню *Действия* выберите пункт *Импорт*. +Импортированные письма будут помечены соответствующим значком: + +image:image10.png[Импортированные в SuiteCRM письма] + +При необходимости вы можете автоматически импортировать все входящие письма, включив соответствующую опцию в link:../../../admin/administration-panel/email/#_настройки_групповой_учётной_записи[настройках Групповой учётной записи]. + {{% notice tip %}} Связать импортированное письмо с теми или иными записями в системе вы можете через субпанели, доступные в Форме просмотра письма. {{% /notice %}} + +== Удаление писем + +Для удаления *импортированного* письма из SuiteCRM воспользуйтесь пунктом *Удалить* в меню *Действия*, при этом оригинал письма *останется на почтовом сервере*. + +Для удаления письма с почтового сервера воспользуйтесь пунктом *Удалить с сервера* в меню *Действия*. diff --git a/content/user/core-modules/Employees.ru.adoc b/content/user/core-modules/Employees.ru.adoc index 280ff5438..4508a8b76 100644 --- a/content/user/core-modules/Employees.ru.adoc +++ b/content/user/core-modules/Employees.ru.adoc @@ -27,7 +27,7 @@ image:image1.png[Сотрудники в меню пользователя] image:image2.png[Сотрудники] -Сотрудники, изначально добавленные в систему через модуль *Сотрудники*, *_не являются пользователями системы:_* они будут отображаться в перечне сотрудников, но они не могут зарегистрироваться в системе до тех пор, пока им не будут присвоены необходимые логин и пароль. +Сотрудники, изначально добавленные в систему через модуль *Сотрудники*, *_не являются пользователями системы:_* они будут отображаться в перечне сотрудников, но они не могут зарегистрироваться в системе до тех пор, пока им не будут присвоены необходимые логин и пароль через модуль link:../../../admin/administration-panel/users[Пользователи]. Таким образом, в данном модуле может быть представлен весь перечень сотрудников вашей организации, включая сотрудников, не работающих в SuiteCRM. == Ввод информации о сотруднике @@ -77,8 +77,8 @@ IM-имя:: Введите логин пользователя интернет- * Для поиска сотрудника воспользуйтесь панелью поиска, расположенной в верхней части страницы. * Для просмотра подробной информации о сотруднике – нажмите на имя сотрудника в Форме списка. * Для отправки письма сотруднику - нажмите на его электронный адрес. -* Для link:../../../user/introduction/user-interface/record-management/#_Экспорт_данных[экспорта] данных о сотрудниках в форме списка выберите необходимых сотрудников и в меню над выбранными записями выберите пункт *Экспортировать*. -* Для изменения статуса нескольких сотрудников используйте link:../../../user/introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. +* Для link:../../../user/introduction/user-interface/record-management/#_экспорт_данных[экспорта] данных о сотрудниках в форме списка выберите необходимых сотрудников и в меню над выбранными записями выберите пункт *Экспортировать*. +* Для изменения статуса нескольких сотрудников используйте link:../../../user/introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. * Для редактирования информации о сотруднике нажмите на кнопку {btn}[Править] в Форме просмотра. * Для дублирования информации о сотруднике нажмите на кнопку {btn}[Дублировать] в Форме просмотра. Дублирование является удобным способом быстрого создания схожих записей, вы можете изменить продублированную информацию с целью создания записи о новом сотруднике. * Для удаления информации о сотруднике нажмите на кнопку {btn}[Удалить] в Форме просмотра. diff --git a/content/user/core-modules/Leads.ru.adoc b/content/user/core-modules/Leads.ru.adoc index 010cb688d..2b24f5714 100644 --- a/content/user/core-modules/Leads.ru.adoc +++ b/content/user/core-modules/Leads.ru.adoc @@ -35,7 +35,7 @@ image:image1.png[Предварительные контакты] Новые записи предварительных контактов вы можете создавать как с нуля, так и путём импорта текстовых файлов, содержащих необходимую информацию. Находящиеся в подобном файле данные могут быть разделены запятой, символом табуляции или любым другим пользовательским символом. Вы имеете возможность указать значения по умолчанию для существующих полей системы, и если в импортируемом файле отсутствуют необходимые данные, то эти значения будут добавлены в базу в процессе импорта. Для импорта предварительных контактов нажмите на кнопку {btn}[Импорт] в меню модуля. Более подробная информация на эту тему описана в разделе -link:../../introduction/user-interface/record-management/#_Импорт_данных[Импорт данных]. +link:../../introduction/user-interface/record-management/#_импорт_данных[Импорт данных]. Для создания предварительного контакта выполните следующее: @@ -91,7 +91,7 @@ E-mail:: Введите адрес электронной почты. {{% notice note %}} Вы можете создать новый предварительный контакт через -link:../campaigns/#_Создание_Веб_формы_регистрации[Веб-форму регистрации] предварительного контакта. Введённая в форму информация сохраняется в базе данных SuiteCRM. +link:../campaigns/#_создание_веб_формы_регистрации[Веб-форму регистрации] предварительного контакта. Введённая в форму информация сохраняется в базе данных SuiteCRM. {{% /notice %}} == Управление информацией о предварительных контактах @@ -101,24 +101,24 @@ link:../campaigns/#_Создание_Веб_формы_регистрации[В * Сортировка списка записей, для этого нажмите на значок в заголовке сортируемого столбца, для обратной сортировки нажмите на значок ещё раз. * Поиск предварительного контакта - используйте link:../../introduction/user-interface/search[Фильтры или Расширенные фильтры] в Форме списка модуля. -* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_Избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. +* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. * Добавление предварительных контактов в список link:../targets[адресатов] – в Форме списка отметьте необходимые записи и выберите в меню действий пункт *Добавить в список адресатов*. -* link:../../introduction/user-interface/record-management/#_Импорт_данных[Импорт] предварительного контакта с использованием vCard, следуйте описанию в разделе link:../contacts/#_Использование_vcards_для_импорта_контактов[Использование vCards для импорта контактов]. +* link:../../introduction/user-interface/record-management/#_импорт_данных[Импорт] предварительного контакта с использованием vCard, следуйте описанию в разделе link:../contacts/#_использование_vcards_для_импорта_контактов[Использование vCards для импорта контактов]. * Экспорт предварительного контакта в формате vCard. В Форме просмотра предварительного контакта нажмите на кнопку {btn}[vCard], расположенную справа от имени предварительного контакта. Появится диалоговое окно, предлагающее сохранить файл или открыть его в ассоциированном приложении. -* Получение данных предварительного контакта, используя внешний источник данных. Для получения дополнительной информации об источниках данных см. раздел link:../../introduction/user-interface/record-management/#_Интеграция_данных_системы_с_внешними_данными[Интеграция данных системы с внешними данными]. -* link:../../introduction/user-interface/record-management/#_Импорт_данных[Импорт] записей, для этого нажмите на кнопку {btn}[Импорт предв. контактов], расположенную в меню модуля. За дополнительной информацией об импортировании данных обратитесь в раздел link:../../introduction/user-interface/record-management/#_Импорт_данных[Импорт данных]. +* Получение данных предварительного контакта, используя внешний источник данных. Для получения дополнительной информации об источниках данных см. раздел link:../../introduction/user-interface/record-management/#_интеграция_данных_системы_с_внешними_данными[Интеграция данных системы с внешними данными]. +* link:../../introduction/user-interface/record-management/#_импорт_данных[Импорт] записей, для этого нажмите на кнопку {btn}[Импорт предв. контактов], расположенную в меню модуля. За дополнительной информацией об импортировании данных обратитесь в раздел link:../../introduction/user-interface/record-management/#_импорт_данных[Импорт данных]. * Создание документа в формате PDF - отметьте необходимые записи (если открыта Форма списка) и выберите пункт «Создать письмо (PDF)» в меню действий (или сразу выберите этот пункт в меню, если открыта Форма просмотра записи), после чего выберите необходимый link:../../advanced-modules/pdftemplates[PDF-шаблон]. -* link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт] записей, для этого в форме списка выберите необходимые записи и в меню над выбранными записями выберите пункт *Экспортировать*. -* link:../../introduction/user-interface/record-management/#_Объединение_дублирующихся_записей[Объединение дубликатов], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт *Объединить*. -* link:../../introduction/user-interface/record-management/#_Поиск_и_объединение_схожих_записей[Поиск дубликатов], для этого в меню действий Формы просмотра выберите пункт *Поиск дубликатов*. +* link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт] записей, для этого в форме списка выберите необходимые записи и в меню над выбранными записями выберите пункт *Экспортировать*. +* link:../../introduction/user-interface/record-management/#_объединение_дублирующихся_записей[Объединение дубликатов], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт *Объединить*. +* link:../../introduction/user-interface/record-management/#_поиск_и_объединение_схожих_записей[Поиск дубликатов], для этого в меню действий Формы просмотра выберите пункт *Поиск дубликатов*. * Просмотр информации о выбранных записях в link:../../jjw-maps[картах Google], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт «Показать на карте». * Отслеживание изменений введённой информации, для этого нажмите на кнопку {btn}[Просмотр журнала изменений] в форме просмотра. Если в журнале необходимо изменить перечень контролируемых полей - сделайте это в Студии, настроив параметр link:../../../admin/administration-panel/developer-tools/#Audit[*Аудит*] соответствующего поля. -* Редактирование или удаление информации сразу о нескольких предварительных контактах, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. +* Редактирование или удаление информации сразу о нескольких предварительных контактах, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. * Просмотр детальной информации по предварительному контакту, для этого нажмите на названии предварительного контакта в общем списке. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. * Дублирование информации о предварительном контакте, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих записей, вы можете изменить продублированную информацию с целью создания нового предварительного контакта. * Удаление предварительного контакта, для этого в форме просмотра в меню действий выберите пункт {btn}[Удалить] -* Просмотр и редактирование связанной с предварительным контактом информации, для этого воспользуйтесь link:../../introduction/user-interface/views/#_Субпанели[субпанелями]. +* Просмотр и редактирование связанной с предварительным контактом информации, для этого воспользуйтесь link:../../introduction/user-interface/views/#_субпанели[субпанелями]. * Отправка в архив электронного письма, связанного с данным предварительным контактом, для этого нажмите на кнопку {btn}[Отправить E-mail в архив], расположенную на субпанели *История*. diff --git a/content/user/core-modules/Meetings.adoc b/content/user/core-modules/Meetings.adoc index f9ebeb286..d02ef6272 100644 --- a/content/user/core-modules/Meetings.adoc +++ b/content/user/core-modules/Meetings.adoc @@ -44,9 +44,8 @@ You can also close a Meeting by clicking the Close button on the Detail View of a Meeting. You can also click the Close and Create New button. This will close the Meeting you are viewing and redirect you to the Edit View to create a new record. -* To Reschedule a Meeting, you can click the Reschedule button on the -Detail View of a Meeting. For a detailed guide on rescheduling Meetings, -see the link:./../../advanced-modules/reschedule/[Reschedule] section of this user guide. +* To Reschedule a Meeting, you can edit its `Start Date & Time` field. A practical way to do it +is to double-click to inline-edit the directly from the Detail View of a Meeting. * To delete one or multiple Meetings, you can select multiple records from the List View and click delete. You can also delete a Meeting from the Detail View by clicking the Delete button. For a more detailed guide diff --git a/content/user/core-modules/Meetings.ru.adoc b/content/user/core-modules/Meetings.ru.adoc index cc59c01ba..5f221462a 100644 --- a/content/user/core-modules/Meetings.ru.adoc +++ b/content/user/core-modules/Meetings.ru.adoc @@ -52,7 +52,7 @@ image:image2.png[Назначение встречи] Тема:: Введите тему обсуждения. Статус:: Из выпадающего списка выберите вариант статуса: -Запланирована::: Выберите эту опцию, если встречу только намечено провести. +В планах::: Выберите эту опцию, если встречу только намечено провести. Состоялась::: Выберите эту опцию, если встреча состоялась. Не состоялась::: Выберите эту опцию, если встреча не состоялась. Место встречи:: Место планируемой встречи. @@ -65,7 +65,7 @@ image:image2.png[Назначение встречи] Напоминание:: После нажатия на кнопку {btn}[Добавить напоминание], вы можете напомнить о предстоящем мероприятии всем приглашённым на него участникам. Напоминания могут быть выполнены двумя способами: либо в виде отправки электронного письма на адреса участников, либо в виде всплывающего уведомления браузера. Если на странице настроек пользователя выставлены опции -link:../../introduction/managing-user-accounts/#_Дополнительно[напоминания о мероприятии], то система будет автоматически выставлять параметры при добавлении нового напоминания: +link:../../introduction/managing-user-accounts/#_дополнительно[напоминания о мероприятии], то система будет автоматически выставлять параметры при добавлении нового напоминания: image:image3.png[Напоминание о встрече] @@ -79,7 +79,7 @@ image:image3.png[Напоминание о встрече] . Добавьте приглашённых как это описано в разделе <<Добавление приглашённых>>. . Нажмите на кнопку {btn}[Сохранить] для сохранения введённой информации; нажмите на кнопку {btn}[Отказаться] для возврата к списку встреч без сохранения введённой информации. . Нажмите на кнопку {btn}[Сохранить и отправить приглашения] для рассылки приглашений всем участникам встречи. - . Для создания копии встречи нажмите на кнопку {btn}[Закрыть и создать копию], в этом случае оригинальная запись встречи закроется и ей будет присвоен статус *Состоялась*. Новая запись будет содержать ту же информацию, что и оригинальная запись, за исключением статуса, которому по умолчанию будет присвоено значение *Запланирована*. + . Для создания копии встречи нажмите на кнопку {btn}[Закрыть и создать копию], в этом случае оригинальная запись встречи закроется и ей будет присвоен статус *Состоялась*. Новая запись будет содержать ту же информацию, что и оригинальная запись, за исключением статуса, которому по умолчанию будет присвоено значение *В планах*. == Добавление приглашённых @@ -120,7 +120,7 @@ image:image6.png[Дашлет со встречами] {{% notice tip %}} Вы можете быстро назначить встречу непосредственно в календаре. За более подробной информацией обратитесь к разделу -link:../../core-modules/calendar/#_Быстрое_добавление_мероприятия_в_календаре[Быстрое добавление мероприятия в календаре]. +link:../../core-modules/calendar/#_быстрое_добавление_мероприятия_в_календаре[Быстрое добавление мероприятия в календаре]. {{% /notice %}} @@ -130,9 +130,9 @@ link:../../core-modules/calendar/#_Быстрое_добавление_меро * Сортировка списка записей, для этого нажмите на значок в заголовке сортируемого столбца, для обратной сортировки нажмите на значок ещё раз. * Просмотр информации о выбранных записях в link:../../jjw-maps[картах Google], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт *Показать на карте*. -* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_Избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. -* Редактирование или удаление информации сразу о нескольких встречах, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. -* link:../../introduction/user-interface/record-management/#_Импорт_данных[Импорт] информации о встречах, для этого нажмите на кнопку {btn}[Импорт встреч], расположенную в меню модуля. +* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. +* Редактирование или удаление информации сразу о нескольких встречах, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. +* link:../../introduction/user-interface/record-management/#_импорт_данных[Импорт] информации о встречах, для этого нажмите на кнопку {btn}[Импорт встреч], расположенную в меню модуля. * Просмотр детальной информации о встрече, для этого нажмите на названии встречи в списке встреч. Кроме того, основная информация о встрече будет отображаться в форме *Подробности* при наведении указателя мыши на значок , который расположен справа от каждой записи. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. * Дублирование информации о встрече, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих записей, вы можете изменить продублированную информацию с целью назначения новой встречи. diff --git a/content/user/core-modules/Notes.ru.adoc b/content/user/core-modules/Notes.ru.adoc index ca3d70454..cf7e31edb 100644 --- a/content/user/core-modules/Notes.ru.adoc +++ b/content/user/core-modules/Notes.ru.adoc @@ -28,7 +28,7 @@ image:image1.png[Заметки] Создать заметку или вложение :: Выберите эту опцию для создания заметки/вложения. Заметки :: Выберите эту опцию для просмотра существующих и создания новых заметок. Импорт заметок :: Выберите эту опцию для -link:../../introduction/user-interface/record-management/#_Импорт_данных[импорта] информации о заметках. +link:../../introduction/user-interface/record-management/#_импорт_данных[импорта] информации о заметках. == Создание заметок и вложений @@ -58,11 +58,11 @@ image:image2.png[Создать заметку или вложение] С заметками вы можете выполнять следующие действия: -* Редактирование или удаление информации сразу о нескольких заметках, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. -* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_Избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. +* Редактирование или удаление информации сразу о нескольких заметках, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. +* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. * Просмотр детальной информации о заметке, для этого нажмите на названии заметки в списке заметок. Кроме того, основная информация о заметке будет отображаться в форме *Подробности* при наведении указателя мыши на значок , который расположен справа от каждой записи. * Дублирование информации о заметке, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих записей, вы можете изменить продублированную информацию с целью создания новой заметки. -* link:../../introduction/user-interface/record-management/#_Импорт_данных[Импорт] информации о заметках, для этого нажмите на кнопку {btn}[Импорт заметок], расположенную в меню модуля. +* link:../../introduction/user-interface/record-management/#_импорт_данных[Импорт] информации о заметках, для этого нажмите на кнопку {btn}[Импорт заметок], расположенную в меню модуля. * Удаление информации о заметке, для этого в форме просмотра в меню действий выберите пункт {btn}[Удалить]. diff --git a/content/user/core-modules/Opportunities.ru.adoc b/content/user/core-modules/Opportunities.ru.adoc index 9294de205..cb6d38768 100644 --- a/content/user/core-modules/Opportunities.ru.adoc +++ b/content/user/core-modules/Opportunities.ru.adoc @@ -25,20 +25,20 @@ image:image1.png[Сделки] Каждая сделка должна быть связана с определённым контрагентом, но при этом может быть связана с несколькими предварительными контактами или контактами. Вы можете фиксировать различные стадии сделки, начиная с разведки и заканчивая закрытием сделки. У администратора SuiteCRM есть возможность отредактировать существующий список стадий, руководствуясь спецификой вашей организации. Вы можете связать сделку с маркетинговой кампанией для отслеживания эффективности проводимой кампании. Связанная с маркетинговой кампанией и приносящая доход сделка отражается в графике, показывающим рентабельность инвестиций (ROI). Более подробную информацию вы можете получить в разделе -link:../campaigns/#_Просмотр_показателя_рентабельности_инвестиций_roi[Просмотр показателя рентабельности инвестиций (ROI)]. +link:../campaigns/#_просмотр_показателя_рентабельности_инвестиций_roi[Просмотр показателя рентабельности инвестиций (ROI)]. {{% notice note %}} Сделка может быть связана только с одной маркетинговой кампанией. {{% /notice %}} Вы можете создать запись о сделке непосредственно в системе, либо -link:../../introduction/user-interface/record-management/#_Импорт_данных[импортировать] её из внешнего файла. +link:../../introduction/user-interface/record-management/#_импорт_данных[импортировать] её из внешнего файла. Запись о сделке может быть создана как в самом модуле *Сделки*, так и через соответствующую субпанель Формы просмотра контакта или контрагента. == Создание сделки . Сделка может быть создана как на основе ранее созданного -link:../../advanced-modules/sales/#_Предложения[Предложения], так и с нуля. Для создания сделки в меню модуля выберите пункт *Создать сделку*. +link:../../advanced-modules/sales/#_предложения[Предложения], так и с нуля. Для создания сделки в меню модуля выберите пункт *Создать сделку*. image:image2.png[Создание сделки] @@ -66,19 +66,19 @@ link:../campaigns[маркетинговой кампанией] введите ==== В модуле вы можете выполнять следующие действия: * Сортировка списка записей, для этого нажмите на значок в заголовке сортируемого столбца, для обратной сортировки нажмите на значок ещё раз. -* Редактирование или удаление информации сразу о нескольких сделках, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. -* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_Избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. -* link:../../introduction/user-interface/record-management/#_Импорт_данных[Импорт] информации о сделках, для этого нажмите на кнопку {btn}[Импорт сделок], расположенную в меню модуля. -* link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт] записей, для этого в меню над выбранными записями выберите пункт *Экспортировать*. -* Объединение дубликатов, для этого в меню над выбранными записями выберите пункт *Объединить*. Подробно процесс объединения записей описан в разделе link:../../introduction/user-interface/record-management/#_Объединение_дублирующихся_записей[Объединение дублирующихся записей]. -* link:../../introduction/user-interface/record-management/#_Поиск_и_объединение_схожих_записей[Поиск дубликатов], для этого в меню действий Формы просмотра выберите пункт *Поиск дубликатов*. +* Редактирование или удаление информации сразу о нескольких сделках, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. +* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. +* link:../../introduction/user-interface/record-management/#_импорт_данных[Импорт] информации о сделках, для этого нажмите на кнопку {btn}[Импорт сделок], расположенную в меню модуля. +* link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт] записей, для этого в меню над выбранными записями выберите пункт *Экспортировать*. +* Объединение дубликатов, для этого в меню над выбранными записями выберите пункт *Объединить*. Подробно процесс объединения записей описан в разделе link:../../introduction/user-interface/record-management/#_объединение_дублирующихся_записей[Объединение дублирующихся записей]. +* link:../../introduction/user-interface/record-management/#_поиск_и_объединение_схожих_записей[Поиск дубликатов], для этого в меню действий Формы просмотра выберите пункт *Поиск дубликатов*. * Просмотр информации о выбранных записях в link:../../jjw-maps[картах Google], для этого выберите пункт «Показать на карте». * Просмотр детальной информации по сделке, для этого нажмите на названии сделки в общем списке. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. * Дублирование информации о сделке, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих записей, вы можете изменить продублированную информацию с целью создания новой сделки. * Удаление сделки, для этого нажмите на кнопку {btn}[Удалить]. * Отслеживание изменений введённой информации, для этого нажмите на кнопку {btn}[Просмотр журнала изменений] в форме просмотра. Если в журнале необходимо изменить перечень контролируемых полей - сделайте это в Студии, настроив параметр link:../../../admin/administration-panel/developer-tools/#Audit[*Аудит*] соответствующего поля. -* Просмотр и редактирование связанной со сделкой информации, для этого воспользуйтесь link:../../introduction/user-interface/views/#_Субпанели[субпанелями]. +* Просмотр и редактирование связанной со сделкой информации, для этого воспользуйтесь link:../../introduction/user-interface/views/#_субпанели[субпанелями]. * Отправка E-mail в архив, для этого в Форме просмотра сделки перейдите к субпанели *История* и нажмите на соответствующую кнопку. diff --git a/content/user/core-modules/Projects.ru.adoc b/content/user/core-modules/Projects.ru.adoc index a20000556..145f849d6 100644 --- a/content/user/core-modules/Projects.ru.adoc +++ b/content/user/core-modules/Projects.ru.adoc @@ -44,7 +44,7 @@ image:image2.png[Создание проекта] Менеджер проекта:: Введите имя ответственного за проект. По умолчанию ответственным являетесь вы. Приоритет:: Из выпадающего списка выберите приоритет проекта. Учитывать график работы:: Расчёт продолжительности проекта с учётом настроенного -link:../../../admin/administration-panel/advanced-openadmin/#_Настройка_графика_работы[графика работы] организации. Если опция не отмечена или график организации не настроен - используется стандартная 40-часовая рабочая неделя. +link:../../../admin/administration-panel/advanced-openadmin/#_настройка_графика_работы[графика работы] организации. Если опция не отмечена или график организации не настроен - используется стандартная 40-часовая рабочая неделя. Шаблон проекта:: При необходимости выберите один из шаблонов проекта (модуль «Шаблоны проектов» описан ниже). Описание:: Введите краткое описание проекта. @@ -100,13 +100,13 @@ image:image6.png[Начало-Окончание] ==== Вы можете выполнять следующие действия: * Сортировка списка записей, для этого нажмите на значок в заголовке сортируемого столбца, для обратной сортировки нажмите на значок ещё раз. -* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_Избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. +* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. * Поиск информации о проекте - используйте Фильтры или Расширенные фильтры в Форме списка модуля как это описано в разделе link:../../introduction/user-interface/search[Поиск информации в системе]. Для поиска только ваших записей отметьте опцию *Мои записи*. * Просмотр информации о выбранных записях в link:../../jjw-maps[картах Google], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт *Показать на карте*. -* Редактирование или удаление информации сразу о нескольких записях, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. +* Редактирование или удаление информации сразу о нескольких записях, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. * Просмотр детальной информации о записи, для этого нажмите на названии проекта/проектной задачи в списке. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. -* link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт] записей, для этого в форме списка выберите необходимые сделки и в меню над выбранными записями выберите пункт *Экспортировать*. +* link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт] записей, для этого в форме списка выберите необходимые сделки и в меню над выбранными записями выберите пункт *Экспортировать*. * Дублирование информации о проекте или проектной задаче, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих записей, вы можете изменить продублированную информацию с целью создания новой записи. * Просмотреть на link:../../jjw-maps[картах Google] информацию об участниках проекта. diff --git a/content/user/core-modules/Spots.ru.adoc b/content/user/core-modules/Spots.ru.adoc index b1d062a9c..43a3d5fb3 100644 --- a/content/user/core-modules/Spots.ru.adoc +++ b/content/user/core-modules/Spots.ru.adoc @@ -55,7 +55,7 @@ image:image2.png[Создание сводки-гистограмма] == Отображение сводок в дашлетах Также как и Отчёты, Сводки могут быть отображены на основной странице в соответствующем дашлете (см. раздел -link:../../advanced-modules/reports/#_Отображение_отчётов_в_дашлетах[Отображение отчётов в дашлетах]). +link:../../advanced-modules/reports/#_отображение_отчётов_в_дашлетах[Отображение отчётов в дашлетах]). При настройке дашлета Сводки доступны следующие параметры: @@ -68,9 +68,9 @@ link:../../advanced-modules/reports/#_Отображение_отчётов_в_ В модуле вы можете выполнять следующие действия: * Сортировка списка записей, для этого нажмите на значок в заголовке сортируемого столбца, для обратной сортировки нажмите на значок ещё раз. -* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_Избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. -* Редактирование или удаление информации сразу о нескольких сводках, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. -* link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт] записей, для этого в меню над выбранными записями выберите пункт *Экспортировать*. +* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. +* Редактирование или удаление информации сразу о нескольких сводках, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. +* link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт] записей, для этого в меню над выбранными записями выберите пункт *Экспортировать*. * Просмотр детальной информации о сводке, для этого нажмите на названии отчёта в общем списке. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. * Удаление сводки, для этого нажмите на кнопку {btn}[Удалить]. diff --git a/content/user/core-modules/Surveys.ru.adoc b/content/user/core-modules/Surveys.ru.adoc index 46276ed89..4dd42f47d 100644 --- a/content/user/core-modules/Surveys.ru.adoc +++ b/content/user/core-modules/Surveys.ru.adoc @@ -26,7 +26,7 @@ ifdef::env-github[:btn:] Данный модуль позволяет подготавливать различные онлайн-опросы. Результаты проведённого опроса сохраняются в базе данных SuiteCRM и при необходимости могут быть просмотрены как в виде сводного отчёта, так и по каждому адресату в отдельности. Опросы могут проводиться либо через отдельные веб-страницы, либо в виде рассылки маркетинговой кампании как это описано в разделе -link:../../core-modules/campaigns/#_Создание_маркетинговой_кампании[Создание маркетинговой кампании]. +link:../../core-modules/campaigns/#_создание_маркетинговой_кампании[Создание маркетинговой кампании]. == Создание опроса @@ -66,7 +66,7 @@ image:image1.png[Добавление вопросов] |Переключатель |Используется для указания только одного ответа из предложенного перечня. |Комбобокс |Используется для выбора только одного ответа из предложенного перечня. |Множественный выбор |Используется для выбора нескольких ответов из предложенного перечня. -|Голосование |На каждый вопрос необходимо выбрать один из трёх предложенных ответов. Могут быть использованы либо предустановленные варианты ответов #(*Satisfied*, *Neither Satisfied nor Dissatisfied* or *Dissatisfied*),# либо отредактированные варианты (см. выше). +|Голосование |На каждый вопрос необходимо выбрать один из трёх предложенных ответов. Могут быть использованы либо предустановленные варианты ответов (*Положительный*, *Нейтральный* или *Отрицательный*), либо отредактированные варианты (см. выше). |Дата и время |Выбор даты и времени во всплывающем календаре. |Дата |Выбор даты во всплывающем календаре. |Шкала (10 баллов) |Выбор от 1 до 10 баллов по 10-бальной шкале. @@ -113,12 +113,12 @@ image:image4.png[Просмотр созданного опроса] {{% /notice %}} В верхней части страницы опроса отображается стандартный логотип системы. При необходимости от может быть изменён в панели Администратора как это описано в разделе -link:../../../admin/administration-panel/system/#_Настройка_конфигурации[Настройка конфигурации]. +link:../../../admin/administration-panel/system/#_настройка_конфигурации[Настройка конфигурации]. == Результаты опроса В Форме просмотра каждого опроса отображается субпанель с результатами опроса по каждому ответившему адресату. Эта же панель доступна при просмотре -link:../../core-modules/campaigns/#_Просмотр_статуса_маркетинговой_кампании[статуса маркетинговой кампании]. +link:../../core-modules/campaigns/#_просмотр_статуса_маркетинговой_кампании[статуса маркетинговой кампании]. image:image6.png[Результаты опроса] @@ -145,8 +145,8 @@ image:image9.png[Пример отчёта по опросу] В модуле вы можете выполнять следующие действия: * Сортировка списка записей, для этого нажмите на значок в заголовке сортируемого столбца, для обратной сортировки нажмите на значок ещё раз. -* Добавление записи в избранное – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. За дополнительной информацией обратитесь к разделу link:../../introduction/user-interface/navigation-elements/#_Избранное[Избранное]. -* Редактирование или удаление информации сразу в нескольких опросах, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. +* Добавление записи в избранное – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. За дополнительной информацией обратитесь к разделу link:../../introduction/user-interface/navigation-elements/#_избранное[Избранное]. +* Редактирование или удаление информации сразу в нескольких опросах, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. * Просмотр детальной информации о встрече, для этого нажмите на названии опроса в Форме списка. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. * Дублирование информации об опросе, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих записей, вы можете изменить продублированную информацию с целью создания нового опроса. @@ -156,7 +156,7 @@ image:image9.png[Пример отчёта по опросу] == Проведение опроса в рамках маркетинговой кампании В данном разделе описываются особенности проведения маркетинговой кампании при рассылке опросов. Детальная информация о проведении маркетинговых кампаний других типов описана в разделе -link:../../core-modules/campaigns/#_Создание_маркетинговой_кампании[Создание маркетинговой кампании]. +link:../../core-modules/campaigns/#_создание_маркетинговой_кампании[Создание маркетинговой кампании]. Опрос может быть проведён в рамках маркетинговой кампании, в этом случае все поступившие от адресатов ответы будут сохранены в базе данных системы. @@ -179,7 +179,7 @@ image:image11.png[Проведение опроса в рамках маркет image:image12.png[Проведение опроса в рамках маркетинговой кампании-настройка шаблона кампании] Полученные от адресатов ответы будут доступны в субпанели *Результаты опроса* как это описано в разделе -link:../../core-modules/campaigns/#_Просмотр_статуса_маркетинговой_кампании[Просмотр статуса маркетинговой кампании]. +link:../../core-modules/campaigns/#_просмотр_статуса_маркетинговой_кампании[Просмотр статуса маркетинговой кампании]. Оставшиеся шаги работы мастера детально описаны в разделе -link:../../core-modules/campaigns/#_Создание_маркетинговой_кампании[Создание маркетинговой кампании] и здесь не рассматриваются. +link:../../core-modules/campaigns/#_создание_маркетинговой_кампании[Создание маркетинговой кампании] и здесь не рассматриваются. diff --git a/content/user/core-modules/Target Lists.adoc b/content/user/core-modules/Target Lists.adoc index 8d7020cbf..7b9e48c7c 100644 --- a/content/user/core-modules/Target Lists.adoc +++ b/content/user/core-modules/Target Lists.adoc @@ -80,4 +80,4 @@ operational opt-out link in the emails, a suppression list of this kind is requi |Test |The list of those you want to receive the test emails from the Campaign, while you're still working on the form and content of your message. You can send your Campaign to the test list multiple times by using the btn:[Delete Test Entries] button on the *View Status* page between re-sends. - +|======= diff --git a/content/user/core-modules/Target Lists.ru.adoc b/content/user/core-modules/Target Lists.ru.adoc index 08866e332..e134d7685 100644 --- a/content/user/core-modules/Target Lists.ru.adoc +++ b/content/user/core-modules/Target Lists.ru.adoc @@ -24,7 +24,7 @@ ifdef::env-github[:btn:] Вы можете добавлять адресатов в список адресатов следующим образом: -* link:../../introduction/user-interface/record-management/#_Импорт_данных[Импортированием записей] из текстового файла. +* link:../../introduction/user-interface/record-management/#_импорт_данных[Импортированием записей] из текстового файла. * Добавлением существующих записей из списка контактов, контрагентов, предварительных контактов, а также из уже существующих адресатов. В списках адресатов могут быть указаны персоны/контрагенты, как включённые в маркетинговую кампанию, так и исключённые из неё. Возможно создание следующих типов списков адресатов: @@ -63,7 +63,7 @@ image:image1.png[Создание списка адресатов] {{% notice tip %}} Вы можете создать нового адресата через -link:../campaigns/#_Создание_Веб_формы_регистрации[Веб-форму регистрации] адресата. Введённая в форму информация сохраняется в базе данных SuiteCRM. +link:../campaigns/#_создание_веб_формы_регистрации[Веб-форму регистрации] адресата. Введённая в форму информация сохраняется в базе данных SuiteCRM. {{% /notice %}} == Управление информацией о списках адресатов @@ -71,11 +71,11 @@ link:../campaigns/#_Создание_Веб_формы_регистрации[В В модуле вы можете выполнять следующие действия: * Сортировка списка записей, для этого нажмите на значок в заголовке сортируемого столбца, для обратной сортировки нажмите на значок ещё раз. -* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_Избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. -* Редактирование или удаление информации сразу о нескольких списках адресатов, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. +* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. +* Редактирование или удаление информации сразу о нескольких списках адресатов, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. * Просмотр детальной информации о списке адресатов, для этого нажмите на названии списка адресатов в общем списке. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. * Дублирование информации об адресате, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих документов, вы можете изменить продублированную информацию с целью создания нового списка адресатов. * Удаление списка адресатов, для этого нажмите на кнопку {btn}[Удалить]. -* link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт] записей, для этого в форме списка выберите необходимые списки адресатов и в меню над выбранными записями выберите пункт *Экспортировать*. -* Просмотр и редактирование связанной с адресатом информации, для этого воспользуйтесь link:../../introduction/user-interface/views/#_Субпанели[субпанелями]. +* link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт] записей, для этого в форме списка выберите необходимые списки адресатов и в меню над выбранными записями выберите пункт *Экспортировать*. +* Просмотр и редактирование связанной с адресатом информации, для этого воспользуйтесь link:../../introduction/user-interface/views/#_субпанели[субпанелями]. diff --git a/content/user/core-modules/Targets.ru.adoc b/content/user/core-modules/Targets.ru.adoc index a168d055e..fd7fe3785 100644 --- a/content/user/core-modules/Targets.ru.adoc +++ b/content/user/core-modules/Targets.ru.adoc @@ -42,7 +42,7 @@ link:../target-lists/[список адресатов] в соответстви Адресаты :: Выберите эту опцию для просмотра существующих адресатов. Создать адресата :: Выберите эту опцию для создания нового адресата. Импорт адресатов :: Выберите эту опцию, если необходимо -link:../../introduction/user-interface/record-management/#_Импорт_данных[импортировать] информацию об адресатах из внешнего приложения или файла. +link:../../introduction/user-interface/record-management/#_импорт_данных[импортировать] информацию об адресатах из внешнего приложения или файла. {{% notice tip %}} При импорте адресатов на последнем шаге мастера импорта доступна кнопка добавления импортированных адресатов в указанный список адресатов. @@ -116,7 +116,7 @@ link:../campaigns/[Маркетинг]. {{% notice note %}} Вы можете создать нового адресата через -link:../campaigns/#_Создание_Веб_формы_регистрации[Веб-форму регистрации] адресата. Введённая в форму информация сохраняется в базе данных SuiteCRM. +link:../campaigns/#_создание_веб_формы_регистрации[Веб-форму регистрации] адресата. Введённая в форму информация сохраняется в базе данных SuiteCRM. {{% /notice %}} == Управление информацией об адресатах @@ -124,9 +124,9 @@ link:../campaigns/#_Создание_Веб_формы_регистрации[В В модуле вы можете выполнять следующие действия: * Сортировка списка записей, для этого нажмите на значок в заголовке сортируемого столбца, для обратной сортировки нажмите на значок ещё раз. -* Добавление записи в избранное – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. За дополнительной информацией обратитесь к разделу link:../../introduction/user-interface/navigation-elements/#_Избранное[Избранное]. +* Добавление записи в избранное – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. За дополнительной информацией обратитесь к разделу link:../../introduction/user-interface/navigation-elements/#_избранное[Избранное]. * Просмотр информации о выбранных записях в link:../../jjw-maps[картах Google], для этого в Форме списка отметьте необходимые записи и в меню действий выберите пункт *Показать на карте*. -* Редактирование или удаление информации сразу о нескольких адресатах, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. +* Редактирование или удаление информации сразу о нескольких адресатах, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. * Просмотр детальной информации об адресате, для этого нажмите на названии адресата в общем списке. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. * Дублирование информации об адресате, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих документов, вы можете изменить продублированную информацию с целью создания нового адресата. @@ -138,7 +138,7 @@ link:../campaigns/#_Создание_Веб_формы_регистрации[В image:image3.png[Управление подписками] -* Экспорт записей, для этого в форме списка выберите необходимых адресатов и в меню над выбранными записями выберите пункт *Экспортировать*. Подробно процесс экспорта данных описан в разделе link:../../introduction/user-interface/record-management/#_Экспорт_данных[Экспорт данных]. +* Экспорт записей, для этого в форме списка выберите необходимых адресатов и в меню над выбранными записями выберите пункт *Экспортировать*. Подробно процесс экспорта данных описан в разделе link:../../introduction/user-interface/record-management/#_экспорт_данных[Экспорт данных]. * Экспорт адресата в формате vCard. В Форме просмотра адресата нажмите на кнопку {btn}[vCard], расположенную справа от ФИО адресата. Появится диалоговое окно, предлагающее сохранить файл или открыть его в ассоциированном приложении. -* Просмотр и редактирование связанной с адресатом информации, для этого воспользуйтесь субпанелями, более подробную информацию вы можете получить в разделе link:../../introduction/user-interface/views/#_Субпанели[Субпанели]. +* Просмотр и редактирование связанной с адресатом информации, для этого воспользуйтесь субпанелями, более подробную информацию вы можете получить в разделе link:../../introduction/user-interface/views/#_субпанели[Субпанели]. diff --git a/content/user/core-modules/Tasks.ru.adoc b/content/user/core-modules/Tasks.ru.adoc index d3e3ac4f5..4547a5680 100644 --- a/content/user/core-modules/Tasks.ru.adoc +++ b/content/user/core-modules/Tasks.ru.adoc @@ -28,7 +28,7 @@ image:image1.png[Задачи] Создать задачу:: Выберите эту опцию для назначения задачи. Задачи:: Выберите эту опцию для просмотра существующих и создания новых задач. Импорт задач:: Выберите эту опцию для -link:../../introduction/user-interface/record-management/#_Импорт_данных[импорта] задач. +link:../../introduction/user-interface/record-management/#_импорт_данных[импорта] задач. == Создание задач @@ -64,12 +64,12 @@ image:image2.png[Создать задачу] В модуле вы можете выполнять следующие действия: -* Редактирование или удаление информации сразу о нескольких задачах, для этого используйте link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[панель массового обновления]. -* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_Избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. +* Редактирование или удаление информации сразу о нескольких задачах, для этого используйте link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[панель массового обновления]. +* Добавление записи в link:../../introduction/user-interface/navigation-elements/#_избранное[избранное] – после чего пользователь получает возможность быстрого доступа к наиболее важной для него информации. * Просмотр детальной информации о задаче, для этого нажмите на названии задачи в списке задач. Кроме того, основная информация о задаче будет отображаться в форме *Подробности* при наведении указателя мыши на символ , который расположен справа от каждой записи. * Редактирование данных, для этого либо в Форме просмотра нажмите на кнопку {btn}[Править], либо непосредственно в Форме списка нажмите на кнопку слева от редактируемой записи. Вы также можете выполнить link:../../introduction/user-interface/in-line-editing/[быструю правку]. * Дублирование информации о задаче, для этого в меню действий выберите пункт {btn}[Дублировать]. Дублирование является удобным способом быстрого создания схожих записей, вы можете изменить продублированную информацию с целью создания новой задачи. -* link:../../introduction/user-interface/record-management/#_Импорт_данных[Импорт] задач, для этого нажмите на кнопку {btn}[Импорт задач], расположенную в меню модуля. +* link:../../introduction/user-interface/record-management/#_импорт_данных[Импорт] задач, для этого нажмите на кнопку {btn}[Импорт задач], расположенную в меню модуля. * Удаление задачи, для этого в Форме просмотра нажмите на кнопку {btn}[Удалить]. * Поиск информации о задаче - используйте link:../../introduction/user-interface/search[Фильтры или Расширенные фильтры] в Форме списка модуля. Для поиска только ваших записей отметьте опцию *Мои записи*, для поиска незавершённых задач отметьте опцию *Актуальные*. diff --git a/content/user/introduction/Getting Started.pt.adoc b/content/user/introduction/Getting Started.pt.adoc new file mode 100644 index 000000000..6b9a38a15 --- /dev/null +++ b/content/user/introduction/Getting Started.pt.adoc @@ -0,0 +1,51 @@ +--- +Title: Começar +Weight: 20 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +:experimental: ////this is here to allow btn:[]syntax used below + +:imagesdir: ./../../../images/en/user + += Começar + +== Entrar no SuiteCRM + +O SuiteCRM permite que os utilizadores entrem com um +nome de utilizador e password, que lhe são fornecidos +pelo Administrador do Sistema. + +image:190Home_screen.png[title="Écran de Entrada"] + +image:02Login_with_language.png[title="Seleccionar Idioma"] + +Antes de entrar no SuiteCRM, pode seleccionar o idioma que preferir. +Há idiomas pré-definidos disponíveis para o SuiteCRM e há também +pacotes de idiomas adicionais. + +Depois de escolher o idioma e inserir as suas credenciais de +acesso, pode clicar em btn:[Log in] para aceder ao CRM. + +image:191Log_in.png[title="Log in"] + +== Password Esquecida + +Se se esquecer da sua password do CRM e não conseguir aceder, pode usar +a funcionalidade 'Password Esquecida' para re-enviar a sua +password para o endereço de email associado à sua conta de utilizador. +Ao clicar no link *'Password Esquecida?'* no formulário de entrada irá +ser apresentado o formulário de password esquecida. + +image:179Forgot_password.png[title="Password Esquecida"] + +== Sumário + +Neste capítulo demonstrámos como aceder ao SuiteCRM através do formulário +de entrada. Mostrámos também como usar a funcionalidade de password +esquecida para recurar uma password esquecida ou perdida. + +No capítulo seguinte vamos apresentar o User Wizard, que permite a definição +de preferências de uso para o SuiteCRM. diff --git a/content/user/introduction/Getting Started.ru.adoc b/content/user/introduction/Getting Started.ru.adoc index d1bc6eb1e..0ffe7c92f 100644 --- a/content/user/introduction/Getting Started.ru.adoc +++ b/content/user/introduction/Getting Started.ru.adoc @@ -91,5 +91,5 @@ a|. Откройте браузер и в адресной строке введ |image:image2.png[Восстановление пароля] |Введите свой логин, зарегистрированный в системе адрес вашей электронной почты, и нажмите на кнопку {btn}[Отправить E-mail]. + Если все данные были введены правильно, на указанный адрес будет выслано письмо, содержащее ссылку на специальную страницу системы, где вы сможете указать новый пароль доступа в систему. Если ссылка восстановления пароля недоступна – обратитесь к администратору SuiteCRM для включения данной возможности в -link:../../../admin/administration-panel/users/#_Управление_паролями[панели Администрирования]. +link:../../../admin/administration-panel/users/#_управление_паролями[панели Администрирования]. |=== diff --git a/content/user/introduction/User Interface/Desktop Notifications.pt.adoc b/content/user/introduction/User Interface/Desktop Notifications.pt.adoc new file mode 100644 index 000000000..930928f1f --- /dev/null +++ b/content/user/introduction/User Interface/Desktop Notifications.pt.adoc @@ -0,0 +1,62 @@ +--- +Title: Notificações do Ambiente de Trabalho +Weight: 57 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +:experimental: ////this is here to allow btn:[]syntax used below + +:imagesdir: /images/en/user + += Notificações de Ambiente de Trabaho + +== Activar as Notifiações de Ambiente de Trabalho + +Pode activar as notificações de Ambiente de Trabalho através da tab +*'Avançada'* nas suas preferências. Isto irá activar as notificações +de ambiente de trabalho neste browser para este computador. Pode +escolher activar as notificações apenas para esta sessão do browser +ou activá-las em permanência. + +{{% notice note %}} +Os utilizadores terão que activar as notificações do ambiente de +trabalho em todos os browsers e todos os computadores se usarem +mais que um. +{{% /notice %}} + +image:199Enable_desktop_notifications.png[title="Activar Notificações de Ambiente de Trabalho"] + +Após a activação das notificações de ambiente de trabalho, os +utilizadores irão receber notificações para todos os eventos de +Calendário, tais como: + +* *Reuniões* – Reuniões para as quais foi convidado que tenham +os popups de lembrete activados. +* *Chamadas* – Chamadas para as quais tenha sido convidado que +tenham os popus de lembrete activados. + +== Gerir Notificações de Ambiente de Trabalho + +Se não tem notificações, o contador de notificações irá mostrar '0' +para indicar que não tem notificações a verificar. + +image:65Managing_notifications.png[title="Notificações"] + +Se não clicar numa notificação quando esta é mostrada no broser, por +exemplo quando está longe do teclado, a notificação irá ser à lista +de notificações mostrada através do contador na barra de navegação +principal. + +image:66Managing_notifications.png[title="Gerir Notificações"] + +Pode gerir as suas notificações de ambiente de trabalho ao clicar +no ícone que irá mostrar as notificações existentes. + +image:67Managing_notifications.png[title="Mostrar notificações"] + +Pode clicar na notificação que o irá levar ao registo relacionado com a +notificação, ou pode clicar no pequeno ícone de 'x' para a limpar +imediatamente. + diff --git a/content/user/introduction/User Interface/Desktop Notifications.ru.adoc b/content/user/introduction/User Interface/Desktop Notifications.ru.adoc index 319195ffc..d6224aa99 100644 --- a/content/user/introduction/User Interface/Desktop Notifications.ru.adoc +++ b/content/user/introduction/User Interface/Desktop Notifications.ru.adoc @@ -20,7 +20,7 @@ ifdef::env-github[:btn:] == Уведомления При наступлении времени мероприятия (звонка или встречи) браузер может отобразить соответствующее уведомление. (Для настройки всплывающих -уведомлений обратитесь к описанию link:../../managing-user-accounts/#_Дополнительно[настроек пользователя]). Если пользователь не нажал на всплывшее окно +уведомлений обратитесь к описанию link:../../managing-user-accounts/#_дополнительно[настроек пользователя]). Если пользователь не нажал на всплывшее окно уведомления, то запись добавляется в список напоминаний, и справа от учётной записи пользователя отображается количество пропущенных уведомлений о мероприятиях, назначенных пользователю. @@ -31,4 +31,9 @@ image:image10.png[Количество пропущенных уведомлен |image:image10a.png[Просмотр пропущенных уведомлений] |Нажав на иконку, пользователь может просмотреть детальную информацию о пропущенных уведомлениях и, в случае необходимости, перейти к просмотру выбранного мероприятия, нажав на его заголовок. Кнопка {btn}[Очистить всё] удаляет все записи из списка пропущенных уведомлений. -|=== \ No newline at end of file +|=== + +{{% notice tip %}} +При необходимости в окне пропущенных уведомлений можно отображать и другую полезную информацию, настроив соответствующие +link:../../../advanced-modules/workflow-calculated-fields/#_добавление_сообщения_о_преобразованном_предварительном_контакте_в_список_уведомлений[Процессы^]. +{{% /notice %}} \ No newline at end of file diff --git a/content/user/introduction/User Interface/Home Page.pt.adoc b/content/user/introduction/User Interface/Home Page.pt.adoc new file mode 100644 index 000000000..4a4ef2d14 --- /dev/null +++ b/content/user/introduction/User Interface/Home Page.pt.adoc @@ -0,0 +1,133 @@ +--- +Title: Home Page +Weight: 52 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +:experimental: ////this is here to allow btn:[]syntax used below + +:imagesdir: /images/en/user + += Página de Entrada + +A página de entrada é a primeira página mostrada após a autenticação. +Vários elementos desta página podem ser configurados, tais como +Dashlets (Miniaplicações), Dashboards e Barra Lateral (Sidebar). + +== Dashlets (Miniaplicações) + +Os dashlets são secções mostradas na página de entrada, configuráveis +pelo utilizador, que podem mostrar uma olhadela rápida sobre os +registos e actividades logo após o login. Isto é particularmente +útil para as equipas de vendas e suporte, pois reduz o número de +cliques para aceder aos dados. + +Os dashlets podem ser arrastadas e reordenadas dentro da página de +entrada. Pode acrescentar dashlets clicando na ligação +'Acrescentar Dashlets' na página de entrada. + +image:24Add_dashlets.png[title="Acrescentar Dashlets"] + +Clicar na ligação 'Acresecntar Dashlets' na página de entrada irá +mostrar o popup de "Acrescentar Dashlets" que permite escolher dos +dashlets disponíveis para acrescentar à página de entrada. + +image:25Add_dashlets.png[title="Selecção de Dashlets"] + +Para acrescentar um dos dashlets, basta clicar na ligação do dashlet. +Esta acção irá acrescentar o dashlet à página de entrada do utilizador. +O popup ficará aberto, para permitir acrescentar mais dashlets. Quando +não quiser acrescentar mais dashlets, pode fechar o popup. + +image:26Dashlet.png[title="Dashlet"] + +Pode modificar os dashlets clicando no ícone do lápis no dashlet desejado. + +image:27Modify_dashlet.png[title="Modificar dashlet"] + +Clicar no ícone do lápis irá abrir um popup. Este popup inclui todas as +opções configuráveis para o dashlet. + +image:28Configure_dashlet.png[title="Configurar dashlet"] + +Após ter alterado as definições no popup de configuração de dashlet, pode clicar +em btn:[Guardar] para aplicar as novas definições, ou btn:[Cancelar] se +pretender voltar atrás e desfazer-se das alterações introduzidas. + +{{% notice note %}} +Alguns dashlets exigem que a página de entrada seja recarregada. Se tiver algum +deles activo, será notificado. +{{% /notice %}} + +== Painéis de Bordo + +Painéis de bordo (ou Dashboards) são uma novidade no suiteCRM. Saõ configuráveis +por utilizador e podem ser acrescentados ou removidos de modo similar aos +dashlets. Para acrescentar um separador para painéis de bordo, pode clicar na +ligação 'Acrescentar Separador' na página de entrada.. + +image:29Add_tab.png[title="Acrescentar Separador"] + +Ao clicar na ligação 'Acrescentar Separador' na página de entrada irá ser +mostrada a popup para Acrescentar Separador que permite que o utilizador indique +um nome para o separador e também quantas colunas a página. Pode optar por uma, +duas ou três colunas. + +image:192Add_tab.png[title="Acrescentar Separador"] + +Após ter indicado os detalhes do separador pode clicar em btn:[Guardar]. Pode +também clicar em btn:[Cancelar] para desfazer as alterações. Depois de ter +guardado as alterações, o separador Painel de Bordo será crescentado à página de +entrada e mostrado na lista de separadores da página. Pode, em seguida, +acrescentar os dashlets que pretender ao seu novo Painel de Bordo. + +image:31New_tab.png[title="Novo separador"] + +Se desejar eliminar o separador de painel de bordo, pode clicar no ícone 'x'. A +acção será alvo de confirmação e, caso confirme, o separador será removido do +seu perfil. + +{{% notice note %}} +*Suite Dashboard* +é o separador padrão que naõ pode ser removido. Pode, no entanto, configurar os +dashlets que são mostrados nesse separador. +{{% /notice %}} + +== Activity Stream (Mural) + +O Mural (Activity Stream) é um excelente método de se manter a par das +interacções dos seus colegas com o SuiteCRM. O mural vem pré-definido para +mostrar as actualizações relativas a Oportunidades, Contatos, Leads e +Ocorrências. As feeds do Twitter e Facebook da sua organização podem também ser +incluídas neste dashlet, se assim for configurado por um administrador. + +image:32Activity_stream.png[title="Mural"] + +Pode também comentar uma actualização que apareça no Mural através do botão +Responder no lado direito do post. + +image:33Reply.png[title="Responder ao post"] + +O seus posts podem ser apagados do Mural ao clicar no botão Apagar. + +image:34Delet3.png[title="Apagar post"] + +O seu comentário irá aparcer sob o post e marcado com data e hora. + +O Mural é também uma ferramenta útil para mensagens instantâneas dentro da sua +organização. É possível enviar mensagens para todos os utilizadores. Para o +conseguir, escreva a sua mensagem e clique em btn:[Post] + +image:35Activity_post.png[title="Post do Mural"] + +Os seus colegas verão esta mensagem e terão a oportunidade de responder ao +clicar no botão Responder, à direita do post. + +image:36Reply.png[title="Resposta no Mural"] + +A resposta aparecerá sob o seu post, também marcada com data e hora. + +image:37Reply_view.png[title="Resposta a post"] + diff --git a/content/user/introduction/User Interface/Home Page.ru.adoc b/content/user/introduction/User Interface/Home Page.ru.adoc index 8790f9859..7804f4c45 100644 --- a/content/user/introduction/User Interface/Home Page.ru.adoc +++ b/content/user/introduction/User Interface/Home Page.ru.adoc @@ -24,7 +24,7 @@ ifdef::env-github[:btn:] После регистрации в системе пользователь попадает на основную закладку, которая по умолчанию называется также как и система - SuiteCRM. Название может отличаться от указанного, если администратор изменил название системы в -link:../../../../admin/administration-panel/system#_Настройка_конфигурации[настройках конфигурации]. +link:../../../../admin/administration-panel/system/#_настройка_конфигурации[настройках конфигурации]. Основная закладка содержит несколько панелей, содержащих наиболее актуальную информацию о планируемых вами звонках, встречах, задачах, данные о ваших новых контрагентах, сделках, предварительных контактах, обращениях и т.д. @@ -58,7 +58,7 @@ image:image89.png[Основная закладка] {{% notice note %}} Если у вас нет возможности добавлять или перемещать дашлеты – обратитесь к администратору SuiteCRM для настройки необходимого функционала (см. раздел -link:../../../../admin/administration-panel/system#_Настройка_конфигурации[Настройка конфигурации]). +link:../../../../admin/administration-panel/system/#_настройка_конфигурации[Настройка конфигурации]). {{% /notice %}} @@ -91,9 +91,9 @@ image:image91.png[Добавить дашлет] {{% notice note %}} Окно настройки параметров дашлета состоит из двух частей (форм): верхней (где можно указать основные настройки дашлета) и нижней (где можно настроить фильтры дашлета). Обе формы могут быть дополнительно настроены в Студии, за дополнительной информацией обращайтесь к разделам -link:../../../../admin/administration-panel/developer-tools#_Редактирование_Формы_списка_и_Формы_основных_настроек_дашлета[Редактирование Формы списка и Формы основных настроек дашлета] +link:../../../../admin/administration-panel/developer-tools/#_редактирование_формы_списка_и_формы_основных_настроек_дашлета[Редактирование Формы списка и Формы основных настроек дашлета] и -link:../../../../admin/administration-panel/developer-tools#_Редактирование_Форм_фильтров_модуля_и_Формы_фильтра_дашлета[Редактирование Форм фильтров модуля и Формы фильтра дашлета]. +link:../../../../admin/administration-panel/developer-tools/#_редактирование_форм_фильтров_модуля_и_формы_фильтра_дашлета[Редактирование Форм фильтров модуля и Формы фильтра дашлета]. {{% /notice %}} image:image92.png[Настройка дашлета] diff --git a/content/user/introduction/User Interface/In-line Editing.pt.adoc b/content/user/introduction/User Interface/In-line Editing.pt.adoc new file mode 100644 index 000000000..e65cde414 --- /dev/null +++ b/content/user/introduction/User Interface/In-line Editing.pt.adoc @@ -0,0 +1,70 @@ +--- +Title: Edição em Linha +Weight: 56 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +:experimental: ////this is here to allow btn:[]syntax used below + +:imagesdir: /images/en/user + += Edição em Linha + +A edição em linha permite a alteração de valores "no local". Esta funcionalidade +foi implementada tanto nas vistas de Lista como de Detalhe, permitindo a +alteração rápida de valores, sem necessidade de mudar para a vista de Edição e +reduzindo o número de clicks necessários. + +{{% notice note %}} +A edição em linha pode ser activada e desactivada para as vistas de Lista e de +Detalhe, nas definições do Sistema, pelo Administrador do Sistema. +{{% /notice %}} + +image:186In-line_editing.png[title="Activar Edição em linha"] + +== Edição em linha na vista de Lista + +Pode editar o registo na vista de Lista ao clicar nos campos com um ícone de +lápis. + +image:60ListView_editing.png[title="Edição em linha na Vista de Lista"] + +Pode clicar no ícone do lápis ou dar um duplo clique no campo para alterar o +valor. + +image:61ListView_editing.png[title="Editar campo na Vista de Lista"] + +Após ter alterado o valor desejado, pode usar a tecla Enter ou clicar na 'marca +de verificação'. Qualquer uma destas acções irá guardar as alterações. Se +navegar para outra zona sem guardar as alterações, ser-lhe-á mostrada uma +mensagem a alertar para o facto de haver alterações não guardadas. + +image:image71.png[image71.png,title="image71.png"] + +Pode clicar em *Cancelar* e continuar a alterar o valor, ou pode clicar em *OK* +e descartar as alterações. + +== Edição em linha na Vista de Detalhe + +Como na Vista de lista, pode editar o registo ao clicar nos campos com um ícone +de lápis. + +image:62DetailView_Editing.png[title="Edição em linha na Vista de Detalhe"] + +Pode clicar no ícone do lápis ou dar um duplo clique no campo para alterar o +valor. + +image:63DetailView_editing.png[title="Editar campo na Vista de Detalhe"] + +Após ter alterado o valor desejado, pode usar a tecla Enter ou clicar na 'marca +de verificação'. Qualquer uma destas acções irá guardar as alterações. Se +navegar para outra zona sem guardar as alterações, ser-lhe-á mostrada uma +mensagem a alertar para o facto de haver alterações não guardadas. + +image:image74.png[title="Aviso de alterações não guardadas"] + +Pode clicar em *Cancelar* e continuar a alterar o valor, ou pode clicar em *OK* +e descartar as alterações. + diff --git a/content/user/introduction/User Interface/In-line Editing.ru.adoc b/content/user/introduction/User Interface/In-line Editing.ru.adoc index 93bd483c8..2800d0e1a 100644 --- a/content/user/introduction/User Interface/In-line Editing.ru.adoc +++ b/content/user/introduction/User Interface/In-line Editing.ru.adoc @@ -25,9 +25,9 @@ ifdef::env-github[:btn:] {{% notice note %}} Функция быстрой правки может быть включена отдельно как для Формы списка, так и для Формы просмотра. Включение выполняется администратором SuiteCRM в -link:../../../../admin/administration-panel/system/#_Настройка_конфигурации[Настройках конфигурации] +link:../../../../admin/administration-panel/system/#_настройка_конфигурации[Настройках конфигурации] панели администрирования. Кроме того, функция быстрой правки может быть настроена в Студии для каждого поля индивидуально. Более подробная информация на эту тему доступна в разделе -link:../../../../admin/administration-panel/developer-tools/#_Создание_и_редактирование_полей[Создание и редактирование полей]. +link:../../../../admin/administration-panel/developer-tools/#_создание_и_редактирование_полей[Создание и редактирование полей]. {{% /notice %}} Для редактирования поля непосредственно в Форме списка подведите diff --git a/content/user/introduction/User Interface/Navigation Elements.pt.adoc b/content/user/introduction/User Interface/Navigation Elements.pt.adoc new file mode 100644 index 000000000..6451ed163 --- /dev/null +++ b/content/user/introduction/User Interface/Navigation Elements.pt.adoc @@ -0,0 +1,110 @@ +--- +Title: Elementos de Navegação +Weight: 51 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +:experimental: ////this is here to allow btn:[]syntax used below + +:imagesdir: /images/en/user + += Elementos de Navigação + +A possibilidade de ver e navegar facilmente para as várias áreas do +CRM é fundamental para a melhoria da produtividade e adopção pelos +utilizadores. O SuiteCRM tem uma UI clara, com vários elementos que +vamos abordar nesta secção. + +== Menu de navegação de topo + +O menu de topo da navegação é o menu principal que os utilizadores +irão usar para navegar para os módulos, de modo a criar e gerir +registos. O layout padrão para o menu de topo é uma lista de 10 +módulos. A ordem em que este menu é apresentado é a ordem definida +na secção Administração → Mostrar Módulos e Sub-painéis. O menu +de navegação de topo tem seis elementos. São eles: + +* *Nome do CRM* – Este é o nome do CRM que foi indicado durante a +instalação. O padrão é SuiteCRM. +* *Menu de Módulos* – Lista ou agrupa os módulos, dependendo das +preferências de utilizador. Permite que os utilzadores naveguem +entre os diversos módulos do CRM +* *Contagem de Notificações* – Mostra o número de notificações que +o utilzador ainda não leu. Estas notificações podem ser geridas +pelo utilizador. Para mais detalhes sobre Notificações, veja a +secção link:../desktop-notifications/[Notificações de Desktop] +deste Guia. +* *Criação Rápida* – A criação rápida permite a criação de alguns +registos mais frequentes a partir de qualquer parte do CRM. +* *Pesquisa Completa/Global* – Permite a pesquisa em todos os +registos do CRM. +* *Menu de utilizador* – Mostra o nome de utilizador para o +utilizador com sessão activa. Há um menu pendente que dá acesso +aos Funcionários, ao respectivo perfil, uma página sobre o SuiteCRM +e um link para sair. + +image:17Navigation_menu.png[title="Menu de Navigação de Topo"] + +Para ver um módulo, pode clicar no nome do mesmo. Esta aação irá +mostrar a vista de lista do módulo. Para detalhes sobre vistas, +veja a secção link:../views/[Vistas] deste Guia. + +Manter o rato sobre o nome do módulo mostra um menu pendente. Este +menu mostra as Acções e Últimos Registos Vistos para o módulo. + +image:18Dropdown_menu.png[title="Menu Pendente"] + +Pode editar registos mostrados na secção Últimos Regitos Vistos do +menu pendente clicando no ícone do lápis. Isto irá direccioná-lo para +a Vista de Edição para o registo. + +image:19Recently_viewed.png[title="Editar Últimos Regitos Vistos"] + +Também está disponível para o SuiteCRM uma estrutura de navegação por +módulos agrupados. Os utilizadores podem escolher esta opção nas suas +preferências. Para detalhes completos sobre a modificação das +preferências de utilizador, veja a secção +link:/user/introduction/managing-user-accounts[Gerir Contas de Utilizador] +deste Guia. + +image:20.png[title="Tabs agrupadas"] + +O menu de navegação por tabs agrupadas permite que o utilizador agrupe +os módulos de acordo com tabs da sua preferẽncia, tal como "Vendas". + +image:21Grouped_tab.png[title="Tabs agrupadas"] + +== Criação Rápida + +Pode clicar no icon 'criar' no menu de navegaão de topo para aceder às +opções de criação rápida. Apresenta-se uma lista de módulos usados com +frequência, para permitir a criação de registos nestes módulos a partir +de qualquer localização. + +image:22Quick_create.png[title="Criação Rápida"] + +== Sidebar + +O sidebar é parte do tema responsivo e é configurável pelo utilizador. +O sidebar pode ser aberto ou fechado com um clique no botão destacado na +figura seguinte. + +image:23Sidebar.png[title="Sidebar"] + +=== Actions + +This displays the Actions for the module you are currently viewing. For +example, if you are viewing the Accounts module, the actions that +display are: Create Account, View Accounts, Import Accounts. This +provides you with one-click access to module actions. + +=== Recently Viewed + +This section displays the last 10 records you have viewed. This leaves a +breadcrumbs trail so that previously viewed records can be quickly and +easily accessed via the sidebar. There is also the option to click the +pencil icon, which will take you directly to the Edit View of the +record. + diff --git a/content/user/introduction/User Interface/Navigation Elements.ru.adoc b/content/user/introduction/User Interface/Navigation Elements.ru.adoc index 9b0f6eda9..dd0daad97 100644 --- a/content/user/introduction/User Interface/Navigation Elements.ru.adoc +++ b/content/user/introduction/User Interface/Navigation Elements.ru.adoc @@ -64,7 +64,7 @@ image:image1.png[Основные элементы интерфейса] Нажимая на закладку, вы получаете доступ либо к группе модулей (ПРОДАЖИ, МАРКЕТИНГ... - как на рисунке выше), либо к конкретному модулю (если группировка модулей отключена) для просмотра, создания и редактирования соответствующих записей. -Включение или отключение группировки модулей может быть настроено индивидуально для каждого пользователя в его link:../../managing-user-accounts/#_Параметры_макета[профиле]. Распределение модулей по группам при необходимости может быть настроено в link:../../../../admin/administration-panel/developer-tools/#_Настройка_сгруппированных_модулей[панели администратора] сразу для всех пользователей системы. + +Включение или отключение группировки модулей может быть настроено индивидуально для каждого пользователя в его link:../../managing-user-accounts/#_параметры_макета[профиле]. Распределение модулей по группам при необходимости может быть настроено в link:../../../../admin/administration-panel/developer-tools/#_настройка_сгруппированных_модулей[панели администратора] сразу для всех пользователей системы. + Предварительная информация о модулях описана в разделе link:../summary[Краткое описание модулей системы]. Детальная информация о то или ином модуле описана в разделах link:../../../core-modules[Основные модули] и link:../../../advanced-modules[дополнительные модули]. @@ -147,6 +147,6 @@ image:image11.png[Быстрое создание записей-выбор за * link:../../../../admin/administration-panel[Панели администрирования] (только для пользователей с правами администратора SuiteCRM) -* link:https://suitecrm.com/suitecrm/forum/index[Форуму^] +* link:https://community.suitecrm.com[Форуму^] * Детальной информации о текущей версии системы (Справка). \ No newline at end of file diff --git a/content/user/introduction/User Interface/Record Management.pt.adoc b/content/user/introduction/User Interface/Record Management.pt.adoc new file mode 100644 index 000000000..17ce33ba5 --- /dev/null +++ b/content/user/introduction/User Interface/Record Management.pt.adoc @@ -0,0 +1,296 @@ +--- +Title: Gestão de Registos +Weight: 55 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +:experimental: ////this is here to allow btn:[]syntax used below + +:imagesdir: /images/en/user + +:toc: + + += Gestão de Registos + +Já abordámos as várias vistas que pode utilizar, vamos agora abordar a getão de +registos. Nesta secção iremos mostrar as diversas áreas da gestão de registos +para que possa guardar e gerir de maneira eficiente os dados dos seus clientes. + +== Criar Registos + +Pode criar registos em várias áreas da Interface. A seguir mostram-se os pontos +de criação de registos. + +image:43Create_record1.png[title="Criação de Registos 1"] + +image:44Create_record2.png[title="Criação de Registos 2"] + +image:45Create_record_3.png[title="Criação de Registos 3"] + +Ao clicar num destes botões de criação, será redireccionado para o formulário de +criação de registo. Este é na prática a link:../views/[Vista de Edição] que já +antes foi apresentada.Esta vista permite preencher todos os campos necessários +ao registo. De notar que os campos marcados com um asterisco vermelho `*` são +campos obrigatórios. É feita uma validação para garantir que os dados guardados +no CRM são válidos. + +image:46Create_contact.png[title="Criação de Registo"] + +Depois de preenchido o formulário, pode guardar o registo, criando um novo +registo no módulo correspondente do CRM. Depois de guardar, ser-lhe-á mostrada a +Vista de Detalhe do registo que acabou de criar. + +== Alterar Registos + +Pode iniciar o processo de alteração de registos a partir de diversos pontos da +Interface. Em seguida mostram-se esses pontos. + +image:47Edit_contact.png[title="Alteração de Registos 1"] + +image:48Edit_contact.png[title="Alteração de Registos 2"] + +Após clicar no botão btn:[Editar] (ou no ícone do lápis), ser-lhe-á apresentada +a Vista de Edição. Nesta vista poderá alterar ou definir os valores dos campos +que desejar. Campos com um asterisco vermelho `*` são campos de preenchimento +obrigatório. É faita alguma validação para que não possam ser guardados registos +com valores inválildos em campos obrigatórios. + +Depois de preenchido o formulário, pode guardar o registo, actualilzando o +registo no módulo correspondente do CRM. Depois de guardar, ser-lhe-á mostrada a +Vista de Detalhe do registo que acabou de alterar. + +== Eliminar Registo + +Pode eliminar registos a partir da Vista de Lista e da Vista de Detalhe. Em +seguida mostram-se as capturas de écran para as duas situações: + +=== Eliminar registo a partir da Vista de Detalhe + +Para eliminar um registo a aprtir da respectiva Vista de Detalhe, basta escolher +a opção *Eliminar* do menu. + +image:49Delete_contact.png[title="Eliminar Registos"] + +Ao clicar nesta opção, irá ver um diálogo de confirmação para confirmar que +deseja realmente eliminar este registo. + +image:50Delete_contact.png[title="Confirmar Eliminação"] + +Pode clicar em *Cancelar* ou *OK*. Se clicar em Cancelar, voltará à Vista de +Detalhe e não elimina o registo. Se clicar em OK, elimina o registo e será +redireccionado para a Vista de Lista do módulo. + +=== List View Deletion method + +Para eliminar registos a partir da Vista de lista, pode selecionar registos +através das caixas de selecção à esquerda. É possível selecionar um só registo +ou usar as opções 'Selecionar esta Página' ou 'Selecionar Todos', para +selecionar todos os registos da página ou todos os registos do módulo. + +image:51ListView_deletion.png[title="Método de eliminação a partir da Vista de +Lista"] + +Depois de selecionar os registos que quer apagar, pode clicar no botão +*'Apagar'*. Quando clicar neste botão, irá ver um popup que indica o número de +registos a eliminar e uma confirmação para executar a ação. + +image:image59.png[title="Confirmar Eliminação"] + +Pode clicar em em *Cancelar* ou em *OK*. Clicar em Cancelar voltará à Vista de +Detalhe e não o irá apagar. Clicar em OK irá executar a ação e eliminar o +registo. Se escolher a eliminação do registo, este será apagado e será +redireccionado para a vista de Lista do módulo. + +== Actualização de registos em massa + +Pode actualizar registos em massa a partir da Vista de Lista de qualquer módulo, +desde que esteja autorizado para tal. Para actualizar registos em massa, tem que +selecionar os registos na Vista de Lista e escolher a opção 'Actualização em +Massa' no menu pendente (junto ao link para apagar). + +image:52Mass_update_records.png[title="Actualização de registos em massa"] + +Ao clicar na opção de actualização em massa ser-lhe-á mostrado, a seguir à Vista +de Lista, uma lista dos campos disponíveis para serem actualizados em massa. + +image:53Mass_update.png[title="Actualização em Massa"] + +Depois de ter definido os valores nos campos que deseja actualizar, pode clicar +em btn:[Actualizar] ou em btn:[Cancelar]. Cancelar a actualilzação em massa irá +descartar quaisquer alterações e restornar à Vista de Lista do módulo. Clicar em +Actualizar irá actualizar todos os registos seleccionados com os valores que +indicou. + +image:54Mass_update.png[title="Actualização em Massa"] + +== Junção de Registos + +Pode juntar registos a partir da Vista de Lista de qualquer módulo, desde que +tenha as autorizações necessárias, ou através da Vista de Detalhe, seguindo o +processo de 'Encontrar Duplicados'. + +Para juntar registos, deve seleccionar os registos na Vista de Lista e depois +seleccionar a opção *'Juntar'* do menu pendente (junto ao link de eliminação). + +image:55Merge.png[title="Juntar"] + +Após clicar na opção *'Juntar'*, ser-lhe-á apresentado o registo principal e os +possíveis duplicados que poderá querer juntar a esse registo. + +image:182Merging_records.png["Écrã de juntar"] + +Pode escolher o registo principal com o botão *'Definir como principal'* do lado +direito da vista. Pode mover dados dos registos duplicados para o principal com +os botões btn:[<<]. Neste exemplo, movemos o Primeiro Nome e o Apelido do +registo duplicado para o principal. + +image:183Merging_records.png[title="Juntar campos"] + +Depois de fazer as alterações no écran de Juntar, pode clicar em btn:[Guardar +junção] ou em btn:[Cancelar]. Clicar em Cancelar irá descartar as alterações e +voltar à Vista de Lista para esse módulo. Clicar em 'Guardar junção' irá +prosseguir com o processo de junção e irá informar que o registo duplicado irá +ser eliminado. + +image:184Save_merge.png[title="Confirmar junção"] + +Pode clicar em *'OK'* ou *'Cancelar'*. Clicar em Cancelar irá descartar as +alterações de junção e voltar à Vista de lista. Clicar em 'OK' irá guardar as +alterações e redireccioná-lo para a Vista de Detalhe do registo final. + +image:185Saved_merge.png[title="Junção terminada"] + +Como se pode ver neste exemplo, o processo foi completado com sucesso. Os campos +Apelido e Primeiro Nome foram actualizados e todos os outros dados foram +mantidos como estavam. + +== Importação de Registos + +É possível importar facilmente dados através do Wizard de importação do +SuiteCRM. Há bastantes ajudas ao longo do processo de importação. + +=== Funcionalidades do Wizard de Importação + +O wizard de importação tem muitas funcionalidades para tornar mais simples o +mapeamento de dados para os campos do CRM. Estas são: + +* *Ficheiro .csv de amostra para facilitar a importação de dados* — Use este +ficheiro de amostra como modelo para a importação de dados +* *Reter definições de importações anteriores* — Guardar/manter as propriedades +de importação, mapeamentos e validação de duplicados de outras importações já +realizadas, para facilitar o processo de importação +* *Capacidade de aceitar tanto nomes de campos da base de dados como etiquetas +apresentadas na interface de campos de listas e multi-selecção* — Aceitar tanto +os nomes que são usados na base de dados como as etiquetas dos campos no +processo de importação, mas apenas as etiquetas serão mostradas +* *Capacidade de aceitar tanto nomes de utilizador como nomes completos em +campos de utilizador durate a importação ou exportação de dados* — Permite, nos +campos que relacionem utilizadores com os registos (e.g., Atribuído a), incluir +nomes de utilizador ou Nomes Completos no ficheiro .csv para mais facilmente +identificar registos relacionados +* *Capacidade de auto-detecção de propriedades dos ficheiros de importação* — +Carregar ficheiros para importação sem especificar propriedades como ta, +vírgula, aspas simples ou duplas, formatos de data e hora, tornando o processo +mais simples e rápido +* *Capacidade de importação de contactos a partir de fontes externas como a +Google* — Capacidade de importar contactos da Google para módulos do tipo Pessoa +como Contactos, Leads e Targets, relacionar registos do SuiteCRM com contactos +da Google e comunicar com contactos da Google a partir do SuiteCRM + +=== Passos para importar dados + +{{% notice note %}} +Importar sempre os dados de Entidades em primeiro lugar e só depois os dados de +Contactos e outros relacionados com Entidades (tais como Reuniões, Chamadas, +Notas) para poder criar automaticamente os relacionamentos entre os registos de +Entidades importados e os outros relacionados com as mesmas. +{{% /notice %}} + +Seguir os passo enunciados a seguir para importar dados para um módulo, tal como +Entidades: + +. Seleccionar Importar do menu de ações do módulo. +. É mostrado o Passo 1 do processo de importação com um link para um ficheiro +de exemplo. +. Carregue o seu ficheiro de dados a importar para esta página através do botão +Navegar no campo de Selecionar Ficheiro ou, +. Opcionalmente, descarregue o modelo disponível, apague os dados desse +ficheiro, insira os seus dados e carregue este ficheiro modificado para esta +página através do botão Navegar. +. Clique em Seguinte. +. É mostrado o Passo 2 (Confirmar Propriedades do Ficheiro de Importação). +. A detecção automática dos dados importados é feita neste passo. +. Clique em Ver Propriedades do Ficheiro de Importação para verificar e alterar +os dados conforme necessário, se notar alguma irregularidade na tabela de +Confirmação de Propriedades do Ficheiro de Importação. +. Clique em Esconder Propriedades do Ficheiro de Importação para esconder o +painel. +. Clique em Seguinte. +. É mostrado o Passo 3: Confirmar Mapeamento de Campos. +. A tabela nesta página mostra todos os campos no módulo que podem ser mapeados +para os dados do ficheiro de importação. Se o ficheiro contiver uma linha de +cabeçalho, as colunas do ficheiro são mapeadas para os campos correspondentes. +. Verifique se o mapeamento está correcto e modifique-o se necessário. +. Mapeie todos os campos obrigatórios (indicados por um asterisco). +. Clique em Seguinte. +. É mostrado o Passo 4: Verificar possíveis duplicados. +. Siga as instruções nesta página. +. O passo 4 inclui também a opção de guardar as propriedades, mapeamentos e +verificação de duplicação para importações futuras. +. (Opcionalmente) Guardar as definições de importação. +. Clique em Importar Agora. +. Clique no separador Erros para verificar se houve erros no processo. Siga as +instruções para resolver os problemas (se algum) e clique em Importar Novamente. +. Se clicar em Importar Novamente, é mostrado novamente o Passo 1 do processo de +importação. +. Siga todos os passos no wizard até ao Passo 5. +. Se a importação foi bem sucedida, pode ver todos os registos importados no +Passo 5. +. Clique em Desfazer Importação se não estiver satisfeito com os resultados da +importação, +. Ou, clique em Importar Novamente para importar mais dados +. Ou, clique em Sair para ir para a Vista de Lista do módulo para onde acabou de +importar os seus dados. + +== Exportar Registos + +Pode exportar registos do SuiteCRM no formato .csv. Quando exporta registos a +partir do CRM, ser-lhe-á apresentado um ficheiro .csv, no final do processo, com +os registos exportados, para que o possa descarregar. Pode guardar este ficheiro +e abri-lo em aplicações como o Libre Office Calc ou Microsoft Office Excel. + +O ficheiro .csv mostra os dados em formato tabular com colunas e linhas. Quando +os dados são exportados do CRM, o ID do registo é incluído juntamente com os +restantes campos escolhidos na lista de exportação. Pode depois usar o ID do +registo como referência para executar uma importação do tipo 'Criar novos +registos e actualizar registos existentes', como detalhado na secção <> do guia de utilizador. + +{{% notice note %}} +Ao exportar valores a partir de listas de opções, o SuiteCRM exporta o ID +associado a cada opção e não os valores que são mostrados. Por exemplo, se uma +lista de opções tem opções etiquetadas Alta, Média e Baixa com ID de 1, 2 e 3, o +ficheiro .csv irá mostrar as opções 1, 2 e 3. +{{% /notice %}} + +=== Passos para Exportar Dados + +. Escolher os registos da Vista de Lista na página principal do módulo. +. Escolher Exportar do menu de Acções na Vista de Lista. +. Para exportar todos os registos listados na página, clicar em Selecionar +acima da lista e escoler uma das seguintes opções: +. Esta Página. Para exportar todos os registos que estão a ser mostrados nesta +página. +. Todos os Registos. Para exportar todos os registos na lista, mesmo que ocupe +mais que uma página. +. É mostrada uma caixa de diálogo Abrir.csv. +. Escolher Abrir para abrir o fichero de exportação em formato .csv ou escolher +Guardar no Disco para guardar o ficheiro .csv na sua máquina. +. Clique em OK para executar a operação. Se escolher abrir o ficheiro, o csv +pode ser aberto no Microsoft Excel. +. O ficheiro contém todos os campos do módulo a partir do qual está a exportar +os dados. + diff --git a/content/user/introduction/User Interface/Record Management.ru.adoc b/content/user/introduction/User Interface/Record Management.ru.adoc index 82adba310..cba229319 100644 --- a/content/user/introduction/User Interface/Record Management.ru.adoc +++ b/content/user/introduction/User Interface/Record Management.ru.adoc @@ -41,11 +41,11 @@ image:image63b.png[Создание записи через всплывающе {{% notice note %}} Всплывающее меню модуля доступно только в том случае, если не используются сгруппированные модули. Включение/отключение группировки модулей настраивается на закладке -link:../../managing-user-accounts#_Параметры_макета[Параметры макета] +link:../../managing-user-accounts/#_параметры_макета[Параметры макета] профиля пользователя. {{% /notice %}} -Заполните все необходимые поля link:../views/#_Форма_редактирования[Формы редактирования] и нажмите на кнопку {btn}[Сохранить]. +Заполните все необходимые поля link:../views/#_форма_редактирования[Формы редактирования] и нажмите на кнопку {btn}[Сохранить]. == Редактирование записей @@ -253,7 +253,7 @@ SuiteCRM потребуется отдельный CSV-файл. Имейте в специальные пользовательские поля и сохраните данные в них. Более подробная информация о создании пользовательских полей находится в разделе -link:../../../../admin/administration-panel/developer-tools#_Создание_и_редактирование_полей[Создание и редактирование полей]. +link:../../../../admin/administration-panel/developer-tools/#_создание_и_редактирование_полей[Создание и редактирование полей]. *Этап 3. Анализ перечня полей* @@ -547,7 +547,7 @@ image:image86.png[Последние просмотры и избранное] {{% notice note %}} Всплывающее меню модуля доступно, если не используются сгруппированные модули. Включение/отключение группировки модулей настраивается на закладке -link:../../managing-user-accounts#_Параметры_макета[Параметры макета] +link:../../managing-user-accounts/#_параметры_макета[Параметры макета] профиля пользователя. {{% /notice %}} @@ -556,7 +556,7 @@ link:../../managing-user-accounts#_Параметры_макета[Параме При создании записи вы автоматически назначаетесь ответственным за неё. При необходимости вы можете указать другого -ответственного. В этом случае по электронной почте новому ответственному будет отправлено уведомление о назначении (при условии, что эта функция будет включена в link:../../managing-user-accounts/#_Пользовательские_настройки[профиле] назначаемого пользователя). +ответственного. В этом случае по электронной почте новому ответственному будет отправлено уведомление о назначении (при условии, что эта функция будет включена в link:../../managing-user-accounts/#_пользовательские_настройки[профиле] назначаемого пользователя). *Для назначения ответственного при создании записи выполните следующее:* @@ -594,7 +594,7 @@ Twitter. . Откройте необходимую запись модуля в Форме просмотра. Если администратор SuiteCRM настроил необходимый функционал (см. раздел -link:../../../../admin/administration-panel/system#_Подключения[Подключения] +link:../../../../admin/administration-panel/system/#_подключения[Подключения] ), то справа от поля вы увидите соответствующий значок. [start=2] diff --git a/content/user/introduction/User Interface/Search.pt.adoc b/content/user/introduction/User Interface/Search.pt.adoc new file mode 100644 index 000000000..4af2e52e7 --- /dev/null +++ b/content/user/introduction/User Interface/Search.pt.adoc @@ -0,0 +1,113 @@ +--- +Title: Pesquisas +Weight: 53 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +:experimental: ////this is here to allow btn:[]syntax used below + +:imagesdir: /images/en/user + += Pesquisa + +A pesquisa é um aspecto vital do CRM pois permite a definição rápida daquilo que +pretende ver. Muitos CRM's gerem muitos dados, portanto é vital que haja um modo +de refinar a sua pesquisa. Nas sub-secções seguintes vamor cobrir as várias +opções de pesquisa disponíveis. + +== Pesquisa Global + +Pode pesquisar todos os registos do CRM através da funcionalidade de pesquisa +global. Esta pesquisa pode ser acedida através da barra de pesquisa no menu de +navegação principal. + +image:38Search.png[title="Pesquisa Global"] + +Depois de escrever o seu termo de pesquisa pode clicar no "Return" ou no ícone +da lupa. Todos os registos que coincidam com o termo de pesquisa serão +apresentados e categorizados por módulo. + +image:39Search.png[title="Resultados da Pesquisa Global"] + +O administrador do sistema pode acrescentar módulos ao sistema de pesquisa +global. + +== Pesquisa de Texto Completo + +O SuiteCRM tem uma opção para habilitar ou desabilitar uma pesquisa de texto +global. A pesquisa global de texto completo é suportada pela framework de +pesquisa http://framework.zend.com/manual/1.12/en/zend.search.lucene.overview.html[Zend +Lucene]. Esta pesquisa trabalha de modo muito semelhante à pesquisa global +normal mas, além disso, inclui pesquisas dentro de documentos de texto e outros +ficheiros. + +{{% notice note %}} +Os administradores de sistema podem habilitar ou desabiliar a pesquisa de texto +completo a partir da ligação Definições AOD no painel de administração. +{{% /notice %}} + +image:169AOD_Settings.png[title="Definições AOD"] + +A opção AOD para habilitar/desabilitar a pesquisa global de texto. + +image:170Enable_AOD.png[title="Habilitar AOD"] + +O resultado desta pesquisa é mostrado de modo ligeiramente diferente dos +resultados da pesquisa global regular. Os resultados são apresentados em ordem +de pontuação. Esta pontuação depende da compatibilidade entre o termo de +pesquisa e o conteúdo e varia de 0 a 100%. + +image:171Search_results.png[title="Pesquisa de Texto Completo"] + +== Pesquisa Básica de Módulo + +A pesquisa básica está disponível em todos os módulos do CRM. O padrão desta +pesquisa permite aos utilizadores pesquisar no nome do registo. + +image:193Search_button.png[title="botão de Pesquisa básica de módulo"] + +image:194Search_box.png[title="Pesquisa Básica de módulo"] + +A pesquisa básica também permite que os utilizadores marquem a caixa de +verificação 'Os Meus Items'. Esta opção vai restringir a pesquisa apenas aos +items que estão atribuídos aos utilizadores. + +image:195Search_my_items.png[title="Procurar os Meus items"] + +Após procurar por um registo, a pesquisa será guradada. Isto significa que +pode navegar para outros registos e módulos dentro do CRM que a pesquisa +não será perdida. Se deseja limpar os termos de pesquisa, pode clicar em +btn:[Limpar] e depois em btn:[Procurar]. Isto irá limpar qualquer termo de +pesquisa guardado e retornar os resultados padrão para o módulo. + +{{% notice note %}} +Os Administradores de Sistema podem modificar os campos pesquisávies na +Pesquisa Básica a partir do Estúdio. +{{% /notice %}} + +== Pesquisa Avançada de Módulo + +A Pesquisa Avançada está disponível para todos os módulos dentro do CRM. A +Pesquisa Avançada fornece-lhe um modo mais detalhado de pesquisar dentro do +módulo. Por padrão, há mais campos disponíveis na Pesquisa Avançada. + +image:196Advanced_search.png[title="Pesquisa Avançada de Módulo"] + +Pesquisas Avançadas podem ter muitos campos e critérios específicos. Por esta +razão, pode guardar os seus critérios de pesquisa para os reusar no futuro. + +image:197Save_search.png[title="Guardar pesquisa"] + +Para recuperar uma pesquisa guardada, pode seleccionar a pesquisa a partir da +lista pendente de 'Os meus filtros'. Irá obter os resultados correspondentes aos +critérios determinados na pesquisa guardada. + +image:198Saved_search.png[title="Pesquisas guardadas"] + +{{% notice note %}} +Os Administradores de Sistema podem modificar os campos pesquisávies na +Pesquisa Avançada a partir do Estúdio. +{{% /notice %}} + diff --git a/content/user/introduction/User Interface/Search.ru.adoc b/content/user/introduction/User Interface/Search.ru.adoc index f4161a28d..18eb39e77 100644 --- a/content/user/introduction/User Interface/Search.ru.adoc +++ b/content/user/introduction/User Interface/Search.ru.adoc @@ -40,13 +40,13 @@ link:../../../../admin/administration-panel/search/elasticsearch/introduction[El {{% /notice %}} Поиск может быть выполнен как по всей системе (глобальный и -полнотекстовый поиск), так и в пределах конкретного модуля (Фильтр/Расширенный фильтр). Также можно выполнять *быстрый поиск* необходимого значения непосредственно при вводе информации в то или иное поле модуля – см. пример в разделе link:../views/#_Форма_редактирования[Форма редактирования]. +полнотекстовый поиск), так и в пределах конкретного модуля (Фильтр/Расширенный фильтр). Также можно выполнять *быстрый поиск* необходимого значения непосредственно при вводе информации в то или иное поле модуля – см. пример в разделе link:../views/#_форма_редактирования[Форма редактирования]. === Глобальный поиск Глобальный поиск осуществляется во всех модулях, указанных администратором SuiteCRM. (см. также описание раздела -link:../../../../admin/administration-panel/system#_Глобальный_поиск[Глобальный поиск] в панели администратора). +link:../../../../admin/administration-panel/system/#_глобальный_поиск[Глобальный поиск] в панели администратора). Для выполнения глобального поиска введите значение в поле глобального поиска, расположенное в верхней части любой страницы, и нажмите на кнопку с изображением лупы, располагающейся в правой верхней части каждой страницы. @@ -70,20 +70,24 @@ image:image15.png[Исключение модулей из поиска] === Полнотекстовый поиск +{{% notice info %}} +В SuiteCRM версии 7.12 настройки полнотекстового поиска link:https://github.com/salesagility/SuiteCRM/pull/9095[объединены^] с настройками стандартного (глобального) поиска, и его отдельное включение, описанное ниже, не требуется. +{{% /notice %}} + image:image17.png[Полнотекстовый поиск] При большом количестве записей, содержащихся в базе данных системы, полнотекстовый вариант поиска может значительно ускорить нахождение необходимой информации. -Поиск выполняется в том же окне, где осуществляется и глобальный поиск, +Поиск выполняется в том же окне, где осуществляется и глобальный поиск. Переключение между типами поиска осуществляется в верхней части страницы результатов поиска. {{% notice note %}} Для использования полнотекстового поиска он должен быть предварительно -link:../../../../admin/administration-panel/advanced-openadmin#_Настройка_полнотекстового_поиска[включён] +link:../../../../admin/administration-panel/advanced-openadmin/#_настройка_полнотекстового_поиска[включён] в панели администрирования. {{% /notice %}} @@ -94,7 +98,7 @@ link:../../../../admin/administration-panel/advanced-openadmin#_Настройк Расширенного поиска были введены более компактные фильтры. Если вам все же необходимо постоянное отображение полей фильтра в верхней части Формы списка, воспользуйтесь советами из раздела -link:../../../../admin/advanced-configuration-options#_Постоянное_отображение_Расширенных_фильтров_в_Формах_списка[Постоянное отображение Расширенных фильтров в Формах списка]. +link:../../../../admin/advanced-configuration-options/#_постоянное_отображение_расширенных_фильтров_в_формах_списка[Постоянное отображение Расширенных фильтров в Формах списка]. {{% /notice %}} Если в модуле содержится большое количество записей, то для быстрого @@ -129,11 +133,11 @@ image:image24.png[Фильтрация записей] Перечень полей, в которых осуществляется фильтрация, может быть настроен администратором в Студии. Детальная информация описана в разделе -link:../../../../admin/administration-panel/developer-tools#_Редактирование_макетов[Редактирование макетов]. +link:../../../../admin/administration-panel/developer-tools/#_редактирование_макетов[Редактирование макетов]. {{% /notice %}} Вы можете редактировать или удалять отфильтрованные записи также как это -описано в разделе link:../record-management/#_Массовое_обновление_записей[Массовое обновление записей]. +описано в разделе link:../record-management/#_массовое_обновление_записей[Массовое обновление записей]. === Расширенный фильтр @@ -159,7 +163,7 @@ image:image25.png[Расширенный фильтр] Перечень полей, в которых осуществляется фильтрация, может быть настроен администратором в Студии. Детальная информация описана в разделе -link:../../../../admin/administration-panel/developer-tools#_Редактирование_макетов[Редактирование макетов]. +link:../../../../admin/administration-panel/developer-tools/#_редактирование_макетов[Редактирование макетов]. {{% /notice %}} Расширенный фильтр так же позволяет сохранять правила фильтрации для @@ -193,4 +197,4 @@ image:image27.png[Сохранение условий фильтрации] выбора. . Вы можете редактировать или удалять результаты поиска также как это -описано в разделе link:../record-management/#_Массовое_обновление_записей[Массовое обновление записей]. \ No newline at end of file +описано в разделе link:../record-management/#_массовое_обновление_записей[Массовое обновление записей]. \ No newline at end of file diff --git a/content/user/introduction/User Interface/Summary.pt.adoc b/content/user/introduction/User Interface/Summary.pt.adoc new file mode 100644 index 000000000..ba4b2ab3e --- /dev/null +++ b/content/user/introduction/User Interface/Summary.pt.adoc @@ -0,0 +1,20 @@ +--- +Title: Summary +Weight: 58 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +:imagesdir: /images/en/user + += Sumário + +Neste capítulo abordámos todos os elementos da interface de utilizador do +SuitCRM. Há muitos elementos que pode usar para optimizar a sua navegação e +gestão de dados, para aumentar a sua produtividade. + +No próximo capítulo, iremos abordar os módulos. Módulos são as entidades de +dados dentro do SuiteCRM que podem ser isoladas, ou relacionadas com um ou mais +módulos. Cada módulo tem uma função diferente mas muitos trabalham em conjunto +para estruturar e automatizar os processos de negócio do dia-a-dia. diff --git a/content/user/introduction/User Interface/Summary.ru.adoc b/content/user/introduction/User Interface/Summary.ru.adoc index 2852b86f3..7aeaacbf1 100644 --- a/content/user/introduction/User Interface/Summary.ru.adoc +++ b/content/user/introduction/User Interface/Summary.ru.adoc @@ -21,14 +21,14 @@ ifdef::env-github[:btn:] image:image88.png[Краткое описание модулей системы] -Для перехода к необходимому модулю нажмите на соответствующую закладку. Часть модулей отображается в верхней части экрана, оставшиеся модули доступны по нажатию на кнопку {btn}[>> >>] (или на кнопку {btn}[ВСЕ], если используются link:../../managing-user-accounts#_Параметры_макета[сгруппированные модули]). +Для перехода к необходимому модулю нажмите на соответствующую закладку. Часть модулей отображается в верхней части экрана, оставшиеся модули доступны по нажатию на кнопку {btn}[>> >>] (или на кнопку {btn}[ВСЕ], если используются link:../../managing-user-accounts/#_параметры_макета[сгруппированные модули]). [cols="2,2"] |=== |image:image88a.png[image] |Если пользователь системы использует сгруппированные модули, то перед выбором модуля откройте необходимую группу. + Распределение модулей по группам при необходимости может быть настроено сразу для всех пользователей системы в панели администратора в разделе -link:../../../../admin/administration-panel/developer-tools#_Настройка_сгруппированных_модулей[Настройка сгруппированных модулей]. +link:../../../../admin/administration-panel/developer-tools/#_настройка_сгруппированных_модулей[Настройка сгруппированных модулей]. |=== Часть модулей может быть скрыта, настройки видимости и группировки модулей устанавливаются в параметрах пользователя (*_Мои настройки_* -> закладка *_Параметры макета_*). @@ -150,7 +150,7 @@ link:../../../advanced-modules/cases-with-portal[Интеграция Обращ * *Полнотекстовый поиск (Advanced OpenDiscovery)*. Модуль обеспечивает поддержку полнотекстового поиска. Более подробная информация содержится в разделе -link:../search/#_Полнотекстовый_поиск[Полнотекстовый поиск]. +link:../search/#_полнотекстовый_поиск[Полнотекстовый поиск]. * *Отложенные звонки (Rescheduling)*. Возможность пометки несостоявшегося звонка как отложенного с указанием причины переноса звонка. Более подробная информация содержится в разделе link:../../../advanced-modules/reschedule[Отложенные звонки]. @@ -159,7 +159,7 @@ link:../search/#_Полнотекстовый_поиск[Полнотексто * *Группы пользователей (SecuritySuite)*. Модуль позволяет ограничивать права доступа на уровне групп пользователей. В SugarCRM CE права доступа можно было ограничивать только по конкретному пользователю (ответственному). Настройка прав доступа на уровне групп пользователей полезна для ограничения видимости данных внутри одного отдела или филиала. Более подробная информация содержится в разделе -link:../../../../admin/administration-panel/users#_Роли_и_группы_пользователей[Роли и группы пользователей]. +link:../../../../admin/administration-panel/users/#_роли_и_группы_пользователей[Роли и группы пользователей]. * *Карты Google (Google Maps)*. Модуль позволяет производить геокодирование имеющихся в базе данных SuiteCRM адресов и на основе полученных географических координат отображать объекты на link:../../../jjw-maps[картах Google]. Возможно сохранение в систему участков карт с установленными на них пользовательскими метками. diff --git a/content/user/introduction/User Interface/Views.pt.adoc b/content/user/introduction/User Interface/Views.pt.adoc new file mode 100644 index 000000000..cc13db60e --- /dev/null +++ b/content/user/introduction/User Interface/Views.pt.adoc @@ -0,0 +1,99 @@ +--- +Title: Vistas +Weight: 54 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +:experimental: ////this is here to allow btn:[]syntax used below + +:imagesdir: /images/en/user + +:toc: + += Vistas + +Dentro do CRM ser-lhe-ão apresentadas diversas vistas. Estas vistas estão +estruturadas para lhe apresentar informação relevante ao longo do processo de +gestão dos registos. Há três vistas principais, descritas nas secções seguintes. + +== Vista de Lista + +Esta é a vista apresentada quando se navega para o módulo que pretende. + +image:40List_view.png[title="Vista de Lista"] + +A Vista de Lista dá-lhe acesso a muitas acções que pode executar para gerir +registos. São elas: + +* *Pesquisar Registos* – permite pesquisar os registos usando as pesquisas +Básica e Avançada, como descrito na secção link:../search/[Pesquisa]. +* *Ordenar Registos* – clicar no nome da coluna irá ordenar a lista de registos +de acordo com essa coluna, de modo ascendente ou descendente, se a ordenação +estiver activa. +* *Ver Registos* – clicar num qualquer campo com um link irá apresentar a Vista +de Detalhes do registos. +* *Edita Registos* – clicar no ícone do lápis irá apresentar a Vista de Edição +do registo. +* *Eliminar Registos* – pode seleccionar registos e depois escolher a opção de +eliminar para remover os registos seleccionados. +* *Actualização em massa de Registos* – pode seleccionar registos e escolher a +opção de actualização em massa para actualizar dados em todos os registos +seleccionados, de forma simultânea. +* *Juntar Registos* – pode seleccionar registos e escolher a opção para juntar +registos. Esta escolha irá desencadear o processo de junção de registos. Pode +escolher um dos registos como primário e depois juntar os dados dos outros +registos nesse. Após a junção, os registos duplicados serão eliminados e todos +os dados e histórico se irão referir ao registo primário. + +== Vista de Detalhe + +Esta é a vista apresentada ao ver um registo. + +image:41Detail_view.png[title="Vista de Detalhe"] + +A Vista de Detalhe inclui muitas acções que pode usar para ver e gerir os seus +dados. Estas são específicas para o módulo que estiver a consultar. Há também +acções padrão nas Vistas de Detalhe da maioria dos módulos. Estas são: + +* *Editar* – permite editar o regsto que se estiver a consultar. +* *Duplicar* – permite duplicar o registo que estiver a consultar. +* *Eliminar* – permite eliminar o registo que estiver a ver. Se for eliminado, +ser-lhe-á apresentada a Vista de Lista. +* *Encontrar Duplicados* – permite iniciar o processo de pesquisa de duplicados +através das capacidades do sistema para procurar registos duplicados. +* *Ver Registo de Alterações* – permite ver as alterações que foram feitas a +campos auditados. + +{{% notice note %}} +Nota: Para definir que campos são auditados e para alterações aos campos que +definem os registos duplicados, contacte o Administrador do Sistema. +{{% /notice %}} + +Os campos linkados podem ser clicados para navegar para o respectivo registo. + +A vista de Detalhes, no SuiteCRM, contém abas. Esta característica minimiza a +necessidade de scroll e categoriza os dados de modo apropriado. + +{{% notice note %}} +Os Administradores de Sistema podem escolher o modo de apresentação da Vista de +Detalhes para abas ou painéis. Pode contactar com o Administrador do Sistema +para mais informação sobre as capacidades das Vistas e layouts. +{{% /notice %}} + +== Vista de Edição + +Esta é a vista que lhe é apresentada ao editar um registo. + +image:42Edit_view.png[title="Vista de Edição"] + +A Vista de Edição permite modificar o conteúdo do registo, de modo a actualizar +a informação existente, acrescentar ou eliminar informação do registo. Depois de +realizar as alterações num registo, pode clicar em 'Guardar' para confirmar as +alterações ou em btn:[Cancelar] para cancelar a alteração. Ambas as opções irão +redireccionar a vista para a Vista de Detalhes do registo que estiver a editar. +Pode clicar em btn:[Ver Registo de Alterações] para consultar as alterações já +feitas aos campos auditados, o que pode ser útil antes de introduzir mais +alterações ao registo. + diff --git a/content/user/introduction/User Interface/Views.ru.adoc b/content/user/introduction/User Interface/Views.ru.adoc index 2638dd9b5..369dda2ef 100644 --- a/content/user/introduction/User Interface/Views.ru.adoc +++ b/content/user/introduction/User Interface/Views.ru.adoc @@ -41,7 +41,7 @@ ifdef::env-github[:btn:] форму списка пользователь видит сразу при нажатии на закладку интересующего модуля. Форма используется как для поиска необходимых записей модуля (см. ниже), так и для массового обновления данных модуля, -о котором вы можете узнать в разделе link:../record-management/#_Массовое_обновление_записей[Массовое обновление записей]. Также возможно изменение данных при помощи link:../in-line-editing[быстрой правки]. +о котором вы можете узнать в разделе link:../record-management/#_массовое_обновление_записей[Массовое обновление записей]. Также возможно изменение данных при помощи link:../in-line-editing[быстрой правки]. Нажмите на интересующую вас запись в списке – откроется форма просмотра, отображающая все доступные данные выбранной записи. @@ -80,11 +80,11 @@ image:image34a.png[Меню действий Формы списка] * *кнопка настройки колонок Формы списка* (см. ниже) Более подробная информация о настройке фильтров описана в разделе -link:../search/#_Расширенный_фильтр[Расширенный фильтр]. +link:../search/#_расширенный_фильтр[Расширенный фильтр]. {{% notice tip %}} При необходимости перечень полей в Фильтре/Расширенном фильтре может быть настроен администратором SuiteCRM в -link:../../../../admin/administration-panel/developer-tools/#_Студия[Студии]. +link:../../../../admin/administration-panel/developer-tools/#_студия[Студии]. {{% /notice %}} === Настройка колонок @@ -97,6 +97,15 @@ link:../../../../admin/administration-panel/developer-tools/#_Студия[Ст Для этого воспользуйтесь кнопкой настройки колонок, расположенной в верхней части Формы списка. Перетаскивая колонки в соответствующую часть списка можно быстро настроить видимость и сортировку колонок. По окончании настройки нажмите на кнопку {btn}[Сохранить и закрыть]. |=== +{{% notice tip %}} +При необходимости администратор SuiteCRM может запретить пользователям изменять настройки колонок того или иного модуля. Более подробная информация на эту тему находится в разделе +link:../../../../admin/advanced-configuration-options/#_запрет_настройки_колонок_формы_списка[Настройка дополнительных параметров]. +{{% /notice %}} + +{{% notice info %}} +Запрет настройки колонок модулей возможен в SuiteCRM версий 7.10.23 / 7.11.11 и выше. +{{% /notice %}} + === Навигация и сортировка Если в списке находится большое количество записей (при стандартных @@ -116,9 +125,9 @@ image:image38.png[Сортировка записей] {{% notice tip %}} При необходимости вы можете изменить как внешний вид Формы списка, так и связанных с ней фильтров: изменить расположение полей, изменить подписи к элементам формы, удалить неиспользуемые поля, добавить новые элементы и т.д. За дополнительной информацией обращайтесь к разделам -link:../../../../admin/administration-panel/developer-tools#_Редактирование_Формы_списка_и_Формы_основных_настроек_дашлета[Редактирование Формы списка и Формы основных настроек дашлета] +link:../../../../admin/administration-panel/developer-tools/#_редактирование_формы_списка_и_формы_основных_настроек_дашлета[Редактирование Формы списка и Формы основных настроек дашлета] и -link:../../../../admin/administration-panel/developer-tools#_Редактирование_Форм_фильтров_модуля_и_Формы_фильтра_дашлета[Редактирование Форм фильтров модуля и Формы фильтра дашлета]. +link:../../../../admin/administration-panel/developer-tools/#_редактирование_форм_фильтров_модуля_и_формы_фильтра_дашлета[Редактирование Форм фильтров модуля и Формы фильтра дашлета]. {{% /notice %}} == Форма просмотра @@ -158,7 +167,7 @@ image:image42.png[Список доступных действий] {{% notice note %}} Все действия в Форме просмотра могут быть представлены как в виде элементов меню, так и в виде отдельных кнопок (см. рисунок ниже). -Способ отображения зависит о того, как администратор SuiteCRM настроил опцию *_Отображать действия в выпадающем меню_* в настройках конфигурации панели администрирования. Детальная информация о настройках содержится в разделе link:../../../../admin/administration-panel/system#_Настройка_конфигурации[Настройка конфигурации]. +Способ отображения зависит о того, как администратор SuiteCRM настроил опцию *_Отображать действия в выпадающем меню_* в настройках конфигурации панели администрирования. Детальная информация о настройках содержится в разделе link:../../../../admin/administration-panel/system/#_настройка_конфигурации[Настройка конфигурации]. {{% /notice %}} image:image43.png[image,width=630,height=108] @@ -170,7 +179,7 @@ image:image43.png[image,width=630,height=108] в нижней части Формы просмотра. При необходимости связи между записями модуля могут быть изменены в Студии. Более подробная информация о настройке связей между модулями содержится в разделе -link:../../../../admin/administration-panel/developer-tools#_Создание_и_редактирование_связей[Создание и редактирование связей]. +link:../../../../admin/administration-panel/developer-tools/#_создание_и_редактирование_связей[Создание и редактирование связей]. По умолчанию субпанели отображаются в свёрнутом виде, что делает более удобным просмотр страниц на мобильных устройствах, а также уменьшает время загрузки страницы. @@ -233,7 +242,7 @@ image:image46.png[Субпанели] . Просмотреть подробности мероприятия, для этого нажмите на самой записи. . Создать заметку или вложение. Более подробная информация находится в разделе -link:../../../core-modules/notes#_Создание_заметок_и_вложений[Создание заметок и вложений]. +link:../../../core-modules/notes/#_создание_заметок_и_вложений[Создание заметок и вложений]. image:image48.png[Субпанель истории] @@ -258,7 +267,7 @@ image:image48.png[Субпанель истории] Субпанель позволяет настроить права доступа к записи. Детальная информация о настройке прав доступа содержится в разделе -link:../../../../admin/administration-panel/users#_Роли_и_группы_пользователей[Роли и группы пользователей]. +link:../../../../admin/administration-panel/users/#_роли_и_группы_пользователей[Роли и группы пользователей]. {{% notice tip %}} При необходимости вы можете изменить внешний вид Формы просмотра любого @@ -266,9 +275,9 @@ link:../../../../admin/administration-panel/users#_Роли_и_группы_по удалить неиспользуемые поля, добавить новые, изменить список и содержание субпанелей и т.д. За дополнительной информацией обращайтесь к разделам -link:../../../../admin/administration-panel/developer-tools#_Редактирование_Формы_просмотра_Формы_редактирования_и_Формы_быстрого_ввода[Редактирование Формы просмотра, Формы редактирования и Формы быстрого ввода] +link:../../../../admin/administration-panel/developer-tools/#_редактирование_формы_просмотра_формы_редактирования_и_формы_быстрого_ввода[Редактирование Формы просмотра, Формы редактирования и Формы быстрого ввода] и -link:../../../../admin/administration-panel/developer-tools/#_Редактирование_субпанелей[Редактирование субпанелей]. +link:../../../../admin/administration-panel/developer-tools/#_редактирование_субпанелей[Редактирование субпанелей]. {{% /notice %}} == Форма редактирования @@ -290,7 +299,7 @@ image:image49.png[Форма списка] минимальное допустимое значение, для большинства полей может быть настроена всплывающая подсказка, значение по умолчанию и т.д. Более подробная информация на эту тему описана в разделе -link:../../../../admin/administration-panel/developer-tools/#_Создание_и_редактирование_полей[Создание и редактирование полей]. +link:../../../../admin/administration-panel/developer-tools/#_создание_и_редактирование_полей[Создание и редактирование полей]. Если необходимо добавить в редактируемую запись информацию, уже присутствующую в системе в виде перечня элементов, например, выбрать @@ -317,7 +326,7 @@ image:image55.png[Быстрый поиск] {{% /notice %}} При выборе необходимых значений в выпадающих списках обратите внимание на то, что если в перечне нет необходимого значения – оно может быть добавлено в Студии. За дополнительной информацией об изменении полей со списками обратитесь к разделу -link:../../../../admin/administration-panel/developer-tools/#_Редактор_комбобоксов[Редактор комбобоксов]. +link:../../../../admin/administration-panel/developer-tools/#_редактор_комбобоксов[Редактор комбобоксов]. [start=2] . После внесения всех необходимых изменений в Форму редактирования @@ -330,5 +339,5 @@ link:../../../../admin/administration-panel/developer-tools/#_Редактор_ Формы редактирования любого модуля: изменить расположение полей, изменить подписи к элементам формы, удалить неиспользуемые поля, добавить новые элементы и т.д. За дополнительной информацией обращайтесь к разделу -link:../../../../admin/administration-panel/developer-tools/#_Редактирование_Формы_просмотра_Формы_редактирования_и_Формы_быстрого_ввода[Редактирование Формы просмотра, Формы редактирования и Формы быстрого ввода]. +link:../../../../admin/administration-panel/developer-tools/#_редактирование_формы_просмотра_формы_редактирования_и_формы_быстрого_ввода[Редактирование Формы просмотра, Формы редактирования и Формы быстрого ввода]. {{% /notice %}} \ No newline at end of file diff --git a/content/user/introduction/User Interface/_index.pt.adoc b/content/user/introduction/User Interface/_index.pt.adoc new file mode 100644 index 000000000..307e3d006 --- /dev/null +++ b/content/user/introduction/User Interface/_index.pt.adoc @@ -0,0 +1,11 @@ +--- +Title: "Interface de Utilizador" +Weight: 50 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +== Índice + +{{% children depth="4" showhidden="true" %}} diff --git a/content/user/introduction/User Wizard.pt.adoc b/content/user/introduction/User Wizard.pt.adoc new file mode 100644 index 000000000..28e259179 --- /dev/null +++ b/content/user/introduction/User Wizard.pt.adoc @@ -0,0 +1,106 @@ +--- +Title: User Wizard +Weight: 30 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +:experimental: ////this is here to allow btn:[]syntax used below + +:imagesdir: ./../../../images/en/user + += User Wizard + +O User Wizard guia-o através do processo de configuração na primeira +vez que entrar no SuiteCRM. Este processo permite-lhe definir as +muitas opções e formatos que existem para apresentar dados no SuiteCRM +e as opções são específicas de cada utilizador. + +== Bem-vindo ao SuiteCRM + +O primeiro passo é apenas uma página de boas-vindas ao SuiteCRM. Clique +em btn:[Seguinte] nesta página para avançar para a configuração das +suas preferências. + +image:04SuiteCRM_welcome.png[title="Bem-vindo ao SuiteCRM!"] + +== A sua Informação + +Neste écran poderá definir informação sobre si. Ao incluir esta +informação, os outros utilizadores podem consultá-la. Exemplos desta +informação são o Nome Completo, Endereço de email ou detalhes de +Contacto. Campos marcados com um asterisco vermelho(*) são +obrigatórios e precisam de ser preenchidos antes de continuar. + +image:05Welcome_info.png[title="Informação de Utilizador"] + +Depois de ter completado este formulário, clique em btn:[Seguinte] +para avançar para o passo seguinte. + +== As suas definições Locais + +Neste écran pode definir as suas definições locais preferidas. + +image:06SuiteCRM_Locale.png[title="Definições Locais"] + +== Selecção de Moeda + +Seleccione a Moeda que quer que seja mostrada em todos os campos do +tipo Moeda no SuiteCRM. As opções de Moeda são definidas a partir +das opções disponibilizadas pelo Administrador do Sistema. Se houver +alguma opção que seja necessária mas não apareça, contacte o seu +Administrador do Sistema. + +image:180Currency_selection.png[title="Selecção de Moeda"] + +== Formato de Data + +Seleccione o formato em que prefere que a data seja apresentada em +todos os campos de Data do SuiteCRM. Há muitos formatos diferentes +que pode escolher. Este formato também se aplica aos campos Data/Hora. + +image:08Date_format.png[title="formato de Data"] + +== Fuso horário + +Seleccione o fuso horário que deseja usar com o SuiteCRM. Isto permite +que siga a sua utilização do SuiteCRM de acordo com a sua localização +no mundo. Se está a viajar de um fuso horário para outro, pode alterar +esta definição a qualquer altura no écran de Preferências de Utilizador +após concluir este Wizard. + +image:09Time_zone.png[title="Fuso Horário"] + +== Formato de Nome + +Seleccione o Formato de Nome que quer ver mostrado nos campos de tipo +Nome no SuiteCRM. Esta definição aplica-se aos diversos módulos do +tipo 'Pessoa' dentro do SuiteCRM, e permite ver o nome de acordo com +as suas preferências. + +image:181Name_format.png[title="Formato de Nome"] + +Assim que tenha todas as suas Definições Locais definidas, clique em +btn:[Seguinte] para avançao para o passo final/página de confirmação +do User Wizard. + +== Passo Final + +O passo final do User Wizard indica-lhe algumas ligações para aprender +mais sobre, e procurar suporte a partir do site web do SuiteCRM. +Há um botão btn:[Voltar] se precisar de voltar atrás e alterar alguma +das definições indicadas anteriormente. + +image:241Finish User Wizard.png[title="Completar o User Wizard"] + +Ao clicar em btn:[Terminar] irá completar a configuração e ser-lhe-á +apresentado o écran de entrada. + +== Sumário + +Neste capítulo percorremos o User Wizard, que lhe permite definir as suas +preferências para usar o SuiteCRM. + +No próximo capítulo iremos ver como gerir contas de utilizador, actualizar +detalhes de utilizador, seleccionar temas, alterar passwords e mais. diff --git a/content/user/introduction/_index.pt.adoc b/content/user/introduction/_index.pt.adoc new file mode 100644 index 000000000..3f573ea6b --- /dev/null +++ b/content/user/introduction/_index.pt.adoc @@ -0,0 +1,111 @@ +--- +Title: "Introdução" +Weight: 10 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +:imagesdir: ./../../images/en/user + += Introdução + +== A Equipa e a Comunidade do SuiteCRM + + +Pode dizer-se que sem o trabalho contínuo da Equipa e da Comunidade +do SuiteCRM, eu não teria a motivação e o compromisso de me sentar +e escrever este Guia de Utilizador. Novas funcionalidades e melhorias +no produto base são constantemente adicionadas para fazer do SuiteCRM +o melhor produto Open Source CRM do mundo, e para competir com os +produtos proprietários de vendedores como SugarCRM, Salesforce e +Microsoft. + +Quanto à Comunidade do SuiteCRM - providenciam relatórios de erros, +correcções e testes. A Comunidade está no centro de qualquer projecto +Open Source e com o SuiteCRM não é diferente. Com cada novo lançamento +a comunidade cresce e com ela aumentam os benefícios do ecosistema +Open Source. + +== O que é o SuiteCRM? + + +O SuiteCRM é uma derivação (fork) do popular sistema CRM - +https://en.wikipedia.org/wiki/Customer_relationship_management[Customer +Relationship Management] https://en.wikipedia.org/wiki/SugarCRM[SugarCRM], +desenvolvido e mantido pela SalesAgility. É uma aplicação alternativa +com código livre e de fonte aberta (free and open source). Foi +lançado no dia 21 de Outubro de 2013 como versão 7.0. A versão mais +recente à data da publicação deste Guia (versão PT) é a 7.11.8. + +O SuiteCRM já foi descarregado mais de meio milhão de vezes desde o +lançamento inicial. Foi adoptado pelo programa _England's Code for +Health_ da NHS (National Health Service) da Grã-Bretanha, que procura +promover a utilização de código aberto no Sistema Nacional de Saúde do +Reino Unido. + +O projecto SuiteCRM declarou que todas as linhas de código que sejam +lançadas pelo projecto serão sempre de código aberto. O projecto SuiteCRM +pretende ser uma alternativa de classe empresarial aos produtos proprietários. + +Um mapa de objectivos (Roadmap) do projecto está disponível para detalhar as +melhorias previstas. + +Um fórum de suporte com masi de 25000 membros está disponível para permitir +suporte gratuito e é regularmente monitorizado pela equipa do Projecto. + +Um directório de extensões está disponível e inclui tanto melhorias pagas como +gratuitas. + +O projecto mantém o https://suitecrmondemand.com/[SuiteCRM:OnDemand], +uma instalação em modo _Software As A Service_ para utilizadores que procuram +uma instalação rápida e sem manutenção. + +Não existirá software restringido por licenças como parte do projecto +gerido pela SalesAgility. Todo o código é livre. Todo o código está disponível +para download. Não há uma agenda escondida para cobrar pelo acesso ao +código. É e sempre será livre e aberto. Não existirão versões pagas. + +== Quem é a SalesAgility? + + +A SalesAgility é uma empresa de consultoria em código aberto, acreditada +pela ISO e focada em CRM (Customer Relationship Management). Foi uma +empresa que cedo adoptou o SugarCRM Community Edition, e são os criadores +e responsáveis pela manutenção da derivação do SugarCRM – SuiteCRM. + +A SalesAgility já entregou mais de 300 projectos SuiteCRM e SugarCRM, e +são conhecidos como um recurso de classe mundial no conhecimento e +experiência de CRM em código aberto. Os seus clientes incluem +governos, grandes empresas e negócios familiares em todo o mundo. + +A SalesAgility tem uma missão clara: + +[quote] +O nosso objectivo é inovar e fornecer soluções SuiteCRM avançadas +bem como serviço a clientes e suporte de primeira classe. + +[quote] +Acreditamos que o código aberto é do melhor interesse para os nossos +clientes e continuaremos a criar, inovar, evangelizar e fornecer +modelos das melhores práticas para a comunidade de código aberto. + +== O que é este Guia de Utilizador? + + +O Guia de Utilizador do SuiteCRM foi escrito para os utilizadores. Este +guia acompanha o utilizador de SuiteCRM do princípio ao fim. Iremos +explorar todas as áreas, do básico sobre registos até à criação de +sistemas complexos de relatórios e workflows automáticos. + +O Guia de Utilizador do SuiteCRM está divido em vários capítulos. Estes +capítulos estão ordenados de acordo com a progressão lógica do trabalho +diário com um CRM. Os capítulos contém sub-secções que ajudam a ultrapassar +barreiras, explicando como optimizar o uso do sistema CRM para gerir +com eficácia dados de vendas. + +Os leitores do Guia de Utilizador do SuiteCRM não precisam de ter +conhecimentos de programação ou de já conhecer o SuiteCRM. É +aconselhado que esteja à vontade com a operação de computadores, que +seja familiar com o seu navegador web e que o SuiteCRM já esteja +instalado e configurado. diff --git a/content/user/introduction/_index.ru.adoc b/content/user/introduction/_index.ru.adoc index 306a1d8da..9e7dbac16 100644 --- a/content/user/introduction/_index.ru.adoc +++ b/content/user/introduction/_index.ru.adoc @@ -71,7 +71,7 @@ link:../introduction/user-interface[Описание пользовательс {{% notice info %}} -Все желающие дополнить данную документацию могу сделать это самостоятельно, детали описаны в разделе link:../../../community/contributing-to-docs[Вклад в создание документации^]. Обсудить документацию можно в link:https://suitecrm.com/suitecrm/forum/suitecrm-forum-russian-general-discussion/17907-suitecrm#60470[русскоязычном разделе форума^]. +Желающие могут дополнить эту документацию, как это описано в разделе link:../../../community/contributing-to-docs[Вклад в создание документации^]. Обсудить документацию можно в link:https://community.suitecrm.com/t/suitecrm/12906[русскоязычном разделе форума^]. {{% /notice %}} == Краткий обзор системы @@ -84,17 +84,17 @@ link:../introduction/user-interface[Описание пользовательс == Полезные ссылки -* https://suitecrm.com/forum/index[Официальный форум^] +* https://community.suitecrm.com[Официальный форум^] * https://github.com/salesagility/SuiteCRM[Исходный код SuiteCRM^] * https://github.com/salesagility/SuiteDocs[Исходный текст данного руководства в формате AsciiDoc^] -* https://suitecrm.com/suitecrm/forum/suitecrm-forum-russian-general-discussion/59[Обсуждение русификации^] +* https://community.suitecrm.com/t/topic/11657[Обсуждение русификации^] -* https://suitecrm.com/suitecrm/forum/suitecrm-forum-russian-general-discussion/17910-suitecrm[Установка пакетов русификации в SuiteCRM^] +* https://community.suitecrm.com/t/suitecrm/54671[Установка пакетов русификации в SuiteCRM^] * https://suitecrm.com/suitecrm/forum/suitecrm-forum-russian-general-discussion/17971-suitecrm[Обсуждение данного руководства^] -* https://suitecrm.com/suitecrm/forum/suitecrm-forum-russian-general-discussion/17907-suitecrm[Руководства пользователя и администратора для предыдущих версий SuiteCRM^] +* https://community.suitecrm.com/t/suitecrm/54668[Руководства пользователя и администратора для предыдущих версий SuiteCRM^] diff --git a/content/user/introduction/managing-user-accounts.pt.adoc b/content/user/introduction/managing-user-accounts.pt.adoc new file mode 100644 index 000000000..e2768e1a7 --- /dev/null +++ b/content/user/introduction/managing-user-accounts.pt.adoc @@ -0,0 +1,196 @@ +--- +Title: Gestão de contas de Utilizador +Weight: 40 +--- + +:author: pribeiro42 +:email: p.m42.ribeiro@gmail.com + +:experimental: ////this is here to allow btn:[]syntax used below + +:imagesdir: /images/en/user + +:toc: + += Gestão de Contas de Utilizador + +Há muitas opções de configuração disponíveis para os utilizadores +após entrarem no sistema. Pode ver e modificar as suas preferências +ao clicar no seu nome, no canto superior direito do menu. + +image:11User_select.png[title="Gerir Conta"] + +== Tab de Perfil de Utilizador + +Depois de aceder às suas preferências, ser-lhe-á mostrado o tab de +'Perfil de Utilizador' que apresenta uma vista geral das suas +credenciais como Nome de Utilizador, Nome Prório, Apelido, Título, etc. + +image:12User_profile.png[title="Perfil de Utilizador"] + + +=== Definições Pessoais de Conta de Email + +Definir uma conta pessoal de email no *SuiteCRM* permite que veja a sua +conta de email pessoal no módulo link:../../core-modules/emails[Emails]. + +Os emails das caixas de correio pessoais não são alojados na base de +dados do *SuiteCRM* a não ser que sejam manualmente importados. Veja +a documentação do módulo link:../../core-modules/emails[Emails] para +mais informação. + +{{% notice tip %}} +Cada utilizador pode configurar a sua própria conta. Os administradores +podem configurar contas pessoais para os outros utilizadores a partir +da secção Gestão de Utilizadores do Painel de Administração. +{{% /notice %}} + +==== Definiçoes de Email do Perfil de Utilizador +Abra o perfil de utilizador e role até ao fim do tab *Perfil de Utilizador* para +ver as definições de email. Note que se está a configurar as definições para +outro utilizador, necessita de seleccionar *Editar* no menu *Acções* de modo a +conseguir ver estas definições. + +image:270Emailusersettings.png[Definições de Email de Utilizador] + +* *Endereço de Email* - Acrescenta o(s) endereços(s) de email à sua conta *SuiteCRM*. +Clique em btn:[+] to add more addresses. Quanto tiver mais que um endereço de email +pode indicar qual é o principal através do botão de rádio *Primário*. Pode também +indicar qual é o endereço a usar como endereço de resposta (Reply-to). +* *Cliente de Email* - Esta definição controla o cliente de email a usar para escrever +e enviar email quando clica num link de email no SuiteCRM, por exemplo no endereço de +email de um contacto ou de uma conta. + ** *Editor de Email do SuiteCRM* - O módulo *Emails* do *SuiteCRM* será usado + ** *Editor de Email Externo* - Os links de email do *SuiteCRM* irão ser abertos pelo programa que estiver configurado para tratar de links `mailto://`, por exemplo o Outlook ou o Thunderbird + +* *Editor dee Email* - Esta definição permite escolher qual o editor a usar ao criar e +editar link:../../core-modules/emailtemplates[modelos de email] e também no módulo +link:../../core-modules/campaigns[Campanhas]. Note que a definição de *Editor de Email* +não afecta a vista *Compor* do módulo *Emails* do *SuiteCRM*. Neste caso o utilizador +não pode escolher. As opções disponíveis são *Mozaik*, *TinyMCE* e *Direct HTML*. + +==== Acrescentar uma conta de email pessoal +Clique em btn:[DEFINIÇÕES] no fundo da tab 'Perfil de Utilizador' para acrescentar uma conta de email pessoal. + +Seleccione a tab Contas de Email e clique em btn:[ADIOCIONAR] a seguir a Contas de Email para configurar a sua conta de entrada de email. + +image:271EmailsAddPersonalAccount.png[Tab de Contas de Email] + +Preencha os detalhes necessários na caixa de diálogo que aparece. Vai precisar do +nome de utilizador e password para a conta que está a acrescentar, além do endereço +do servidor de mail. O protocolo de email suportado pelo *SuiteCRM* é IMAP. Pode +também necessitar de definir o porto do servidor, se for diferente do porto padrão +do IMAP. O seu administrador do sistema deve ser capaz de lhe fornecer as informações +necessárias. + +Depois de preencher os dados, pode verificar as definições clicando em btn:[TESTAR DEFINIÇÕES] +para testar a ligação ao servidor. + +image:272EmailsPersonalAccountSettings.png[Definições de Email de Utilizador] + +*Pastas Monitorizadas:* sºao as pastas que serão verificadas para obter correio não-lido. Tem +que indicar as pastas *Inbox* (ou Caixa de Entrada) e *Lixo*. Indique os nomes das pastas ou +clique em btn:[SELECCIONAR] para ligar ao servidor de email e seleccionar as pastas relevantes. + +image:273EmailsMonitoredFolders.png[Escolher pastas a monitorizar] + +*Assinaturas:* Seleccione a assinatura para esta conta. Será automaticamente acrescentada ao +corpo do email ao compor uma mensagem com o módulo de Emails. Se quiser criar uma nova +assinatura, terá que o fazer via <> e +seleccioná-la aí. Esta definição irá sobrepor-se à definição da <>. + +Indiqeu também as definições de *Email de Envio* para a conta de utilizador. + +image:276EmailsAddPersonalAccount2.png[Definições de Email de Saída] + +Clique em btn:[CONCLUIR] para guardar as definições de conta e voltar à tab de *Contas de Email*. + +image:275EmailsAccountList.png[Lista de Contas] + +Se tem mais de uma conta configurada pode definir a conta padrão que aparece ao escolher o +módulo *Emails*. Contas activas estarão disponíveis para escolher. + +Para editar as definições das contas de email pessoal clique no ícone do lápis na coluna Editar. + + +==== Definições de Email de Utilizador - tab Geral + +Há outras definições de emial na *Tab Geral*: + +image:274EmailsGeneralTab.png[Tab geral de Definições de Email de Utilizador] + +* *Verificar Novo Correio* - Pode especificar um intervalo de tempo para verificar automaticamente a existência de novo email. O padrão é fazer a verificação manual, com o botão "Verificar Novo Email" na vista de lista de Emails. + +* *Assinatura Padrão* - Especifica a assinatura padrão que será acrescentada ao corpo do email ao compor nova mensagem. Clique em btn:[CRIAR] para acrescentar uma nova assinatura ou escolha uma da lista. As assinaturas existentes podem ser editadas e apagadas aqui. + +* *Gestão de pastas* - Escolha a(s) pasta(s) que estarão disponíveis no módulo *Emails*. Esta lista mostra todas as pastas monitorizadas em todas as contas. Use ctrl+clique para seleccionar mais que uma pasta. + +Clique em btn:[CONCLUIR] para guardar as definições. Ser-lhe-á pedido confirmação. + +A partir de agora deve ser possível ver os seus emails no link:../../core-modules/emails[módulo de *Emails*]. + + + +== Tab de Password + +A tab de '*Password*' permite-lhe alterar a password da sua conta. +Para alterar a sua password, indique a password actual, a nova +password e repita a nova password para confirmação. Recomenda-se +que as passwords sejam seguras, ou seja, no mínimo com uma letra +maiúscula, uma letra minúscula, um algarismo e um tamanh de 8 +caracteres. + +image:13Password_tab.png[title="Tab de Password"] + +Se se esqueceu da sua password e não pode entrar, pode usar a +funcionalidade de password esquecida detalhada na secção +link:/user/introduction/getting-started[Começar] deste Guia. + +== Tab Configurações Avançadas + +A tab de Configurações Avançadas permite-lhe alterar as preferências +definidas durante o processo de User Wizard, caso haja necessidade. + +image:14Advanced_tab.png[title="Tab Configurações Avançadas"] + +== Repor Preferências de Utilizador + +Pode repor as suas preferências de utilizador de acordo com os valores +pré-definidos para o sistema, clicando no botão +btn:[Repor Preferências de Utilizador] no seu perfil. + +image:15User_preference.png[title="Repor Preferências de Utilizador"] + +Ao clicar no botão ir-lhe-á ser pedida confirmação para a reposição +dos valores pré-definidos, com a mensagem: _"Tem a certeza que deseja +repor todas as suas preferências?"_ + +{{% notice warning %}} +Esta acção irá fazê-lo sair da aplicação. Pode clicar em 'OK' ou +'Cancelar' de acordo com o que quiser, mas se clicar em 'OK' irá +sair da aplicação e necessitará de voltar a entrar. +{{% /notice %}} + +== Repor a página inicial de Utilizador + +Pode repor a sua página de entrada para a página pré-definida do +sistema clicando no botão btn:[Repor página inicial] no seu perfil. +Esta acção irá repor todas as suas preferências de dashlets e +layouts para as opções pré-definidas. + +image:16Reset_homepage.png[title="Repor Página Inicial"] + +Ao clicar no botão ser-lhe-á pedido para confirmar esta reposição, +com a seguinte mensagem: _"Tem a certeza que quer repor a sua +página inicial?"_. Pode depois clicar em 'OK' ou 'Cancelar' de +acordo com a sua preferência. + +== Sumário + +Neste capítulo, percorremos a gestão de contas de utilizador, que lhe +permite gerir a sua informação e modificar/repor as suas preferências, +entre outros. + +No próximo capítulo, iremos percorrer a Interface. A Interface é uma +parte integral do SuiteCRM. Conhecendo a sua Interface, pode continuar +a descoberta das funcionalidades e processos do SuiteCRM. diff --git a/content/user/introduction/managing-user-accounts.ru.adoc b/content/user/introduction/managing-user-accounts.ru.adoc index ca5779023..99514ef7b 100644 --- a/content/user/introduction/managing-user-accounts.ru.adoc +++ b/content/user/introduction/managing-user-accounts.ru.adoc @@ -21,7 +21,9 @@ ifdef::env-github[:btn:] = Настройка параметров пользователя -Как правило, администратор предварительно настраивает параметры для всех пользователей системы. Основные параметры включают в себя профиль пользователя, его логин/пароль, настройки электронной почты, региональные настройки, а также список доступных пользователю закладок модулей. + +Как правило, администратор предварительно настраивает параметры для всех пользователей системы. Основные параметры включают в себя профиль пользователя, его логин/пароль, настройки электронной почты, региональные настройки, а также список доступных пользователю закладок модулей. + +При необходимости каждый пользователь системы может осуществить более тонкую настройку SuiteCRM непосредственно под свои потребности. Доступ к параметрам пользователя происходит по наведению курсора на имя пользователя, отображаемого в правой верхней части экрана, и выбора пункта меню *_Мои настройки_*. @@ -37,7 +39,7 @@ link:../../core-modules/emailtemplates/[шаблон письма]), подра image:image2.png[Профиль пользователя] Если администратор SuiteCRM настроил сервер исходящей почты, но не разрешил его использование для отправки электронной почты другим пользователям системы, то вам придётся самостоятельно указать параметры настройки SMTP-сервера. В соответствующих полях укажите логин и пароль пользователя для указанного администратором почтового сервера или настройте параметры другого SMTP-сервера, как это описано в разделе -link:../../core-modules/emails/#_Настройка_электронной_почты[Настройка электронной почты]. +link:../../core-modules/emails/#_настройка_электронной_почты[Настройка электронной почты]. == Пароль @@ -98,11 +100,11 @@ link:../../core-modules/meetings/[Назначение встреч]. === Синхронизация с календарём Google -см. описание в разделе link:../../../admin/administration-panel/google-sync/#_Настройка_доступа_к_календарю_google[Настройка доступа к календарю Google] +см. описание в разделе link:../../../admin/administration-panel/google-sync/#_настройка_доступа_к_календарю_google[Настройка доступа к календарю Google] == Внешние учётные записи -При установке некоторых дополнительных link:../../../admin/administration-panel/system#_Подключения[подключений] пользователи системы могут получать доступ к внешним приложениям, используя внешние учётные данные. Для этого внешние учётные записи должны быть предварительно настроены администратором SuiteCRM: на закладке *Внешние учётные записи* нажмите на кнопку {btn}[Создать], из выпадающего списка выберите требуемое приложение, заполните все необходимые поля и нажмите на кнопку {btn}[Подключить]. +При установке некоторых дополнительных link:../../../admin/administration-panel/system/#_подключения[подключений] пользователи системы могут получать доступ к внешним приложениям, используя внешние учётные данные. Для этого внешние учётные записи должны быть предварительно настроены администратором SuiteCRM: на закладке *Внешние учётные записи* нажмите на кнопку {btn}[Создать], из выпадающего списка выберите требуемое приложение, заполните все необходимые поля и нажмите на кнопку {btn}[Подключить]. == Параметры макета @@ -113,12 +115,12 @@ image:image4.png[Параметры макета] [horizontal] Стиль :: Выбор цветовой схемы интерфейса системы. Сгруппированные модули :: Отображать на каждой закладке несколько сгруппированных модулей. Данный параметр включён по умолчанию. Порядок группировки модулей может быть настроен в панели администратора, см. раздел -link:../../../admin/administration-panel/developer-tools#_Настройка_сгруппированных_модулей[Настройка сгруппированных модулей]. +link:../../../admin/administration-panel/developer-tools/#_настройка_сгруппированных_модулей[Настройка сгруппированных модулей]. Управление закладками :: Вы можете скрыть закладки, которые не планируется использовать при работе в системе. Используйте стрелки для перемещения закладок между панелями скрытых/отображаемых закладок. Если вы обладаете правами администратора SuiteCRM, то вы можете настроить видимость закладок глобально для всех пользователей системы через панель администратора. Таким образом, скрытые закладки будут недоступны всем пользователям системы. Вы также можете изменить расположение закладок относительно друг друга. Для сортировки закладок выберите необходимую закладку и используйте стрелки в левой части панели. Сортировать модули в алфавитном порядке:: Отображать отсортированный перечень модулей в выпадающем меню. -Группировать закладки link:../user-interface/views/#_Субпанели[субпанелей] :: При открытии Формы просмотра субпанели группируются на отдельных закладках.[[Collapced-indicator]] -Выделять свёрнутые link:../user-interface/views/#_Субпанели[субпанели], если они содержат записи :: Отображать свёрнутые субпанели различным цветом и индикатором в зависимости от того, содержат они записи или нет. +Группировать закладки link:../user-interface/views/#_субпанели[субпанелей] :: При открытии Формы просмотра субпанели группируются на отдельных закладках.[[Collapced-indicator]] +Выделять свёрнутые link:../user-interface/views/#_субпанели[субпанели], если они содержат записи :: Отображать свёрнутые субпанели различным цветом и индикатором в зависимости от того, содержат они записи или нет. == Сброс настроек в стандартные значения @@ -149,7 +151,7 @@ image:image5.png[Настройка почтовых параметров пол . Если вы выбрали *_Почтовый клиент SuiteCRM_* и администратор SuiteCRM разрешил использование стандартного SMTP-сервера – укажите имя пользователя и пароль для сервера исходящей почты. . При необходимости выберите текстовый редактор, который будет использоваться при наборе текста письма. . Для более детальной настройки параметров, в том числе параметров учётных записей для входящей/исходящей почты, нажмите на кнопку {btn}[Настройка параметров электронной почты]. Более подробно процесс настройки описан в разделе -link:../../core-modules/emails/#_Настройка_электронной_почты[Настройка электронной почты]. +link:../../core-modules/emails/#_настройка_электронной_почты[Настройка электронной почты]. . Нажмите кнопку {btn}[Сохранить] для сохранения указанной информации или кнопку {btn}[Отказаться] для выхода без сохранения введённой информации. diff --git a/content/user/modules/Confirmed-Opt-In-Settings.ru.adoc b/content/user/modules/Confirmed-Opt-In-Settings.ru.adoc index 432786c01..39a330391 100644 --- a/content/user/modules/Confirmed-Opt-In-Settings.ru.adoc +++ b/content/user/modules/Confirmed-Opt-In-Settings.ru.adoc @@ -24,7 +24,7 @@ ifdef::env-github[:imagesdir: ./../../../../master/static/images/ru/user/Confirm link:../../core-modules/targets[Адресаты маркетинговых кампаний], link:../../core-modules/contacts[Контакты] и link:../../core-modules/leads[Предварительные контакты], как правило, добавленные в систему через -link:../../core-modules/campaigns/#_Создание_Веб_формы_регистрации[Веб-форму регистрации]. +link:../../core-modules/campaigns/#_создание_веб_формы_регистрации[Веб-форму регистрации]. == Настройка подтверждения подписки @@ -150,7 +150,7 @@ image:image4.png[Форма регистрации с возможностью Настройка осуществляется в разделе -link:../../../admin/administration-panel/email/#_Настройка_e_mail[Настройка E-mail] панели администратора. +link:../../../admin/administration-panel/email/#_настройка_e_mail[Настройка E-mail] панели администратора. *Подтверждение подписки.* Включение или отключение подтверждения подписки. + diff --git a/content/user/modules/LawfulBasis.ru.adoc b/content/user/modules/LawfulBasis.ru.adoc index d4afb2195..23be23948 100644 --- a/content/user/modules/LawfulBasis.ru.adoc +++ b/content/user/modules/LawfulBasis.ru.adoc @@ -30,7 +30,7 @@ ifdef::env-github[:btn:] == Поля для указания правовых оснований -Для работы с функционалом в модули *Контакты*, *Предварительные контакты* и *Адресаты* могут быть добавлены следующие поля, уже присутствующие в инструментарии link:../../../admin/administration-panel/developer-tools/#_Редактирование_макетов[Студии]: +Для работы с функционалом в модули *Контакты*, *Предварительные контакты* и *Адресаты* могут быть добавлены следующие поля, уже присутствующие в инструментарии link:../../../admin/administration-panel/developer-tools/#_редактирование_макетов[Студии]: * Правовое основание для обработки данных * Источник правового основания @@ -43,7 +43,7 @@ image:image1.png[Настройка полей правового основан == Ручное обновление полей правового основания -Ручное обновление полей производится либо непосредственно в Форме редактирования соответствующей записи, либо в Форме просмотра записи (списка записей), если администратором SuiteCRM включён функционал link:../../introduction/user-interface/in-line-editing/[быстрой правки]. Для обновления полей сразу в нескольких записях воспользуйтесь функцией link:../../introduction/user-interface/record-management/#_Массовое_обновление_записей[Массового обновления]. +Ручное обновление полей производится либо непосредственно в Форме редактирования соответствующей записи, либо в Форме просмотра записи (списка записей), если администратором SuiteCRM включён функционал link:../../introduction/user-interface/in-line-editing/[быстрой правки]. Для обновления полей сразу в нескольких записях воспользуйтесь функцией link:../../introduction/user-interface/record-management/#_массовое_обновление_записей[Массового обновления]. == Автоматическое обновление полей правового основания @@ -51,7 +51,7 @@ image:image1.png[Настройка полей правового основан === Автоматическое обновление полей через Веб-форму регистрации -Если настроено однократное подтверждение подписки, то при отправке адресатом заполненной link:../../core-modules/campaigns/#_Создание_Веб_формы_регистрации[веб-формы регистрации] с отмеченной опцией *Подписаться на рассылку* в системе появится новая запись со следующими значениями полей правового основания: +Если настроено однократное подтверждение подписки, то при отправке адресатом заполненной link:../../core-modules/campaigns/#_создание_веб_формы_регистрации[веб-формы регистрации] с отмеченной опцией *Подписаться на рассылку* в системе появится новая запись со следующими значениями полей правового основания: [cols=","] |=== @@ -65,7 +65,7 @@ image:image1.png[Настройка полей правового основан === Автоматическое обновление полей через E-mail подтверждения подписки -Если настроено двойное подтверждение подписки, то на адрес созданного Контакта, Предварительного контакта или Адресата необходимо отправить соответствующее письмо, как это описано в разделе link:../confirmed-opt-in-settings/#_Отправка_e_mail_для_подтверждения_подписки[Отправка E-mail для подтверждения подписки]. После двойного подтверждения подписки поля правового основания будут содержать следующие значения: +Если настроено двойное подтверждение подписки, то на адрес созданного Контакта, Предварительного контакта или Адресата необходимо отправить соответствующее письмо, как это описано в разделе link:../confirmed-opt-in-settings/#_отправка_e_mail_для_подтверждения_подписки[Отправка E-mail для подтверждения подписки]. После двойного подтверждения подписки поля правового основания будут содержать следующие значения: [cols=","] |=== diff --git a/content/user/modules/PasswordManagement.ru.adoc b/content/user/modules/PasswordManagement.ru.adoc index 6e0cb5e07..9f0567bff 100644 --- a/content/user/modules/PasswordManagement.ru.adoc +++ b/content/user/modules/PasswordManagement.ru.adoc @@ -10,4 +10,4 @@ Weight: 190 = Управление паролями -См. раздел link:../../../admin/administration-panel/users/#_Управление_паролями[Управление паролями]. \ No newline at end of file +См. раздел link:../../../admin/administration-panel/users/#_управление_паролями[Управление паролями]. \ No newline at end of file diff --git a/content/user/modules/Themes.ru.adoc b/content/user/modules/Themes.ru.adoc index cbf89e44c..1956b978c 100644 --- a/content/user/modules/Themes.ru.adoc +++ b/content/user/modules/Themes.ru.adoc @@ -13,13 +13,13 @@ Weight: 140 В системе по умолчанию присутствует единственная тема - SuiteP, которая представлена 4 цветовыми стилями. + Смена стиля производится в профиле пользователя на закладке -link:../../introduction/managing-user-accounts/#_Параметры_макета[Параметры макета]. +link:../../introduction/managing-user-accounts/#_параметры_макета[Параметры макета]. == Изменение цветовой схемы в SuiteCRM версии 7.8 и более ранних В системе присутствует несколько тем, доступных для выбора в профиле пользователя на закладке -link:../../introduction/managing-user-accounts/#_Настройка_тем[Темы]. Параметры тем могут быть настроены индивидуально в -link:../../../admin/administration-panel/system/#_Темы[панели администратора]. +link:../../introduction/managing-user-accounts/#_настройка_тем[Темы]. Параметры тем могут быть настроены индивидуально в +link:../../../admin/administration-panel/system/#_темы[панели администратора]. diff --git a/content/user/suitecrm-analytics/getting-started.adoc b/content/user/suitecrm-analytics/1.0/getting-started.adoc similarity index 83% rename from content/user/suitecrm-analytics/getting-started.adoc rename to content/user/suitecrm-analytics/1.0/getting-started.adoc index d9731cf14..b12d57bc1 100644 --- a/content/user/suitecrm-analytics/getting-started.adoc +++ b/content/user/suitecrm-analytics/1.0/getting-started.adoc @@ -1,5 +1,5 @@ --- -title: Getting Started +title: Version 1.0 - Getting Started weight: 20 --- @@ -12,13 +12,13 @@ weight: 20 == Logging Into SuiteCRM Web Analytics {{% notice note %}} -If you are a system administrator please follow the link:/admin/suitecrm-analytics/[Downloading & Installing guide] to +If you are a system administrator please follow the link:/admin/suitecrm-analytics/[Downloading & Installing guide] to both **SuiteCRM Data Integration** & **SuiteCRM Analytics Web Application**. {{% /notice %}} -To log into the SuiteCRM Analytics Web Application you simply have to navigate to the hostname or IP address +To log into the SuiteCRM Analytics Web Application you simply have to navigate to the hostname or IP address of the server in your favourite web browser. By default the web application is listening -on port 8080 so for example, your server may be available at +on port 8080 so for example, your server may be available at link:http://localhost:8080/suitecrmanalytics[http://localhost:8080/suitecrmanalytics^]. {{% notice info %}} @@ -31,9 +31,9 @@ image:scrm_analytics_login.png[title="Log in"] To run reports the user must browse to the report file the solution repository browser. To do this select ​btn:[Browse]​ from the homepage. This will open the ​**Solution Browser​**. -You can then expand the **Public**​ folder to view all the SuiteCRM Analytics solution folders +You can then expand the **Public**​ folder to view all the SuiteCRM Analytics solution folders including some default sample ones for the platform. -Expand the SuiteCRM Analytics​ folder and then **Reports**​. On the right hand panel you can see +Expand the SuiteCRM Analytics​ folder and then **Reports**​. On the right hand panel you can see the reports listed in the Reports folder. Simply ​double click​ a report to open it in a new application tab. @@ -41,9 +41,9 @@ image:scrm_analytics_browse.png[title="Browse Files"] The report will execute immediately based on default filter values. -You can now edit the report filters and properties. Each change to a report filter or property will cause +You can now edit the report filters and properties. Each change to a report filter or property will cause the report to refresh. -You can turn this functionality off by unchecking the ​**Auto Submit**​ checkbox and instead click +You can turn this functionality off by unchecking the ​**Auto Submit**​ checkbox and instead click btn:[View Report]​ when you are happy with the filters selected. image:scrm_analytics_report.png[title="Run Report"] @@ -51,9 +51,9 @@ image:scrm_analytics_report.png[title="Run Report"] == Running Dashboards Running dashboards is done the same way as running a report. -Just navigate to the **Public > SuiteCRM Analytics > Dashboards**​ folder in +Just navigate to the **Public > SuiteCRM Analytics > Dashboards**​ folder in the ​**Solution Browser**​ and double click​ any of the dashboards you wish to run. -This will open up the dashboard in a new application tab where the user can select various data filters and +This will open up the dashboard in a new application tab where the user can select various data filters and click the ​btn:[Refresh]​ button to execute the dashboard. image:scrm_analytics_dashboard.png[title="Run Dashboard"] diff --git a/content/user/suitecrm-analytics/getting-started.ru.adoc b/content/user/suitecrm-analytics/1.0/getting-started.ru.adoc similarity index 91% rename from content/user/suitecrm-analytics/getting-started.ru.adoc rename to content/user/suitecrm-analytics/1.0/getting-started.ru.adoc index 72d1e0a73..6afc5fa56 100644 --- a/content/user/suitecrm-analytics/getting-started.ru.adoc +++ b/content/user/suitecrm-analytics/1.0/getting-started.ru.adoc @@ -1,12 +1,12 @@ --- -title: Начало работы +title: Версия 1.0 - Начало работы weight: 20 --- :author: likhobory :email: likhobory@mail.ru -:experimental: +:experimental: :imagesdir: /images/en/user @@ -21,7 +21,7 @@ ifdef::env-github[:btn:] == Вход в SuiteCRM Web Analytics {{% notice note %}} -Для настройки SuiteCRM Analytics выполните действия, описанные в link:../../../admin/suitecrm-analytics[этом] разделе. +Для настройки SuiteCRM Analytics выполните действия, описанные в link:../../../../admin/suitecrm-analytics[этом] разделе. {{% /notice%}} Для входа в SuiteCRM Analytics откройте приложение в браузере, по умолчанию используется порт *8080*. @@ -38,8 +38,8 @@ image:scrm_analytics_login.png[Вход в SuiteCRM Analytics] Для создания отчёта перейдите к соответствующему файлу отчёта в репозитории решений. -Для этого на главной странице нажмите на кнопку {btn}[Browse]. -В левой панели открывшейся страницы выберите папку *Public* > *SuiteCRM Analytics* > *Reports*. +Для этого на главной странице нажмите на кнопку {btn}[Browse]. +В левой панели открывшейся страницы выберите папку *Public* > *SuiteCRM Analytics* > *Reports*. В правой панели дважды кликните на необходимый отчёт для его открытия в новой вкладке браузера. image:scrm_analytics_browse.png[Обзор файлов] @@ -58,4 +58,4 @@ image:scrm_analytics_report.png[Открыть отчет в SuiteCRM Analytics] Панель откроется в новой вкладке браузера, где вы можете выбирать различные фильтры и обновлять результаты мониторинга, нажимая на кнопку btn:[Refresh]. -image:scrm_analytics_dashboard.png[Открыть панель мониторинга в SuiteCRM Аналитикс] \ No newline at end of file +image:scrm_analytics_dashboard.png[Открыть панель мониторинга в SuiteCRM Аналитикс] diff --git a/content/user/suitecrm-analytics/1.1/SCRM-Analytics-Getting-Started.adoc b/content/user/suitecrm-analytics/1.1/SCRM-Analytics-Getting-Started.adoc new file mode 100644 index 000000000..29ccb8d27 --- /dev/null +++ b/content/user/suitecrm-analytics/1.1/SCRM-Analytics-Getting-Started.adoc @@ -0,0 +1,665 @@ +--- +title: Version 1.1 - Getting Started +weight: 25 +--- + +:imagesdir: /images/en/user/Analytics-Gettingstarted + +:toc: + += Getting Started + +== Overview +=== SuiteCRM Analytics User Console +The SuiteCRM User Console allows end users to run reports and dashboards that have been packaged with the default installation or created by the solution developers using the SuiteCRM Analytics client tools + +== Log In +Get started with SuiteCRM Analytics by following these steps to login: + +. Launch a Web browser and enter the URL of the SuiteCRM Analytics server. +This will typically be *http://localhost:8080/suitecrmanalytics* if the server is running on your own machine + +. The page loads an introductory screen with a *Login* section. + +. Enter your user name and password and click *Login*. + +image:IMAGE1.png[title="Log In"] + +The default login details for the admin user are below: + +Username: *admin* + +Password: *password* + +Once you have successfully logged in you will be welcomed by the default homepage of the SuiteCRM Analytics User Console + +== About SuiteCRM Analytics Perspectives +The SuiteCRM Analytics User Console interface uses perspectives to extend your ability to work on different tasks at any given time. +By default the User Console has the *Home*, *Browse*, *Opened*, *Schedules* and *Administration* perspectives. + +=== Home +The first thing you see after you log into the *SuiteCRM Analytics User Console* is the *Home* perspective, which serves as the portal for you to access tools and features. +*Home* contains easy access buttons so that you can *Browse Files*, *Create New* dashboards, view *Documentation*, and quickly open recently viewed or favorite files. + +image:IMAGE2.png[title="Home"] + +[cols="1s,3,20",options="header"] +|======================= +|Item |Name |Function +|1 |Home Indicator |Indicates the current User Console perspective that you are using. The +Home menu lets you flip easily from page to page, or return to your +Home page. +|2 |Current User |Shows the name of the person currently logged in to the User Console. +Clicking the arrow next to the name lets you log out of the User Console. +|3 |Browse Files |Brings you to the Browse Files window, where you can locate your files +using the Browsing and Files panes, and manage them using the +Actions pane. +|4 |Create new |Gives you the option to create a new Dashboard. If you have permissions +to work with Data Sources, this button also gives you the option to create a new Data Source. +|5 |Manage Data Sources |Allows administrators to manage new or existing data sources. +|6 |Recents |Shows a list of your most recently opened files. Clicking on the star next +to a recently opened file adds it to your Favorites list. +|7 |Favorites |Shows a list of your favorite files for quick access. +|======================= + +=== Browse Files +The *Browse Files* perspective helps you keep your files and folders organized and makes them easier for you to find and work with. + +image:IMAGE3.png[title="Browse Files"] + +[cols="1s,3,20a",options="header"] +|======================= +|Item |Name |Function +|1 |Browse Files Indicator |Indicates the current User Console perspective that you are using. +Browse Files shows you how to locate your files and folders and the different actions you can do with them. +Displays the Folders, Files, and Actions panes. +|2 |Folders |Shows a list of folders that you can browse through to locate your files. +You can also use the Browsing pane to create new folders or delete old ones. +|3 |Files |Generates and shows a list of all files contained in the folder that is selected in the Browsing pane. +After you select a file, the Actions pane populates with a list of things you can do with the file. +|4 |Actions |The actions displayed depend upon the selection made in the Folders pane, as follows: + +- The Folder Actions pane gives you the ability to: + * Create, delete, and rename folders + * Paste files in a folder + * Upload files + * Download folders + * View the Properties, Allow Scheduling, set to Hidden, and control the folder’s permissions for Users and Roles (Manage Permissions, Delete, Write, and Read). +- The File Actions pane gives you the ability to: + * Open files in the current window or in a new one + * Run files in the background + * Edit, delete, cut, copy, or paste files or folders + * Share files with others + * Schedule reports to run automatically + * Add files to your Favorites widget + * View the Properties of a file or folder. +- The Actions for Trash gives you the ability to: + * Restore a file in Trash Contents + * Permanently delete a file. +|======================= + +=== Opened +The *Opened* perspective uses plugins to provide access to different analytic capabilities. +This perspective activates after you open a file from the *Browse Files* page. +It provides a simple space to work with your files. + +image:IMAGE4.png[title="Opened"] + +[cols="1s,3,20a",options="header"] +|======================= +|Item |Name |Function +|1 |Opened indicator + +Open... + +New Dashboard, or +Data Source +|Indicates the current User Console perspective that you are using. + +Opened displays the files that you access from the Browse Files pane. + +Open... serves as a quick way to browse for more files to open without +leaving the Opened page. These additional files open in new tabs across +the Report Window. + +Quick start buttons to create a new Dashboard. You can also use this +button to create a new Data Source, if you have permissions to work with +data sources. +|2 |Report and +Dashboard Window +|Displays the file or report or dashboard that is currently opened, and lets +you edit or work with the file. +|======================= + +=== Schedules +All of your active scheduled reports appear in the list of schedules, which you can get to by clicking the *Home* drop-down menu, then the *Schedules* link, in the upper-left corner of the User Console page. + +The list of schedules shows which reports are scheduled to run, the recurrence pattern for the schedule, when it was last run, when it is set to run again, and the current state of the schedule. + +image:IMAGE5.png[title="Schedules"] + +[cols="1s,3,20a",options="header"] +|======================= +|Item |Name |Function +|1 |Schedule Indicator |Indicates the current User Console perspective that you are using. +*Schedules* displays a list of schedules that you create, a toolbar to work with your schedules, and a list of times that your schedules are blocked from running. +|2 |Schedule Name |Lists your schedules by the name you assign to them. +Click the arrow next to *Schedule Name* to sort schedules alphabetically in ascending or descending order. +|3 |Repeats |Describes how often the schedule is set to run. +|4 |Source File |File Displays the name of the file associated with the schedule. +|5 |Output Location |Shows the location where the scheduled report is saved. +|6 |Last Run |Shows the last time and date when the schedule was run. +|7 |Next Run |Shows the next time and date when the schedule will run again. +|8 |Created By |The user who created the schedule +|9 |Status |Indicates the current *Status* of the schedule. +The state can be either Normal or Paused. +|10 |Blockout Times |Lists the times when all schedules are blocked from running. +|======================= + +==== Schedule Reports +You can use the *Browse* perspective to schedule a report to run at regular intervals, on certain dates and times, and with different parameters. + +=== Administration +In the User Console, the *Administration* can be used by logged-on users assigned a role that has permissions to administer security can perform system configuration and maintenance tasks. +If you see *Administration* in the left drop-down menu on the *Home* page, you can click it to reveal menu items specific to administration of the SuiteCRM Analytics Server. +If you do not have administration privileges, Administration does not appear within the console. + +image:IMAGE6.png[title="Administration"] + +[cols="1s,3,20a",options="header"] +|======================= +|Item |Name |Function +|1 |Administration |The Administration perspective enables you to set up users, configure the mail server and change authentication settings on the SuiteCRM Analytics Server. +|2 |Users & Roles |Manage the SuiteCRM Analytics users or roles for the SuiteCRM Analytics Server. +|3 |Mail Server |Set up the outgoing email server and the account used to send reports through email. +|4 |Settings |Manage settings for deleting older generated files, either manually or by creating a schedule for deletion. +|======================= + +== Running Reports +To run Reports you simply have to navigate to the *Public > SuiteCRM Analytics > Reports* folder and you will see the list of reports in the middle panel. +Here you can double click the report you wish to run and it will open in a new tab. You also have report options on the right side panel to open the Report in a new browser window. + +The report will execute immediately based on default filter values. +You can now edit the report filters and properties. +Each change to a report filter or property will cause the report to refresh. +You can turn this functionality off by unchecking the *Auto Submit* checkbox and instead click *View Report* when you are happy with the filters selected. + +image:IMAGE7.png[title="Running Reports"] + +== Running Dashboards +Running dashboards is done the same way as running a report. +We simply navigate to the *Public > SuiteCRM Analytics > Dashboards* folder in the *Solution Browser* and *double click* any of the dashboards we wish to run. +This will open up the dashboard in a new application tab where the user can select various data filters and click the *Refresh* button to execute the dashboard. + +image:IMAGE8.png[title="Running Dashboards"] + +== Managing Users & Roles +This section provides an overview of the default assignments for users and roles, the permissions included, and the management of users and roles in the SuiteCRM Analytics User Console. +You must login to the User Console as an administrator (or be assigned to a role that has Administer Security permission) to manage users and roles for SuiteCRM Analytics Security. + +Here is how you can manage users: + +* Add Users +* Change User Passwords +* Delete Users +* Assign Users to Roles + +Here is how you can manage roles: + +* Add Roles +* Assign Permissions to Roles +* Delete Roles +* Assign Roles to Users + +You can control users and roles in the User Console with a point-and-click user interface. +The *Users & Roles* page allows you to switch between user and role settings. +You can add, delete, and edit users and roles from this page. + +{{% notice note %}} +Access to files or folders can also be refined using the *Browse Files* perspective in the *User Console*. +Each file or folder can use the default permissions or permissions can be customized for specific users and roles. +{{% /notice %}} + +=== Sample Users, Default Roles, and Permissions +By viewing the sample user and default role examples you can get ideas about ways to define actual users and specific roles. + +. *Login* to the User Console. Click *Home > Administration*. +The Administration perspective opens the *Users & Roles* page with the *Manage Users* tab selected. + +. Highlight a user in the users list to display which roles are available for that user, as well as which role is currently defined for that user. + +. Select the *Manage Roles* tab to display the *Operation Permissions* for the user's role, as defined by the checked boxes. +These roles, added for your convenience, can be removed or altered based on your needs (*see Table 1*). +Each default role and sample user comes with a standard set of permissions, which provides for a specific set of capabilities when using SuiteCRM Analytics tools and the SuiteCRM Analytics Server (*see Table 2*). + +. Select the *System Roles* tab to display the user's system role. +System Roles are built-in roles used to control default behaviors and permissions in the User Console, handled implicitly or through system configuration, with automatic assignments. +The default system role for all users is *Authenticated*. +If you want to restrict permissions, the Authenticated role must be restricted or removed from the user. + + +.Default SuiteCRM Analytics Security Settings +[cols="2,1,10a",options="header"] +|======================= +|Default Role |Sample User |Default Operation Permissions +|Administrator |admin |* Administer Security +* Schedule Content +* Read Content +* Publish Content +* Create Content +* Execute +* Manage Data Sources +|Business Analyst |pat |* Publish Content +|Power User |suzy |* Schedule Content +* Read Content +* Publish Content +* Create Content +* Execute +|Report Author |tiffany |* Schedule Content +* Publish Content +|======================= + +.Operation Permissions Defined +[cols="1,3a",options="header"] +|======================= +|Operation Permission |Definition +|Administer Security |The default Administrator role automatically conveys all operation +permissions to users assigned to that role, even if the check box next to it is +cleared. These permissions include the Read and Create Content +permissions, which are required for accessing the Administration +perspective. + +* Gives access to the *Administration* perspective of the User Console. +* Allows access to and the ability to manage all content in the *Browse* perspective. +* Allows the ability to view and work with all user schedules in the *Schedules* perspective. +* Gives the ability to create server block out times in the *Schedules* perspective. +|Schedule Content |* Allows the user to schedule reports and content. +* Gives the user the ability to view, edit, or delete their own schedules using the *Schedules* perspective. +|Read Content |* Gives the user the ability to view content in the *Browse* perspective. +* Gives the user the ability to view content through the *File > Open* dialog box. +|Publish Content |This permission includes tools such as Report Designer, Schema Workbench, and Metadata Editor. + +* Allows client tools to store reports or data models in the SuiteCRM Analytics Repository. +* When held in conjunction with Write permission on the target folder, allows a user to upload supported content types. +|Create Content |* Allows the user to create, import, delete, and save reports to the repository. +* Gives the user the ability to see a list of data sources which are used to create reports or dashboards. +|Manage Data Sources |* Allows the user to create, edit, or delete new data sources. +* Gives the user the ability to see a list of data sources that are used to create reports or dashboards. +|======================= + +=== Add Users +. With the Manage Users tab selected, click the plus *(+)* sign. The New User dialog box appears. + +. Enter a new *User Name* and *Password*, then *Confirm Password* and click *OK*. +The new user account is active and displays in the Users list. + +=== Change User Passwords +. With the *Manage Users* tab selected, click the user for whose password you want to edit. +The user's information populates to the right of the *Users* field. + +. Click *Edit*. Enter the *New Password* and *Confirm Password* then click *OK*. +The password is changed and the user is able to login with the new password. + +{{% notice note %}} +After you have logged into the User Console for the first time, it is a best practice to change +the default administrator password. +{{% /notice %}} + +=== Delete Users +. With the *Manage* Users tab selected, click the user or users in the *Users* list that you want to +delete. +. Click the *X* to delete the user or users. The *Delete* User confirmation dialog box appears. +. Click *Yes*, *Delete* to delete the user(s) and refresh the user list. +The selected user accounts are deleted and the users are no longer able to login to the SuiteCRM Analytics Server. + +=== Assign Users to Roles +. With the *Manage* Users tab selected, click to highlight the user from the *Users* list that you want to associate with a role. + +. In the *Available* list, click to highlight the role that you want to associate with the selected user. + +. Click the right arrow *(>)* to move the role to the Selected list. + +. You can remove a role from the Selected list by highlighting that role and clicking on the left +arrow *(<)*. +The role moves from the *Selected* to *Available* list, and the user no longer has the associated permissions. +The user now has all of the permissions associated with the role in the Selected list + +=== Add Roles +. With the *Manage* Roles tab selected, click the plus *(+)* sign. +The *New Role* dialog box appears. + +. Enter a new *Name* for the role, then click *OK*. The new role is created, and appears in the *Available* roles list. +After adding a new role, you need to assign operation permissions to it, see *Assign Permissions* to *Roles*, below, for details. + +=== Assign Permissions to Roles +. Make sure that the role is highlighted in the *Roles* list. + +. Click in the check boxes in the *Operation Permissions* list. +The role has permissions assigned to it, and users associated with that role have those permissions. + +=== Delete Roles +. With the *Manage Roles* tab selected, click the role or roles you want to delete. + +. Click the *X* to delete the role(s). +The *Delete* Role confirmation dialog box appears. + +. Click *Yes* to delete the role(s) and refresh the role list. +The selected role is deleted and is no longer available on the server. +The users who were associated with that role are no longer associated with it. +Other roles assigned to users are not affected. If users have only one role assigned to them and that role is deleted, then the users have no role assigned to them. +The default role is *Authenticated* and all users have that role unless you remove it. + +=== Assign Roles to Users +. Make sure the *Manage Roles* tab is selected, then click the role in the *Roles* list that you want to associate with a user or users. + +. In the *Available* list, click the user or users that you want to associate with that role. + +. Click the right arrow *(>)* to move the users to the *Selected* list. +You can click the double-right arrow *(>>)* to move all users from the *Available* list to the *Selected* list. + +. You can remove users from the *Selected* list by highlighting that user and clicking on the left arrow *(<)*. +The user moves from the *Selected* list to the *Available* list, and no longer has the permissions associated with that role. +The users that appear in the Selected list are now tied to the highlighted role and have all of the permissions associated with that role. + +== Run Files in Background +You can run reports in the background from the User Console. + +Perform the following steps to run a report in the background: + +. Log on to the User Console, and then click the Browse Files button. + +. In the *Folders* pane, browse to the folder containing the file that you want to run. + +. In the *File* pane, click on the file that you want to run. + +. In the *File Actions* pane, click *Run in background*. The Run In Background dialog box displays. + +image:IMAGE9.png[title="Run Files in Background"] + +[start=5] +. Enter your selections for the following fields. + +[cols="1,3a",options="header"] +|======================= +|Field |Description +|Generated Content Name |Specify a name for the generated content. If no name is entered in the Name field, the default is the report name. +|Append Time To Name |Click this check box to append the value specified in the *Generated Content Name* with a timestamp. +When selected, a menu displays with a list of timestamp format options. +Use the *Preview* panel to view how the name will display on the generated file. +|Generated Content Location |Specify a location for the generated content. +Click *Select* to browse to a folder location to choose it. +|Overwrite Existing File |Click this check box to overwrite any existing files that have the same name and timestamp as the one you are running and saving to the specified location. +|======================= + +[start=6] +. Click *Next*. +If the selected report has run parameters, such as *Output Type*, you will be asked to specify them here. + +. When you have completed your parameter selections, click *Finish*. + +The system will deliver the content generated from the report to your specified location. + +== Schedule Reports +You can use the Schedules page of the User Console to schedule a report to run at regular intervals, on certain dates and times, and with different parameters. +You can also set a scheduled report to be emailed automatically, if your system administrator has configured the server for emailing reports. +After you schedule a report, you can pause or delete a schedule, as well as edit the schedule to change the frequency of the report, parameters, or email settings. + +The system administrator may set up times when you cannot run a scheduled report, for example, to perform system maintenance, or to minimize scheduling during peak times. +If any blocked out times are set up, you can view these times so you can choose an alternate schedule. + +=== Schedule Report +You can run reports from the User Console using scheduling options to launch reports during off-peak +hours or on a recurring basis. + +. Log on to the User Console, and then click the *Browse Files* button. +. In the *Folders* pane, browse to the folder containing the file that you want to run. +. In the *File* pane, click on the file that you want to run. +. In the *File Actions* pane, click *Schedule*. +The New Schedule dialog box displays. + +image:IMAGE10.png[title="Schedule Report"] + +[start=5] +. Enter your selections for the following fields + +[cols="1,3a",options="header"] +|======================= +|Field |Description +|Schedule Name |Specify a name for the schedule, which will also be the name of the generated report content. +If no name is entered in the *Schedule Name* field, the default is the name of the report file. +|Append Time To Name |Click this check box to append the value specified in the *Generated Content Name* with a timestamp. +When selected, a menu displays with a list of timestamp format options. +Use the *Preview* panel to view how the name will display on the generated file. +|Generated Content Location |Specify a location for the generated content. +Click *Select* to browse to a folder location to choose it. +|Overwrite Existing File |Click this check box to overwrite any existing files that have the same name and timestamp as the one you are running and saving to the specified location. +|======================= + +[start=6] +. Click *Next*. +The schedule fields display + +image:IMAGE11.png[title="Schedule Report"] + +[start=7] +. If selecting a recurrence, be sure to select start and end dates, as well as a recurrence pattern. + +[cols="1,3a",options="header"] +|======================= +|Field |Description +|Recurrence |Choose a time interval for the report from the Recurrence list. +Options include: + +* Run Once: Runs the file one time. +* Seconds: Runs the file repeatedly at the time interval (in seconds) specified in the Recurrence pattern. +* Minutes: Runs the file repeatedly at the time interval (in minutes) specified in the Recurrence pattern. +* Hours: Runs the file repeatedly at the time interval (in hours) specified in the Recurrence pattern. +* Daily: Runs the file repeatedly either every weekday or at the time interval (in days) specified in the Recurrence pattern. +* Weekly: Runs the file repeatedly on the day(s) specified in the Recurrence pattern. +* Monthly: Runs the file repeatedly on the day of the month specified in the Recurrence pattern. +* Yearly: Runs the file repeatedly on the date specified in the Recurrence pattern. +* Cron: Runs the file according to the Quartz Cron Attributes in the Cron String field. +If you want to enter a custom time interval, choose the ‘Cron’ option. + +If blockout times have been scheduled by your administrator, a View Blockout Times button appears on the bottom of the New Schedule window. +Click View Blockout Times to view the list of blockout times. + +|Recurrence Pattern |Depending your selected time interval in the Recurrence field, specify the recurrence pattern. +|Range of Recurrence |Specify the start and end dates for running this report. +The report will begin running according to the specified recurrence pattern on the start date specified and complete its run cycle on the end date specified in this section. +|Start Date (Run Once) |If you select ‘Run Once’ for Recurrence, then specify the date to run the report. +|Cron String (Cron) |If you select ‘Cron’ for Recurrence, then specify the Cron syntax. Consult the +*Quartz Cron Attributes* reference to learn the Quartz Cron syntax. +|======================= + +{{% notice warning %}} +When you set up a *Cron* schedule you must remember that it will start at *12 noon server time* in the *Start Date* selected. +This means if you create a new schedule at *9am* to run every 15 minutes, it will only start running at *12:00* on the Start Date selected. To make sure your cron schedule starts executing straight away its best to select the day prior to today's date. +That will allow the cron job to be active right away. +{{% /notice %}} + +[start=8] +. Click *Next*. +The selected report may run using several parameters which you may be asked to specify, such as output type. +. If your SuiteCRM Analytics administrator has set up an email server, you may elect to email a copy of the report to selected users. +For example, you may want users in the Finance department to receive the Excel output of the report via email every time the report is run on the recurring schedule. +[loweralpha] +.. Click *No* to skip emailing a copy of the report to users. +.. Click *Yes* to email a copy of the report to users. +Fill in the fields that display with the users’ details, and then click *OK*. +. When you have completed your parameter selections, click *Finish*. + +=== Edit a Schedule +You can edit a schedule to change the frequency of the scheduled report, report parameters, and email settings. + +. Click the *Home* drop-down menu on the upper-left and click the link to the *Schedules*. +The list of schedules appears in the Schedules page. + +. Click the schedule you want to edit in the list, then click *Edit* in the scheduling toolbar. +The Edit Schedule window appears. + +. Type to rename the schedule in the *Schedule Name* field. + +. Choose a new time interval for the report from the *Recurrence* list. + +. Choose a new *Start Time* and *Recurrence Pattern*, as well as new *Start* and *End Dates* for the +schedule. +Click *Next*. +If blockout times have been scheduled by your administrator, a *View Blockout Times* button appears on the bottom of the *New Schedule* window. +A list of blockout times is viewable by clicking *View Blockout Times*. + +. Choose what type of file you would like the schedule to create from the *Parameters* field. +Click Next. +The email option will only appear if your system administrator has enabled email on the +server. +[loweralpha] +.. If you do not want to email a copy of the report, choose *No*. + +.. If you want to email a copy of the report, choose *Yes*. +Fill in or edit the fields that appear. + +. Click *OK*. + +The schedule is edited and appears in the list in the Schedules window of the console. + +=== Delete a Schedule +After you have scheduled a report, you can easily delete the schedule without deleting the report. + +. Click the *Home* drop-down menu on the upper-left and click the link to *Schedules*. +The list of schedules appears in the Schedules page. + +. Click the schedule that you want to delete in the list. +The schedule is highlighted. + +. Click *Delete* in the upper right of the toolbar to delete the highlighted schedule. +This deletes the schedule while leaving the report intact. + +=== Manage Schedules +As an administrator, you may create, run, delete, stop, edit, or resume schedules through the +Schedules page. +After a report is scheduled by any user, an admin may edit, pause, or delete that +schedule, as well as change the frequency of the report, change parameters, or adjust email +settings. +To distribute reports using email, make sure you have configured the email server. + +== Set Up Emails for Scheduled Reports +A convenient way to share reports is to specify an email server to be used by the SuiteCRM Analytics +Server to send these reports to recipients. +This feature works with the report scheduling feature to automate the process of emailing reports to your user community. +Having an email server is not required to configure the SuiteCRM Analytics Server. +If you want to get started quickly or do not have information about your email server, skip this for now. +You can always come back to it later. + +=== About the Mail Server Page +You use the Administration page within the SuiteCRM Analytics User Console and access *Mail Server* to set up the e-mail server, as shown in the following example steps: + +. Log on to the Suitecrm Analytics Console, click Administration in the upper-right corner, then +click *Mail* Server from the items on the left. +The Mail Server page appears. + +image:IMAGE12.png[title="About the Mail Server Page"] + +[start=2] +. Enter your email server settings + +[cols="1,3a",options="header"] +|======================= +|Setting |Description +|Hostname (SMTP) |Address of your SMTP email server for sending +email. +|Port |Port of your SMTP email server, usually 25. For +Gmail, the value is 587. +|Use Authentication |Enable to use authentication for email. +User Name User ID to connect to the email server for sending email. +|Password |Password used to connect to the email server. +|Server Type |Transport for accessing the email server, usually SMTP. +For Gmail, SMTP is required. +|Email From Address |Address that appears in the From field in an email.If left blank, the default email address for this field is Pentaho Scheduler. +|Email From Name |Name that appears in the From field in an email. +If left blank, the default email name for this field is SuiteCRM Analytics Scheduler. +|Use Start TLS |Enable if the email server requires a Start TLS connection. +|Use SSL |Enable if the email server requires an SSL connection. +This value must be enabled for Gmail. +|======================= + +[start=3] +. Click *Test Email Configuration*, then click *Save*. +A success message appears. + +== Quartz Cron Attributes +The Quartz cron engine supports a seven-attribute time declaration with many possible values. +The number format is the same for every expression, even if the values are different -- it must be listed as seconds, minutes, hours, day of month, month, day of week, then the year. +A space separates each attribute. + +These are the possible values for each attribute: 0 to 59 for seconds and minutes, 0 to 23 for hours, 1 to 31 for days, 1 to 12 for months, 1 to 7 for day of week, and a four-digit year. +Alternatively, you can use three-letter values for the day of week (SUN, MON, TUE, WED, THU, FRI, SAT). +However, three-letter values for the month (JAN, FEB, etc.) are not supported. +For months, use numbers 1-12. + +An asterisk (*) indicates all values, so an asterisk in the minute field would mean that the report runs once every minute. +You can specify a range of values with the - (dash) operator, and you can specify multiple individual values with a comma. +If you need to excuse a value in the day of month and day of week field from a cron job, you can use the question mark (?) character to indicate that this value doesn't matter. +If you need to split values, you can do so with the slash (/) character -- this operator literally means "every," so 0/15 would mean "Every 15." +In the day of month field, you can use the # character to indicate a certain instance of a day of the month, for instance the second Friday of the month would be 6#2. + +You can use a capital L in the day of month and day of week field to indicate "Last," as in the last day of the week or month. +A capital W in the day of month attribute means "Weekday," which only encompasses Monday through Friday. +The W character can only be specified when the day-of-month is a single day, not a range or list of days. +Most of these values can be combined to accommodate unusual cron schedules. + +[cols=",a",options="header"] +|======================= +|Attribute |Conditionals and Operators +|Seconds |, - * / +|Minutes |, - * / +|Hours |, - * / +|Day of Month |, - * ? / L W +|Month |, - * / +|Day of Week |, - * ? / L # +|Year |, - * / +|======================= + +=== Sample Cron Strings + +[cols=",a",options="header"] +|======================= +|Cron |Description +|0 0/30 * * * ? * |Every 30 minutes every day of the year +|0 15 10 ? * 6L * |10:15 AM on every last Friday of every month. +|0 30 10 ? * TUE,WED,THU * |10:30AM every Tuesday, Wednesday and Thursday +|======================= +You can generate Cron strings using this website - http://www.cronmaker.com/ + +== Data Cache +The SuiteCRM Analytics Server comes with *Data Caching* capabilities. +When a report or dashboard is run, certain data will be cached for future executions. +It's important to understand that when the Data Warehouse is updated you may also have to refresh the SuiteCRM Analytics Server Cache. + +=== Refresh CDA Cache +The *CDA Cache* serves the charts and dashboards supplied with SuiteCRM Analytics. +This also includes any charts that are rendered in reports. +To refresh this cache you can follow these steps + +. Log on to the Suitecrm Analytics Console + +. Click the *Tools* menu + +. Select *Refresh* > *CDA Cache* + +This will open a new tab informing you when the *CDA* cache has been cleared. + +image:IMAGE13.png[title="Refresh CDA Cache"] + +=== Refresh Reporting Data Cache +The *Reporting Data Cache* serves the data in reports but not the charts in reports. +To refresh this cache you can follow these steps: + +. Log on to the Suitecrm Analytics Console + +. Click the *Tools* menu + +. Select *Refresh* > *Reporting Data Cache* + +This will display a popup informing you when the *Reporting Data* cache has been cleared. + +image:IMAGE14.png[title="Refresh Reporting Data Cache"] diff --git a/content/user/suitecrm-analytics/1.1/SCRM-Analytics-Getting-Started.ru.adoc b/content/user/suitecrm-analytics/1.1/SCRM-Analytics-Getting-Started.ru.adoc new file mode 100644 index 000000000..3cbcbba42 --- /dev/null +++ b/content/user/suitecrm-analytics/1.1/SCRM-Analytics-Getting-Started.ru.adoc @@ -0,0 +1,590 @@ +--- +title: Версия 1.1 - Начало работы +weight: 25 +--- + +:author: likhobory +:email: likhobory@mail.ru + +:toc: +:toc-title: Оглавление + +:experimental: + +:imagesdir: /images/en/user/Analytics-Gettingstarted + +ifdef::env-github[:imagesdir: ./../../../../master/static/images/en/user/Analytics-Gettingstarted] + +:btn: btn: + +ifdef::env-github[:btn:] + += Начало работы + +== Краткое описание + +=== Консоль SuiteCRM Analytics + +Консоль SuiteCRM позволяет пользователям системы работать с отчётами и панелями мониторинга, входящими как в стандартную поставку, так и созданными дополнительно, с помощью клиентских инструментов SuiteCRM Analytics. + +{{% notice note %}} +Для настройки SuiteCRM Analytics выполните действия, описанные в +link:../../../../admin/suitecrm-analytics[этом] разделе. +{{% /notice %}} + +== Вход в SuiteCRM Web Analytics + +Для входа в SuiteCRM Analytics выполните следующее: + +. Откройте приложение в браузере, по умолчанию используется порт *8080*. +Как правило сервер доступен по адресу +*\http://localhost:8080/suitecrmanalytics*. + +image:IMAGE1.png[Вход в SuiteCRM Web Analytics] + +[start=2] +. Введите имя пользователя, пароль и нажмите на кнопку {btn}[Login] + +{{% notice info %}} +По умолчанию используется имя пользователя `admin`, пароль - `password`. +{{% /notice%}} + +== Страницы SuiteCRM Analytics + +Интерфейс пользовательской консоли SuiteCRM Analytics состоит из нескольких страниц, позволяющих расширить ваши возможности при работе над различными задачами в любой момент времени. +По умолчанию консоль содержит страницы *Главная* (Home), *Обзор* (Browse), *Открытые* (Opened), *Расписания* (Schedules) и *Администрирование* (Administration). + +=== Главная (Home) + +Первое, что вы видите после входа в консоль *SuiteCRM Analytics* - это *Главная* страница, которая служит порталом для доступа к другим инструментам. +Эта страница содержит кнопки быстрого доступа, чтобы вы могли *выбирать необходимые файлы*, *создавать новые* панели мониторинга, просматривать *документацию* и быстро открывать недавно просмотренные или избранные файлы. + +image:IMAGE2.png[Главная] + +[cols="1s,3,20",options="header"] +|======================= +|№ |Элемент интерфейса |Назначение +|1 |Главная |Название текущей страницы. +Главная страница позволяет легко переходить со страницы на страницу или возвращаться обратно на Главную страницу. +|2 |Текущий пользователь |Имя пользователя, работающего в консоли SuiteCRM Analytics. При необходимости вы можете войти в консоль под учётной записью другого пользователя, нажав на стрелку справа от имени пользователя. +|3 |Обзор файлов |Страница, где вы можете выбрать необходимые папки/файлы и выполнить над ними необходимые действия. +|4 |Создание панели |Здесь вы можете создать новую панель мониторинга. Если у вас есть права на работу с источниками данных, то вы также можете создать подключение к новому источнику данных. +|5 |Управление источниками данных |Позволяет администраторам управлять новыми или существующими источниками данных. +|6 |Последние |Показывает список недавно открытых файлов. Нажав на звёздочку рядом с элементом списка, вы можете добавить его в список избранного. +|7 |Избранное |Показывает список избранных файлов для быстрого доступа. +|======================= + +=== Обзор файлов (Browse Files) +Страница *Обзор файлов* помогает упорядочить файлы и папки, упрощает их поиск,а также позволяет выполнять над ними различные действия. + +image:IMAGE3.png[Обзор файлов] + +[cols="1s,3,20a",options="header"] +|======================= +|№ |Элемент интерфейса |Назначение +|1 |Browse Files(Обзор файлов) |Название текущей страницы. +Страница позволяет найти ваши файлы и папки, а также выполнить над ними различные действия. +Страница состоит из трёх панелей: Папки, Файлы и Действия. +|2 |Folders(Папки) |Показывает список папок, которые вы можете просматривать для нахождения необходимых файлов. Здесь же при необходимости вы можете создать новую папку или удалить ненужную. +|3 |Files (Файлы) |Показывает список всех файлов, содержащихся в выбранной папке. +После выбора файла панель *Действия* заполняется списком действий, которые вы можете выполнить над файлом. +|4 |Actions (Действия) |Отображаемые действия зависят от выбора, сделанного на панели папок или файлов, а именно: + +- Действия над папками позволяют: + * Создавать, удалять и переименовывать папки + * Добавлять файлы в папку + * Загружать файлы + * Скачивать папки + * Просматривать свойства, составлять расписание, скрывать папки, управлять доступом к папкам для различных пользователей и ролей (управление разрешениями, удаление, запись и чтение). + +- Действия над файлами позволяют: + * Открывать файлы в текущем или в новом окне + * Запускать файлы в фоновом режиме + * Редактировать, удалять, вырезать, копировать или вставлять файлы или папки + * Делиться файлами с другими пользователями + * Настраивать автоматическое создание отчётов по расписанию + * Добавлять файлы в *Избранное* + * Просматривать свойства файлов или папок +- Действия в корзине позволяют: + * Восстанавливать файл из корзины. + * Удалять файл без возможности восстановления +|======================= + +=== Открытые (Opened) + +Страница использует плагины для обеспечения доступа к различной аналитике. Данные на странице появляются после открытия соответствующего файла на странице *Обзор файлов*. Страница обеспечивает рабочее пространство для работы с открытым файлом. + +image:IMAGE4.png[Открытые] + +[cols="1s,3a,20a",options="header"] +|======================= +|№ |Элемент интерфейса |Назначение +|1 |[loweralpha] +. Открытые +. Открыть... +. Новая панель мониторинга или новый источник данных + +|[loweralpha] +. Кнопка отображает файлы, открытые через панель *Обзор файлов* +. Кнопка позволяет открыть другие файлы, не покидая текущей страницы, отображая дополнительные файлы на отдельных вкладках. +. Кнопки, позволяющие быстро создать новую панель мониторинга или подключить новый источник данных (если у пользователя есть соответствующие права). +|2 |Окно отчёта панели мониторинга +|Отображает текущий открытый файл, отчёт или панель мониторинга и позволяет работать с предоставленными данными +|======================= + +=== Расписания (Schedules) + +Все активные запланированные отчёты отображаются в расписаниях, к которым вы можете перейти, открыв меню *Главная* > *Расписания* (*Home* > *Schedules*). + +Расписание отображает отчёты, запланированные для создания, включая периодичность создания отчёта, время последнего создания отчёта, время следующего создания отчёта, а также текущий статус задачи. + +image:IMAGE5.png[Расписания] + +[cols="1s,3a,20a",options="header"] +|======================= +|№ |Элемент интерфейса |Назначение +|1 |Расписания |Название текущей страницы. +Страница отображает расписания, по которым создаются отчёты, панель инструментов для работы с расписаниями, а также время блокировки, в течение которого отчёты создаваться *не будут*. +|2 |Название |Названия расписаний, отсортированные по имени. +Для изменения направления сортировки нажмите на стрелку в правой части колонки. +|3 |Повторы |Правило повторного создания отчёта. +|4 |Исходный файл |Имя файла отчёта. +|5 |Расположение отчёта |Место сохранения создаваемого отчёта. +|6 |Предыдущий запуск |Время и дата последнего создания отчёта. +|7 |Следующий запуск |Время и дата следующего создания отчёта. +|8 |Создано |Имя пользователя, создавшего расписание. +|9 |Статус |Текущий статус задачи. Статус может быть обозначен как *Обычный* или *В паузе*. +|10 |Время блокировки |Перечень интервалов времени, в течение которых отчёты создаваться не будут. +|======================= + +==== Отчёты по расписанию + +Вы можете использовать страницу *Обзор файлов*, запуская создание отчётов через указанные промежутки времени, в определённое время и с различными параметрами. + +=== Администрирование (Administration) + +Администрировать SuiteCRM Analytics могут пользователи, которым назначена роль с соответствующими разрешениями. Такие пользователи могут выполнять задачи по настройке и обслуживанию системы. +Если вы видите надпись *Administration* в левом верхнем меню на странице *Home*, вы можете кликнуть по ней для отображения пунктов меню, относящихся к администрированию SuiteCRM Analytics Server. +Если у вас нет прав администратора, меню администрирования отображаться не будет. + +image:IMAGE6.png[Администрирование SuiteCRM Analytics] + +[cols="1s,3a,20a",options="header"] +|======================= +|№ |Элемент интерфейса |Назначение +|1 |Администрирование |Название текущей страницы. На станице вы можете настроить права пользователей, настроить почтовый сервер и изменить параметры проверки подлинности на сервере SuiteCRM Analytics. +|2 |Пользователи и роли |Управление пользователями и ролями пользователей для доступа к SuiteCRM Analytics Server. +|3 |Почтовый сервер |Настройка сервера исходящей почты для отправки создаваемых отчётов. +|4 |Настройки |Управление настройками удаления старых файлов (вручную или автоматически, через создание соответствующего расписания для удаления файлов). +|======================= + +== Открытие отчёта + +Для доступа к отчётам достаточно открыть папку *Public > SuiteCRM Analytics > Reports*. На центральной панели будет отображён список доступных отчётов. +Кликните дважды необходимый отчёт, и он откроется в новой вкладке. Вы также можете воспользоваться соответствующей настройкой на правой панели, если необходимо открыть отчёт в новом окне браузера. + +Отчёт будет создан немедленно на основе стандартных значений предустановленных фильтров. +При изменение того или иного фильтра отчёт будет автоматически обновлён. Если вас не устраивает автоматическое обновление - отключите параметр *Auto Submit*, после чего отчёт будет обновляться только после настройки всех необходимых фильтров и нажатия на кнопку {btn}[View Report]. + +image:IMAGE7.png[Открытие отчёта в SuiteCRM Analytics] + +== Открытие панели мониторинга + +Доступ к панели мониторинга осуществляется точно так же, как и к отчётам: откройте папку *Public > SuiteCRM Analytics > Dashboards* и дважды кликните на необходимую панель. Панель откроется на отдельной вкладке, где пользователь может выбрать необходимые фильтры и нажать на кнопку *Refresh* для отображения необходимых данных. + +image:IMAGE8.png[Открытие панели мониторинга в SuiteCRM Analytics] + +== Управление ролями и пользователями + +В этом разделе описываются стандартные настройки пользователей, ролей и разрешений, а также описывается управление пользователями и ролями в SuiteCRM Analytics. +Вы должны войти в консоль с правами администратора (или вам должна быть заранее назначена роль с разрешением *Administer Security*), чтобы управлять пользователями и ролями в SuiteCRM Analytics Security. + +Управление пользователями включает: + +* Добавление пользователей +* Изменение пароля пользователей +* Удаление пользователей +* Назначение пользователей в роль + +Управление ролями включает: + +* Добавление ролей +* Назначение ролям прав доступа +* Удаление ролей +* Назначение ролей пользователям + +Вы можете управлять пользователями и ролями в консоли одним щелчком мыши. +Страница предоставляет возможность переключаться между пользователями и ролями, позволяя быстро добавлять, удалять и редактировать необходимые данные. + +{{% notice note %}} +На странице *Обзор файлов* (Browse Files) можно настроить доступ к файлам или папкам. +Каждый файл или папка может использовать разрешения по умолчанию или разрешения, которые можно настроить для определённых пользователей и ролей. +{{% /notice %}} + +=== Примеры пользователей, стандартных ролей и разрешений + +Анализируя предоставленные примеры, вы можете получить представление о способах настройки ролей и прав пользователей. + +. Откройте страницу *Главная > Администрирование > Пользователи и роли* (Home > Administration > Users & Roles). + +. На вкладке *Управление пользователями* (Manage Users) выделите в списке необходимого пользователя, чтобы увидеть, какие роли доступны для этого пользователя, а также какая роль в настоящее время определена для этого пользователя. + +. Выберите вкладку *Управление ролями* (Manage Roles), чтобы отобразить *Разрешения* (Operation Permissions), предустановленные для роли пользователя. +Эти роли, добавленные для вашего удобства, могут быть удалены или изменены в зависимости от ваших потребностей *(см. Таблицу 1)*. +Каждая роль и пользователь имеют стандартный набор разрешений, которые обеспечивают определённые возможности при работе с инструментарием SuiteCRM Analytics и с SuiteCRM Analytics Server *(см. Таблицу 2)*. + +. Выберите вкладку *Системные роли* (System Roles) для отображения системной роли пользователя. +Системные роли - это встроенные роли, используемые для управления стандартными разрешениями, которые обрабатываются неявно или через конфигурацию системы и назначаются автоматически. +Системная роль по умолчанию для всех пользователей - *Authenticated*. +Если вы хотите ограничить разрешения, либо соответствующим образом измените эту роль, либо исключите из неё пользователя. + +[caption="Таблица 1. "] +.Стандартные настройки безопасности SuiteCRM Analytics +[cols="2,1,10a",options="header"] +|======================= +|Роль |Пользователь |Стандартные разрешения +|Administrator (Администратор) |admin | +* Администрирование настроек безопасности +* Настройка расписания +* Чтение контента +* Публикация контента +* Создание контента +* Выполнение +* Управление источниками данных + +|Business Analyst (Бизнес-аналитик) |pat |* Публикация контента + +|Power User (Пользователь с расширенными правами) |suzy | +* Настройка расписания +* Чтение контента +* Публикация контента +* Создание контента +* Выполнение + +|Report Author (Автор отчёта)|tiffany | +* Настройка расписания +* Публикация контента +|======================= + +[caption="Таблица 2. "] +.Стандартные разрешения +[cols="1,3a",options="header"] +|======================= +|Разрешение |Описание +|Administer Security (Администрирование настроек безопасности) |Роль администратора, предоставляет ВСЕ разрешения пользователям, которым назначена эта роль. Разрешения включают чтение и создание контента, необходимые для доступа к странице *Администрирование*. + +* Доступ к странице *Администрирование* (Administration). +* Доступ и возможность управления контентом на странице *Обзор файлов* (Browse Files). +* Доступ и возможность управления расписаниями на странице *Расписания* (Schedules). +* Возможность указания времени блокировки расписаний на странице *Расписания* (Schedules). + +|Schedule Content (Настройка расписания) |* Выбор расписания, по которому будут создаваться отчёты. +* Возможность просмотра, редактирования или удаления пользователями своих собственных расписаний на странице *Расписания* (Schedules). + +|Read Content (Чтение контента) |* Возможность просмотра контента на странице *Обзор файлов* (Browse Files). +* Возможность просмотра контента, используя меню *Файл > Открыть* (File > Open). + +|Publish Content (Публикация контента) |Возможность использования такого инструментария как Report Designer, Schema Workbench и Metadata Editor. + +* Возможность сохранения отчётов или моделей данных в репозитории SuiteCRM Analytics. +* Возможность загрузки поддерживаемых типов контента (если используется совместно с разрешением на запись в целевой папке). + +|Create Content (Создание контента) |* Возможность создания, импорта, удаления и сохранения отчётов в репозитории. +* Возможность просмотра источников данных, которые используются при создании отчётов или панелей мониторинга. + +|Manage Data Sources (Управление источниками данных) |* Возможность создания, редактирования или удаления источников данных. +* Возможность просмотра источников данных, которые используются при создании отчётов или панелей мониторинга. +|======================= + +=== Добавление новых пользователей + +. На вкладке *Manage Users* нажмите на значок *(+)*, после чего появится диалоговое окно создания нового пользователя. + +. Введите *имя пользователя*, *пароль*, *подтверждение пароля* и нажмите на кнопку {btn}[OK], после чего имя пользователя появится в списке пользователей. + +=== Изменение пароля пользователя + +. На вкладке *Manage Users* выберите пользователя и нажмите на кнопку {btn}[Edit...]. + +. Укажите новый *пароль*, *подтверждение пароля* и нажмите на кнопку {btn}[OK], после чего пользователь сможет войти в систему с новым паролем. + +{{% notice note %}} +После вашего первого входа в систему под учётной записью Администратора рекомендуется сменить административный пароль. +{{% /notice %}} + +=== Удаление пользователей + +. На вкладке *Manage Users* выберите пользователя (или несколько пользователей) и нажмите на значок *(Х)*, после чего появится диалоговое окно удаления пользователя. +. Нажмите на кнопки {btn}[Yes], {btn}[Delete] для удаления выбранных пользователей, после чего эти пользователи более не смогут войти в SuiteCRM Analytics Server. + +=== Назначение ролей пользователю + +. На вкладке *Manage Users* выберите пользователя, которому необходимо назначить определённую роль + +. В списке *Available* выберите необходимую роль и нажмите на значок *(>)* для перемещения роли в список *Selected*, после чего пользователь получит все права, связанные с выбранной ролью. + +. Для удаления пользователя из роли выполните обратные действия, воспользовавшись значком *(<)*. + +=== Добавление новых ролей + +. На вкладке *Manage Roles* нажмите на значок *(+)*, после чего появится диалоговое окно создания новой роли. + +. Введите название роли и нажмите на кнопку {btn}[OK], после чего созданная роль появится в списке *Available*. В созданную роль необходимо добавить соответствующие права (см. ниже). + + +=== Добавление прав в роль + +. В списке *Roles* выберите необходимую роль. + +. Отметьте необходимые чекбоксы в списке *Operation Permissions*, после чего выбранные права будут связаны с выбранной ролью, и пользователи, назначенные в эту роль, будут иметь соответствующие права. + +=== Удаление ролей + +. На вкладке *Manage Roles* выберите роль (или несколько ролей) и нажмите на значок *(Х)*, после чего появится диалоговое окно удаления ролей. + +. Нажмите на кнопку {btn}[Yes] для удаления роли и обновления списка ролей. Удалённая роль более не будет доступна. Пользователь, связанный с этой ролью, будет удалён из неё, на других ролях, связанных с этим пользователем, это никак не отразится. Если пользователь был связан с единственной удалённой ролью, то ему необходимо назначить новую роль, в противном случае у него не будет никаких прав. По умолчанию всем пользователям назначается роль *Authenticated*. + +=== Назначение пользователей в роль + +. На вкладке *Manage Roles* выберите роль, в которую необходимо назначить определённых пользователей. + +. В списке *Available* выберите необходимого пользователя и нажмите на значок *(>)* для перемещения пользователя в список *Selected*, после чего пользователь получит все права, связанные с выбранной ролью. Если необходимо добавить ВСЕХ пользователей в выбранную роль - воспользуйтесь значком *(>>)*. + +. Для удаления пользователя из роли выполните обратные действия, воспользовавшись значком *(<)*. + Пользователи, перемещённые из списка *Selected* в список *Available* более не имеют прав, связанных с выбранной ролью. + +== Создание отчётов в фоновом режиме + +При необходимости вы можете создавать отчёты в фоновом режиме, для этого выполните следующее: + +. Откройте страницу *Browse Files*. +. В панели *Folders* выберите папку, содержащую необходимый файл. +. В панели *Files* выберите необходимый файл. +. В панели *File Actions* выберите *Run in background*, после чего появится диалоговое окно: + +image:IMAGE9.png[Создание отчётов в фоновом режиме в SuiteCRM Analytics] + +[start=5] +. Заполните следующие поля: + +[cols="1,3a",options="header"] +|======================= +|Поле |Описание +|Generated Content Name (Название отчёта) |Введите название отчёта. Если название не указано, используется стандартное - *report*. +|Append Time To Name (Добавить метку времени к названию) | Отметьте этот параметр, если необходимо добавить метку времени к названию отчёта. +При необходимости можно указать формат метки времени (воспользуйтесь панелью *Preview* для предварительного просмотра необходимого результата). +|Generated Content Location (Расположение создаваемого отчёта)|Нажмите на кнопку {btn}[Select] и укажите папку, куда будет сохранён создаваемый отчёт. +|Overwrite Existing File (Перезаписывать существующий файл) |Отметьте этот параметр,если необходимо сохранить отчёт под именем уже существующего отчёта, сохранённого ранее в той же папке. +|======================= + +[start=6] +. Нажмите на кнопку {btn}[Next]. +Если у выбранного отчёта есть дополнительные параметры, например - формат вывода, будет выведен соответствующий запрос. + +. По окончании ввода параметров нажмите на кнопку {btn}[Finish]. + +Созданный отчёт будет сохранён в указанную папку. + +== Отчёты по расписанию + +Вы можете использовать страницу «Расписания» , чтобы запланировать создание отчёта через регулярные промежутки времени, в определённую дату и время и с различными параметрами. +Вы также можете настроить автоматическую отправку запланированного отчёта по электронной почте, если системный администратор настроил сервер для отправки отчётов по электронной почте. +При необходимости вы можете приостановить выполнение созданного расписания, удалить или отредактировать расписание, изменив частоту создания отчёта, его параметры или настройки электронной почты. + +Администратор может ограничить время, в течение которого могут создаваться отчёты по расписанию, указав время блокировки, в течение которого отчёты создаваться не будут. Например, это может быть актуально для выполнения технического обслуживания системы или для минимизации нагрузки в часы пик. +Если выбранное вами время создания отчёта попадает в интервал времени блокировки - выберите альтернативное расписание. + +=== Создание отчёта по расписанию + +Используя параметры расписания, вы можете автоматически создавать отчёты во время минимальной нагрузки на сервер или на регулярной основе. + +. Откройте страницу *Browse Files*. +. В панели *Folders* выберите папку, содержащую необходимый файл. +. В панели *Files* выберите необходимый файл. +. В панели *File Actions* выберите *Schedule*, после чего появится диалоговое окно: + +image:IMAGE10.png[Создание отчёта по расписанию в SuiteCRM Analytics] + +[start=5] +. Заполните следующие поля: + +[cols="1,3a",options="header"] +|======================= +|Поле |Описание +|Schedule Name (Название расписания) |Введите название расписания, этим же именем будет назван создаваемый отчёт. Если название не указано, будет использовано название Файла отчёта. +|Append Time To Name (Добавить метку времени к названию) | Отметьте этот параметр, если необходимо добавить метку времени к названию отчёта. +При необходимости можно указать формат метки времени (воспользуйтесь панелью *Preview* для предварительного просмотра необходимого результата). +|Generated Content Location (Расположение создаваемого отчёта)|Нажмите на кнопку {btn}[Select] и укажите папку, куда будет сохранён создаваемый отчёт. +|Overwrite Existing File (Перезаписывать существующий файл) |Отметьте этот параметр,если необходимо сохранить отчёт под именем уже существующего отчёта, сохранённого ранее в той же папке. +|======================= + +[start=6] +. Нажмите на кнопку {btn}[Next] и заполните поля расписания: + +image:IMAGE11.png[Настройка расписания создания отчёта в SuiteCRM Analytics] + +[start=7] +. При выборе повторения обязательно укажите даты начала и окончания повтора, а также шаблон повторения. + +[cols="1,3a",options="header"] +|======================= +|Поле |Описание +|Recurrence (Повторение) |Выберите интервал повторения из списка: + +* Однократно: однократный запуск файла. +* Секунды: многократный запуск файла с интервалом (в секундах), указанным в шаблоне повторения. +* Минуты: многократный запуск файла с интервалом (в минутах), указанным в шаблоне повторения. +* Часы: многократный запуск файла с интервалом (в часах), указанным в шаблоне повторения. +* Ежедневно: многократный запуск файла либо каждый день, либо с интервалом (в днях), указанным в шаблоне повторения. +* Еженедельно: многократный запуск файла по дням, указанным в шаблоне повторения. +* Ежемесячно: многократный запуск файла в день месяца, указанный в шаблоне повторения. +* Ежегодно: многократный запуск файла в дату, указанную в шаблоне повторения. +* Cron: запуск файла в соответствии с атрибутами Quartz Cron, указанными в поле *Cron String*. +Если вы хотите ввести собственный временной интервал, выберите опцию *Cron*. + +Если администратор настроил время блокировки, то в нижней части окна будет отображаться кнопка {btn}[View Blockout Times], нажав на которую можно просмотреть перечень интервалов времени, в течение которых отчёты создаваться не будут. + +|Recurrence Pattern (Шаблон повторения) |Шаблон повторения, зависящий от выбранного значения в комбобоксе *Recurrence (Повторение)*. +|Range of Recurrence (Диапазон повторения) | Даты начала и окончания создания отчёта. +Цикл регулярного создания отчёта начнётся в указанную здесь дату начала и завершится в указанную здесь дату окончания. +|Start Date - Run Once (Дата создания - при однократном запуске) | Укажите дату запуска файла, если в качестве интервала повторения выбрано значение *Однократно*. +|Cron String (Cron) |Если в качестве интервала повторения выбран *Cron*, пропишите соответствующее правило для планировщика. Синтаксис правил описан в разделе <<Атрибуты Quartz Cron>>. + +|======================= + +{{% notice warning %}} +При настройке правила *Cron* вы должны помнить, что оно начнёт выполняться в *12 часов дня по серверному времени* в указанную *Дату начала*. +Например, если вы создадите новое расписание, которое должно выполняться с *9:00* каждые 15 минут, оно начнёт выполняться только в *12:00* указанной даты начала. Чтобы расписание начало выполняться *сразу*, лучше всего выбрать день, предшествующий сегодняшней дате. +{{% /notice %}} + +[start=8] +. После вода необходимых параметров нажмите на кнопку {btn}[Next]. Если отчёт использует дополнительные параметры, например - формат вывода, будет выведен соответствующий запрос. +. Если администратор SuiteCRM Analytics настроил почтовый сервер, вы можете отправить копию отчета выбранным пользователям по электронной почте. +Например, вы можете отправлять пользователями финансового отдела данные в формате Excel по электронной почте каждый раз, когда происходит создание отчёта по расписанию. +[loweralpha] +.. Нажмите на кнопку {btn}[No], чтобы не отправлять пользователям по электронной почте копию отчёта. +.. Нажмите на кнопку {btn}[Yes], чтобы отправлять пользователям по электронной почте копию отчёта, после чего заполните поля данными пользователей и нажмите на кнопку {btn}[OK]. +. По завершении настройки параметров нажмите на кнопку {btn}[Finish]. + +=== Изменение расписания + +При необходимости вы можете отредактировать расписание, изменив частоту создания отчёта, параметры отчёта и настройки электронной почты: + +. Откройте страницу *Schedules*. +. В перечне расписаний выберите необходимое расписание и на панели инструментов нажмите иконку *Edit*. +. Измените необходимые параметры, как это описано в разделе <<Создание отчёта по расписанию>>. + +=== Удаление расписания + +. Откройте страницу *Schedules*. +. В перечне расписаний выберите необходимое расписание и на панели инструментов нажмите иконку *Delete*. +Удаление расписания не приведёт к удалению созданного по нему отчёта. + + +=== Управление расписаниями + +Администратор может создавать, запускать, удалять, останавливать, редактировать или возобновлять выполнение расписания. После того, как пользователь составил расписание создания отчёта, администратор может отредактировать, приостановить или удалить это расписание, а также изменить периодичность создания отчёта, изменить его параметры или настроить параметры электронной почты. Перед отправкой отчётов по электронной почте, убедитесь, что почтовый сервер настроен соответствующим образом. + +== Использование электронной почты для отправки создаваемых отчётов + +Удобный способ поделиться создаваемыми отчётами - указать сервер электронной почты, который будет использоваться сервером SuiteCRM Analytics для отправки этих отчётов получателям. +Эта функция работает с отчётами, создаваемыми по расписанию, автоматизируя процесс отправки отчётов по электронной почте сообществу пользователей. +Для *основной настройки* SuiteCRM Analytics Server не требуется почтовый сервер, поэтому, если вы хотите быстро начать работу или у вас пока нет информации о своём почтовом сервере - пропустите этот шаг. +Вы всегда сможете вернуться к нему позже. + +=== Настройка почтового сервера + +Используйте страницу администрирования SuiteCRM Analytics для доступа к разделу *Mail Server*: + +. Откройте страницу *Главная > Администрирование > Почтовый сервер* (Home > Administration > Mail Server). + +image:IMAGE12.png[Настройка почтового сервера для Suitecrm Analytics"] + +[start=2] +. Введите параметры почтового сервера + +[cols="1,3a",options="header"] +|======================= +|Параметр |Описание +|Hostname (SMTP) |Адрес SMTP-сервера. +|Port |Порт SMTP-сервера, обычно используется 25 порт. Для +Gmail укажите 587 порт. +|User Name |Имя пользователя, используемое для подключения к почтовому серверу. +|Password |Пароль, используемый для подключения к почтовому серверу. +|Server Type |Тип почтового сервера, обычно используется SMTP. +Для Gmail укажите SMTP. +|Email From Address |Адрес отправителя email. +|Email From Name |Имя отправителя. Если поле не заполнено - используется *SuiteCRM Analytics Scheduler*. +|Use Start TLS |Включите, если используется протокол TLS. +|Use SSL |Включите, если используется протокол SSL. +Для Gmail параметр должен быть включён. +|======================= + +[start=3] +. Нажмите на кнопку {btn}[Test Email Configuration] для тестирования подключения; при успешном подключении нажмите на кнопку {btn}[Save]. + +== Атрибуты Quartz Cron + +Движок Quartz Cron поддерживает объявление времени при помощи семи атрибутов. Формат чисел одинаков для всех выражений, даже если значения разные - они должны быть указаны как секунды, минуты, часы, день месяца, месяц, день недели и год. Атрибуты отделяются друг от друга пробелом. + +Допустимы следующие значения для каждого атрибута: от 0 до 59 для секунд и минут, от 0 до 23 для часов, от 1 до 31 для дней, от 1 до 12 для месяцев, от 1 до 7 для дня недели и четыре цифры для года. В качестве альтернативы вы можете использовать трёхбуквенные значения дня недели (SUN, MON, TUE, WED, THU, FRI, SAT). Однако трёхбуквенные значения месяца (JAN, FEB и т. д.) не поддерживаются. Для месяцев используйте цифры от 1 до 12. + +Звёздочка (\*) обозначает все значения, поэтому звёздочка в поле минут означает, что отчёт запускается раз в минуту. +Вы можете указать диапазон значений с помощью оператора '-' (тире), вы также можете указать несколько отдельных значений с помощью запятой. +Если вам нужно исключить из задания cron день месяца и день недели - используйте знак вопроса (?), чтобы указать, что это значение не имеет значения. +Если вам нужно разделить значения, вы можете сделать это с помощью символа косой черты (/) - этот оператор буквально означает 'каждый', поэтому 0/15 будет означать **каждые 15**. +В поле дня месяца вы можете использовать символ **#** для обозначения определённого дня месяца, например, вторая пятница месяца будет обозначена как 6#2. + +Вы можете использовать заглавную *L* в поле дня месяца и дня недели, чтобы указать 'последний' - последний день недели или месяца. +Заглавная *W* в атрибуте дня месяца означает 'будний день', который охватывает только дни с понедельника по пятницу. +Символ *W* можно указывать только в том случае, если день месяца - это один день, а не диапазон или перечень дней. +Большинство этих значений можно комбинировать, что позволяет составлять достаточно необычные расписания для cron. + +[cols=",",options="header"] +|======================= +|Атрибут |Условия и операторы +|Секунды |, - * / +|Минуты |, - * / +|Часы |, - * / +|День месяца |, - * ? / L W +|Месяц |, - * / +|День недели |, - * ? / L # +|Год |, - * / +|======================= + +=== Примеры расписаний для Cron + +[options="header",cols=" ,a"] +|======================= +|Пример |Описание +|0 0/30 * * * ? * |Выполнять каждые 30 минут в каждый день года +|0 15 10 ? * 6L * |Выполнять в 10:15 каждую последнюю пятницу каждого месяца +|0 30 10 ? * TUE,WED,THU * |Выполнять в 10:30 в каждый вторник, среду и четверг +|======================= + +Вы также можете составлять Cron-расписания, используя сайт link:http://www.cronmaker.com[www.cronmaker.com^]. + +== Кеш данных + +SuiteCRM Analytics Server имеет возможность *кэширования данных*. +При запуске отчёта или панели мониторинга определённые данные будут кешироваться для использования их в будущем. +Важно понимать, что при обновлении хранилища данных вам также может потребоваться и обновление кеша сервера аналитики SuiteCRM. + +=== Обновление кеша диаграмм + +Кеширование активно задействуется в диаграммах панелей мониторинга, используемых в SuiteCRM Analytics. +Это также относится и к диаграммам, отображаемых в отчётах. +Для обновления кеша диаграмм выполните следующие действия: + +В SuiteCRM Analytics откройте меню *Tools* > *Refresh* > *CDA Cache*, после чего появится сообщение о том, что кеш диаграмм был очищен. + +image:IMAGE13.png[Обновление кеша диаграмм в SuiteCRM Analytics] + +=== Обновление кеша отчётов + +Кеширование данных отчётов относится именно к отчётам и не затрагивает диаграммы. +Для обновления кеша отчётов выполните следующие действия: + +В SuiteCRM Analytics откройте меню *Tools* > *Refresh* > *Reporting Data Cache*, после чего появится сообщение о том, что кеш отчётов был очищен. + +image:IMAGE14.png[Обновление кеша отчётов в SuiteCRM Analytics] diff --git a/i18n/en.toml b/i18n/en.toml index 662679aed..1ea1f3c5e 100644 --- a/i18n/en.toml +++ b/i18n/en.toml @@ -32,6 +32,9 @@ other = "More" other = "Expand me..." [Issue-for-page] +other = "Report an Issue about this Page" + +[Issue-for-page-short] other = "Issue" [Documentation] diff --git a/i18n/pt.toml b/i18n/pt.toml new file mode 100644 index 000000000..189519f77 --- /dev/null +++ b/i18n/pt.toml @@ -0,0 +1,138 @@ +[suitedocs-title] +other= "Site de Documentação do SuiteCRM" + +[navigation] +other="Navegação" + +[Search-placeholder] +other = "Pesquisa..." + +[Clear-History] +other = "Marcar tudo como não-lido" + +[Attachments-label] +other = "Anexos" + +[title-404] +other = "Erro" + +[message-404] +other = "Oops! Parece que esta página não existe ¯\\_(ツ)_/¯." + +[Go-to-homepage] +other = "Ir para a página principal" + +[Edit-this-page] +other = "Editar esta página" + +[Shortcuts-Title] +other = "Mais" + +[Expand-title] +other = "Expanda-me..." + +[Issue-for-page] +other = "Issue" + +[Documentation] +other = "Documentação" + +[Guides] +other = "Guias" + +[User] +other = "Utilizador" + +[Developer] +other = "Programador" + +[Administrator] +other = "Administrador" + +[Admin-SHORT] +other = "Admin" + +[Community] +other = "Comunidade" + +[TechnicalBlog] +other = "Blog Técnico" + +[FromTechnicalBlog] +other = "Do nosso Blog Técnico" + +[LatestPosts] +other = "Posts mais recentes" + +[GettingStarted] +other = "Começar" + +[Installing] +other = "Instalar" + +[Upgrading] +other = "Atualizar" + +[An-existing-installation] +other = " uma instalação existente do SuiteCRM" + +[Add-features-with] +other = "Adicione funcionalidades com " + +[3rdPartyAdd-Ons] +other ="acrescentos de 3ª parte" + +[Using-SuiteCRM] +other = "Usar o SuiteCRM" + +[Learn-the] +other = "Compreender a " + +[UserInterface] +other = "Interface de Utilizador" + +[Understand-the] +other = "Compreender os " + +[CoreModules] +other = "Módulos de Base" + +[Its-open-source] +other = "É open source e os" + +[Developers] +other = "Developers" + +[Customize-all-the-code] +other = "personalizam tudo!" + +[Contribute] +other = "Contribuir" + +[Learn-how-to] +other = "Aprender a " + +[Edit-a-page] +other = "Editar uma Página" + +[In-this-site] +other = " neste site" + +[Report-an] +other = "Reportar um " + +[Issue] +other = "Problema" + +[About-a-page] +other = " numa página" + +[Code] +other = "Código" + +[RecentlyEdited] +other = "Recentemente Editado" + +[DocumentationPages] +other = "Páginas de Documentação" + diff --git a/i18n/ru.toml b/i18n/ru.toml index 73ec54472..dcbd51d71 100644 --- a/i18n/ru.toml +++ b/i18n/ru.toml @@ -32,6 +32,9 @@ other = "Показать больше" other = "Развернуть..." [Issue-for-page] +other = "Сообщить об ошибке" + +[Issue-for-page-short] other = "Ошибка" [Documentation] diff --git a/layouts/_default/single.html b/layouts/_default/single.html new file mode 100644 index 000000000..c9bc5d707 --- /dev/null +++ b/layouts/_default/single.html @@ -0,0 +1,13 @@ +{{ partial "header.html" . }} + +{{ partial "header-link.html" .Content }} + +
+ {{with .Params.LastModifierDisplayName}} + {{ . }} {{with $.Date}} {{ .Format "02/01/2006" }}{{end}} +
+ {{end}} + + + +{{ partial "footer.html" . }} diff --git a/layouts/index.html b/layouts/index.html index 1927b4b7f..7b9651063 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -1,7 +1,7 @@ {{ partial "header.html" . }} - {{ T "navigation" }} + {{ T "navigation" }}
diff --git a/layouts/partials/header-link.html b/layouts/partials/header-link.html new file mode 100644 index 000000000..bd79d055c --- /dev/null +++ b/layouts/partials/header-link.html @@ -0,0 +1 @@ +{{ . | replaceRE "()(.+)()" `${1}${3} ${4}` | safeHTML }} diff --git a/layouts/partials/header.html b/layouts/partials/header.html index 51274eecf..071af56a3 100644 --- a/layouts/partials/header.html +++ b/layouts/partials/header.html @@ -1,34 +1,33 @@ - {{ template "_internal/opengraph.html" . }} - - - {{ .Hugo.Generator }} + + {{ hugo.Generator }} {{ partial "meta.html" . }} {{ partial "favicon.html" . }} {{ .Title }} :: {{ .Site.Title }} - + {{ $assetBusting := not .Site.Params.disableAssetsBusting }} - + - + + {{with .Site.Params.themeVariant}} {{end}} - - - +
+ {{ $url := .Get 0 }} + {{ range getJSON $url }} +
+ + + {{.contributions}} commits +
+ {{ end }} +
diff --git a/layouts/shortcodes/dumpJSON.html b/layouts/shortcodes/dumpJSON.html new file mode 100644 index 000000000..fc7ace9a9 --- /dev/null +++ b/layouts/shortcodes/dumpJSON.html @@ -0,0 +1,16 @@ + +{{ $urlPre := "https://api.github.com" }} +{{ $git_user := "pgorod" }} +{{ $user_json := getJSON $urlPre "/users/" $git_user "/repos" }} +{{ range $u := $user_json }} +

{{ $u.name }}

+ {{ $repo_json := getJSON $urlPre "/repos/" $git_user "/" $u.name }} + + {{ range $k,$v := $repo_json }} + {{ $k }} => {{ $v }}
+ {{ end }} +
+{{ end }} + + + diff --git a/layouts/shortcodes/ghcontributors.html b/layouts/shortcodes/ghcontributors.html index 3e8a92872..e4d2bf96b 100644 --- a/layouts/shortcodes/ghcontributors.html +++ b/layouts/shortcodes/ghcontributors.html @@ -1,31 +1,37 @@ -
- {{ $url := .Get 0 }} - {{ range getJSON $url }} +{{ range .Params }} + {{ $git_user := . }} + {{ $u := getJSON "https://api.github.com/users/" $git_user }}
- - - {{.contributions}} commits +
- {{ end }} -
\ No newline at end of file +{{ end }} +
+
diff --git a/netlify.toml b/netlify.toml index fb5769abf..35f07b125 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,32 +1,31 @@ -# Our build command includes "bundle" to make support Asciidoc format, making sure Asciidoctor gets installed: +# Our build command used to include "bundle" to support Asciidoc format, +# making sure Asciidoctor gets installed, now Netlify seems to take care of it [build] publish = "public" - command = "hugo" - + command = "chmod +x build.sh && ./build.sh" + HUGO_ENABLEGITINFO = "true" + # RUBY_VERSION = "2.6.2" is set as environment variable in Netlify UI, Deploy settings + # The Production Context applies to the branch you have configured as main branch to deploy: [context.production.environment] - HUGO_VERSION = "0.53" + HUGO_VERSION = "0.85.0" HUGO_ENV = "production" - HUGO_BASEURL = "https://docs.suitecrm.com/" - HUGO_ENABLEGITINFO = "true" + HUGO_BASEURL = "https://docs.suitecrm.com" -# The Deploy Preview Context applies to every Deploy Preview you create: +# The Deploy Preview Context applies to every Deploy Preview you create: [context.deploy-preview] - command = "hugo -b $DEPLOY_PRIME_URL" + command = "chmod +x build.sh && ./build.sh -b $DEPLOY_PRIME_URL" [context.deploy-preview.environment] - HUGO_VERSION = "0.53" - HUGO_ENABLEGITINFO = "true" + HUGO_VERSION = "0.85.0" [context.branch-deploy] - command = "hugo -b $DEPLOY_PRIME_URL" + command = "chmod +x build.sh && ./build.sh -b $DEPLOY_PRIME_URL" # The Branch Deploy Context applies to all non-master branches deployed, whether they are in a Deploy Preview or not: [context.branch-deploy.environment] - HUGO_VERSION = "0.53" - HUGO_ENABLEGITINFO = "true" + HUGO_VERSION = "0.85.0" # Besides these three predefined contexts, you can also use branch names as context names: [context.preview.environment] - HUGO_BASEURL = "https://docs.suitecrm.com/" - HUGO_ENABLEGITINFO = "true" + HUGO_BASEURL = "https://docs.suitecrm.com" diff --git a/static/css/tags.css b/static/css/tags.css new file mode 100644 index 000000000..9a9f54466 --- /dev/null +++ b/static/css/tags.css @@ -0,0 +1,53 @@ +/* Tags */ + +.blog_wrap .tags { + display: flex; + justify-content: flex-end; +} + +#head-tags{ + margin-left:1em; + margin-top:1em; +} + +#body .tags a.tag-link { + display: inline-block; + line-height: 2em; + font-size: 0.8em; + position: relative; + margin: 0 16px 8px 0; + padding: 0 10px 0 12px; + background: #5C566A; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; + + -webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.2); + box-shadow: 0 1px 2px rgba(0,0,0,0.2); + color: #fff; +} + +#body .tags a.tag-link:before { + content: ""; + position: absolute; + top:0; + left: -1em; + width: 0; + height: 0; + border-color: transparent #5C566A transparent transparent; + border-style: solid; + border-width: 1em 1em 1em 0; +} + +#body .tags a.tag-link:after { + content: ""; + position: absolute; + top: 10px; + left: 1px; + width: 5px; + height: 5px; + -webkit-border-radius: 50%; + border-radius: 100%; + background: #fff; +} diff --git a/static/css/theme-suitecrm.css b/static/css/theme-suitecrm.css index 5ac038805..7293848f5 100644 --- a/static/css/theme-suitecrm.css +++ b/static/css/theme-suitecrm.css @@ -336,8 +336,9 @@ div.notices p:first-child:before { position: absolute; top: 2px; color: #fff; - font-family: FontAwesome; - content: ''; + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: '\f06a'; left: 10px; } div.notices p:first-child:after { @@ -554,6 +555,7 @@ div.sidebar-announcement a:hover { overflow: hidden; background-color: var(--MENU-TOP-BG-color); background-color:#DE6150; + max-height: 50px; } #topmenu li { @@ -564,8 +566,8 @@ div.sidebar-announcement a:hover { #topmenu li.guide_start { padding: 15px 2px 15px 15px; - color:#fff; - font-weight:300; + color:#e3e3e3db; + /*font-weight:300;*/ } #topmenu li.guide_end { diff --git a/static/css/theme.css b/static/css/theme.css index f2a96eca4..b5abbddc7 100644 --- a/static/css/theme.css +++ b/static/css/theme.css @@ -1,4 +1,8 @@ @charset "UTF-8"; + +/* Tags */ +@import "tags.css"; + #top-github-link, #body #breadcrumbs { position: relative; top: 50%; @@ -516,8 +520,9 @@ div.notices p:first-child:before { position: absolute; top: 2px; color: #fff; - font-family: FontAwesome; - content: ''; + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "\f06a"; left: 10px; } div.notices p:first-child:after { diff --git a/static/images/en/8.x/admin/install-guide/1.png b/static/images/en/8.x/admin/install-guide/1.png new file mode 100644 index 000000000..3b7c4ffa5 Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/1.png differ diff --git a/static/images/en/8.x/admin/install-guide/10.png b/static/images/en/8.x/admin/install-guide/10.png new file mode 100644 index 000000000..88bedcbe0 Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/10.png differ diff --git a/static/images/en/8.x/admin/install-guide/11.png b/static/images/en/8.x/admin/install-guide/11.png new file mode 100644 index 000000000..52ac84951 Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/11.png differ diff --git a/static/images/en/8.x/admin/install-guide/12.png b/static/images/en/8.x/admin/install-guide/12.png new file mode 100644 index 000000000..29aa74cf8 Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/12.png differ diff --git a/static/images/en/8.x/admin/install-guide/13.png b/static/images/en/8.x/admin/install-guide/13.png new file mode 100644 index 000000000..5cf37775d Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/13.png differ diff --git a/static/images/en/8.x/admin/install-guide/14.png b/static/images/en/8.x/admin/install-guide/14.png new file mode 100644 index 000000000..251e357f3 Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/14.png differ diff --git a/static/images/en/8.x/admin/install-guide/15.png b/static/images/en/8.x/admin/install-guide/15.png new file mode 100644 index 000000000..532fbb12d Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/15.png differ diff --git a/static/images/en/8.x/admin/install-guide/16.png b/static/images/en/8.x/admin/install-guide/16.png new file mode 100644 index 000000000..5498737dd Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/16.png differ diff --git a/static/images/en/8.x/admin/install-guide/2.png b/static/images/en/8.x/admin/install-guide/2.png new file mode 100644 index 000000000..7e8960a3f Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/2.png differ diff --git a/static/images/en/8.x/admin/install-guide/3.png b/static/images/en/8.x/admin/install-guide/3.png new file mode 100644 index 000000000..fd820da0f Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/3.png differ diff --git a/static/images/en/8.x/admin/install-guide/4.png b/static/images/en/8.x/admin/install-guide/4.png new file mode 100644 index 000000000..c74d75445 Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/4.png differ diff --git a/static/images/en/8.x/admin/install-guide/5.png b/static/images/en/8.x/admin/install-guide/5.png new file mode 100644 index 000000000..dbc975fbe Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/5.png differ diff --git a/static/images/en/8.x/admin/install-guide/6.png b/static/images/en/8.x/admin/install-guide/6.png new file mode 100644 index 000000000..15c0b6161 Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/6.png differ diff --git a/static/images/en/8.x/admin/install-guide/7.png b/static/images/en/8.x/admin/install-guide/7.png new file mode 100644 index 000000000..ce3dceb1b Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/7.png differ diff --git a/static/images/en/8.x/admin/install-guide/8.png b/static/images/en/8.x/admin/install-guide/8.png new file mode 100644 index 000000000..f1265bdd1 Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/8.png differ diff --git a/static/images/en/8.x/admin/install-guide/9.png b/static/images/en/8.x/admin/install-guide/9.png new file mode 100644 index 000000000..b5cbcfc74 Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/9.png differ diff --git a/static/images/en/8.x/admin/install-guide/suite-cli-install-options.png b/static/images/en/8.x/admin/install-guide/suite-cli-install-options.png new file mode 100644 index 000000000..2bce04ed3 Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/suite-cli-install-options.png differ diff --git a/static/images/en/8.x/admin/install-guide/web-ui-install-admin-password.png b/static/images/en/8.x/admin/install-guide/web-ui-install-admin-password.png new file mode 100644 index 000000000..5559b3fef Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/web-ui-install-admin-password.png differ diff --git a/static/images/en/8.x/admin/install-guide/web-ui-install-admin-username.png b/static/images/en/8.x/admin/install-guide/web-ui-install-admin-username.png new file mode 100644 index 000000000..595d62437 Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/web-ui-install-admin-username.png differ diff --git a/static/images/en/8.x/admin/install-guide/web-ui-install-configuration.png b/static/images/en/8.x/admin/install-guide/web-ui-install-configuration.png new file mode 100644 index 000000000..525e6159b Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/web-ui-install-configuration.png differ diff --git a/static/images/en/8.x/admin/install-guide/web-ui-install-db-host.png b/static/images/en/8.x/admin/install-guide/web-ui-install-db-host.png new file mode 100644 index 000000000..28de5e4b7 Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/web-ui-install-db-host.png differ diff --git a/static/images/en/8.x/admin/install-guide/web-ui-install-db-name.png b/static/images/en/8.x/admin/install-guide/web-ui-install-db-name.png new file mode 100644 index 000000000..882e89481 Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/web-ui-install-db-name.png differ diff --git a/static/images/en/8.x/admin/install-guide/web-ui-install-db-port.png b/static/images/en/8.x/admin/install-guide/web-ui-install-db-port.png new file mode 100644 index 000000000..e2181ece1 Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/web-ui-install-db-port.png differ diff --git a/static/images/en/8.x/admin/install-guide/web-ui-install-db-user-password.png b/static/images/en/8.x/admin/install-guide/web-ui-install-db-user-password.png new file mode 100644 index 000000000..7610c3ebf Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/web-ui-install-db-user-password.png differ diff --git a/static/images/en/8.x/admin/install-guide/web-ui-install-db-user.png b/static/images/en/8.x/admin/install-guide/web-ui-install-db-user.png new file mode 100644 index 000000000..b0420d74f Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/web-ui-install-db-user.png differ diff --git a/static/images/en/8.x/admin/install-guide/web-ui-install-demo-data.png b/static/images/en/8.x/admin/install-guide/web-ui-install-demo-data.png new file mode 100644 index 000000000..4687268b0 Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/web-ui-install-demo-data.png differ diff --git a/static/images/en/8.x/admin/install-guide/web-ui-install-ignore-warnings.png b/static/images/en/8.x/admin/install-guide/web-ui-install-ignore-warnings.png new file mode 100644 index 000000000..b3a7f66af Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/web-ui-install-ignore-warnings.png differ diff --git a/static/images/en/8.x/admin/install-guide/web-ui-install-license.png b/static/images/en/8.x/admin/install-guide/web-ui-install-license.png new file mode 100644 index 000000000..5514d8af2 Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/web-ui-install-license.png differ diff --git a/static/images/en/8.x/admin/install-guide/web-ui-install-url.png b/static/images/en/8.x/admin/install-guide/web-ui-install-url.png new file mode 100644 index 000000000..ddb83397d Binary files /dev/null and b/static/images/en/8.x/admin/install-guide/web-ui-install-url.png differ diff --git a/static/images/en/8.x/developer/extensions/front-end/examples/add-sidebar-widget/tasks-sidebar-widget-detail.png b/static/images/en/8.x/developer/extensions/front-end/examples/add-sidebar-widget/tasks-sidebar-widget-detail.png new file mode 100644 index 000000000..22b15d7c3 Binary files /dev/null and b/static/images/en/8.x/developer/extensions/front-end/examples/add-sidebar-widget/tasks-sidebar-widget-detail.png differ diff --git a/static/images/en/8.x/developer/extensions/front-end/examples/add-sidebar-widget/tasks-sidebar-widget-full.png b/static/images/en/8.x/developer/extensions/front-end/examples/add-sidebar-widget/tasks-sidebar-widget-full.png new file mode 100644 index 000000000..d6b3641ac Binary files /dev/null and b/static/images/en/8.x/developer/extensions/front-end/examples/add-sidebar-widget/tasks-sidebar-widget-full.png differ diff --git a/static/images/en/8.x/developer/extensions/front-end/fe-architecture-intro/app_core_folder_structure.png b/static/images/en/8.x/developer/extensions/front-end/fe-architecture-intro/app_core_folder_structure.png new file mode 100644 index 000000000..549943990 Binary files /dev/null and b/static/images/en/8.x/developer/extensions/front-end/fe-architecture-intro/app_core_folder_structure.png differ diff --git a/static/images/en/8.x/developer/extensions/front-end/fe-architecture-intro/listview-view-highlight.png b/static/images/en/8.x/developer/extensions/front-end/fe-architecture-intro/listview-view-highlight.png new file mode 100644 index 000000000..d4ba6396c Binary files /dev/null and b/static/images/en/8.x/developer/extensions/front-end/fe-architecture-intro/listview-view-highlight.png differ diff --git a/static/images/en/8.x/developer/extensions/front-end/fe-architecture-intro/recordview-fields-highlight.png b/static/images/en/8.x/developer/extensions/front-end/fe-architecture-intro/recordview-fields-highlight.png new file mode 100644 index 000000000..ff9678596 Binary files /dev/null and b/static/images/en/8.x/developer/extensions/front-end/fe-architecture-intro/recordview-fields-highlight.png differ diff --git a/static/images/en/8.x/developer/extensions/front-end/fe-architecture-intro/recordview-view-highlight.png b/static/images/en/8.x/developer/extensions/front-end/fe-architecture-intro/recordview-view-highlight.png new file mode 100644 index 000000000..415a9bad9 Binary files /dev/null and b/static/images/en/8.x/developer/extensions/front-end/fe-architecture-intro/recordview-view-highlight.png differ diff --git a/static/images/en/developer/database-schema/schema.png b/static/images/en/developer/database-schema/schema.png new file mode 100644 index 000000000..df36a3a25 Binary files /dev/null and b/static/images/en/developer/database-schema/schema.png differ diff --git a/static/images/en/developer/database-schema/schemaspy.png b/static/images/en/developer/database-schema/schemaspy.png new file mode 100644 index 000000000..2f8cba4f4 Binary files /dev/null and b/static/images/en/developer/database-schema/schemaspy.png differ diff --git a/static/images/en/user/Analytics-Gettingstarted/IMAGE1.png b/static/images/en/user/Analytics-Gettingstarted/IMAGE1.png new file mode 100644 index 000000000..13c1f69ab Binary files /dev/null and b/static/images/en/user/Analytics-Gettingstarted/IMAGE1.png differ diff --git a/static/images/en/user/Analytics-Gettingstarted/IMAGE10.png b/static/images/en/user/Analytics-Gettingstarted/IMAGE10.png new file mode 100644 index 000000000..5d603073f Binary files /dev/null and b/static/images/en/user/Analytics-Gettingstarted/IMAGE10.png differ diff --git a/static/images/en/user/Analytics-Gettingstarted/IMAGE11.png b/static/images/en/user/Analytics-Gettingstarted/IMAGE11.png new file mode 100644 index 000000000..5d603073f Binary files /dev/null and b/static/images/en/user/Analytics-Gettingstarted/IMAGE11.png differ diff --git a/static/images/en/user/Analytics-Gettingstarted/IMAGE12.png b/static/images/en/user/Analytics-Gettingstarted/IMAGE12.png new file mode 100644 index 000000000..fe9973028 Binary files /dev/null and b/static/images/en/user/Analytics-Gettingstarted/IMAGE12.png differ diff --git a/static/images/en/user/Analytics-Gettingstarted/IMAGE13.png b/static/images/en/user/Analytics-Gettingstarted/IMAGE13.png new file mode 100644 index 000000000..b87c7f87d Binary files /dev/null and b/static/images/en/user/Analytics-Gettingstarted/IMAGE13.png differ diff --git a/static/images/en/user/Analytics-Gettingstarted/IMAGE14.png b/static/images/en/user/Analytics-Gettingstarted/IMAGE14.png new file mode 100644 index 000000000..d8952658c Binary files /dev/null and b/static/images/en/user/Analytics-Gettingstarted/IMAGE14.png differ diff --git a/static/images/en/user/Analytics-Gettingstarted/IMAGE2.png b/static/images/en/user/Analytics-Gettingstarted/IMAGE2.png new file mode 100644 index 000000000..0889a8aba Binary files /dev/null and b/static/images/en/user/Analytics-Gettingstarted/IMAGE2.png differ diff --git a/static/images/en/user/Analytics-Gettingstarted/IMAGE3.png b/static/images/en/user/Analytics-Gettingstarted/IMAGE3.png new file mode 100644 index 000000000..d8736db22 Binary files /dev/null and b/static/images/en/user/Analytics-Gettingstarted/IMAGE3.png differ diff --git a/static/images/en/user/Analytics-Gettingstarted/IMAGE4.png b/static/images/en/user/Analytics-Gettingstarted/IMAGE4.png new file mode 100644 index 000000000..974c34870 Binary files /dev/null and b/static/images/en/user/Analytics-Gettingstarted/IMAGE4.png differ diff --git a/static/images/en/user/Analytics-Gettingstarted/IMAGE5.png b/static/images/en/user/Analytics-Gettingstarted/IMAGE5.png new file mode 100644 index 000000000..fa20225d4 Binary files /dev/null and b/static/images/en/user/Analytics-Gettingstarted/IMAGE5.png differ diff --git a/static/images/en/user/Analytics-Gettingstarted/IMAGE6.png b/static/images/en/user/Analytics-Gettingstarted/IMAGE6.png new file mode 100644 index 000000000..a41b8241f Binary files /dev/null and b/static/images/en/user/Analytics-Gettingstarted/IMAGE6.png differ diff --git a/static/images/en/user/Analytics-Gettingstarted/IMAGE7.png b/static/images/en/user/Analytics-Gettingstarted/IMAGE7.png new file mode 100644 index 000000000..2ffb152a8 Binary files /dev/null and b/static/images/en/user/Analytics-Gettingstarted/IMAGE7.png differ diff --git a/static/images/en/user/Analytics-Gettingstarted/IMAGE8.png b/static/images/en/user/Analytics-Gettingstarted/IMAGE8.png new file mode 100644 index 000000000..46780a432 Binary files /dev/null and b/static/images/en/user/Analytics-Gettingstarted/IMAGE8.png differ diff --git a/static/images/en/user/Analytics-Gettingstarted/IMAGE9.png b/static/images/en/user/Analytics-Gettingstarted/IMAGE9.png new file mode 100644 index 000000000..9fbcdb82d Binary files /dev/null and b/static/images/en/user/Analytics-Gettingstarted/IMAGE9.png differ diff --git a/static/images/ru/8.x/admin/Installing/conf.png b/static/images/ru/8.x/admin/Installing/conf.png new file mode 100644 index 000000000..5a4fec29c Binary files /dev/null and b/static/images/ru/8.x/admin/Installing/conf.png differ diff --git a/static/images/ru/8.x/admin/Installing/lic.png b/static/images/ru/8.x/admin/Installing/lic.png new file mode 100644 index 000000000..f2e8a99e7 Binary files /dev/null and b/static/images/ru/8.x/admin/Installing/lic.png differ diff --git a/static/images/ru/admin/Installing/image1.png b/static/images/ru/admin/Installing/image1.png index c16bafc8a..b7c815497 100644 Binary files a/static/images/ru/admin/Installing/image1.png and b/static/images/ru/admin/Installing/image1.png differ diff --git a/static/images/ru/admin/Installing/image2.png b/static/images/ru/admin/Installing/image2.png index c22f57cd3..810082e8b 100644 Binary files a/static/images/ru/admin/Installing/image2.png and b/static/images/ru/admin/Installing/image2.png differ diff --git a/static/images/ru/admin/Installing/image3.png b/static/images/ru/admin/Installing/image3.png index d23396bda..7b0d75578 100644 Binary files a/static/images/ru/admin/Installing/image3.png and b/static/images/ru/admin/Installing/image3.png differ diff --git a/static/images/ru/admin/UpgradeWizard/image6.png b/static/images/ru/admin/UpgradeWizard/image6.png new file mode 100644 index 000000000..fd1293623 Binary files /dev/null and b/static/images/ru/admin/UpgradeWizard/image6.png differ diff --git a/static/images/ru/admin/UpgradeWizard/image7.png b/static/images/ru/admin/UpgradeWizard/image7.png new file mode 100644 index 000000000..c7efdc2b1 Binary files /dev/null and b/static/images/ru/admin/UpgradeWizard/image7.png differ diff --git a/static/images/ru/user/UserInterface/image10.png b/static/images/ru/user/UserInterface/image10.png index 059dc58c7..9e7773a4f 100644 Binary files a/static/images/ru/user/UserInterface/image10.png and b/static/images/ru/user/UserInterface/image10.png differ diff --git a/static/images/ru/user/UserInterface/image10a.png b/static/images/ru/user/UserInterface/image10a.png index 68c2fc6df..67c449533 100644 Binary files a/static/images/ru/user/UserInterface/image10a.png and b/static/images/ru/user/UserInterface/image10a.png differ diff --git a/static/images/ru/user/UserInterface/image34.png b/static/images/ru/user/UserInterface/image34.png index b4a613ec1..9524a82d0 100644 Binary files a/static/images/ru/user/UserInterface/image34.png and b/static/images/ru/user/UserInterface/image34.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image1.png b/static/images/ru/user/advanced-modules/Workflow/image1.png index cb0c26a80..7ef4deb5f 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image1.png and b/static/images/ru/user/advanced-modules/Workflow/image1.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image10.png b/static/images/ru/user/advanced-modules/Workflow/image10.png index 7fc4abf22..a302937ca 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image10.png and b/static/images/ru/user/advanced-modules/Workflow/image10.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image11.png b/static/images/ru/user/advanced-modules/Workflow/image11.png index 7bada4481..60c5acb24 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image11.png and b/static/images/ru/user/advanced-modules/Workflow/image11.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image12.png b/static/images/ru/user/advanced-modules/Workflow/image12.png index 971ca06ee..3493a7819 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image12.png and b/static/images/ru/user/advanced-modules/Workflow/image12.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image13.png b/static/images/ru/user/advanced-modules/Workflow/image13.png index 7c3cb4293..0f0952620 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image13.png and b/static/images/ru/user/advanced-modules/Workflow/image13.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image14.png b/static/images/ru/user/advanced-modules/Workflow/image14.png index e95b2be51..0ae94d9c9 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image14.png and b/static/images/ru/user/advanced-modules/Workflow/image14.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image15.png b/static/images/ru/user/advanced-modules/Workflow/image15.png index 3fa0cf4f9..5b5212eb3 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image15.png and b/static/images/ru/user/advanced-modules/Workflow/image15.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image16.png b/static/images/ru/user/advanced-modules/Workflow/image16.png index 606b421f3..f9759b4b6 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image16.png and b/static/images/ru/user/advanced-modules/Workflow/image16.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image17.png b/static/images/ru/user/advanced-modules/Workflow/image17.png index 32a025e79..d3ab86f99 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image17.png and b/static/images/ru/user/advanced-modules/Workflow/image17.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image18.png b/static/images/ru/user/advanced-modules/Workflow/image18.png index ff30e64d0..fecd7cf20 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image18.png and b/static/images/ru/user/advanced-modules/Workflow/image18.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image19.png b/static/images/ru/user/advanced-modules/Workflow/image19.png index a7044593b..a551e0fb8 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image19.png and b/static/images/ru/user/advanced-modules/Workflow/image19.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image2.png b/static/images/ru/user/advanced-modules/Workflow/image2.png index eac7eff49..809749849 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image2.png and b/static/images/ru/user/advanced-modules/Workflow/image2.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image20.png b/static/images/ru/user/advanced-modules/Workflow/image20.png index 4e1fb1f48..1bcf35a7e 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image20.png and b/static/images/ru/user/advanced-modules/Workflow/image20.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image21.png b/static/images/ru/user/advanced-modules/Workflow/image21.png index d185d34db..db3348344 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image21.png and b/static/images/ru/user/advanced-modules/Workflow/image21.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image22.png b/static/images/ru/user/advanced-modules/Workflow/image22.png index ac7d9204a..9f0f096ec 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image22.png and b/static/images/ru/user/advanced-modules/Workflow/image22.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image23.png b/static/images/ru/user/advanced-modules/Workflow/image23.png index 5282ff9bb..715e28ae5 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image23.png and b/static/images/ru/user/advanced-modules/Workflow/image23.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image24.png b/static/images/ru/user/advanced-modules/Workflow/image24.png index 750a09ccd..8d20f535c 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image24.png and b/static/images/ru/user/advanced-modules/Workflow/image24.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image25.png b/static/images/ru/user/advanced-modules/Workflow/image25.png index 208b4c75a..3daab244c 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image25.png and b/static/images/ru/user/advanced-modules/Workflow/image25.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image26.png b/static/images/ru/user/advanced-modules/Workflow/image26.png index 685ef6ca4..a7d4658be 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image26.png and b/static/images/ru/user/advanced-modules/Workflow/image26.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image27.png b/static/images/ru/user/advanced-modules/Workflow/image27.png index 795296b59..4fe54c7da 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image27.png and b/static/images/ru/user/advanced-modules/Workflow/image27.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image28.png b/static/images/ru/user/advanced-modules/Workflow/image28.png index a7cf11513..0e7717068 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image28.png and b/static/images/ru/user/advanced-modules/Workflow/image28.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image29.png b/static/images/ru/user/advanced-modules/Workflow/image29.png index 280f712de..1be4cf5f1 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image29.png and b/static/images/ru/user/advanced-modules/Workflow/image29.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image3.png b/static/images/ru/user/advanced-modules/Workflow/image3.png index 0b7cc8473..4eeebf61d 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image3.png and b/static/images/ru/user/advanced-modules/Workflow/image3.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image30.png b/static/images/ru/user/advanced-modules/Workflow/image30.png index af5a3194f..39e515b72 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image30.png and b/static/images/ru/user/advanced-modules/Workflow/image30.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image31.png b/static/images/ru/user/advanced-modules/Workflow/image31.png index bce11bcbb..525bdd113 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image31.png and b/static/images/ru/user/advanced-modules/Workflow/image31.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image32.png b/static/images/ru/user/advanced-modules/Workflow/image32.png index 5d9272078..4c0e2e64e 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image32.png and b/static/images/ru/user/advanced-modules/Workflow/image32.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image33.png b/static/images/ru/user/advanced-modules/Workflow/image33.png index c7a168552..36db9c727 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image33.png and b/static/images/ru/user/advanced-modules/Workflow/image33.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image34.png b/static/images/ru/user/advanced-modules/Workflow/image34.png index 4d793a477..8dfd5d20b 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image34.png and b/static/images/ru/user/advanced-modules/Workflow/image34.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image35.png b/static/images/ru/user/advanced-modules/Workflow/image35.png index f3feaa513..306a58115 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image35.png and b/static/images/ru/user/advanced-modules/Workflow/image35.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image36.png b/static/images/ru/user/advanced-modules/Workflow/image36.png new file mode 100644 index 000000000..84c435ab0 Binary files /dev/null and b/static/images/ru/user/advanced-modules/Workflow/image36.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image37.png b/static/images/ru/user/advanced-modules/Workflow/image37.png new file mode 100644 index 000000000..f78baf511 Binary files /dev/null and b/static/images/ru/user/advanced-modules/Workflow/image37.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image38.png b/static/images/ru/user/advanced-modules/Workflow/image38.png new file mode 100644 index 000000000..657970132 Binary files /dev/null and b/static/images/ru/user/advanced-modules/Workflow/image38.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image39.png b/static/images/ru/user/advanced-modules/Workflow/image39.png new file mode 100644 index 000000000..a35fa0166 Binary files /dev/null and b/static/images/ru/user/advanced-modules/Workflow/image39.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image4.png b/static/images/ru/user/advanced-modules/Workflow/image4.png index 493bc2941..4c53eab4d 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image4.png and b/static/images/ru/user/advanced-modules/Workflow/image4.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image40.png b/static/images/ru/user/advanced-modules/Workflow/image40.png new file mode 100644 index 000000000..3331361fb Binary files /dev/null and b/static/images/ru/user/advanced-modules/Workflow/image40.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image5.png b/static/images/ru/user/advanced-modules/Workflow/image5.png index 7a75e3a7a..09c6cd351 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image5.png and b/static/images/ru/user/advanced-modules/Workflow/image5.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image6.png b/static/images/ru/user/advanced-modules/Workflow/image6.png index 015366a1d..0817dc4c7 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image6.png and b/static/images/ru/user/advanced-modules/Workflow/image6.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image7.png b/static/images/ru/user/advanced-modules/Workflow/image7.png index 515a82ca5..f1d3fa89e 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image7.png and b/static/images/ru/user/advanced-modules/Workflow/image7.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image8.png b/static/images/ru/user/advanced-modules/Workflow/image8.png index 2622f71c9..7ca5160d8 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image8.png and b/static/images/ru/user/advanced-modules/Workflow/image8.png differ diff --git a/static/images/ru/user/advanced-modules/Workflow/image9.png b/static/images/ru/user/advanced-modules/Workflow/image9.png index 501d251c5..572ad8257 100644 Binary files a/static/images/ru/user/advanced-modules/Workflow/image9.png and b/static/images/ru/user/advanced-modules/Workflow/image9.png differ diff --git a/static/images/ru/user/core-modules/Calls/image2.png b/static/images/ru/user/core-modules/Calls/image2.png index b32fcd3f1..0e3ad7276 100644 Binary files a/static/images/ru/user/core-modules/Calls/image2.png and b/static/images/ru/user/core-modules/Calls/image2.png differ diff --git a/static/images/ru/user/core-modules/Calls/image5.png b/static/images/ru/user/core-modules/Calls/image5.png index 3e91763d4..1ae24bbcb 100644 Binary files a/static/images/ru/user/core-modules/Calls/image5.png and b/static/images/ru/user/core-modules/Calls/image5.png differ diff --git a/static/images/ru/user/core-modules/Campaigns/image9.png b/static/images/ru/user/core-modules/Campaigns/image9.png index cb49a66f3..3db467a4b 100644 Binary files a/static/images/ru/user/core-modules/Campaigns/image9.png and b/static/images/ru/user/core-modules/Campaigns/image9.png differ diff --git a/static/images/ru/user/core-modules/E-mail/image10.png b/static/images/ru/user/core-modules/E-mail/image10.png new file mode 100644 index 000000000..d393e8333 Binary files /dev/null and b/static/images/ru/user/core-modules/E-mail/image10.png differ diff --git a/static/images/ru/user/core-modules/E-mail/image9a.png b/static/images/ru/user/core-modules/E-mail/image9a.png new file mode 100644 index 000000000..1dea934f8 Binary files /dev/null and b/static/images/ru/user/core-modules/E-mail/image9a.png differ diff --git a/static/images/ru/user/core-modules/Meetings/image2.png b/static/images/ru/user/core-modules/Meetings/image2.png index 361293f6e..3fc005f7d 100644 Binary files a/static/images/ru/user/core-modules/Meetings/image2.png and b/static/images/ru/user/core-modules/Meetings/image2.png differ diff --git a/static/js/highlight.pack.js b/static/js/highlight.pack.js new file mode 100644 index 000000000..4ed8271e2 --- /dev/null +++ b/static/js/highlight.pack.js @@ -0,0 +1,2 @@ +/*! highlight.js v9.18.1 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"==typeof exports||exports.nodeType?n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs})):e(exports)}(function(a){var f=[],o=Object.keys,_={},g={},C=!0,n=/^(no-?highlight|plain|text)$/i,E=/\blang(?:uage)?-([\w-]+)\b/i,t=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,r={case_insensitive:"cI",lexemes:"l",contains:"c",keywords:"k",subLanguage:"sL",className:"cN",begin:"b",beginKeywords:"bK",end:"e",endsWithParent:"eW",illegal:"i",excludeBegin:"eB",excludeEnd:"eE",returnBegin:"rB",returnEnd:"rE",variants:"v",IDENT_RE:"IR",UNDERSCORE_IDENT_RE:"UIR",NUMBER_RE:"NR",C_NUMBER_RE:"CNR",BINARY_NUMBER_RE:"BNR",RE_STARTERS_RE:"RSR",BACKSLASH_ESCAPE:"BE",APOS_STRING_MODE:"ASM",QUOTE_STRING_MODE:"QSM",PHRASAL_WORDS_MODE:"PWM",C_LINE_COMMENT_MODE:"CLCM",C_BLOCK_COMMENT_MODE:"CBCM",HASH_COMMENT_MODE:"HCM",NUMBER_MODE:"NM",C_NUMBER_MODE:"CNM",BINARY_NUMBER_MODE:"BNM",CSS_NUMBER_MODE:"CSSNM",REGEXP_MODE:"RM",TITLE_MODE:"TM",UNDERSCORE_TITLE_MODE:"UTM",COMMENT:"C",beginRe:"bR",endRe:"eR",illegalRe:"iR",lexemesRe:"lR",terminators:"t",terminator_end:"tE"},m="",O="Could not find the language '{}', did you forget to load/include a language module?",B={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},c="of and for in not or if then".split(" ");function x(e){return e.replace(/&/g,"&").replace(//g,">")}function d(e){return e.nodeName.toLowerCase()}function R(e){return n.test(e)}function i(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function p(e){var a=[];return function e(n,t){for(var r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?t+=r.nodeValue.length:1===r.nodeType&&(a.push({event:"start",offset:t,node:r}),t=e(r,t),d(r).match(/br|hr|img|input/)||a.push({event:"stop",offset:t,node:r}));return t}(e,0),a}function v(e,n,t){var r=0,a="",i=[];function o(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function l(e){a+=""}function u(e){("start"===e.event?c:l)(e.node)}for(;e.length||n.length;){var s=o();if(a+=x(t.substring(r,s[0].offset)),r=s[0].offset,s===e){for(i.reverse().forEach(l);u(s.splice(0,1)[0]),(s=o())===e&&s.length&&s[0].offset===r;);i.reverse().forEach(c)}else"start"===s[0].event?i.push(s[0].node):i.pop(),u(s.splice(0,1)[0])}return a+x(t.substr(r))}function l(n){return n.v&&!n.cached_variants&&(n.cached_variants=n.v.map(function(e){return i(n,{v:null},e)})),n.cached_variants?n.cached_variants:function e(n){return!!n&&(n.eW||e(n.starts))}(n)?[i(n,{starts:n.starts?i(n.starts):null})]:Object.isFrozen(n)?[i(n)]:[n]}function u(e){if(r&&!e.langApiRestored){for(var n in e.langApiRestored=!0,r)e[n]&&(e[r[n]]=e[n]);(e.c||[]).concat(e.v||[]).forEach(u)}}function M(n,t){var i={};return"string"==typeof n?r("keyword",n):o(n).forEach(function(e){r(e,n[e])}),i;function r(a,e){t&&(e=e.toLowerCase()),e.split(" ").forEach(function(e){var n,t,r=e.split("|");i[r[0]]=[a,(n=r[0],(t=r[1])?Number(t):function(e){return-1!=c.indexOf(e.toLowerCase())}(n)?0:1)]})}}function S(r){function s(e){return e&&e.source||e}function f(e,n){return new RegExp(s(e),"m"+(r.cI?"i":"")+(n?"g":""))}function a(a){var i,e,o={},c=[],l={},t=1;function n(e,n){o[t]=e,c.push([e,n]),t+=new RegExp(n.toString()+"|").exec("").length-1+1}for(var r=0;r')+n+(t?"":m)}function o(){p+=(null!=d.sL?function(){var e="string"==typeof d.sL;if(e&&!_[d.sL])return x(v);var n=e?T(d.sL,v,!0,R[d.sL]):w(v,d.sL.length?d.sL:void 0);return 0")+'"');if("end"===n.type){var r=s(n);if(null!=r)return r}return v+=t,t.length}var g=D(n);if(!g)throw console.error(O.replace("{}",n)),new Error('Unknown language: "'+n+'"');S(g);var E,d=t||g,R={},p="";for(E=d;E!==g;E=E.parent)E.cN&&(p=c(E.cN,"",!0)+p);var v="",M=0;try{for(var b,h,N=0;d.t.lastIndex=N,b=d.t.exec(i);)h=r(i.substring(N,b.index),b),N=b.index+h;for(r(i.substr(N)),E=d;E.parent;E=E.parent)E.cN&&(p+=m);return{relevance:M,value:p,i:!1,language:n,top:d}}catch(e){if(e.message&&-1!==e.message.indexOf("Illegal"))return{i:!0,relevance:0,value:x(i)};if(C)return{relevance:0,value:x(i),language:n,top:d,errorRaised:e};throw e}}function w(t,e){e=e||B.languages||o(_);var r={relevance:0,value:x(t)},a=r;return e.filter(D).filter(L).forEach(function(e){var n=T(e,t,!1);n.language=e,n.relevance>a.relevance&&(a=n),n.relevance>r.relevance&&(a=r,r=n)}),a.language&&(r.second_best=a),r}function b(e){return B.tabReplace||B.useBR?e.replace(t,function(e,n){return B.useBR&&"\n"===e?"
":B.tabReplace?n.replace(/\t/g,B.tabReplace):""}):e}function s(e){var n,t,r,a,i,o,c,l,u,s,f=function(e){var n,t,r,a,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",t=E.exec(i)){var o=D(t[1]);return o||(console.warn(O.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),o?t[1]:"no-highlight"}for(n=0,r=(i=i.split(/\s+/)).length;n/g,"\n"):n=e,i=n.textContent,r=f?T(f,i,!0):w(i),(t=p(n)).length&&((a=document.createElement("div")).innerHTML=r.value,r.value=v(t,p(a),i)),r.value=b(r.value),e.innerHTML=r.value,e.className=(o=e.className,c=f,l=r.language,u=c?g[c]:l,s=[o.trim()],o.match(/\bhljs\b/)||s.push("hljs"),-1===o.indexOf(u)&&s.push(u),s.join(" ").trim()),e.result={language:r.language,re:r.relevance},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.relevance}))}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll("pre code");f.forEach.call(e,s)}}var N={disableAutodetect:!0};function D(e){return e=(e||"").toLowerCase(),_[e]||_[g[e]]}function L(e){var n=D(e);return n&&!n.disableAutodetect}return a.highlight=T,a.highlightAuto=w,a.fixMarkup=b,a.highlightBlock=s,a.configure=function(e){B=i(B,e)},a.initHighlighting=h,a.initHighlightingOnLoad=function(){window.addEventListener("DOMContentLoaded",h,!1),window.addEventListener("load",h,!1)},a.registerLanguage=function(n,e){var t;try{t=e(a)}catch(e){if(console.error("Language definition for '{}' could not be registered.".replace("{}",n)),!C)throw e;console.error(e),t=N}u(_[n]=t),t.rawDefinition=e.bind(null,a),t.aliases&&t.aliases.forEach(function(e){g[e]=n})},a.listLanguages=function(){return o(_)},a.getLanguage=D,a.requireLanguage=function(e){var n=D(e);if(n)return n;throw new Error("The '{}' language is required, but not loaded.".replace("{}",e))},a.autoDetection=L,a.inherit=i,a.debugMode=function(){C=!1},a.IR=a.IDENT_RE="[a-zA-Z]\\w*",a.UIR=a.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*",a.NR=a.NUMBER_RE="\\b\\d+(\\.\\d+)?",a.CNR=a.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",a.BNR=a.BINARY_NUMBER_RE="\\b(0b[01]+)",a.RSR=a.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",a.BE=a.BACKSLASH_ESCAPE={b:"\\\\[\\s\\S]",relevance:0},a.ASM=a.APOS_STRING_MODE={cN:"string",b:"'",e:"'",i:"\\n",c:[a.BE]},a.QSM=a.QUOTE_STRING_MODE={cN:"string",b:'"',e:'"',i:"\\n",c:[a.BE]},a.PWM=a.PHRASAL_WORDS_MODE={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},a.C=a.COMMENT=function(e,n,t){var r=a.inherit({cN:"comment",b:e,e:n,c:[]},t||{});return r.c.push(a.PWM),r.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",relevance:0}),r},a.CLCM=a.C_LINE_COMMENT_MODE=a.C("//","$"),a.CBCM=a.C_BLOCK_COMMENT_MODE=a.C("/\\*","\\*/"),a.HCM=a.HASH_COMMENT_MODE=a.C("#","$"),a.NM=a.NUMBER_MODE={cN:"number",b:a.NR,relevance:0},a.CNM=a.C_NUMBER_MODE={cN:"number",b:a.CNR,relevance:0},a.BNM=a.BINARY_NUMBER_MODE={cN:"number",b:a.BNR,relevance:0},a.CSSNM=a.CSS_NUMBER_MODE={cN:"number",b:a.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},a.RM=a.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[a.BE,{b:/\[/,e:/\]/,relevance:0,c:[a.BE]}]},a.TM=a.TITLE_MODE={cN:"title",b:a.IR,relevance:0},a.UTM=a.UNDERSCORE_TITLE_MODE={cN:"title",b:a.UIR,relevance:0},a.METHOD_GUARD={b:"\\.\\s*"+a.UIR,relevance:0},[a.BE,a.ASM,a.QSM,a.PWM,a.C,a.CLCM,a.CBCM,a.HCM,a.NM,a.CNM,a.BNM,a.CSSNM,a.RM,a.TM,a.UTM,a.METHOD_GUARD].forEach(function(e){!function n(t){Object.freeze(t);var r="function"==typeof t;Object.getOwnPropertyNames(t).forEach(function(e){!t.hasOwnProperty(e)||null===t[e]||"object"!=typeof t[e]&&"function"!=typeof t[e]||r&&("caller"===e||"callee"===e||"arguments"===e)||Object.isFrozen(t[e])||n(t[e])});return t}(e)}),a});hljs.registerLanguage("ini",function(e){var b={cN:"number",relevance:0,v:[{b:/([\+\-]+)?[\d]+_[\d_]+/},{b:e.NR}]},a=e.C();a.v=[{b:/;/,e:/$/},{b:/#/,e:/$/}];var c={cN:"variable",v:[{b:/\$[\w\d"][\w\d_]*/},{b:/\$\{(.*?)}/}]},r={cN:"literal",b:/\bon|off|true|false|yes|no\b/},n={cN:"string",c:[e.BE],v:[{b:"'''",e:"'''",relevance:10},{b:'"""',e:'"""',relevance:10},{b:'"',e:'"'},{b:"'",e:"'"}]};return{aliases:["toml"],cI:!0,i:/\S/,c:[a,{cN:"section",b:/\[+/,e:/\]+/},{b:/^[a-z0-9\[\]_\.-]+(?=\s*=\s*)/,cN:"attr",starts:{e:/$/,c:[a,{b:/\[/,e:/\]/,c:[a,r,c,n,b,"self"],relevance:0},r,c,n,b]}}]}});hljs.registerLanguage("ruby",function(e){var c="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",b={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},r={cN:"doctag",b:"@[A-Za-z]+"},a={b:"#<",e:">"},n=[e.C("#","$",{c:[r]}),e.C("^\\=begin","^\\=end",{c:[r],relevance:10}),e.C("^__END__","\\n$")],s={cN:"subst",b:"#\\{",e:"}",k:b},t={cN:"string",c:[e.BE,s],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{b:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,rB:!0,c:[{b:/<<[-~]?'?/},{b:/\w+/,endSameAsBegin:!0,c:[e.BE,s]}]}]},i={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:b},l=[t,a,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(n)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:c}),i].concat(n)},{b:e.IR+"::"},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",relevance:0},{cN:"symbol",b:":(?!\\s)",c:[t,{b:c}],relevance:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{cN:"params",b:/\|/,e:/\|/,k:b},{b:"("+e.RSR+"|unless)\\s*",k:"unless",c:[a,{cN:"regexp",c:[e.BE,s],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(n),relevance:0}].concat(n);s.c=l;var d=[{b:/^\s*=>/,starts:{e:"$",c:i.c=l}},{cN:"meta",b:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{e:"$",c:l}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:b,i:/\/\*/,c:n.concat(d).concat(l)}});hljs.registerLanguage("yaml",function(e){var b="true false yes no null",a={cN:"string",relevance:0,v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/\S+/}],c:[e.BE,{cN:"template-variable",v:[{b:"{{",e:"}}"},{b:"%{",e:"}"}]}]};return{cI:!0,aliases:["yml","YAML","yaml"],c:[{cN:"attr",v:[{b:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{b:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{b:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{cN:"meta",b:"^---s*$",relevance:10},{cN:"string",b:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{b:"<%[%=-]?",e:"[%-]?%>",sL:"ruby",eB:!0,eE:!0,relevance:0},{cN:"type",b:"!"+e.UIR},{cN:"type",b:"!!"+e.UIR},{cN:"meta",b:"&"+e.UIR+"$"},{cN:"meta",b:"\\*"+e.UIR+"$"},{cN:"bullet",b:"\\-(?=[ ]|$)",relevance:0},e.HCM,{bK:b,k:{literal:b}},{cN:"number",b:e.CNR+"\\b"},a]}});hljs.registerLanguage("pgsql",function(E){var T=E.C("--","$"),N="BIGINT INT8 BIGSERIAL SERIAL8 BIT VARYING VARBIT BOOLEAN BOOL BOX BYTEA CHARACTER CHAR VARCHAR CIDR CIRCLE DATE DOUBLE PRECISION FLOAT8 FLOAT INET INTEGER INT INT4 INTERVAL JSON JSONB LINE LSEG|10 MACADDR MACADDR8 MONEY NUMERIC DEC DECIMAL PATH POINT POLYGON REAL FLOAT4 SMALLINT INT2 SMALLSERIAL|10 SERIAL2|10 SERIAL|10 SERIAL4|10 TEXT TIME ZONE TIMETZ|10 TIMESTAMP TIMESTAMPTZ|10 TSQUERY|10 TSVECTOR|10 TXID_SNAPSHOT|10 UUID XML NATIONAL NCHAR INT4RANGE|10 INT8RANGE|10 NUMRANGE|10 TSRANGE|10 TSTZRANGE|10 DATERANGE|10 ANYELEMENT ANYARRAY ANYNONARRAY ANYENUM ANYRANGE CSTRING INTERNAL RECORD PG_DDL_COMMAND VOID UNKNOWN OPAQUE REFCURSOR NAME OID REGPROC|10 REGPROCEDURE|10 REGOPER|10 REGOPERATOR|10 REGCLASS|10 REGTYPE|10 REGROLE|10 REGNAMESPACE|10 REGCONFIG|10 REGDICTIONARY|10 ",A=N.trim().split(" ").map(function(E){return E.split("|")[0]}).join("|"),R="ARRAY_AGG AVG BIT_AND BIT_OR BOOL_AND BOOL_OR COUNT EVERY JSON_AGG JSONB_AGG JSON_OBJECT_AGG JSONB_OBJECT_AGG MAX MIN MODE STRING_AGG SUM XMLAGG CORR COVAR_POP COVAR_SAMP REGR_AVGX REGR_AVGY REGR_COUNT REGR_INTERCEPT REGR_R2 REGR_SLOPE REGR_SXX REGR_SXY REGR_SYY STDDEV STDDEV_POP STDDEV_SAMP VARIANCE VAR_POP VAR_SAMP PERCENTILE_CONT PERCENTILE_DISC ROW_NUMBER RANK DENSE_RANK PERCENT_RANK CUME_DIST NTILE LAG LEAD FIRST_VALUE LAST_VALUE NTH_VALUE NUM_NONNULLS NUM_NULLS ABS CBRT CEIL CEILING DEGREES DIV EXP FLOOR LN LOG MOD PI POWER RADIANS ROUND SCALE SIGN SQRT TRUNC WIDTH_BUCKET RANDOM SETSEED ACOS ACOSD ASIN ASIND ATAN ATAND ATAN2 ATAN2D COS COSD COT COTD SIN SIND TAN TAND BIT_LENGTH CHAR_LENGTH CHARACTER_LENGTH LOWER OCTET_LENGTH OVERLAY POSITION SUBSTRING TREAT TRIM UPPER ASCII BTRIM CHR CONCAT CONCAT_WS CONVERT CONVERT_FROM CONVERT_TO DECODE ENCODE INITCAPLEFT LENGTH LPAD LTRIM MD5 PARSE_IDENT PG_CLIENT_ENCODING QUOTE_IDENT|10 QUOTE_LITERAL|10 QUOTE_NULLABLE|10 REGEXP_MATCH REGEXP_MATCHES REGEXP_REPLACE REGEXP_SPLIT_TO_ARRAY REGEXP_SPLIT_TO_TABLE REPEAT REPLACE REVERSE RIGHT RPAD RTRIM SPLIT_PART STRPOS SUBSTR TO_ASCII TO_HEX TRANSLATE OCTET_LENGTH GET_BIT GET_BYTE SET_BIT SET_BYTE TO_CHAR TO_DATE TO_NUMBER TO_TIMESTAMP AGE CLOCK_TIMESTAMP|10 DATE_PART DATE_TRUNC ISFINITE JUSTIFY_DAYS JUSTIFY_HOURS JUSTIFY_INTERVAL MAKE_DATE MAKE_INTERVAL|10 MAKE_TIME MAKE_TIMESTAMP|10 MAKE_TIMESTAMPTZ|10 NOW STATEMENT_TIMESTAMP|10 TIMEOFDAY TRANSACTION_TIMESTAMP|10 ENUM_FIRST ENUM_LAST ENUM_RANGE AREA CENTER DIAMETER HEIGHT ISCLOSED ISOPEN NPOINTS PCLOSE POPEN RADIUS WIDTH BOX BOUND_BOX CIRCLE LINE LSEG PATH POLYGON ABBREV BROADCAST HOST HOSTMASK MASKLEN NETMASK NETWORK SET_MASKLEN TEXT INET_SAME_FAMILYINET_MERGE MACADDR8_SET7BIT ARRAY_TO_TSVECTOR GET_CURRENT_TS_CONFIG NUMNODE PLAINTO_TSQUERY PHRASETO_TSQUERY WEBSEARCH_TO_TSQUERY QUERYTREE SETWEIGHT STRIP TO_TSQUERY TO_TSVECTOR JSON_TO_TSVECTOR JSONB_TO_TSVECTOR TS_DELETE TS_FILTER TS_HEADLINE TS_RANK TS_RANK_CD TS_REWRITE TSQUERY_PHRASE TSVECTOR_TO_ARRAY TSVECTOR_UPDATE_TRIGGER TSVECTOR_UPDATE_TRIGGER_COLUMN XMLCOMMENT XMLCONCAT XMLELEMENT XMLFOREST XMLPI XMLROOT XMLEXISTS XML_IS_WELL_FORMED XML_IS_WELL_FORMED_DOCUMENT XML_IS_WELL_FORMED_CONTENT XPATH XPATH_EXISTS XMLTABLE XMLNAMESPACES TABLE_TO_XML TABLE_TO_XMLSCHEMA TABLE_TO_XML_AND_XMLSCHEMA QUERY_TO_XML QUERY_TO_XMLSCHEMA QUERY_TO_XML_AND_XMLSCHEMA CURSOR_TO_XML CURSOR_TO_XMLSCHEMA SCHEMA_TO_XML SCHEMA_TO_XMLSCHEMA SCHEMA_TO_XML_AND_XMLSCHEMA DATABASE_TO_XML DATABASE_TO_XMLSCHEMA DATABASE_TO_XML_AND_XMLSCHEMA XMLATTRIBUTES TO_JSON TO_JSONB ARRAY_TO_JSON ROW_TO_JSON JSON_BUILD_ARRAY JSONB_BUILD_ARRAY JSON_BUILD_OBJECT JSONB_BUILD_OBJECT JSON_OBJECT JSONB_OBJECT JSON_ARRAY_LENGTH JSONB_ARRAY_LENGTH JSON_EACH JSONB_EACH JSON_EACH_TEXT JSONB_EACH_TEXT JSON_EXTRACT_PATH JSONB_EXTRACT_PATH JSON_OBJECT_KEYS JSONB_OBJECT_KEYS JSON_POPULATE_RECORD JSONB_POPULATE_RECORD JSON_POPULATE_RECORDSET JSONB_POPULATE_RECORDSET JSON_ARRAY_ELEMENTS JSONB_ARRAY_ELEMENTS JSON_ARRAY_ELEMENTS_TEXT JSONB_ARRAY_ELEMENTS_TEXT JSON_TYPEOF JSONB_TYPEOF JSON_TO_RECORD JSONB_TO_RECORD JSON_TO_RECORDSET JSONB_TO_RECORDSET JSON_STRIP_NULLS JSONB_STRIP_NULLS JSONB_SET JSONB_INSERT JSONB_PRETTY CURRVAL LASTVAL NEXTVAL SETVAL COALESCE NULLIF GREATEST LEAST ARRAY_APPEND ARRAY_CAT ARRAY_NDIMS ARRAY_DIMS ARRAY_FILL ARRAY_LENGTH ARRAY_LOWER ARRAY_POSITION ARRAY_POSITIONS ARRAY_PREPEND ARRAY_REMOVE ARRAY_REPLACE ARRAY_TO_STRING ARRAY_UPPER CARDINALITY STRING_TO_ARRAY UNNEST ISEMPTY LOWER_INC UPPER_INC LOWER_INF UPPER_INF RANGE_MERGE GENERATE_SERIES GENERATE_SUBSCRIPTS CURRENT_DATABASE CURRENT_QUERY CURRENT_SCHEMA|10 CURRENT_SCHEMAS|10 INET_CLIENT_ADDR INET_CLIENT_PORT INET_SERVER_ADDR INET_SERVER_PORT ROW_SECURITY_ACTIVE FORMAT_TYPE TO_REGCLASS TO_REGPROC TO_REGPROCEDURE TO_REGOPER TO_REGOPERATOR TO_REGTYPE TO_REGNAMESPACE TO_REGROLE COL_DESCRIPTION OBJ_DESCRIPTION SHOBJ_DESCRIPTION TXID_CURRENT TXID_CURRENT_IF_ASSIGNED TXID_CURRENT_SNAPSHOT TXID_SNAPSHOT_XIP TXID_SNAPSHOT_XMAX TXID_SNAPSHOT_XMIN TXID_VISIBLE_IN_SNAPSHOT TXID_STATUS CURRENT_SETTING SET_CONFIG BRIN_SUMMARIZE_NEW_VALUES BRIN_SUMMARIZE_RANGE BRIN_DESUMMARIZE_RANGE GIN_CLEAN_PENDING_LIST SUPPRESS_REDUNDANT_UPDATES_TRIGGER LO_FROM_BYTEA LO_PUT LO_GET LO_CREAT LO_CREATE LO_UNLINK LO_IMPORT LO_EXPORT LOREAD LOWRITE GROUPING CAST ".trim().split(" ").map(function(E){return E.split("|")[0]}).join("|");return{aliases:["postgres","postgresql"],cI:!0,k:{keyword:"ABORT ALTER ANALYZE BEGIN CALL CHECKPOINT|10 CLOSE CLUSTER COMMENT COMMIT COPY CREATE DEALLOCATE DECLARE DELETE DISCARD DO DROP END EXECUTE EXPLAIN FETCH GRANT IMPORT INSERT LISTEN LOAD LOCK MOVE NOTIFY PREPARE REASSIGN|10 REFRESH REINDEX RELEASE RESET REVOKE ROLLBACK SAVEPOINT SECURITY SELECT SET SHOW START TRUNCATE UNLISTEN|10 UPDATE VACUUM|10 VALUES AGGREGATE COLLATION CONVERSION|10 DATABASE DEFAULT PRIVILEGES DOMAIN TRIGGER EXTENSION FOREIGN WRAPPER|10 TABLE FUNCTION GROUP LANGUAGE LARGE OBJECT MATERIALIZED VIEW OPERATOR CLASS FAMILY POLICY PUBLICATION|10 ROLE RULE SCHEMA SEQUENCE SERVER STATISTICS SUBSCRIPTION SYSTEM TABLESPACE CONFIGURATION DICTIONARY PARSER TEMPLATE TYPE USER MAPPING PREPARED ACCESS METHOD CAST AS TRANSFORM TRANSACTION OWNED TO INTO SESSION AUTHORIZATION INDEX PROCEDURE ASSERTION ALL ANALYSE AND ANY ARRAY ASC ASYMMETRIC|10 BOTH CASE CHECK COLLATE COLUMN CONCURRENTLY|10 CONSTRAINT CROSS DEFERRABLE RANGE DESC DISTINCT ELSE EXCEPT FOR FREEZE|10 FROM FULL HAVING ILIKE IN INITIALLY INNER INTERSECT IS ISNULL JOIN LATERAL LEADING LIKE LIMIT NATURAL NOT NOTNULL NULL OFFSET ON ONLY OR ORDER OUTER OVERLAPS PLACING PRIMARY REFERENCES RETURNING SIMILAR SOME SYMMETRIC TABLESAMPLE THEN TRAILING UNION UNIQUE USING VARIADIC|10 VERBOSE WHEN WHERE WINDOW WITH BY RETURNS INOUT OUT SETOF|10 IF STRICT CURRENT CONTINUE OWNER LOCATION OVER PARTITION WITHIN BETWEEN ESCAPE EXTERNAL INVOKER DEFINER WORK RENAME VERSION CONNECTION CONNECT TABLES TEMP TEMPORARY FUNCTIONS SEQUENCES TYPES SCHEMAS OPTION CASCADE RESTRICT ADD ADMIN EXISTS VALID VALIDATE ENABLE DISABLE REPLICA|10 ALWAYS PASSING COLUMNS PATH REF VALUE OVERRIDING IMMUTABLE STABLE VOLATILE BEFORE AFTER EACH ROW PROCEDURAL ROUTINE NO HANDLER VALIDATOR OPTIONS STORAGE OIDS|10 WITHOUT INHERIT DEPENDS CALLED INPUT LEAKPROOF|10 COST ROWS NOWAIT SEARCH UNTIL ENCRYPTED|10 PASSWORD CONFLICT|10 INSTEAD INHERITS CHARACTERISTICS WRITE CURSOR ALSO STATEMENT SHARE EXCLUSIVE INLINE ISOLATION REPEATABLE READ COMMITTED SERIALIZABLE UNCOMMITTED LOCAL GLOBAL SQL PROCEDURES RECURSIVE SNAPSHOT ROLLUP CUBE TRUSTED|10 INCLUDE FOLLOWING PRECEDING UNBOUNDED RANGE GROUPS UNENCRYPTED|10 SYSID FORMAT DELIMITER HEADER QUOTE ENCODING FILTER OFF FORCE_QUOTE FORCE_NOT_NULL FORCE_NULL COSTS BUFFERS TIMING SUMMARY DISABLE_PAGE_SKIPPING RESTART CYCLE GENERATED IDENTITY DEFERRED IMMEDIATE LEVEL LOGGED UNLOGGED OF NOTHING NONE EXCLUDE ATTRIBUTE USAGE ROUTINES TRUE FALSE NAN INFINITY ALIAS BEGIN CONSTANT DECLARE END EXCEPTION RETURN PERFORM|10 RAISE GET DIAGNOSTICS STACKED|10 FOREACH LOOP ELSIF EXIT WHILE REVERSE SLICE DEBUG LOG INFO NOTICE WARNING ASSERT OPEN SUPERUSER NOSUPERUSER CREATEDB NOCREATEDB CREATEROLE NOCREATEROLE INHERIT NOINHERIT LOGIN NOLOGIN REPLICATION NOREPLICATION BYPASSRLS NOBYPASSRLS ",built_in:"CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURRENT_CATALOG|10 CURRENT_DATE LOCALTIME LOCALTIMESTAMP CURRENT_ROLE|10 CURRENT_SCHEMA|10 SESSION_USER PUBLIC FOUND NEW OLD TG_NAME|10 TG_WHEN|10 TG_LEVEL|10 TG_OP|10 TG_RELID|10 TG_RELNAME|10 TG_TABLE_NAME|10 TG_TABLE_SCHEMA|10 TG_NARGS|10 TG_ARGV|10 TG_EVENT|10 TG_TAG|10 ROW_COUNT RESULT_OID|10 PG_CONTEXT|10 RETURNED_SQLSTATE COLUMN_NAME CONSTRAINT_NAME PG_DATATYPE_NAME|10 MESSAGE_TEXT TABLE_NAME SCHEMA_NAME PG_EXCEPTION_DETAIL|10 PG_EXCEPTION_HINT|10 PG_EXCEPTION_CONTEXT|10 SQLSTATE SQLERRM|10 SUCCESSFUL_COMPLETION WARNING DYNAMIC_RESULT_SETS_RETURNED IMPLICIT_ZERO_BIT_PADDING NULL_VALUE_ELIMINATED_IN_SET_FUNCTION PRIVILEGE_NOT_GRANTED PRIVILEGE_NOT_REVOKED STRING_DATA_RIGHT_TRUNCATION DEPRECATED_FEATURE NO_DATA NO_ADDITIONAL_DYNAMIC_RESULT_SETS_RETURNED SQL_STATEMENT_NOT_YET_COMPLETE CONNECTION_EXCEPTION CONNECTION_DOES_NOT_EXIST CONNECTION_FAILURE SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION SQLSERVER_REJECTED_ESTABLISHMENT_OF_SQLCONNECTION TRANSACTION_RESOLUTION_UNKNOWN PROTOCOL_VIOLATION TRIGGERED_ACTION_EXCEPTION FEATURE_NOT_SUPPORTED INVALID_TRANSACTION_INITIATION LOCATOR_EXCEPTION INVALID_LOCATOR_SPECIFICATION INVALID_GRANTOR INVALID_GRANT_OPERATION INVALID_ROLE_SPECIFICATION DIAGNOSTICS_EXCEPTION STACKED_DIAGNOSTICS_ACCESSED_WITHOUT_ACTIVE_HANDLER CASE_NOT_FOUND CARDINALITY_VIOLATION DATA_EXCEPTION ARRAY_SUBSCRIPT_ERROR CHARACTER_NOT_IN_REPERTOIRE DATETIME_FIELD_OVERFLOW DIVISION_BY_ZERO ERROR_IN_ASSIGNMENT ESCAPE_CHARACTER_CONFLICT INDICATOR_OVERFLOW INTERVAL_FIELD_OVERFLOW INVALID_ARGUMENT_FOR_LOGARITHM INVALID_ARGUMENT_FOR_NTILE_FUNCTION INVALID_ARGUMENT_FOR_NTH_VALUE_FUNCTION INVALID_ARGUMENT_FOR_POWER_FUNCTION INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION INVALID_CHARACTER_VALUE_FOR_CAST INVALID_DATETIME_FORMAT INVALID_ESCAPE_CHARACTER INVALID_ESCAPE_OCTET INVALID_ESCAPE_SEQUENCE NONSTANDARD_USE_OF_ESCAPE_CHARACTER INVALID_INDICATOR_PARAMETER_VALUE INVALID_PARAMETER_VALUE INVALID_REGULAR_EXPRESSION INVALID_ROW_COUNT_IN_LIMIT_CLAUSE INVALID_ROW_COUNT_IN_RESULT_OFFSET_CLAUSE INVALID_TABLESAMPLE_ARGUMENT INVALID_TABLESAMPLE_REPEAT INVALID_TIME_ZONE_DISPLACEMENT_VALUE INVALID_USE_OF_ESCAPE_CHARACTER MOST_SPECIFIC_TYPE_MISMATCH NULL_VALUE_NOT_ALLOWED NULL_VALUE_NO_INDICATOR_PARAMETER NUMERIC_VALUE_OUT_OF_RANGE SEQUENCE_GENERATOR_LIMIT_EXCEEDED STRING_DATA_LENGTH_MISMATCH STRING_DATA_RIGHT_TRUNCATION SUBSTRING_ERROR TRIM_ERROR UNTERMINATED_C_STRING ZERO_LENGTH_CHARACTER_STRING FLOATING_POINT_EXCEPTION INVALID_TEXT_REPRESENTATION INVALID_BINARY_REPRESENTATION BAD_COPY_FILE_FORMAT UNTRANSLATABLE_CHARACTER NOT_AN_XML_DOCUMENT INVALID_XML_DOCUMENT INVALID_XML_CONTENT INVALID_XML_COMMENT INVALID_XML_PROCESSING_INSTRUCTION INTEGRITY_CONSTRAINT_VIOLATION RESTRICT_VIOLATION NOT_NULL_VIOLATION FOREIGN_KEY_VIOLATION UNIQUE_VIOLATION CHECK_VIOLATION EXCLUSION_VIOLATION INVALID_CURSOR_STATE INVALID_TRANSACTION_STATE ACTIVE_SQL_TRANSACTION BRANCH_TRANSACTION_ALREADY_ACTIVE HELD_CURSOR_REQUIRES_SAME_ISOLATION_LEVEL INAPPROPRIATE_ACCESS_MODE_FOR_BRANCH_TRANSACTION INAPPROPRIATE_ISOLATION_LEVEL_FOR_BRANCH_TRANSACTION NO_ACTIVE_SQL_TRANSACTION_FOR_BRANCH_TRANSACTION READ_ONLY_SQL_TRANSACTION SCHEMA_AND_DATA_STATEMENT_MIXING_NOT_SUPPORTED NO_ACTIVE_SQL_TRANSACTION IN_FAILED_SQL_TRANSACTION IDLE_IN_TRANSACTION_SESSION_TIMEOUT INVALID_SQL_STATEMENT_NAME TRIGGERED_DATA_CHANGE_VIOLATION INVALID_AUTHORIZATION_SPECIFICATION INVALID_PASSWORD DEPENDENT_PRIVILEGE_DESCRIPTORS_STILL_EXIST DEPENDENT_OBJECTS_STILL_EXIST INVALID_TRANSACTION_TERMINATION SQL_ROUTINE_EXCEPTION FUNCTION_EXECUTED_NO_RETURN_STATEMENT MODIFYING_SQL_DATA_NOT_PERMITTED PROHIBITED_SQL_STATEMENT_ATTEMPTED READING_SQL_DATA_NOT_PERMITTED INVALID_CURSOR_NAME EXTERNAL_ROUTINE_EXCEPTION CONTAINING_SQL_NOT_PERMITTED MODIFYING_SQL_DATA_NOT_PERMITTED PROHIBITED_SQL_STATEMENT_ATTEMPTED READING_SQL_DATA_NOT_PERMITTED EXTERNAL_ROUTINE_INVOCATION_EXCEPTION INVALID_SQLSTATE_RETURNED NULL_VALUE_NOT_ALLOWED TRIGGER_PROTOCOL_VIOLATED SRF_PROTOCOL_VIOLATED EVENT_TRIGGER_PROTOCOL_VIOLATED SAVEPOINT_EXCEPTION INVALID_SAVEPOINT_SPECIFICATION INVALID_CATALOG_NAME INVALID_SCHEMA_NAME TRANSACTION_ROLLBACK TRANSACTION_INTEGRITY_CONSTRAINT_VIOLATION SERIALIZATION_FAILURE STATEMENT_COMPLETION_UNKNOWN DEADLOCK_DETECTED SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION SYNTAX_ERROR INSUFFICIENT_PRIVILEGE CANNOT_COERCE GROUPING_ERROR WINDOWING_ERROR INVALID_RECURSION INVALID_FOREIGN_KEY INVALID_NAME NAME_TOO_LONG RESERVED_NAME DATATYPE_MISMATCH INDETERMINATE_DATATYPE COLLATION_MISMATCH INDETERMINATE_COLLATION WRONG_OBJECT_TYPE GENERATED_ALWAYS UNDEFINED_COLUMN UNDEFINED_FUNCTION UNDEFINED_TABLE UNDEFINED_PARAMETER UNDEFINED_OBJECT DUPLICATE_COLUMN DUPLICATE_CURSOR DUPLICATE_DATABASE DUPLICATE_FUNCTION DUPLICATE_PREPARED_STATEMENT DUPLICATE_SCHEMA DUPLICATE_TABLE DUPLICATE_ALIAS DUPLICATE_OBJECT AMBIGUOUS_COLUMN AMBIGUOUS_FUNCTION AMBIGUOUS_PARAMETER AMBIGUOUS_ALIAS INVALID_COLUMN_REFERENCE INVALID_COLUMN_DEFINITION INVALID_CURSOR_DEFINITION INVALID_DATABASE_DEFINITION INVALID_FUNCTION_DEFINITION INVALID_PREPARED_STATEMENT_DEFINITION INVALID_SCHEMA_DEFINITION INVALID_TABLE_DEFINITION INVALID_OBJECT_DEFINITION WITH_CHECK_OPTION_VIOLATION INSUFFICIENT_RESOURCES DISK_FULL OUT_OF_MEMORY TOO_MANY_CONNECTIONS CONFIGURATION_LIMIT_EXCEEDED PROGRAM_LIMIT_EXCEEDED STATEMENT_TOO_COMPLEX TOO_MANY_COLUMNS TOO_MANY_ARGUMENTS OBJECT_NOT_IN_PREREQUISITE_STATE OBJECT_IN_USE CANT_CHANGE_RUNTIME_PARAM LOCK_NOT_AVAILABLE OPERATOR_INTERVENTION QUERY_CANCELED ADMIN_SHUTDOWN CRASH_SHUTDOWN CANNOT_CONNECT_NOW DATABASE_DROPPED SYSTEM_ERROR IO_ERROR UNDEFINED_FILE DUPLICATE_FILE SNAPSHOT_TOO_OLD CONFIG_FILE_ERROR LOCK_FILE_EXISTS FDW_ERROR FDW_COLUMN_NAME_NOT_FOUND FDW_DYNAMIC_PARAMETER_VALUE_NEEDED FDW_FUNCTION_SEQUENCE_ERROR FDW_INCONSISTENT_DESCRIPTOR_INFORMATION FDW_INVALID_ATTRIBUTE_VALUE FDW_INVALID_COLUMN_NAME FDW_INVALID_COLUMN_NUMBER FDW_INVALID_DATA_TYPE FDW_INVALID_DATA_TYPE_DESCRIPTORS FDW_INVALID_DESCRIPTOR_FIELD_IDENTIFIER FDW_INVALID_HANDLE FDW_INVALID_OPTION_INDEX FDW_INVALID_OPTION_NAME FDW_INVALID_STRING_LENGTH_OR_BUFFER_LENGTH FDW_INVALID_STRING_FORMAT FDW_INVALID_USE_OF_NULL_POINTER FDW_TOO_MANY_HANDLES FDW_OUT_OF_MEMORY FDW_NO_SCHEMAS FDW_OPTION_NAME_NOT_FOUND FDW_REPLY_HANDLE FDW_SCHEMA_NOT_FOUND FDW_TABLE_NOT_FOUND FDW_UNABLE_TO_CREATE_EXECUTION FDW_UNABLE_TO_CREATE_REPLY FDW_UNABLE_TO_ESTABLISH_CONNECTION PLPGSQL_ERROR RAISE_EXCEPTION NO_DATA_FOUND TOO_MANY_ROWS ASSERT_FAILURE INTERNAL_ERROR DATA_CORRUPTED INDEX_CORRUPTED "},i:/:==|\W\s*\(\*|(^|\s)\$[a-z]|{{|[a-z]:\s*$|\.\.\.|TO:|DO:/,c:[{cN:"keyword",v:[{b:/\bTEXT\s*SEARCH\b/},{b:/\b(PRIMARY|FOREIGN|FOR(\s+NO)?)\s+KEY\b/},{b:/\bPARALLEL\s+(UNSAFE|RESTRICTED|SAFE)\b/},{b:/\bSTORAGE\s+(PLAIN|EXTERNAL|EXTENDED|MAIN)\b/},{b:/\bMATCH\s+(FULL|PARTIAL|SIMPLE)\b/},{b:/\bNULLS\s+(FIRST|LAST)\b/},{b:/\bEVENT\s+TRIGGER\b/},{b:/\b(MAPPING|OR)\s+REPLACE\b/},{b:/\b(FROM|TO)\s+(PROGRAM|STDIN|STDOUT)\b/},{b:/\b(SHARE|EXCLUSIVE)\s+MODE\b/},{b:/\b(LEFT|RIGHT)\s+(OUTER\s+)?JOIN\b/},{b:/\b(FETCH|MOVE)\s+(NEXT|PRIOR|FIRST|LAST|ABSOLUTE|RELATIVE|FORWARD|BACKWARD)\b/},{b:/\bPRESERVE\s+ROWS\b/},{b:/\bDISCARD\s+PLANS\b/},{b:/\bREFERENCING\s+(OLD|NEW)\b/},{b:/\bSKIP\s+LOCKED\b/},{b:/\bGROUPING\s+SETS\b/},{b:/\b(BINARY|INSENSITIVE|SCROLL|NO\s+SCROLL)\s+(CURSOR|FOR)\b/},{b:/\b(WITH|WITHOUT)\s+HOLD\b/},{b:/\bWITH\s+(CASCADED|LOCAL)\s+CHECK\s+OPTION\b/},{b:/\bEXCLUDE\s+(TIES|NO\s+OTHERS)\b/},{b:/\bFORMAT\s+(TEXT|XML|JSON|YAML)\b/},{b:/\bSET\s+((SESSION|LOCAL)\s+)?NAMES\b/},{b:/\bIS\s+(NOT\s+)?UNKNOWN\b/},{b:/\bSECURITY\s+LABEL\b/},{b:/\bSTANDALONE\s+(YES|NO|NO\s+VALUE)\b/},{b:/\bWITH\s+(NO\s+)?DATA\b/},{b:/\b(FOREIGN|SET)\s+DATA\b/},{b:/\bSET\s+(CATALOG|CONSTRAINTS)\b/},{b:/\b(WITH|FOR)\s+ORDINALITY\b/},{b:/\bIS\s+(NOT\s+)?DOCUMENT\b/},{b:/\bXML\s+OPTION\s+(DOCUMENT|CONTENT)\b/},{b:/\b(STRIP|PRESERVE)\s+WHITESPACE\b/},{b:/\bNO\s+(ACTION|MAXVALUE|MINVALUE)\b/},{b:/\bPARTITION\s+BY\s+(RANGE|LIST|HASH)\b/},{b:/\bAT\s+TIME\s+ZONE\b/},{b:/\bGRANTED\s+BY\b/},{b:/\bRETURN\s+(QUERY|NEXT)\b/},{b:/\b(ATTACH|DETACH)\s+PARTITION\b/},{b:/\bFORCE\s+ROW\s+LEVEL\s+SECURITY\b/},{b:/\b(INCLUDING|EXCLUDING)\s+(COMMENTS|CONSTRAINTS|DEFAULTS|IDENTITY|INDEXES|STATISTICS|STORAGE|ALL)\b/},{b:/\bAS\s+(ASSIGNMENT|IMPLICIT|PERMISSIVE|RESTRICTIVE|ENUM|RANGE)\b/}]},{b:/\b(FORMAT|FAMILY|VERSION)\s*\(/},{b:/\bINCLUDE\s*\(/,k:"INCLUDE"},{b:/\bRANGE(?!\s*(BETWEEN|UNBOUNDED|CURRENT|[-0-9]+))/},{b:/\b(VERSION|OWNER|TEMPLATE|TABLESPACE|CONNECTION\s+LIMIT|PROCEDURE|RESTRICT|JOIN|PARSER|COPY|START|END|COLLATION|INPUT|ANALYZE|STORAGE|LIKE|DEFAULT|DELIMITER|ENCODING|COLUMN|CONSTRAINT|TABLE|SCHEMA)\s*=/},{b:/\b(PG_\w+?|HAS_[A-Z_]+_PRIVILEGE)\b/,relevance:10},{b:/\bEXTRACT\s*\(/,e:/\bFROM\b/,rE:!0,k:{type:"CENTURY DAY DECADE DOW DOY EPOCH HOUR ISODOW ISOYEAR MICROSECONDS MILLENNIUM MILLISECONDS MINUTE MONTH QUARTER SECOND TIMEZONE TIMEZONE_HOUR TIMEZONE_MINUTE WEEK YEAR"}},{b:/\b(XMLELEMENT|XMLPI)\s*\(\s*NAME/,k:{keyword:"NAME"}},{b:/\b(XMLPARSE|XMLSERIALIZE)\s*\(\s*(DOCUMENT|CONTENT)/,k:{keyword:"DOCUMENT CONTENT"}},{bK:"CACHE INCREMENT MAXVALUE MINVALUE",e:E.CNR,rE:!0,k:"BY CACHE INCREMENT MAXVALUE MINVALUE"},{cN:"type",b:/\b(WITH|WITHOUT)\s+TIME\s+ZONE\b/},{cN:"type",b:/\bINTERVAL\s+(YEAR|MONTH|DAY|HOUR|MINUTE|SECOND)(\s+TO\s+(MONTH|HOUR|MINUTE|SECOND))?\b/},{b:/\bRETURNS\s+(LANGUAGE_HANDLER|TRIGGER|EVENT_TRIGGER|FDW_HANDLER|INDEX_AM_HANDLER|TSM_HANDLER)\b/,k:{keyword:"RETURNS",type:"LANGUAGE_HANDLER TRIGGER EVENT_TRIGGER FDW_HANDLER INDEX_AM_HANDLER TSM_HANDLER"}},{b:"\\b("+R+")\\s*\\("},{b:"\\.("+A+")\\b"},{b:"\\b("+A+")\\s+PATH\\b",k:{keyword:"PATH",type:N.replace("PATH ","")}},{cN:"type",b:"\\b("+A+")\\b"},{cN:"string",b:"'",e:"'",c:[{b:"''"}]},{cN:"string",b:"(e|E|u&|U&)'",e:"'",c:[{b:"\\\\."}],relevance:10},{b:"\\$([a-zA-Z_]?|[a-zA-Z_][a-zA-Z_0-9]*)\\$",endSameAsBegin:!0,c:[{sL:["pgsql","perl","python","tcl","r","lua","java","php","ruby","bash","scheme","xml","json"],eW:!0}]},{b:'"',e:'"',c:[{b:'""'}]},E.CNM,E.CBCM,T,{cN:"meta",v:[{b:"%(ROW)?TYPE",relevance:10},{b:"\\$\\d+"},{b:"^#\\w",e:"$"}]},{cN:"symbol",b:"<<\\s*[a-zA-Z_][a-zA-Z_0-9$]*\\s*>>",relevance:10}]}});hljs.registerLanguage("scss",function(e){var t="@[a-z-]+",r={cN:"variable",b:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={cN:"number",b:"#[0-9A-Fa-f]+"};e.CSSNM,e.QSM,e.ASM,e.CBCM;return{cI:!0,i:"[=/|']",c:[e.CLCM,e.CBCM,{cN:"selector-id",b:"\\#[A-Za-z0-9_-]+",relevance:0},{cN:"selector-class",b:"\\.[A-Za-z0-9_-]+",relevance:0},{cN:"selector-attr",b:"\\[",e:"\\]",i:"$"},{cN:"selector-tag",b:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{cN:"selector-pseudo",b:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{cN:"selector-pseudo",b:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},r,{cN:"attribute",b:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",i:"[^\\s]"},{b:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{b:":",e:";",c:[r,i,e.CSSNM,e.QSM,e.ASM,{cN:"meta",b:"!important"}]},{b:"@(page|font-face)",l:t,k:"@page @font-face"},{b:"@",e:"[{;]",rB:!0,k:"and or not only",c:[{b:t,cN:"keyword"},r,e.QSM,e.ASM,i,e.CSSNM]}]}});hljs.registerLanguage("apache",function(e){var r={cN:"number",b:"[\\$%]\\d+"};return{aliases:["apacheconf"],cI:!0,c:[e.HCM,{cN:"section",b:""},{cN:"attribute",b:/\w+/,relevance:0,k:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,relevance:0,k:{literal:"on off all"},c:[{cN:"meta",b:"\\s\\[",e:"\\]$"},{cN:"variable",b:"[\\$%]\\{",e:"\\}",c:["self",r]},r,e.QSM]}}],i:/\S/}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},a={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,relevance:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],relevance:0},e.HCM,a,{cN:"",b:/\\"/},{cN:"string",b:/'/,e:/'/},t]}});hljs.registerLanguage("shell",function(s){return{aliases:["console"],c:[{cN:"meta",b:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{e:"$",sL:"bash"}}]}});hljs.registerLanguage("nginx",function(e){var r={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+e.UIR}]},b={eW:!0,l:"[a-z/_]+",k:{literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,i:"=>",c:[e.HCM,{cN:"string",c:[e.BE,r],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{b:"([a-z]+):/",e:"\\s",eW:!0,eE:!0,c:[r]},{cN:"regexp",c:[e.BE,r],v:[{b:"\\s\\^",e:"\\s|{|;",rE:!0},{b:"~\\*?\\s+",e:"\\s|{|;",rE:!0},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},r]};return{aliases:["nginxconf"],c:[e.HCM,{b:e.UIR+"\\s+{",rB:!0,e:"{",c:[{cN:"section",b:e.UIR}],relevance:0},{b:e.UIR+"\\s",e:";|{",rB:!0,c:[{cN:"attribute",b:e.UIR,starts:b}],relevance:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("java",function(e){var a="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",t={cN:"number",b:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0};return{aliases:["jsp"],k:a,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{relevance:0,c:[{b:/\w+@/,relevance:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",relevance:0},{cN:"function",b:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:a,c:[{b:e.UIR+"\\s*\\(",rB:!0,relevance:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:a,relevance:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},t,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("xml",function(e){var c={cN:"symbol",b:"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;"},s={b:"\\s",c:[{cN:"meta-keyword",b:"#?[a-z_][a-z1-9_-]+",i:"\\n"}]},a=e.inherit(s,{b:"\\(",e:"\\)"}),t=e.inherit(e.ASM,{cN:"meta-string"}),l=e.inherit(e.QSM,{cN:"meta-string"}),r={eW:!0,i:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],cI:!0,c:[{cN:"meta",b:"",relevance:10,c:[s,l,t,a,{b:"\\[",e:"\\]",c:[{cN:"meta",b:"",c:[s,a,l,t]}]}]},e.C("\x3c!--","--\x3e",{relevance:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",relevance:10},c,{cN:"meta",b:/<\?xml/,e:/\?>/,relevance:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0},{b:'b"',e:'"',skip:!0},{b:"b'",e:"'",skip:!0},e.inherit(e.ASM,{i:null,cN:null,c:null,skip:!0}),e.inherit(e.QSM,{i:null,cN:null,c:null,skip:!0})]},{cN:"tag",b:")",e:">",k:{name:"style"},c:[r],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:")",e:">",k:{name:"script"},c:[r],starts:{e:"<\/script>",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,relevance:0},r]}]}});hljs.registerLanguage("markdown",function(e){return{aliases:["md","mkdown","mkd"],c:[{cN:"section",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",relevance:0},{cN:"bullet",b:"^\\s*([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",relevance:0}]},{cN:"quote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"^```\\w*\\s*$",e:"^```[ ]*$"},{b:"`.+?`"},{b:"^( {4}|\\t)",e:"$",relevance:0}]},{b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:!0,c:[{cN:"string",b:"\\[",e:"\\]",eB:!0,rE:!0,relevance:0},{cN:"link",b:"\\]\\(",e:"\\)",eB:!0,eE:!0},{cN:"symbol",b:"\\]\\[",e:"\\]",eB:!0,eE:!0}],relevance:10},{b:/^\[[^\n]+\]:/,rB:!0,c:[{cN:"symbol",b:/\[/,e:/\]/,eB:!0,eE:!0},{cN:"link",b:/:\s*/,e:/$/,eB:!0}]}]}});hljs.registerLanguage("properties",function(e){var r="[ \\t\\f]*",t="("+r+"[:=]"+r+"|[ \\t\\f]+)",n="([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",c={e:t,relevance:0,starts:{cN:"string",e:/$/,relevance:0,c:[{b:"\\\\\\n"}]}};return{cI:!0,i:/\S/,c:[e.C("^\\s*[!#]","$"),{b:n+t,rB:!0,c:[{cN:"attr",b:n,endsParent:!0,relevance:0}],starts:c},{b:a+t,rB:!0,relevance:0,c:[{cN:"meta",b:a,endsParent:!0,relevance:0}],starts:c},{cN:"attr",relevance:0,b:a+r+"$"}]}});hljs.registerLanguage("php",function(e){var c={b:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},i={cN:"meta",b:/<\?(php)?|\?>/},t={cN:"string",c:[e.BE,i],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},a={v:[e.BNM,e.CNM]};return{aliases:["php","php3","php4","php5","php6","php7"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[e.HCM,e.C("//","$",{c:[i]}),e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:/<<<['"]?\w+['"]?$/,e:/^\w+;?$/,c:[e.BE,{cN:"subst",v:[{b:/\$\w+/},{b:/\{\$/,e:/\}/}]}]},i,{cN:"keyword",b:/\$this\b/},c,{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",c,e.CBCM,t,a]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},t,a]}});hljs.registerLanguage("asciidoc",function(e){return{aliases:["adoc"],c:[e.C("^/{4,}\\n","\\n/{4,}$",{relevance:10}),e.C("^//","$",{relevance:0}),{cN:"title",b:"^\\.\\w.*$"},{b:"^[=\\*]{4,}\\n",e:"\\n^[=\\*]{4,}$",relevance:10},{cN:"section",relevance:10,v:[{b:"^(={1,5}) .+?( \\1)?$"},{b:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$"}]},{cN:"meta",b:"^:.+?:",e:"\\s",eE:!0,relevance:10},{cN:"meta",b:"^\\[.+?\\]$",relevance:0},{cN:"quote",b:"^_{4,}\\n",e:"\\n_{4,}$",relevance:10},{cN:"code",b:"^[\\-\\.]{4,}\\n",e:"\\n[\\-\\.]{4,}$",relevance:10},{b:"^\\+{4,}\\n",e:"\\n\\+{4,}$",c:[{b:"<",e:">",sL:"xml",relevance:0}],relevance:10},{cN:"bullet",b:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{cN:"symbol",b:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",relevance:10},{cN:"strong",b:"\\B\\*(?![\\*\\s])",e:"(\\n{2}|\\*)",c:[{b:"\\\\*\\w",relevance:0}]},{cN:"emphasis",b:"\\B'(?!['\\s])",e:"(\\n{2}|')",c:[{b:"\\\\'\\w",relevance:0}],relevance:0},{cN:"emphasis",b:"_(?![_\\s])",e:"(\\n{2}|_)",relevance:0},{cN:"string",v:[{b:"``.+?''"},{b:"`.+?'"}]},{cN:"code",b:"(`.+?`|\\+.+?\\+)",relevance:0},{cN:"code",b:"^[ \\t]",e:"$",relevance:0},{b:"^'{3,}[ \\t]*$",relevance:10},{b:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",rB:!0,c:[{b:"(link|image:?):",relevance:0},{cN:"link",b:"\\w",e:"[^\\[]+",relevance:0},{cN:"string",b:"\\[",e:"\\]",eB:!0,eE:!0,relevance:0}],relevance:10}]}});hljs.registerLanguage("makefile",function(e){var i={cN:"variable",v:[{b:"\\$\\("+e.UIR+"\\)",c:[e.BE]},{b:/\$[@%",a="",t={b:/<[A-Za-z0-9\\._:-]+/,e:/\/[A-Za-z0-9\\._:-]+>|\/>/},c="[A-Za-z$_][0-9A-Za-z$_]*",n={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},s={cN:"number",v:[{b:"\\b(0[bB][01]+)n?"},{b:"\\b(0[oO][0-7]+)n?"},{b:e.CNR+"n?"}],relevance:0},o={cN:"subst",b:"\\$\\{",e:"\\}",k:n,c:[]},i={b:"html`",e:"",starts:{e:"`",rE:!1,c:[e.BE,o],sL:"xml"}},b={b:"css`",e:"",starts:{e:"`",rE:!1,c:[e.BE,o],sL:"css"}},l={cN:"string",b:"`",e:"`",c:[e.BE,o]};o.c=[e.ASM,e.QSM,i,b,l,s,e.RM];var u=o.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx","mjs","cjs"],k:n,c:[{cN:"meta",relevance:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,i,b,l,e.CLCM,e.C("/\\*\\*","\\*/",{relevance:0,c:[{cN:"doctag",b:"@[A-Za-z]+",c:[{cN:"type",b:"\\{",e:"\\}",relevance:0},{cN:"variable",b:c+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{b:/(?=[^\n])\s/,relevance:0}]}]}),e.CBCM,s,{b:/[{,\n]\s*/,relevance:0,c:[{b:c+"\\s*:",rB:!0,relevance:0,c:[{cN:"attr",b:c,relevance:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+c+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:c},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:n,c:u}]}]},{cN:"",b:/\s/,e:/\s*/,skip:!0},{v:[{b:r,e:a},{b:t.b,e:t.e}],sL:"xml",c:[{b:t.b,e:t.e,skip:!0,c:["self"]}]}],relevance:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:c}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:u}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor get set",e:/\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.CLCM,e.CBCM],c=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:c,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})].concat(n),i:"\\S"},a={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return c.push(t,a),n.forEach(function(e){c.push(e)}),{c:c,k:i,i:"\\S"}});hljs.registerLanguage("css",function(e){var c={b:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/},{b:/\(/,e:/\)/,c:[e.ASM,e.QSM,e.CSSNM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$",c:[e.ASM,e.QSM]},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"@(page|font-face)",l:"@[a-z-]+",k:"@page @font-face"},{b:"@",e:"[{;]",i:/:/,rB:!0,c:[{cN:"keyword",b:/@\-?\w[\w]*(\-\w+)*/},{b:/\s/,eW:!0,eE:!0,relevance:0,k:"and or not only",c:[{b:/[a-z-]+:/,cN:"attribute"},e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,c]}]}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},c:[{cN:"string",b:"'",e:"'",c:[{b:"''"}]},{cN:"string",b:'"',e:'"',c:[{b:'""'}]},{cN:"string",b:"`",e:"`"},e.CNM,e.CBCM,t,e.HCM]},e.CBCM,t,e.HCM]}});hljs.registerLanguage("http",function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],i:"\\S",c:[{b:"^"+t,e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{b:"^[A-Z]+ (.*?) "+t+"$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0},{b:t},{cN:"keyword",b:"[A-Z]+"}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{e:"$",relevance:0}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",relevance:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\-{3}/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+{3}/,e:/$/},{b:/^\*{15}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}}); \ No newline at end of file diff --git a/static/js/lunr.multi.js b/static/js/lunr.multi.js new file mode 100644 index 000000000..4e921e022 --- /dev/null +++ b/static/js/lunr.multi.js @@ -0,0 +1,79 @@ +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +;(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function () { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* Set up the pipeline for indexing content in multiple languages. The + corresponding lunr.{lang} files must be loaded before calling this + function; English ('en') is built in. + + Returns: a lunr plugin for use in your indexer. + + Known drawback: every word will be stemmed with stemmers for every + language. This could mean that sometimes words that have the same + stemming root will not be stemmed as such. + */ + lunr.multiLanguage = function(/* lang1, lang2, ... */) { + var languages = Array.prototype.slice.call(arguments); + var nameSuffix = languages.join('-'); + var wordCharacters = ""; + var pipeline = []; + var searchPipeline = []; + for (var i = 0; i < languages.length; ++i) { + if (languages[i] == 'en') { + wordCharacters += '\\w'; + pipeline.unshift(lunr.stopWordFilter); + pipeline.push(lunr.stemmer); + searchPipeline.push(lunr.stemmer); + } else { + wordCharacters += lunr[languages[i]].wordCharacters; + if (lunr[languages[i]].stopWordFilter) { + pipeline.unshift(lunr[languages[i]].stopWordFilter); + } + if (lunr[languages[i]].stemmer) { + pipeline.push(lunr[languages[i]].stemmer); + searchPipeline.push(lunr[languages[i]].stemmer); + } + } + }; + var multiTrimmer = lunr.trimmerSupport.generateTrimmer(wordCharacters); + lunr.Pipeline.registerFunction(multiTrimmer, 'lunr-multi-trimmer-' + nameSuffix); + pipeline.unshift(multiTrimmer); + + return function() { + this.pipeline.reset(); + + this.pipeline.add.apply(this.pipeline, pipeline); + + // for lunr version 2 + // this is necessary so that every searched word is also stemmed before + // in lunr <= 1 this is not needed, as it is done using the normal pipeline + if (this.searchPipeline) { + this.searchPipeline.reset(); + this.searchPipeline.add.apply(this.searchPipeline, searchPipeline); + } + }; + } + } +})); diff --git a/static/js/lunr.ru.js b/static/js/lunr.ru.js new file mode 100644 index 000000000..3e7945252 --- /dev/null +++ b/static/js/lunr.ru.js @@ -0,0 +1,391 @@ +/*! + * Lunr languages, `Russian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +; +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function() { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* throw error if lunr is not yet included */ + if ('undefined' === typeof lunr) { + throw new Error('Lunr is not present. Please include / require Lunr before this script.'); + } + + /* throw error if lunr stemmer support is not yet included */ + if ('undefined' === typeof lunr.stemmerSupport) { + throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.'); + } + + /* register specific locale function */ + lunr.ru = function() { + this.pipeline.reset(); + this.pipeline.add( + lunr.ru.trimmer, + lunr.ru.stopWordFilter, + lunr.ru.stemmer + ); + + // for lunr version 2 + // this is necessary so that every searched word is also stemmed before + // in lunr <= 1 this is not needed, as it is done using the normal pipeline + if (this.searchPipeline) { + this.searchPipeline.reset(); + this.searchPipeline.add(lunr.ru.stemmer) + } + }; + + /* lunr trimmer function */ + lunr.ru.wordCharacters = "\u0400-\u0484\u0487-\u052F\u1D2B\u1D78\u2DE0-\u2DFF\uA640-\uA69F\uFE2E\uFE2F"; + lunr.ru.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.ru.wordCharacters); + + lunr.Pipeline.registerFunction(lunr.ru.trimmer, 'trimmer-ru'); + + /* lunr stemmer function */ + lunr.ru.stemmer = (function() { + /* create the wrapped stemmer object */ + var Among = lunr.stemmerSupport.Among, + SnowballProgram = lunr.stemmerSupport.SnowballProgram, + st = new function RussianStemmer() { + var a_0 = [new Among("\u0432", -1, 1), new Among("\u0438\u0432", 0, 2), + new Among("\u044B\u0432", 0, 2), + new Among("\u0432\u0448\u0438", -1, 1), + new Among("\u0438\u0432\u0448\u0438", 3, 2), + new Among("\u044B\u0432\u0448\u0438", 3, 2), + new Among("\u0432\u0448\u0438\u0441\u044C", -1, 1), + new Among("\u0438\u0432\u0448\u0438\u0441\u044C", 6, 2), + new Among("\u044B\u0432\u0448\u0438\u0441\u044C", 6, 2) + ], + a_1 = [ + new Among("\u0435\u0435", -1, 1), new Among("\u0438\u0435", -1, 1), + new Among("\u043E\u0435", -1, 1), new Among("\u044B\u0435", -1, 1), + new Among("\u0438\u043C\u0438", -1, 1), + new Among("\u044B\u043C\u0438", -1, 1), + new Among("\u0435\u0439", -1, 1), new Among("\u0438\u0439", -1, 1), + new Among("\u043E\u0439", -1, 1), new Among("\u044B\u0439", -1, 1), + new Among("\u0435\u043C", -1, 1), new Among("\u0438\u043C", -1, 1), + new Among("\u043E\u043C", -1, 1), new Among("\u044B\u043C", -1, 1), + new Among("\u0435\u0433\u043E", -1, 1), + new Among("\u043E\u0433\u043E", -1, 1), + new Among("\u0435\u043C\u0443", -1, 1), + new Among("\u043E\u043C\u0443", -1, 1), + new Among("\u0438\u0445", -1, 1), new Among("\u044B\u0445", -1, 1), + new Among("\u0435\u044E", -1, 1), new Among("\u043E\u044E", -1, 1), + new Among("\u0443\u044E", -1, 1), new Among("\u044E\u044E", -1, 1), + new Among("\u0430\u044F", -1, 1), new Among("\u044F\u044F", -1, 1) + ], + a_2 = [ + new Among("\u0435\u043C", -1, 1), new Among("\u043D\u043D", -1, 1), + new Among("\u0432\u0448", -1, 1), + new Among("\u0438\u0432\u0448", 2, 2), + new Among("\u044B\u0432\u0448", 2, 2), new Among("\u0449", -1, 1), + new Among("\u044E\u0449", 5, 1), + new Among("\u0443\u044E\u0449", 6, 2) + ], + a_3 = [ + new Among("\u0441\u044C", -1, 1), new Among("\u0441\u044F", -1, 1) + ], + a_4 = [ + new Among("\u043B\u0430", -1, 1), + new Among("\u0438\u043B\u0430", 0, 2), + new Among("\u044B\u043B\u0430", 0, 2), + new Among("\u043D\u0430", -1, 1), + new Among("\u0435\u043D\u0430", 3, 2), + new Among("\u0435\u0442\u0435", -1, 1), + new Among("\u0438\u0442\u0435", -1, 2), + new Among("\u0439\u0442\u0435", -1, 1), + new Among("\u0435\u0439\u0442\u0435", 7, 2), + new Among("\u0443\u0439\u0442\u0435", 7, 2), + new Among("\u043B\u0438", -1, 1), + new Among("\u0438\u043B\u0438", 10, 2), + new Among("\u044B\u043B\u0438", 10, 2), new Among("\u0439", -1, 1), + new Among("\u0435\u0439", 13, 2), new Among("\u0443\u0439", 13, 2), + new Among("\u043B", -1, 1), new Among("\u0438\u043B", 16, 2), + new Among("\u044B\u043B", 16, 2), new Among("\u0435\u043C", -1, 1), + new Among("\u0438\u043C", -1, 2), new Among("\u044B\u043C", -1, 2), + new Among("\u043D", -1, 1), new Among("\u0435\u043D", 22, 2), + new Among("\u043B\u043E", -1, 1), + new Among("\u0438\u043B\u043E", 24, 2), + new Among("\u044B\u043B\u043E", 24, 2), + new Among("\u043D\u043E", -1, 1), + new Among("\u0435\u043D\u043E", 27, 2), + new Among("\u043D\u043D\u043E", 27, 1), + new Among("\u0435\u0442", -1, 1), + new Among("\u0443\u0435\u0442", 30, 2), + new Among("\u0438\u0442", -1, 2), new Among("\u044B\u0442", -1, 2), + new Among("\u044E\u0442", -1, 1), + new Among("\u0443\u044E\u0442", 34, 2), + new Among("\u044F\u0442", -1, 2), new Among("\u043D\u044B", -1, 1), + new Among("\u0435\u043D\u044B", 37, 2), + new Among("\u0442\u044C", -1, 1), + new Among("\u0438\u0442\u044C", 39, 2), + new Among("\u044B\u0442\u044C", 39, 2), + new Among("\u0435\u0448\u044C", -1, 1), + new Among("\u0438\u0448\u044C", -1, 2), new Among("\u044E", -1, 2), + new Among("\u0443\u044E", 44, 2) + ], + a_5 = [ + new Among("\u0430", -1, 1), new Among("\u0435\u0432", -1, 1), + new Among("\u043E\u0432", -1, 1), new Among("\u0435", -1, 1), + new Among("\u0438\u0435", 3, 1), new Among("\u044C\u0435", 3, 1), + new Among("\u0438", -1, 1), new Among("\u0435\u0438", 6, 1), + new Among("\u0438\u0438", 6, 1), + new Among("\u0430\u043C\u0438", 6, 1), + new Among("\u044F\u043C\u0438", 6, 1), + new Among("\u0438\u044F\u043C\u0438", 10, 1), + new Among("\u0439", -1, 1), new Among("\u0435\u0439", 12, 1), + new Among("\u0438\u0435\u0439", 13, 1), + new Among("\u0438\u0439", 12, 1), new Among("\u043E\u0439", 12, 1), + new Among("\u0430\u043C", -1, 1), new Among("\u0435\u043C", -1, 1), + new Among("\u0438\u0435\u043C", 18, 1), + new Among("\u043E\u043C", -1, 1), new Among("\u044F\u043C", -1, 1), + new Among("\u0438\u044F\u043C", 21, 1), new Among("\u043E", -1, 1), + new Among("\u0443", -1, 1), new Among("\u0430\u0445", -1, 1), + new Among("\u044F\u0445", -1, 1), + new Among("\u0438\u044F\u0445", 26, 1), new Among("\u044B", -1, 1), + new Among("\u044C", -1, 1), new Among("\u044E", -1, 1), + new Among("\u0438\u044E", 30, 1), new Among("\u044C\u044E", 30, 1), + new Among("\u044F", -1, 1), new Among("\u0438\u044F", 33, 1), + new Among("\u044C\u044F", 33, 1) + ], + a_6 = [ + new Among("\u043E\u0441\u0442", -1, 1), + new Among("\u043E\u0441\u0442\u044C", -1, 1) + ], + a_7 = [ + new Among("\u0435\u0439\u0448\u0435", -1, 1), + new Among("\u043D", -1, 2), new Among("\u0435\u0439\u0448", -1, 1), + new Among("\u044C", -1, 3) + ], + g_v = [33, 65, 8, 232], + I_p2, I_pV, sbp = new SnowballProgram(); + this.setCurrent = function(word) { + sbp.setCurrent(word); + }; + this.getCurrent = function() { + return sbp.getCurrent(); + }; + + function habr3() { + while (!sbp.in_grouping(g_v, 1072, 1103)) { + if (sbp.cursor >= sbp.limit) + return false; + sbp.cursor++; + } + return true; + } + + function habr4() { + while (!sbp.out_grouping(g_v, 1072, 1103)) { + if (sbp.cursor >= sbp.limit) + return false; + sbp.cursor++; + } + return true; + } + + function r_mark_regions() { + I_pV = sbp.limit; + I_p2 = I_pV; + if (habr3()) { + I_pV = sbp.cursor; + if (habr4()) + if (habr3()) + if (habr4()) + I_p2 = sbp.cursor; + } + } + + function r_R2() { + return I_p2 <= sbp.cursor; + } + + function habr2(a, n) { + var among_var, v_1; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a, n); + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + v_1 = sbp.limit - sbp.cursor; + if (!sbp.eq_s_b(1, "\u0430")) { + sbp.cursor = sbp.limit - v_1; + if (!sbp.eq_s_b(1, "\u044F")) + return false; + } + case 2: + sbp.slice_del(); + break; + } + return true; + } + return false; + } + + function r_perfective_gerund() { + return habr2(a_0, 9); + } + + function habr1(a, n) { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a, n); + if (among_var) { + sbp.bra = sbp.cursor; + if (among_var == 1) + sbp.slice_del(); + return true; + } + return false; + } + + function r_adjective() { + return habr1(a_1, 26); + } + + function r_adjectival() { + var among_var; + if (r_adjective()) { + habr2(a_2, 8); + return true; + } + return false; + } + + function r_reflexive() { + return habr1(a_3, 2); + } + + function r_verb() { + return habr2(a_4, 46); + } + + function r_noun() { + habr1(a_5, 36); + } + + function r_derivational() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_6, 2); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R2() && among_var == 1) + sbp.slice_del(); + } + } + + function r_tidy_up() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_7, 4); + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (!sbp.eq_s_b(1, "\u043D")) + break; + sbp.bra = sbp.cursor; + case 2: + if (!sbp.eq_s_b(1, "\u043D")) + break; + case 3: + sbp.slice_del(); + break; + } + } + } + this.stem = function() { + r_mark_regions(); + sbp.cursor = sbp.limit; + if (sbp.cursor < I_pV) + return false; + sbp.limit_backward = I_pV; + if (!r_perfective_gerund()) { + sbp.cursor = sbp.limit; + if (!r_reflexive()) + sbp.cursor = sbp.limit; + if (!r_adjectival()) { + sbp.cursor = sbp.limit; + if (!r_verb()) { + sbp.cursor = sbp.limit; + r_noun(); + } + } + } + sbp.cursor = sbp.limit; + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(1, "\u0438")) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + } else + sbp.cursor = sbp.limit; + r_derivational(); + sbp.cursor = sbp.limit; + r_tidy_up(); + return true; + } + }; + + /* and return a function that stems a word for the current locale */ + return function(token) { + // for lunr version 2 + if (typeof token.update === "function") { + return token.update(function(word) { + st.setCurrent(word); + st.stem(); + return st.getCurrent(); + }) + } else { // for lunr version <= 1 + st.setCurrent(token); + st.stem(); + return st.getCurrent(); + } + } + })(); + + lunr.Pipeline.registerFunction(lunr.ru.stemmer, 'stemmer-ru'); + + lunr.ru.stopWordFilter = lunr.generateStopWordFilter('алло без близко более больше будем будет будете будешь будто буду будут будь бы бывает бывь был была были было быть в важная важное важные важный вам вами вас ваш ваша ваше ваши вверх вдали вдруг ведь везде весь вниз внизу во вокруг вон восемнадцатый восемнадцать восемь восьмой вот впрочем времени время все всегда всего всем всеми всему всех всею всю всюду вся всё второй вы г где говорил говорит год года году да давно даже далеко дальше даром два двадцатый двадцать две двенадцатый двенадцать двух девятнадцатый девятнадцать девятый девять действительно дел день десятый десять для до довольно долго должно другая другие других друго другое другой е его ее ей ему если есть еще ещё ею её ж же жизнь за занят занята занято заняты затем зато зачем здесь значит и из или им именно иметь ими имя иногда их к каждая каждое каждые каждый кажется как какая какой кем когда кого ком кому конечно которая которого которой которые который которых кроме кругом кто куда лет ли лишь лучше люди м мало между меля менее меньше меня миллионов мимо мира мне много многочисленная многочисленное многочисленные многочисленный мной мною мог могут мож может можно можхо мои мой мор мочь моя моё мы на наверху над надо назад наиболее наконец нам нами нас начала наш наша наше наши не него недавно недалеко нее ней нельзя нем немного нему непрерывно нередко несколько нет нею неё ни нибудь ниже низко никогда никуда ними них ничего но ну нужно нх о об оба обычно один одиннадцатый одиннадцать однажды однако одного одной около он она они оно опять особенно от отовсюду отсюда очень первый перед по под пожалуйста позже пока пор пора после посреди потом потому почему почти прекрасно при про просто против процентов пятнадцатый пятнадцать пятый пять раз разве рано раньше рядом с сам сама сами самим самими самих само самого самой самом самому саму свое своего своей свои своих свою сеаой себе себя сегодня седьмой сейчас семнадцатый семнадцать семь сих сказал сказала сказать сколько слишком сначала снова со собой собою совсем спасибо стал суть т та так такая также такие такое такой там твой твоя твоё те тебе тебя тем теми теперь тех то тобой тобою тогда того тоже только том тому тот тою третий три тринадцатый тринадцать ту туда тут ты тысяч у уж уже уметь хорошо хотеть хоть хотя хочешь часто чаще чего человек чем чему через четвертый четыре четырнадцатый четырнадцать что чтоб чтобы чуть шестнадцатый шестнадцать шестой шесть эта эти этим этими этих это этого этой этом этому этот эту я а'.split(' ')); + + lunr.Pipeline.registerFunction(lunr.ru.stopWordFilter, 'stopWordFilter-ru'); + }; +})) \ No newline at end of file diff --git a/static/js/lunr.stemmer.support.js b/static/js/lunr.stemmer.support.js new file mode 100644 index 000000000..896476a18 --- /dev/null +++ b/static/js/lunr.stemmer.support.js @@ -0,0 +1,304 @@ +/*! + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +;(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function () { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* provides utilities for the included stemmers */ + lunr.stemmerSupport = { + Among: function(s, substring_i, result, method) { + this.toCharArray = function(s) { + var sLength = s.length, charArr = new Array(sLength); + for (var i = 0; i < sLength; i++) + charArr[i] = s.charCodeAt(i); + return charArr; + }; + + if ((!s && s != "") || (!substring_i && (substring_i != 0)) || !result) + throw ("Bad Among initialisation: s:" + s + ", substring_i: " + + substring_i + ", result: " + result); + this.s_size = s.length; + this.s = this.toCharArray(s); + this.substring_i = substring_i; + this.result = result; + this.method = method; + }, + SnowballProgram: function() { + var current; + return { + bra : 0, + ket : 0, + limit : 0, + cursor : 0, + limit_backward : 0, + setCurrent : function(word) { + current = word; + this.cursor = 0; + this.limit = word.length; + this.limit_backward = 0; + this.bra = this.cursor; + this.ket = this.limit; + }, + getCurrent : function() { + var result = current; + current = null; + return result; + }, + in_grouping : function(s, min, max) { + if (this.cursor < this.limit) { + var ch = current.charCodeAt(this.cursor); + if (ch <= max && ch >= min) { + ch -= min; + if (s[ch >> 3] & (0X1 << (ch & 0X7))) { + this.cursor++; + return true; + } + } + } + return false; + }, + in_grouping_b : function(s, min, max) { + if (this.cursor > this.limit_backward) { + var ch = current.charCodeAt(this.cursor - 1); + if (ch <= max && ch >= min) { + ch -= min; + if (s[ch >> 3] & (0X1 << (ch & 0X7))) { + this.cursor--; + return true; + } + } + } + return false; + }, + out_grouping : function(s, min, max) { + if (this.cursor < this.limit) { + var ch = current.charCodeAt(this.cursor); + if (ch > max || ch < min) { + this.cursor++; + return true; + } + ch -= min; + if (!(s[ch >> 3] & (0X1 << (ch & 0X7)))) { + this.cursor++; + return true; + } + } + return false; + }, + out_grouping_b : function(s, min, max) { + if (this.cursor > this.limit_backward) { + var ch = current.charCodeAt(this.cursor - 1); + if (ch > max || ch < min) { + this.cursor--; + return true; + } + ch -= min; + if (!(s[ch >> 3] & (0X1 << (ch & 0X7)))) { + this.cursor--; + return true; + } + } + return false; + }, + eq_s : function(s_size, s) { + if (this.limit - this.cursor < s_size) + return false; + for (var i = 0; i < s_size; i++) + if (current.charCodeAt(this.cursor + i) != s.charCodeAt(i)) + return false; + this.cursor += s_size; + return true; + }, + eq_s_b : function(s_size, s) { + if (this.cursor - this.limit_backward < s_size) + return false; + for (var i = 0; i < s_size; i++) + if (current.charCodeAt(this.cursor - s_size + i) != s + .charCodeAt(i)) + return false; + this.cursor -= s_size; + return true; + }, + find_among : function(v, v_size) { + var i = 0, j = v_size, c = this.cursor, l = this.limit, common_i = 0, common_j = 0, first_key_inspected = false; + while (true) { + var k = i + ((j - i) >> 1), diff = 0, common = common_i < common_j + ? common_i + : common_j, w = v[k]; + for (var i2 = common; i2 < w.s_size; i2++) { + if (c + common == l) { + diff = -1; + break; + } + diff = current.charCodeAt(c + common) - w.s[i2]; + if (diff) + break; + common++; + } + if (diff < 0) { + j = k; + common_j = common; + } else { + i = k; + common_i = common; + } + if (j - i <= 1) { + if (i > 0 || j == i || first_key_inspected) + break; + first_key_inspected = true; + } + } + while (true) { + var w = v[i]; + if (common_i >= w.s_size) { + this.cursor = c + w.s_size; + if (!w.method) + return w.result; + var res = w.method(); + this.cursor = c + w.s_size; + if (res) + return w.result; + } + i = w.substring_i; + if (i < 0) + return 0; + } + }, + find_among_b : function(v, v_size) { + var i = 0, j = v_size, c = this.cursor, lb = this.limit_backward, common_i = 0, common_j = 0, first_key_inspected = false; + while (true) { + var k = i + ((j - i) >> 1), diff = 0, common = common_i < common_j + ? common_i + : common_j, w = v[k]; + for (var i2 = w.s_size - 1 - common; i2 >= 0; i2--) { + if (c - common == lb) { + diff = -1; + break; + } + diff = current.charCodeAt(c - 1 - common) - w.s[i2]; + if (diff) + break; + common++; + } + if (diff < 0) { + j = k; + common_j = common; + } else { + i = k; + common_i = common; + } + if (j - i <= 1) { + if (i > 0 || j == i || first_key_inspected) + break; + first_key_inspected = true; + } + } + while (true) { + var w = v[i]; + if (common_i >= w.s_size) { + this.cursor = c - w.s_size; + if (!w.method) + return w.result; + var res = w.method(); + this.cursor = c - w.s_size; + if (res) + return w.result; + } + i = w.substring_i; + if (i < 0) + return 0; + } + }, + replace_s : function(c_bra, c_ket, s) { + var adjustment = s.length - (c_ket - c_bra), left = current + .substring(0, c_bra), right = current.substring(c_ket); + current = left + s + right; + this.limit += adjustment; + if (this.cursor >= c_ket) + this.cursor += adjustment; + else if (this.cursor > c_bra) + this.cursor = c_bra; + return adjustment; + }, + slice_check : function() { + if (this.bra < 0 || this.bra > this.ket || this.ket > this.limit + || this.limit > current.length) + throw ("faulty slice operation"); + }, + slice_from : function(s) { + this.slice_check(); + this.replace_s(this.bra, this.ket, s); + }, + slice_del : function() { + this.slice_from(""); + }, + insert : function(c_bra, c_ket, s) { + var adjustment = this.replace_s(c_bra, c_ket, s); + if (c_bra <= this.bra) + this.bra += adjustment; + if (c_bra <= this.ket) + this.ket += adjustment; + }, + slice_to : function() { + this.slice_check(); + return current.substring(this.bra, this.ket); + }, + eq_v_b : function(s) { + return this.eq_s_b(s.length, s); + } + }; + } + }; + + lunr.trimmerSupport = { + generateTrimmer: function(wordCharacters) { + var startRegex = new RegExp("^[^" + wordCharacters + "]+") + var endRegex = new RegExp("[^" + wordCharacters + "]+$") + + return function(token) { + // for lunr version 2 + if (typeof token.update === "function") { + return token.update(function (s) { + return s + .replace(startRegex, '') + .replace(endRegex, ''); + }) + } else { // for lunr version 1 + return token + .replace(startRegex, '') + .replace(endRegex, ''); + } + }; + } + } + } +})); diff --git a/static/js/search.js b/static/js/search.js new file mode 100644 index 000000000..338fbd434 --- /dev/null +++ b/static/js/search.js @@ -0,0 +1,99 @@ +var lunrIndex, pagesIndex; +//require('./lunr.stemmer.support.js')(lunr); +//require('./lunr.ru.js')(lunr); +//require('./lunr.multi.js')(lunr); + +function endsWith(str, suffix) { + return str.indexOf(suffix, str.length - suffix.length) !== -1; +} + +// Initialize lunrjs using our generated index file +function initLunr() { + // add slash to the end of baseurl (defined at search.html) + if (!endsWith(baseurl,"/")){ + baseurl = baseurl+'/' + }; + + // First retrieve the index file + $.getJSON(baseurl +"index.json") + .done(function(index) { + pagesIndex = index; + // Set up lunrjs by declaring the fields we use + // Also provide their boost level for the ranking + lunrIndex = lunr(function() { + //custom: add multilanguage support + this.use(lunr.multiLanguage('en', 'ru')); + this.ref("uri"); + this.field('title', { + boost: 15 + }); + this.field('tags', { + boost: 10 + }); + this.field("content", { + boost: 5 + }); + + this.pipeline.remove(lunr.stemmer); + this.searchPipeline.remove(lunr.stemmer); + + // Feed lunr with each file and let lunr actually index them + pagesIndex.forEach(function(page) { + this.add(page); + }, this); + }) + }) + .fail(function(jqxhr, textStatus, error) { + var err = textStatus + ", " + error; + console.error("Error getting Hugo index file:", err); + }); +} + +/** + * Trigger a search in lunr and transform the result + * + * @param {String} query + * @return {Array} results + */ +function search(queryTerm) { + // Find the item in our index corresponding to the lunr one to have more info + return lunrIndex.search(queryTerm+"^100"+" "+queryTerm+"*^10"+" "+"*"+queryTerm+"^10"+" "+queryTerm+"~2^1").map(function(result) { + return pagesIndex.filter(function(page) { + return page.uri === result.ref; + })[0]; + }); +} + +// Let's get started +initLunr(); +$( document ).ready(function() { + var searchList = new autoComplete({ + /* selector for the search box element */ + selector: $("#search-by").get(0), + /* source is the callback to perform the search */ + source: function(term, response) { + response(search(term)); + }, + /* renderItem displays individual search results */ + renderItem: function(item, term) { + var numContextWords = 2; + var text = item.content.match( + "(?:\\s?(?:[\\w]+)\\s?){0,"+numContextWords+"}" + + term+"(?:\\s?(?:[\\w]+)\\s?){0,"+numContextWords+"}"); + item.context = text; + return '
' + + '» ' + item.title + + '
' + + (item.context || '') +'
' + + '
'; + }, + /* onSelect callback fires when a search suggestion is chosen */ + onSelect: function(e, term, item) { + location.href = item.getAttribute('data-uri'); + } + }); +}); diff --git a/themes/hugo-theme-learn/.editorconfig b/themes/hugo-theme-learn/.editorconfig new file mode 100644 index 000000000..12f0ef580 --- /dev/null +++ b/themes/hugo-theme-learn/.editorconfig @@ -0,0 +1,16 @@ +# https://editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +trim_trailing_whitespace = true + +[*.js] +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/themes/hugo-theme-learn/.gitignore b/themes/hugo-theme-learn/.gitignore new file mode 100644 index 000000000..64297518e --- /dev/null +++ b/themes/hugo-theme-learn/.gitignore @@ -0,0 +1,3 @@ +.DS_Store +public/ +exampleSite/public diff --git a/themes/hugo-theme-learn/.grenrc.yml b/themes/hugo-theme-learn/.grenrc.yml new file mode 100644 index 000000000..ad31ac817 --- /dev/null +++ b/themes/hugo-theme-learn/.grenrc.yml @@ -0,0 +1,25 @@ +--- + dataSource: "prs" + prefix: "v" + onlyMilestones: false + changelogFilename: "CHANGELOG.md" + includeMessages: "all" + ignoreIssuesWith: + - "support" + ignoreLabels: + - "duplicate" + - "invalid" + - "wontfix" + groupBy: + New features: + - "feature" + Bug Fixes: + - "bug" + Enhancements: + - "enhancement" + Internationalisation: + - "i18n" + Theme Meta: + - "meta" + Uncategorised: + - "closed" diff --git a/themes/hugo-theme-learn/CHANGELOG.md b/themes/hugo-theme-learn/CHANGELOG.md new file mode 100644 index 000000000..caeaa9b26 --- /dev/null +++ b/themes/hugo-theme-learn/CHANGELOG.md @@ -0,0 +1,182 @@ +# Changelog + +## v2.4.0 (04/09/2019) + +#### Bug Fixes + +- [**bug**] correct GitHub capitalization [#293](https://github.com/matcornic/hugo-theme-learn/pull/293) +- [**bug**] Remove reference to the unused horsey CSS [#284](https://github.com/matcornic/hugo-theme-learn/pull/284) +- [**bug**] Fix invalid HTML in 404 template. [#271](https://github.com/matcornic/hugo-theme-learn/pull/271) +- [**bug**] fix 'locate' typo [#285](https://github.com/matcornic/hugo-theme-learn/pull/285) + +#### Enhancements + +- [**enhancement**] Delete html5shiv-printshiv.min.js [#319](https://github.com/matcornic/hugo-theme-learn/pull/319) +- [**enhancement**] remove html5shiv [#315](https://github.com/matcornic/hugo-theme-learn/pull/315) +- [**enhancement**] Fix deprecated .Hugo, .UniqueID and .URL references [#303](https://github.com/matcornic/hugo-theme-learn/pull/303) +- [**enhancement**] remove unneeded type="text/css" [#297](https://github.com/matcornic/hugo-theme-learn/pull/297) +- [**enhancement**] Fix type lines 364 and 369 [#304](https://github.com/matcornic/hugo-theme-learn/pull/304) +- [**enhancement**] remove unneeded type="text/css" [#298](https://github.com/matcornic/hugo-theme-learn/pull/298) +- [**enhancement**] HTTPS links in footer [#295](https://github.com/matcornic/hugo-theme-learn/pull/295) +- [**enhancement**] remove unneeded type="text/css" [#292](https://github.com/matcornic/hugo-theme-learn/pull/292) +- [**enhancement**] Make shortcodes & example site compatible with Hugo v0.55 [#281](https://github.com/matcornic/hugo-theme-learn/pull/281) + +#### Internationalisation + +- [**i18n**] Added German and Arabic translation [#312](https://github.com/matcornic/hugo-theme-learn/pull/312) + +--- + +## v2.3.0 (16/04/2019) + +#### New features + +- [**feature**] Added support for tags [#196](https://github.com/matcornic/hugo-theme-learn/pull/196) + +#### Bug Fixes + +- [**bug**] Fix issue where "children" shortcode only shows top level. [#252](https://github.com/matcornic/hugo-theme-learn/pull/252) +- [**bug**] Fix translation when using a custom baseURL [#234](https://github.com/matcornic/hugo-theme-learn/pull/234) +- [**bug**] Preventing left/right arrow key navigation in textareas [#241](https://github.com/matcornic/hugo-theme-learn/pull/241) +- [**bug**] Update menu.html to include the check icon [#229](https://github.com/matcornic/hugo-theme-learn/pull/229) + +#### Enhancements + +- [**enhancement**] Render the ```mermaid blocks into graphs [#226](https://github.com/matcornic/hugo-theme-learn/pull/226) +- [**enhancement**] Remove oudated versions of jquery & modernizr libraries [#259](https://github.com/matcornic/hugo-theme-learn/pull/259) +- [**enhancement**] Various Updates [#237](https://github.com/matcornic/hugo-theme-learn/pull/237) +- [**enhancement**] Use style instead of width and height in logo [#250](https://github.com/matcornic/hugo-theme-learn/pull/250) +- [**enhancement**] [ImgBot] Optimize images [#222](https://github.com/matcornic/hugo-theme-learn/pull/222) +- [**enhancement**] remove duplicate icon and fix incorrect favicon type [#227](https://github.com/matcornic/hugo-theme-learn/pull/227) +- [**enhancement**] HTTPS links in exampleSite menu-footer [#223](https://github.com/matcornic/hugo-theme-learn/pull/223) + +#### Internationalisation + +- [**i18n**] Dutch i18n [#239](https://github.com/matcornic/hugo-theme-learn/pull/239) + +#### Theme Meta + +- [**meta**] Add .editorconfig [#224](https://github.com/matcornic/hugo-theme-learn/pull/224) + +--- + +## v2.2.0 (28/01/2019) + +#### New features + +- [**feature**] Sitewide param to enable or disable next/previous page buttons and breadcrumbs [#184](https://github.com/matcornic/hugo-theme-learn/pull/184) + +#### Bug Fixes + +- [**bug**] Fix baseurl used by search to load json data [#177](https://github.com/matcornic/hugo-theme-learn/pull/177) +- [**bug**] Updated CSS link to fontawesome library [#186](https://github.com/matcornic/hugo-theme-learn/pull/186) +- [**bug**] Close / Cancel search icon not showing in input box [#215](https://github.com/matcornic/hugo-theme-learn/pull/215) +- [**bug**] Prevent left and right keydown events while in input fields [#219](https://github.com/matcornic/hugo-theme-learn/pull/219) +- [**bug**] xss fix [#182](https://github.com/matcornic/hugo-theme-learn/pull/182) +- [**bug**] Fix error in blockquote documentation fixes #165 [#190](https://github.com/matcornic/hugo-theme-learn/pull/190) + +#### Enhancements + +- [**enhancement**] Update mermaid.js to a499296 [#199](https://github.com/matcornic/hugo-theme-learn/pull/199) +- [**enhancement**] Update Font Awesome to 5.0.6 [#129](https://github.com/matcornic/hugo-theme-learn/pull/129) +- [**enhancement**] Update 404.html alttext [#161](https://github.com/matcornic/hugo-theme-learn/pull/161) +- [**enhancement**] Remove CSS source map metadata [#167](https://github.com/matcornic/hugo-theme-learn/pull/167) +- [**enhancement**] Load github images in examplesite via https instead of http [#180](https://github.com/matcornic/hugo-theme-learn/pull/180) +- [**enhancement**] Load main site logo via BaseUrl [#185](https://github.com/matcornic/hugo-theme-learn/pull/185) +- [**enhancement**] HTTPS links in examplesite sidebar [#200](https://github.com/matcornic/hugo-theme-learn/pull/200) +- [**enhancement**] Use correct input type for search [#205](https://github.com/matcornic/hugo-theme-learn/pull/205) +- [**enhancement**] HTTPS link to learn.getgrav.org [#207](https://github.com/matcornic/hugo-theme-learn/pull/207) +- [**enhancement**] Update html5shiv-printshiv.min.js [#208](https://github.com/matcornic/hugo-theme-learn/pull/208) +- [**enhancement**] Remove whitespace from clippy.svg [#211](https://github.com/matcornic/hugo-theme-learn/pull/211) +- [**enhancement**] Upgrade fontawesome to 5.6.3 [#218](https://github.com/matcornic/hugo-theme-learn/pull/218) +- [**enhancement**] fix clickable nodes style in mermaid [#169](https://github.com/matcornic/hugo-theme-learn/pull/169) + +#### Internationalisation + +- [**i18n**] French language correction [#157](https://github.com/matcornic/hugo-theme-learn/pull/157) +- [**i18n**] French language correction [#158](https://github.com/matcornic/hugo-theme-learn/pull/158) +- [**i18n**] Add indonesian translation [#159](https://github.com/matcornic/hugo-theme-learn/pull/159) +- [**i18n**] Add Turkish i18n config file [#175](https://github.com/matcornic/hugo-theme-learn/pull/175) + +#### Theme Meta + +- [**meta**] Fix wercker builds [#178](https://github.com/matcornic/hugo-theme-learn/pull/178) +- [**meta**] Declare netlify buildsteps in repo file rather than in webui [#217](https://github.com/matcornic/hugo-theme-learn/pull/217) + +--- + +## v2.1.0 (10/08/2018) + +#### Internationalisation + +- [**i18n**] Clean up the English language phrasing [#146](https://github.com/matcornic/hugo-theme-learn/pull/146) +- [**i18n**] Updated _index.en.md for typo "names" [#150](https://github.com/matcornic/hugo-theme-learn/pull/150) + +#### Theme Meta + +- [**meta**] Add license scan report and status [#151](https://github.com/matcornic/hugo-theme-learn/pull/151) + +#### Uncategorised + +- [**closed**] Different viewport [#122](https://github.com/matcornic/hugo-theme-learn/pull/122) +- [**closed**] TranslationBaseName replaced for Name on archetypes template [#145](https://github.com/matcornic/hugo-theme-learn/pull/145) +- [**closed**] Improved variant of #119, as per request [#124](https://github.com/matcornic/hugo-theme-learn/pull/124) +- [**closed**] role="" is invalid [#121](https://github.com/matcornic/hugo-theme-learn/pull/121) +- [**closed**] Related to previous PR [#120](https://github.com/matcornic/hugo-theme-learn/pull/120) +- [**closed**] Issue #111 for _index.fr.md [#117](https://github.com/matcornic/hugo-theme-learn/pull/117) +- [**closed**] Issue #111 for _index.en.md [#116](https://github.com/matcornic/hugo-theme-learn/pull/116) +- [**closed**] Issue #111 for theme-green.css [#114](https://github.com/matcornic/hugo-theme-learn/pull/114) +- [**closed**] Issue #111 for theme-red.css [#113](https://github.com/matcornic/hugo-theme-learn/pull/113) +- [**closed**] Issue #111 for theme-blue.css [#112](https://github.com/matcornic/hugo-theme-learn/pull/112) +- [**closed**] Issue #111 for theme-mine.css [#115](https://github.com/matcornic/hugo-theme-learn/pull/115) +- [**closed**] fix #77 : no wrap images that already wrapped [#118](https://github.com/matcornic/hugo-theme-learn/pull/118) +- [**closed**] doc: Keep icons aligned [#110](https://github.com/matcornic/hugo-theme-learn/pull/110) +- [**closed**] Add Portuguese translation [#109](https://github.com/matcornic/hugo-theme-learn/pull/109) +- [**closed**] Use `relURL` where possible [#102](https://github.com/matcornic/hugo-theme-learn/pull/102) +- [**closed**] Bug fix in sidebar menu and children description generation [#105](https://github.com/matcornic/hugo-theme-learn/pull/105) +- [**closed**] fix some typo [#104](https://github.com/matcornic/hugo-theme-learn/pull/104) +- [**closed**] Added a `menuTitle` attribute to partials/menu.html [#90](https://github.com/matcornic/hugo-theme-learn/pull/90) +- [**closed**] allowing comments system [#86](https://github.com/matcornic/hugo-theme-learn/pull/86) +- [**closed**] Add spanish translation [#85](https://github.com/matcornic/hugo-theme-learn/pull/85) +- [**closed**] Replace horsey with Pixabay's autocomplete [#75](https://github.com/matcornic/hugo-theme-learn/pull/75) +- [**closed**] Added info about 'draft:true' [#74](https://github.com/matcornic/hugo-theme-learn/pull/74) +- [**closed**] Remove white space from `align` parameter [#63](https://github.com/matcornic/hugo-theme-learn/pull/63) + +--- + +## v2.0.0 (20/08/2017) + +#### Uncategorised + +- [**closed**] V2 [#56](https://github.com/matcornic/hugo-theme-learn/pull/56) + +--- + +## v1.1.0 (22/07/2017) + +#### Bug Fixes + +- [**bug**] Fix sticky header jumpiness [#45](https://github.com/matcornic/hugo-theme-learn/pull/45) + +#### Uncategorised + +- [**closed**] feat: Change the default code color [#43](https://github.com/matcornic/hugo-theme-learn/pull/43) +- [**closed**] Use index pages + automatic navigation arrows [#36](https://github.com/matcornic/hugo-theme-learn/pull/36) +- [**closed**] Fix anchor scrolling that hides behind top nav bar [#46](https://github.com/matcornic/hugo-theme-learn/pull/46) + +--- + +## v1.0.0 (25/03/2017) + +#### Uncategorised + +- [**closed**] Extracted menu footer content to separate partial file [#35](https://github.com/matcornic/hugo-theme-learn/pull/35) +- [**closed**] feat: style Hugo figure shortcode [#33](https://github.com/matcornic/hugo-theme-learn/pull/33) +- [**closed**] Fix URL for 'Edit this page' on Windows [#27](https://github.com/matcornic/hugo-theme-learn/pull/27) +- [**closed**] Revert "Menu generation using Content file instead directories" [#10](https://github.com/matcornic/hugo-theme-learn/pull/10) +- [**closed**] (#25) use .Site.BaseURL to lcoate static assets [#26](https://github.com/matcornic/hugo-theme-learn/pull/26) +- [**closed**] Menu ordering and definition in config.toml [#8](https://github.com/matcornic/hugo-theme-learn/pull/8) +- [**closed**] Menu generation using Content file instead directories [#5](https://github.com/matcornic/hugo-theme-learn/pull/5) +- [**closed**] Add Checkmark On visited Links [#4](https://github.com/matcornic/hugo-theme-learn/pull/4) +- [**closed**] doc: Add theme installation instructions [#1](https://github.com/matcornic/hugo-theme-learn/pull/1) +- [**closed**] Search [#18](https://github.com/matcornic/hugo-theme-learn/pull/18) diff --git a/themes/hugo-theme-learn/README.md b/themes/hugo-theme-learn/README.md index 538c52635..3e0801e9c 100644 --- a/themes/hugo-theme-learn/README.md +++ b/themes/hugo-theme-learn/README.md @@ -1,14 +1,12 @@ - -# SuiteDocs - -A repo to try out SuiteCRM Documentation with Hugo and Netlify. -======= # Hugo Learn Theme -This repository contains a theme for [Hugo](https://gohugo.io/), based on great [Grav Learn Theme](http://learn.getgrav.org/). +This repository contains a theme for [Hugo](https://gohugo.io/), based on great [Grav Learn Theme](https://learn.getgrav.org/). Visit the [theme documentation](https://learn.netlify.com/en/) to see what is going on. It is actually built with this theme. +[![wercker status](https://app.wercker.com/status/233466a2be73fcea400e7dc02ef6adf9/s/master "wercker status")](https://app.wercker.com/project/byKey/233466a2be73fcea400e7dc02ef6adf9) +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fmatcornic%2Fhugo-theme-learn.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fmatcornic%2Fhugo-theme-learn?ref=badge_shield) + ## Main features - Automatic Search @@ -26,9 +24,9 @@ Visit the [theme documentation](https://learn.netlify.com/en/) to see what is go Navigate to your themes folder in your Hugo site and use the following commands: -``` -$ cd themes -$ git clone https://github.com/matcornic/hugo-theme-learn.git +```shell +cd themes/ +git clone https://github.com/matcornic/hugo-theme-learn.git ``` Check that your Hugo version is minimum `0.25` with `hugo version`. @@ -56,3 +54,44 @@ For both solutions, the documentation is available at https://github.com/matcorn ## Credits Many thanks to [@vjeantet](https://github.com/vjeantet/) for the fork [docdock](https://github.com/vjeantet/hugo-theme-docdock). The v2 of this theme is mainly based on his work ! + +## License + +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fmatcornic%2Fhugo-theme-learn.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fmatcornic%2Fhugo-theme-learn?ref=badge_large) + +## Releasing + +Somewhat work-in-progress steps to release with [gren](https://github.com/github-tools/github-release-notes) + +- Check all MRs assigned to the milestone are closed or pushed back to another release +- Close the milestone +- Check merged MRs on the milestone have a tag (Bug, Enhancement, etc.) +- Tag and push the repo + + ```shell + git tag + git push origin + ``` + +- Generate CHANGELOG.md with _gren_ + + ```shell + gren changelog --override --generate --tags=all + ``` + +- Fix the date for the current release in CHANGELOG.md +- Add the changelog to git and update the tag + + ```shell + git add CHANGELOG.md + git commit -m "Ship tag " + git push origin master + git tag -f + git push --force origin + ``` + +- Generate release with _gren_ + + ```shell + gren release -t + ``` diff --git a/themes/hugo-theme-learn/archetypes/chapter.md b/themes/hugo-theme-learn/archetypes/chapter.md index 240b6524f..a29ba1bd4 100644 --- a/themes/hugo-theme-learn/archetypes/chapter.md +++ b/themes/hugo-theme-learn/archetypes/chapter.md @@ -1,5 +1,5 @@ +++ -title = "{{ replace .TranslationBaseName "-" " " | title }}" +title = "{{ replace .Name "-" " " | title }}" date = {{ .Date }} weight = 5 chapter = true diff --git a/themes/hugo-theme-learn/archetypes/default.md b/themes/hugo-theme-learn/archetypes/default.md index 12ea33225..5124e2a77 100644 --- a/themes/hugo-theme-learn/archetypes/default.md +++ b/themes/hugo-theme-learn/archetypes/default.md @@ -1,14 +1,7 @@ ---- -title = "{{ replace .TranslationBaseName "-" " " | title }}" -date = {{ .Date }} -description = "" -categories = [] -keywords = [] -slug = "" -aliases = [] -toc = false -draft = true ++++ +title = "{{ replace .Name "-" " " | title }}" +date = {{ .Date }} weight = 5 ---- ++++ -Add your content here. +Lorem Ipsum. \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/LICENSE.md b/themes/hugo-theme-learn/exampleSite/LICENSE.md new file mode 100644 index 000000000..973626de8 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/LICENSE.md @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2016 MATHIEU CORNIC + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/themes/hugo-theme-learn/exampleSite/config.toml b/themes/hugo-theme-learn/exampleSite/config.toml new file mode 100644 index 000000000..9fa84e128 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/config.toml @@ -0,0 +1,102 @@ +baseURL = "/" +languageCode = "en-US" +defaultContentLanguage = "en" + +title = "Hugo Learn Documentation" +theme = "hugo-theme-learn" +themesdir = "../.." +metaDataFormat = "yaml" +defaultContentLanguageInSubdir= true + +[params] + editURL = "https://github.com/matcornic/hugo-theme-learn/edit/master/exampleSite/content/" + description = "Documentation for Hugo Learn Theme" + author = "Mathieu Cornic" + showVisitedLinks = true + disableBreadcrumb = false + disableNextPrev = false + +[outputs] +home = [ "HTML", "RSS", "JSON"] + +[Languages] +[Languages.en] +title = "Documentation for Hugo Learn Theme" +weight = 1 +languageName = "English" + +[[Languages.en.menu.shortcuts]] +name = " GitHub repo" +identifier = "ds" +url = "https://github.com/matcornic/hugo-theme-learn" +weight = 10 + +[[Languages.en.menu.shortcuts]] +name = " Showcases" +url = "showcase" +weight = 11 + +[[Languages.en.menu.shortcuts]] +name = " Hugo Documentation" +identifier = "hugodoc" +url = "https://gohugo.io/" +weight = 20 + +[[Languages.en.menu.shortcuts]] +name = " Credits" +url = "/credits" +weight = 30 + +[Languages.fr] +title = "Documentation du thème Hugo Learn" +weight = 2 +languageName = "Français" + +[[Languages.fr.menu.shortcuts]] +name = " Repo GitHub" +identifier = "ds" +url = "https://github.com/matcornic/hugo-theme-learn" +weight = 10 + +[[Languages.fr.menu.shortcuts]] +name = " Vitrine" +url = "/showcase" +weight = 11 + +[[Languages.fr.menu.shortcuts]] +name = " Documentation Hugo" +identifier = "hugodoc" +url = "https://gohugo.io/" +weight = 20 + +[[Languages.fr.menu.shortcuts]] +name = " Crédits" +url = "/credits" +weight = 30 + +[Languages.zh] +title = "Hugo 主题的 Learn 文档" +weight = 3 +languageName = "简体中文" + +[[Languages.zh.menu.shortcuts]] +name = " GitHub 仓库" +identifier = "ds" +url = "https://github.com/matcornic/hugo-theme-learn" +weight = 10 + +[[Languages.zh.menu.shortcuts]] +name = " 展示区" +url = "/showcase" +weight = 11 + +[[Languages.zh.menu.shortcuts]] +name = " Hugo 文档" +identifier = "hugodoc" +url = "https://gohugo.io/" +weight = 20 + +[[Languages.zh.menu.shortcuts]] +name = " 鸣谢" +url = "/credits" +weight = 30 diff --git a/themes/hugo-theme-learn/exampleSite/content/_index.en.md b/themes/hugo-theme-learn/exampleSite/content/_index.en.md new file mode 100644 index 000000000..a36357957 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/_index.en.md @@ -0,0 +1,41 @@ +--- +title: "Learn Theme for Hugo" +--- + +# Hugo learn theme + +[Hugo-theme-learn](http://github.com/matcornic/hugo-theme-learn) is a theme for [Hugo](https://gohugo.io/), a fast and modern static website engine written in Go. Where Hugo is often used for blogs, this multilingual-ready theme is **fully designed for documentation**. + +This theme is a partial porting of the [Learn theme](http://learn.getgrav.org/) of [Grav](https://getgrav.org/), a modern flat-file CMS written in PHP. + +{{% notice tip %}}Learn theme works with a _page tree structure_ to organize content : All contents are pages, which belong to other pages. [read more about this]({{%relref "cont/pages/_index.md"%}}) +{{% /notice %}} + +## Main features + +* [Automatic Search]({{%relref "basics/configuration/_index.md#activate-search" %}}) +* [Multilingual mode]({{%relref "cont/i18n/_index.md" %}}) +* **Unlimited menu levels** +* **Automatic next/prev buttons to navigate through menu entries** +* [Image resizing, shadow...]({{%relref "cont/markdown.en.md#images" %}}) +* [Attachments files]({{%relref "shortcodes/attachments.en.md" %}}) +* [List child pages]({{%relref "shortcodes/children/_index.md" %}}) +* [Mermaid diagram]({{%relref "shortcodes/mermaid.en.md" %}}) (flowchart, sequence, gantt) +* [Customizable look and feel and themes variants]({{%relref "basics/style-customization/_index.md"%}}) +* [Buttons]({{%relref "shortcodes/button.en.md" %}}), [Tip/Note/Info/Warning boxes]({{%relref "shortcodes/notice.en.md" %}}), [Expand]({{%relref "shortcodes/expand.en.md" %}}) + +![Screenshot](https://github.com/matcornic/hugo-theme-learn/raw/master/images/screenshot.png?width=40pc&classes=shadow) + +## Contribute to this documentation +Feel free to update this content, just click the **Edit this page** link displayed on top right of each page, and pullrequest it + +{{% notice info %}} +Your modification will be deployed automatically when merged. +{{% /notice %}} + +## Documentation website +This current documentation has been statically generated with Hugo with a simple command : `hugo -t hugo-theme-learn` -- source code is [available here at GitHub](https://github.com/matcornic/hugo-theme-learn) + +{{% notice note %}} +Automatically published and hosted thanks to [Netlify](https://www.netlify.com/). Read more about [Automated HUGO deployments with Netlify](https://www.netlify.com/blog/2015/07/30/hosting-hugo-on-netlifyinsanely-fast-deploys/) +{{% /notice %}} \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/_index.fr.md b/themes/hugo-theme-learn/exampleSite/content/_index.fr.md new file mode 100644 index 000000000..40b2dc352 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/_index.fr.md @@ -0,0 +1,43 @@ +--- +title: "Learn Theme for Hugo" +--- + +# Thème Hugo learn + +[Hugo-theme-learn](http://github.com/matcornic/hugo-theme-learn) est un thème pour [Hugo](https://gohugo.io/), un générateur de site statique, rapide et modern, écrit en Go. Tandis que Hugo est souvent utilisé pour des blogs, ce thème multi-langue est **entièrement conçu pour la documentation**. + +Ce thème est un portage partiel du [thème Learn](http://learn.getgrav.org/) de [Grav](https://getgrav.org/), un CMS modern écrit en PHP. + +{{% notice tip %}}Le thème Learn fonctionne grâce à la structure de page aborescentes pour organiser le contenu: tous les contenus sont des pages qui appartiennent à d'autres pages. [Plus d'infos]({{%relref "cont/pages/_index.md"%}}) +{{% /notice %}} + +## Fonctionnalités principales + +* [Recherche automatique]({{%relref "basics/configuration/_index.md#activer-recherche" %}}) +* [Mode multi-langue]({{%relref "cont/i18n/_index.md" %}}) +* **Nombre de niveau infini dans le menu** +* **Boutons suivant/précédent automatiquement générés pour naviguer entre les items du menu** +* [Taille d'image, ombres...]({{%relref "cont/markdown.fr.md#images" %}}) +* [Fichiers joints]({{%relref "shortcodes/attachments.fr.md" %}}) +* [Lister les pages filles]({{%relref "shortcodes/children/_index.md" %}}) +* [Diagrammes Mermaid]({{%relref "shortcodes/mermaid.fr.md" %}}) (flowchart, sequence, gantt) +* [Style configurable and variantes de couleurs]({{%relref "basics/style-customization/_index.md"%}}) +* [Boutons]({{%relref "shortcodes/button.fr.md" %}}), [Messages Astuce/Note/Info/Attention]({{%relref "shortcodes/notice.fr.md" %}}), [Expand]({{%relref "shortcodes/expand.fr.md" %}}) + +![Screenshot](https://github.com/matcornic/hugo-theme-learn/raw/master/images/screenshot.png?width=40pc&classes=shadow) + +## Contribuer à cette documentation + +N'hésitez pas à mettre à jour ce contenu en cliquant sur le lien **Modifier cette page** en haut de chaque page, et créer la Pull Request associée. + +{{% notice info %}} +Votre modification sera déployée automatiquement quand elle sera mergée. +{{% /notice %}} + +## Site de documentation + +Cette documentation statique a été générée avec Hugo avec une simple commande : `hugo -t hugo-theme-learn` -- le code source est [disponible sur Github](https://github.com/matcornic/hugo-theme-learn) + +{{% notice note %}} +Le site est auomatiquement publié et hébergé par [Netlify](https://www.netlify.com/). Plus d'infos sur le [déploiement de site Hugo avec Netlify](https://www.netlify.com/blog/2015/07/30/hosting-hugo-on-netlifyinsanely-fast-deploys/)(En anglais) +{{% /notice %}} diff --git a/themes/hugo-theme-learn/exampleSite/content/basics/_index.en.md b/themes/hugo-theme-learn/exampleSite/content/basics/_index.en.md new file mode 100755 index 000000000..56e2968e2 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/basics/_index.en.md @@ -0,0 +1,12 @@ +--- +title: Basics +weight: 5 +pre: "1. " +chapter: true +--- + +### Chapter 1 + +# Basics + +Discover what this Hugo theme is all about and the core-concepts behind it. diff --git a/themes/hugo-theme-learn/exampleSite/content/basics/_index.fr.md b/themes/hugo-theme-learn/exampleSite/content/basics/_index.fr.md new file mode 100644 index 000000000..1b800c905 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/basics/_index.fr.md @@ -0,0 +1,12 @@ +--- +title: Démarrage +weight: 5 +pre: "1. " +chapter: true +--- + +### Chapitre 1 + +# Démarrage + +Découvrez comment utiliser ce thème Hugo et apprenez-en les concepts diff --git a/themes/hugo-theme-learn/exampleSite/content/basics/_index.zh.md b/themes/hugo-theme-learn/exampleSite/content/basics/_index.zh.md new file mode 100755 index 000000000..6c5d5dacc --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/basics/_index.zh.md @@ -0,0 +1,12 @@ +--- +title: 基础 +weight: 5 +pre: "1. " +chapter: true +--- + +### 章节 1 + +# 基础 + +了解该 Hugo 主题的特点以及背后的核心概念。 diff --git a/themes/hugo-theme-learn/exampleSite/content/basics/configuration/_index.en.md b/themes/hugo-theme-learn/exampleSite/content/basics/configuration/_index.en.md new file mode 100644 index 000000000..e56f84b75 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/basics/configuration/_index.en.md @@ -0,0 +1,58 @@ +--- +date: 2016-04-09T16:50:16+02:00 +title: Configuration +weight: 20 +--- + +## Global site parameters + +On top of [Hugo global configuration](https://gohugo.io/overview/configuration/), **Hugo-theme-learn** lets you define the following parameters in your `config.toml` (here, values are default). + +Note that some of these parameters are explained in details in other sections of this documentation. + +```toml +[params] + # Prefix URL to edit current page. Will display an "Edit this page" button on top right hand corner of every page. + # Useful to give opportunity to people to create merge request for your doc. + # See the config.toml file from this documentation site to have an example. + editURL = "" + # Author of the site, will be used in meta information + author = "" + # Description of the site, will be used in meta information + description = "" + # Shows a checkmark for visited pages on the menu + showVisitedLinks = false + # Disable search function. It will hide search bar + disableSearch = false + # Javascript and CSS cache are automatically busted when new version of site is generated. + # Set this to true to disable this behavior (some proxies don't handle well this optimization) + disableAssetsBusting = false + # Set this to true to disable copy-to-clipboard button for inline code. + disableInlineCopyToClipBoard = false + # A title for shortcuts in menu is set by default. Set this to true to disable it. + disableShortcutsTitle = false + # When using mulitlingual website, disable the switch language button. + disableLanguageSwitchingButton = false + # Hide breadcrumbs in the header and only show the current page title + disableBreadcrumb = true + # Hide Next and Previous page buttons normally displayed full height beside content + disableNextPrev = true + # Order sections in menu by "weight" or "title". Default to "weight" + ordersectionsby = "weight" + # Change default color scheme with a variant one. Can be "red", "blue", "green". + themeVariant = "" +``` + +## Activate search + +If not already present, add the follow lines in the same `config.toml` file. + +```toml +[outputs] +home = [ "HTML", "RSS", "JSON"] +``` + +Learn theme uses the last improvement available in hugo version 20+ to generate a json index file ready to be consumed by lunr.js javascript search engine. + +> Hugo generate lunrjs index.json at the root of public folder. +> When you build the site with `hugo server`, hugo generates it internally and of course it doesn’t show up in the filesystem diff --git a/themes/hugo-theme-learn/exampleSite/content/basics/configuration/_index.fr.md b/themes/hugo-theme-learn/exampleSite/content/basics/configuration/_index.fr.md new file mode 100644 index 000000000..6914d99ab --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/basics/configuration/_index.fr.md @@ -0,0 +1,54 @@ +--- +date: 2016-04-09T16:50:16+02:00 +title: Configuration +weight: 20 +--- + +## Paramètres globaux du site + +En plus de la [configuration globale d'Hugo](https://gohugo.io/overview/configuration/), **Hugo-theme-learn** vous permet de définir les paramètres suivant dans votre fichier `config.toml` (ci-dessous sont affichées les valeurs par défaut). + +Notez que certains de ces paramètres sont expliqués en détails dans d'autres sections de cette documentation. + +```toml +[params] + # L'URL préfixe pour éditer la page courante. Ce paramètre affichera un bouton "Modifier cette page" on haut de de chacune des pages. + # Pratique pour donner les possibilité à vos utilisateurs de créer une merge request pour votre doc. + # Allez voir le fichier config.toml de cette documentation pour avoir un exemple. + editURL = "" + # Autheur du site, est utilisé dans les informations meta + author = "" + # Description du site, est utilisé dans les informations meta + description = "" + # Affiche une icône lorsque la page a été visitée + showVisitedLinks = false + # Désactive la fonction de recherche. Une valeur à true cache la barre de recherche. + disableSearch = false + # Par défaut, le cache Javascript et CSS est automatiquement vidé lorsqu'une nouvelle version du site est générée. + # Utilisez ce paramètre lorsque vous voulez désactiver ce comportement (c'est parfois incompatible avec certains proxys) + disableAssetsBusting = false + # Utilisez ce paramètre pour désactiver le bouton copy-to-clipboard pour le code formatté sur une ligne. + disableInlineCopyToClipBoard = false + # Un titre est défini par défaut lorsque vous utilisez un raccourci dans le menu. Utilisez ce paramètre pour le cacher. + disableShortcutsTitle = false + # Quand vous utilisez un site multi-langue, utilisez ce paramètre pour désactiver le bouton de changement de langue. + disableLanguageSwitchingButton = false + # Ordonne les sections dans menu par poids ("weight") ou titre ("title"). Défaut à "weight" + ordersectionsby = "weight" + # Utilisez ce paramètre pour modifier le schéma de couleur du site. Les valeurs par défaut sont "red", "blue", "green". + themeVariant = "" +``` + +## Activer la recherche {#activer-recherche} + +Si ce n'est pas déjà présent, ajoutez les lignes suivantes dans le fichier `config.toml`. + +```toml +[outputs] +home = [ "HTML", "RSS", "JSON"] +``` + +Le thème *Learn* utilise les dernières améliorations d'Hugo pour générer un fichier d'index JSON, prêt à être consommé par le moteur de recherche lunr.js. + +> Hugo génère lunrjs index.json à la racine du dossier `public`. +> Quand vous générez le site avec `hugo server`, Hugo génère le fichier en mémoire, il n'est donc pas disponible sur le disque. diff --git a/themes/hugo-theme-learn/exampleSite/content/basics/installation/_index.en.md b/themes/hugo-theme-learn/exampleSite/content/basics/installation/_index.en.md new file mode 100644 index 000000000..7fe525493 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/basics/installation/_index.en.md @@ -0,0 +1,102 @@ +--- +title: Installation +weight: 15 +--- + +The following steps are here to help you initialize your new website. If you don't know Hugo at all, we strongly suggest you learn more about it by following this [great documentation for beginners](https://gohugo.io/overview/quickstart/). + +## Create your project + +Hugo provides a `new` command to create a new website. + +``` +hugo new site +``` + +## Install the theme + +Install the **Hugo-theme-learn** theme by following [this documentation](https://gohugo.io/themes/installing/) + +This theme's repository is: https://github.com/matcornic/hugo-theme-learn.git + +Alternatively, you can [download the theme as .zip](https://github.com/matcornic/hugo-theme-learn/archive/master.zip) file and extract it in the `themes` directory + +## Basic configuration + +When building the website, you can set a theme by using `--theme` option. However, we suggest you modify the configuration file (`config.toml`) and set the theme as the default. You can also add the `[outputs]` section to enable the search functionality. + +```toml +# Change the default theme to be use when building the site with Hugo +theme = "hugo-theme-learn" + +# For search functionality +[outputs] +home = [ "HTML", "RSS", "JSON"] +``` + +## Create your first chapter page + +Chapters are pages that contain other child pages. It has a special layout style and usually just contains a _chapter name_, the _title_ and a _brief abstract_ of the section. + +``` +### Chapter 1 + +# Basics + +Discover what this Hugo theme is all about and the core concepts behind it. +``` + +renders as + +![A Chapter](/en/basics/installation/images/chapter.png?classes=shadow&width=60pc) + +**Hugo-theme-learn** provides archetypes to create skeletons for your website. Begin by creating your first chapter page with the following command + +``` +hugo new --kind chapter basics/_index.md +``` + +By opening the given file, you should see the property `chapter=true` on top, meaning this page is a _chapter_. + +By default all chapters and pages are created as a draft. If you want to render these pages, remove the property `draft: true` from the metadata. + +## Create your first content pages + +Then, create content pages inside the previously created chapter. Here are two ways to create content in the chapter: + +``` +hugo new basics/first-content.md +hugo new basics/second-content/_index.md +``` + +Feel free to edit thoses files by adding some sample content and replacing the `title` value in the beginning of the files. + +## Launching the website locally + +Launch by using the following command: + +``` +hugo serve +``` + +Go to `http://localhost:1313` + +You should notice three things: + +1. You have a left-side **Basics** menu, containing two submenus with names equal to the `title` properties in the previously created files. +2. The home page explains how to customize it by following the instructions. +3. When you run `hugo serve`, when the contents of the files change, the page automatically refreshes with the changes. Neat! + +## Build the website + +When your site is ready to deploy, run the following command: + +``` +hugo +``` + +A `public` folder will be generated, containing all static content and assets for your website. It can now be deployed on any web server. + +{{% notice note %}} +This website can be automatically published and hosted with [Netlify](https://www.netlify.com/) (Read more about [Automated HUGO deployments with Netlify](https://www.netlify.com/blog/2015/07/30/hosting-hugo-on-netlifyinsanely-fast-deploys/)). Alternatively, you can use [Github pages](https://gohugo.io/hosting-and-deployment/hosting-on-github/) +{{% /notice %}} diff --git a/themes/hugo-theme-learn/exampleSite/content/basics/installation/_index.fr.md b/themes/hugo-theme-learn/exampleSite/content/basics/installation/_index.fr.md new file mode 100644 index 000000000..268d0c3ce --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/basics/installation/_index.fr.md @@ -0,0 +1,100 @@ +--- +title: Installation +weight: 15 +--- + +Les étapes suivantes sont là pour vous aider à initialiser votre site. Si vous ne connaissez pas du tout Hugo, il est fortement conseillé de vous entrainer en suivant ce [super tuto pour débutants](https://gohugo.io/overview/quickstart/). + +## Créer votre projet + +Hugo fournit une commande `new` pour créer un nouveau site. + +``` +hugo new site +``` + +## Installer le thème + +Installer le thème **Hugo-theme-learn** en suivant [cette documentation](https://gohugo.io/themes/installing/) + +Le repo du thème est : https://github.com/matcornic/hugo-theme-learn.git + +Sinon, vous pouvez [télécharger le thème sous forme d'un fichier .zip](https://github.com/matcornic/hugo-theme-learn/archive/master.zip) et extrayez le dans votre dossier de thèmes. + +## Configuration simple + +Lorsque vous générez votre site, vous pouvez définir un thème en utilisant l'option `--theme`. Il est conseillé de modifier votre fichier de configuration `config.toml` and définir votre thème par défaut. En passant, ajoutez les prérequis à l'utilisation de la fonctionnalité de recherche. + +```toml +# Modifiez le thème pour qu'il soit utilisé par défaut à chaque génération de site. +theme = "hugo-theme-learn" + +# Pour la fonctionnalité de recherche +[outputs] +home = [ "HTML", "RSS", "JSON"] +``` + +## Créer votre première page chapitre + +Les *chapitres* sont des pages contenant d'autre pages filles. Elles ont un affichage spécial et contiennent habituellement juste un _nom_ de chapitre, le _titre_ et un _résumé_ de la section. + +``` +### Chapitre 1 + +# Démarrage + +Découvrez comment utiliser ce thème Hugo et apprenez en les concepts +``` + +s'affiche comme + +![Un chapitre](/en/basics/installation/images/chapter.png?classes=shadow&width=60pc) + +**Hugo-theme-learn** fournit des archétypes pour créer des squelettes pour votre site. Commencez par créer votre premier chapitre avec la commande suivante: + +``` +hugo new --kind chapter basics/_index.md +``` + +En ouvrant le fichier généré, vous devriez voir la propriété `chapter=true` en haut, paramètre quit définit que le page est un _chapitre_. + +## Créer votre première page + +Puis, créez votre premier page dans le chapitre précédent. Pour ce faire, il existe deux possibilités : + +``` +hugo new basics/first-content.md +hugo new basics/second-content/_index.md +``` + +N'hésitez pas à éditer ces fichiers en ajoutant des exemple de contenu et en remplaçant le paramètre `title` au début du fichier. + +## Lancer le site localement + +Lancez la commande suivante : + +``` +hugo serve +``` + +Se rendre sur `http://localhost:1313` + +Vous devriez voir trois choses: + +1. Vous avez un menu **Basics** à gauche, qui contient deux sous-menu avec des noms égal au paramètre `title` des fichiers précédemment générés. +2. La page d'accueil vous explique comment la modifier. Suivez les instructions. +3. Avec la commande `hugo serve`, la page se rafraichit automatiquement à chaque fois que vous sauvegardez. Super ! + +## Générez le site + +Quand votre site est prêt à être déployé, lancez la commande suivante: + +``` +hugo +``` + +Un dossier `public` a été généré. Il contient tout le contenu statique et les ressources nécessaires pour votre site. Votre site peut maintenant être déployé en utilisant n'importe quel serveur ! + +{{% notice note %}} +Ce site peut être automatiquement publié et hébergé avec [Netlify](https://www.netlify.com/) ([Plus d'infos](https://www.netlify.com/blog/2015/07/30/hosting-hugo-on-netlifyinsanely-fast-deploys/)). Sinon, vous pouvez utiliser les [Github pages](https://gohugo.io/hosting-and-deployment/hosting-on-github/) +{{% /notice %}} \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/basics/installation/images/chapter.png b/themes/hugo-theme-learn/exampleSite/content/basics/installation/images/chapter.png new file mode 100644 index 000000000..80da0c6d6 Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/content/basics/installation/images/chapter.png differ diff --git a/themes/hugo-theme-learn/exampleSite/content/basics/requirements/_index.en.md b/themes/hugo-theme-learn/exampleSite/content/basics/requirements/_index.en.md new file mode 100755 index 000000000..2b3f51d93 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/basics/requirements/_index.en.md @@ -0,0 +1,11 @@ +--- +title: Requirements +weight: 10 +disableToc: true +--- + +Thanks to the simplicity of Hugo, this page is as empty as this theme needs requirements. + +Just download latest version of [Hugo binary (> 0.25)](https://gohugo.io/getting-started/installing/) for your OS (Windows, Linux, Mac) : it's that simple. + +![Magic](/en/basics/requirements/images/magic.gif?classes=shadow) diff --git a/themes/hugo-theme-learn/exampleSite/content/basics/requirements/_index.fr.md b/themes/hugo-theme-learn/exampleSite/content/basics/requirements/_index.fr.md new file mode 100755 index 000000000..ae70caea5 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/basics/requirements/_index.fr.md @@ -0,0 +1,11 @@ +--- +title: Prérequis +weight: 10 +disableToc: true +--- + +Grâce à la simplicité d'Hugo, cette page est vide car il n'y a quasi pas de prérequis pour utiliser le thème. + +Téléchargez la dernière version du [binaire Hugo (> 0.25)](https://gohugo.io/getting-started/installing/) pour votre Système d'exploitation (Windows, Linux, Mac) : et c'est tout ! + +![Magic](/en/basics/requirements/images/magic.gif?classes=shadow) diff --git a/themes/hugo-theme-learn/exampleSite/content/basics/requirements/images/magic.gif b/themes/hugo-theme-learn/exampleSite/content/basics/requirements/images/magic.gif new file mode 100644 index 000000000..235c4edb3 Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/content/basics/requirements/images/magic.gif differ diff --git a/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/_index.en.md b/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/_index.en.md new file mode 100644 index 000000000..c6920c5d4 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/_index.en.md @@ -0,0 +1,194 @@ +--- +date: 2016-04-09T16:50:16+02:00 +title: Style customization +weight: 25 +--- + +**Hugo-theme-learn** has been built to be as configurable as possible by defining multiple [partials](https://gohugo.io/templates/partials/) + +In `themes/hugo-theme-learn/layouts/partials/`, you will find all the partials defined for this theme. If you need to overwrite something, don't change the code directly. Instead [follow this page](https://gohugo.io/themes/customizing/). You'd create a new partial in the `layouts/partials` folder of your local project. This partial will have the priority. + +This theme defines the following partials : + +- *header*: the header of the content page (contains the breadcrumbs). _Not meant to be overwritten_ +- *custom-header*: custom headers in page. Meant to be overwritten when adding CSS imports. Don't forget to include `style` HTML tag directive in your file +- *footer*: the footer of the content page (contains the arrows). _Not meant to be overwritten_ +- *custom-footer*: custom footer in page. Meant to be overwritten when adding Javacript. Don't forget to include `javascript` HTML tag directive in your file +- *favicon*: the favicon +- *logo*: the logo, on top left hand corner. +- *meta*: HTML meta tags, if you want to change default behavior +- *menu*: left menu. _Not meant to be overwritten_ +- *menu-footer*: footer of the the left menu +- *search*: search box +- *toc*: table of contents + +## Change the logo + +Create a new file in `layouts/partials/` named `logo.html`. Then write any HTML you want. +You could use an `img` HTML tag and reference an image created under the *static* folder, or you could paste a SVG definition ! + +{{% notice note %}} +The size of the logo will adapt automatically +{{% /notice %}} + +## Change the favicon + +If your favicon is a png, just drop off your image in your local `static/images/` folder and name it `favicon.png` + +If you need to change this default behavior, create a new file in `layouts/partials/` named `favicon.html`. Then write something like this: + +```html + +``` + +## Change default colors {#theme-variant} + +**Hugo Learn theme** let you choose between 3 native color scheme variants, but feel free to add one yourself ! Default color scheme is based on [Grav Learn Theme](https://learn.getgrav.org/). + +### Red variant + +```toml +[params] + # Change default color scheme with a variant one. Can be "red", "blue", "green". + themeVariant = "red" +``` + +![Red variant](/en/basics/style-customization/images/red-variant.png?width=60pc) + +### Blue variant + +```toml +[params] + # Change default color scheme with a variant one. Can be "red", "blue", "green". + themeVariant = "blue" +``` + +![Blue variant](/en/basics/style-customization/images/blue-variant.png?width=60pc) + +### Green variant + +```toml +[params] + # Change default color scheme with a variant one. Can be "red", "blue", "green". + themeVariant = "green" +``` + +![Green variant](/en/basics/style-customization/images/green-variant.png?width=60pc) + +### 'Yours‘ variant + +First, create a new CSS file in your local `static/css` folder prefixed by `theme` (e.g. with _mine_ theme `static/css/theme-mine.css`). Copy the following content and modify colors in CSS variables. + +```css + +:root{ + + --MAIN-TEXT-color:#323232; /* Color of text by default */ + --MAIN-TITLES-TEXT-color: #5e5e5e; /* Color of titles h2-h3-h4-h5 */ + --MAIN-LINK-color:#1C90F3; /* Color of links */ + --MAIN-LINK-HOVER-color:#167ad0; /* Color of hovered links */ + --MAIN-ANCHOR-color: #1C90F3; /* color of anchors on titles */ + + --MENU-HEADER-BG-color:#1C90F3; /* Background color of menu header */ + --MENU-HEADER-BORDER-color:#33a1ff; /*Color of menu header border */ + + --MENU-SEARCH-BG-color:#167ad0; /* Search field background color (by default borders + icons) */ + --MENU-SEARCH-BOX-color: #33a1ff; /* Override search field border color */ + --MENU-SEARCH-BOX-ICONS-color: #a1d2fd; /* Override search field icons color */ + + --MENU-SECTIONS-ACTIVE-BG-color:#20272b; /* Background color of the active section and its childs */ + --MENU-SECTIONS-BG-color:#252c31; /* Background color of other sections */ + --MENU-SECTIONS-LINK-color: #ccc; /* Color of links in menu */ + --MENU-SECTIONS-LINK-HOVER-color: #e6e6e6; /* Color of links in menu, when hovered */ + --MENU-SECTION-ACTIVE-CATEGORY-color: #777; /* Color of active category text */ + --MENU-SECTION-ACTIVE-CATEGORY-BG-color: #fff; /* Color of background for the active category (only) */ + + --MENU-VISITED-color: #33a1ff; /* Color of 'page visited' icons in menu */ + --MENU-SECTION-HR-color: #20272b; /* Color of
separator in menu */ + +} + +body { + color: var(--MAIN-TEXT-color) !important; +} + +textarea:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="password"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="text"]:focus, input[type="url"]:focus, input[type="color"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, select[multiple=multiple]:focus { + border-color: none; + box-shadow: none; +} + +h2, h3, h4, h5 { + color: var(--MAIN-TITLES-TEXT-color) !important; +} + +a { + color: var(--MAIN-LINK-color); +} + +.anchor { + color: var(--MAIN-ANCHOR-color); +} + +a:hover { + color: var(--MAIN-LINK-HOVER-color); +} + +#sidebar ul li.visited > a .read-icon { + color: var(--MENU-VISITED-color); +} + +#body a.highlight:after { + display: block; + content: ""; + height: 1px; + width: 0%; + -webkit-transition: width 0.5s ease; + -moz-transition: width 0.5s ease; + -ms-transition: width 0.5s ease; + transition: width 0.5s ease; + background-color: var(--MAIN-LINK-HOVER-color); +} +#sidebar { + background-color: var(--MENU-SECTIONS-BG-color); +} +#sidebar #header-wrapper { + background: var(--MENU-HEADER-BG-color); + color: var(--MENU-SEARCH-BOX-color); + border-color: var(--MENU-HEADER-BORDER-color); +} +#sidebar .searchbox { + border-color: var(--MENU-SEARCH-BOX-color); + background: var(--MENU-SEARCH-BG-color); +} +#sidebar ul.topics > li.parent, #sidebar ul.topics > li.active { + background: var(--MENU-SECTIONS-ACTIVE-BG-color); +} +#sidebar .searchbox * { + color: var(--MENU-SEARCH-BOX-ICONS-color); +} + +#sidebar a { + color: var(--MENU-SECTIONS-LINK-color); +} + +#sidebar a:hover { + color: var(--MENU-SECTIONS-LINK-HOVER-color); +} + +#sidebar ul li.active > a { + background: var(--MENU-SECTION-ACTIVE-CATEGORY-BG-color); + color: var(--MENU-SECTION-ACTIVE-CATEGORY-color) !important; +} + +#sidebar hr { + border-color: var(--MENU-SECTION-HR-color); +} +``` + +Then, set the `themeVariant` value with the name of your custom theme file. That's it ! + +```toml +[params] + # Change default color scheme with a variant one. Can be "red", "blue", "green". + themeVariant = "mine" +``` diff --git a/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/_index.fr.md b/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/_index.fr.md new file mode 100644 index 000000000..6daab9e84 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/_index.fr.md @@ -0,0 +1,194 @@ +--- +date: 2016-04-09T16:50:16+02:00 +title: Personnalisation du style +weight: 25 +--- + +**Hugo-theme-learn** a été conçu pour être aussi configurable que possible en définissant plusieurs [partials](https://gohugo.io/templates/partials/) + +Dans `themes/hugo-theme-learn/layouts/partials/`, vous pourrez trouver tous les *partials* définis pour ce thème. Si vous avez besoin d'écraser quelque chose, ne modifiez pas le code directement. A la place, [suivez cette page](https://gohugo.io/themes/customizing/). Vous créerez alors un nouveau *partial* dans le dossier `layouts/partials` de votre site local. Ce *partial* aura la priorité. + +Ce thème définit les *partials* suivant : + +- *header*: l'en-tête de la page page (contient le fil d'Ariane). _Pas voué à être écrasé_ +- *custom-header*: En-tête personnalisé. Voué à être écrasé quand vous ajoutez des imports CSS. N'oubliez pas d'inclure la balise HTML `style` dans votre fichier +- *footer*: le pied-de-page de la page (contains les flèches). _Pas voué à être écrasé_ +- *custom-footer*: Pied-de-page personnalisé. Voué à être écrasé quand vous ajoutez du Javascript. N'oubliez pas d'inclure la balise HTML `javascript` dans votre fichier +- *favicon*: le favicon +- *logo*: le logo, affiché un haut à gauche. +- *meta*: les balises HTML meta, que vous pouvez écraser sans problème. +- *menu*: Le menu à gauche. _Pas voué à être écrasé_ +- *menu-footer*: Le pied-de-page du menu +- *search*: le champ de recherche +- *toc*: le sommaire + +## Changer le logo + +Créez un nouveau fichier dans `layouts/partials/`, nommé `logo.html`. Puis, écrivez le code HTML voulu. +Vous pourriez utiliser une balise HTML `img` et référencer une image créée dans le dossier *static*, voire même y coller un code SVG ! + +{{% notice note %}} +La taille du logo va s'adapter automatiquement +{{% /notice %}} + +## Changer le favicon + +Si votre favicon est un png, déposez votre image dans votre dossier local `static/images/` et nommez le `favicon.png` + +Si vous avez besoin de changer ce comportement par défaut, créer un nouveau fichier dans `layouts/partials/` et nommez le `favicon.html`. Puis ajoutez quelque chose comme: + +```html + +``` + +## Changer les couleurs par défaut {#theme-variant} + +**Hugo Learn theme** vous permet de choisir nativement entre 3 schéma de couleurs, mais n'hésitez pas à en ajouter d'autres ! Les couleurs par défaut sont celles de [Grav Learn Theme](https://learn.getgrav.org/). + +### Variante rouge + +```toml +[params] + # Modifier le schéma de couleur par défaut. Peut être "red", "blue", "green". + themeVariant = "red" +``` + +![Variante rouge](/en/basics/style-customization/images/red-variant.png?width=60pc) + +### Variante bleue + +```toml +[params] + # Modifier le schéma de couleur par défaut. Peut être "red", "blue", "green". + themeVariant = "blue" +``` + +![Variante bleue](/en/basics/style-customization/images/blue-variant.png?width=60pc) + +### Variante verte + +```toml +[params] + # Modifier le schéma de couleur par défaut. Peut être "red", "blue", "green". + themeVariant = "green" +``` + +![Variante verte](/en/basics/style-customization/images/green-variant.png?width=60pc) + +### Votre variante + +Premièrement, créez un nouveau fichier CSS dans votre dossier `static/css`, préfixé par `theme` (ex: avec le theme_lemien_ `static/css/theme-lemien.css`). Copiez le contenu suivant et modifiez les couleurs dans les variables CSS. + +```css + +:root{ + + --MAIN-TEXT-color:#323232; /* Color of text by default */ + --MAIN-TITLES-TEXT-color: #5e5e5e; /* Color of titles h2-h3-h4-h5 */ + --MAIN-LINK-color:#1C90F3; /* Color of links */ + --MAIN-LINK-HOVER-color:#167ad0; /* Color of hovered links */ + --MAIN-ANCHOR-color: #1C90F3; /* color of anchors on titles */ + + --MENU-HEADER-BG-color:#1C90F3; /* Background color of menu header */ + --MENU-HEADER-BORDER-color:#33a1ff; /*Color of menu header border */ + + --MENU-SEARCH-BG-color:#167ad0; /* Search field background color (by default borders + icons) */ + --MENU-SEARCH-BOX-color: #33a1ff; /* Override search field border color */ + --MENU-SEARCH-BOX-ICONS-color: #a1d2fd; /* Override search field icons color */ + + --MENU-SECTIONS-ACTIVE-BG-color:#20272b; /* Background color of the active section and its childs */ + --MENU-SECTIONS-BG-color:#252c31; /* Background color of other sections */ + --MENU-SECTIONS-LINK-color: #ccc; /* Color of links in menu */ + --MENU-SECTIONS-LINK-HOVER-color: #e6e6e6; /* Color of links in menu, when hovered */ + --MENU-SECTION-ACTIVE-CATEGORY-color: #777; /* Color of active category text */ + --MENU-SECTION-ACTIVE-CATEGORY-BG-color: #fff; /* Color of background for the active category (only) */ + + --MENU-VISITED-color: #33a1ff; /* Color of 'page visited' icons in menu */ + --MENU-SECTION-HR-color: #20272b; /* Color of
separator in menu */ + +} + +body { + color: var(--MAIN-TEXT-color) !important; +} + +textarea:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="password"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="text"]:focus, input[type="url"]:focus, input[type="color"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, select[multiple=multiple]:focus { + border-color: none; + box-shadow: none; +} + +h2, h3, h4, h5 { + color: var(--MAIN-TITLES-TEXT-color) !important; +} + +a { + color: var(--MAIN-LINK-color); +} + +.anchor { + color: var(--MAIN-ANCHOR-color); +} + +a:hover { + color: var(--MAIN-LINK-HOVER-color); +} + +#sidebar ul li.visited > a .read-icon { + color: var(--MENU-VISITED-color); +} + +#body a.highlight:after { + display: block; + content: ""; + height: 1px; + width: 0%; + -webkit-transition: width 0.5s ease; + -moz-transition: width 0.5s ease; + -ms-transition: width 0.5s ease; + transition: width 0.5s ease; + background-color: var(--MAIN-LINK-HOVER-color); +} +#sidebar { + background-color: var(--MENU-SECTIONS-BG-color); +} +#sidebar #header-wrapper { + background: var(--MENU-HEADER-BG-color); + color: var(--MENU-SEARCH-BOX-color); + border-color: var(--MENU-HEADER-BORDER-color); +} +#sidebar .searchbox { + border-color: var(--MENU-SEARCH-BOX-color); + background: var(--MENU-SEARCH-BG-color); +} +#sidebar ul.topics > li.parent, #sidebar ul.topics > li.active { + background: var(--MENU-SECTIONS-ACTIVE-BG-color); +} +#sidebar .searchbox * { + color: var(--MENU-SEARCH-BOX-ICONS-color); +} + +#sidebar a { + color: var(--MENU-SECTIONS-LINK-color); +} + +#sidebar a:hover { + color: var(--MENU-SECTIONS-LINK-HOVER-color); +} + +#sidebar ul li.active > a { + background: var(--MENU-SECTION-ACTIVE-CATEGORY-BG-color); + color: var(--MENU-SECTION-ACTIVE-CATEGORY-color) !important; +} + +#sidebar hr { + border-color: var(--MENU-SECTION-HR-color); +} +``` + +Puis, configurez le paramètre `themeVariant` avec le nom de votre variante. C'est tout ! + +```toml +[params] + # Modifier le schéma de couleur par défaut. Peut être "red", "blue", "green". + themeVariant = "lemien" +``` diff --git a/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/blue-variant.png b/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/blue-variant.png new file mode 100644 index 000000000..4f79d58b1 Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/blue-variant.png differ diff --git a/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/green-variant.png b/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/green-variant.png new file mode 100644 index 000000000..a4b73b58e Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/green-variant.png differ diff --git a/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/red-variant.png b/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/red-variant.png new file mode 100644 index 000000000..6af77497d Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/images/red-variant.png differ diff --git a/themes/hugo-theme-learn/exampleSite/content/cont/_index.en.md b/themes/hugo-theme-learn/exampleSite/content/cont/_index.en.md new file mode 100755 index 000000000..cbdc696a1 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/cont/_index.en.md @@ -0,0 +1,12 @@ +--- +title: Content +weight: 10 +chapter: true +pre: "2. " +--- + +### Chapter 2 + +# Content + +Find out how to create and organize your content quickly and intuitively. diff --git a/themes/hugo-theme-learn/exampleSite/content/cont/_index.fr.md b/themes/hugo-theme-learn/exampleSite/content/cont/_index.fr.md new file mode 100755 index 000000000..dae5873c8 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/cont/_index.fr.md @@ -0,0 +1,12 @@ +--- +title: Contenu +weight: 10 +chapter: true +pre: "2. " +--- + +### Chapitre 2 + +# Contenu + +Découvrez comment créer et organiser votre contenu facilement et intuitivement. diff --git a/themes/hugo-theme-learn/exampleSite/content/cont/archetypes.en.md b/themes/hugo-theme-learn/exampleSite/content/cont/archetypes.en.md new file mode 100644 index 000000000..689ff9b01 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/cont/archetypes.en.md @@ -0,0 +1,57 @@ +--- +title: Archetypes +weight: 10 +--- + +Using the command: `hugo new [relative new content path]`, you can start a content file with the date and title automatically set. While this is a welcome feature, active writers need more : [archetypes](https://gohugo.io/content/archetypes/). + +It is pre-configured skeleton pages with default front matter. Please refer to the documentation for types of page to understand the differences. + +## Chapter {#archetypes-chapter} + +To create a Chapter page, run the following commands + +``` +hugo new --kind chapter /_index.md +``` + +It will create a page with predefined Front-Matter: + +```markdown ++++ +title = "{{ replace .Name "-" " " | title }}" +date = {{ .Date }} +weight = 5 +chapter = true +pre = "X. " ++++ + +### Chapter X + +# Some Chapter title + +Lorem Ipsum. +``` + +## Default + +To create a default page, run either one of the following commands + +``` +# Either +hugo new //_index.md +# Or +hugo new /.md +``` + +It will create a page with predefined Front-Matter: + +```markdown ++++ +title = "{{ replace .Name "-" " " | title }}" +date = {{ .Date }} +weight = 5 ++++ + +Lorem Ipsum. +``` \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/cont/archetypes.fr.md b/themes/hugo-theme-learn/exampleSite/content/cont/archetypes.fr.md new file mode 100644 index 000000000..883c41865 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/cont/archetypes.fr.md @@ -0,0 +1,57 @@ +--- +title: Archétypes +weight: 10 +--- + +En utilisant la commande: `hugo new [chemin vers nouveau contenu]`, vous pouvez créer un nouveau fichier avec la date et le title automatiquement initialisé. Même si c'est une fonctionnalité intéressante, elle reste limitée pour les auteurs actifs qui ont besoin de mieux : les [archetypes](https://gohugo.io/content/archetypes/). + +Les archétypes sont des squelettes de pages préconfigurées avec un Front Matter par défaut. Merci de vous référer à la documentation pour connaitre les différents types de page. + +## Chapitre {#archetypes-chapter} + +Pour créer un chapitre, lancez les commandes suivantes + +``` +hugo new --kind chapter /_index.md +``` + +Cela crééra une page avec le Front Matter suivant: + +```markdown ++++ +title = "{{ replace .Name "-" " " | title }}" +date = {{ .Date }} +weight = 5 +chapter = true +pre = "X. " ++++ + +### Chapter X + +# Some Chapter title + +Lorem Ipsum. +``` + +## Défaut + +Pour créer une page classique, lancer l'une des deux commandes suivantes + +``` +# Soit +hugo new //_index.md +# Ou +hugo new /.md +``` + +Cela crééra une page avec le Front Matter suivant: + +```markdown ++++ +title = "{{ replace .Name "-" " " | title }}" +date = {{ .Date }} +weight = 5 ++++ + +Lorem Ipsum. +``` \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/cont/i18n/_index.en.md b/themes/hugo-theme-learn/exampleSite/content/cont/i18n/_index.en.md new file mode 100644 index 000000000..c35327582 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/cont/i18n/_index.en.md @@ -0,0 +1,78 @@ +--- +date: 2016-04-09T16:50:16+02:00 +title: Multilingual and i18n +weight: 30 +--- + +**Learn theme** is fully compatible with Hugo multilingual mode. + +It provides: + +- Translation strings for default values (English and French). Feel free to contribute ! +- Automatic menu generation from multilingual content +- In-browser language switching + +![I18n menu](/en/cont/i18n/images/i18n-menu.gif) + +## Basic configuration + +After learning [how Hugo handle multilingual websites](https://gohugo.io/content-management/multilingual), define your languages in your `config.toml` file. + +For example with current French and English website. + +```toml +# English is the default language +defaultContentLanguage = "en" +# Force to have /en/my-page and /fr/my-page routes, even for default language. +defaultContentLanguageInSubdir= true + +[Languages] +[Languages.en] +title = "Documentation for Hugo Learn Theme" +weight = 1 +languageName = "English" + +[Languages.fr] +title = "Documentation du thème Hugo Learn" +weight = 2 +languageName = "Français" +``` + +Then, for each new page, append the *id* of the language to the file. + +- Single file `my-page.md` is split in two files: + - in English: `my-page.en.md` + - in French: `my-page.fr.md` +- Single file `_index.md` is split in two files: + - in English: `_index.en.md` + - in French: `_index.fr.md` + +{{% notice info %}} +Be aware that only translated pages are displayed in menu. It's not replaced with default language content. +{{% /notice %}} + +{{% notice tip %}} +Use [slug](https://gohugo.io/content-management/multilingual/#translate-your-content) Front Matter parameter to translate urls too. +{{% /notice %}} + +## Overwrite translation strings + +Translations strings are used for common default values used in the theme (*Edit this page* button, *Search placeholder* and so on). Translations are available in french and english but you may use another language or want to override default values. + +To override these values, create a new file in your local i18n folder `i18n/.toml` and inspire yourself from the theme `themes/hugo-theme-learn/i18n/en.toml` + +By the way, as these translations could be used by other people, please take the time to propose a translation by [making a PR](https://github.com/matcornic/hugo-theme-learn/pulls) to the theme ! + +## Disable language switching + +Switching the language in the browser is a great feature, but for some reasons you may want to disable it. + +Just set `disableLanguageSwitchingButton=true` in your `config.toml` + +```toml +[params] + # When using mulitlingual website, disable the switch language button. + disableLanguageSwitchingButton = true +``` + +![I18n menu](/en/cont/i18n/images/i18n-menu.gif) \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/cont/i18n/_index.fr.md b/themes/hugo-theme-learn/exampleSite/content/cont/i18n/_index.fr.md new file mode 100644 index 000000000..6503abf4c --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/cont/i18n/_index.fr.md @@ -0,0 +1,78 @@ +--- +date: 2016-04-09T16:50:16+02:00 +title: Multi-langue et i18n +weight: 30 +--- + +**Learn** est complètement compatible avec le mode multi-langue d'Hugo. + +Il fournit : + +- Des *translation strings* pour les valeurs par défaut utilisées par le thème (Anglais et Français). N'hésitez pas à contribuer ! +- Génération automatique du menu avec le contenu multi-langue +- Modification de la langue dans le navigateur + +![I18n menu](/en/cont/i18n/images/i18n-menu.gif) + +## Configuration simple + +Après avoir appris [comment Hugo gère les sites multi-langue](https://gohugo.io/content-management/multilingual), définissez vos langues dans votre fichier `config.toml`. + +Par exemple, pour ce site, avec du contenu en français et en anglais. + +```toml +# Anglais est la langue par défaut +defaultContentLanguage = "en" +# Force d'avoir /en/ma-page et /fr/ma-page routes, même avec la langue par défaut. +defaultContentLanguageInSubdir= true + +[Languages] +[Languages.en] +title = "Documentation for Hugo Learn Theme" +weight = 1 +languageName = "English" + +[Languages.fr] +title = "Documentation du thème Hugo Learn" +weight = 2 +languageName = "Français" +``` + +Puis, pour chaque nouvelle page, ajoutez *l'id* de la langue du fichier. + +- Le fichier `my-page.md` est découpé en deux fichiers : + - en anglais : `my-page.en.md` + - en français : `my-page.fr.md` +- Le fichier `_index.md` est découpé en deux fichiers : + - en anglais: `_index.en.md` + - en français: `_index.fr.md` + +{{% notice info %}} +Attention, seulement les pages traduites sont affichées dans le menu. Le contenu n'est pas remplacé par les pages de la langue par défaut. +{{% /notice %}} + +{{% notice tip %}} +Utilisez le paramètre du Front Matter [slug](https://gohugo.io/content-management/multilingual/#translate-your-content) pour traduire également les URLs. +{{% /notice %}} + +## Surcharger les *translation strings* + +Les *Translations strings* sont utilisées comme valeurs par défaut dans le thème (Bouton *Modifier la page*, Element de subsitution *Recherche*, etc.). Les traductions sont disponibles en français et en anglais mais vous pouvez utiliser n'importe quelle autre langue et surcharger avec vos propres valeurs. + +Pour surcharger ces valeurs, créer un nouveau fichier dans votre dossier i18n local `i18n/.toml` et inspirez vous du thème `themes/hugo-theme-learn/i18n/en.toml` + +D'ailleurs, ces traductions pour servir à tout le monde, donc svp prenez le temps de [proposer une Pull Request](https://github.com/matcornic/hugo-theme-learn/pulls) ! + +## Désactiver le changement de langue + +Vous pouvez changer de langue directement dans le navigateur. C'est une super fonctionnalité, mais vous avez peut-être besoin de la désactiver. + +Pour ce faire, ajouter le paramètre `disableLanguageSwitchingButton=true` dans votre `config.toml` + +```toml +[params] + # Quand vous utilisez un site en multi-langue, désactive le bouton de changment de langue. + disableLanguageSwitchingButton = true +``` + +![I18n menu](/en/cont/i18n/images/i18n-menu.gif) \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/cont/i18n/images/i18n-menu.gif b/themes/hugo-theme-learn/exampleSite/content/cont/i18n/images/i18n-menu.gif new file mode 100644 index 000000000..99ee22267 Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/content/cont/i18n/images/i18n-menu.gif differ diff --git a/themes/hugo-theme-learn/exampleSite/content/cont/icons.en.md b/themes/hugo-theme-learn/exampleSite/content/cont/icons.en.md new file mode 100644 index 000000000..ad769c6c1 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/cont/icons.en.md @@ -0,0 +1,41 @@ +--- +title: Icons and logos +weight: 27 +--- + +The Learn theme for Hugo loads the [**Font Awesome**](https://fontawesome.com) library, allowing you to easily display any icon or logo available in the Font Awesome free collection. + +## Finding an icon + +Browse through the available icons in the [Font Awesome Gallery](https://fontawesome.com/icons?d=gallery&m=free). Notice that the **free** filter is enabled, as only the free icons are available by default. + +Once on the Font Awesome page for a specific icon, for example the page for the [heart](https://fontawesome.com/icons/heart?style=solid), copy the HTML reference and paste into the markdown content. + +The HTML to include the heart icon is: + +``` + +``` + +## Including in markdown + +Paste the `` HTML into markup and Font Awesome will load the relevant icon. + +``` +Built with from Grav and Hugo +``` + +Which appears as + +Built with from Grav and Hugo + +## Customising icons + +Font Awesome provides many ways to modify the icon + +* Change colour (by default the icon will inherit the parent colour) +* Increase or decrease size +* Rotate +* Combine with other icons + +Check the full documentation on [web fonts with CSS](https://fontawesome.com/how-to-use/web-fonts-with-css) for more. diff --git a/themes/hugo-theme-learn/exampleSite/content/cont/markdown.en.md b/themes/hugo-theme-learn/exampleSite/content/cont/markdown.en.md new file mode 100644 index 000000000..b961bcdd7 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/cont/markdown.en.md @@ -0,0 +1,665 @@ +--- +date: 2016-04-09T16:50:16+02:00 +title: Markdown syntax +weight: 15 +--- + +{{% notice note %}} +This page is a shameful copy of the great [Grav original page](http://learn.getgrav.org/content/markdown). +Only difference is information about image customization ([resizing]({{< relref "#resizing-image" >}}), [add CSS classes]({{< relref "#add-css-classes" >}})...) +{{% /notice%}} + +Let's face it: Writing content for the Web is tiresome. WYSIWYG editors help alleviate this task, but they generally result in horrible code, or worse yet, ugly web pages. + +**Markdown** is a better way to write **HTML**, without all the complexities and ugliness that usually accompanies it. + +Some of the key benefits are: + +1. Markdown is simple to learn, with minimal extra characters so it's also quicker to write content. +2. Less chance of errors when writing in markdown. +3. Produces valid XHTML output. +4. Keeps the content and the visual display separate, so you cannot mess up the look of your site. +5. Write in any text editor or Markdown application you like. +6. Markdown is a joy to use! + +John Gruber, the author of Markdown, puts it like this: + +> The overriding design goal for Markdown’s formatting syntax is to make it as readable as possible. The idea is that a Markdown-formatted document should be publishable as-is, as plain text, without looking like it’s been marked up with tags or formatting instructions. While Markdown’s syntax has been influenced by several existing text-to-HTML filters, the single biggest source of inspiration for Markdown’s syntax is the format of plain text email. +> -- John Gruber + + +Grav ships with built-in support for [Markdown](http://daringfireball.net/projects/markdown/) and [Markdown Extra](https://michelf.ca/projects/php-markdown/extra/). You must enable **Markdown Extra** in your `system.yaml` configuration file + +Without further delay, let us go over the main elements of Markdown and what the resulting HTML looks like: + +{{% notice info %}} + Bookmark this page for easy future reference! +{{% /notice %}} + +## Headings + +Headings from `h1` through `h6` are constructed with a `#` for each level: + +```markdown +# h1 Heading +## h2 Heading +### h3 Heading +#### h4 Heading +##### h5 Heading +###### h6 Heading +``` + +Renders to: + +# h1 Heading +## h2 Heading +### h3 Heading +#### h4 Heading +##### h5 Heading +###### h6 Heading + +HTML: + +```html +

h1 Heading

+

h2 Heading

+

h3 Heading

+

h4 Heading

+
h5 Heading
+
h6 Heading
+``` + +## Comments + +Comments should be HTML compatible + +```html + +``` +Comment below should **NOT** be seen: + + + + +## Horizontal Rules + +The HTML `
` element is for creating a "thematic break" between paragraph-level elements. In markdown, you can create a `
` with any of the following: + +* `___`: three consecutive underscores +* `---`: three consecutive dashes +* `***`: three consecutive asterisks + +renders to: + +___ + +--- + +*** + + +## Body Copy + +Body copy written as normal, plain text will be wrapped with `

` tags in the rendered HTML. + +So this body copy: + +```markdown +Lorem ipsum dolor sit amet, graecis denique ei vel, at duo primis mandamus. Et legere ocurreret pri, animal tacimates complectitur ad cum. Cu eum inermis inimicus efficiendi. Labore officiis his ex, soluta officiis concludaturque ei qui, vide sensibus vim ad. +``` +renders to this HTML: + +```html +

Lorem ipsum dolor sit amet, graecis denique ei vel, at duo primis mandamus. Et legere ocurreret pri, animal tacimates complectitur ad cum. Cu eum inermis inimicus efficiendi. Labore officiis his ex, soluta officiis concludaturque ei qui, vide sensibus vim ad.

+``` + +## Emphasis + +### Bold +For emphasizing a snippet of text with a heavier font-weight. + +The following snippet of text is **rendered as bold text**. + +```markdown +**rendered as bold text** +``` +renders to: + +**rendered as bold text** + +and this HTML + +```html +rendered as bold text +``` + +### Italics +For emphasizing a snippet of text with italics. + +The following snippet of text is _rendered as italicized text_. + +```markdown +_rendered as italicized text_ +``` + +renders to: + +_rendered as italicized text_ + +and this HTML: + +```html +rendered as italicized text +``` + + +### strikethrough +In GFM (GitHub flavored Markdown) you can do strikethroughs. + +```markdown +~~Strike through this text.~~ +``` +Which renders to: + +~~Strike through this text.~~ + +HTML: + +```html +Strike through this text. +``` + +## Blockquotes + +For quoting blocks of content from another source within your document. + +Add `>` before any text you want to quote. + +```markdown +> **Fusion Drive** combines a hard drive with a flash storage (solid-state drive) and presents it as a single logical volume with the space of both drives combined. +``` + +Renders to: + +> **Fusion Drive** combines a hard drive with a flash storage (solid-state drive) and presents it as a single logical volume with the space of both drives combined. + +and this HTML: + +```html +
+

Fusion Drive combines a hard drive with a flash storage (solid-state drive) and presents it as a single logical volume with the space of both drives combined.

+
+``` + +Blockquotes can also be nested: + +```markdown +> Donec massa lacus, ultricies a ullamcorper in, fermentum sed augue. Nunc augue augue, aliquam non hendrerit ac, commodo vel nisi. +> +> > Sed adipiscing elit vitae augue consectetur a gravida nunc vehicula. Donec auctor odio non est accumsan facilisis. Aliquam id turpis in dolor tincidunt mollis ac eu diam. +> +> Mauris sit amet ligula egestas, feugiat metus tincidunt, luctus libero. Donec congue finibus tempor. Vestibulum aliquet sollicitudin erat, ut aliquet purus posuere luctus. +``` + +Renders to: + +> Donec massa lacus, ultricies a ullamcorper in, fermentum sed augue. Nunc augue augue, aliquam non hendrerit ac, commodo vel nisi. +> +> > Sed adipiscing elit vitae augue consectetur a gravida nunc vehicula. Donec auctor odio non est accumsan facilisis. Aliquam id turpis in dolor tincidunt mollis ac eu diam. +> +> Mauris sit amet ligula egestas, feugiat metus tincidunt, luctus libero. Donec congue finibus tempor. Vestibulum aliquet sollicitudin erat, ut aliquet purus posuere luctus. + +## Notices + +{{% notice note %}} +The old mechanism for notices overriding the block quote syntax (`>>>`) has been deprecated. Notices are now handled via a dedicated plugin called [Markdown Notices](https://github.com/getgrav/grav-plugin-markdown-notices) +{{% /notice %}} + + +## Lists + +### Unordered +A list of items in which the order of the items does not explicitly matter. + +You may use any of the following symbols to denote bullets for each list item: + +```markdown +* valid bullet +- valid bullet ++ valid bullet +``` + +For example + +```markdown ++ Lorem ipsum dolor sit amet ++ Consectetur adipiscing elit ++ Integer molestie lorem at massa ++ Facilisis in pretium nisl aliquet ++ Nulla volutpat aliquam velit + - Phasellus iaculis neque + - Purus sodales ultricies + - Vestibulum laoreet porttitor sem + - Ac tristique libero volutpat at ++ Faucibus porta lacus fringilla vel ++ Aenean sit amet erat nunc ++ Eget porttitor lorem +``` +Renders to: + ++ Lorem ipsum dolor sit amet ++ Consectetur adipiscing elit ++ Integer molestie lorem at massa ++ Facilisis in pretium nisl aliquet ++ Nulla volutpat aliquam velit + - Phasellus iaculis neque + - Purus sodales ultricies + - Vestibulum laoreet porttitor sem + - Ac tristique libero volutpat at ++ Faucibus porta lacus fringilla vel ++ Aenean sit amet erat nunc ++ Eget porttitor lorem + +And this HTML + +```html +
    +
  • Lorem ipsum dolor sit amet
  • +
  • Consectetur adipiscing elit
  • +
  • Integer molestie lorem at massa
  • +
  • Facilisis in pretium nisl aliquet
  • +
  • Nulla volutpat aliquam velit +
      +
    • Phasellus iaculis neque
    • +
    • Purus sodales ultricies
    • +
    • Vestibulum laoreet porttitor sem
    • +
    • Ac tristique libero volutpat at
    • +
    +
  • +
  • Faucibus porta lacus fringilla vel
  • +
  • Aenean sit amet erat nunc
  • +
  • Eget porttitor lorem
  • +
+``` + +### Ordered + +A list of items in which the order of items does explicitly matter. + +```markdown +1. Lorem ipsum dolor sit amet +2. Consectetur adipiscing elit +3. Integer molestie lorem at massa +4. Facilisis in pretium nisl aliquet +5. Nulla volutpat aliquam velit +6. Faucibus porta lacus fringilla vel +7. Aenean sit amet erat nunc +8. Eget porttitor lorem +``` +Renders to: + +1. Lorem ipsum dolor sit amet +2. Consectetur adipiscing elit +3. Integer molestie lorem at massa +4. Facilisis in pretium nisl aliquet +5. Nulla volutpat aliquam velit +6. Faucibus porta lacus fringilla vel +7. Aenean sit amet erat nunc +8. Eget porttitor lorem + +And this HTML: + +```html +
    +
  1. Lorem ipsum dolor sit amet
  2. +
  3. Consectetur adipiscing elit
  4. +
  5. Integer molestie lorem at massa
  6. +
  7. Facilisis in pretium nisl aliquet
  8. +
  9. Nulla volutpat aliquam velit
  10. +
  11. Faucibus porta lacus fringilla vel
  12. +
  13. Aenean sit amet erat nunc
  14. +
  15. Eget porttitor lorem
  16. +
+``` + +**TIP**: If you just use `1.` for each number, Markdown will automatically number each item. For example: + +```markdown +1. Lorem ipsum dolor sit amet +1. Consectetur adipiscing elit +1. Integer molestie lorem at massa +1. Facilisis in pretium nisl aliquet +1. Nulla volutpat aliquam velit +1. Faucibus porta lacus fringilla vel +1. Aenean sit amet erat nunc +1. Eget porttitor lorem +``` + +Renders to: + +1. Lorem ipsum dolor sit amet +2. Consectetur adipiscing elit +3. Integer molestie lorem at massa +4. Facilisis in pretium nisl aliquet +5. Nulla volutpat aliquam velit +6. Faucibus porta lacus fringilla vel +7. Aenean sit amet erat nunc +8. Eget porttitor lorem + +## Code + +### Inline code +Wrap inline snippets of code with `` ` ``. + +```markdown +In this example, `
` should be wrapped as **code**. +``` + +Renders to: + +In this example, `
` should be wrapped as **code**. + +HTML: + +```html +

In this example, <section></section> should be wrapped as code.

+``` + +### Indented code + +Or indent several lines of code by at least four spaces, as in: + +
+  // Some comments
+  line 1 of code
+  line 2 of code
+  line 3 of code
+
+ +Renders to: + + // Some comments + line 1 of code + line 2 of code + line 3 of code + +HTML: + +```html +
+  
+    // Some comments
+    line 1 of code
+    line 2 of code
+    line 3 of code
+  
+
+``` + + +### Block code "fences" + +Use "fences" ```` ``` ```` to block in multiple lines of code. + +
+``` markup
+Sample text here...
+```
+
+ + +``` +Sample text here... +``` + +HTML: + +```html +
+  Sample text here...
+
+``` + +### Syntax highlighting + +GFM, or "GitHub Flavored Markdown" also supports syntax highlighting. To activate it, simply add the file extension of the language you want to use directly after the first code "fence", ` ```js `, and syntax highlighting will automatically be applied in the rendered HTML. For example, to apply syntax highlighting to JavaScript code: + +
+```js
+grunt.initConfig({
+  assemble: {
+    options: {
+      assets: 'docs/assets',
+      data: 'src/data/*.{json,yml}',
+      helpers: 'src/custom-helpers.js',
+      partials: ['src/partials/**/*.{hbs,md}']
+    },
+    pages: {
+      options: {
+        layout: 'default.hbs'
+      },
+      files: {
+        './': ['src/templates/pages/index.hbs']
+      }
+    }
+  }
+};
+```
+
+ +Renders to: + +```js +grunt.initConfig({ + assemble: { + options: { + assets: 'docs/assets', + data: 'src/data/*.{json,yml}', + helpers: 'src/custom-helpers.js', + partials: ['src/partials/**/*.{hbs,md}'] + }, + pages: { + options: { + layout: 'default.hbs' + }, + files: { + './': ['src/templates/pages/index.hbs'] + } + } + } +}; +``` + +## Tables +Tables are created by adding pipes as dividers between each cell, and by adding a line of dashes (also separated by bars) beneath the header. Note that the pipes do not need to be vertically aligned. + + +```markdown +| Option | Description | +| ------ | ----------- | +| data | path to data files to supply the data that will be passed into templates. | +| engine | engine to be used for processing templates. Handlebars is the default. | +| ext | extension to be used for dest files. | +``` + +Renders to: + +| Option | Description | +| ------ | ----------- | +| data | path to data files to supply the data that will be passed into templates. | +| engine | engine to be used for processing templates. Handlebars is the default. | +| ext | extension to be used for dest files. | + +And this HTML: + +```html + + + + + + + + + + + + + + + + + +
OptionDescription
datapath to data files to supply the data that will be passed into templates.
engineengine to be used for processing templates. Handlebars is the default.
extextension to be used for dest files.
+``` + +### Right aligned text + +Adding a colon on the right side of the dashes below any heading will right align text for that column. + +```markdown +| Option | Description | +| ------:| -----------:| +| data | path to data files to supply the data that will be passed into templates. | +| engine | engine to be used for processing templates. Handlebars is the default. | +| ext | extension to be used for dest files. | +``` + +| Option | Description | +| ------:| -----------:| +| data | path to data files to supply the data that will be passed into templates. | +| engine | engine to be used for processing templates. Handlebars is the default. | +| ext | extension to be used for dest files. | + +## Links + +### Basic link + +```markdown +[Assemble](http://assemble.io) +``` + +Renders to (hover over the link, there is no tooltip): + +[Assemble](http://assemble.io) + +HTML: + +```html +Assemble +``` + + +### Add a title + +```markdown +[Upstage](https://github.com/upstage/ "Visit Upstage!") +``` + +Renders to (hover over the link, there should be a tooltip): + +[Upstage](https://github.com/upstage/ "Visit Upstage!") + +HTML: + +```html +Upstage +``` + +### Named Anchors + +Named anchors enable you to jump to the specified anchor point on the same page. For example, each of these chapters: + +```markdown +# Table of Contents + * [Chapter 1](#chapter-1) + * [Chapter 2](#chapter-2) + * [Chapter 3](#chapter-3) +``` +will jump to these sections: + +```markdown +## Chapter 1 +Content for chapter one. + +## Chapter 2 +Content for chapter one. + +## Chapter 3 +Content for chapter one. +``` +**NOTE** that specific placement of the anchor tag seems to be arbitrary. They are placed inline here since it seems to be unobtrusive, and it works. + +## Images {#images} +Images have a similar syntax to links but include a preceding exclamation point. + +```markdown +![Minion](https://octodex.github.com/images/minion.png) +``` +![Minion](https://octodex.github.com/images/minion.png) + +or +```markdown +![Alt text](https://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat") +``` +![Alt text](https://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat") + +Like links, Images also have a footnote style syntax + +### Alternative usage : note images + +```markdown +![Alt text][id] +``` +![Alt text][id] + +With a reference later in the document defining the URL location: + +[id]: https://octodex.github.com/images/dojocat.jpg "The Dojocat" + + [id]: https://octodex.github.com/images/dojocat.jpg "The Dojocat" + +### Resizing image + +Add HTTP parameters `width` and/or `height` to the link image to resize the image. Values are CSS values (default is `auto`). + +```markdown +![Minion](https://octodex.github.com/images/minion.png?width=20pc) +``` + +![Minion](https://octodex.github.com/images/minion.png?width=20pc) + +```markdown +![Minion](https://octodex.github.com/images/minion.png?height=50px) +``` + +![Minion](https://octodex.github.com/images/minion.png?height=50px) + +```markdown +![Minion](https://octodex.github.com/images/minion.png?height=50px&width=300px) +``` + +![Minion](https://octodex.github.com/images/minion.png?height=50px&width=300px) + +### Add CSS classes + +Add a HTTP `classes` parameter to the link image to add CSS classes. `shadow`and `border` are available but you could define other ones. + +```markdown +![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?classes=shadow) +``` +![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?width=40pc&classes=shadow) + +```markdown +![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?classes=border) +``` +![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?width=40pc&classes=border) + +```markdown +![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?classes=border,shadow) +``` +![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?width=40pc&classes=border,shadow) diff --git a/themes/hugo-theme-learn/exampleSite/content/cont/markdown.fr.md b/themes/hugo-theme-learn/exampleSite/content/cont/markdown.fr.md new file mode 100644 index 000000000..e734b31cd --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/cont/markdown.fr.md @@ -0,0 +1,666 @@ +--- +date: 2016-04-09T16:50:16+02:00 +title: Syntaxe Markdown +weight: 15 +--- + +{{% notice note %}} +Cette page est une copie de la [doc de Grav](http://learn.getgrav.org/content/markdown). +La seule différence porte sur la personalisation des images ([taille]({{< relref "#resizing-image" >}}), [ajout de classes CSS]({{< relref "#add-css-classes" >}})...) +Pour des raisons évidentes, cette page n'a pas été traduites en français 😁 +{{% /notice%}} + +Let's face it: Writing content for the Web is tiresome. WYSIWYG editors help alleviate this task, but they generally result in horrible code, or worse yet, ugly web pages. + +**Markdown** is a better way to write **HTML**, without all the complexities and ugliness that usually accompanies it. + +Some of the key benefits are: + +1. Markdown is simple to learn, with minimal extra characters so it's also quicker to write content. +2. Less chance of errors when writing in markdown. +3. Produces valid XHTML output. +4. Keeps the content and the visual display separate, so you cannot mess up the look of your site. +5. Write in any text editor or Markdown application you like. +6. Markdown is a joy to use! + +John Gruber, the author of Markdown, puts it like this: + +> The overriding design goal for Markdown’s formatting syntax is to make it as readable as possible. The idea is that a Markdown-formatted document should be publishable as-is, as plain text, without looking like it’s been marked up with tags or formatting instructions. While Markdown’s syntax has been influenced by several existing text-to-HTML filters, the single biggest source of inspiration for Markdown’s syntax is the format of plain text email. +> -- John Gruber + + +Grav ships with built-in support for [Markdown](http://daringfireball.net/projects/markdown/) and [Markdown Extra](https://michelf.ca/projects/php-markdown/extra/). You must enable **Markdown Extra** in your `system.yaml` configuration file + +Without further delay, let us go over the main elements of Markdown and what the resulting HTML looks like: + +{{% notice info %}} + Bookmark this page for easy future reference! +{{% /notice %}} + +## Headings + +Headings from `h1` through `h6` are constructed with a `#` for each level: + +```markdown +# h1 Heading +## h2 Heading +### h3 Heading +#### h4 Heading +##### h5 Heading +###### h6 Heading +``` + +Renders to: + +# h1 Heading +## h2 Heading +### h3 Heading +#### h4 Heading +##### h5 Heading +###### h6 Heading + +HTML: + +```html +

h1 Heading

+

h2 Heading

+

h3 Heading

+

h4 Heading

+
h5 Heading
+
h6 Heading
+``` + +## Comments + +Comments should be HTML compatible + +```html + +``` +Comment below should **NOT** be seen: + + + + +## Horizontal Rules + +The HTML `
` element is for creating a "thematic break" between paragraph-level elements. In markdown, you can create a `
` with any of the following: + +* `___`: three consecutive underscores +* `---`: three consecutive dashes +* `***`: three consecutive asterisks + +renders to: + +___ + +--- + +*** + + +## Body Copy + +Body copy written as normal, plain text will be wrapped with `

` tags in the rendered HTML. + +So this body copy: + +```markdown +Lorem ipsum dolor sit amet, graecis denique ei vel, at duo primis mandamus. Et legere ocurreret pri, animal tacimates complectitur ad cum. Cu eum inermis inimicus efficiendi. Labore officiis his ex, soluta officiis concludaturque ei qui, vide sensibus vim ad. +``` +renders to this HTML: + +```html +

Lorem ipsum dolor sit amet, graecis denique ei vel, at duo primis mandamus. Et legere ocurreret pri, animal tacimates complectitur ad cum. Cu eum inermis inimicus efficiendi. Labore officiis his ex, soluta officiis concludaturque ei qui, vide sensibus vim ad.

+``` + +## Emphasis + +### Bold +For emphasizing a snippet of text with a heavier font-weight. + +The following snippet of text is **rendered as bold text**. + +```markdown +**rendered as bold text** +``` +renders to: + +**rendered as bold text** + +and this HTML + +```html +rendered as bold text +``` + +### Italics +For emphasizing a snippet of text with italics. + +The following snippet of text is _rendered as italicized text_. + +```markdown +_rendered as italicized text_ +``` + +renders to: + +_rendered as italicized text_ + +and this HTML: + +```html +rendered as italicized text +``` + + +### strikethrough +In GFM (GitHub flavored Markdown) you can do strikethroughs. + +```markdown +~~Strike through this text.~~ +``` +Which renders to: + +~~Strike through this text.~~ + +HTML: + +```html +Strike through this text. +``` + +## Blockquotes + +For quoting blocks of content from another source within your document. + +Add `>` before any text you want to quote. + +```markdown +> **Fusion Drive** combines a hard drive with a flash storage (solid-state drive) and presents it as a single logical volume with the space of both drives combined. +``` + +Renders to: + +> **Fusion Drive** combines a hard drive with a flash storage (solid-state drive) and presents it as a single logical volume with the space of both drives combined. + +and this HTML: + +```html +
+

Fusion Drive combines a hard drive with a flash storage (solid-state drive) and presents it as a single logical volume with the space of both drives combined.

+
+``` + +Blockquotes can also be nested: + +```markdown +> Donec massa lacus, ultricies a ullamcorper in, fermentum sed augue. Nunc augue augue, aliquam non hendrerit ac, commodo vel nisi. +> +> > Sed adipiscing elit vitae augue consectetur a gravida nunc vehicula. Donec auctor odio non est accumsan facilisis. Aliquam id turpis in dolor tincidunt mollis ac eu diam. +> +> Mauris sit amet ligula egestas, feugiat metus tincidunt, luctus libero. Donec congue finibus tempor. Vestibulum aliquet sollicitudin erat, ut aliquet purus posuere luctus. +``` + +Renders to: + +> Donec massa lacus, ultricies a ullamcorper in, fermentum sed augue. Nunc augue augue, aliquam non hendrerit ac, commodo vel nisi. +> +> > Sed adipiscing elit vitae augue consectetur a gravida nunc vehicula. Donec auctor odio non est accumsan facilisis. Aliquam id turpis in dolor tincidunt mollis ac eu diam. +> +> Mauris sit amet ligula egestas, feugiat metus tincidunt, luctus libero. Donec congue finibus tempor. Vestibulum aliquet sollicitudin erat, ut aliquet purus posuere luctus. + +## Notices + +{{% notice note %}} +The old mechanism for notices overriding the block quote syntax (`>>>`) has been deprecated. Notices are now handled via a dedicated plugin called [Markdown Notices](https://github.com/getgrav/grav-plugin-markdown-notices) +{{% /notice %}} + +## Lists + +### Unordered +A list of items in which the order of the items does not explicitly matter. + +You may use any of the following symbols to denote bullets for each list item: + +```markdown +* valid bullet +- valid bullet ++ valid bullet +``` + +For example + +```markdown ++ Lorem ipsum dolor sit amet ++ Consectetur adipiscing elit ++ Integer molestie lorem at massa ++ Facilisis in pretium nisl aliquet ++ Nulla volutpat aliquam velit + - Phasellus iaculis neque + - Purus sodales ultricies + - Vestibulum laoreet porttitor sem + - Ac tristique libero volutpat at ++ Faucibus porta lacus fringilla vel ++ Aenean sit amet erat nunc ++ Eget porttitor lorem +``` +Renders to: + ++ Lorem ipsum dolor sit amet ++ Consectetur adipiscing elit ++ Integer molestie lorem at massa ++ Facilisis in pretium nisl aliquet ++ Nulla volutpat aliquam velit + - Phasellus iaculis neque + - Purus sodales ultricies + - Vestibulum laoreet porttitor sem + - Ac tristique libero volutpat at ++ Faucibus porta lacus fringilla vel ++ Aenean sit amet erat nunc ++ Eget porttitor lorem + +And this HTML + +```html +
    +
  • Lorem ipsum dolor sit amet
  • +
  • Consectetur adipiscing elit
  • +
  • Integer molestie lorem at massa
  • +
  • Facilisis in pretium nisl aliquet
  • +
  • Nulla volutpat aliquam velit +
      +
    • Phasellus iaculis neque
    • +
    • Purus sodales ultricies
    • +
    • Vestibulum laoreet porttitor sem
    • +
    • Ac tristique libero volutpat at
    • +
    +
  • +
  • Faucibus porta lacus fringilla vel
  • +
  • Aenean sit amet erat nunc
  • +
  • Eget porttitor lorem
  • +
+``` + +### Ordered + +A list of items in which the order of items does explicitly matter. + +```markdown +1. Lorem ipsum dolor sit amet +2. Consectetur adipiscing elit +3. Integer molestie lorem at massa +4. Facilisis in pretium nisl aliquet +5. Nulla volutpat aliquam velit +6. Faucibus porta lacus fringilla vel +7. Aenean sit amet erat nunc +8. Eget porttitor lorem +``` +Renders to: + +1. Lorem ipsum dolor sit amet +2. Consectetur adipiscing elit +3. Integer molestie lorem at massa +4. Facilisis in pretium nisl aliquet +5. Nulla volutpat aliquam velit +6. Faucibus porta lacus fringilla vel +7. Aenean sit amet erat nunc +8. Eget porttitor lorem + +And this HTML: + +```html +
    +
  1. Lorem ipsum dolor sit amet
  2. +
  3. Consectetur adipiscing elit
  4. +
  5. Integer molestie lorem at massa
  6. +
  7. Facilisis in pretium nisl aliquet
  8. +
  9. Nulla volutpat aliquam velit
  10. +
  11. Faucibus porta lacus fringilla vel
  12. +
  13. Aenean sit amet erat nunc
  14. +
  15. Eget porttitor lorem
  16. +
+``` + +**TIP**: If you just use `1.` for each number, Markdown will automatically number each item. For example: + +```markdown +1. Lorem ipsum dolor sit amet +1. Consectetur adipiscing elit +1. Integer molestie lorem at massa +1. Facilisis in pretium nisl aliquet +1. Nulla volutpat aliquam velit +1. Faucibus porta lacus fringilla vel +1. Aenean sit amet erat nunc +1. Eget porttitor lorem +``` + +Renders to: + +1. Lorem ipsum dolor sit amet +2. Consectetur adipiscing elit +3. Integer molestie lorem at massa +4. Facilisis in pretium nisl aliquet +5. Nulla volutpat aliquam velit +6. Faucibus porta lacus fringilla vel +7. Aenean sit amet erat nunc +8. Eget porttitor lorem + +## Code + +### Inline code +Wrap inline snippets of code with `` ` ``. + +```markdown +In this example, `
` should be wrapped as **code**. +``` + +Renders to: + +In this example, `
` should be wrapped with **code**. + +HTML: + +```html +

In this example, <section></section> should be wrapped with code.

+``` + +### Indented code + +Or indent several lines of code by at least four spaces, as in: + +
+  // Some comments
+  line 1 of code
+  line 2 of code
+  line 3 of code
+
+ +Renders to: + + // Some comments + line 1 of code + line 2 of code + line 3 of code + +HTML: + +```html +
+  
+    // Some comments
+    line 1 of code
+    line 2 of code
+    line 3 of code
+  
+
+``` + + +### Block code "fences" + +Use "fences" ```` ``` ```` to block in multiple lines of code. + +
+``` markup
+Sample text here...
+```
+
+ + +``` +Sample text here... +``` + +HTML: + +```html +
+  Sample text here...
+
+``` + +### Syntax highlighting + +GFM, or "GitHub Flavored Markdown" also supports syntax highlighting. To activate it, simply add the file extension of the language you want to use directly after the first code "fence", ` ```js `, and syntax highlighting will automatically be applied in the rendered HTML. For example, to apply syntax highlighting to JavaScript code: + +
+```js
+grunt.initConfig({
+  assemble: {
+    options: {
+      assets: 'docs/assets',
+      data: 'src/data/*.{json,yml}',
+      helpers: 'src/custom-helpers.js',
+      partials: ['src/partials/**/*.{hbs,md}']
+    },
+    pages: {
+      options: {
+        layout: 'default.hbs'
+      },
+      files: {
+        './': ['src/templates/pages/index.hbs']
+      }
+    }
+  }
+};
+```
+
+ +Renders to: + +```js +grunt.initConfig({ + assemble: { + options: { + assets: 'docs/assets', + data: 'src/data/*.{json,yml}', + helpers: 'src/custom-helpers.js', + partials: ['src/partials/**/*.{hbs,md}'] + }, + pages: { + options: { + layout: 'default.hbs' + }, + files: { + './': ['src/templates/pages/index.hbs'] + } + } + } +}; +``` + +## Tables +Tables are created by adding pipes as dividers between each cell, and by adding a line of dashes (also separated by bars) beneath the header. Note that the pipes do not need to be vertically aligned. + + +```markdown +| Option | Description | +| ------ | ----------- | +| data | path to data files to supply the data that will be passed into templates. | +| engine | engine to be used for processing templates. Handlebars is the default. | +| ext | extension to be used for dest files. | +``` + +Renders to: + +| Option | Description | +| ------ | ----------- | +| data | path to data files to supply the data that will be passed into templates. | +| engine | engine to be used for processing templates. Handlebars is the default. | +| ext | extension to be used for dest files. | + +And this HTML: + +```html + + + + + + + + + + + + + + + + + +
OptionDescription
datapath to data files to supply the data that will be passed into templates.
engineengine to be used for processing templates. Handlebars is the default.
extextension to be used for dest files.
+``` + +### Right aligned text + +Adding a colon on the right side of the dashes below any heading will right align text for that column. + +```markdown +| Option | Description | +| ------:| -----------:| +| data | path to data files to supply the data that will be passed into templates. | +| engine | engine to be used for processing templates. Handlebars is the default. | +| ext | extension to be used for dest files. | +``` + +| Option | Description | +| ------:| -----------:| +| data | path to data files to supply the data that will be passed into templates. | +| engine | engine to be used for processing templates. Handlebars is the default. | +| ext | extension to be used for dest files. | + +## Links + +### Basic link + +```markdown +[Assemble](http://assemble.io) +``` + +Renders to (hover over the link, there is no tooltip): + +[Assemble](http://assemble.io) + +HTML: + +```html +Assemble +``` + + +### Add a title + +```markdown +[Upstage](https://github.com/upstage/ "Visit Upstage!") +``` + +Renders to (hover over the link, there should be a tooltip): + +[Upstage](https://github.com/upstage/ "Visit Upstage!") + +HTML: + +```html +Upstage +``` + +### Named Anchors + +Named anchors enable you to jump to the specified anchor point on the same page. For example, each of these chapters: + +```markdown +# Table of Contents + * [Chapter 1](#chapter-1) + * [Chapter 2](#chapter-2) + * [Chapter 3](#chapter-3) +``` +will jump to these sections: + +```markdown +## Chapter 1 +Content for chapter one. + +## Chapter 2 +Content for chapter one. + +## Chapter 3 +Content for chapter one. +``` +**NOTE** that specific placement of the anchor tag seems to be arbitrary. They are placed inline here since it seems to be unobtrusive, and it works. + + +## Images {#images} +Images have a similar syntax to links but include a preceding exclamation point. + +```markdown +![Minion](https://octodex.github.com/images/minion.png) +``` +![Minion](https://octodex.github.com/images/minion.png) + +or +```markdown +![Alt text](https://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat") +``` +![Alt text](https://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat") + +Like links, Images also have a footnote style syntax + +### Alternative usage : note images + +```markdown +![Alt text][id] +``` +![Alt text][id] + +With a reference later in the document defining the URL location: + +[id]: https://octodex.github.com/images/dojocat.jpg "The Dojocat" + + [id]: https://octodex.github.com/images/dojocat.jpg "The Dojocat" + +### Resizing image + +Add HTTP parameters `width` and/or `height` to the link image to resize the image. Values are CSS values (default is `auto`). + +```markdown +![Minion](https://octodex.github.com/images/minion.png?width=20pc) +``` + +![Minion](https://octodex.github.com/images/minion.png?width=20pc) + +```markdown +![Minion](https://octodex.github.com/images/minion.png?height=50px) +``` + +![Minion](https://octodex.github.com/images/minion.png?height=50px) + +```markdown +![Minion](https://octodex.github.com/images/minion.png?height=50px&width=300px) +``` + +![Minion](https://octodex.github.com/images/minion.png?height=50px&width=300px) + +### Add CSS classes + +Add a HTTP `classes` parameter to the link image to add CSS classes. `shadow`and `border` are available but you could define other ones. + +```markdown +![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?classes=shadow) +``` +![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?width=40pc&classes=shadow) + +```markdown +![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?classes=border) +``` +![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?width=40pc&classes=border) + +```markdown +![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?classes=border,shadow) +``` +![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?width=40pc&classes=border,shadow) diff --git a/themes/hugo-theme-learn/exampleSite/content/cont/menushortcuts.en.md b/themes/hugo-theme-learn/exampleSite/content/cont/menushortcuts.en.md new file mode 100644 index 000000000..e59d6fdb6 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/cont/menushortcuts.en.md @@ -0,0 +1,109 @@ +--- +date: 2016-04-09T16:50:16+02:00 +title: Menu extra shortcuts +weight: 25 +--- + +You can define additional menu entries or shortcuts in the navigation menu without any link to content. + +## Basic configuration + +Edit the website configuration `config.toml` and add a `[[menu.shortcuts]]` entry for each link your want to add. + +Example from the current website: + + [[menu.shortcuts]] + name = " Github repo" + identifier = "ds" + url = "https://github.com/matcornic/hugo-theme-learn" + weight = 10 + + [[menu.shortcuts]] + name = " Showcases" + url = "/showcase" + weight = 11 + + [[menu.shortcuts]] + name = " Hugo Documentation" + identifier = "hugodoc" + url = "https://gohugo.io/" + weight = 20 + + [[menu.shortcuts]] + name = " Credits" + url = "/credits" + weight = 30 + +By default, shortcuts are preceded by a title. This title can be disabled by setting `disableShortcutsTitle=true`. +However, if you want to keep the title but change its value, it can be overriden by changing your local i18n translation string configuration. + +For example, in your local `i18n/en.toml` file, add the following content + + [Shortcuts-Title] + other = "" + +Read more about [hugo menu](https://gohugo.io/extras/menus/) and [hugo i18n translation strings](https://gohugo.io/content-management/multilingual/#translation-of-strings) + +## Configuration for Multilingual mode {#i18n} + +When using a multilingual website, you can set different menus for each language. In the `config.toml` file, prefix your menu configuration by `Languages.`. + + +Example from the current website: + + [Languages] + [Languages.en] + title = "Documentation for Hugo Learn Theme" + weight = 1 + languageName = "English" + + [[Languages.en.menu.shortcuts]] + name = " Github repo" + identifier = "ds" + url = "https://github.com/matcornic/hugo-theme-learn" + weight = 10 + + [[Languages.en.menu.shortcuts]] + name = " Showcases" + url = "/showcase" + weight = 11 + + [[Languages.en.menu.shortcuts]] + name = " Hugo Documentation" + identifier = "hugodoc" + url = "https://gohugo.io/" + weight = 20 + + [[Languages.en.menu.shortcuts]] + name = " Credits" + url = "/credits" + weight = 30 + + [Languages.fr] + title = "Documentation du thème Hugo Learn" + weight = 2 + languageName = "Français" + + [[Languages.fr.menu.shortcuts]] + name = " Repo Github" + identifier = "ds" + url = "https://github.com/matcornic/hugo-theme-learn" + weight = 10 + + [[Languages.fr.menu.shortcuts]] + name = " Vitrine" + url = "/showcase" + weight = 11 + + [[Languages.fr.menu.shortcuts]] + name = " Documentation Hugo" + identifier = "hugodoc" + url = "https://gohugo.io/" + weight = 20 + + [[Languages.fr.menu.shortcuts]] + name = " Crédits" + url = "/credits" + weight = 30 + +Read more about [hugo menu](https://gohugo.io/extras/menus/) and [hugo multilingual menus](https://gohugo.io/content-management/multilingual/#menus) \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/cont/menushortcuts.fr.md b/themes/hugo-theme-learn/exampleSite/content/cont/menushortcuts.fr.md new file mode 100644 index 000000000..886067906 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/cont/menushortcuts.fr.md @@ -0,0 +1,109 @@ +--- +date: 2016-04-09T16:50:16+02:00 +title: Raccourcis du menu +weight: 25 +--- + +Vous pouvez définir des entrées ou raccourcis supplémentaires dans le menu sans avoir besoin d'être lié à un contenu du site. + +## Configuration simple + +Editez le fichier de configuration `config.toml` et ajoutez une entrée `[[menu.shortcuts]]` pour chaque lien que vous voulez ajouter. + +Exemple pour ce site: + + [[menu.shortcuts]] + name = " Github repo" + identifier = "ds" + url = "https://github.com/matcornic/hugo-theme-learn" + weight = 10 + + [[menu.shortcuts]] + name = " Showcases" + url = "/showcase" + weight = 11 + + [[menu.shortcuts]] + name = " Hugo Documentation" + identifier = "hugodoc" + url = "https://gohugo.io/" + weight = 20 + + [[menu.shortcuts]] + name = " Credits" + url = "/credits" + weight = 30 + +Par défaut, les raccourcis sont précédés par un titre. Ce titre peut être désactivé en ajouter le paramètre `disableShortcutsTitle=true` dans la section `params` de votre `config.toml`. +Cependant, si vous voulez garder le titre mais changer sa valeur, vous pouvez modifier votre configuration multilangue locale en changeant les *translation string*. + +Par exemple, dans votre fichier local `i18n/en.toml`, ajouter le contenu + + [Shortcuts-Title] + other = "" + +Plus d'infos sur [les menus Hugo](https://gohugo.io/extras/menus/) et sur [les translations strings](https://gohugo.io/content-management/multilingual/#translation-of-strings) + +## Configuration pour le mode multi-langue {#i18n} + +Quand vous utilisez un site multi-langue, vous pouvez avoir des menus différents pour chaque langage. Dans le fichier de configuration `config.toml`, préfixez votre configuration par `Languages.`. + + +Par exemple, avec ce site : + + [Languages] + [Languages.en] + title = "Documentation for Hugo Learn Theme" + weight = 1 + languageName = "English" + + [[Languages.en.menu.shortcuts]] + name = " Github repo" + identifier = "ds" + url = "https://github.com/matcornic/hugo-theme-learn" + weight = 10 + + [[Languages.en.menu.shortcuts]] + name = " Showcases" + url = "/showcase" + weight = 11 + + [[Languages.en.menu.shortcuts]] + name = " Hugo Documentation" + identifier = "hugodoc" + url = "https://gohugo.io/" + weight = 20 + + [[Languages.en.menu.shortcuts]] + name = " Credits" + url = "/credits" + weight = 30 + + [Languages.fr] + title = "Documentation du thème Hugo Learn" + weight = 2 + languageName = "Français" + + [[Languages.fr.menu.shortcuts]] + name = " Repo Github" + identifier = "ds" + url = "https://github.com/matcornic/hugo-theme-learn" + weight = 10 + + [[Languages.fr.menu.shortcuts]] + name = " Vitrine" + url = "/showcase" + weight = 11 + + [[Languages.fr.menu.shortcuts]] + name = " Documentation Hugo" + identifier = "hugodoc" + url = "https://gohugo.io/" + weight = 20 + + [[Languages.fr.menu.shortcuts]] + name = " Crédits" + url = "/credits" + weight = 30 + +Plus d'infos sur [les menus Hugo](https://gohugo.io/extras/menus/) et les [menus multi-langue Hugo](https://gohugo.io/content-management/multilingual/#menus) \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/cont/pages/_index.en.md b/themes/hugo-theme-learn/exampleSite/content/cont/pages/_index.en.md new file mode 100644 index 000000000..ad6a1b5a8 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/cont/pages/_index.en.md @@ -0,0 +1,166 @@ +--- +date: 2016-04-09T16:50:16+02:00 +title: Pages organization +weight: 5 +--- + +In **Hugo**, pages are the core of your site. Once it is configured, pages are definitely the added value to your documentation site. + +## Folders + +Organize your site like [any other Hugo project](https://gohugo.io/content/organization/). Typically, you will have a *content* folder with all your pages. + + content + ├── level-one + │ ├── level-two + │ │ ├── level-three + │ │ │ ├── level-four + │ │ │ │ ├── _index.md <-- /level-one/level-two/level-three/level-four + │ │ │ │ ├── page-4-a.md <-- /level-one/level-two/level-three/level-four/page-4-a + │ │ │ │ ├── page-4-b.md <-- /level-one/level-two/level-three/level-four/page-4-b + │ │ │ │ └── page-4-c.md <-- /level-one/level-two/level-three/level-four/page-4-c + │ │ │ ├── _index.md <-- /level-one/level-two/level-three + │ │ │ ├── page-3-a.md <-- /level-one/level-two/level-three/page-3-a + │ │ │ ├── page-3-b.md <-- /level-one/level-two/level-three/page-3-b + │ │ │ └── page-3-c.md <-- /level-one/level-two/level-three/page-3-c + │ │ ├── _index.md <-- /level-one/level-two + │ │ ├── page-2-a.md <-- /level-one/level-two/page-2-a + │ │ ├── page-2-b.md <-- /level-one/level-two/page-2-b + │ │ └── page-2-c.md <-- /level-one/level-two/page-2-c + │ ├── _index.md <-- /level-one + │ ├── page-1-a.md <-- /level-one/page-1-a + │ ├── page-1-b.md <-- /level-one/page-1-b + │ └── page-1-c.md <-- /level-one/page-1-c + ├── _index.md <-- / + └── page-top.md <-- /page-top + +{{% notice note %}} +`_index.md` is required in each folder, it’s your “folder home page” +{{% /notice %}} + +## Types + +**Hugo-theme-learn** defines two types of pages. *Default* and *Chapter*. Both can be used at any level of the documentation, the only difference being layout display. + +A **Chapter** displays a page meant to be used as introduction for a set of child pages. Commonly, it contains a simple title and a catch line to define content that can be found under it. +You can define any HTML as prefix for the menu. In the example below, it's just a number but that could be an [icon](https://fortawesome.github.io/Font-Awesome/). + +![Chapter page](/en/cont/pages/images/pages-chapter.png?width=50pc) + +```markdown ++++ +title = "Basics" +chapter = true +weight = 5 +pre = "1. " ++++ + +### Chapter 1 + +# Basics + +Discover what this Hugo theme is all about and the core-concepts behind it. +``` + +To tell **Hugo-theme-learn** to consider a page as a chapter, set `chapter=true` in the Front Matter of the page. + +A **Default** page is any other content page. + +![Default page](/en/cont/pages/images/pages-default.png?width=50pc) + +```toml ++++ +title = "Installation" +weight = 15 ++++ +``` + +The following steps are here to help you initialize your new website. If you don't know Hugo at all, we strongly suggest you to train by following this [great documentation for beginners](https://gohugo.io/overview/quickstart/). + +## Create your project + +Hugo provides a `new` command to create a new website. + +``` +hugo new site +``` + +**Hugo-theme-learn** provides [archetypes]({{< relref "cont/archetypes.en.md" >}}) to help you create this kind of pages. + +## Front Matter configuration + +Each Hugo page has to define a [Front Matter](https://gohugo.io/content/front-matter/) in *yaml*, *toml* or *json*. + +**Hugo-theme-learn** uses the following parameters on top of Hugo ones : + +```toml ++++ +# Table of content (toc) is enabled by default. Set this parameter to true to disable it. +# Note: Toc is always disabled for chapter pages +disableToc = "false" +# If set, this will be used for the page's menu entry (instead of the `title` attribute) +menuTitle = "" +# The title of the page in menu will be prefixed by this HTML content +pre = "" +# The title of the page in menu will be postfixed by this HTML content +post = "" +# Set the page as a chapter, changing the way it's displayed +chapter = false +# Hide a menu entry by setting this to true +hidden = false +# Display name of this page modifier. If set, it will be displayed in the footer. +LastModifierDisplayName = "" +# Email of this page modifier. If set with LastModifierDisplayName, it will be displayed in the footer +LastModifierEmail = "" ++++ +``` + +### Add icon to a menu entry + +In the page frontmatter, add a `pre` param to insert any HTML code before the menu label. The example below uses the Github icon. + +```toml ++++ +title = "Github repo" +pre = " " ++++ +``` + +![Title with icon](/en/cont/pages/images/frontmatter-icon.png) + +### Ordering sibling menu/page entries + +Hugo provides a [flexible way](https://gohugo.io/content/ordering/) to handle order for your pages. + +The simplest way is to set `weight` parameter to a number. + +```toml ++++ +title = "My page" +weight = 5 ++++ +``` + +### Using a custom title for menu entries + +By default, **Hugo-theme-learn** will use a page's `title` attribute for the menu item (or `linkTitle` if defined). + +But a page's title has to be descriptive on its own while the menu is a hierarchy. +We've added the `menuTitle` parameter for that purpose: + +For example (for a page named `content/install/linux.md`): + +```toml ++++ +title = "Install on Linux" +menuTitle = "Linux" ++++ +``` + +## Homepage + +To configure your home page, you basically have three choices: + +1. Create an `_index.md` document in `content` folder and fill the file with *Markdown content* +2. Create an `index.html` file in the `static` folder and fill the file with *HTML content* +3. Configure your server to automatically redirect home page to one your documentation page diff --git a/themes/hugo-theme-learn/exampleSite/content/cont/pages/_index.fr.md b/themes/hugo-theme-learn/exampleSite/content/cont/pages/_index.fr.md new file mode 100644 index 000000000..50c6f256b --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/cont/pages/_index.fr.md @@ -0,0 +1,146 @@ +--- +date: 2016-04-09T16:50:16+02:00 +title: Organisation des pages +weight: 5 +--- + +Dans **Hugo**, les pages sont le cœur de votre site. Une fois configurées, les pages sont la valeur ajoutée de votre site de documentation. + +## Dossiers + +Organisez votre site comme n'importe quel autre [projet Hugo](https://gohugo.io/content/organization/). Typiquement, vous allez avoir un dossier *content* avec vos pages. + + content + ├── niveau-un + │ ├── niveau-deux + │ │ ├── niveau-trois + │ │ │ ├── niveau-quatre + │ │ │ │ ├── _index.md <-- /niveau-un/niveau-deux/niveau-trois/niveau-quatre + │ │ │ │ ├── page-4-a.md <-- /niveau-un/niveau-deux/niveau-trois/niveau-quatre/page-4-a + │ │ │ │ ├── page-4-b.md <-- /niveau-un/niveau-deux/niveau-trois/niveau-quatre/page-4-b + │ │ │ │ └── page-4-c.md <-- /niveau-un/niveau-deux/niveau-trois/niveau-quatre/page-4-c + │ │ │ ├── _index.md <-- /niveau-un/niveau-deux/niveau-trois + │ │ │ ├── page-3-a.md <-- /niveau-un/niveau-deux/niveau-trois/page-3-a + │ │ │ ├── page-3-b.md <-- /niveau-un/niveau-deux/niveau-trois/page-3-b + │ │ │ └── page-3-c.md <-- /niveau-un/niveau-deux/niveau-trois/page-3-c + │ │ ├── _index.md <-- /niveau-un/niveau-deux + │ │ ├── page-2-a.md <-- /niveau-un/niveau-deux/page-2-a + │ │ ├── page-2-b.md <-- /niveau-un/niveau-deux/page-2-b + │ │ └── page-2-c.md <-- /niveau-un/niveau-deux/page-2-c + │ ├── _index.md <-- /niveau-un + │ ├── page-1-a.md <-- /niveau-un/page-1-a + │ ├── page-1-b.md <-- /niveau-un/page-1-b + │ └── page-1-c.md <-- /niveau-un/page-1-c + ├── _index.md <-- / + └── premiere-page.md <-- /premiere-page + +{{% notice note %}} +Le fichier `_index.md` est obligatoire dans chaque dossier, c'est en quelque sorte votre page d'accueil pour le dossier. +{{% /notice %}} + +## Types + +**Hugo-theme-learn** définit deux types de pages. *Défaut* et *Chapitre*. Les deux sont utilisables à n'importe quel niveau du site, la seule différence est dans l'affichage. + +Un **Chapitre** affiche une page vouée à être une introduction pour un ensemble de pages filles. Habituellement, il va seulement contenir un titre et un résumé de la section. +Vous pouvez définir n'importe quel contenu HTML comme préfixe de l'entrée du menu. Dans l'exemple ci-dessous, c'est juste un nombre mais vous pourriez utiliser une [icône](https://fortawesome.github.io/Font-Awesome/). + +![Page Chapitre](/en/cont/pages/images/pages-chapter.png?width=50pc) + +```markdown ++++ +title = "Démarrage" +weight = 5 +pre = "1. " +chapter = true ++++ + +### Chapitre 1 + +# Démarrage + +Découvrez comment utiliser ce thème Hugo et apprenez en les concepts +``` + +Pour dire à **Hugo-theme-learn** de considérer la page comme un chapitre, configure `chapter=true` dans le Front Matter de la page. + +Une page **Défaut** est n'importe quelle autre page. + +![Page défaut](/en/cont/pages/images/pages-default.png?width=50pc) + + +++ + title = "Installation" + weight = 15 + +++ + + The following steps are here to help you initialize your new website. If you don't know Hugo at all, we strongly suggest you to train by following this [great documentation for beginners](https://gohugo.io/overview/quickstart/). + + ## Create your project + + Hugo provides a `new` command to create a new website. + + ``` + hugo new site + ``` + +**Hugo-theme-learn** fournit des [archétypes]({{< relref "cont/archetypes.fr.md" >}}) pour vous aider à créer ce type de pages. + +## Configuration des Front Matter + +Chaque page Hugo doit définir un [Front Matter](https://gohugo.io/content/front-matter/) dans le format *yaml*, *toml* ou *json*. + +**Hugo-theme-learn** utilise les paramètres suivant en plus de ceux définis par Hugo: + +```toml ++++ +# Le Sommaire (table of content = toc) est activé par défaut. Modifier ce paramètre à true pour le désactiver. +# Note: Le sommaire est toujours désactivé pour les chapitres +disableToc = "false" +# Le titre de la page dans le menu sera préfixé par ce contentu HTML +pre = "" +# Le titre de la page dans le menu sera suffixé par ce contentu HTML +post = "" +# Modifier le type de la page pour changer l'affichage +chapter = false +# Cache la page du menu +hidden = false +# Nom de la personne qui a modifié la page. Quand configuré, sera affiché dans le pied de page. +LastModifierDisplayName = "" +# Email de la personne qui a modifié la page. Quand configuré, sera affiché dans le pied de page. +LastModifierEmail = "" ++++ +``` + +### Ajouter une icône à une entrée du menu + +Dans le Front Matter, ajouter un paramètre `pre` pour insérer du code HTML qui s'affichera avant le label du menu. L'exemple ci-dessous utilise l'icône de Github. + +```toml ++++ +title = "Repo Github" +pre = " " ++++ +``` + +![Titre avec icône](/en/cont/pages/images/frontmatter-icon.png) + +### Ordonner les entrées dans le menu + +Hugo permet de modifier facilement [l'ordre des menu](https://gohugo.io/content/ordering/). + +La manière la plus simple est de configurer le paramètre `weight` avec un nombre. + +```toml ++++ +title = "Ma page" +weight = 5 ++++ +``` + +## Page d'accueil + +Pour configurer votre page d'accueil, vous avez trois choix: + +1. Créer une page `_index.md` dans le dossier `content` et remplissez le fichier avec du *contenu Markdown* +2. Créer une page `index.html` dans le dossier `static` et remplissez le fichier avec du *contenu HTML* +3. Configurez votre serveur pour automatiquement rediriger la page d'accueil vers l'une de vos pages. diff --git a/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/frontmatter-icon.png b/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/frontmatter-icon.png new file mode 100644 index 000000000..a8dd653ab Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/frontmatter-icon.png differ diff --git a/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/pages-chapter.png b/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/pages-chapter.png new file mode 100644 index 000000000..593d7e229 Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/pages-chapter.png differ diff --git a/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/pages-default.png b/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/pages-default.png new file mode 100644 index 000000000..396e788ec Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/content/cont/pages/images/pages-default.png differ diff --git a/themes/hugo-theme-learn/exampleSite/content/cont/tags.en.md b/themes/hugo-theme-learn/exampleSite/content/cont/tags.en.md new file mode 100644 index 000000000..02972bb6b --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/cont/tags.en.md @@ -0,0 +1,39 @@ +--- +date: 2018-11-29T08:41:44+01:00 +title: Tags +weight: 40 +tags: ["documentation", "tutorial"] +--- + +*Learn theme* support one default taxonomy of gohugo: the *tag* feature. + +## Configuration + +Just add tags to any page: + +```markdown +--- +date: 2018-11-29T08:41:44+01:00 +title: Theme tutorial +weight: 15 +tags: ["tutorial", "theme"] +--- +``` + +## Behavior + + +The tags are displayed at the top of the page, in their insertion order. + +Each tag is a link to a *Taxonomy* page displaying all the articles with the given tag. + +## List all the tags + +In the `config.toml` file you can add a shortcut to display all the tags + +```toml +[[menu.shortcuts]] +name = " Tags" +url = "/tags" +weight = 30 +``` \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/cont/tags.fr.md b/themes/hugo-theme-learn/exampleSite/content/cont/tags.fr.md new file mode 100644 index 000000000..d19b396c6 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/cont/tags.fr.md @@ -0,0 +1,40 @@ +--- +date: 2018-11-29T08:41:44+01:00 +title: Tags +weight: 40 +tags: ["documentation", "tutorial"] +--- + + +Le *thème Learn* supporte une des taxonomy par défaut de GoHugo : les tags. + +## Configuration + +Il suffit d'ajouter un tableau de tags sur la page : + +```markdown +--- +date: 2018-11-29T08:41:44+01:00 +title: Tutoriel pour le thème +weight: 15 +tags: ["tutoriel", "theme"] +--- +``` + +## Comportement + +Les tags sont affichés en haut de la page, dans l'ordre dans lequel ils ont été saisis. + +Chaque tag est un lien vers une page *Taxonomy*, qui affiche tous les article avec ce tag. + + +## Liste des tags + +Il est possible de rajouter un raccourci dans le fichier `config.toml` afin d'afficher une page listant tous les tags + +```toml +[[menu.shortcuts]] +name = " Tags" +url = "/tags" +weight = 30 +``` \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/credits.en.md b/themes/hugo-theme-learn/exampleSite/content/credits.en.md new file mode 100644 index 000000000..1a489fcfc --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/credits.en.md @@ -0,0 +1,28 @@ +--- +title: Credits +disableToc: true +--- + +## Contributors + +Thanks to them for making Open Source Software a better place ! + +{{% ghcontributors "https://api.github.com/repos/matcornic/hugo-theme-learn/contributors?per_page=100" %}} + +And a special thanks to [@vjeantet](https://github.com/vjeantet) for his work on [docdock](https://github.com/vjeantet/hugo-theme-docdock), a fork of hugo-theme-learn. v2.0.0 of this theme is inspired by his work. + +## Packages and libraries +* [mermaid](https://knsv.github.io/mermaid) - generation of diagram and flowchart from text in a similar manner as markdown +* [font awesome](http://fontawesome.io/) - the iconic font and CSS framework +* [jQuery](https://jquery.com) - The Write Less, Do More, JavaScript Library +* [lunr](https://lunrjs.com) - Lunr enables you to provide a great search experience without the need for external, server-side, search services... +* [horsey](https://bevacqua.github.io/horsey/) - Progressive and customizable autocomplete component +* [clipboard.js](https://zenorocha.github.io/clipboard.js) - copy text to clipboard +* [highlight.js](https://highlightjs.org) - Javascript syntax highlighter +* [modernizr](https://modernizr.com) - A JavaScript toolkit that allows web developers to use new CSS3 and HTML5 features while maintaining a fine level of control over browsers that don't support + +## Tooling + +* [Netlify](https://www.netlify.com) - Continuous deployement and hosting of this documentation +* [Hugo](https://gohugo.io/) + diff --git a/themes/hugo-theme-learn/exampleSite/content/credits.fr.md b/themes/hugo-theme-learn/exampleSite/content/credits.fr.md new file mode 100644 index 000000000..536f09381 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/credits.fr.md @@ -0,0 +1,28 @@ +--- +title: Crédits +disableToc: true +--- + +## Contributeurs + +Merci à eux de rendre le monde Open Source meilleur ! + +{{% ghcontributors "https://api.github.com/repos/matcornic/hugo-theme-learn/contributors?per_page=100" %}} + +Et un grand merci à [@vjeantet](https://github.com/vjeantet) pour son travail sur [docdock](https://github.com/vjeantet/hugo-theme-docdock), un fork de _hugo-theme-learn_. La v2.0.0 du thème est en grande partie inspirée de son travail. + +## Packages et librairies +* [mermaid](https://knsv.github.io/mermaid) - géneration de diagrames et graphiques à partir de texte similaire à Markdown +* [font awesome](http://fontawesome.io/) - Le framework de polices iconiques +* [jQuery](https://jquery.com) - La plus connue des librairies Javascript +* [lunr](https://lunrjs.com) - Lunr fournit des fonctions de recherche sans service externe +* [horsey](https://bevacqua.github.io/horsey/) - Autocomplétion de composants (utiliser pour les suggestions de recherche) +* [clipboard.js](https://zenorocha.github.io/clipboard.js) - Copier le texte dans le presse-papier +* [highlight.js](https://highlightjs.org) - Mise en valeur de syntaxes +* [modernizr](https://modernizr.com) - Une boite à outil Javascript qui permet aux développeurs d'utiliser les dernières fonctionnalités de CSS et HTML5, même sur de vieux navigateurs. + +## Outils + +* [Netlify](https://www.netlify.com) - Déploiement continue et hébergement de cette documentation +* [Hugo](https://gohugo.io/) + diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/_index.en.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/_index.en.md new file mode 100644 index 000000000..754bb0f0c --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/_index.en.md @@ -0,0 +1,16 @@ +--- +date: 2016-04-09T16:50:16+02:00 +title: Shortcodes +pre: "3. " +weight: 15 +--- + +Hugo uses Markdown for its simple content format. However, there are a lot of things that Markdown doesn’t support well. You could use pure HTML to expand possibilities. + +But this happens to be a bad idea. Everyone uses Markdown because it's pure and simple to read even non-rendered. You should avoid HTML to keep it as simple as possible. + +To avoid this limitations, Hugo created [shortcodes](https://gohugo.io/extras/shortcodes/). A shortcode is a simple snippet inside a page. + +**Hugo-theme-learn** provides multiple shortcodes on top of existing ones. + +{{%children style="h2" description="true" %}} diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/_index.fr.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/_index.fr.md new file mode 100644 index 000000000..b084d9bfd --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/_index.fr.md @@ -0,0 +1,16 @@ +--- +date: 2016-04-09T16:50:16+02:00 +title: Shortcodes +pre: "3. " +weight: 15 +--- + +Hugo utilise Markdown pour son format simple. Cependant, il y a beaucoup de chose que Markdown ne supporte pas bien. On pourrait utiliser du HTML pur pour améliorer les capacité du Markdown. + +Mais c'est probablement une mauvaise idée. Tout le monde utilise le Markdown parce que c'est pur et simple à lire même lorsqu'il est affiché en texte brut. Vous devez éviter le HTML autant que possible pour garder le contenu simple. + +Cependant, pour éviter les limitations, Hugo a créé les [shortcodes](https://gohugo.io/extras/shortcodes/). Un shortcode est un bout de code (*snippet*) dans une page. + +**Hugo-theme-learn** fournit de multiple shortcodes en plus de ceux existant. + +{{%children style="h2" description="true" %}} diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/BachGavotteShort.mp3 b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/BachGavotteShort.mp3 new file mode 100644 index 000000000..94e3d0e53 Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/BachGavotteShort.mp3 differ diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/Carroll_AliceAuPaysDesMerveilles.pdf b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/Carroll_AliceAuPaysDesMerveilles.pdf new file mode 100644 index 000000000..97377e99b Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/Carroll_AliceAuPaysDesMerveilles.pdf differ diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/adivorciarsetoca00cape.pdf b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/adivorciarsetoca00cape.pdf new file mode 100644 index 000000000..e589c73e9 Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/adivorciarsetoca00cape.pdf differ diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/hugo.png b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/hugo.png new file mode 100644 index 000000000..48acf346c Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/hugo.png differ diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/movieselectricsheep-flock-244-32500-2.mp4 b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/movieselectricsheep-flock-244-32500-2.mp4 new file mode 100644 index 000000000..9f1fe5645 Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.files/movieselectricsheep-flock-244-32500-2.mp4 differ diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.md new file mode 100644 index 000000000..81886b013 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.en.md @@ -0,0 +1,85 @@ +--- +title: Attachments +description : "The Attachments shortcode displays a list of files attached to a page." +--- + +The Attachments shortcode displays a list of files attached to a page. + +{{% attachments /%}} + +## Usage + +The shortcurt lists files found in a **specific folder**. +Currently, it support two implementations for pages + +1. If your page is a markdown file, attachements must be place in a **folder** named like your page and ending with **.files**. + + > * content + > * _index.md + > * page.files + > * attachment.pdf + > * page.md + +2. If your page is a **folder**, attachements must be place in a nested **'files'** folder. + + > * content + > * _index.md + > * page + > * index.md + > * files + > * attachment.pdf + +Be aware that if you use a multilingual website, you will need to have as many folders as languages. + +That's all ! + +### Parameters + +| Parameter | Default | Description | +|:--|:--|:--| +| title | "Attachments" | List's title | +| style | "" | Choose between "orange", "grey", "blue" and "green" for nice style | +| pattern | ".*" | A regular expressions, used to filter the attachments by file name.

The **pattern** parameter value must be [regular expressions](https://en.wikipedia.org/wiki/Regular_expression). + +For example: + +* To match a file suffix of 'jpg', use **.*jpg** (not *.jpg). +* To match file names ending in 'jpg' or 'png', use **.*(jpg|png)** + +### Examples + +#### List of attachments ending in pdf or mp4 + + + {{%/*attachments title="Related files" pattern=".*(pdf|mp4)"/*/%}} + +renders as + +{{%attachments title="Related files" pattern=".*(pdf|mp4)"/%}} + +#### Colored styled box + + {{%/*attachments style="orange" /*/%}} + +renders as + +{{% attachments style="orange" /%}} + + + {{%/*attachments style="grey" /*/%}} + +renders as + +{{% attachments style="grey" /%}} + + {{%/*attachments style="blue" /*/%}} + +renders as + +{{% attachments style="blue" /%}} + + {{%/*attachments style="green" /*/%}} + +renders as + +{{% attachments style="green" /%}} \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/BachGavotteShort.mp3 b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/BachGavotteShort.mp3 new file mode 100644 index 000000000..94e3d0e53 Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/BachGavotteShort.mp3 differ diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/Carroll_AliceAuPaysDesMerveilles.pdf b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/Carroll_AliceAuPaysDesMerveilles.pdf new file mode 100644 index 000000000..97377e99b Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/Carroll_AliceAuPaysDesMerveilles.pdf differ diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/adivorciarsetoca00cape.pdf b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/adivorciarsetoca00cape.pdf new file mode 100644 index 000000000..e589c73e9 Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/adivorciarsetoca00cape.pdf differ diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/hugo.png b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/hugo.png new file mode 100644 index 000000000..48acf346c Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/hugo.png differ diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/movieselectricsheep-flock-244-32500-2.mp4 b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/movieselectricsheep-flock-244-32500-2.mp4 new file mode 100644 index 000000000..9f1fe5645 Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.files/movieselectricsheep-flock-244-32500-2.mp4 differ diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.md new file mode 100644 index 000000000..c24093915 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/attachments.fr.md @@ -0,0 +1,85 @@ +--- +title: Attachments (Pièces jointes) +description : "The Attachments shortcode displays a list of files attached to a page." +--- + +Le shortcode *Attachments* affiche une liste de pièces jointes d'une page. + +{{% attachments /%}} + +## Utilisation + +Le shortcode affiche la liste de fichiers trouvés dans un **dossier spécifique** +A l'heure actuelle, il supporte deux implémentations + +1. Si votre page est un fichier Markdown, les pièces jointes doivent être placée dans un **dossier** nommé comme le nom de la page et suffixé par **.files**. + + > * content + > * _index.md + > * page.files + > * attachment.pdf + > * page.md + +2. Si votre page est un **dossier**, les pièces jointes doivent être placées dans un dossier fils **'files'**. + + > * content + > * _index.md + > * page + > * index.md + > * files + > * attachment.pdf + +Attention, si votre site est multi-langue, vous devrez avec autant de dossier qu'il y a de langues. + +C'est tout ! + +### Paramètres + +| Paramètre | Défaut | Description | +|:--|:--|:--| +| title | "Pièces jointes" | Titre de la liste | +| style | "" | Choisir entre "orange", "grey", "blue" et "green" pour un style plus sympa | +| pattern | ".*" | Une expression régulière, utilisée pour filtrer les pièces jointes par leur nom de fichier.

Le paramètre **pattern** doit être une [expression régulière](https://en.wikipedia.org/wiki/Regular_expression). + +Par exemple: + +* Pour trouver les fichiers avec le suffixe 'jpg', utilisez **.*jpg** (pas *.jpg). +* Pour trouver les fichiers avec les suffixe 'jpg' ou 'png', utilisez **.*(jpg|png)** + +### Exemples + +#### Lister les pièces jointes de type pdf ou mp4 + + + {{%/*attachments title="Fichiers associés" pattern=".*(pdf|mp4)"/*/%}} + +s'affiche comme + +{{%attachments title="Fichiers associés" pattern=".*(pdf|mp4)"/%}} + +#### Modifier le style + + {{%/*attachments style="orange" /*/%}} + +s'affiche comme + +{{% attachments style="orange" /%}} + + + {{%/*attachments style="grey" /*/%}} + +s'affiche comme + +{{% attachments style="grey" /%}} + + {{%/*attachments style="blue" /*/%}} + +s'affiche comme + +{{% attachments style="blue" /%}} + + {{%/*attachments style="green" /*/%}} + +s'affiche comme + +{{% attachments style="green" /%}} \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/button.en.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/button.en.md new file mode 100644 index 000000000..9fb92bd98 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/button.en.md @@ -0,0 +1,16 @@ +--- +title: Button +description : "Nice buttons on your page." +--- + +A button is a just a clickable button with optional icon. + +``` +{{%/* button href="https://getgrav.org/" */%}}Get Grav{{%/* /button */%}} +{{%/* button href="https://getgrav.org/" icon="fas fa-download" */%}}Get Grav with icon{{%/* /button */%}} +{{%/* button href="https://getgrav.org/" icon="fas fa-download" icon-position="right" */%}}Get Grav with icon right{{%/* /button */%}} +``` + +{{% button href="https://getgrav.org/" %}}Get Grav{{% /button %}} +{{% button href="https://getgrav.org/" icon="fas fa-download" %}}Get Grav with icon{{% /button %}} +{{% button href="https://getgrav.org/" icon="fas fa-download" icon-position="right" %}}Get Grav with icon right{{% /button %}} diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/button.fr.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/button.fr.md new file mode 100644 index 000000000..66e55af75 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/button.fr.md @@ -0,0 +1,16 @@ +--- +title: Button (Bouton) +description : "De beaux boutons sur votre page." +--- + +Le shortcode *button* est simplement un bouton cliquable avec une icône optionnelle. + +``` +{{%/* button href="https://getgrav.org/" */%}}Téléchargez Grav{{%/* /button */%}} +{{%/* button href="https://getgrav.org/" icon="fas fa-download" */%}}Téléchargez Grav avec icône{{%/* /button */%}} +{{%/* button href="https://getgrav.org/" icon="fas fa-download" icon-position="right" */%}}Téléchargez Grav avec icône à droite{{%/* /button */%}} +``` + +{{% button href="https://getgrav.org/" %}}Téléchargez Grav{{% /button %}} +{{% button href="https://getgrav.org/" icon="fas fa-download" %}}Téléchargez Grav avec icône{{% /button %}} +{{% button href="https://getgrav.org/" icon="fas fa-download" icon-position="right" %}}Téléchargez Grav avec icône à droite{{% /button %}} diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/_index.en.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/_index.en.md new file mode 100644 index 000000000..0178536fa --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/_index.en.md @@ -0,0 +1,45 @@ +--- +title : Children +description : List the child pages of a page +--- + +Use the children shortcode to list the child pages of a page and the further descendants (children's children). By default, the shortcode displays links to the child pages. + +## Usage + +| Parameter | Default | Description | +|:--|:--|:--| +| page | _current_ | Specify the page name (section name) to display children for | +| style | "li" | Choose the style used to display descendants. It could be any HTML tag name | +| showhidden | "false" | When true, child pages hidden from the menu will be displayed | +| description | "false" | Allows you to include a short text under each page in the list.
when no description exists for the page, children shortcode takes the first 70 words of your content. [read more info about summaries on gohugo.io](https://gohugo.io/content/summaries/) | +| depth | 1 | Enter a number to specify the depth of descendants to display. For example, if the value is 2, the shortcode will display 2 levels of child pages.
**Tips:** set 999 to get all descendants| +| sort | none | Sort Children By
  • Weight - to sort on menu order
  • Name - to sort alphabetically on menu label
  • Identifier - to sort alphabetically on identifier set in frontmatter
  • URL - URL
  • | + +## Demo + + {{%/* children */%}} + +{{% children %}} + + {{%/* children description="true" */%}} + +{{%children description="true" %}} + + {{%/* children depth="3" showhidden="true" */%}} + +{{% children depth="3" showhidden="true" %}} + + {{%/* children style="h2" depth="3" description="true" */%}} + +{{% children style="h2" depth="3" description="true" %}} + + {{%/* children style="div" depth="999" */%}} + +{{% children style="div" depth="999" %}} + + + + + + diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/_index.fr.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/_index.fr.md new file mode 100644 index 000000000..672c5ad61 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/_index.fr.md @@ -0,0 +1,45 @@ +--- +title : Children (Pages filles) +description : Liste les pages filles de la page +--- + +Utilisez le shortcode *children* pour lister les pages filles de la page et tous ses déscendants (pages filles de pages filles). Par défaut, le shortcode affiche des liens vers les pages filles. + +## Utilisation + +| Paramètre | Défaut | Description | +|:--|:--|:--| +| page | _current_ | Spécifie le nom de la page (nom de la section) à afficher | +| style | "li" | Choisi le style à utiliser pour afficher les descendants. Cela peut être n'importe quel balise HTML | +| showhidden | "false" | Quand *true*, pages filles cachées dans le menu seront affichées quand même | +| description | "false" | Permet d'inclure le texte de la description de la page sous chaque entré de la liste.
    quand aucune description existe pour la page, le shortcode prend les 70 premiers mots du contenu. [plus d'infos sur gohugo.io](https://gohugo.io/content/summaries/) | +| depth | 1 | Nombre de descendants à afficher. Par exemple, si la valeur est 2, le shortcode va afficher 2 niveaux de pages filels.
    **Astuce:** Utilisez 999 pour avoir tous les descendants| +| sort | | Tri les pages filles par
  • Weight - Poids
  • Name - Nom
  • Identifier - Trier alphabétiquement par identifiant configuré dans le front matter
  • URL - URL
  • | + +## Démo + + {{%/* children */%}} + +{{% children %}} + + {{%/* children description="true" */%}} + +{{%children description="true" %}} + + {{%/* children depth="3" showhidden="true" */%}} + +{{% children depth="3" showhidden="true" %}} + + {{%/* children style="h2" depth="3" description="true" */%}} + +{{% children style="h2" depth="3" description="true" %}} + + {{%/* children style="div" depth="999" */%}} + +{{% children style="div" depth="999" %}} + + + + + + diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/_index.en.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/_index.en.md new file mode 100644 index 000000000..d0c5179db --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/_index.en.md @@ -0,0 +1,6 @@ ++++ +title = "page 1" +description = "This is a demo child page" ++++ + +This is a demo child page \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/_index.fr.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/_index.fr.md new file mode 100644 index 000000000..7737f5034 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/_index.fr.md @@ -0,0 +1,6 @@ ++++ +title = "page 1" +description = "Ceci est une page test" ++++ + +Ceci est une page de demo \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.en.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.en.md new file mode 100644 index 000000000..a4982f96e --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.en.md @@ -0,0 +1,6 @@ ++++ +title = "page 1-1" +description = "This is a demo child page" ++++ + +This is a demo child page \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.fr.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.fr.md new file mode 100644 index 000000000..e39cb5828 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.fr.md @@ -0,0 +1,6 @@ ++++ +title = "page 1-1" +description = "Ceci est une page test" ++++ + +Ceci est une page de demo \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.en.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.en.md new file mode 100644 index 000000000..5ce56f4da --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.en.md @@ -0,0 +1,6 @@ ++++ +title = "page 1-1-1" +description = "This is a demo child page" ++++ + +This is a demo child page \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.fr.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.fr.md new file mode 100644 index 000000000..31d2cd118 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.fr.md @@ -0,0 +1,6 @@ ++++ +title = "page 1-1-1" +description = "Ceci est une page test" ++++ + +Ceci est une page de demo \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.en.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.en.md new file mode 100644 index 000000000..d5d9ab277 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.en.md @@ -0,0 +1,6 @@ ++++ +title = "page 1-1-1-1" +description = "This is a demo child page" ++++ + +This is a demo child page \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.fr.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.fr.md new file mode 100644 index 000000000..3b0f7f096 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.fr.md @@ -0,0 +1,6 @@ ++++ +title = "page 1-1-1-1" +description = "Ceci est une page test" ++++ + +Ceci est une page de demo \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.en.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.en.md new file mode 100644 index 000000000..883b5b218 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.en.md @@ -0,0 +1,6 @@ ++++ +title = "page 1-1-1-1-1" +description = "This is a demo child page" ++++ + +This is a demo child page \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.fr.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.fr.md new file mode 100644 index 000000000..5a1961725 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.fr.md @@ -0,0 +1,6 @@ ++++ +title = "page 1-1-1-1-1" +description = "Ceci est une page test" ++++ + +Ceci est une page de demo \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/_index.en.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/_index.en.md new file mode 100644 index 000000000..a96140c25 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/_index.en.md @@ -0,0 +1,11 @@ ++++ +title = "page 2" +description = "" ++++ + +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, + quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo + consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse + cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non + proident, sunt in culpa qui officia deserunt mollit anim id est laborum. \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/_index.fr.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/_index.fr.md new file mode 100644 index 000000000..a96140c25 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/_index.fr.md @@ -0,0 +1,11 @@ ++++ +title = "page 2" +description = "" ++++ + +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, + quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo + consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse + cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non + proident, sunt in culpa qui officia deserunt mollit anim id est laborum. \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/test3.en.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/test3.en.md new file mode 100644 index 000000000..f603d4c0c --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/test3.en.md @@ -0,0 +1,6 @@ ++++ +title = "page test 3" +description = "This is a page test" ++++ + +This is a test 3 demo child page \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/test3.fr.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/test3.fr.md new file mode 100644 index 000000000..6d649e807 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-2/test3.fr.md @@ -0,0 +1,6 @@ ++++ +title = "page test 3" +description = "Ceci est une page test" ++++ + +Ceci est une page de demo test 3 \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-3/_index.en.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-3/_index.en.md new file mode 100644 index 000000000..f36f8616e --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-3/_index.en.md @@ -0,0 +1,6 @@ ++++ +title = "page 3" +description = "This is a demo child page" ++++ + +This is a demo child page, not displayed in the menu \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-3/_index.fr.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-3/_index.fr.md new file mode 100644 index 000000000..1501cc82b --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-3/_index.fr.md @@ -0,0 +1,6 @@ ++++ +title = "page 3" +description = "Ceci est une page test" ++++ + +Ceci est une page de demo \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-4/_index.en.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-4/_index.en.md new file mode 100644 index 000000000..b9f042d81 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-4/_index.en.md @@ -0,0 +1,7 @@ ++++ +title = "page 4" +description = "This is a demo child page" +hidden = true ++++ + +This is a demo child page, not displayed in the menu \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-4/_index.fr.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-4/_index.fr.md new file mode 100644 index 000000000..6735e5041 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/children-4/_index.fr.md @@ -0,0 +1,7 @@ ++++ +title = "page 4" +description = "Ceci est une page test" +hidden = true ++++ + +Ceci est une page de demo \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/test.en.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/test.en.md new file mode 100644 index 000000000..045f0a1e2 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/test.en.md @@ -0,0 +1,6 @@ ++++ +title = "page test" +description = "This is a page test" ++++ + +This is a test demo child page \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/test.fr.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/test.fr.md new file mode 100644 index 000000000..dd6cc3c3e --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/children/test.fr.md @@ -0,0 +1,6 @@ ++++ +title = "page test" +description = "Ceci est une page test" ++++ + +Ceci est une page de demo \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/expand.en.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/expand.en.md new file mode 100644 index 000000000..dff19061c --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/expand.en.md @@ -0,0 +1,45 @@ +--- +title : Expand +description : "Displays an expandable/collapsible section of text on your page" +--- + +The Expand shortcode displays an expandable/collapsible section of text on your page. +Here is an example + +{{%expand%}} +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +{{%/expand%}} + + +## Usage + + +this shortcode takes exactly one optional parameter to define the text that appears next to the expand/collapse icon. (default is "Expand me...") + + {{%/*expand "Is this learn theme rocks ?" */%}}Yes !.{{%/* /expand*/%}} + +{{%expand "Is this learn theme rocks ?" %}}Yes !{{% /expand%}} + +# Demo + + {{%/*expand*/%}} + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, + quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo + consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse + cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non + proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + {{%/* /expand*/%}} + + +{{%expand%}}Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum.{{% /expand%}} \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/expand.fr.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/expand.fr.md new file mode 100644 index 000000000..efb86a3c9 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/expand.fr.md @@ -0,0 +1,45 @@ +--- +title : Expand +description : "Affiche une section de texte qui se plie et se déplie" +--- + +Le shortcode *Expand* affiche une section de texte qui se plie et se déplie. +Ci-dessous un exemple. + +{{%expand%}} +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +{{%/expand%}} + + +## Utilisation + + +Ce shortcode prends exactement un paramètre optionel pour définir le texte à côté de l'icone. (valeur par défaut est "Déroulez-moi...") + + {{%/*expand "Est-ce que ce thème envoie du pâté ?" */%}}Oui !.{{%/* /expand*/%}} + +{{%expand "Est-ce que ce thème envoie du pâté ?" %}}Oui !{{% /expand%}} + +# Demo + + {{%/*expand*/%}} + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, + quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo + consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse + cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non + proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + {{%/* /expand*/%}} + + +{{%expand%}}Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, +quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo +consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse +cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non +proident, sunt in culpa qui officia deserunt mollit anim id est laborum.{{% /expand%}} \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/mermaid.en.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/mermaid.en.md new file mode 100644 index 000000000..e5b740053 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/mermaid.en.md @@ -0,0 +1,283 @@ +--- +title : "Mermaid" +description : "Generation of diagram and flowchart from text in a similar manner as markdown" +--- + +[Mermaid](https://mermaidjs.github.io/) is a library helping you to generate diagram and flowcharts from text, in a similar manner as Markdown. + +Just insert your mermaid code in the `mermaid` shortcode and that's it. + +## Flowchart example + + {{}} + graph LR; + A[Hard edge] -->|Link text| B(Round edge) + B --> C{Decision} + C -->|One| D[Result one] + C -->|Two| E[Result two] + {{}} + +renders as + +{{}} +graph LR; + A[Hard edge] -->|Link text| B(Round edge) + B --> C{Decision} + C -->|One| D[Result one] + C -->|Two| E[Result two] +{{< /mermaid >}} + +or you can use this alternative syntax: + +
    +```mermaid
    +graph LR;
    +  A[Hard edge] -->|Link text| B(Round edge)
    +    B --> C{Decision}
    +    C -->|One| D[Result one]
    +    C -->|Two| E[Result two]
    +```
    +
    + +renders as + +```mermaid +graph LR; + A[Hard edge] -->|Link text| B(Round edge) + B --> C{Decision} + C -->|One| D[Result one] + C -->|Two| E[Result two] +``` + +## Sequence example + + {{}} + sequenceDiagram + participant Alice + participant Bob + Alice->>John: Hello John, how are you? + loop Healthcheck + John->John: Fight against hypochondria + end + Note right of John: Rational thoughts
    prevail... + John-->Alice: Great! + John->Bob: How about you? + Bob-->John: Jolly good! + {{}} + +renders as + +{{}} +sequenceDiagram + participant Alice + participant Bob + Alice->>John: Hello John, how are you? + loop Healthcheck + John->John: Fight against hypochondria + end + Note right of John: Rational thoughts
    prevail... + John-->Alice: Great! + John->Bob: How about you? + Bob-->John: Jolly good! +{{< /mermaid >}} + +or you can use this alternative syntax: + +
    +```mermaid
    +sequenceDiagram
    +    participant Alice
    +    participant Bob
    +    Alice->>John: Hello John, how are you?
    +    loop Healthcheck
    +        John->John: Fight against hypochondria
    +    end
    +    Note right of John: Rational thoughts 
    prevail... + John-->Alice: Great! + John->Bob: How about you? + Bob-->John: Jolly good! +``` +
    + +renders as + +```mermaid +sequenceDiagram + participant Alice + participant Bob + Alice->>John: Hello John, how are you? + loop Healthcheck + John->John: Fight against hypochondria + end + Note right of John: Rational thoughts
    prevail... + John-->Alice: Great! + John->Bob: How about you? + Bob-->John: Jolly good! +``` + +## GANTT Example + + {{}} + gantt + dateFormat YYYY-MM-DD + title Adding GANTT diagram functionality to mermaid + section A section + Completed task :done, des1, 2014-01-06,2014-01-08 + Active task :active, des2, 2014-01-09, 3d + Future task : des3, after des2, 5d + Future task2 : des4, after des3, 5d + section Critical tasks + Completed task in the critical line :crit, done, 2014-01-06,24h + Implement parser and jison :crit, done, after des1, 2d + Create tests for parser :crit, active, 3d + Future task in critical line :crit, 5d + Create tests for renderer :2d + Add to mermaid :1d + {{}} + + +renders as + +{{}} +gantt + dateFormat YYYY-MM-DD + title Adding GANTT diagram functionality to mermaid + section A section + Completed task :done, des1, 2014-01-06,2014-01-08 + Active task :active, des2, 2014-01-09, 3d + Future task : des3, after des2, 5d + Future task2 : des4, after des3, 5d + section Critical tasks + Completed task in the critical line :crit, done, 2014-01-06,24h + Implement parser and jison :crit, done, after des1, 2d + Create tests for parser :crit, active, 3d + Future task in critical line :crit, 5d + Create tests for renderer :2d + Add to mermaid :1d +{{}} + +or you can use this alternative syntax: + +
    +```mermaid
    +gantt
    +        dateFormat  YYYY-MM-DD
    +        title Adding GANTT diagram functionality to mermaid
    +        section A section
    +        Completed task            :done,    des1, 2014-01-06,2014-01-08
    +        Active task               :active,  des2, 2014-01-09, 3d
    +        Future task               :         des3, after des2, 5d
    +        Future task2               :         des4, after des3, 5d
    +        section Critical tasks
    +        Completed task in the critical line :crit, done, 2014-01-06,24h
    +        Implement parser and jison          :crit, done, after des1, 2d
    +        Create tests for parser             :crit, active, 3d
    +        Future task in critical line        :crit, 5d
    +        Create tests for renderer           :2d
    +        Add to mermaid                      :1d
    +```
    +
    + +renders as + +```mermaid +gantt + dateFormat YYYY-MM-DD + title Adding GANTT diagram functionality to mermaid + section A section + Completed task :done, des1, 2014-01-06,2014-01-08 + Active task :active, des2, 2014-01-09, 3d + Future task : des3, after des2, 5d + Future task2 : des4, after des3, 5d + section Critical tasks + Completed task in the critical line :crit, done, 2014-01-06,24h + Implement parser and jison :crit, done, after des1, 2d + Create tests for parser :crit, active, 3d + Future task in critical line :crit, 5d + Create tests for renderer :2d + Add to mermaid :1d +``` + +### Class example + +
    +```mermaid
    +classDiagram
    +  Class01 <|-- AveryLongClass : Cool
    +  Class03 *-- Class04
    +  Class05 o-- Class06
    +  Class07 .. Class08
    +  Class09 --> C2 : Where am i?
    +  Class09 --* C3
    +  Class09 --|> Class07
    +  Class07 : equals()
    +  Class07 : Object[] elementData
    +  Class01 : size()
    +  Class01 : int chimp
    +  Class01 : int gorilla
    +  Class08 <--> C2: Cool label
    +```
    +
    + +renders as + +```mermaid +classDiagram + Class01 <|-- AveryLongClass : Cool + Class03 *-- Class04 + Class05 o-- Class06 + Class07 .. Class08 + Class09 --> C2 : Where am i? + Class09 --* C3 + Class09 --|> Class07 + Class07 : equals() + Class07 : Object[] elementData + Class01 : size() + Class01 : int chimp + Class01 : int gorilla + Class08 <--> C2: Cool label +``` + +### Git example + +
    +```mermaid
    +gitGraph:
    +options
    +{
    +  "nodeSpacing": 150,
    +  "nodeRadius": 10
    +}
    +end
    +  commit
    +  branch newbranch
    +  checkout newbranch
    +  commit
    +  commit
    +  checkout master
    +  commit
    +  commit
    +  merge newbranch
    +```
    +
    + +renders as + +```mermaid +gitGraph: +options +{ + "nodeSpacing": 150, + "nodeRadius": 10 +} +end + commit + branch newbranch + checkout newbranch + commit + commit + checkout master + commit + commit + merge newbranch +``` \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/mermaid.fr.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/mermaid.fr.md new file mode 100644 index 000000000..e59e17848 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/mermaid.fr.md @@ -0,0 +1,283 @@ +--- +title : "Mermaid" +description : "Génération de diagrammes à partir de texte, dans le même style que Markdown" +--- + +[Mermaid](https://mermaidjs.github.io/) est une bibliothèque Javascript qui permet de générer des diagrammes (séquence, état, gantt, etc.) à partir de texte, dans le même style que Markdown. + +Insérer votre code Mermaid dans un shortcode `mermaid` et c'est tout. + +## Flowchart example + {{}} + graph LR; + A[Bords droits] -->|Lien texte| B(Bords arondis) + B --> C{Décision} + C -->|Un| D[Résultat un] + C -->|Deux| E[Résultat deux] + {{}} + +renders as + +{{}} +graph LR; + A[Bords droits] -->|Lien texte| B(Bords arondis) + B --> C{Décision} + C -->|Un| D[Résultat un] + C -->|Deux| E[Résultat deux] +{{< /mermaid >}} + +or you can use this alternative syntax: + +
    +```mermaid
    +graph LR;
    +	A[Bords droits] -->|Lien texte| B(Bords arondis)
    +	B --> C{Décision}
    +	C -->|Un| D[Résultat un]
    +	C -->|Deux| E[Résultat deux]
    +```
    +
    + +renders as + +```mermaid +graph LR; + A[Bords droits] -->|Lien texte| B(Bords arondis) + B --> C{Décision} + C -->|Un| D[Résultat un] + C -->|Deux| E[Résultat deux] +``` + +## Sequence example + + {{}} + sequenceDiagram + participant Alice + participant Bob + Alice->>John: Salut John, comment vas-tu? + loop Vérification + John->John: Se bat contre l'hyponcodrie. + end + Note right of John: Les pensées rationnelles
    prédominent... + John-->Alice: Super! + John->Bob: Et toi? + Bob-->John: Au top! + {{}} + +renders as + +{{}} +sequenceDiagram + participant Alice + participant Bob + Alice->>John: Salut John, comment vas-tu? + loop Vérification + John->John: Se bat contre l'hyponcodrie. + end + Note right of John: Les pensées rationnelles
    prédominent... + John-->Alice: Super! + John->Bob: Et toi? + Bob-->John: Au top! +{{< /mermaid >}} + +or you can use this alternative syntax: + +
    +```mermaid
    +sequenceDiagram
    +	participant Alice
    +	participant Bob
    +	Alice->>John: Salut John, comment vas-tu?
    +	loop Vérification
    +		John->John: Se bat contre l'hyponcodrie.
    +	end
    +	Note right of John: Les pensées rationnelles
    prédominent... + John-->Alice: Super! + John->Bob: Et toi? + Bob-->John: Au top! +``` +
    + +renders as + +```mermaid +sequenceDiagram + participant Alice + participant Bob + Alice->>John: Salut John, comment vas-tu? + loop Vérification + John->John: Se bat contre l'hyponcodrie. + end + Note right of John: Les pensées rationnelles
    prédominent... + John-->Alice: Super! + John->Bob: Et toi? + Bob-->John: Au top! +``` + +## GANTT Example + + {{}} + gantt + dateFormat YYYY-MM-DD + title Ajout de la fonctionnalité de GANTT à Mermaid + section Une section + Tâche complétée :done, des1, 2014-01-06,2014-01-08 + Tâche en cours :active, des2, 2014-01-09, 3d + Future tâche : des3, after des2, 5d + Future tâche 2 : des4, after des3, 5d + section Tâches critiques + Tâche complétée dans le chemin critique :crit, done, 2014-01-06,24h + Implémenter le parser et jison :crit, done, after des1, 2d + Créer des tests pour le parser :crit, active, 3d + Future tâche dans le chemin critique :crit, 5d + Créer des tests pour le renderer :2d + Ajout à Mermaid :1d + {{}} + + +renders as + +{{}} +gantt + dateFormat YYYY-MM-DD + title Ajout de la fonctionnalité de GANTT à Mermaid + section Une section + Tâche complétée :done, des1, 2014-01-06,2014-01-08 + Tâche en cours :active, des2, 2014-01-09, 3d + Future tâche : des3, after des2, 5d + Future tâche 2 : des4, after des3, 5d + section Tâches critiques + Tâche complétée dans le chemin critique :crit, done, 2014-01-06,24h + Implémenter le parser et jison :crit, done, after des1, 2d + Créer des tests pour le parser :crit, active, 3d + Future tâche dans le chemin critique :crit, 5d + Créer des tests pour le renderer :2d + Ajout à Mermaid :1d +{{}} + + +or you can use this alternative syntax: + +
    +```mermaid
    +gantt
    +		dateFormat  YYYY-MM-DD
    +		title Ajout de la fonctionnalité de GANTT à Mermaid
    +		section Une section
    +		Tâche complétée            :done,    des1, 2014-01-06,2014-01-08
    +		Tâche en cours             :active,  des2, 2014-01-09, 3d
    +		Future tâche               :         des3, after des2, 5d
    +		Future tâche 2             :         des4, after des3, 5d
    +		section Tâches critiques
    +		Tâche complétée dans le chemin critique :crit, done, 2014-01-06,24h
    +		Implémenter le parser et jison          :crit, done, after des1, 2d
    +		Créer des tests pour le parser             :crit, active, 3d
    +		Future tâche dans le chemin critique        :crit, 5d
    +		Créer des tests pour le renderer           :2d
    +		Ajout à Mermaid                      :1d
    +```
    +
    + +renders as + +```mermaid +gantt + dateFormat YYYY-MM-DD + title Ajout de la fonctionnalité de GANTT à Mermaid + section Une section + Tâche complétée :done, des1, 2014-01-06,2014-01-08 + Tâche en cours :active, des2, 2014-01-09, 3d + Future tâche : des3, after des2, 5d + Future tâche 2 : des4, after des3, 5d + section Tâches critiques + Tâche complétée dans le chemin critique :crit, done, 2014-01-06,24h + Implémenter le parser et jison :crit, done, after des1, 2d + Créer des tests pour le parser :crit, active, 3d + Future tâche dans le chemin critique :crit, 5d + Créer des tests pour le renderer :2d + Ajout à Mermaid :1d +``` + +### Class example + +
    +```mermaid
    +classDiagram
    +  Class01 <|-- AveryLongClass : Cool
    +  Class03 *-- Class04
    +  Class05 o-- Class06
    +  Class07 .. Class08
    +  Class09 --> C2 : Where am i?
    +  Class09 --* C3
    +  Class09 --|> Class07
    +  Class07 : equals()
    +  Class07 : Object[] elementData
    +  Class01 : size()
    +  Class01 : int chimp
    +  Class01 : int gorilla
    +  Class08 <--> C2: Cool label
    +```
    +
    + +renders as + +```mermaid +classDiagram + Class01 <|-- AveryLongClass : Cool + Class03 *-- Class04 + Class05 o-- Class06 + Class07 .. Class08 + Class09 --> C2 : Where am i? + Class09 --* C3 + Class09 --|> Class07 + Class07 : equals() + Class07 : Object[] elementData + Class01 : size() + Class01 : int chimp + Class01 : int gorilla + Class08 <--> C2: Cool label +``` + +### Git example + +
    +```mermaid
    +gitGraph:
    +options
    +{
    +  "nodeSpacing": 150,
    +  "nodeRadius": 10
    +}
    +end
    +  commit
    +  branch newbranch
    +  checkout newbranch
    +  commit
    +  commit
    +  checkout master
    +  commit
    +  commit
    +  merge newbranch
    +```
    +
    + +renders as + +```mermaid +gitGraph: +options +{ + "nodeSpacing": 150, + "nodeRadius": 10 +} +end + commit + branch newbranch + checkout newbranch + commit + commit + checkout master + commit + commit + merge newbranch +``` diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/notice.en.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/notice.en.md new file mode 100644 index 000000000..c82a6e9f5 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/notice.en.md @@ -0,0 +1,62 @@ +--- +title: Notice +description : "Disclaimers to help you structure your page" +--- + +The notice shortcode shows 4 types of disclaimers to help you structure your page. + +### Note + +``` +{{%/* notice note */%}} +A notice disclaimer +{{%/* /notice */%}} +``` + +renders as + +{{% notice note %}} +A notice disclaimer +{{% /notice %}} + +### Info + +``` +{{%/* notice info */%}} +An information disclaimer +{{%/* /notice */%}} +``` + +renders as + +{{% notice info %}} +An information disclaimer +{{% /notice %}} + +### Tip + +``` +{{%/* notice tip */%}} +A tip disclaimer +{{%/* /notice */%}} +``` + +renders as + +{{% notice tip %}} +A tip disclaimer +{{% /notice %}} + +### Warning + +``` +{{%/* notice warning */%}} +A warning disclaimer +{{%/* /notice */%}} +``` + +renders as + +{{% notice warning %}} +A warning disclaimer +{{% /notice %}} diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/notice.fr.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/notice.fr.md new file mode 100644 index 000000000..91e4d7052 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/notice.fr.md @@ -0,0 +1,62 @@ +--- +title: Notice +description : "Message pour vous aider à structurer votre contenu" +--- + +Le shortcode *Notice* permet d'afficher 4 types de message pour vous aider à structurer votre contenu. + +### Note + +``` +{{%/* notice note */%}} +Une notice de type *note* +{{%/* /notice */%}} +``` + +s'affiche comme + +{{% notice note %}} +Une notice de type *note* +{{% /notice %}} + +### Info + +``` +{{%/* notice info */%}} +Une notice de type *info* +{{%/* /notice */%}} +``` + +s'affiche comme + +{{% notice info %}} +Une notice de type *info* +{{% /notice %}} + +### Tip + +``` +{{%/* notice tip */%}} +Une notice de type *tip* +{{%/* /notice */%}} +``` + +s'affiche comme + +{{% notice tip %}} +Une notice de type *tip* +{{% /notice %}} + +### Warning + +``` +{{%/* notice warning */%}} +Une notice de type *warning* +{{%/* /notice */%}} +``` + +s'affiche comme + +{{% notice warning %}} +Une notice de type *warning* +{{% /notice %}} \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/siteparam.en.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/siteparam.en.md new file mode 100644 index 000000000..f431ffb90 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/siteparam.en.md @@ -0,0 +1,23 @@ +--- +title: Site param +description : "Get value of site params variables in your page." +--- + +`siteparam` shortcode is used to help you print values of site params. + +For instance, in this current site, the `editURL` variable is used in `config.toml` + +```toml +[params] + editURL = "https://github.com/matcornic/hugo-theme-learn/edit/master/exampleSite/content/" +``` + +Use the `siteparam` shortcode to display its value. + +``` +`editURL` Value : {{%/* siteparam "editURL" */%}} +``` + +is displayed as + +`editURL` Value : {{% siteparam "editURL" %}} \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/shortcodes/siteparam.fr.md b/themes/hugo-theme-learn/exampleSite/content/shortcodes/siteparam.fr.md new file mode 100644 index 000000000..508100b94 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/shortcodes/siteparam.fr.md @@ -0,0 +1,23 @@ +--- +title: Site param +description : "Afficher la valeur d'un paramètre global du site dans votre page" +--- + +Les shortcode `siteparam` est utilisé pour vous aider à afficher des valeurs provenant des paramètres globaux du site. + +Par exemple, dans ce site, le paramètre `editURL` est utilisé dans le fichier `config.toml` + +```toml +[params] + editURL = "https://github.com/matcornic/hugo-theme-learn/edit/master/exampleSite/content/" +``` + +Utilisez le shortcode `siteparam` pour affichier sa valeur. + +``` +Valeur de `editURL` : {{%/* siteparam "editURL" */%}} +``` + +s'affiche comme + +Valeur de `editURL` : {{% siteparam "editURL" %}} \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/content/showcase.en.md b/themes/hugo-theme-learn/exampleSite/content/showcase.en.md new file mode 100644 index 000000000..8f647f0ee --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/showcase.en.md @@ -0,0 +1,11 @@ +--- +title: Showcase +disableToc: true +--- + +#### [TAT](https://ovh.github.io/tat/overview/) by OVH +![TAT image](/images/showcase/tat.png?width=50pc) + +#### [Tshark.dev](https://tshark.dev) by Ross Jacobs +![Tshark.dev image](/images/showcase/tshark_dev.png?width=50pc) + diff --git a/themes/hugo-theme-learn/exampleSite/content/showcase.fr.md b/themes/hugo-theme-learn/exampleSite/content/showcase.fr.md new file mode 100644 index 000000000..daf1b77a9 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/content/showcase.fr.md @@ -0,0 +1,12 @@ +--- +title: Vitrine +disableToc: true +slug: vitrine +--- + +#### [TAT](https://ovh.github.io/tat/overview/) par OVH +![TAT image](/images/showcase/tat.png?width=50pc) + +#### [Tshark.dev](https://tshark.dev) par Ross Jacobs +![Tshark.dev image](/images/showcase/tshark_dev.png?width=50pc) + diff --git a/themes/hugo-theme-learn/exampleSite/layouts/partials/custom-footer.html b/themes/hugo-theme-learn/exampleSite/layouts/partials/custom-footer.html new file mode 100644 index 000000000..50e11eb39 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/layouts/partials/custom-footer.html @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/layouts/partials/logo.html b/themes/hugo-theme-learn/exampleSite/layouts/partials/logo.html new file mode 100644 index 000000000..a004a9ae5 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/layouts/partials/logo.html @@ -0,0 +1,39 @@ + diff --git a/themes/hugo-theme-learn/exampleSite/layouts/partials/menu-footer.html b/themes/hugo-theme-learn/exampleSite/layouts/partials/menu-footer.html new file mode 100644 index 000000000..5a35bd00f --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/layouts/partials/menu-footer.html @@ -0,0 +1,14 @@ +
    + + Download + + + Star + + + Fork + +

    Built with from Grav and Hugo

    +
    + + diff --git a/themes/hugo-theme-learn/exampleSite/layouts/shortcodes/ghcontributors.html b/themes/hugo-theme-learn/exampleSite/layouts/shortcodes/ghcontributors.html new file mode 100644 index 000000000..3e8a92872 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/layouts/shortcodes/ghcontributors.html @@ -0,0 +1,31 @@ + +
    + {{ $url := .Get 0 }} + {{ range getJSON $url }} +
    + + + {{.contributions}} commits +
    + {{ end }} +
    \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/static/css/theme-mine.css b/themes/hugo-theme-learn/exampleSite/static/css/theme-mine.css new file mode 100644 index 000000000..2bbc86814 --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/static/css/theme-mine.css @@ -0,0 +1,104 @@ + +:root{ + + --MAIN-TEXT-color:#323232; /* Color of text by default */ + --MAIN-TITLES-TEXT-color: #5e5e5e; /* Color of titles h2-h3-h4-h5 */ + --MAIN-LINK-color:#599a3e; /* Color of links */ + --MAIN-LINK-HOVER-color:#3f6d2c; /* Color of hovered links */ + --MAIN-ANCHOR-color: #599a3e; /* color of anchors on titles */ + + --MENU-HEADER-BG-color:#74b559; /* Background color of menu header */ + --MENU-HEADER-BORDER-color:#9cd484; /*Color of menu header border */ + + --MENU-SEARCH-BG-color:#599a3e; /* Search field background color (by default borders + icons) */ + --MENU-SEARCH-BOX-color: #84c767; /* Override search field border color */ + --MENU-SEARCH-BOX-ICONS-color: #c7f7c4; /* Override search field icons color */ + + --MENU-SECTIONS-ACTIVE-BG-color:#1b211c; /* Background color of the active section and its childs */ + --MENU-SECTIONS-BG-color:#222723; /* Background color of other sections */ + --MENU-SECTIONS-LINK-color: #ccc; /* Color of links in menu */ + --MENU-SECTIONS-LINK-HOVER-color: #e6e6e6; /* Color of links in menu, when hovered */ + --MENU-SECTION-ACTIVE-CATEGORY-color: #777; /* Color of active category text */ + --MENU-SECTION-ACTIVE-CATEGORY-BG-color: #fff; /* Color of background for the active category (only) */ + + --MENU-VISITED-color: #599a3e; /* Color of 'page visited' icons in menu */ + --MENU-SECTION-HR-color: #18211c; /* Color of
    separator in menu */ + +} + +body { + color: var(--MAIN-TEXT-color) !important; +} + +textarea:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="password"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="text"]:focus, input[type="url"]:focus, input[type="color"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, select[multiple=multiple]:focus { + border-color: none; + box-shadow: none; +} + +h2, h3, h4, h5 { + color: var(--MAIN-TITLES-TEXT-color) !important; +} + +a { + color: var(--MAIN-LINK-color); +} + +.anchor { + color: var(--MAIN-ANCHOR-color); +} + +a:hover { + color: var(--MAIN-LINK-HOVER-color); +} + +#sidebar ul li.visited > a .read-icon { + color: var(--MENU-VISITED-color); +} + +#body a.highlight:after { + display: block; + content: ""; + height: 1px; + width: 0%; + -webkit-transition: width 0.5s ease; + -moz-transition: width 0.5s ease; + -ms-transition: width 0.5s ease; + transition: width 0.5s ease; + background-color: var(--MAIN-LINK-HOVER-color); +} +#sidebar { + background-color: var(--MENU-SECTIONS-BG-color); +} +#sidebar #header-wrapper { + background: var(--MENU-HEADER-BG-color); + color: var(--MENU-SEARCH-BOX-color); + border-color: var(--MENU-HEADER-BORDER-color); +} +#sidebar .searchbox { + border-color: var(--MENU-SEARCH-BOX-color); + background: var(--MENU-SEARCH-BG-color); +} +#sidebar ul.topics > li.parent, #sidebar ul.topics > li.active { + background: var(--MENU-SECTIONS-ACTIVE-BG-color); +} +#sidebar .searchbox * { + color: var(--MENU-SEARCH-BOX-ICONS-color); +} + +#sidebar a { + color: var(--MENU-SECTIONS-LINK-color); +} + +#sidebar a:hover { + color: var(--MENU-SECTIONS-LINK-HOVER-color); +} + +#sidebar ul li.active > a { + background: var(--MENU-SECTION-ACTIVE-CATEGORY-BG-color); + color: var(--MENU-SECTION-ACTIVE-CATEGORY-color) !important; +} + +#sidebar hr { + border-color: var(--MENU-SECTION-HR-color); +} + diff --git a/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.eot b/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.eot new file mode 100755 index 000000000..702d2ccdb Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.eot differ diff --git a/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.svg b/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.svg new file mode 100755 index 000000000..c5ac8594f --- /dev/null +++ b/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.svg @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.ttf b/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.ttf new file mode 100755 index 000000000..4c4637b2a Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.ttf differ diff --git a/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.woff b/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.woff new file mode 100755 index 000000000..d95d5ca0d Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.woff differ diff --git a/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.woff2 b/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.woff2 new file mode 100755 index 000000000..39074b234 Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/static/fonts/monogramos-webfont.woff2 differ diff --git a/themes/hugo-theme-learn/exampleSite/static/images/showcase/tat.png b/themes/hugo-theme-learn/exampleSite/static/images/showcase/tat.png new file mode 100644 index 000000000..35a5e6323 Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/static/images/showcase/tat.png differ diff --git a/themes/hugo-theme-learn/exampleSite/static/images/showcase/tshark_dev.png b/themes/hugo-theme-learn/exampleSite/static/images/showcase/tshark_dev.png new file mode 100644 index 000000000..08f81f97f Binary files /dev/null and b/themes/hugo-theme-learn/exampleSite/static/images/showcase/tshark_dev.png differ diff --git a/themes/hugo-theme-learn/i18n/ar.toml b/themes/hugo-theme-learn/i18n/ar.toml new file mode 100644 index 000000000..66e90e148 --- /dev/null +++ b/themes/hugo-theme-learn/i18n/ar.toml @@ -0,0 +1,26 @@ +[Search-placeholder] +other = "...البحث" + +[Clear-History] +other = "مسح السجل" + +[Attachments-label] +other = "مرفقات" + +[title-404] +other = "خطأ" + +[message-404] +other = ".¯\\_(ツ)_/¯أوبس. يبدو أن هذه الصفحة غير موجودة" + +[Go-to-homepage] +other = "الذهاب إلى الصفحة الرئيسية" + +[Edit-this-page] +other = "تعديل هذه الصفحة" + +[Shortcuts-Title] +other = "المزيد" + +[Expand-title] +other = "...قم بتوسيع" \ No newline at end of file diff --git a/themes/hugo-theme-learn/i18n/de.toml b/themes/hugo-theme-learn/i18n/de.toml new file mode 100644 index 000000000..55ced7a59 --- /dev/null +++ b/themes/hugo-theme-learn/i18n/de.toml @@ -0,0 +1,26 @@ +[Search-placeholder] +other = "Suchen..." + +[Clear-History] +other = "Verlauf löschen" + +[Attachments-label] +other = "Anhänge" + +[title-404] +other = "Fehler" + +[message-404] +other = "Huch. Diese Seite scheint nicht zu existieren ¯\\_(ツ)_/¯." + +[Go-to-homepage] +other = "Gehe zur Homepage" + +[Edit-this-page] +other = "Bearbeite diese Seite" + +[Shortcuts-Title] +other = "Mehr" + +[Expand-title] +other = "Erweitere mich..." \ No newline at end of file diff --git a/themes/hugo-theme-learn/i18n/en.toml b/themes/hugo-theme-learn/i18n/en.toml index f5d7831a1..118345fae 100644 --- a/themes/hugo-theme-learn/i18n/en.toml +++ b/themes/hugo-theme-learn/i18n/en.toml @@ -2,7 +2,7 @@ other = "Search..." [Clear-History] -other = "Mark all as unread" +other = "Clear History" [Attachments-label] other = "Attachments" @@ -23,7 +23,4 @@ other = "Edit this page" other = "More" [Expand-title] -other = "Expand me..." - -[Issue-for-page] -other = "Create an Issue for this Page" +other = "Expand me..." \ No newline at end of file diff --git a/themes/hugo-theme-learn/i18n/es.toml b/themes/hugo-theme-learn/i18n/es.toml new file mode 100644 index 000000000..57b7a332e --- /dev/null +++ b/themes/hugo-theme-learn/i18n/es.toml @@ -0,0 +1,26 @@ +[Search-placeholder] +other = "Buscar..." + +[Clear-History] +other = "Borrar Historial" + +[Attachments-label] +other = "Adjuntos" + +[title-404] +other = "Error" + +[message-404] +other = "Ups. Parece que la página no existe ¯\\_(ツ)_/¯." + +[Go-to-homepage] +other = "Ir al inicio" + +[Edit-this-page] +other = "Editar esta página" + +[Shortcuts-Title] +other = "Más" + +[Expand-title] +other = "Expandir..." diff --git a/themes/hugo-theme-learn/i18n/hi.toml b/themes/hugo-theme-learn/i18n/hi.toml new file mode 100644 index 000000000..b0f251572 --- /dev/null +++ b/themes/hugo-theme-learn/i18n/hi.toml @@ -0,0 +1,26 @@ +[Search-placeholder] +other = "खोजे..." + +[Clear-History] +other = "इतिहास मिटाएँ" + +[Attachments-label] +other = "संलग्नंक (अटैचमेंट)" + +[title-404] +other = "त्रुटि" + +[message-404] +other = "यह पृष्ठ अभि अनुपलब्ध है!" + +[Go-to-homepage] +other = "मुख्य पृष्ठ पर जाऐ" + +[Edit-this-page] +other = "यह पृष्ठ संपादित करें" + +[Shortcuts-Title] +other = "अधिक सामग्री दिखाएं" + +[Expand-title] +other = "विस्तार करे..." diff --git a/themes/hugo-theme-learn/i18n/id.toml b/themes/hugo-theme-learn/i18n/id.toml new file mode 100644 index 000000000..e0aa5ae79 --- /dev/null +++ b/themes/hugo-theme-learn/i18n/id.toml @@ -0,0 +1,26 @@ +[Search-placeholder] +other = "Telusuri..." + +[Clear-History] +other = "Bersihkan Riwayat" + +[Attachments-label] +other = "Lampiran" + +[title-404] +other = "Kesalahan" + +[message-404] +other = "Oops. Sepertinya halaman ini tidak ada ¯\\_(ツ)_/¯." + +[Go-to-homepage] +other = "Ke halaman depan" + +[Edit-this-page] +other = "Edit halaman ini" + +[Shortcuts-Title] +other = "Lainnya" + +[Expand-title] +other = "Bentangkan..." diff --git a/themes/hugo-theme-learn/i18n/ja.toml b/themes/hugo-theme-learn/i18n/ja.toml new file mode 100644 index 000000000..e7510c307 --- /dev/null +++ b/themes/hugo-theme-learn/i18n/ja.toml @@ -0,0 +1,26 @@ +[Search-placeholder] +other = "検索..." + +[Clear-History] +other = "履歴削除" + +[Attachments-label] +other = "添付" + +[title-404] +other = "エラー" + +[message-404] +other = "おっと。ページが見当たりません。 ¯\\_(ツ)_/¯." + +[Go-to-homepage] +other = "ホームページへ行く" + +[Edit-this-page] +other = "このページを編集" + +[Shortcuts-Title] +other = "更に" + +[Expand-title] +other = "開く..." diff --git a/themes/hugo-theme-learn/i18n/nl.toml b/themes/hugo-theme-learn/i18n/nl.toml new file mode 100644 index 000000000..cca84b411 --- /dev/null +++ b/themes/hugo-theme-learn/i18n/nl.toml @@ -0,0 +1,26 @@ +[Search-placeholder] +other = "Zoeken..." + +[Clear-History] +other = "Wis geschiedenis" + +[Attachments-label] +other = "Bijlagen" + +[title-404] +other = "Error" + +[message-404] +other = "Blijkbaar bestaat deze pagina niet ¯\\_(ツ)_/¯." + +[Go-to-homepage] +other = "Naar startpagina" + +[Edit-this-page] +other = "Deze pagina bewerken" + +[Shortcuts-Title] +other = "Snelkoppelingen" + +[Expand-title] +other = "Lees meer..." diff --git a/themes/hugo-theme-learn/i18n/pt.toml b/themes/hugo-theme-learn/i18n/pt.toml new file mode 100644 index 000000000..b110533ed --- /dev/null +++ b/themes/hugo-theme-learn/i18n/pt.toml @@ -0,0 +1,26 @@ +[Search-placeholder] +other = "Procurar..." + +[Clear-History] +other = "Limpar Histórico" + +[Attachments-label] +other = "Anexos" + +[title-404] +other = "Erro" + +[message-404] +other = "Ops. Parece que a página não existe ¯\\_(ツ)_/¯." + +[Go-to-homepage] +other = "Ir para o início" + +[Edit-this-page] +other = "Editar esta página" + +[Shortcuts-Title] +other = "Mais" + +[Expand-title] +other = "Expandir..." diff --git a/themes/hugo-theme-learn/i18n/ru.toml b/themes/hugo-theme-learn/i18n/ru.toml new file mode 100644 index 000000000..36ad07940 --- /dev/null +++ b/themes/hugo-theme-learn/i18n/ru.toml @@ -0,0 +1,26 @@ +[Search-placeholder] +other = "Поиск..." + +[Clear-History] +other = "Очистить историю" + +[Attachments-label] +other = "Присоединенные файлы" + +[title-404] +other = "Ошибка" + +[message-404] +other = "Упс. Выглядит будто такой страницы нет ¯\\_(ツ)_/¯." + +[Go-to-homepage] +other = "Перейти на главную" + +[Edit-this-page] +other = "Редактировать" + +[Shortcuts-Title] +other = "Еще" + +[Expand-title] +other = "Развернуть..." \ No newline at end of file diff --git a/themes/hugo-theme-learn/i18n/tr.toml b/themes/hugo-theme-learn/i18n/tr.toml new file mode 100644 index 000000000..17249ede5 --- /dev/null +++ b/themes/hugo-theme-learn/i18n/tr.toml @@ -0,0 +1,26 @@ +[Search-placeholder] +other = "Ara..." + +[Clear-History] +other = "Geçmişi Temizle" + +[Attachments-label] +other = "Ekler" + +[title-404] +other = "Hata" + +[message-404] +other = "Uups. Görünüşe göre böyle bir sayfa yok ¯\\_(ツ)_/¯" + +[Go-to-homepage] +other = "Anasayfaya dön" + +[Edit-this-page] +other = "Sayfayı düzenle" + +[Shortcuts-Title] +other = "Dahası Var" + +[Expand-title] +other = "Genişlet..." diff --git a/themes/hugo-theme-learn/i18n/zh-cn.toml b/themes/hugo-theme-learn/i18n/zh-cn.toml new file mode 100644 index 000000000..e887d3e63 --- /dev/null +++ b/themes/hugo-theme-learn/i18n/zh-cn.toml @@ -0,0 +1,26 @@ +[Search-placeholder] +other = "搜索..." + +[Clear-History] +other = "清理历史记录" + +[Attachments-label] +other = "附件" + +[title-404] +other = "错误" + +[message-404] +other = "哎哟。 看起来这个页面不存在 ¯\\_(ツ)_/¯。" + +[Go-to-homepage] +other = "转到主页" + +[Edit-this-page] +other = "编辑当前页" + +[Shortcuts-Title] +other = "更多" + +[Expand-title] +other = "展开" diff --git a/themes/hugo-theme-learn/images/tn.png b/themes/hugo-theme-learn/images/tn.png index 9cc0520dd..b1d64bdbc 100644 Binary files a/themes/hugo-theme-learn/images/tn.png and b/themes/hugo-theme-learn/images/tn.png differ diff --git a/themes/hugo-theme-learn/layouts/404.html b/themes/hugo-theme-learn/layouts/404.html index 49e71ea77..a5bb8fce0 100644 --- a/themes/hugo-theme-learn/layouts/404.html +++ b/themes/hugo-theme-learn/layouts/404.html @@ -1,23 +1,22 @@ - + {{ partial "meta.html" . }} {{ partial "favicon.html" . }} {{ .Scratch.Add "title" "" }}{{ if eq .Site.Data.titles .Title }}{{ .Scratch.Set "title" (index .Site.Data.titles .Title).title }}{{ else }}{{ .Scratch.Set "title" .Title}}{{end}} {{ .Scratch.Get "title" }} - + {{ $assetBusting := not .Site.Params.disableAssetsBusting }} - + - {{with .Site.Params.themeVariant}} {{end}} -",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[t],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"meta",v:[{b:/<\?xml/,e:/\?>/,r:10},{b:/<\?\w+/,e:/\?>/}]},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke",e:/;/,eW:!0,k:{keyword:"abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null",built_in:"array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t]},e.CBCM,t]}});hljs.registerLanguage("groovy",function(e){return{k:{literal:"true false null",keyword:"byte short char int long boolean float double void def as in assert trait super this abstract static volatile transient public private protected synchronized final class interface enum if else for while switch case break default continue throw throws try catch finally implements extends new import package return instanceof"},c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,{cN:"string",b:'"""',e:'"""'},{cN:"string",b:"'''",e:"'''"},{cN:"string",b:"\\$/",e:"/\\$",r:10},e.ASM,{cN:"regexp",b:/~?\/[^\/\n]+\//,c:[e.BE]},e.QSM,{cN:"meta",b:"^#!/usr/bin/env",e:"$",i:"\n"},e.BNM,{cN:"class",bK:"class interface trait enum",e:"{",i:":",c:[{bK:"extends implements"},e.UTM]},e.CNM,{cN:"meta",b:"@[A-Za-z]+"},{cN:"string",b:/[^\?]{0}[A-Za-z0-9_$]+ *:/},{b:/\?/,e:/\:/},{cN:"symbol",b:"^\\s*[A-Za-z0-9_$]+:",r:0}],i:/#|<\//}});hljs.registerLanguage("cs",function(e){var t="abstract as base bool break byte case catch char checked const continue decimal dynamic default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long null when object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async protected public private internal ascending descending from get group into join let orderby partial select set value var where yield",r=e.IR+"(<"+e.IR+">)?";return{aliases:["csharp"],k:t,i:/::/,c:[e.C("///","$",{rB:!0,c:[{cN:"doctag",v:[{b:"///",r:0},{b:""},{b:""}]}]}),e.CLCM,e.CBCM,{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},e.ASM,e.QSM,e.CNM,{bK:"class interface",e:/[{;=]/,i:/[^\s:]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:"namespace",e:/[{;=]/,i:/[^\s:]/,c:[e.inherit(e.TM,{b:"[a-zA-Z](\\.?\\w)*"}),e.CLCM,e.CBCM]},{bK:"new return throw await",r:0},{cN:"function",b:"("+r+"\\s+)+"+e.IR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:t,c:[{b:e.IR+"\\s*\\(",rB:!0,c:[e.TM],r:0},{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage("ruby",function(e){var b="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",c="and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",r={cN:"doctag",b:"@[A-Za-z]+"},a={b:"#<",e:">"},s=[e.C("#","$",{c:[r]}),e.C("^\\=begin","^\\=end",{c:[r],r:10}),e.C("^__END__","\\n$")],n={cN:"subst",b:"#\\{",e:"}",k:c},t={cN:"string",c:[e.BE,n],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/}]},i={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:c},d=[t,a,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(s)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:b}),i].concat(s)},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":",c:[t,{b:b}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:[a,{cN:"regexp",c:[e.BE,n],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(s),r:0}].concat(s);n.c=d,i.c=d;var o="[>?]>",l="[\\w#]+\\(\\w+\\):\\d+:\\d+>",u="(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>",w=[{b:/^\s*=>/,starts:{e:"$",c:d}},{cN:"meta",b:"^("+o+"|"+l+"|"+u+")",starts:{e:"$",c:d}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:c,i:/\/\*/,c:s.concat(w).concat(d)}});hljs.registerLanguage("http",function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],i:"\\S",c:[{b:"^"+t,e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{b:"^[A-Z]+ (.*?) "+t+"$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0},{b:t},{cN:"keyword",b:"[A-Z]+"}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{e:"$",r:0}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage("vbnet",function(e){return{aliases:["vb"],cI:!0,k:{keyword:"addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass namespace narrowing new next not notinheritable notoverridable of off on operator option optional or order orelse overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim rem removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly xor",built_in:"boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype date decimal directcast double gettype getxmlnamespace iif integer long object sbyte short single string trycast typeof uinteger ulong ushort",literal:"true false nothing"},i:"//|{|}|endif|gosub|variant|wend",c:[e.inherit(e.QSM,{c:[{b:'""'}]}),e.C("'","$",{rB:!0,c:[{cN:"doctag",b:"'''|",c:[e.PWM]},{cN:"doctag",b:"",c:[e.PWM]}]}),e.CNM,{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elseif end region externalsource"}}]}});hljs.registerLanguage("objectivec",function(e){var t={cN:"built_in",b:"(AV|CA|CF|CG|CI|MK|MP|NS|UI|XC)\\w+"},i={keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},n=/[a-zA-Z@][a-zA-Z0-9_]*/,o="@interface @class @protocol @implementation";return{aliases:["mm","objc","obj-c"],k:i,l:n,i:""}]}]},{cN:"class",b:"("+o.split(" ").join("|")+")\\b",e:"({|$)",eE:!0,k:o,l:n,c:[e.UTM]},{b:"\\."+e.UIR,r:0}]}});hljs.registerLanguage("nginx",function(e){var r={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+e.UIR}]},b={eW:!0,l:"[a-z/_]+",k:{literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[e.HCM,{cN:"string",c:[e.BE,r],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{b:"([a-z]+):/",e:"\\s",eW:!0,eE:!0,c:[r]},{cN:"regexp",c:[e.BE,r],v:[{b:"\\s\\^",e:"\\s|{|;",rE:!0},{b:"~\\*?\\s+",e:"\\s|{|;",rE:!0},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},r]};return{aliases:["nginxconf"],c:[e.HCM,{b:e.UIR+"\\s+{",rB:!0,e:"{",c:[{cN:"section",b:e.UIR}],r:0},{b:e.UIR+"\\s",e:";|{",rB:!0,c:[{cN:"attribute",b:e.UIR,starts:b}],r:0}],i:"[^\\s\\}]"}}); \ No newline at end of file +/*! highlight.js v9.13.1 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/&/g,"&").replace(//g,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=M.exec(o))return w(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||w(i))return i}function o(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function c(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function c(e){l+=""}function u(e){("start"===e.event?o:c)(e.node)}for(var s=0,l="",f=[];e.length||r.length;){var g=i();if(l+=n(a.substring(s,g[0].offset)),s=g[0].offset,g===e){f.reverse().forEach(c);do u(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===s);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),u(g.splice(0,1)[0])}return l+n(a.substr(s))}function s(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(n){return o(e,{v:null},n)})),e.cached_variants||e.eW&&[o(e)]||[e]}function l(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var o={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");o[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?c("keyword",a.k):B(a.k).forEach(function(e){c(e,a.k[e])}),a.k=o}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.endSameAsBegin&&(a.e=a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]),a.c=Array.prototype.concat.apply([],a.c.map(function(e){return s("self"===e?a:e)})),a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var u=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=u.length?t(u.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e){return new RegExp(e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}function c(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t].endSameAsBegin&&(n.c[t].eR=o(n.c[t].bR.exec(e)[0])),n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function s(e,n){return!a&&r(n.iR,e)}function p(e,n){var t=R.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function d(e,n,t,r){var a=r?"":j.classPrefix,i='',i+n+o}function h(){var e,t,r,a;if(!E.k)return n(k);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(k);r;)a+=n(k.substring(t,r.index)),e=p(E,r),e?(M+=e[1],a+=d(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(k);return a+n(k.substr(t))}function b(){var e="string"==typeof E.sL;if(e&&!L[E.sL])return n(k);var t=e?f(E.sL,k,!0,B[E.sL]):g(k,E.sL.length?E.sL:void 0);return E.r>0&&(M+=t.r),e&&(B[E.sL]=t.top),d(t.language,t.value,!1,!0)}function v(){y+=null!=E.sL?b():h(),k=""}function m(e){y+=e.cN?d(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function N(e,n){if(k+=e,null==n)return v(),0;var t=c(n,E);if(t)return t.skip?k+=n:(t.eB&&(k+=n),v(),t.rB||t.eB||(k=n)),m(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?k+=n:(a.rE||a.eE||(k+=n),v(),a.eE&&(k=n));do E.cN&&(y+=I),E.skip||E.sL||(M+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&(r.endSameAsBegin&&(r.starts.eR=r.eR),m(r.starts,"")),a.rE?0:n.length}if(s(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return k+=n,n.length||1}var R=w(e);if(!R)throw new Error('Unknown language: "'+e+'"');l(R);var x,E=i||R,B={},y="";for(x=E;x!==R;x=x.parent)x.cN&&(y=d(x.cN,"",!0)+y);var k="",M=0;try{for(var C,A,S=0;;){if(E.t.lastIndex=S,C=E.t.exec(t),!C)break;A=N(t.substring(S,C.index),C[0]),S=C.index+A}for(N(t.substr(S)),x=E;x.parent;x=x.parent)x.cN&&(y+=I);return{r:M,value:y,language:e,top:E}}catch(O){if(O.message&&-1!==O.message.indexOf("Illegal"))return{r:0,value:n(t)};throw O}}function g(e,t){t=t||j.languages||B(L);var r={r:0,value:n(e)},a=r;return t.filter(w).filter(x).forEach(function(n){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function p(e){return j.tabReplace||j.useBR?e.replace(C,function(e,n){return j.useBR&&"\n"===e?"
    ":j.tabReplace?n.replace(/\t/g,j.tabReplace):""}):e}function d(e,n,t){var r=n?y[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function h(e){var n,t,r,o,s,l=i(e);a(l)||(j.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,s=n.textContent,r=l?f(l,s,!0):g(s),t=c(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=u(t,c(o),s)),r.value=p(r.value),e.innerHTML=r.value,e.className=d(e.className,l,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function b(e){j=o(j,e)}function v(){if(!v.called){v.called=!0;var e=document.querySelectorAll("pre code");E.forEach.call(e,h)}}function m(){addEventListener("DOMContentLoaded",v,!1),addEventListener("load",v,!1)}function N(n,t){var r=L[n]=t(e);r.aliases&&r.aliases.forEach(function(e){y[e]=n})}function R(){return B(L)}function w(e){return e=(e||"").toLowerCase(),L[e]||L[y[e]]}function x(e){var n=w(e);return n&&!n.disableAutodetect}var E=[],B=Object.keys,L={},y={},k=/^(no-?highlight|plain|text)$/i,M=/\blang(?:uage)?-([\w-]+)\b/i,C=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,I="
    ",j={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=f,e.highlightAuto=g,e.fixMarkup=p,e.highlightBlock=h,e.configure=b,e.initHighlighting=v,e.initHighlightingOnLoad=m,e.registerLanguage=N,e.listLanguages=R,e.getLanguage=w,e.autoDetection=x,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}});hljs.registerLanguage("matlab",function(e){var a="('|\\.')+",s={r:0,c:[{b:a}]};return{k:{keyword:"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while",built_in:"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson max min nanmax nanmin mean nanmean type table readtable writetable sortrows sort figure plot plot3 scatter scatter3 cellfun legend intersect ismember procrustes hold num2cell "},i:'(//|"|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function",e:"$",c:[e.UTM,{cN:"params",v:[{b:"\\(",e:"\\)"},{b:"\\[",e:"\\]"}]}]},{cN:"built_in",b:/true|false/,r:0,starts:s},{b:"[a-zA-Z][a-zA-Z_0-9]*"+a,r:0},{cN:"number",b:e.CNR,r:0,starts:s},{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{b:/\]|}|\)/,r:0,starts:s},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}],starts:s},e.C("^\\s*\\%\\{\\s*$","^\\s*\\%\\}\\s*$"),e.C("\\%","$")]}});hljs.registerLanguage("excel",function(E){return{aliases:["xlsx","xls"],cI:!0,l:/[a-zA-Z][\w\.]*/,k:{built_in:"ABS ACCRINT ACCRINTM ACOS ACOSH ACOT ACOTH AGGREGATE ADDRESS AMORDEGRC AMORLINC AND ARABIC AREAS ASC ASIN ASINH ATAN ATAN2 ATANH AVEDEV AVERAGE AVERAGEA AVERAGEIF AVERAGEIFS BAHTTEXT BASE BESSELI BESSELJ BESSELK BESSELY BETADIST BETA.DIST BETAINV BETA.INV BIN2DEC BIN2HEX BIN2OCT BINOMDIST BINOM.DIST BINOM.DIST.RANGE BINOM.INV BITAND BITLSHIFT BITOR BITRSHIFT BITXOR CALL CEILING CEILING.MATH CEILING.PRECISE CELL CHAR CHIDIST CHIINV CHITEST CHISQ.DIST CHISQ.DIST.RT CHISQ.INV CHISQ.INV.RT CHISQ.TEST CHOOSE CLEAN CODE COLUMN COLUMNS COMBIN COMBINA COMPLEX CONCAT CONCATENATE CONFIDENCE CONFIDENCE.NORM CONFIDENCE.T CONVERT CORREL COS COSH COT COTH COUNT COUNTA COUNTBLANK COUNTIF COUNTIFS COUPDAYBS COUPDAYS COUPDAYSNC COUPNCD COUPNUM COUPPCD COVAR COVARIANCE.P COVARIANCE.S CRITBINOM CSC CSCH CUBEKPIMEMBER CUBEMEMBER CUBEMEMBERPROPERTY CUBERANKEDMEMBER CUBESET CUBESETCOUNT CUBEVALUE CUMIPMT CUMPRINC DATE DATEDIF DATEVALUE DAVERAGE DAY DAYS DAYS360 DB DBCS DCOUNT DCOUNTA DDB DEC2BIN DEC2HEX DEC2OCT DECIMAL DEGREES DELTA DEVSQ DGET DISC DMAX DMIN DOLLAR DOLLARDE DOLLARFR DPRODUCT DSTDEV DSTDEVP DSUM DURATION DVAR DVARP EDATE EFFECT ENCODEURL EOMONTH ERF ERF.PRECISE ERFC ERFC.PRECISE ERROR.TYPE EUROCONVERT EVEN EXACT EXP EXPON.DIST EXPONDIST FACT FACTDOUBLE FALSE|0 F.DIST FDIST F.DIST.RT FILTERXML FIND FINDB F.INV F.INV.RT FINV FISHER FISHERINV FIXED FLOOR FLOOR.MATH FLOOR.PRECISE FORECAST FORECAST.ETS FORECAST.ETS.CONFINT FORECAST.ETS.SEASONALITY FORECAST.ETS.STAT FORECAST.LINEAR FORMULATEXT FREQUENCY F.TEST FTEST FV FVSCHEDULE GAMMA GAMMA.DIST GAMMADIST GAMMA.INV GAMMAINV GAMMALN GAMMALN.PRECISE GAUSS GCD GEOMEAN GESTEP GETPIVOTDATA GROWTH HARMEAN HEX2BIN HEX2DEC HEX2OCT HLOOKUP HOUR HYPERLINK HYPGEOM.DIST HYPGEOMDIST IF|0 IFERROR IFNA IFS IMABS IMAGINARY IMARGUMENT IMCONJUGATE IMCOS IMCOSH IMCOT IMCSC IMCSCH IMDIV IMEXP IMLN IMLOG10 IMLOG2 IMPOWER IMPRODUCT IMREAL IMSEC IMSECH IMSIN IMSINH IMSQRT IMSUB IMSUM IMTAN INDEX INDIRECT INFO INT INTERCEPT INTRATE IPMT IRR ISBLANK ISERR ISERROR ISEVEN ISFORMULA ISLOGICAL ISNA ISNONTEXT ISNUMBER ISODD ISREF ISTEXT ISO.CEILING ISOWEEKNUM ISPMT JIS KURT LARGE LCM LEFT LEFTB LEN LENB LINEST LN LOG LOG10 LOGEST LOGINV LOGNORM.DIST LOGNORMDIST LOGNORM.INV LOOKUP LOWER MATCH MAX MAXA MAXIFS MDETERM MDURATION MEDIAN MID MIDBs MIN MINIFS MINA MINUTE MINVERSE MIRR MMULT MOD MODE MODE.MULT MODE.SNGL MONTH MROUND MULTINOMIAL MUNIT N NA NEGBINOM.DIST NEGBINOMDIST NETWORKDAYS NETWORKDAYS.INTL NOMINAL NORM.DIST NORMDIST NORMINV NORM.INV NORM.S.DIST NORMSDIST NORM.S.INV NORMSINV NOT NOW NPER NPV NUMBERVALUE OCT2BIN OCT2DEC OCT2HEX ODD ODDFPRICE ODDFYIELD ODDLPRICE ODDLYIELD OFFSET OR PDURATION PEARSON PERCENTILE.EXC PERCENTILE.INC PERCENTILE PERCENTRANK.EXC PERCENTRANK.INC PERCENTRANK PERMUT PERMUTATIONA PHI PHONETIC PI PMT POISSON.DIST POISSON POWER PPMT PRICE PRICEDISC PRICEMAT PROB PRODUCT PROPER PV QUARTILE QUARTILE.EXC QUARTILE.INC QUOTIENT RADIANS RAND RANDBETWEEN RANK.AVG RANK.EQ RANK RATE RECEIVED REGISTER.ID REPLACE REPLACEB REPT RIGHT RIGHTB ROMAN ROUND ROUNDDOWN ROUNDUP ROW ROWS RRI RSQ RTD SEARCH SEARCHB SEC SECH SECOND SERIESSUM SHEET SHEETS SIGN SIN SINH SKEW SKEW.P SLN SLOPE SMALL SQL.REQUEST SQRT SQRTPI STANDARDIZE STDEV STDEV.P STDEV.S STDEVA STDEVP STDEVPA STEYX SUBSTITUTE SUBTOTAL SUM SUMIF SUMIFS SUMPRODUCT SUMSQ SUMX2MY2 SUMX2PY2 SUMXMY2 SWITCH SYD T TAN TANH TBILLEQ TBILLPRICE TBILLYIELD T.DIST T.DIST.2T T.DIST.RT TDIST TEXT TEXTJOIN TIME TIMEVALUE T.INV T.INV.2T TINV TODAY TRANSPOSE TREND TRIM TRIMMEAN TRUE|0 TRUNC T.TEST TTEST TYPE UNICHAR UNICODE UPPER VALUE VAR VAR.P VAR.S VARA VARP VARPA VDB VLOOKUP WEBSERVICE WEEKDAY WEEKNUM WEIBULL WEIBULL.DIST WORKDAY WORKDAY.INTL XIRR XNPV XOR YEAR YEARFRAC YIELD YIELDDISC YIELDMAT Z.TEST ZTEST"},c:[{b:/^=/,e:/[^=]/,rE:!0,i:/=/,r:10},{cN:"symbol",b:/\b[A-Z]{1,2}\d+\b/,e:/[^\d]/,eE:!0,r:0},{cN:"symbol",b:/[A-Z]{0,2}\d*:[A-Z]{0,2}\d*/,r:0},E.BE,E.QSM,{cN:"number",b:E.NR+"(%)?",r:0},E.C(/\bN\(/,/\)/,{eB:!0,eE:!0,i:/\n/})]}});hljs.registerLanguage("properties",function(r){var t="[ \\t\\f]*",e="[ \\t\\f]+",s="("+t+"[:=]"+t+"|"+e+")",n="([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",c={e:s,r:0,starts:{cN:"string",e:/$/,r:0,c:[{b:"\\\\\\n"}]}};return{cI:!0,i:/\S/,c:[r.C("^\\s*[!#]","$"),{b:n+s,rB:!0,c:[{cN:"attr",b:n,endsParent:!0,r:0}],starts:c},{b:a+s,rB:!0,r:0,c:[{cN:"meta",b:a,endsParent:!0,r:0}],starts:c},{cN:"attr",r:0,b:a+t+"$"}]}});hljs.registerLanguage("powershell",function(e){var t={b:"`[\\s\\S]",r:0},o={cN:"variable",v:[{b:/\$[\w\d][\w\d_:]*/}]},r={cN:"literal",b:/\$(null|true|false)\b/},n={cN:"string",v:[{b:/"/,e:/"/},{b:/@"/,e:/^"@/}],c:[t,o,{cN:"variable",b:/\$[A-z]/,e:/[^A-z]/}]},a={cN:"string",v:[{b:/'/,e:/'/},{b:/@'/,e:/^'@/}]},i={cN:"doctag",v:[{b:/\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{b:/\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/}]},s=e.inherit(e.C(null,null),{v:[{b:/#/,e:/$/},{b:/<#/,e:/#>/}],c:[i]});return{aliases:["ps"],l:/-?[A-z\.\-]+/,cI:!0,k:{keyword:"if else foreach return function do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch",built_in:"Add-Computer Add-Content Add-History Add-JobTrigger Add-Member Add-PSSnapin Add-Type Checkpoint-Computer Clear-Content Clear-EventLog Clear-History Clear-Host Clear-Item Clear-ItemProperty Clear-Variable Compare-Object Complete-Transaction Connect-PSSession Connect-WSMan Convert-Path ConvertFrom-Csv ConvertFrom-Json ConvertFrom-SecureString ConvertFrom-StringData ConvertTo-Csv ConvertTo-Html ConvertTo-Json ConvertTo-SecureString ConvertTo-Xml Copy-Item Copy-ItemProperty Debug-Process Disable-ComputerRestore Disable-JobTrigger Disable-PSBreakpoint Disable-PSRemoting Disable-PSSessionConfiguration Disable-WSManCredSSP Disconnect-PSSession Disconnect-WSMan Disable-ScheduledJob Enable-ComputerRestore Enable-JobTrigger Enable-PSBreakpoint Enable-PSRemoting Enable-PSSessionConfiguration Enable-ScheduledJob Enable-WSManCredSSP Enter-PSSession Exit-PSSession Export-Alias Export-Clixml Export-Console Export-Counter Export-Csv Export-FormatData Export-ModuleMember Export-PSSession ForEach-Object Format-Custom Format-List Format-Table Format-Wide Get-Acl Get-Alias Get-AuthenticodeSignature Get-ChildItem Get-Command Get-ComputerRestorePoint Get-Content Get-ControlPanelItem Get-Counter Get-Credential Get-Culture Get-Date Get-Event Get-EventLog Get-EventSubscriber Get-ExecutionPolicy Get-FormatData Get-Host Get-HotFix Get-Help Get-History Get-IseSnippet Get-Item Get-ItemProperty Get-Job Get-JobTrigger Get-Location Get-Member Get-Module Get-PfxCertificate Get-Process Get-PSBreakpoint Get-PSCallStack Get-PSDrive Get-PSProvider Get-PSSession Get-PSSessionConfiguration Get-PSSnapin Get-Random Get-ScheduledJob Get-ScheduledJobOption Get-Service Get-TraceSource Get-Transaction Get-TypeData Get-UICulture Get-Unique Get-Variable Get-Verb Get-WinEvent Get-WmiObject Get-WSManCredSSP Get-WSManInstance Group-Object Import-Alias Import-Clixml Import-Counter Import-Csv Import-IseSnippet Import-LocalizedData Import-PSSession Import-Module Invoke-AsWorkflow Invoke-Command Invoke-Expression Invoke-History Invoke-Item Invoke-RestMethod Invoke-WebRequest Invoke-WmiMethod Invoke-WSManAction Join-Path Limit-EventLog Measure-Command Measure-Object Move-Item Move-ItemProperty New-Alias New-Event New-EventLog New-IseSnippet New-Item New-ItemProperty New-JobTrigger New-Object New-Module New-ModuleManifest New-PSDrive New-PSSession New-PSSessionConfigurationFile New-PSSessionOption New-PSTransportOption New-PSWorkflowExecutionOption New-PSWorkflowSession New-ScheduledJobOption New-Service New-TimeSpan New-Variable New-WebServiceProxy New-WinEvent New-WSManInstance New-WSManSessionOption Out-Default Out-File Out-GridView Out-Host Out-Null Out-Printer Out-String Pop-Location Push-Location Read-Host Receive-Job Register-EngineEvent Register-ObjectEvent Register-PSSessionConfiguration Register-ScheduledJob Register-WmiEvent Remove-Computer Remove-Event Remove-EventLog Remove-Item Remove-ItemProperty Remove-Job Remove-JobTrigger Remove-Module Remove-PSBreakpoint Remove-PSDrive Remove-PSSession Remove-PSSnapin Remove-TypeData Remove-Variable Remove-WmiObject Remove-WSManInstance Rename-Computer Rename-Item Rename-ItemProperty Reset-ComputerMachinePassword Resolve-Path Restart-Computer Restart-Service Restore-Computer Resume-Job Resume-Service Save-Help Select-Object Select-String Select-Xml Send-MailMessage Set-Acl Set-Alias Set-AuthenticodeSignature Set-Content Set-Date Set-ExecutionPolicy Set-Item Set-ItemProperty Set-JobTrigger Set-Location Set-PSBreakpoint Set-PSDebug Set-PSSessionConfiguration Set-ScheduledJob Set-ScheduledJobOption Set-Service Set-StrictMode Set-TraceSource Set-Variable Set-WmiInstance Set-WSManInstance Set-WSManQuickConfig Show-Command Show-ControlPanelItem Show-EventLog Sort-Object Split-Path Start-Job Start-Process Start-Service Start-Sleep Start-Transaction Start-Transcript Stop-Computer Stop-Job Stop-Process Stop-Service Stop-Transcript Suspend-Job Suspend-Service Tee-Object Test-ComputerSecureChannel Test-Connection Test-ModuleManifest Test-Path Test-PSSessionConfigurationFile Trace-Command Unblock-File Undo-Transaction Unregister-Event Unregister-PSSessionConfiguration Unregister-ScheduledJob Update-FormatData Update-Help Update-List Update-TypeData Use-Transaction Wait-Event Wait-Job Wait-Process Where-Object Write-Debug Write-Error Write-EventLog Write-Host Write-Output Write-Progress Write-Verbose Write-Warning Add-MDTPersistentDrive Disable-MDTMonitorService Enable-MDTMonitorService Get-MDTDeploymentShareStatistics Get-MDTMonitorData Get-MDTOperatingSystemCatalog Get-MDTPersistentDrive Import-MDTApplication Import-MDTDriver Import-MDTOperatingSystem Import-MDTPackage Import-MDTTaskSequence New-MDTDatabase Remove-MDTMonitorData Remove-MDTPersistentDrive Restore-MDTPersistentDrive Set-MDTMonitorData Test-MDTDeploymentShare Test-MDTMonitorData Update-MDTDatabaseSchema Update-MDTDeploymentShare Update-MDTLinkedDS Update-MDTMedia Update-MDTMedia Add-VamtProductKey Export-VamtData Find-VamtManagedMachine Get-VamtConfirmationId Get-VamtProduct Get-VamtProductKey Import-VamtData Initialize-VamtData Install-VamtConfirmationId Install-VamtProductActivation Install-VamtProductKey Update-VamtProduct",nomarkup:"-ne -eq -lt -gt -ge -le -not -like -notlike -match -notmatch -contains -notcontains -in -notin -replace"},c:[t,e.NM,n,a,r,o,s]}});hljs.registerLanguage("plaintext",function(e){return{disableAutodetect:!0}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,a,t]}});hljs.registerLanguage("shell",function(s){return{aliases:["console"],c:[{cN:"meta",b:"^\\s{0,3}[\\w\\d\\[\\]()@-]*[>%$#]",starts:{e:"$",sL:"bash"}}]}});hljs.registerLanguage("vbscript",function(e){return{aliases:["vbs"],cI:!0,k:{keyword:"call class const dim do loop erase execute executeglobal exit for each next function if then else on error option explicit new private property let get public randomize redim rem select case set stop sub while wend with end to elseif is or xor and not class_initialize class_terminate default preserve in me byval byref step resume goto",built_in:"lcase month vartype instrrev ubound setlocale getobject rgb getref string weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency conversions csng timevalue second year space abs clng timeserial fixs len asc isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion scriptengine split scriptengineminorversion cint sin datepart ltrim sqr scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw chrw regexp server response request cstr err",literal:"true false null nothing empty"},i:"//",c:[e.inherit(e.QSM,{c:[{b:'""'}]}),e.C(/'/,/$/,{r:0}),e.CNM]}});hljs.registerLanguage("xml",function(s){var e="[A-Za-z0-9\\._:-]+",t={eW:!0,i:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"meta",b:/<\?xml/,e:/\?>/,r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0},{b:'b"',e:'"',skip:!0},{b:"b'",e:"'",skip:!0},s.inherit(s.ASM,{i:null,cN:null,c:null,skip:!0}),s.inherit(s.QSM,{i:null,cN:null,c:null,skip:!0})]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[t],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[t],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}});hljs.registerLanguage("markdown",function(e){return{aliases:["md","mkdown","mkd"],c:[{cN:"section",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"quote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"^```w*s*$",e:"^```s*$"},{b:"`.+?`"},{b:"^( {4}| )",e:"$",r:0}]},{b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:!0,c:[{cN:"string",b:"\\[",e:"\\]",eB:!0,rE:!0,r:0},{cN:"link",b:"\\]\\(",e:"\\)",eB:!0,eE:!0},{cN:"symbol",b:"\\]\\[",e:"\\]",eB:!0,eE:!0}],r:10},{b:/^\[[^\n]+\]:/,rB:!0,c:[{cN:"symbol",b:/\[/,e:/\]/,eB:!0,eE:!0},{cN:"link",b:/:\s*/,e:/$/,eB:!0}]}]}});hljs.registerLanguage("python",function(e){var r={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},b={cN:"meta",b:/^(>>>|\.\.\.) /},c={cN:"subst",b:/\{/,e:/\}/,k:r,i:/#/},a={cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[e.BE,b],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[e.BE,b],r:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[e.BE,b,c]},{b:/(fr|rf|f)"""/,e:/"""/,c:[e.BE,b,c]},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},{b:/(fr|rf|f)'/,e:/'/,c:[e.BE,c]},{b:/(fr|rf|f)"/,e:/"/,c:[e.BE,c]},e.ASM,e.QSM]},s={cN:"number",r:0,v:[{b:e.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:e.CNR+"[lLjJ]?"}]},i={cN:"params",b:/\(/,e:/\)/,c:["self",b,s,a]};return c.c=[a,s,b],{aliases:["py","gyp"],k:r,i:/(<\/|->|\?)|=>/,c:[b,s,a,e.HCM,{v:[{cN:"function",bK:"def"},{cN:"class",bK:"class"}],e:/:/,i:/[${=;\n,]/,c:[e.UTM,i,{b:/->/,eW:!0,k:"None"}]},{cN:"meta",b:/^[\t ]*@/,e:/$/},{b:/\b(print|exec)\(/}]}});hljs.registerLanguage("mathematica",function(e){return{aliases:["mma"],l:"(\\$|\\b)"+e.IR+"\\b",k:"AbelianGroup Abort AbortKernels AbortProtect Above Abs Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Active ActiveItem ActiveStyle AcyclicGraphQ AddOnHelpPath AddTo AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AffineTransform After AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowedDimensions AllowGroupClose AllowInlineCells AllowKernelInitialization AllowReverseGroupClose AllowScriptLevelChange AlphaChannel AlternatingGroup AlternativeHypothesis Alternatives AmbientLight Analytic AnchoredSearch And AndersonDarlingTest AngerJ AngleBracket AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotation Annuity AnnuityDue Antialiasing Antisymmetric Apart ApartSquareFree Appearance AppearanceElements AppellF1 Append AppendTo Apply ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess ARProcess Array ArrayComponents ArrayDepth ArrayFlatten ArrayPad ArrayPlot ArrayQ ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads AspectRatio AspectRatioFixed Assert Assuming Assumptions AstronomicalData Asynchronous AsynchronousTaskObject AsynchronousTasks AtomQ Attributes AugmentedSymmetricPolynomial AutoAction AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords Axes AxesEdge AxesLabel AxesOrigin AxesStyle Axis BabyMonsterGroupB Back Background BackgroundTasksSettings Backslash Backsubstitution Backward Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseForm Baseline BaselinePosition BaseStyle BatesDistribution BattleLemarieWavelet Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized BetweennessCentrality BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms Booleans BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryStyle Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BubbleChart BubbleChart3D BubbleScale BubbleSizes BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteCount ByteOrdering C CachedValue CacheGraphics CalendarData CalendarType CallPacket CanberraDistance Cancel CancelButton CandlestickChart Cap CapForm CapitalDifferentialD CardinalBSplineBasis CarmichaelLambda Cases Cashflow Casoratian Catalan CatalanNumber Catch CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterDot CentralMoment CentralMomentGeneratingFunction CForm ChampernowneNumber ChanVeseBinarize Character CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop Circle CircleBox CircleDot CircleMinus CirclePlus CircleTimes CirculantGraph CityData Clear ClearAll ClearAttributes ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent ClusteringComponents CMYKColor Coarse Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorCombine ColorConvert ColorData ColorDataFunction ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorSpace Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CommonDefaultFormatTypes Commonest CommonestFilter CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledFunction Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries Composition CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath Congruent Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphQ ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray Constants ConstrainedMax ConstrainedMin ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFilename ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean Control ControlActive ControlAlignment ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateDialog CreateDirectory CreateDocument CreateIntermediateDirectories CreatePalette CreatePalettePacket CreateScheduledTask CreateTemporary CreateWindow CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossingDetect CrossMatrix Csc Csch CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrentImage CurrentlySpeakingPacket CurrentValue CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecomposition D DagumDistribution DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DataCompression DataDistribution DataRange DataReversed Date DateDelimiters DateDifference DateFunction DateList DateListLogPlot DateListPlot DatePattern DatePlus DateRange DateString DateTicksFormat DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayMatchQ DayName DayPlus DayRange DayRound DeBruijnGraph Debug DebugTag Decimal DeclareKnownSymbols DeclarePackage Decompose Decrement DedekindEta Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic Deinitialization Del Deletable Delete DeleteBorderComponents DeleteCases DeleteContents DeleteDirectory DeleteDuplicates DeleteFile DeleteSmallComponents DeleteWithContents DeletionWarning Delimiter DelimiterFlashTime DelimiterMatching Delimiters Denominator DensityGraphics DensityHistogram DensityPlot DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DescriptorStateSpace DesignMatrix Det DGaussianWavelet DiacriticalPositioning Diagonal DiagonalMatrix Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DifferenceDelta DifferenceOrder DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralGroup Dilation Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletCharacter DirichletConvolve DirichletDistribution DirichletL DirichletTransform DirichletWindow DisableConsolePrintPacket DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform Discriminant Disjunction Disk DiskBox DiskMatrix Dispatch DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentNotebook DominantColors DOSTextFormat Dot DotDashed DotEqual Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DSolve Dt DualLinearProgramming DualSystemsModel DumpGet DumpSave DuplicateFreeQ Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptions E EccentricityCentrality EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeCost EdgeCount EdgeCoverQ EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData Eliminate EliminationOrder EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EnableConsolePrintPacket Enabled Encode End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfFile EndOfLine EndOfString EndPackage EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entropy EntropyFilter Environment Epilog Equal EqualColumns EqualRows EqualTilde EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerE EulerGamma EulerianGraphQ EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluationCell EvaluationCompletionAction EvaluationElements EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpToTrig ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalCall ExternalDataCharacterEncoding Extract ExtractArchive ExtremeValueDistribution FaceForm FaceGrids FaceGridsStyle Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail FailureDistribution False FARIMAProcess FEDisableConsolePrintPacket FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket Fibonacci FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileDate FileExistsQ FileExtension FileFormat FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileType FilledCurve FilledCurveBox Filling FillingStyle FillingTransform FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindArgMax FindArgMin FindClique FindClusters FindCurvePath FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEulerianCycle FindFaces FindFile FindFit FindGeneratingFunction FindGeoLocation FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMaximum FindMaximumFlow FindMaxValue FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindPermutation FindPostmanTour FindProcessParameters FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindThreshold FindVertexCover FindVertexCut Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstPassageTimeDistribution FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FittedModel FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlatTopWindow FlipView Floor FlushPrintOutputPacket Fold FoldList Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrequencySamplingFilterKernel FresnelC FresnelS Friday FrobeniusNumber FrobeniusSolve FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullOptions FullSimplify Function FunctionExpand FunctionInterpolation FunctionSpace FussellVeselyImportance GaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins Gamma GammaDistribution GammaRegularized GapPenalty Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateConditions GeneratedCell GeneratedParameters GeneratingFunction Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDistance GeoGridPosition GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoPosition GeoPositionENU GeoPositionXYZ GeoProjectionData GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter Graph GraphAssortativity GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel GreatCircleDistance Greater GreaterEqual GreaterEqualLess GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterTilde Green Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain Gudermannian GumbelDistribution HaarWavelet HadamardMatrix HalfNormalDistribution HamiltonianGraphQ HammingDistance HammingWindow HankelH1 HankelH2 HankelMatrix HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash HashTable Haversine HazardFunction Head HeadCompose Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenSurface HighlightGraph HighlightImage HighpassFilter HigmanSimsGroupHS HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HitMissTransform HITSCentrality HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HotellingTSquareDistribution HoytDistribution HTMLSave Hue HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestData I Identity IdentityMatrix If IgnoreCase Im Image Image3D Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageAspectRatio ImageAssemble ImageCache ImageCacheValid ImageCapture ImageChannels ImageClip ImageColorSpace ImageCompose ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDataPacket ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDistance ImageEffect ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageForestingComponents ImageForwardTransformation ImageHistogram ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarkers ImageMeasurements ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImageQ ImageRangeCache ImageReflect ImageRegion ImageResize ImageResolution ImageRotate ImageRotated ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions Implies Import ImportAutoReplacements ImportString ImprovementImportance In IncidenceGraph IncidenceList IncidenceMatrix IncludeConstantBasis IncludeFileExtension IncludePods IncludeSingularTerm Increment Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentUnit IndependentVertexSetQ Indeterminate IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers Infinity Infix Information Inherited InheritScope Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InlineCounterAssignments InlineCounterIncrements InlineRules Inner Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionPointObject InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Install InstallService InString Integer IntegerDigits IntegerExponent IntegerLength IntegerPart IntegerPartitions IntegerQ Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction InterpretTemplate InterquartileRange Interrupt InterruptSettings Intersection Interval IntervalIntersection IntervalMemberQ IntervalUnion Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHaversine InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InversePermutation InverseRadon InverseSeries InverseSurvivalFunction InverseWaveletTransform InverseWeierstrassP InverseZTransform Invisible InvisibleApplication InvisibleTimes IrreduciblePolynomialQ IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcess JaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join Joined JoinedCurve JoinedCurveBox JoinForm JordanDecomposition JordanModelDecomposition K KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelMixtureDistribution KernelObject Kernels Ket Khinchin KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnightTourGraph KnotData KnownUnitQ KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter Label Labeled LabeledSlider LabelingFunction LabelStyle LaguerreL LambdaComponents LambertW LanczosWindow LandauDistribution Language LanguageCategory LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCM LeafCount LeapYearQ LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessFullEqual LessGreater LessLess LessSlantEqual LessTilde LetterCharacter LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox LinearFilter LinearFractionalTransform LinearModelFit LinearOffsetFunction LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBreak LinebreakAdjustments LineBreakChart LineBreakWithin LineColor LineForm LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRead LinkReadHeld LinkReadyQ Links LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot Listen ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalClusteringCoefficient LocalizeVariables LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestAscendingSequence LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow Loopback LoopFreeGraphQ LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LyapunovSolve LyonsGroupLy MachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules MangoldtLambda ManhattanDistance Manipulate Manipulator MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixPlot MatrixPower MatrixQ MatrixRank Max MaxBend MaxDetect MaxExtraBandwidths MaxExtraConditions MaxFeatures MaxFilter Maximize MaxIterations MaxMemoryUsed MaxMixtureKernels MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxValue MaxwellDistribution McLaughlinGroupMcL Mean MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter Median MedianDeviation MedianFilter Medium MeijerG MeixnerDistribution MemberQ MemoryConstrained MemoryInUse Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuPacket MenuSortingValue MenuStyle MenuView MergeDifferences Mesh MeshFunctions MeshRange MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation Method MethodOptions MexicanHatWavelet MeyerWavelet Min MinDetect MinFilter MinimalPolynomial MinimalStateSpaceModel Minimize Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingDataMethod MittagLefflerE MixedRadix MixedRadixQuantity MixtureDistribution Mod Modal Mode Modular ModularLambda Module Modulus MoebiusMu Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction Monday Monitor MonomialList MonomialOrder MonsterGroupM MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform Most MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovingAverage MovingMedian MoyalDistribution MultiedgeStyle MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistribution N NakagamiDistribution NameQ Names NamespaceBox Nand NArgMax NArgMin NBernoulliB NCache NDSolve NDSolveValue Nearest NearestFunction NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeMultinomialDistribution NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestList NestWhile NestWhileList NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextPrime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants None NonlinearModelFit NonlocalMeansFilter NonNegative NonPositive Nor NorlundB Norm Normal NormalDistribution NormalGrouping Normalize NormalizedSquaredEuclideanDistance NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde NotHumpDownHump NotHumpEqual NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms Null NullRecords NullSpace NullWords Number NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlot O ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OddQ Off Offset OLEData On ONanGroupON OneIdentity Opacity Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering Orderless OrnsteinUhlenbeckProcess Orthogonalize Out Outer OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OwenT OwnValues PackingMethod PaddedForm Padding PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageWidth PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParetoDistribution Part PartialCorrelationFunction PartialD ParticleData Partition PartitionsP PartitionsQ ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PerformanceGoal PeriodicInterpolation Periodogram PeriodogramArray PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PERTDistribution PetersenGraph PhaseMargins Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest Pink Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarGraphQ Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangePadding PlotRegion PlotStyle Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox PointBox PointFigureChart PointForm PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonBox PolygonBoxOptions PolygonHoleScale PolygonIntersections PolygonScale PolyhedronData PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position Positive PositiveDefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement PredictionRoot PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependTo PreserveImageOptions Previous PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitiveRoot PrincipalComponents PrincipalValue Print PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessEstimator ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptions QBinomial QFactorial QGamma QHypergeometricPFQ QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ Quantile QuantilePlot Quantity QuantityForm QuantityMagnitude QuantityQ QuantityUnit Quartics QuartileDeviation Quartiles QuartileSkewness QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainder RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Random RandomChoice RandomComplex RandomFunction RandomGraph RandomImage RandomInteger RandomPermutation RandomPrime RandomReal RandomSample RandomSeed RandomVariate RandomWalkProcess Range RangeFilter RangeSpecification RankedMax RankedMin Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios Raw RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadList ReadProtected Real RealBlockDiagonalForm RealDigits RealExponent Reals Reap Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate RegionBinarize RegionFunction RegionPlot RegionPlot3D RegularExpression Regularization Reinstall Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot Remove RemoveAlphaChannel RemoveAsynchronousTask Removed RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart Repeated RepeatedNull RepeatedString Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated Resampling Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask Residue Resolve Rest Resultant ResumePacket Return ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulerUnits Run RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilarity SameQ SameTest SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveDefinitions SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTaskActiveQ ScheduledTaskData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition Sec Sech SechDistribution SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemialgebraicComponentInstances SendMail Sequence SequenceAlignment SequenceForm SequenceHold SequenceLimit Series SeriesCoefficient SeriesData SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPrecision SetProperty SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share Sharpen ShearingMatrix ShearingTransform ShenCastanMatrix Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortUpArrow Show ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiegelTheta SiegelTukeyTest Sign Signature SignedRankTest SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution Skip SliceDistribution Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SocialMediaData Socket SokalSneathDissimilarity Solve SolveAlways SolveDelayed Sort SortBy Sound SoundAndGraphics SoundNote SoundVolume Sow Space SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution Speak SpeakTextPacket SpearmanRankTest SpearmanRho Spectrogram SpectrogramArray Specularity SpellingCorrection SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackInhibit StandardDeviation StandardDeviationFilter StandardForm Standardize StandbyDistribution Star StarGraph StartAsynchronousTask StartingStepSize StartOfLine StartOfString StartScheduledTask StartupSound StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringCount StringDrop StringExpression StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPosition StringQ StringReplace StringReplaceList StringReplacePart StringReverse StringRotateLeft StringRotateRight StringSkeleton StringSplit StringTake StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleBoxOptions StyleData StyleDefinitions StyleForm StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subset SubsetEqual Subsets SubStar Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde SuchThat Sum SumConvergence Sunday SuperDagger SuperMinus SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceColor SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SystemDialogInput SystemException SystemHelpPath SystemInformation SystemInformationData SystemOpen SystemOptions SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemStub Tab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeWhile Tally Tan Tanh TargetFunctions TargetUnits TautologyQ TelegraphProcess TemplateBox TemplateBoxOptions TemplateSlotSequence TemporalData Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCell TextClipboardType TextData TextForm TextJustification TextLine TextPacket TextParagraph TextRecognize TextRendering TextStyle Texture TextureCoordinateFunction TextureCoordinateScaling Therefore ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreeJSymbol Threshold Through Throw Thumbnail Thursday Ticks TicksStyle Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint Times TimesBy TimeSeriesForecast TimeSeriesInvertibility TimeUsed TimeValue TimeZone Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate ToDiscreteTimeModel ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform TopologicalSort ToRadicals ToRules ToString Total TotalHeight TotalVariationFilter TotalWidth TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField Translate TranslationTransform TransparentColor Transpose TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle TriangleWave TriangularDistribution Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean True TrueQ TruncatedDistribution TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow Tuples TuranGraph TuringMachine Transparent UnateQ Uncompress Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UndirectedEdge UndirectedGraph UndirectedGraphQ UndocumentedTestFEParserPacket UndocumentedTestGetSelectionPacket Unequal Unevaluated UniformDistribution UniformGraphDistribution UniformSumDistribution Uninstall Union UnionPlus Unique UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitTriangle UnitVector Unprotect UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpValues URL URLFetch URLFetchAsynchronous URLSave URLSaveAsynchronous UseGraphicsRange Using UsingFrontEnd V2Get ValidationLength Value ValueBox ValueBoxOptions ValueForm ValueQ ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerifyConvergence VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoigtDistribution VonMisesDistribution WaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeberE Wedge Wednesday WeibullDistribution WeierstrassHalfPeriods WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WilksW WilksWTest WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult Word WordBoundary WordCharacter WordData WordSearch WordSeparators WorkingPrecision Write WriteString Wronskian XMLElement XMLObject Xnor Xor Yellow YuleDissimilarity ZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZipfDistribution ZTest ZTransform $Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AssertFunction $Assumptions $AsynchronousTask $BaseDirectory $BatchInput $BatchOutput $BoxForms $ByteOrdering $Canceled $CharacterEncoding $CharacterEncodings $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $CreationDate $CurrentLink $DateStringFormat $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $Epilog $ExportFormats $Failed $FinancialDataSource $FormatType $FrontEnd $FrontEndSession $GeoLocation $HistoryLength $HomeDirectory $HTTPCookies $IgnoreEOF $ImagingDevices $ImportFormats $InitialDirectory $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $ModuleNumber $NetworkLicense $NewMessage $NewSymbol $Notebooks $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $PipeSupported $Post $Pre $PreferencesDirectory $PrePrint $PreRead $PrintForms $PrintLiteral $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $RandomState $RecursionLimit $ReleaseNumber $RootDirectory $ScheduledTask $ScriptCommandLine $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemWordLength $TemporaryDirectory $TemporaryPrefix $TextStyle $TimedOut $TimeUnit $TimeZone $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $Urgent $UserAddOnsDirectory $UserBaseDirectory $UserDocumentsDirectory $UserName $Version $VersionNumber", +c:[{cN:"comment",b:/\(\*/,e:/\*\)/},e.ASM,e.QSM,e.CNM,{b:/\{/,e:/\}/,i:/:/}]}});hljs.registerLanguage("r",function(e){var r="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{c:[e.HCM,{b:r,l:r,k:{keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},r:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",r:0},{cN:"number",b:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",r:0},{cN:"number",b:"\\d+\\.(?!\\d)(?:i\\b)?",r:0},{cN:"number",b:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{b:"`",e:"`",r:0},{cN:"string",c:[e.BE],v:[{b:'"',e:'"'},{b:"'",e:"'"}]}]}});hljs.registerLanguage("scilab",function(e){var s=[e.CNM,{cN:"string",b:"'|\"",e:"'|\"",c:[e.BE,{b:"''"}]}];return{aliases:["sci"],l:/%?\w+/,k:{keyword:"abort break case clear catch continue do elseif else endfunction end for function global if pause return resume select try then while",literal:"%f %F %t %T %pi %eps %inf %nan %e %i %z %s",built_in:"abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp error exec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isempty isinfisnan isvector lasterror length load linspace list listfiles log10 log2 log max min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand real round sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tan type typename warning zeros matrix"},i:'("|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function",e:"$",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)"}]},{b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:"",r:0},{b:"\\[",e:"\\]'*[\\.']*",r:0,c:s},e.C("//","$")].concat(s)}});hljs.registerLanguage("ini",function(e){var b={cN:"string",c:[e.BE],v:[{b:"'''",e:"'''",r:10},{b:'"""',e:'"""',r:10},{b:'"',e:'"'},{b:"'",e:"'"}]};return{aliases:["toml"],cI:!0,i:/\S/,c:[e.C(";","$"),e.HCM,{cN:"section",b:/^\s*\[+/,e:/\]+/},{b:/^[a-z0-9\[\]_-]+\s*=\s*/,e:"$",rB:!0,c:[{cN:"attr",b:/[a-z0-9\[\]_-]+/},{b:/=/,eW:!0,r:0,c:[{cN:"literal",b:/\bon|off|true|false|yes|no\b/},{cN:"variable",v:[{b:/\$[\w\d"][\w\d_]*/},{b:/\$\{(.*?)}/}]},b,{cN:"number",b:/([\+\-]+)?[\d]+_[\d_]+/},e.NM]}]}]}}); \ No newline at end of file diff --git a/themes/hugo-theme-learn/static/js/hugo-learn.js b/themes/hugo-theme-learn/static/js/hugo-learn.js index a90f35a77..5bd763603 100644 --- a/themes/hugo-theme-learn/static/js/hugo-learn.js +++ b/themes/hugo-theme-learn/static/js/hugo-learn.js @@ -21,7 +21,9 @@ var images = $("div#body-inner img").not(".inline"); // Wrap image inside a featherlight (to get a full size view in a popup) images.wrap(function(){ var image =$(this); - return ""; + if (!image.parent("a").length) { + return ""; + } }); // Change styles, depending on parameters set to the image @@ -56,21 +58,20 @@ images.each(function(index){ }); // Stick the top to the top of the screen when scrolling -$("#top-bar").stick_in_parent( { - parent: ".sticky-parent", - spacer: ".sticky-spacer", +$(document).ready(function(){ + $("#top-bar").sticky({topSpacing:0, zIndex: 1000}); }); jQuery(document).ready(function() { // Add link button for every - var text, clip = new Clipboard('.anchor'); + var text, clip = new ClipboardJS('.anchor'); $("h1~h2,h1~h3,h1~h4,h1~h5,h1~h6").append(function(index, html){ var element = $(this); - var url = document.location.origin + document.location.pathname; + var url = encodeURI(document.location.origin + document.location.pathname); var link = url + "#"+element[0].id; return " " + - "" + + "" + "" ; }); @@ -83,5 +84,8 @@ jQuery(document).ready(function() { e.clearSelection(); $(e.trigger).attr('aria-label', 'Link copied to clipboard!').addClass('tooltipped tooltipped-s'); }); - + $('code.language-mermaid').each(function(index, element) { + var content = $(element).html().replace(/&/g, '&'); + $(element).parent().replaceWith('
    ' + content + '
    '); + }); }); diff --git a/themes/hugo-theme-learn/static/js/jquery-3.3.1.min.js b/themes/hugo-theme-learn/static/js/jquery-3.3.1.min.js new file mode 100644 index 000000000..4d9b3a258 --- /dev/null +++ b/themes/hugo-theme-learn/static/js/jquery-3.3.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w("