A few weeks ago we've released our first public open-source version of Campaignion. It's a tool that helps non-profits and NGOs with online campaigning, fundraising and digital marketing. In this blopgost we'll explain some of the technical background and how it works.
As the title suggests we have Drupal hosted behind a reverse proxy. Usually this doesn't matter a lot, but there are few things like IP-blocking or oauth that need to know some data about original request. Namely that's: The client-IP, whether the request was issued via HTTPS and the server port. Here is how to achieve that.
Here at more onion we're hosting most of our client's sites ourselves. This means we are hosting lots of sites which share most of their modules (ie. our standard Drupal installation). Reproducible setups, fast builds, sharing-module code among many sites -- This is where our new build-tool called dbuild.py comes in.
It started out as yet another wrapper around
drush site-installbut became a fully fledged download-extract-patch-symlink tool in the end.
There are times when you want to display parts of an entity to the user, pariticularily a specific list of fields that are attached (bundled) to that entity. Core doesn't offer functionality for this so I'll show you a simple function for extracting the form array structure for a selectable list of fields of an entity.
During development of the pgbar module I often ran into Notices for something in
$items. This time I said to myself: Let's get this straight once and for all. So I've inserted some debug code into my module to track which field related hook can manipulate data and in which order they are called. You can see the result in the dot-graph at the bottom.
Replacing checkboxes with itoggles is a usability improvement and makes Drupal administration more mobile friendly. After a lot of work we've managed to get it working and here is how...
I've created a sandbox on drupal.org where you can get the D7 port of webform_confirm_email.
I had the problem that on a site with 2 forms the ordering wasn't what I want it to be. It took me a bit of searching to find the solution using the '#weight' property for a whole form.
So there was a DrupalCon in Munich and we were there! Many people, much information and a lot of excitement for Drupal 8! One of the best sessions I attended was by Suzanne Kennedy (aka pixelite) about "Multilingual Content in Drupal 7 & 8".
I always had trouble which translation type to choose, because I didn't get the difference between all those field translation, entity translation, i18something,... modules. Well, pixelite cleared it up for me!
Here is how to decide between Node level and Field level Translation.
One of the most complicated user interfaces in CRM systems is frequently the profiling interface. You want to sort your contacts, filter them and literally create formulas of filters that you can save.
In this blogpost I'll introduce a rough concept we've been working on. Hopefully we'll be able to implement it as part of Redhen CRM some time soon.