Follow Me On...
Tuesday
Feb192013

SugarCRM - Update Calculated Fields Nightly

SugarCRM has some powerful calculated fields called Sugar Logic. One limitation though is they are only calculated when a field is saved. I wanted a simple way to display the number of days since X occurred.

So, I created a very simple script which can be run from the Scheduler every night. It basically just iterates through all the records for a user configurable module type and forces the calculation to update. Best of all it does this without changing the modified date, modified by or creating a tracker entry.

This script could also be used one time to just initially seed all the calculated values for a module. The suggestion from the admin guide is to do a mass update but that’ll cause modified dates, etc to change.

The code is hosted on github here: https://github.com/blak3r/sugarcrm-update-calculated-fields

Potential Applications:

  1. Days since lead was last contacted.
  2. Days since order added to system.
  3. Days since a support case was entered.
  4. (There’s lots)

My original application was to keep track of how long it was taking our company to ship orders once we had all the information from a customer.

  1. I created a workflow rule such that when orderstage == Production Ready, I would set the date field “productionready_date”.
  2. I then created a calculated field called “dayssinceproduction_ready” and set the formula to something like abs(daysSince($production_ready_date))
  3. Installed the script on my github site and created a scheduler job to run at 3am every night.

We now use the field as a dashlet on our order status tab and it’s used in some reports to be able to look back over the past year and see how well the production team is doing at getting orders out and to be able to do analysis on the orders that took a long time to identify ways to speed them up.

Alternate Strategies

An alternative to using custom fields would be to create a nightly task which just updates a fields. I prefer this approach for the following reasons…

  1. I can add new calculated fields using Studio and not have to update code at all on the server. You can also have multiple calculated fields per module.
  2. Since Sugar Logic is also applied in Javascript fields, if a date field is changed manually (instead of via a workflow rule), the calculated field updates in realtime while in the edit view and will be accurate on the detail view as well. Otherwise you’d need to create a on save logic hook to do that if nightly synchronization wasn’t enough.

Other alternative is to not calculate the days and just have a date field and design reports to only show records that are within a certain time range. This was the initial approach I used to take, I find that this makes creating reports a LOT harder. Also, if you want to calculate something like the average time an order was fulfilled you can’t do that with Sugar’s Reporting at this time. Plus it’s just easier in my opinion to look at an integer such as 14 vs. 2013-02-18. It also simplifies custom formatting of rows in my dashlets. It’s fairly easy to write some jquery code to highlight based on a number… having to parse dates and calculate them would be slower and more of a pain.

Tuesday
Nov272012

SnagIt - Why I Hate It and Yet Can't Live Without It...

I have a love hate relationship with Techsmith's SnagIt. The app does so many things very well... but there are few things which really frustrate me on a daily basis. I go searching for alternatives fairly often as a result of them. Here's my list of features which are really missing in SnagIt.

At the time of writing, The latest versions are: SnagIt 11.1 on Windows and SnagIt 2.0 on Mac.

1. Facilitate attaching images to Gmail/Web Apps

Webmail is great... but until browsers can fully access the clipboard, pasting images into a gmail window isn't going to be possible. The solution to this limitation that most webapps (gmail included) have embraced is allowing images to be "drag and dropped."

On SnagIt for windows, when you drag and drop an image from the catalog bar (the bar that shows up under the image editor), it attaches the image in the proprietary .SNAG format. Solution: create an event handler for this such that when you drag the image from the catalog it automatically saves it as a .png file in the catalog and use that copy as the image to drop.

On SnagIt for Mac, you cannot drag images out of the catalog bar at all. So, this needs to be added.

The fastest way to attach images I've found is to first do "Save as" and save as a png. Once you do that you can then drag it over and it'll attach as png. But, the additional save as step slows things down. Especially, you were trying to markup 5 images for an email. That extra save as step really adds up. So, the simple solution to this is add an event handler to detect dragging, automatically save the image as a PNG or JPG and then have that copy get "dropped" in the application instead of the .SNAG version.

