vb.org Archive

vb.org Archive (https://vborg.vbsupport.ru/index.php)
-   vB4 Programming Discussions (https://vborg.vbsupport.ru/forumdisplay.php?f=252)
-   -   Setting custom user profile fields with datamanager (https://vborg.vbsupport.ru/showthread.php?t=283970)

christian.cloug 06-05-2012 09:06 AM

Setting custom user profile fields with datamanager
 
I'm putting together a page that's an extension of the registration process and updates certain custom user profile fields...

i've done my best to search these forums to put the code together, and think i'm almost there, but could really use some help going the final distance!

Currently I get the following error 'Fatal error: Field field2 is not defined in $validfields in class vB_DataManager_User in [path]/includes/class_dm.php on line 515', with the code below:


PHP Code:

$vbulletin->input->clean_array_gpc('p', array(
    
'cfield_2' => TYPE_NOHTML,
    
'cfield_6' => TYPE_INT,
    
'cfield_7' => TYPE_INT
));


$userdata =& datamanager_init('User'$vbulletinERRTYPE_ARRAY); 
$userdata->set_existing($vbulletin->userinfo);

$userdata->set('field2'$vbulletin->GPC['cfield_2']); 
$userdata->set('field6'$vbulletin->GPC['cfield_6']); 
$userdata->set('field7'$vbulletin->GPC['cfield_7']);


$newusergroupid 9;
$userdata->set('usergroupid'$newusergroupid);


$userdata->pre_save(); 


if (!empty(
$userdata->errors)) 

    
$errorlist ''
    foreach (
$userdata->errors AS $index => $error
    { 
        
$errorlist .= "<li>$error</li>"
    } 
     
    
// ... additional code; $errorlist is outputted to the user 

else 

    
// save the data 
    
$vbulletin->userinfo['userid'
        = 
$userid 
        
$userdata->save(); 
         
    
// ... additional processing code 


So 'field2' doesn't seem to be valid (even though that's the name of the column in the database and when you do '{vb:raw bbuserinfo.field2}')...should i call it by a different syntax? or do i need to define things in $validfields (the documentation does not explain how exactly this is done)?

I would be very grateful if anyone could point me in the right direction here!

Badshah93 06-05-2012 10:43 AM

When you updating any existing data using datamanager then you need to call
set_existing function first.

Try This Code: (Run this code after registration is complete)

PHP Code:

$userdata =& datamanager_init('User'$vbulletinERRTYPE_STANDARD);
    
$userdata->set_existing($vbulletin->userinfo);

        
$userfields = array('field2' => $vbulletin->GPC['cfield_2'], 
                                    
'field6' => $vbulletin->GPC['cfield_6'], 
                                    
'field7' => $vbulletin->GPC['cfield_7']
                             );

        
// Saving Userfields Now

        
$userdata->set_userfields($userfields);

        
$newusergroupid 9
        
$userdata->set('usergroupid'$newusergroupid); 

        
$userdata->pre_save();  


         if (!empty(
$userdata->errors))  
        {  
              
$errorlist '';  
              foreach (
$userdata->errors AS $index => $error)  
             {  
                  
$errorlist .= "<li>$error</li>";  
             }  
      
              
// ... additional code; $errorlist is outputted to the user  
        
}  
       else  
       {  
             
// save the data  
            
$vbulletin->userinfo['userid']  = $userid  $userdata->save();  
          
             
// ... additional processing code  
       



christian.cloug 06-05-2012 06:11 PM

Badshah - thank you very much for your help, really appreciate it!

I've replaced with your code (and am running it after registration as you suggest), now I:
  • Don't get the same error as before
  • Don't get any errors of any kind
  • The usergroup for the user is updated properly to '9' as per the code
  • ?but unfortunately, the 3 custom profile fields are not updated...

I'm guessing that my problem may lie in the way the inputs from the user are handled, i.e. cfield_2, cfield_6 and cfield_7 - these are currently 3 text inputs on the previous page (named and ID'd like this), which are 'posted' to this page with the code we're discussing...

I'm sorry this is probably basic stuff - do I need to declare these posted variables at all on this page or anything?

Thank you for your time.

Badshah93 06-05-2012 06:43 PM

do one thing

put this code at bottom of the script which i gave you and see if you get any output on top of page
PHP Code:

print_r($userfields); 

and as you said that you have extended registration process by one step, which plugin you used for that ?

i would have used
PHP Code:

register_addmember_complete 

Code:
PHP Code:

if ($newusergroupid == 2// or any other condition which you want
{
    
$_REQUEST['do'] = 'register2';   // Extended Step



christian.cloug 06-05-2012 07:20 PM

put in the print_r, it gives:


Array ( [field2] => [field6] => [field7] => [field2_opt] => [field6_opt] => [field7_opt] => )

Doesn't look good I know - any idea what i'm doing wrong? The form I submit to this code looks like this:

HTML Code:


<form id="signup_step2" action="../signup.php?do=3" method="post">

<div style="position:absolute;left:60px;top:180px;width:330px;">

<table class="sign-up_step_inputs_tighter" style="margin-top:30px;">
<tr>
<td style="font-weight:strong;width:75px;text-align:right;">Location</td>
<td><input type="text" id="cfield_2" name="cfield_2" onfocus="this.className='textbox_cn_focus';" onblur="this.className='textbox_cn';" class="textbox_cn"/></td>
</tr>
<tr>
<td style="font-weight:strong;text-align:right;">Latitude</td>
<td><input type="text" id="cfield_6" name="cfield_6" onfocus="this.className='textbox_cn_focus';" onblur="this.className='textbox_cn';" class="textbox_cn"/></td>
</tr>
<tr>
<td style="font-weight:strong;text-align:right;">Longitude</td>
<td><input type="text" id="cfield_7" name="cfield_7" onfocus="this.className='textbox_cn_focus';" onblur="this.className='textbox_cn';" class="textbox_cn"/></td>
</tr>
</table>

<div style="width:100%;text-align:right;">
    <input type="hidden" name="securitytoken" value="{vb:raw bbuserinfo.securitytoken}" />
    <input id="submit_sign-up" type="submit" tabindex="104" value="Next Step" style="color:white;"/>
</div>

</form>

i'm extending registration by a round-the-back way (really just an amateur improvisation) - I've reduced register.php to just username, password and email, and then once they've done this and completed email activation, I use the plugin 'Register Redirect' (https://vborg.vbsupport.ru/showthread.php?t=242351) to send to a custom vbulletin powered page where I show them various inputs to complete the custom fields of their profile... My plan is to somehow use user groups to limit users who haven't completed the extended steps to seeing anything else on the site (even though they are actually 'registered')...

You mention 'register_addmember_complete', is that something to do with cookies? Think I should be going down a different route?

Again, thanks a lot for your help here!

Badshah93 06-05-2012 07:26 PM

Use This Code in signup.php script

PHP Code:

if ($_POST['do'] == '3')
{

   
$vbulletin->input->clean_array_gpc('p', array( 
    
'cfield_2' => TYPE_NOHTML
    
'cfield_6' => TYPE_INT
    
'cfield_7' => TYPE_INT 
)); 
   
$userdata =& datamanager_init('User'$vbulletinERRTYPE_STANDARD);
    
$userdata->set_existing($vbulletin->userinfo);

        
$userfields = array('field2' => $vbulletin->GPC['cfield_2'], 
                                    
'field6' => $vbulletin->GPC['cfield_6'], 
                                    
'field7' => $vbulletin->GPC['cfield_7']
                             );

        
// Saving Userfields Now

        
$userdata->set_userfields($userfields);

        
$userdata->set('usergroupid'9); 

        
$userdata->pre_save();  


         if (!empty(
$userdata->errors))  
        {  
              
$errorlist '';  
              foreach (
$userdata->errors AS $index => $error)  
             {  
                  
$errorlist .= "<li>$error</li>";  
             }  
      
              
// ... additional code; $errorlist is outputted to the user  
        
}  
       else  
       {  
             
// save the data  
            
$vbulletin->userinfo['userid']  = $userid  $userdata->save();  
          
             
// ... additional processing code  
       
}  



christian.cloug 06-05-2012 07:39 PM

Problem solved, many thanks!


All times are GMT. The time now is 12:10 AM.

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, vBulletin Solutions Inc.

X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.01790 seconds
  • Memory Usage 1,792KB
  • Queries Executed 10 (?)
More Information
Template Usage:
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)bbcode_html_printable
  • (6)bbcode_php_printable
  • (1)footer
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (6)option
  • (1)post_thanks_navbar_search
  • (1)printthread
  • (7)printthreadbit
  • (1)spacer_close
  • (1)spacer_open 

Phrase Groups Available:
  • global
  • postbit
  • showthread
Included Files:
  • ./printthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/class_bbcode_alt.php
  • ./includes/class_bbcode.php
  • ./includes/functions_bigthree.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • printthread_start
  • bbcode_fetch_tags
  • bbcode_create
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • printthread_post
  • printthread_complete