Tuesday, April 24, 2018

SUGARCRM: Custom Theme

The following error is either thrown when installing a new Sugar instance or when clearing the cache:

Exception in Controller: exception 'SugarApiExceptionError' with message 'lessc fatal error:<br />load error: failed to find tmp_less_custom_compiler.less'

This means that your custom.less file has a syntax error. Fix any syntax errors and try again.

If your custom.less file is empty, just delete the file, clear the cache, and load the Page again.

mySQL - Time Out Error

The following error is thrown when importing a large database:

mysql server has gone away

If you are an admin or have sufficient privileges, update the my.cnf or mysql.cnf file by adding the following command:

[mysqld]
max_allowed_packet=500M

Monday, March 12, 2018

JAVASCRIPT: Date Current Year

In JavaScript, we can get the current year as follows:
var myDate = new Date('2017-02-12');
console.log(myDate.getFullYear());
Expected Output: 2017
Actual Output: 2017

But, what happens if we test a boundary value with the above function:
var myDate = new Date('2017-01-01');
console.log(myDate.getFullYear());
Expected Output: 2017
Actual Output: 2016

In this case, we need to call getUTCFullYear()
var myDate = new Date('2017-01-01');
console.log(myDate.getUTCFullYear());
Expected Output: 2017
Actual Output: 2017

Thursday, May 25, 2017

PHP: Set Datetime with a Specific Time Zone

// Some databases or systems use GMT or UTC, so we need to 
// get the correct date time format at this point
$UTC = new DateTimeZone("UTC");
$dateTime = new DateTime($date, $UTC);

// Set your preferred time zone $dateTime->setTimezone(new DateTimeZone('America/Los Angeles'));
// Extra: Format your date time
$dateTimeFormatted = $dateTime->format('Y-m-d H:i:s');
echo  $dateTimeFormatted;

Friday, May 5, 2017

LINUX: Copying and Overwriting Files from a Folder to Parent Folder

cp -fR /source/files /dest
 
https://superuser.com/questions/358843/
how-to-replace-all-the-contents-from-one-folder-with-another-one 

LINUX: Changing Group and Ownership

Note: You may need root/sudo permissions

Group:
> chgrp <group name> <directory or file name>

Owner:
> chown  <user name> <directory>

Owner and Group:
> chown <user name>:<group name> <directory>

Owner and Group of all files and subfolders
> chown -R <user name>:<group name> <directory>

Thursday, May 4, 2017

BACKBONE: Detecting Events for Several Elements

Problem:
Suppose you have several "select" elements in a table with the same data that triggers another "select" element, but you want to detect each "select" individually.

<table>
  <tr>
    <td><select>.....</select></td> <!--Select we want to detect-->
    <td><select>.....</select></td> <!--Dependent Select--> 
 </tr>
 <tr>
    <td><select>.....</select></td> <!--Another Select-->
    <td><select>.....</select></td> <!--Another dependent Select-->
 </tr>
</table>

Solution:
In Backbone, we can add the "data-id" tag to the select element and dynamically populate the id in Backbone. Also, we need to add a class tag so all the "select" elements are fired without the need to construct a map or array of events. In the event you want to favor performance over simplicity, please consider the events collection approach.

({
     selectTable1:
    {
         selectCounter : 0
    },

    initialize: function()
    {
         // Add selects dynamically here (or create a helper function),
         // or get other selects, etc.
    },
 
    events:
   {
       'change .myClass': 'detectEvent'
   },

   detectEvent: function(e)
    {
        e.preventDefault();
        var id = $(e.currentTarget).data("id");
    }
)}

Tuesday, May 2, 2017

SUGARCRM: Installation Error. Config File Screen Stops Responding

Problem: 
When installing SugarCRM (in my case 7.8.2.0) I got the following error in my developer console using Chrome: "document.getElementById('button_next2') undefined" and my installation stops responding while configuring my config.php file

Solution:
On my previous screen, I used an existing database. Deleting (dropping) the database and letting sugar create a new one fixed the issue. Really?

SUGARCRM: Accessing Related Beans of a Module

if($bean->load_relationship('my_relationship_name_in_studio'))
{
   $relatedBeans = $bean->my_relationship_name_in_studio->getBeans();
}

