
Implementor
Palante Technology Cooperative
Palante Tech works with social justice organizations on a tight budget to be more effective through technology. CiviCRM allows us to provide a high-quality low-cost database for community organizing, donor and membership management.


Implementor, Developer, Administrator
Blackfly Solutions
We recommend and use CiviCRM with most of our clients, and have since 2005. It's got a fantastic collection of functionality that fits the needs of non-profit organization communications, and the CiviCRM community of developers and users is growing, broad, vibrant and responsive.
The best part? When I describe to potential new converts how all of their constituent relations (donations, membership, mass emails, etc.) can be managed with a single integrated, configurable tool, I can hear an incredible yearning at the other end of the phone.

Implementor, Developer
Unitarian Universalist Church of Lancaster
Contact management, email marketing/management and web site integration.

End-user, Administrator, Implementor
ZING
We feel there are too many obstacles facing not-for-profits (NFPs) considering commercial CRM offerings, including many of those that are charity oriented. From licensing models which restrict the fluid expansion of an organisation's user base (why should you be punished with higher costs for being successful?), to support from commercial companies being inherently tied to one supplier; a NFP would benefit from the option to 'shop around' for those most appropriate, e.g. based on: proximity and availability on-site, cost, experience, value added services... They also often lack the capacity for charity relevant workflows, necessitating either customisations, complicated and inefficient workarounds or an en-masse call for new functionality, as individual charities do not appear to carry the weight required to influence subtle NFP-only changes to market leading software, without large expense.
On the flip side, CiviCRM is completely free and open-source, carrying with it a friendly, hard-working and enthusiastic community of developers and implementers, constantly listening to the users' needs and sculpting future releases to the requirements of NFP organisations. This is exciting!


Developer
Donor Depot
CiviCRM community is a very dedicated group of professionals who deeply care about causes that care about the causes of charitable organizations.

Developer, Implementor, Trainer
Emphanos
The community around CiviCRM is both welcoming and vibrant. CiviCRM as a software solution is a powerful and flexible data management solution for a vast array of nonprofit organizations ranging from the startup NGO to the established multi-million dollar foundation. In our daily work we are seeing more and more NPOs moving away from proprietary systems and single vendor SaaS solutions and embracing the open source community around CiviCRM. Organizations using CiviCRM love the extensibility and the freedoms that come with open source, freedom to choose hosting, freedom to choose project partners, and the freedom to re-use, re-purpose and re-deploy without paying extra.

Implementor
ISHR
ISHR is currently in the early stages of implementing CiviCRM, and is finding the customisable aspects of the software to be especially beneficial.


Implementator, Developer


DEVELOPER AND IMPLEMENTER


Implementor, Administrator, Trainer, Architect

Developer and Implementor
Tech to the People
Over the past 15 years I've been involved in several open source communities.
CiviCRM is without any doubt the one that has the strongest focus in welcoming "newbies" and letting everyone feel at home here. Another impressive feature is the focus on shipping. No matter what you think of CiviCRM today, you are almost sure that there will be a newer and better version in a few months.


Consultant, Implementor and End-user
Circle Interactive
We help many not for profits implement CiviCRM through consultancy, training, configuration and custom development. Many of them come from a painful world of old Access databases, multiple spreadsheets and even paper. It's really satisfying to
help people move on with a system that's so much in tune with their own ethics of sharing and collaboration. We also 'eat our own dog food' and use Civi in-house for our client records because we love the flexibility and control it gives us.
For us it's important to share code and advice with other members of the community when we can because we know we get it back in help at other times. The community really is awesome and one of the friendliest and undaunting I've come across. We appreciate the huge value of the software to us and our clients so we try to contribute back and make it even better.


