• Online Demo
  • 30-day Free Trial

We’ve shown you a fair amount of the staff interface, but I want to show you the staff login page today. Overall this video touches on three things..

  1. Staff Login Page: This is a first, no one outside our team has seen this login page before now.
  2. Two-Factor Authentication: This was originally developed for v3, then back-ported to 2.5.
  3. Resource Preservation: Session expire? Blesta remembers where you were headed.

The staff login page has previously never been shown, although I designed it before much of the interface. Two-Factor Authentication was originally developed early on for v3, and then back-ported to 2.5. As far as we know, no one else supports two-factor authentication, making Blesta uniquely secure. We don’t blame them though, it took plenty of R&D and most solutions are proprietary. Resource preservation is just a fancy term we coined to say that Blesta remembers where you were going, and takes you back there if your session expires and you get logged out and login again.

The video is below, as usual you can make the video full screen, and be sure to turn on your sound.

Note: Cody tells me, and I realized after that OATH is pronounced “oath”, not “oh-auth”, which is something completely different.

 

Tags: | | | | | | |

So, let’s keep it real. I didn’t have the time to make a video this week. I’ve been doing a lot of graphic design work on Blesta, some awesome stuff you’ll get to see soon. But that doesn’t mean I can’t share something, right?

Plugins. Are. Amazing. Plugins can do a lot, we’ve talked about them before in passing while describing other features. Plugins can register widgets on the Dashboard, on the Billing Overview, on the Client Profile. Plugins can create entirely new pages, with new functionality, with their own nav links. Plugins can register themselves into the ACL. Plugins can create their own email templates. Plugins are mini-applications. Plugins are POWERFUL.

I know people are going to shock us with what they develop for Blesta using the plugin system. I can’t wait to be blown away.

This post is the tip of the tip of the iceburg, we will have a lot more to say about plugins as we get closer to release.

Oh yeah, plugins can be installed, and uninstalled, upgraded and managed. Here’s what the installed plugins window looks like. These are all plugins that will come pre-installed with Blesta (there will be more too, don’t worry). These ones create widgets on the Dashboard.. and since we wrote them, they got slapped with the Blesta logo. Slap your logo on your own plugin!

 

Maybe a video next week? We’ll see!

Tags: | | |

I hope you’ve had a chance to check out the Blesta Translator that I posted about and that we released last week. The previous week Cody posted a developer commentary video on our RESTful API that you may want to check out as well.

This week’s video is about themes. We mentioned themes briefly a while back, but here it is in action. You can do the following with themes:

  1. Select from different color themes that are included with Blesta.
  2. Create and save your own color themes, and fine tune colors to match your brand.
  3. Use your own logo, rather than the Blesta logo.

In the future we may add additional options that affect the direction and style of gradients, add additional options, and provide a way to share themes.

The video is below, as usual you can make the video full screen, and be sure to turn on your sound.

 

Tags: | |

 

Blesta is in use in well more than 50 countries, and our friends abroad speak many different and wonderful languages. Blesta has always supported multi-language and some of our users have made their translations available to the community, but it has only ever shipped with English support and translations have been spotty at best. That’s all about to change.

Today we announce the availability of Blesta Translator, a collaborative, community driven effort to provide full, accurate, and up to date translations in as many languages as possible.

The success of this project depends on you. If you are fluent in another language and would like to contribute to the translation of Blesta into your language all you need to do is sign up and start. Contribute as little or as much as you like as often as you like. New and updated language will be added to the translator in advance of software releases and it’s our hope that the new language will be translated in advance of and ship with official releases.

While this is still a beta version, we will be adding a few new features in the coming weeks. Ultimately a daily snapshot of translations will be available for download. We realize this is a continual effort and nobody should have to wait for the next Blesta release to take advantage of the latest translations. Partial translations will fallback to English. Additional stats, graphs, and context for translations will come as well.

So, what are you waiting for? Head on over to translate.blesta.com and get started! You’ll be translating version 3.0.0_dev. While it’s not complete, now’s a good time to get a head start! Contributors are given credit for their efforts.

And, of course, if you have a suggestion to make this tool better please let us know.

Here are the languages currently available for translation:

  1. العربية, SA (ar_sa)
  2. Deutsch, DE (de_de)
  3. Ελληνικά, GR (el_gr)
  4. English, UK (en_uk)
  5. Español, ES (es_es)
  6. français, FR (fr_fr)
  7. עברית, IL (he_il)
  8. italiano, IT (it_it)
  9. 日本語, JP (ja_jp)
  10. polski, PL (pl_pl)
  11. português, PT (pt_pt)
  12. Română, RO (ro_ro)
  13. svenska, SE (sv_se)
  14. 中文, CN (zh_cn)