2. Ability to resize everything using keyboard shortcut.

If you've ever used Balsamiq Mockups, you'll know what i'm talking about. In that app CTRL+[ makes things smaller and CTRL+] makes things bigger. For example, if you have text selected, it should make the text bigger. If you have an arrow selected, it should make the width of the arrow thicker. If you have a rectangle selected, it should make the stroke around it thicker. If you have a stamp selected, it should scale it up and down.

Having to hover over things to reveal the context menu is incredibly slow.

In SnagIt for windows, it is possible to create shortcuts for resizing the text. But, it's not possible to assign a shortcut to increase the width of an arrow unfortunately.

3. Scale Font To Fit.

When I draw a rectangle, I generally know that's the size I want it to be. I want the text I compose to be as large as possible but still fit in the area I defined. So, the default font size should be AUTO and it should resize the font to make this happen for me automagically.

The Mac version is slightly better. When you add more text then what would fit in the text area it automatically expands the shape. But, I'd prefer it to just scale the font instead because as I said earlier... Generally when I draw the shape, that's the size I want it to fit in.

4. Better Default Styles -or- Quicker Editing of Styles

If you love "Comic Sans" then you're the type of person that would like the default styles. Bad Fonts, Bad Colors, and Unprofessional shapes. This feedback applies more to the windows version. The Mac team did a much better good job of defining the styles.

The workaround to this that most people would suggest is to "Create a custom style". Well, no custom styles don't work (see below). But, if you're going to insist on it then at the very least they need to be improved in the following ways:

  1. Custom Styles need to be at the top of the list... not at the bottom where I have to scroll down every time for. Alternatively, make it possible to just delete the default quick styles.
  2. It should remember the last custom style used between sessions and default to this rather then the ugly default style.
  3. The preview for a custom styles don't look right. They don't show my font half the time or it's hard to tell how big the arrow widths are.

Better yet! Just make it easier to change the color, size, etc. No matter how organized you are about creating quick styles, there is no substitute for being able to customize the attributes on the fly. The colors I choose are directly related to the image background / style I'm marking up... so you you simply can't create styles for every occasion. Back in SnagIt 8, life was good. The original interface was so fast and intuitive. Once they made the switch to the ribbon interface in SnagIt 9, Things got hidden in menu's which appear on hover. God forbid you want to change the font size, font, color, and say the width. That's 3 separate hover steps. I still have snagit8 installed and prefer it's editor over the ribbon style anyday!

I like the Mac Version much better because it style has a property panel (similar to how SnagIt 8 for Windows did). But, the Mac Design team made some poor decisions for this panel. For example, If i'm editing a text rectangle. They give you options to quickly edit the Line Style and Width. But, changing the Font size, type and color are buried under a separate panel. Who edits the rectangle width more often then font size? No one! So, these options should be given priority.

Make it Easier to Combine Multiple Captures.

Often I'll take several captures and want to combine them into a single display. When you try and move the second capture into the first, it should automatically expand the canvas area.

Some more nit picky feature requests...

The features above would satisfy me and I feel all are completely actionable requests. But, here's a complete feature request list.

  1. On Mac, the padding between rectangle edge and the text is too high. Hard to fit everything in.
  2. Mac version, doesn't have features like Trim, Cutout, Spotlight and magnify at all.
  3. Windows Version, doesn't have the reflection option.
  4. On Windows, would love to be able to do spotlight & Magnify on multiple areas.
  5. Both Versions, would be nice to be able to create custom stamp library from multiple sources.
  6. On Mac, no option to assign a keyboard shortcut to Increase/Decrease Font size at all.
  7. Create styles which are proportional to image resolution. The styles are by default sized appropriately for screen captures at screen resolutions. If you ever try to markup an image from a digital camera, you'll need to increase the widths / font sizes. Make them be a percentage or scale appropriately based on source image resolution.

No better option!?

