
Implementor
Ginkgo Street Labs
CiviCRM enables me to empower my clients with a database that suits their unique needs.


DEVELOPER
WIKIMEDIA FOUNDATION
At the Wikimedia Foundation, we leverage CiviCRM to maintain millions of records of donors and their contributions. Working with the product and particularly with the community has been a terrific experience. There's nothing quite like two open source organizations working together to meet their respective goals while ultimately strengthening the open source community as a whole.


Administrator and End-user
CiviCRM is a powerful tool that could be really useful for many non-profits in Mexico.
Unfortunately the community is very small in my country. I hope that in the next years the community expands around Latin America.


Implementor
BackOfficeThinking
CiviCRM allows us to bring all benefits and capabilities of a large commercial CRM and
donor management system to medium and large non-profits at a fraction of the cost. CiviCRM also allows smaller non-profits to benefit from an integrated solution for donor management, events, bulk email, etc. substantially increasing their effectiveness as compared to managing a variety of nonintegrated software and spreadsheets. Thanks to a strong CiviCRM community, CiviCRM’s functionality continues to advance and CiviCRM’s market continues to grow rapidly.


Developer


Ally, FanBoy
Aspiration
By giving the nonprofit sector a values-driven, free/open source solution for CRM needs!


Implementor, Developer
Third Sector Design
Being part of the CiviCRM community is really something to shout about! Not only is CiviCRM an amazing software package, its designed for organisations that make a difference in the world. We help non-profits across the UK gain control of their data through the power of CiviCRM.
It is without a doubt the best piece of software I've ever worked with, and I'm constantly discovering cool new features. More recently I've been working on CiviMobile as part of a project for my course at University. I'm really looking forward to seeing this being used by organisations across the globe.


Implementor
Progressive Technology Project
The organizations we work with are experiencing the benefits of a robust tool that is
easy to use, supports their work, and allows them to collect and track data from various parts of their organization, such as membership, fundraising, communications, and organizing into a centralized database. CiviCRM as an open-source solution also allows us to nurture and build a user community to share and create a common vision of future features that would be useful to the community organizing field. Just two years after our pilot project, we're currently supporting 30 community organizing groups to use CiviCRM, and the community is steadily growing.


Administrator


End-user
EFF
The CiviCRM community has been a tremendous resource for new ideas and helping us solve problems. We are excited to contribute customizations EFF makes back to core and support new features such as batch entry for offline donations or multiple payment processors on one donation form.


Consultant
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.


Implementer, Developer
EE-atWork
The CiviCRM community is a very friendly and helpful community. Whatever the challenge, I always get enough help from the forum or IRC to nudge me in the right direction. For me joining in a CiviCRM sprint once or twice a year is the best, meeting other community members in real life, sharing successes, challenges, problems and meals :-) Seriously, I think the active community is one of the serious assets of CiviCRM and I am proud to be part of it! And when I grow up I promise to do more :-)




