<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul, pre { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[BuddyPress] [3346] trunk: Adds meta functions for xprofile field groups,
  fields, and individual data items.</title>
</head>
<body>

<div id="msg">
<dl>
<dt>Revision</dt> <dd>3346</dd>
<dt>Author</dt> <dd>boonebgorges</dd>
<dt>Date</dt> <dd>2010-11-03 23:14:43 +0000 (Wed, 03 Nov 2010)</dd>
</dl>

<h3>Log Message</h3>
<pre>Adds meta functions for xprofile field groups, fields, and individual data items. Fixes #671</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkbpcoreadminbpcoreschemaphp">trunk/bp-core/admin/bp-core-schema.php</a></li>
<li><a href="#trunkbpxprofilephp">trunk/bp-xprofile.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkbpcoreadminbpcoreschemaphp"></a>
<div class="modfile"><h4>Modified: trunk/bp-core/admin/bp-core-schema.php (3345 => 3346)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-core/admin/bp-core-schema.php        2010-11-03 22:54:05 UTC (rev 3345)
+++ trunk/bp-core/admin/bp-core-schema.php        2010-11-03 23:14:43 UTC (rev 3346)
</span><span class="lines">@@ -227,7 +227,7 @@
</span><span class="cx">                             KEY can_delete (can_delete),
</span><span class="cx">                             KEY is_required (is_required)
</span><span class="cx">                            ) {$charset_collate};&quot;;
</span><del>-
</del><ins>+                
</ins><span class="cx">         $sql[] = &quot;CREATE TABLE {$wpdb-&gt;base_prefix}bp_xprofile_data (
</span><span class="cx">                             id bigint(20) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
</span><span class="cx">                             field_id bigint(20) unsigned NOT NULL,
</span><span class="lines">@@ -238,6 +238,16 @@
</span><span class="cx">                             KEY user_id (user_id)
</span><span class="cx">                            ) {$charset_collate};&quot;;
</span><span class="cx"> 
</span><ins>+        $sql[] = &quot;CREATE TABLE {$wpdb-&gt;base_prefix}bp_xprofile_meta (
+                                id bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+                                object_id bigint(20) NOT NULL,
+                                object_type varchar(150) NOT NULL,
+                                meta_key varchar(255) DEFAULT NULL,
+                                meta_value longtext DEFAULT NULL,
+                                KEY object_id (object_id),
+                                KEY meta_key (meta_key)
+                              ) {$charset_collate};&quot;;
+
</ins><span class="cx">         dbDelta( $sql );
</span><span class="cx"> 
</span><span class="cx">         /* Insert the default group and fields */
</span></span></pre></div>
<a id="trunkbpxprofilephp"></a>
<div class="modfile"><h4>Modified: trunk/bp-xprofile.php (3345 => 3346)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-xprofile.php        2010-11-03 22:54:05 UTC (rev 3345)
+++ trunk/bp-xprofile.php        2010-11-03 23:14:43 UTC (rev 3346)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx">         $bp-&gt;profile-&gt;table_name_data   = $bp-&gt;table_prefix . 'bp_xprofile_data';
</span><span class="cx">         $bp-&gt;profile-&gt;table_name_groups = $bp-&gt;table_prefix . 'bp_xprofile_groups';
</span><span class="cx">         $bp-&gt;profile-&gt;table_name_fields = $bp-&gt;table_prefix . 'bp_xprofile_fields';
</span><ins>+        $bp-&gt;profile-&gt;table_name_meta        = $bp-&gt;table_prefix . 'bp_xprofile_meta';
</ins><span class="cx"> 
</span><span class="cx">         $bp-&gt;profile-&gt;format_notification_function = 'xprofile_format_notifications';
</span><span class="cx"> 
</span><span class="lines">@@ -908,7 +909,136 @@
</span><span class="cx"> add_action( 'delete_user', 'xprofile_remove_data' );
</span><span class="cx"> add_action( 'make_spam_user', 'xprofile_remove_data' );
</span><span class="cx"> 
</span><ins>+/*** XProfile Meta ****************************************************/
</ins><span class="cx"> 
</span><ins>+function bp_xprofile_delete_meta( $object_id, $object_type, $meta_key = false, $meta_value = false ) {
+        global $wpdb, $bp;
+
+        $object_id = (int) $object_id;
+
+        if ( !$object_id )
+                return false;
+        
+        if ( !isset( $object_type ) )
+                return false;
+        
+        if ( !in_array( $object_type, array( 'group', 'field', 'data' ) ) )
+                return false;
+
+        $meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key);
+
+        if ( is_array($meta_value) || is_object($meta_value) )
+                $meta_value = serialize($meta_value);
+
+        $meta_value = trim( $meta_value );
+
+        if ( !$meta_key ) {
+                $wpdb-&gt;query( $wpdb-&gt;prepare( &quot;DELETE FROM &quot; . $bp-&gt;profile-&gt;table_name_meta . &quot; WHERE object_id = %d AND object_type = %s&quot;, $object_id, $object_type ) );
+        } else if ( $meta_value ) {
+                $wpdb-&gt;query( $wpdb-&gt;prepare( &quot;DELETE FROM &quot; . $bp-&gt;profile-&gt;table_name_meta . &quot; WHERE object_id = %d AND object_type = %s AND meta_key = %s AND meta_value = %s&quot;, $object_id, $object_type, $meta_key, $meta_value ) );
+        } else {
+                $wpdb-&gt;query( $wpdb-&gt;prepare( &quot;DELETE FROM &quot; . $bp-&gt;profile-&gt;table_name_meta . &quot; WHERE object_id = %d AND object_type = %s AND meta_key = %s&quot;, $object_id, $object_type, $meta_key ) );
+        }
+
+        /* Delete the cached object */
+        wp_cache_delete( 'bp_xprofile_meta_' . $object_type . '_' . $object_id . '_' . $meta_key, 'bp' );
+
+        return true;
+}
+
+function bp_xprofile_get_meta( $object_id, $object_type, $meta_key = '') {
+        global $wpdb, $bp;
+
+        $object_id = (int) $object_id;
+
+        if ( !$object_id )
+                return false;
+        
+        if ( !isset( $object_type ) )
+                return false;
+        
+        if ( !in_array( $object_type, array( 'group', 'field', 'data' ) ) )
+                return false;
+
+        if ( !empty($meta_key) ) {
+                $meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key);
+
+                if ( !$metas = wp_cache_get( 'bp_xprofile_meta_' . $object_type . '_' . $object_id . '_' . $meta_key, 'bp' ) ) {
+                        $metas = $wpdb-&gt;get_col( $wpdb-&gt;prepare(&quot;SELECT meta_value FROM &quot; . $bp-&gt;profile-&gt;table_name_meta . &quot; WHERE object_id = %d AND object_type = %s AND meta_key = %s&quot;, $object_id, $object_type, $meta_key) );
+                        wp_cache_set( 'bp_xprofile_meta_' . $object_type . '_' . $object_id . '_' . $meta_key, $metas, 'bp' );
+                }
+        } else {
+                $metas = $wpdb-&gt;get_col( $wpdb-&gt;prepare(&quot;SELECT meta_value FROM &quot; . $bp-&gt;profile-&gt;table_name_meta . &quot; WHERE object_id = %d AND object_type = %s&quot;, $object_id, $object_type ) );
+        }
+
+        if ( empty($metas) ) {
+                if ( empty($meta_key) )
+                        return array();
+                else
+                        return '';
+        }
+
+        $metas = array_map('maybe_unserialize', (array)$metas);
+
+        if ( 1 == count($metas) )
+                return $metas[0];
+        else
+                return $metas;
+}
+
+function bp_xprofile_update_meta( $object_id, $object_type, $meta_key, $meta_value ) {
+        global $wpdb, $bp;
+
+        $object_id = (int) $object_id;
+
+        if ( !$object_id )
+                return false;
+        
+        if ( !isset( $object_type ) )
+                return false;
+        
+        if ( !in_array( $object_type, array( 'group', 'field', 'data' ) ) )
+                return false;
+                
+        $meta_key = preg_replace( '|[^a-z0-9_]|i', '', $meta_key );
+
+        if ( is_string($meta_value) )
+                $meta_value = stripslashes($wpdb-&gt;escape($meta_value));
+
+        $meta_value = maybe_serialize($meta_value);
+
+        if (empty($meta_value)) {
+                return bp_xprofile_delete_meta( $object_id, $object_type, $meta_key );
+        }
+        
+        $cur = $wpdb-&gt;get_row( $wpdb-&gt;prepare( &quot;SELECT * FROM &quot; . $bp-&gt;profile-&gt;table_name_meta . &quot; WHERE object_id = %d AND object_type = %s AND meta_key = %s&quot;, $object_id, $object_type, $meta_key ) );
+
+        if ( !$cur ) {
+                $wpdb-&gt;query( $wpdb-&gt;prepare( &quot;INSERT INTO &quot; . $bp-&gt;profile-&gt;table_name_meta . &quot; ( object_id, object_type, meta_key, meta_value ) VALUES ( %d, %s, %s, %s )&quot;, $object_id, $object_type,  $meta_key, $meta_value ) );
+        } else if ( $cur-&gt;meta_value != $meta_value ) {
+                $wpdb-&gt;query( $wpdb-&gt;prepare( &quot;UPDATE &quot; . $bp-&gt;profile-&gt;table_name_meta . &quot; SET meta_value = %s WHERE object_id = %d AND object_type = %s AND meta_key = %s&quot;, $meta_value, $object_id, $object_type, $meta_key ) );
+        } else {
+                return false;
+        }
+
+        /* Update the cached object and recache */
+        wp_cache_set( 'bp_xprofile_meta_' . $object_type . '_' . $object_id . '_' . $meta_key, $meta_value, 'bp' );
+
+        return true;
+}
+
+function bp_xprofile_update_fieldgroup_meta( $field_group_id, $meta_key, $meta_value ) {
+        return bp_xprofile_update_meta( $field_group_id, 'group', $meta_key, $meta_value );        
+}
+
+function bp_xprofile_update_field_meta( $field_id, $meta_key, $meta_value ) {
+        return bp_xprofile_update_meta( $field_id, 'field', $meta_key, $meta_value );        
+}
+
+function bp_xprofile_update_fielddata_meta( $field_data_id, $meta_key, $meta_value ) {
+        return bp_xprofile_update_meta( $field_data_id, 'data', $meta_key, $meta_value );        
+}
+
</ins><span class="cx"> /********************************************************************************
</span><span class="cx">  * Caching
</span><span class="cx">  *
</span></span></pre>
</div>
</div>

</body>
</html>