// traverse $relatedBeans here
.........

SUGARCRM: Accessing Beans Inside Entry Points

Problem: 
Cannot access bean data inside a custom Entry Point, and no errors are reported by either PHP or SugarCRM (i.e. empty bean array or empty bean relationships)

Solution:
Warning: This implies a security risk as anyone can access the bean now.

if (empty($current_user) || empty($current_user->id)) {
    $current_user = new User();
    $current_user->getSystemUser(); // or any other user bean
}

SUGARCRM: Error Installing SugarCRM 7.8

Problem:
Test for .htaccess rewrites failed. This usually means you do not have AllowOverride set up for Sugar directory.


Solution:
Make sure the url is being accessed via https and not http. If this does not work, add AllowOverrideAll to your config file or .htaccess under <Directory>

Wednesday, April 26, 2017

PHP: Formatting Date Specified as YYYY-MM-DDT00:00:00

public function formatDate($date, $daysToAdd)
{
   $dateTime = new DateTime($date); 
   
   // Change the format accordingly  
   $dateTimeFormatted = $dateTime->format('Y-m-d h:m:s');
   return str_replace(' ', 'T', $dateTimeFormatted);
}

JavaScript: Constructing a Simple JSON Object Dynamically

1. Create an initial JSON object with a single element and an array:

   // {$id} is a PHP variable but it can be anything else
   jsonObj = {"id" : "{$id}", "myArray": []};

2. Construct the JSON object
   item = {}
   item ["id"] = "some Id";
   item ["value"] = "Some Value";
   jsonObj.myArray.push(item);

3. Output JavaScript:
   Object {id: "564f48ba-e9d5-463a-2325-58f91c653aa8", myArray: Array(1)}
   
   where myArray is broken down as follows:
   myArray: Array(3)
      0: Object
         id: "Some Id",
         value: "Some Value"

4. Output PHP:
   Array
   ( 
     [id] => 564f48ba-e9d5-463a-2325-58f91c653aa8
     [myArray] => Array
     (
          [0] => Array
          (
               [id] => Some Id
               [value] => Some Value
          )
     )
   )

Friday, April 21, 2017

SUGARCRM: Querying Results using Raw SQL Statements

$sql = "SELECT id FROM accounts WHERE deleted = 0";

$result = $GLOBALS['db']->query($sql);

while($row = $GLOBALS['db']->fetchByAssoc($result) )
{
    //Use $row['id'] to grab the id fields value
    $id = $row['id'];
}
https://support.sugarcrm.com/Documentation/Sugar_Developer/Sugar_Developer_Guide_7.8/Data_Framework/Database/DBManagerFactory/ 

SUGARCRM: Getting blank Page on Entry Point

Make sure your Entry point is registered in your instance:

/custom/Extension/application/Ext/EntryPointRegistry/<your entry point>

Thursday, April 20, 2017

SUGARCRM 7.8: Obtaining Field Labels based on Module Names

require_once('include/utils.php');
$label = translate('LBL_KEY', 'Accounts');
https://support.sugarcrm.com/Documentation/Sugar_Developer/Sugar_Developer_Guide_7.8/Architecture/Languages/Module_Labels/index.html 

Wednesday, March 15, 2017

ELASTICSEARCH: Restarting Elastic Search SugarCRM Installation

Error:
Unable to connect to Full Text Search server, please verify settings

Solution:
1. Check ElasticSearch is running
   >  sudo /etc/init.d/elasticsearch status
2. If status is not running, restart
   >  sudo /etc/init.d/elasticsearch restart
3. If the above does not work, modify /etc/elasticsearch/elasticsearch.yml as follows:
discovery.zen.ping.multicast.enabled: false and repeat 1 & 2

Monday, March 6, 2017

SUGARCRM: Debugging SugarCRM 7.x

Inside a Logic Hook or any other backend file:

echo "<pre> DEBUGGING: ".PRINT_R('BEFORE' ,TRUE)."</pre>";

NOTE: The above command is for debugging purposes only. Make sure to remove that command before pushing to either production or QA.

UNIX: Checking Logs in Real-Time

$>> tail -f <filename>