Comments
Nice wrap up
Hi,
Like your regex trick:
tr[class^=custom_field-row custom_256]. Was doing a loop on the items to find the one I wanted, what you are suggesting is nicer.For everyone, I'd suggest learning firebug to help you find the class/id of the items you want to manipulate if you aren't using it already.In the templates, we have tried to give unique names or classes to most of the elements so it's easier to target the right elements. Some are still missing probably, but if you happen to need one id or class missing, you can fill an issue (with a patch will be faster) and we'll fix it.Hertzel, for the events you are organising, is this necessary to use both crack and alcohol or one is enough to be invited to the party :) ?
X+Hi, I struggle with JQuery /
Hi, I struggle with JQuery / js so this is great. When I did need to do something by js I followed a recommendation by Denver Dave to use drupal_add_js
I'm interested in your opinion as to where this 4th option sits compared to #3
My function - just populates a custom field calculated off amount & another custom field
function mymodule_civicrm_buildForm( $formname, $form ){
if ($formname == 'CRM_Pledge_Form_Pledge'){
if($_GET['id']){
$instance = $_GET['id'];
}else{
$instance ='-1';
}
$jqueryinsert = "
cj(document).ready( function() {
cj('#amount').blur(function(){
if(cj('#amount').attr('value') > 0){
var newValue = cj('#custom_57_$instance').attr('value') *.05 / cj('#amount').attr('value') * 100;
cj('#custom_207_$instance').val(newValue);
}
});
});
";
drupal_add_js( $jqueryinsert , 'inline');
}
}
I would appear to me that
I would appear to me that this is simply a different way to get the jQuery code onto the page, and thus falls into my #3 actually. :)
It would further appear that if your jQuery used the wildcard method (instead of $instance), this code could be in a file, not inline, and thus not require backend processing, and could also be cached along with other JS code.
Cool. Thanks for that
Cool. Thanks for that feedback
The disadvantage is that
To ease this headache I always put notes at the top of each custom template about what was changed.
This is an incredibly inefficient line of jQuery. Run this on IE6 and it might take seconds to execute. It would be better to use a containing ID first:
Better yet to try and split out the .custom_field-row before you do the regex for greater resistance to DOM changes.
Making IE6 users waiting
Is more a positive point than a negative one, isn't it ? For those 1% that haven't upgraded, let's push them to do it (or better yet to switch to an open source browser). In this day and age, when even microsoft has stopped supporting ie6 for like 2 years, we really shouldn't take care about it anymore.
But you are right, setting a parent will speed up things a bit
instead of
$("#some-id").find("tr[class^=custom_field-row custom_256_]").each(function(){$("#some-id tr[class^=custom_field-row custom_256_]").each(function(){is more readableUnfortunately in this case, don't think we have an id set by civi above, so we depend on the theme.
$("form tr[class^=custom_field-row custom_256_]").each(function(){Is probably going to work and be as fast as a #some-id
Anyway, on any sane browser, that's probably going to save a few ms when you load the registration form.
X+
If only...
Sadly IE6 still has around 4% share and even more sadly, it's widely used in the public sector in the UK, including the National Health Service - Europe's largest employer - and the Ministry of Defence. We have health sector clients so we have to support it. But its days in the NHS may be numbered.
How do you work with something that has other jQuery targeting?
Hi,
Thanks for the blog. I've asked the question below in the forum, but it was relevant to this discussion so I hope you don't mind me asking it here.
How does this work when you want to modify something that seems to have other jQuery affecting it? I'm trying to get an autocomplete (assigned to on activity) pre populated with the logged in user, but I can't seem to do anything on it as it starts life as an input that is changed to a ul. I think I need to get my javascript to load later than the autocomplete java? Have you seen this sort of requirement before?
Thanks,
Malks.
Hi. I found your forum post
Hi. I found your forum post but beyond the ideas presented there, I don't know how possible this is. However you could certainly (I think) adjust the autocomplete code in the CiviCRM templates to call a function after converting the input.
That would be method #1 described above. It also has a place. :)
Drupal/Joomla jQuery versus Civi jQuery
Thanks for this useful post. Is there a reason to use jQuery from Drupal/Joomla rather than Civi's jQuery, cj() ?
jQuery not in a template
Hi Hershel,
Thank you for the great writeup on implementing jQuery within Civi. I am trying to use jQuery loaded via a module .info file, to set some default values on a form. However, even though the jQuery is loaded, and no errors are triggered nothing happens. To begin with, to verify jQuery is working properly I am trying to simply remove a class from the New Case screen.
if (Drupal.jsEnabled) {$(document).ready(function () {
$("#profiles_1").removeClass("form-select");
});
}
The above snippet does not remove the class as I would expect it too. Does Civi implement only a subset of the core jQuery functionality? Thanks again for the great introductory post.
here's a little example for code to hide a contribution amount
This jQuery does 3 things: Hides the radio button of a contribution amount, hides the label, and hides the BR tag immediately after the label.
$("#YOUR_CIVICRM_QFID_999_9").hide();
$("label[for='YOUR_CIVICRM_QFID_999_9']").next('br').remove();
$("label[for='YOUR_CIVICRM_QFID_999_9']").hide();
Put in on your page using one of the methods Hershel lists above.
How to Customize CiviCRM Pages with jQuery
For an event and / or profile registration page, exactly where would the jQuery code to customize the form be placed? I'm very new to CiviCRM and I haven't quite figured out the flow of page, and what goes where. Thanks...fred
What about livequery?
I wonder, in pages like the Configure Event -> Fee tab, where it loads the contents of the tabbed page area after the page itself, and therefore after any javascript added by drupal_add_js, how do I change things loaded in the tabbed area? It seems that I'd need to load a copy of livequery, which I've done using drupal_add_js, but then I don't know where to go from there, because neither accessing civicrm's copy of jquery like cj('#selector').livequery(function() {....}); nor accessing Drupal's copy of jquery like $('#selector').livequery(function() {....}); has any effect. Anyone know where to go from here?
Here's a solution from the
Here's a solution from the forum where I asked the same question (http://forum.civicrm.org/index.php/topic,24367.msg102482.html#msg102482) :
"You might want to delay where the init code is loaded (eg. on the load instead of the ready event) or wait on an event that is linked to the content you want to alter (with the .on method, you can watch more or less everything, including inserting elements in the dom)"