Tags: | | | |

In this developer commentary, I give a behind the scenes look at the API in version 3.

What we’ve done is create a controller to make available all of the various models in a RESTful manner, using the four primary HTTP verbs (GET, POST, PUT, DELETE). All this controller needs to do is handle parameter passing and output formatting, which we’ve done here in just 342 lines. Available output formats are JSON, XML, and PHP serialization, but more may be added in the future.

The API supports an unlimited number of users, so you can delegate users for specific tasks. In addition, the API may be extended by plugins. The format for those requests is /api/pluginName.modelName/method.format.

Currently the API supports HTTP Basic authentication, but we’re looking to add Digest authentication in the future as well. In addition, we’ve added command line interface (CLI) support which is bound to make API development easier for you programmers out there.

Click the icon in the bottom right of the video player to go full screen.

 

Tags: | | | | | |

It’s the end of the year and I can hardly believe it. I hope everyone had a nice Christmas, and has a nice New Years!

This weeks video is about emails, largely email templates and here are some of the highlights:

  1. Email Signatures are new to v3, and were highly requested.
  2. Tons of data available to templates besides just strings, such as objects, and arrays.
  3. Conditionals, loops, and filters are now supported for powerful template control.
  4. Improved layout and usability overall.

Here are some examples of conditionals, loops, and filters.

Conditionals

{% if id > 3 %}
    This will print out if $id is > 3
{% endif %}

Loops

{% for user in users %}
    Name: {user.first_name} {user.last_name}
{% endfor %}
 
This Assumes:
 
$users = array(
    array(
         'first_name'=>"First name",
         'last_name'=>"Last name"
    ),
    array(
         'first_name'=>"First name 2",
         'last_name'=>"Last name 2"
    )
);

Loops can also take advantage of limits. This would only cycle through the loop 1 time:

{% for user in users limit:1 %}

Filters

{past_due | default 'Not past due'} // Produces "Not past due" if past_due is false

Multiple filters can be applied in succession:

{past_due | default 'not past due' | capitalize} // Produces NOT PAST DUE if past_due is false

You get the idea, a lot can be done with templates and all of this and more will be in the documentation.

The video is below, as usual you can make the video full screen, and be sure to turn on your sound. Alright — as we head out for the weekend, see you next year! It’s going to be a good one!

 

We take backups seriously and always tell people to back things up before performing an upgrade. An upgrade issue is rare, but backing up your data should be standard practice for any software upgrade. Regular automatic backups are important too — critical, if you ask me.

The current release supports automatic backups but we wanted to take things a little further in v3.. so, we’ve replaced normal FTP backups with SFTP backups and added Amazon S3. That’s two available backup methods. Both are secure.

Additionally, On Demand backups now have two options: Force Offsite Backup & Download Backup

This is particularly useful when you’re about to perform an upgrade or do system maintenance and want a fresh backup before you do so. Clicking “Force Offsite Backup” will send a backup to your Amazon S3 bucket, or SFTP server, or both, right away.

When configuring your backup method, it’s super easy to test your settings.

In this case, we have backups going to our Amazon S3 bucket, which you can see below.

This is just the beginning. We have plans to add additional backup methods and more in a future post-3.0 release. In v3, you can rest assured that your data is being backed up securely, and regularly, offsite.. well, as long as you configure it first!

Tags: | | | | |

This weeks post is a video I was planning to make a while ago, and had mentioned it in passing in a previous post on system requirements. The first video I ever posted about v3 showcased manual invoice creation. This video revisits manual invoice creation and shows off two features that the first video did not adequately cover: Auto-Save and fractional quantities (for manual invoices).

When you go to create a new invoice, auto-save works by saving your work automatically every now and then. If your browser crashes, or you accidentally navigate away from the page, just revisit the client profile and click “Drafts” in the Invoices box to continue. When you’re all done, just hit “Create” to create and deliver the invoice. If you aren’t done you can still use “Save as Draft” and finish it later.

One issue affecting a lot of people is that they have to do math for services. If you charge $75/hr and spent 55 minutes, that line item should be $68.75. In v3, you can use the quantity box and let Blesta do all the math for you. Just enter a quantity of 55/60 (gotta love fractions) and the hourly rate and you’re done. You can put your calculator away and save a lot of time.