Comments
Sounds promising!
Hi Roberto
I don't know a great deal about Doctrine specifically, but the model set out in your previous post sounds interesting and based on current development patterns would seem to be the direction to go - the challenge being the amount of accumulated knowledge of the core developers and the impact this would have for them.
For us, having an API compatible with the current one will certainly be an issue due to the number of systems we have that use it.
Thanks for all this effort and for sharing your thinking and development code!
I look forward to hearing Dave, Lobo, Kurund & team's thoughts on the code and Doctrine.
Andrew
What is the big selling point compared to Pear, BAO, DAO ?
Hi,
Could you compare it more with the existing architecture and show what Doctrine makes easier/quicker...
Have you compared it with the model in django ? My experience is that for basic crud and 1->n or n->n relationship it works well, for more complex ones, the abstraction layer is too stupid to handle it and is almost always more painful to work around that going sql all the way.
(might be because I'm more confortable with SQL than ORM X, but that's safe to assume that's the majority ;)
X+
Keeping it Simple
X+,
I understand your point of view. Indeed, many are very comfortable with SQL over a particular ORM. But, the question is, how many people are comfortable with your SQL? For supporting the whole community there is greater need for, and certainty in, convention even if in some cases it causes you to learn a bit more about using an ORM instead of quickly hacking out some SQL.
That said, Doctrine is one of the better ActiveRecord implementations. We have already applied the auto-merge functionality we built (available in the civiBASE repo) to de-dupe a large data set. To wit, at first Jesse was a little frustrated because of performance issues (i.e. it seemed like Doctrine was too dumb). Here was that moment when the gut instinct would be to write some SQL. But, it turns out that the default object retrieval behavior was not appropriate for us. By asking Doctrine to do a shallow retrieve we accomplished our task with one additional line of code and with no SQL.
Still, there are times when you will need to break out the mystical powers of SQL Fu. The architecture of Doctrine realizes that there are cases where we will need to assist the ORM to get things done effectively. Hence the ObjectTable class. This is where those types of optimizations are captured. But, using that approach requires you to use conventions for embedding your SQL. The end result, is keeping SQL very near the data store layer and out of all other business logic and application code. And, more importantly, providing some boundaries to promote reuse (i.e. your CRUD optimization becomes available for all to reuse). Lastly, there is the Doctrine Query Language which is very powerful and geared to the type of specialized CRUD which commonly pop up.
In terms of comparisons. Well django is a python thing and is a good framework. I have only had chance to do an architectural and partial code review of the framework but not actually used it for anything meaningful. I am not sure if I am in any position to really do a good compare/contrast.
But DAO/BAO is different and it is a great suggestion that a comparison be provided. I will follow up with another blog entry on common operations in Doctrine versus DAO/BAO. That should be helpful to many I believe. But, there are two other important features to focus on in Doctrine: Migrations and Fixtures. These are not available in DAO/BAO. Perhaps that is another blog post on its own. With the recent talk of better testing and upgrading this would be useful to chat about.
ra+
DAO/BAO did have its advantages
Lobo et al gave a lot of thought to the XML data definition stuff, and on the whole, they did a good job with it. Once you grok how the xml/ directory works, it's not too hard to add additional tables, and it becomes easier to automate things like upgrades and schema changes.
In the 1.x data model, if you wanted something to scale well, using the XML data definitions and writing BAO classes was a better way to do things than custom data was. Now custom data scales better than it used to. But for multiple deployment purposes (and for sharing applications with the community), I'd guess that xml/BAO would still be better than custom data.
Any data abstraction layer needs to be:
1) Fast
2) Scale well
3) Lead to code a human can understand.
4) Lead to code that MySQL (at least) can generate efficient queries for.
Some ways of modifying an object may be prettier or more elegant or even cooler than what we have, but if they don't do the four things above well, it's not worth churning the code base to go to them.
What problems is your architecture trying to solve?
Having spent a lot of time deep in the guts of the CiviCRM code base, I'm a little skeptical with the direction you're going with this.
I'm not a fan of QuickForms either, especially since it tucks so much data into $_SESSIONS that it's nigh impossible to figure out what it's doing. Debugging is particularly difficult.
But my own sense is that you're concentrating your effort in the wrong place. The major problems doing CiviCRM development have tended to be:
1. The complexity of the class hierarchy. It takes a long time to understand how dispatch works, or to understand how the query generator works.
2. The interdependence of different parts of the the library. I have yet to do a non-trivial project that didn't require hitting 20 or more core files to integrate new functionality. In comparison: on Drupal projects, I haven't needed to modify Drupal core in years.
3. There still isn't a good packaging model for new functionality, although I understand a bit of work was done for 2.0. Adding UI generally means dropping multiple files in multiple directories. There isn't a simple way for a chunk of code to integrate itself into CiviCRM screens. And while custom fields are much better than they were in 1.x, it's still hard to manage a separate table (although the XML data defs could become this).
4. Scaling is hard. This is where I'm most skeptical, because it isn't clear to me that a Ruby-like approach would be an improvement. Reading your last diary, I'm in general agreement with Joe Murray: pushing some core functionality into the database itself would make it much easier to do bulk operations, and it would likely also make the PHP code easier to understand. I built a large library of SQL and perl code to do bulk operations in 1.x, because it was orders of magnitude faster to do these things outside of CiviCRM in PHP than I could do independently. But that's a lot of effort, and since what I do is fairly specialized, it's not the sort of thing I can put up on a server and say "have at" for people with similar problems. And if we pushed certain core operations (add a contact record, delete a contact record) and had a good set of hooks, we'd have both good speed as well as much simpler client code as well.
If given a single choice, I'd say that packaging is the highest priority, since it would all people to do non-trivial projects that were easier to port between versions of CiviCRM, and would decrease the need some of us have had to fork the CiviCRM tree in order to track and maintain the modifications we've made in a particular version.
A few random thoughts and comments ...
first of all kudos to raSantiago and folks for stepping up and doing some due diligence, work and prototyping. I think it helps to keep the team thinking about potential new technologies that we can adopt in the future.
I think the debate about ORM vs SQL has been in existence since the days of ORM. I also think DB_DO has some fairly primitive ORM capabilities (which we have not exploited as much). So moving to a better full fledged ORM is definitely an option.
Both Matt and Rob make some good points that should be noted and addressed. The ORM layer is one part of the puzzle, i'm a lot more interested in seeing how all the pieces fit and play together. So am looking forward to the blog posts and code to come.
Would be great to continue with the dedupe example to basically rebuild the dedupe system in civicrm and show some of the pros/cons of the new system, couple of thoughts:
Step 1: Merge two contacts (already implemented)
Step 2: User interface to merge two contacts (with user options to select which parts to merge and skip)
Step 3: API for the above merge process
Step 4: Dedupe rules and applying these rules to find merge candidates etc (this gets into both complex queries and relatively complex UI). i.e. the same functinality that CiviCRM 2.2 exposes today. Step 5: An API for the above
lobo
Using Doctrine/civiBASE
Things have gone quiet on this front lately, but it seemed like a really useful direction to be exploring. Is civiBASE still alive? The git repo seems to no longer be available.
It sounds like some really valuable work has been done here and we'd be keen to check it out as we are working with Doctrine too at present.
Andrew
Community Builders Australia
Update on the discussion
http://civicrm.org/blogs/xavier/database-layer-evaluation