So, I've outlined a few of my biggest grips with SnagIt and all of them have to do with the built in editor. There is probably a better editor out there somewhere. But, I keep coming back to SnagIt for the following reasons. If anyone knows of a better editor that I could tie into SnagIt for editing please chime in.

  1. I love how I can capture things and not have to save them. I frequently take a screen grab and then do nothing with it. I save it for later when I have time to do something with it. So, it getting captured in Snagit's catalog is the unique feature which keeps me from switching.
  2. The "All in One" Capture option is incredible.
  3. SnagIt is reasonably priced ($50). I use Snagit on a lot of computers so putting an Adobe Creative Suite on all of them is just cost prohibitive.
  4. SnagIt is lightweight. The time to go from capture to editing is well under 2 seconds (if you have a good computer at least)... firing up an Adobe app just takes too long.
  5. For the most part... everything I need is in SnagIt and it's faster and easier then more heavyweight apps.

I'd really like a better solution and would love for people to chime in on the comments and let me know what they use and if there is a better solution out there. Thanks!

Update: 1/11/2013

I evaluate some other applications.

  1. Most promising to me is Clarify. It doesn't have a catalog per se but you can capture lots of images into a single book. It's intended for making a step by step instruction list. So, it allows you to put blocks of text between your screen grabs. It's a pretty good idea. I really like how they have styles. It's very easy to modify the colors widths etc.

  2. Skitch - seems to be the trendy app people are using. They have very limited options. You get one font and a small color palette. But the one font looks nice, an the colors all go together.

Monday
Nov122012

Super Entreprenario Brothers

Today I did a talk at the University of Maryland Students interested in Entrepreneurship.

I’m particularly proud of this slide:

I used it to illustrate the process of building skills (getting a power up), using that to land awesome internships (collect coins + powerup), that will ultimately lead to generating ideas for starting a business (the next level).

I’m officially coining: “Super Entreprenario Brothers”. heh

Friday
Nov022012

RDP with Multiple Monitor Support (not the span type) OS Versions Required

There are lots of blogs and MS FAQs you’ll find on this topic… but none of them concisely explain what is required to make this work. So, here’s a single source for all you should need.

There are two type of multi-monitor RDP connections. There is span mode which is useless in my opinion and there is true Multi-monitor support which is great because it’s just like the experience of being on the computer with multiple monitors connected. This allows you to click maximize and have it only maximize to the screen your on. In the span mode, it’ll maximize across both. For more info on the differences between the modes see this article: http://www.techrepublic.com/blog/window-on-windows/use-multiple-monitors-with-windows-7s-remote-desktop-connection/5785

Server Requirements (ie the remote machine)

The only OS’ that support this (as of 11/2/2012) are:

  • Windows 7 Ultimate or Enterprise or Windows Server 2008 R2
  • At the time of writing Windows 8 wasn’t out yet… It’ll probably be similar to Win7

Client Requirements

  • Any version of Windows 7.
  • WinXP computers can download RDP 7 and then make use of multiple monitors.
  • From a Mac —> Still no version that offers the “good” multi-monitor support. Some do the span mode though. Please post a comment if someone comes out new RDP client for Mac.

Hardware Requirements

  • You do not have to have multiple monitors connected to the Server machine. You can have 1 monitor (or no monitor for that matter)… Connect to it from a client machine which has say 5 monitors and use all of them. The number of real monitors / number of video cards in the remote computer is completely irrelevant.

Summary

The server side OS is what really matters. There is no way to remote into an older OS (WinXP) or basic version of Windows 7 (home or pro) and have the good Multi-Monitor support. But, you can (assuming you have the new RDP client installed) connect to one of the OS’ listed above and use all the monitors connected to your older WinXP machine.

I found this handy as I had an old crappy winxp box and some spare monitors. I set them up at my home office and RDP into my badass dev box (win7 ultimate) at my office.

Friday
Sep282012

Miss the Red X for Closing Tasks in SugarCRM v6.5?


