<!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" />
<title>[BuddyPress][8336] trunk: xProfile: prevent duplicate profile field templating when using pre-2.0 custom field types.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { 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 #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#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>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://buddypress.trac.wordpress.org/changeset/8336">8336</a></dd>
<dt>Author</dt> <dd>djpaul</dd>
<dt>Date</dt> <dd>2014-05-01 22:33:57 +0000 (Thu, 01 May 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>xProfile: prevent duplicate profile field templating when using pre-2.0 custom field types.

Prior to the xProfile field type overhaul in 2.0, plugins that added custom field types had to do so with a variety of actions.
One such plugin is "Buddypress Xprofile Custom Fields Type" and the changes in 2.0 caused an issue where the plugin's custom
templating was being rendered, alongside BuddyPress' profile field fallback type, the textbox.

BuddyPress uses a fallback field type to handle situations when extra profile types/data are provided by another plugin, and
then that plugin is removed. The original idea was that everything would fallback to rendering a textbox if a field type was
unregistered to give at least some kind of access to that profile field's data, but in practice this has caused a couple of
issues with templating, as this commit addresses.

This change essentially reverts the fallback behaviour to the pre-2.0 implementation: if a custom field type is unknown to
BuddyPress, that field simply won't be rendered.

Fixes <a href="http://buddypress.trac.wordpress.org/ticket/5589">#5589</a></pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkbpxprofilebpxprofileclassesphp">trunk/bp-xprofile/bp-xprofile-classes.php</a></li>
<li><a href="#trunkbpxprofilebpxprofilefunctionsphp">trunk/bp-xprofile/bp-xprofile-functions.php</a></li>
<li><a href="#trunkteststestcasesxprofileclassbpxprofilefieldtypephp">trunk/tests/testcases/xprofile/class-bp-xprofile-field-type.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkbpxprofilebpxprofileclassesphp"></a>
<div class="modfile"><h4>Modified: trunk/bp-xprofile/bp-xprofile-classes.php (8335 => 8336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-xprofile/bp-xprofile-classes.php        2014-05-01 01:58:27 UTC (rev 8335)
+++ trunk/bp-xprofile/bp-xprofile-classes.php   2014-05-01 22:33:57 UTC (rev 8336)
</span><span class="lines">@@ -2497,6 +2497,51 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> /**
</span><ins>+ * A placeholder xprofile field type. Doesn't do anything.
+ *
+ * Used if an existing field has an unknown type (e.g. one provided by a missing third-party plugin).
+ *
+ * @since BuddyPress (2.0.1)
+ */
+class BP_XProfile_Field_Type_Placeholder extends BP_XProfile_Field_Type {
+
+       /**
+        * Constructor for the placeholder field type.
+        *
+        * @since BuddyPress (2.0.1)
+        */
+       public function __construct() {
+       }
+
+       /**
+        * Prevent any HTML being output for this field type.
+        *
+        * @param array $raw_properties Optional key/value array of {@link http://dev.w3.org/html5/markup/input.text.html permitted attributes} that you want to add.
+        * @since BuddyPress (2.0.1)
+        */
+       public function edit_field_html( array $raw_properties = array() ) {
+       }
+
+       /**
+        * Prevent any HTML being output for this field type.
+        *
+        * @param array $raw_properties Optional key/value array of permitted attributes that you want to add.
+        * @since BuddyPress (2.0.1)
+        */
+       public function admin_field_html( array $raw_properties = array() ) {
+       }
+
+       /**
+        * Prevent any HTML being output for this field type.
+        *
+        * @param BP_XProfile_Field $current_field The current profile field on the add/edit screen.
+        * @param string $control_type Optional. HTML input type used to render the current field's child options.
+        * @since BuddyPress (2.0.1)
+        */
+       public function admin_new_field_html( BP_XProfile_Field $current_field, $control_type = '' ) {}
+}
+
+/**
</ins><span class="cx">  * Represents a type of XProfile field and holds meta information about the type of value that it accepts.
</span><span class="cx">  *
</span><span class="cx">  * @since BuddyPress (2.0.0)
</span></span></pre></div>
<a id="trunkbpxprofilebpxprofilefunctionsphp"></a>
<div class="modfile"><h4>Modified: trunk/bp-xprofile/bp-xprofile-functions.php (8335 => 8336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-xprofile/bp-xprofile-functions.php      2014-05-01 01:58:27 UTC (rev 8335)
+++ trunk/bp-xprofile/bp-xprofile-functions.php 2014-05-01 22:33:57 UTC (rev 8336)
</span><span class="lines">@@ -95,13 +95,12 @@
</span><span class="cx">  $class = isset( $field[$type] ) ? $field[$type] : '';
</span><span class="cx"> 
</span><span class="cx">  /**
</span><del>-        * For backpat and to handle (missing) field types introduced by other plugins, fallback to
-        * textbox if a type is unknown. Textbox validation and display is intentionally low key.
</del><ins>+         * To handle (missing) field types, fallback to a placeholder field object if a type is unknown.
</ins><span class="cx">    */
</span><span class="cx">  if ( $class && class_exists( $class ) ) {
</span><span class="cx">          return new $class;
</span><span class="cx">  } else {
</span><del>-               return new BP_XProfile_Field_Type_Textbox;
</del><ins>+                return new BP_XProfile_Field_Type_Placeholder;
</ins><span class="cx">   }
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkteststestcasesxprofileclassbpxprofilefieldtypephp"></a>
<div class="modfile"><h4>Modified: trunk/tests/testcases/xprofile/class-bp-xprofile-field-type.php (8335 => 8336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/tests/testcases/xprofile/class-bp-xprofile-field-type.php  2014-05-01 01:58:27 UTC (rev 8335)
+++ trunk/tests/testcases/xprofile/class-bp-xprofile-field-type.php     2014-05-01 22:33:57 UTC (rev 8336)
</span><span class="lines">@@ -14,7 +14,7 @@
</span><span class="cx"> 
</span><span class="cx">  public function test_unregistered_field_type_returns_textbox() {
</span><span class="cx">          $field = bp_xprofile_create_field_type( 'fakeyfield' );
</span><del>-               $this->assertEquals( get_class( $field ), 'BP_XProfile_Field_Type_Textbox' );
</del><ins>+                $this->assertEquals( get_class( $field ), 'BP_XProfile_Field_Type_Placeholder' );
</ins><span class="cx">   }
</span><span class="cx"> 
</span><span class="cx">  public function test_textbox_validate_empty_string() {
</span></span></pre>
</div>
</div>

</body>
</html>