As you can tell, we put a lot of work into the user experience. Nothing sucks more than spending time building an invoice, only to lose it all.. or having to bust out your calculator for a stack of line items.

 

Tags: | | | |

I’ve got another video for you this week. I’ve been meaning to get something out every week, but it’s been tough. Time flies, we all get drawn into the excitement of v3 development, and I let things slide a little bit. I’m trying to reel things back in and be more regular in my posts. Let’s see how it goes.

This week I decided to make a video on Client Groups. It’s not what I was planning to do, and at first glance it seems kind of boring, but it’s not and I’ll tell you why.

Client Groups have settings, and here are a few things you’ll be able to do.

  1. Invoice different groups at different times. Bill some 10 days in advance, others 5, for example.
  2. Charge different groups at different times. Charge some on the day their invoice is due, charge others earlier.
  3. Send payment reminders and late notices at different times for different groups.

But the really powerful thing about these settings is that they are inherited from a higher level, if they aren’t specified. By default, new groups will inherit these settings and can be specified if they should be different. Since a vast pool of options exist at a higher level, they can eventually be specified at the group level. We have only specified 3 relevant groups of settings because we believe in simplicity… but it’s only the tip of the iceberg in terms of what is possible.

I’ve said enough! Video below, there’s sound and you can make the video go full screen if you want. There might be a bit of echo in the audio, my apologies. It’s because I recorded it from my home office last night rather than at work. Not sure I’ll do that again, hardwood floors don’t exactly create the best acoustics.

 

Tags: | | |

I was working on a couple ideas for a new video this week. One involved touching on a feature that we’ve previously touched on, that would show off some more advanced functionality. The other is a new feature that we haven’t shown yet, but we’re working on making a couple changes to the way it looks so I thought it better to wait.

Then, of course there is a huge new feature that I’m anxious to share.. but I can’t, just yet. Actually there are several, but one really big one that’s sure to cause some stir. Some good stir.. and it’s been in the works for a really long time.

Still, I wanted to post something.. so here are the system requirements for v3, and a question for you.

Minimum Requirements

  1. PHP version 5.1.3
  2. PDO, pdo_mysql, curl (version 7.10.5), and openssl (version 0.9.6) PHP extensions
  3. MySQL version 4.1
  4. Apache, IIS, or LiteSpeed Web Server
  5. ionCube PHP loader

Recommended Requirements

  1. PHP version 5.2 or later
  2. PDO, pdo_mysql, curl (version 7.10.5 or later), openssl (version 0.9.6 or later), ldap, mcrypt, gmp, json, imap, libxml, and simplexml PHP extensions
  3. MySQL version 5.0 or later
  4. Apache, IIS, or LiteSpeed Web Server
  5. ionCube PHP loader
  6. memory_limit set to 32 MB or greater

You’ll notice the only loader listed is ionCube, and that brings me to the question. Do you have need for a Source Guardian version? Do you prefer it over ionCube?

The vast majority of installations are using ionCube, and most servers that would have Source Guardian have ionCube too. If there are those that really need a Source Guardian encoded version, we could continue to make those builds, but prefer to drop it in favor of streamlining our build process and simplifying downloads. A common question we get is, “Which version do I need?”. Since I don’t need to use my toes to count the number of files we’ll actually be encoding for v3, our build process should be much simpler.. even better if we can just stick to ionCube.

If you have an opinion, please email me, paul [at] blesta. com

The goal is for another video next week and I’m trying to convince Cody to do more developer commentary. Maybe he can touch on the Plugin system, it’s incredible.

Ok, back to work. Thanks for being awesome.

Tags: |

Last week I posted about Payment Accounts in version 3. This week I wanted to show you how those work when the rubber meets the road in the Staff interface. Perhaps the best new feature for Payments in version 3 is the ability to void and refund transactions in real-time when supported by the gateway.

This video focuses on..

  1. Make Payment (Processing and voiding or refunding a credit card or ACH transaction)
  2. Record Payment (Processing and voiding a manual payment, such as a check payment)

Payments in this version are more robust than previous versions. There’s a lot more you can do without leaving the screen, yet it’s remarkably simple and straight forward. I recommend taking the video full-screen, and be sure to turn your sound on.

 

Tags: | | | | | |

Payment Accounts are brand new way to manage payment details in Blesta v3. In previous versions you had to create a contact for each and every credit card you added to the client. All of that has been done away with. Payment Accounts are independent from contacts and you can have as many as you want. In addition, Payment Accounts introduce 2 big new features in this version.

  1. ACH Transactions
  2. Offsite ACH & Credit Card Transactions

