Adding new option via jquery leads to: Selected value does not exist.
-
Hello,
i’m currently working on a local project and needed to populate three dropdowns in my Forminator form with all the registered users.
Here’s how I achieved it:
In the PHP file where I add my form, I retrieved all the users using PHP and saved/converted them into a JavaScript variable.
<?php $users = get_users(array('fields' => array('display_name'))); $encoded_users = json_encode($users); ?> <script> var users = <?php echo $encoded_users; ?>; </script>
In jQuery, I accomplished this by using the following code:
$.each(users, function(index, user) { var option = $('<option>', { value: user.display_name, text: user.display_name }); $('.forminator-select--field').append(option); });
This works fine. All my selections in the form are updated with the registered users. However, when I try to send the form, I receive the following error:
<span style=”text-decoration: underline;”>Selected value does not exist.</span>
I have tried multiple solutions, but I couldn’t figure it out. Is there a better or easier way to add additional options, such as users, to the selection dropdown?
-
Hello @himitsuu,
You’re right, a simple method like that won’t be working. Please try using the following example.
Replace
326
with your current form ID on this line:if ( $model_id != 326 ) {
,then a bit further down, replace
select-1
field name with the one you’re modifying:<?php add_filter( 'forminator_cform_render_fields', function( $wrappers, $model_id ) { if ( $model_id != 326 ) { return $wrappers; } $select_fields_data = array( 'select-1' => 'users', ); foreach ( $wrappers as $wrapper_key => $wrapper ) { if ( ! isset( $wrapper[ 'fields' ] ) ) { continue; } if ( isset( $select_fields_data[ $wrapper[ 'fields' ][ 0 ][ 'element_id' ] ] ) && ! empty( $select_fields_data[ $wrapper[ 'fields' ][ 0 ][ 'element_id' ] ] ) ) { $users = get_users(); if ( ! empty( $users ) ) { $new_options = array(); $user_names = array(); foreach( $users as $u ) { $new_options[] = array( 'label' => $u->user_login, 'value' => $u->user_login, 'limit' => '', 'key' => forminator_unique_key(), ); $user_names['options'] = $new_options; } $select_field = Forminator_API::get_form_field( $model_id, $wrapper['fields'][0]['element_id'], true ); if ( $select_field ) { Forminator_API::update_form_field( $model_id, $wrapper['fields'][0]['element_id'], $user_names ); $wrappers[ $wrapper_key ][ 'fields' ][ 0 ][ 'options' ] = $new_options; } } } } return $wrappers; },10,2);
Best Regards,
DmytroThank you for your response!
Unfortunately, the solution you provided doesn’t seem to be working at the moment.
Did I make any mistakes in my implementation? Should this new PHP code you provided be placed in the MU-Plugins directory?
PS: my field name is still selected-1.
https://i.gyazo.com/62bad83a19dd19ea32e04720c5f84ae1.png
if it would work, could i just add the other two sections like this?$select_fields_data = array( 'select-1' => 'users', 'select-2' => 'users', 'select-3' => 'users' );
Here is the code I used:
<?php add_filter( 'forminator_cform_render_fields', function( $wrappers, $model_id ) { if ( $model_id != 2101 ) { return $wrappers; } $select_fields_data = array( 'select-1' => 'users', ); foreach ( $wrappers as $wrapper_key => $wrapper ) { if ( ! isset( $wrapper[ 'fields' ] ) ) { continue; } if ( isset( $select_fields_data[ $wrapper[ 'fields' ][ 0 ][ 'element_id' ] ] ) && ! empty( $select_fields_data[ $wrapper[ 'fields' ][ 0 ][ 'element_id' ] ] ) ) { $users = get_users(); if ( ! empty( $users ) ) { $new_options = array(); $user_names = array(); foreach( $users as $u ) { $new_options[] = array( 'label' => $u->user_login, 'value' => $u->user_login, 'limit' => '', 'key' => forminator_unique_key(), ); $user_names['options'] = $new_options; } $select_field = Forminator_API::get_form_field( $model_id, $wrapper['fields'][0]['element_id'], true ); if ( $select_field ) { Forminator_API::update_form_field( $model_id, $wrapper['fields'][0]['element_id'], $user_names ); $wrappers[ $wrapper_key ][ 'fields' ][ 0 ][ 'options' ] = $new_options; } } } } return $wrappers; },10,2); ?>
Hi @himitsuu,
Please check and see whether the following helps:
<?php add_filter( 'forminator_cform_render_fields', function( $wrappers, $model_id ) { if ( $model_id != 2101 ) { return $wrappers; } $select_fields_data = array( 'select-1' => 'users', 'select-2' => 'users', 'select-3' => 'users', // Added third select field for users ); foreach ( $wrappers as $wrapper_key => $wrapper ) { if ( ! isset( $wrapper[ 'fields' ] ) ) { continue; } if ( isset( $select_fields_data[ $wrapper[ 'fields' ][ 0 ][ 'element_id' ] ] ) && ! empty( $select_fields_data[ $wrapper[ 'fields' ][ 0 ][ 'element_id' ] ] ) && $select_fields_data[ $wrapper[ 'fields' ][ 0 ][ 'element_id' ] ] === 'users' ) { $users = get_users(); if ( ! empty( $users ) ) { $new_options = array(); $user_names = array(); foreach( $users as $u ) { $new_options[] = array( 'label' => $u->user_login, 'value' => $u->user_login, 'limit' => '', 'key' => forminator_unique_key(), ); $user_names['options'] = $new_options; } $select_field = Forminator_API::get_form_field( $model_id, $wrapper['fields'][0]['element_id'], true ); if ( $select_field ) { Forminator_API::update_form_field( $model_id, $wrapper['fields'][0]['element_id'], $user_names ); $wrappers[ $wrapper_key ][ 'fields' ][ 0 ][ 'options' ] = $new_options; } } } } return $wrappers; },10,2);
Please do make sure the form ID is correct in the following line of the given code:
if ( $model_id != 2101 ) {
You can replace the previous code with the above snippet and see how it behaves.
Please implement it as a mu-plugins as suggested before. Please do let us know how that goes.
Best Regards,
Nithin
Thank you for your response! I appreciate the progress made so far, although there are a few remaining issues:
- The solution is working only for the first selection field.
(https://i.gyazo.com/88268c06a15157aaff42ec5c596507ee.mp4) - Fortunately, the user data is successfully saved in the post custom data.
(https://i.gyazo.com/59315c350cae15dd37844ba25764e752.png) - Unfortunately, the ACF field “user” is not capturing the value.
(https://i.gyazo.com/5e89d2a8d10b809feed7f0ff0ea2f5dc.png) - Perhaps it would be better to work with text fields instead of trying to map user fields together.”
It seems that mapping user fields together is not possible. In that case, it might be better to work with just text fields instead?
Hi @himitsuu
Thank you for response!
As for point 1 (only works for first select field):
I have tested the most recent version of the code shared here
on my end and it works as expected there – all three selects are filled-in with users.
Please make sure that:
a) the select fields in this part of the code are correctly defined
$select_fields_data = array( 'select-1' => 'users', 'select-2' => 'users', 'select-3' => 'users', // Added third select field for users );
b) that you have actually replaced any previous code that you had with this newest one
c) and that you have cleared all caches – on site, server, CDN, browser (whichever applies to this setup).
If this still doesn’t work, we would want to take a look at the form itself (see point below).
As for point 3 (ACF field “user”):
This is hard to say out of the box. It mostly depends on the mapping but also on the ACF field configuration and it is possible that it may require some additional/other custom code.
To be able to tell more about it, we’d need to check ACF field configuration and form configuration itself so would you please export both and share with us?
To do that:
– go to “Forminator -> Forms” page and click on the little “gear” icon next to the form in question
– select “Export” option and copy given code from there, then put it on the pastebin.com service and share link to it in your response here– go to “ACF -> Tools” page and in “Export” section check the checbox for the field group that contains that “user” field
– then click “Export as JSON” and save the file
– put that file on your Google Drive, Dropbox or similar and post (“everyone with this link can view” type of permission for link) link to it in your response below.—
This way we’ll be able to check the form, look into that select fields issue and check about mapping of user.
As for point 4:
I don’t think this would be a solution here. You’d still need some mapping in case of ACF mapping may still require additional custom code so let’s for now explore above issues and see how it goes.
Best regards,
Adam@wpmudev-support8
Hello,I double-checked and realized that I had hardcoded my two users as options in my {select-1} component. As a result, the functionality is currently not working for me. This issue affects not only the first user but also others.I triple-checked and discovered that the code is hardcoding the user into the backend, which is quite amusing. However, this issue is still limited to only the first selection field.
ACF:
https://drive.google.com/file/d/1QjPINuca3WP4G6lbUl6j1kYtbgH_ihQ5/view?usp=sharing
Forminator:
https://drive.google.com/file/d/15gZ5Sjx-cA4g85yVL3fDbp8EmqnNS21C/view?usp=sharingHi @himitsuu
Hope you are doing fine!
The code has been adjusted, so it can populate the other select fields. Please modify the previous code in your site’s wp-content/mu-plugins folder as explained here ?https://wpmudev.com/docs/using-wordpress/installing-wordpress-plugins/#installing-mu-plugins, please find below the new code:
<?php add_filter( 'forminator_cform_render_fields', function( $wrappers, $model_id ) { // Form id where this code will be applied if ( $model_id != 345 ) { return $wrappers; } // Define select fields to be populated $select_fields_data = array( 'select-1' => 'users', 'select-2' => 'users', 'select-3' => 'users', // Added third select field for users ); // Retrieve site users $user_names $users = get_users(); if ( ! empty( $users ) ) { $new_options = array(); $user_names = array(); foreach( $users as $u ) { $new_options[] = array( 'label' => $u->user_login, 'value' => $u->user_login, 'limit' => '', 'key' => forminator_unique_key(), ); $user_names['options'] = $new_options; } } // Look for individual fields or fields in groups foreach ( $wrappers as $wrapper_key => $wrapper ) { if ( ! isset( $wrapper[ 'fields' ] ) ) { continue; } for ($index = 0; $index < count($wrapper['fields']); $index++) { if ( isset( $select_fields_data[ $wrapper[ 'fields' ][ $index ][ 'element_id' ] ] ) && ! empty( $select_fields_data[ $wrapper[ 'fields' ][ $index ][ 'element_id' ] ] ) && $select_fields_data[ $wrapper[ 'fields' ][ $index][ 'element_id' ] ] === 'users' ) { $select_field = Forminator_API::get_form_field( $model_id, $wrapper['fields'][$index]['element_id'], true ); if ( $select_field ) { Forminator_API::update_form_field( $model_id, $wrapper['fields'][$index]['element_id'], $user_names ); $wrappers[ $wrapper_key ][ 'fields' ][ $index ][ 'options' ] = $new_options; } } } } // end loop wrappers return $wrappers; },10,2);
Note: In the code please change the 345 number to your form’s ID.
We recommend to test this on the dev/staging version first before putting it on the live?site.
Kind regards
Luis
@wpmudev-support7
Thank you very much! This code is now working!But how can I map the selection to an ACF Field of type User?
Hi @himitsuu
ACF “user” field doesn’t store username so you need to put the user ID value there (regardless of whether you have ACF set to show it).
If I see correctly (I checked the form that you shared previously) you already have mappings set correctly so you only need to change the shared code to make sure that select fields have user IDs as values instead of user names.
You can do so by replacing this part of the code
$new_options[] = array( 'label' => $u->user_login, 'value' => $u->user_login, 'limit' => '', 'key' => forminator_unique_key(), );
with this
$new_options[] = array( 'label' => $u->user_login, 'value' => $u->ID, 'limit' => '', 'key' => forminator_unique_key(), );
With that change, the “visible” option will still show username but the option value will be user ID and this will be passed to your ACF field; ACF should read it correctly.
If you need to keep this username also as a select option value for some reason then it would require another bit of separate custom code in which case please start a separate ticket (as it’s a different issue) and mention that you are already using code from this ticket to populate select field with usernames and we’ll assist you there.
Kind regards,
AdamHello @himitsuu ,
We haven’t heard from you for some time now, so it looks like you don’t require our further assistance.
Feel free to re-open this ticket if needed.
Kind regards
Kasia - The solution is working only for the first selection field.
- The topic ‘Adding new option via jquery leads to: Selected value does not exist.’ is closed to new replies.