Within two days of upgrading from Sugar 6.4 -> SugarCRM 6.5, I had two people come up to me and say how they missed the red X there used to be for closing tasks in subpanels.  In Sugar 6.5 they replaced all the little icons with an action dropdown widget.  As a result, it’s now two clicks to close a task, one to click the triangle icon to show the other actions and another to click close.


Fortunately, there is a simple workaround.  Open up /modules/Tasks/Metadata/Subpanels/ForActivities.php and swap the order in which the ‘close_button’ and the ‘edit_button’ appear in the file.   The result is close will be the default and you’ll have to click the triangle to get to edit.   If for some reason you like to edit tasks alot (aka a procrastinator), you’ll hate this change. But, if you’re a task master you’ll love having close be the default.

I suspect you can copy this ForActivities file to the custom folder and make this upgrade safe.  I’m personally banking on the red X making a comeback in Sugar 6.6 so I wasn’t so worried about it for now. 

Note: this process works for pretty much any module.  Just go to the appropriate module/metadata/subpanels folder and open the appropriate file.  For Tasks there are different layouts for “Activities”, “History” and the default view.

Wednesday
Aug082012

dumpcap Reference / Helper Bat File for Long Term Packet Captures

When you’re trying to debug a network device over a long period of time… Wireshark just wouldn’t cut it. It wasn’t designed for this purpose and will consume too much memory on your system. Not to worry, Wireshark does come with a command line utility which solves this deficiency. The utility is called dumpcap and with a simple command you can set it up to write packets to a series of files and roll over once you get to the end (a circular buffer).

Heres an example dumpcap line to run a capture that will create 1 log per day for 14 days and will only record traffic from host with IP = 10.32.1.234.  It records on network interface 1 by default. 

“c:\Program Files\Wireshark\dumpcap.exe” -b duration:86400 -b files:14 -f “host 10.32.1.234” -P -w capture.pcap

Here is a little batch file script I wrote to make this easier / repeatable.  It’s got some handy features like it will prompt you for IP to filter if you run without any arguments.  Otherwise, you can pass an argument in on cmd line or set a default at the top of the file.  

dump_packets.bat

::
:: Use to log packets over a long period of time from a particular device.
:: Creates a new file every 1 day for a total of 14 days. -f is capture filter, -w is the filename.
::
:: USAGE: Passing an argument will allow you to set the host IP.  Otherwise, you will be prompted.
::        Set DEFAULT_HOST to not have to specify any arguments / answer prompts.
:: 

@set DEFAULT_HOST=
@IF “%1” == “” GOTO SkipArgSet
@   set HOST=%1
   @echo Host is now %HOST% (Set from command line argument)
   @GOTO SkipPrompt
:SkipArgSet
@IF “%DEFAULT_HOST%” == “” GOTO SkipDefaultSet
   @SET HOST=%DEFAULT_HOST%
   @echo Host is now %HOST% (Set from DEFAULT at top of file)
   @GOTO SkipPrompt
:SkipDefaultSet
   @SET /p HOST=Enter the IP Address of the host you want to capture from:  
:SkipPrompt

@TITLE DUMPCAP Capture of %HOST% In Progress

@echo.
@echo ============[ INTERFACES ]===============
@”c:\Program Files\Wireshark\dumpcap” -D
echo.
@SET /p INTERFACE_NUMBER=Type Interface Number:


@echo.
“c:\Program Files\Wireshark\dumpcap” -b duration:86400 -b files:14 -f “host %HOST%” -i %INTERFACE_NUMBER% -P -w capture.pcap
@TITLE DUMPCAP stopped
@pause

Sample Output


D:\packet_captures>dump_packets.bat
Enter the IP Address of the host you want to capture from:  10.32.1.234

