Add required fields to signup
Hi! I'm putting together a forum for a client, and they need to add 5 or 6 fields that will be required (zipcode, city, state, etc). I added them to the user database, and found all the files I need to edit in /entry. However, I would like to make this into a plugin so I don't have to worry about all my changes being overwritten when upgrading.
I am new to Vanilla and am having trouble wrapping my head around it. How do I override the UserModel to add new fields when inserting and validating? Should I just copy the usermodel code into a new model in my plugin somehow? I thought maybe just copying the entire entry folder into a plugin would be the way to go, but then I'm not sure how to create a different URL (something like mysite.com/signup). Is this the write way to go? I have no idea! Struggling for a week or two with this. Any help is appreciated!
PS: this is for Vanilla 2.
Best Answers
-
hbf MVP
i would think about it in one of two ways:
- you can force the validation and user entry of this data into the native signup form
or - upon completion of the native signup form you can trigger a second form with it's own validation rules.
option 1 is going to probably rely on adding hooks to the signup process that might not exist right now... so you run the risk of having upgrade path problems.
option 2 is going to be less "integrated" as the user will have to go through two screens before completing the signup process. But this is likely to be based on out of the box hooks, and will make upgrades much easier.
There are probably other ways to skin the cat, but this is how i see it from where i'm sitting.
0 - you can force the validation and user entry of this data into the native signup form
-
Todd Vanilla Staff
One thing to note. As long as the fields are submitted on the form and they are also on your database table then they'll save to the database. You don't have to do anything else. If the fields in the database are required then they'll also give you an error message if you leave them blank in the application. It's all automagic.
Usually, we say just modify the appropriate registration view and put the new fields in after adding them to the user table. This has become such a common request that we added some events in the registration views so that you can just echo out some html form controls in a plugin. Unfortunately, this didn't make it into 2.0.18, but I may just back-port those files for the next 2.0.18.* service release.
Right now you can maybe just grab the latest views or modify them. I'd be happy to help.
0
Answers
check this out.
http://vanillaforums.org/discussion/comment/139807#Comment_139807
@Kristin
in my experience with this platform,
most plugins extend existing tables or create their own tables, then use their own plugin controller to handle the processing, rather than overriding core controllers or models.
Themes typically do the job of overriding of controllers and views.
That said I would suggest using a plugin and attaching to a hook in the signup controller. Sorry that's a bit vague, but i haven't really dug in deep enough to give you specifics. You'll also need to hook into the user panel to display your info i suppose.
There is a plugin out there that extends the user metamodel already... i would look at that and modify from there.
http://vanillaforums.org/addon/aboutme-plugin
Vanilla Wiki, Tastes Great! 31,000 viewers can't be wrong. || Plugin Development Explained
Thanks, that does help. I'll take a look at that plugin (I think I already downloaded it).
one thing I'm confused about is how to save additional information when the userModel is inserting the fields... I'm not on my work computer, but I don't think there's a hook into the _insert method, but I could be wrong. I guess I would do the verifications on my own fields and then somehow send out any errors with the validation check that the existing form already does? I will look more at this tomorrow and try to post more specific questions. Thanks!
i would think about it in one of two ways:
or
option 1 is going to probably rely on adding hooks to the signup process that might not exist right now... so you run the risk of having upgrade path problems.
option 2 is going to be less "integrated" as the user will have to go through two screens before completing the signup process. But this is likely to be based on out of the box hooks, and will make upgrades much easier.
There are probably other ways to skin the cat, but this is how i see it from where i'm sitting.
Vanilla Wiki, Tastes Great! 31,000 viewers can't be wrong. || Plugin Development Explained
i like option 2 thats a good idea.
another benefit of option 2 is that you can reuse the form code to allow users to update their contact information when required.
Also, You can use other hooks to check for the presence of required contact info and raise a notification if something doesn't pass validation. That will catch any conditions where a users creates an account then stops short of finishing the contact data.
Vanilla Wiki, Tastes Great! 31,000 viewers can't be wrong. || Plugin Development Explained
im planning to make the 2nd page optional so user can skip and update later. in my case really hate filling out alot of fields during sign up.
One thing to note. As long as the fields are submitted on the form and they are also on your database table then they'll save to the database. You don't have to do anything else. If the fields in the database are required then they'll also give you an error message if you leave them blank in the application. It's all automagic.
Usually, we say just modify the appropriate registration view and put the new fields in after adding them to the user table. This has become such a common request that we added some events in the registration views so that you can just echo out some html form controls in a plugin. Unfortunately, this didn't make it into 2.0.18, but I may just back-port those files for the next 2.0.18.* service release.
Right now you can maybe just grab the latest views or modify them. I'd be happy to help.
Todd--oh really.... How do I make the zipcode field verify as a zip? These are my extra fields right now, and I use a plugin to input the selection data using EntryController_Register_Handler()
<?php echo $this->Form->Label('City', 'City'); echo $this->Form->TextBox('City'); echo ''.T('City is a required field.').''; ?>
<?php echo $this->Form->Label('State', 'State'); echo $this->Form->DropDown('State', $this->StateOptions); ?>
<?php echo $this->Form->Label('Zipcode', 'Zip'); echo $this->Form->TextBox('Zip'); echo ''.T('Zip is a required field.').''; ?>
<?php echo $this->Form->Label('Relationship to Parkinsons', 'Relationship'); echo $this->Form->DropDown('Relationship', $this->RelationshipOptions); ?>
<?php echo $this->Form->Label('Age', 'Age'); echo $this->Form->DropDown('Age', $this->AgeOptions); ?>
For some reason that didn't show the spans that are included as incorrect statements... under "city" and "zip" I have something like <span id="CityWrong" class="Incorrect" style="display: none;">'.T('City is a required field.').'</span>
Is that all it takes to make it required?
A trick I use in plugins
now copy the register views into a views folder in your plugin folder. Works a charm
grep is your friend.
I can't believe that's all I had to do (turns out I also had an issue with the fields I added to the Database...ugh!)
One other question... how do I add the captcha field to the registerapproval view? I would like the admins to approve members, but I don't want them deluged with spam either. I added this bit to the top:
$CaptchaPublicKey = Gdn::Config('Garden.Registration.CaptchaPublicKey');
$Request = Gdn::Request();
$CaptchaSSL = (StringBeginsWith(Url('/', TRUE), 'https') || Gdn::Request()->GetValueFrom(Gdn_Request::INPUT_SERVER, 'SERVER_PORT') == 443) ? TRUE : FALSE;
and this bit to the form:
<?php echo $this->Form->Label("Security Check", ''); echo recaptcha_get_html($CaptchaPublicKey, NULL, $CaptchaSSL); ?>
But I get this error:
Fatal error: Call to undefined function recaptcha_get_html() in /Users/kristin/Sites/vanilla/themes/powering_forward/views/entry/registerapproval.php on line 88
I would assume this is because the RegisterApproval method doesn't include this function, but I'm not entirely sure how to add it. Thanks for your help!
im also using the same trick by tapping on the EntryController_Render_hander
go the same problem before, u will need to study the
applications\dashboard\controllers\class.entrycontroller.php
Don't Forget you can use custom views in your theme.
Just sayin...
I've done this successfully before, just add the fields in the theme's hooks, and the custom views to the theme.