In this video, I’ll give you a preview of Payment Accounts and show you how they work. I recommend taking the video full-screen, and be sure to turn your sound on.

 

Tags: | | | |

There are two prevailing factors that determine how well a software product can adapt, improve, and be extended without imploding in on itself. They are:

  1. Coupling, and
  2. Cohesion

Coupling represents how dependent a given module is on other modules within the system (I use the term “module” in this article in an abstract sense to describe an object or set of objects that are designed to accomplish some task). A loosely coupled module doesn’t rely or expose much of its inner workings to other modules. Conversely, a tightly coupled module relies heavily on other modules and may expose portions of its inner workings so that other modules may interact with it.

Version 3 of Blesta is built on top of an MVC (Model-View-Controller) framework, which, as the name suggests, separates control into three distinct areas. Building off of an MVC framework (in our case, minPHP) gives us the discipline needed to maintain a loosely coupled system. But it’s not without its challenges. For example, as I’ve mentioned in a previous article explaining data validation, error handling can be handled in a number of ways, but the best way is this through message passing. This allows the errors of a model to be accessed and interpreted without the controller having any direct knowledge of the model or how it works, and vice versa, thus maintaining a loosely coupled relationship.

Cohesion relates to how well the various functional elements of a module are related. High cohesion requires that the module be, in a sense, single-minded. In other words, a class may have high cohesion if all of its methods are closely related. Low cohesion means that a module attempts to accomplish too many tasks, or relates to multiple distinct sets of data.

When designing a modular system, we strive for high cohesion because it improves readability and comprehension of a particular module. If a module attempts too much it becomes bloated, disorganized, and difficult to maintain.

This works hand in hand with coupling. As each module becomes more refined it generally becomes more independent, or loosely coupled. A perfect example of this is the payment gateway system in version 3, which consists of four merchant gateway interfaces (Credit Card, ACH, off-site Credit Card, and off-site ACH). Each interface is designed to accomplish a distinct set of actions (high cohesion), and each payment gateway is thereby only associated with the rest of the system through the implemented interfaces (low coupling). This allows us to create a wide variety of payment gateways that can process credit cards only, or ACH payments only, or any other combination of interfaces without requiring any changes to any other parts of the system.

Tags: | | | | |

ACLs (Access Control Lists) allow refined control over resources in Blesta v3. There are a few notable differences in the way ACLs are implemented in Blesta vs other applications.

  1. Plugins can easily register resources into the permission system to be controlled within the Staff Groups settings page for seamless integration.
  2. The permission system automatically ties into the primary and secondary navigation elements, so even custom controllers can take advantage of the ACL.
  3. The ACL library can be invoked directly for even more refined control. You can design your own hierarchy of permissions and explicitly deny or allow any resource.

In this video, I touch on some of the basics. The ACL currently has 87 resources, but we’ll likely have over 100 in the initial release for the core. The Order and Support plugins will add to that.

 

Tags: | | | | |

i18n, or internationalization, is the process of adapting software to be deployed around the world. Since version 1.0 we’ve dedicated a large portion of our time to making Blesta an international product. And in version 3 we’ve gone even further by enhancing our multi-language support.

To start, you’ll notice language definitions are now diffused across multiple files. This serves two purposes. First, it promotes congruency between objects and their associated language (each Controller and Model has its own language file). Secondly, it allows us to load only content that is relative to the resource being requested. This saves memory, speeds up load times, and makes development much easier.

Syntax support has also been greatly improved. Previous versions supported tag replacement, but many phrases and sentences were graphed or concatenated together. This meant that some translations were left with incorrect syntax or awkward phrasing. We were able to do away with that thanks to minPHP’s Language support.

Here’s an example, flashing a success message after having saved a staff group:

// Success
$this->flashMessage("message", Language::_("AdminSystemStaff.!success.group_updated", true, $this->post['name']));
$this->redirect($this->base_uri . "settings/system/staff/groups/");

Here’s the related language definition:

$lang['AdminSystemStaff.!success.group_updated'] = "The staff group, %1\$s, has been successfully updated!";

And the visual result:

In addition, version 3 offers automatic fall-back language support in the case of missing definitions.

And finally, we’re introducing translation support for modules, gateways, plugins, and widgets. Everything is translatable. Let’s see how long it takes the competition to catch on.

Tags: | | | |