We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 23496
    • 20 Posts
    Hello,

    I successfully extended the modxUser, with inspiration through the tutorials in the rtfm and Bob's ClassExtender.
    Writing data to the added table works so far. For this I created a little snippet that works as hook in the Login UpdateProfile snippet.

    But, existing entries updated are not updated. With every profile update a new entry will be added to the table.

    Does anybody have an idea, what's going wrong?
    Thanks for helping smiley

    Greetings
    Florian


    This is the little snippet:

    // Basic Setup
    $defaultExtendUserCorePath = $modx->getOption('core_path').'components/extendeduser/';
    $extendUserCorePath = $modx->getOption('extendeduser.core_path',null,$defaultExtendUserCorePath);
    $modx->addPackage('extuser', $extendUserCorePath . 'model/');
    
    $user = NULL;
    $data = NULL;
    $user =& $modx->user;
    
    if (is_object($user)) {
      if(!($user instanceof extUser)) {
        $user->set('class_key', 'extUser');
        $user->save();
        //$user = $modx->getObject('extUser', $user->get('id'));
      } else {
    
        if ((!$data) && $user) {
          $data = $modx->newObject('ProfileData');
          $user->addOne($data);
        }
    
        $fields = array();
        if ($data) {
          $fields['firstname'] = $data->get('firstname');
          $fields['lastname']  = $data->get('lastname');
          $fields['title']     = $data->get('title');
    
          foreach ($fields as $key => $field) {
            if (empty($field)) {
              $fields[$key] = '';
            }
          }
        }
    
        if (!$submission) {
          $modx->request->sanitizeRequest();
          $dirty = false;
          foreach ($fields as $key => $value) {
            if ($hook->getValue($key)) {
              if ($value !== $hook->getValue($key)) {
                $data->set($key, $hook->getValue($key));
                $dirty = true;
              }
            }
          }
    
          if ($dirty) {
            //echo "dirty<br>";
            $user->save();
    
            if ($user->save() == false) {
              return false;
            } else {
              return true;
            }
          }
        }
      }
    }


    And the xml schema:
    <?xml version="1.0" encoding="UTF-8"?>
    <model package="extuser" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM">
      <object class="extUser" extends="modUser">
        <composite alias="Data" local="id" class="ProfileData" foreign="userdata_id" cardinality="one" owner="local"/>
        <composite alias="DataSocial" local="id" foreign="user" cardinality="many" owner="local"/>
        <composite alias="AuthorTitles" local="id" foreign="user" cardinality="many" owner="local"/>
      </object>
      
      <!-- Profile data table -->
      <object class="ProfileData" table="user_profile" extends="xPDOSimpleObject">
        <field key="userdata_id" dbtype="int" precision="11" phptype="integer" null="false" attributes="unsigned"/>
        <field key="firstname" dbtype="varchar" precision="100" phptype="string" null="true"/>
        <field key="lastname" dbtype="varchar" precision="100" phptype="string" null="true"/>
        <field key="title" dbtype="varchar" precision="100" phptype="string" null="true"/>
        <field key="pseudonym" dbtype="varchar" precision="100" phptype="string" null="true"/>
        <field key="affiliate" dbtype="varchar" precision="100" phptype="string" null="true"/>
        <index alias="userdata_id" name="userdata_id" primary="false" unique="true" type="BTREE">
          <column key="userdata_id" length="" collation="A" null="false"/>
        </index>
        <aggregate alias="extUser" local="userdata_id" foreign="id" cardinality="one" owner="foreign"/>
      </object>
      
      <!-- Socialmedia platforms -->
      <object table="user_profile_social" extends="xPDOSimpleObject">
        <field key="userdata_id" dbtype="int" precision="11" phptype="integer" null="false" attributes="unsigned"/>
        <field key="socialprofile" dbtype="varchar" precision="100" phptype="string" null="true"/>
        <field key="socialurl" dbtype="varchar" precision="100" phptype="string" null="true"/>
    
        <aggregate alias="extUser" local="user" foreign="id" cardinality="one" owner="foreign"/>
      </object>
      
      <!-- Booktitles -->
      <object table="user_author_titles" extends="xPDOSimpleObject">
        <field key="userdata_id" dbtype="int" precision="11" phptype="integer" null="false" attributes="unsigned"/>
        <field key="isbn" dbtype="varchar" precision="100" phptype="string" null="true"/>
        <field key="title" dbtype="varchar" precision="100" phptype="string" null="true"/>
        <field key="pseudonym" dbtype="varchar" precision="100" phptype="string" null="true"/>
        <field key="verlag" dbtype="varchar" precision="100" phptype="string" null="true"/>
        <field key="shortdesc" dbtype="text" phptype="string" null="true"/>
    
        <aggregate alias="extUser" local="user" foreign="id" cardinality="one" owner="foreign"/>
      </object>
    </model>
      • 3749
      • 24,544 Posts
      You need a $data = $user->getOne('Data'); somewhere above the if (!$data) line, otherwise if (!$data) is always going to be true. [ed. note: BobRay last edited this post 12 years, 6 months ago.]
        Did I help you? Buy me a beer
        Get my Book: MODX:The Official Guide
        MODX info for everyone: http://bobsguides.com/modx.html
        My MODX Extras
        Bob's Guides is now hosted at A2 MODX Hosting
        • 23496
        • 20 Posts
        Yeah, it's working now smiley Thank you, Bob!
          • 3749
          • 24,544 Posts
          Glad I could help. smiley
            Did I help you? Buy me a beer
            Get my Book: MODX:The Official Guide
            MODX info for everyone: http://bobsguides.com/modx.html
            My MODX Extras
            Bob's Guides is now hosted at A2 MODX Hosting