============[ INTERFACES ]===============
1. \Device\NPF_{1F70299B-0F5A-4F7D-BEC2-C7A36B7AC5A4} (Broadcom L2 NDIS client driver)
2. \Device\NPF_{2FC895CF-6EB7-4A1A-A5F6-23601DAAC8F1} (Broadcom L2 NDIS client driver)
3. \Device\NPF_{6F12DF50-73AB-4859-9B5C-469B7EACD28C} (Broadcom L2 NDIS client driver)
4. \Device\NPF_{CEFE7F77-A53E-4FCC-9B3D-975DBAB66012} (Network Teaming Intermediate Driver (NTID))
5. \Device\NPF_{900DE9A5-1BED-4A3A-96EC-F0D391CEA622} (Broadcom L2 NDIS client driver)


Type Interface Number:1


D:\packet_captures>”c:\Program Files\Wireshark\dumpcap” -b duration:14400 -b files:14 -f “host 10.32.1.234” -i 1 -P -w capture.pcap
Capturing on \Device\NPF_{1F70299B-0F5A-4F7D-BEC2-C7A36B7AC5A4}
File: capture_00001_20120808205029.pcap
Packets: 346

Complete Command Reference: http://www.wireshark.org/docs/man-pages/dumpcap.html

 

 

Wednesday
Aug012012

Alternative to Pardot Visitor ID

My company has been using Pardot’s free “Visitor ID” service for quite some time now. Our sales people really love getting an email each day showing them their Top 20 Visitors. The report was just the right amount of information and was very easy to understand.

But, all good things come to an end and recently Pardot has said: “VisitorID will reach end-of-life August 20, 2012. The application will remain available for as long as possible but will no longer be monitored or supported.” The service also broke my companies website for a couple hours the other day b/c the javascript file you have to include on your website was blocking for a very long time.

I was told this was too much effort for their engineers to maintain… but when asked if it would remain an option in their paid version the answer was yes.

So, i’ve been investigating an alternative. So far I’ve found a way to make Google Analytics mimic the output of Visitor ID. In short, you create a report on Service Providers. Then apply a filter… If you do something like contains “Universities” you’ll get a list of all the visitors that came froma University internet connection. I compared this to the data to what I received from Pardot and it’s identical.

The only difference is Pardot seems to automatically captitalize the names which looks prettier. So, “university of kansas” —> “University of Kansas”

I’m still experimenting with what I can do in google analytics and see if I can get an emailed report going daily. If you’re in the same spot as me and are looking for an alternative now, leave me a comment and i’ll make it a higher priority to post something sooner. Or if you know of another service that offers this please let me know.

Note: For the record, I would have been willing to pay a reasonable fee for VisitorID (~$20/mo). But, there is no such option. They completely did away with the free offering and their entry level marketing packages start at $1000/mo. Their packages do come with an additional other things for that price tag… but we’re just not looking for something that advanced right now.


UPDATE Aug 22


I found out how to get this data through Google Analytics. Here’s a usable query (the link will bring you to a query builder site which will let you customize the query to include your analytics account and modify the filters):

http://ga-dev-tools.appspot.com/explorer/?dimensions=ga%253AnetworkLocation&metrics=ga%253Avisits&filters=ga%253AnetworkLocation!~(cellco%257Cservice%2520provider%2520corporation%257Csprint%257Ccomcast%257Cat.t%257Ccharter%257Ct-mobile%257Ccox%2520comm%257Cmetropcs%257Cverizon%257Cnot%2520set%257Croad%2520runner)&sort=-ga%253Avisits&start-date=2012-08-08&end-date=2012-08-22&max-results=50

My plan is to invoke this query every night and programatically do something cool with the data like display it on a dashboard in our CRM. More on that later…

UPDATE AUG 27

Got a pretty sweet Google Analytics to SugarCRM integration working.

Update September 11, 2012

Just posted my solution on

Tuesday
May152012

Migrating SVN to Git... Standard github instructions result in no files?

When I followed the standard github instructions to migrate svn to git using “git-svn”.  When I tried:

$ git svn clone  SVN_REPO_URL LOCAL_DIR

I’d appear like it was checking out files… it’d chug away for about 1000 commits and then just stop with no error messages.  When i’d CD to my new git repo… there would be no files other then the .git database. 

