Early Bird Registration for DrupalCon Portland 2024 is open! Register by 23:59 PST on 31 March 2024, to get $100 off your ticket.
It doesn't seem like Rules is able to retrieve data through field collections...
Here's my scenario:
- I'm using Entityforms to create a form that contains several Field collection fields.
- Each Field collection field is multi-valued.
- I'm using Entityforms support for Rules to validate form submissions.
- In the validation rules, I need to check the value of a field inside the first two Field collection items of a field.
Here's the structure:
- Application Form
- field_people [0..N]
- field_person_type [1]
- field_people [0..N]
So, basically, the rule is trying to look at the values of field_people[0][field_person_type]
and field_people[1][field_person_type]
.
Here's a simple copy of my validation rule (just checks to see whether field_people[0] even exists):
{ "rules_test" : {
"LABEL" : "Test",
"PLUGIN" : "rule",
"TAGS" : [ "entityform validation" ],
"REQUIRES" : [ "rules" ],
"USES VARIABLES" : {
"entityform" : { "label" : "Submitted Entityform", "type" : "entityform" },
"entityform_type" : { "label" : "Entityform Type", "type" : "entityform_type" },
"validate_form" : { "label" : "Form Validates", "type" : "boolean", "parameter" : false }
},
"IF" : [
{ "entity_has_field" : { "entity" : [ "entityform" ], "field" : "field_people" } },
{ "NOT data_is_empty" : { "data" : [ "entityform:field_people:0" ] } }
],
"DO" : [ { "drupal_message" : { "message" : "REBOOT... ALL THE THINGS!" } } ],
"PROVIDES VARIABLES" : [ "validate_form" ]
}
}
Here's a sample of the data in the form:
$entityform->field_people = array(
LANGUAGE_NONE => array(
0 => array(
'field_person_type' => array(
LANGUAGE_NONE => array(
0 => array(
'value' => 'mother',
),
),
),
),
),
);
Here's the rules execution output:
Rules debug information:
" Executing rule Test.
0 ms Executing rule Test.
4.591 ms Evaluating conditions of rule Test. [edit]
5.533 ms The condition entity_has_field evaluated to TRUE [edit]
7.166 ms The condition data_is_empty evaluated to TRUE [edit]
7.178 ms AND evaluated to FALSE.
7.394 ms Finished executing of rule Test.
This seems like a bug... am I doing something wrong?
Comments
Comment #1
GuyPaddock CreditAttribution: GuyPaddock commentedHmm, this is definitely an issue in Field Collection.
I noticed that when I use nodes instead of Entityforms, I don't experience the same behavior. It seems that there is some sort of problem with
field_collection_field_property_get()
for non-node types. Basically, stepping through the code, it looks like the'value'
key of each delta isn't set at the time that method is invoked for non-nodes.For node types,
hook_field_presave()
gets invoked beforehand, allowing the'value'
key to be fully populated beforefield_collection_field_property_get()
is invoked. For the Entityform types, it looks like that same logic only runs after the call tofield_collection_field_property_get()
.Thoughts?
Comment #2
GuyPaddock CreditAttribution: GuyPaddock commentedThis is definitely a bug in field_collection. Apparently, FC can't handle dealing with FC item data before the entity presave hook has been invoked, which is exactly what happens when rules code is invoked on an entity during a form_validate.
It looks like something will need to change in field_collection_field_property_get to address this...
Comment #2.0
GuyPaddock CreditAttribution: GuyPaddock commentedAdded structure of the entity form data.
Comment #3
Mosco_DJ CreditAttribution: Mosco_DJ commentedSubscribe