I have to admit, this title seems a little weird. How can I change some behaviour in a module without changing the code? And why do I want to change this behaviour?
Let me start with the why. I am using a lot of box modules, but sometimes there are some pieces missing, or am I not happy with some default behaviour. Many modules are very adaptable, for example using configuration settings or some interceptors. But sometimes this is not enough.
In a Free and Open Source Software world we just clone a repo, modify some code and send some pull request the the authors. But what if they don’t want your changes? I could fork the project, and create my own module, but from this moment on I am the maintainer of my own module. And sometimes other modules are depending on the module I want to fork, which is often not what I want. But there are other ways to change a module, and they work best for smaller changes. Let me explain.
Category: Coldbox (Page 1 of 3)
In my previous post on logging database changes with Logbox I wanted to show how to log database changes with interceptors in a cborm
system. This should be quite simular to the quick
example from the previous post. It just needs an extra step, you have to configure this in Application.cfc:
//configure this mapping here, your ormSetting need it
this.mappings[ "/cborm" ] = COLDBOX_APP_ROOT_PATH & "/modules/cborm";
this.ormSettings = {
// ...... (other orm settings)
// Enable event handling
eventhandling = true,
// Set the event handler to use, which will be inside our application.
eventhandler = "cborm.models.EventHandler"
};
The cborm.models.EventHandler
will act as a bridge between the coldfusion ORM event handling and the interceptor system in coldbox. Orm settings are configured in Application.cfc even before coldbox is loaded. I’ve been using this for many years in older application and it always worked like a charm. For my series of blogposts on Logbox I created up a new coldbox application, configured the ORM settings as I have done for many years, and fired up some recent Lucee version. It failed.
Recently I was working on a project where we wanted to reuse our code for multiple customers. The only difference: they all have their own database where their data was stored. We can do this in two different ways
- deploy a new application for every customer. For a smal amount of customers that might be acceptable.
- Based on the url we can detect which datasource we need for a customer. If we would be using the same url for all customers, we can have some central database which keeps all kind of information including datasource name for each individual customer. We could store the datasource name in a private request collection variable called mainDatasource (or put it in some user specific cache or session variable), so each customer has his own datasource.
Since our project was existing code, I have a few hundred references to <cfquery>
and queryExecute
and many queryBuilder (qb) calls for newer code.
Interceptors in coldbox are very powerful. They are components which listen to events which are announced by the core framework or modules or custom events created by your application. But this post is not about all details of creating interceptors, you can read all about it in the coldbox documentation. I am using them all the time since they are so powerful, but sometimes they don’t behave as expected, especially when your interceptor depends on other modules.
Ahh yes, the good ol chicken and the egg problem
Luis Majano
So, what’s the problem with this chicken and her egg? Actually there are two related problems. One of them is easy to solve, the other takes some more effort.
Continue readingI often post about problematic stuff, like bugs, incomplete documentation or other annoyances. This post is different, and not even very detailed. We are talking about scheduling tasks. Luis Majano recently described the coldbox 6.4.0 release, which is mainly about scheduling. There is extensive documentation but scheduling is now so easy to code, I just wanted to share some examples with you. Coldbox 6.4 was only released a few weeks ago, but I think is is so extremely useful, we already implemented it in several projects. Ok, there was one bug which I will share with you, but that will be fixed soon, and is easy to avoid.
Continue readingYes, if you ever read my twitter profile, I am a bit old fashioned. I started writing CFML when it was still called DBML loooooong ago. Javascript was still simple, and javascript frameworks were eh… nonexisting? So don’t expect me to explain you everything about closures and lambda expressions. But they are not the same in CFML, that’s what I found out today. The hard way.
Continue readingColdbox had a base handler and response for RESTful services for many years. Initially this was added in application templates but in version 6 this functionality was added to the core. The base handler wraps around your own actions and provides a lot of automatic errorhandling, addition of some development headers and some global headers. By using the default event.getResponse() response (available as prc.response in previous versions) it provides a default response format which looks like this:
{
"data": {
"name": "someData"
"id": "98765",
"name": "provMan"
},
"error": false,
"pagination": {
"totalPages": 1,
"maxRows": 0,
"offset": 0,
"page": 1,
"totalRecords": 0
},
"messages": []
}
That’s a lot of different keys for a default response format. The data
field makes sense most of the time, and the pagination
key (which is new in cb6) can be handy but we don’t use it (yet). The error
and messages
keys are less useful to us. Let me explain why first, and then I will explain how to modify your responses in coldbox 6.
This week I created my first official forgebox package: cbi18n-json-resources , a cbi18n JSON ResourceService. This module tries to improve the cbi18n
Ortus module by offering
- json resource files instead of java resources
- locales organized by directory instead of partial filenames
- optional default resource file(s)
- hierarchical resources, so both en_GB and en_US can be handled by the same resource file, except for the different country-specific translations
- and an interceptor for missing translations
So why this module instead of improving the cbi18n module itself?
Continue readingIn this post I will show you how coldbox can help you creating resourceful routes, how cbswagger shows me that I don’t want the defaults resource()
routing method, and how easy it is to create your own method!
If you want to create a REST API in coldbox, you often need to create a lot of routes for this API. So let’s say you want to create endpoints to list, view, update, create and delete a User resource. Following the coldbox manual, I need to implement the following routes:
Continue readingOften when we deploy a coldbox website we fire up commandbox, create a webserver and put NGINX in front to route our application requests to the correct lucee instance. We never experienced any problems when configuring search engine safe (SES) url’s. Just to remind you: instead of writing this
https://mysite.nl/index.cfm?event=myhandler.myaction
we can rewrite this to something more friendly such as
https://mysite4u.nl/myhandler/myaction
So we proxy our request via Nginx to a lucee coldbox application and use some rewrite rules as described in the coldbox manual. Recently we had a slightly different configuration: apache in front of an old-fashioned standard lucee standard install on Linux. Again, we followed instructions in the same coldbox manual but NO success…
Continue reading
Recent Comments