I’m not sure why this was… perhaps it’s cause our SVN repos are really old.  I don’t really exactly know.  But, here’s the procedure that worked for us.  This guide was originally written for internal use so substitute “alertustech” for your username and “allert-eth” for your repo name.  One other note to point out is our repos didn’t have tags or branches that we cared about.  So, we omitted the -s or —stdlayout switches.

 

1) It’s assumed you already have local user configured, SSH keys generated and uploaded, etc.

2) Set up a local authors.txt file (in my case S:\GitRepos\authors.txt)

git config svn.authorsfile /S/GitRepos/authors.txt 
(NOTE: make this an absolute path, not a relative one)
Note2: If you get an error such as “could not lock config file /path/to/file/.gitconfig” alternatively you can append —authors-file=/path/to/file on the git svn fetch
mkdir allert-eth-tmp
cd allert-eth-tmp
git svn init SVN_REPO_URL —no-metadata (should be two — in front of no-metadata)
git svn fetch

At this point you should check your directory to see if files are there or not. If there are (other then the .git) proceed to the next section. In my case I found that the git fetch was timing out after about 1000 commits for some reason. I had a similar issue with svnsync it’s something apache related. So, what I had to do was do another fetch. But this time with the —revision=###:HEAD (where ### was the last commit processed in the previous command.
git svn fetch —revision=[NUM]:HEAD

After it completes again, check to see if files exist now by doing an ls. If they still don’t repeat the git fetch command this time incrementing the revision argument to the commit you got to this time around

now, according to this site, you have a working (local) git repo, but there’s still SVN cruft left (not sure exactly.) so you then do:


cd .. (in my case back to S:\GitRepos)
git clone allert-eth-tmp allert-eth (makes a new dir allert-eth automatically)
and now you are almost ready to push it to github but you’ll probably hit one more error, so let’s try:

cd allert-eth
git remote add origin git@github.com:alertustech/allert-eth-fw.git 
At this point I got an error: “fatal: remote origin already exists”. I found a marginally-helpful stackoverflow post from which I determined the proper sequence of commands to fix this, as follows

git remote rm origin
(now retry) git-remote add origin git@github.com:alertustech/allert-eth-fw.git (and you
should have no issues - the problem was that there was already a destination defined for “origin” and it was set to the local filesystem location of the repo, not sure how/why this came about, likely a consequence of git svn)

And finally, 

git push -u origin master 

I gather that “origin” and “master” are names for locations, or copies in this case - so what you’re doing here is calling “origin” the github copy, and “master” your existing copy, so pushing the master to the origin, and future clean checkouts will have the github copy as “origin”.  At this point all the info should show up on the github page and you can begin using the repo as normal.

 

Special thanks to Phil Anderson for writing up these instructions.

UPDATE: Those instructions are a little complicated… If you don’t have a big repo, you can probably get away with this:

$ mkdir PCB
$ git svn init https://SVN_URL_TO_THE_FOLDER_IMPORTING —no-metadata
$ git svn fetch —authors-file=/d/authors.txt
$ git remote add origin https://github.com/yourhandle/yourrepo.git
$ git push -u origin master
Thursday
Apr192012

"Throwing Down" at SugarCon

I was selected to “Throw Down” my Asterisk PBX #SugarCRM Connector at SugarCon in San Francisco next week.

Press Release: http://www.businesswire.com/news/home/20120418006844/en/Winners-App-Throwdown-Contest-Present-SugarCon-2012


Project on GitHub: http://www.github.com/blak3r/yaai

 

Tuesday
Mar202012

Enabling Spellcheck in SugarCRM's WYSIWYG Editor (TinyMCE)

