Conditional update of a field in a repeat group

mirceat

Member
Hello,

I need to update two fields with the current datetime, if a condition is met. The fields that need to be updated and the fields checked for existing values are in a repeat group.

Using the php form plugin, i've added this code but i can't make it work, no update is made in the database. The php form plugin run onBeforeStore.

The form is available here (login required, see My Sites for login data)

Joomla 3.4.8, Fabrik 3.4.2

Code:
$repeatcount = $formModel->formData['fabrik_repeat_group'][675];

for($i=0; $i<$repeatcount; $i++ ){

$solicitare = $formModel->formData['solicitare'][$i];
$raspuns = $formModel->formData['raspuns_solicitare'][$i];
$data_solicitare = $formModel->formData['data_solicitare'][$i];
$data_raspuns = $formModel->formData['data_raspuns_solicitare'][$i];

$data = (new \DateTime())->format('Y-m-d H:i:s');

if (!empty($solicitare) && empty($data_solicitare)) {
$formModel->updateFormData("aplicatii_cm_tickets_675_repeat___data_solicitare".$i,$data, true);
}

if (!empty($raspuns) && empty($data_raspuns)) {
$formModel->updateFormData("aplicatii_cm_tickets_675_repeat___data_raspuns_solicitare".$i,$data, true);
}

}

Thank you
 
Last edited:
New test, unfortunately it doesn't work..don't know what i'm doing wrong:

Code:
//based on http://fabrikar.com/forums/index.php?threads/repeated-group-joined-table-submission-plugin.20204/#post-109665

$group_id = 11;
$join_id = 20;
$num_repeats = $formModel->formData['fabrik_repeat_group'][$group_id];
$date = (new \DateTime())->format('Y-m-d H:i:s');

for ($this_repeat = 0; $this_repeat < $num_repeats; $this_repeat++) {

$solicitare = $formModel->formData['join'][$join_id]['test_11_repeat___solicitare'][$this_repeat];
$raspuns = $formModel->formData['join'][$join_id]['test_11_repeat___raspuns_solicitare'][$this_repeat];
$data_solicitare = $formModel->formData['join'][$join_id]['test_11_repeat___data_solicitare'][$this_repeat];
$data_raspuns = $formModel->formData['join'][$join_id]['test_11_repeat___data_raspuns_solicitare'][$this_repeat];

//if (!empty($solicitare) && empty($data_solicitare)) {
$formModel->updateFormData("join.".$join_id.".test_11_repeat___data_solicitare.".$this_repeat, $date);
$formModel->updateFormData("join.".$join_id.".test_11_repeat___data_solicitare_raw.".$this_repeat, $date);
//}

//if (!empty($raspuns) && empty($data_raspuns)) {
$formModel->updateFormData("join.".$join_id.".test_11_repeat___data_raspuns_solicitare.".$this_repeat, $date);
$formModel->updateFormData("join.".$join_id.".test_11_repeat___data__raspuns_solicitare_raw.".$this_repeat, $date);
//}

}
 
I think you've copied some code from a 3.0 example.

We no longer use that $formModel->formData['join'][$joinid]['table___element'] structure for repeat data.

Each element in formData[] that belongs to a repeat group is now simply an array, with one entry per repeat. So ...

Code:
for ($this_repeat = 0; $this_repeat < $num_repeats; $this_repeat++) {
   $solicitare = $formModel->formData['test_11_repeat___solicitare'][$this_repeat];
// etc ...

-- hugh
 
Yes, the last example seems to be for Fabrik 3.0 but the first example (see the first post) i think it's for the correct version.

If i remove the "$i" string, I can update the date for the first group. But as long the same group is repeated 3 times, i need to update each instance of the group.

I think this part is not ok:

$formModel->updateFormData("aplicatii_cm_tickets_675_repeat___data_solicitare".$i,$data, true);

Thank you
 
I think you have to pass it the whole array as the data. So rather than running the updateFormData() each time round the loop, build an array of the data you want to set, and pass that as the value.

Code:
$repeatcount = $formModel->formData['fabrik_repeat_group'][675];
$datetime = (new \DateTime())->format('Y-m-d H:i:s');

$solicitareData = array();
$raspunsData = array();

for($i=0; $i<$repeatcount; $i++ ){

   $solicitare = $formModel->formData['aplicatii_cm_tickets_675_repeat___solicitare'][$i];
   $raspuns = $formModel->formData['aplicatii_cm_tickets_675_repeat___raspuns_solicitare'][$i];
   $data_solicitare = $formModel->formData['aplicatii_cm_tickets_675_repeat___data_solicitare'][$i];
   $data_raspuns = $formModel->formData['aplicatii_cm_tickets_675_repeat___data_raspuns_solicitare'][$i];

   // set new date if change, set to old date if not
   if (!empty($solicitare) && empty($data_solicitare)) {
      $solicitareData[$i] = $datetime;
   }
   else {
      $solicitareData[$i] = $data_solicitare;      
   }

   if (!empty($raspuns) && empty($data_raspuns)) {
      $raspunsData[$i] = $datetime;
   }
   else {
      $raspunsData[$i] = $data_raspuns;
   }

}

$formModel->updateFormData("aplicatii_cm_tickets_675_repeat___data_solicitare", $solicitareData, true);
$formModel->updateFormData("aplicatii_cm_tickets_675_repeat___data_raspuns_solicitare", $raspunsData, true);

So instead of updating each time rund the loop, build the data array, with either the new or existing data, then set it as an array.

-- hugh
 
Thank you..but unfortunately, it doesn't work, the fields are not updated

If you want to test it, please take a look here (MySites login required)
 
Did you try var_dump'ing the variables, see what's going on? I'm on my phone, can't really do much except cheerlead.

Sent from my HTC One using Tapatalk
 
We are in need of some funding.
More details.

Thank you.

Members online

Back
Top