I have added a custom validation handler to a node creation form that has an embedded field_collection. In the validation handler I call

<?php form_set_error("field_location", 'Please enter the primary location name.'); ?>

where field_location_name is the field name of the field_collection. This does indeed work – it stops the form from submitting, displays the error, and highlights the entire field_collection container and all contained fields. The problem is that I only want to require a couple of items in the field_collection, so I've tried calling something like:

<?php form_set_error("field_location']['und'][0]['field_location_name", 'Please enter the primary location name.'); ?>

and while the form prevents submission, this specific text field is not highlighted. Is there a way to call form_set_error on a specific field inside of a field_collection?

Comments

I'm using something similar and for me, it works.

field_monetary_distribution is the field collection.
field_distribution_percentage is the field within the collection

<?php
 
if ($percentages != 100) {
   
form_set_error('field_monetary_distribution][' . LANGUAGE_NONE . '][0][field_distribution_percentage', t('Monetary distribution percentages must add up to 100.'));
  }
?>

Status:Active» Closed (works as designed)

agileadam - you're right, that does work. Here's what I've found that's causing the problem for me. In addition to the form_set_error, I'm also marking the fields as required in the hook_form_alter() like so:

$form['field_collection_name'][LANGUAGE_NONE][0]['field_name'][LANGUAGE_NONE][0]['value']['#required'] = TRUE;

This gives the field the red asterisk and "required" class and such, but it also seems to be making my form_set_error not work as expected. Since this is likely something to do with the form API or just my misunderstanding of the #required attribute, I'm marking as "works as designed" and will hopefully find the solution elsewhere.

Status:Closed (works as designed)» Active

Actually, I'd like to reopen. How can one set a field_collection item to be required and then subsequently handle validation via a custom message without having duplicate messages printed about a field? Example:

<?php
function hook_form_alter(&$form, &$form_state) {
 
// Make a field_collection field required so that we get the appropriate class, red asterisk, etc.
 
$form['field_location'][LANGUAGE_NONE][0]['field_address_1'][LANGUAGE_NONE][0]['value']['#required'] = TRUE;
 
// Add a custom validation function.
 
$form['#validate'][] = 'my_custom_validation';
}
function
my_custom_validation(&$form, &$form_state) {
 
// Error out on this field if it's empty, displaying something helpful to the user.
 
if (empty($form_state['values']['field_location'][LANGUAGE_NONE][0]['entity']->field_address_1[LANGUAGE_NONE][0]['value'])) {
   
form_set_error("field_location']['und'][0]['field_address_1", 'Please enter the primary address of your business.');
  }
 
// We also have to add our '#required' and 'error' class attributes into the form element by hand here.
 
$form['field_location']['und'][0]['field_address_1']['und'][0]['value']['#required'] = TRUE;
 
$form['field_location']['und'][0]['field_address_1']['und'][0]['value']['#attributes']['class'][] = 'error';
}
?>

Having to add the '#required' and 'error' class back into the form element is silly enough, but I also now get 2 error messages:

"Please enter the primary address of your business."
"Address 1 field is required."

Is there a way to combat this? What is the best practice for working with field collection fields programmatically in relation to form validation?

function mymodule_article_form_validate($form, &$form_state) {

if (!is_numeric($price) ) {

form_set_error('field_ticket][' . LANGUAGE_NONE . '][0][field_price', t('Please enter number under the tickets '));

}

}
It works for me.
Thanks

Issue summary:View changes

Had wrong element name.