Recently I started noticing a lot of spelling mistakes and typos in our KB Articles. To my surprise I found that the built in spellchecking support that nearly every modern browser has wasn’t working inside the WYSIWYG Editor (the editor used when composing emails/KB Articles). Here’s a guide on how I installed the spellchecker plugin for TinyMCE. It takes about 5 minutes to do. I did this with version 6.4.1 pro but should work in others.

  1. Download the spellchecker plugin from: http://www.tinymce.com/download/download.php (at time of writing it was v2.0.6)
  2. Extract the contents to  /sugarcrm/include/javascript/tiny_mce/plugins/spellchecker. Probably a good idea to backup the existing files first.
  3. Open /include/SugarTinyMCE.php and modify:
    // Put "spellchecker" in the buttons configs.  Note: putting it at the end of list didn't work on the email ui (no idea why/didn't care to find out why) so I put it before styleselect (and also added a seperator)
    var $buttonConfigs = array(
    	'default' => array(
    				'buttonConfig' => "code,help,separator,bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,
    									justifyfull,separator,forecolor,backcolor,separator,styleselect,formatselect,fontselect,fontsizeselect,", 
    				'buttonConfig2' => "cut,copy,paste,pastetext,pasteword,selectall,separator,search,replace,separator,bullist,numlist,separator,outdent,
    									indent,separator,ltr,rtl,separator,undo,redo,separator, link,unlink,anchor,image,separator,sub,sup,separator,charmap,
    									visualaid", 
    				'buttonConfig3' => "tablecontrols,separator,advhr,hr,removeformat,separator,insertdate,inserttime,separator,preview,spellchecker"),
    	'email_compose' => array(
    				'buttonConfig' => "code,help,separator,bold,italic,underline,strikethrough,separator,bullist,numlist,separator,justifyleft,justifycenter,justifyright,
    									justifyfull,separator,forecolor,backcolor,separator,spellchecker,seperator,styleselect,formatselect,fontselect,fontsizeselect", 
    				'buttonConfig2' => "", 
    				'buttonConfig3' => ""),
    	'email_compose_light' => array(
    				'buttonConfig' => "code,help,separator,bold,italic,underline,strikethrough,separator,bullist,numlist,separator,justifyleft,justifycenter,justifyright,
    									justifyfull,separator,forecolor,backcolor,separator,spellchecker,seperator,styleselect,formatselect,fontselect,fontsizeselect", 
    				'buttonConfig2' => "", 
    				'buttonConfig3' => ""),
    );
    // Add spellchecker to list of plugins
    var $pluginsConfig = array(
    	'email_compose_light' => 'insertdatetime,paste,directionality,safari,spellchecker',
    	'email_compose' => 'advhr,insertdatetime,table,preview,paste,searchreplace,directionality,fullpage,spellchecker',
    );	
    // Add spellchecker to list of plugins
    var $defaultConfig = array(
    		//... other elements of array not shown
    	'plugins' => 'advhr,insertdatetime,table,preview,paste,searchreplace,directionality,spellchecker',
    
  4. At this point, you should now see a spellcheck icon in your editor. If you click on it you will probably get a 403 error. I got around this by making a modification to the .htaccess file in the root of my sugarcrm folder. You must allow access to: /include/javascript/tiny_mce/plugins/spellchecker/rpc.php
    # Replace the line below...
    RedirectMatch 403 /+(soap|cache|xtemplate|data|examples|include|log4php|metadata|modules)/+.*\.(php|tpl)
    # With this version:
    RedirectMatch 403 /+(soap|cache|xtemplate|data|examples|include|log4php|metadata|modules)/+((?!rpc).)*\.(php|tpl)
    
    If you don’t have this file or use IIS, I’m not sure what the equivalent method for restricting access is.

Here’s the result:

Unfortunately, you do have to press the spellcheck button.  You don’t get automatic red highlighting like you do in wordprocessors or gmail :/

Please note that this change is NOT UPGRADE SAFE so you may have to redo these changes after you upgrade. I just now noticed that there appears to be a way to make it upgrade safe by adding files to ‘custom/include/tinyButtonConfig.php’ and ‘custom/include/tinyMCEDefaultConfig.php’; If you try it out and it works, please add a comment.

UPDATE: Revised code 3/21/2012: Original post didn’t add the buttons to Email UI.