<!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][10557] trunk/src/bp-xprofile: Introduced 'Autolink' setting for XProfile fields.</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" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="http://buddypress.trac.wordpress.org/changeset/10557">10557</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"http://buddypress.trac.wordpress.org/changeset/10557","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>boonebgorges</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2016-02-08 16:52:44 +0000 (Mon, 08 Feb 2016)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Introduced 'Autolink' setting for XProfile fields.

Since BP 1.1, XProfile fields have been "autolinked". This means that a user's
entry for profile fields is linked to a search of the Members directory, using
that field's value as a search term. For short values - say, "Wichita, KS" for
the field "City" - the entire field value would be a link to a member search
on the phrase "Wichita, KS". For longer values, as in a multiline text field,
an algorithm detects "lists" (words between commas) and creates links
from them.

This feature was intended to aid in user discovery and serendipity. Sometimes
it works. But sometimes it makes very little sense.

This changeset introduces the ability for administrators to configure this
setting, on a per-field basis.

* The new Autolink metabox on the XProfile Field Admin panel lets admin enable or disable the feature.
* Smart defaults are pre-selected for new fields, or fields for which no value has yet to be saved. Namely: "multi fields" like checkboxes and radio buttons have Autolink enabled by default, while "single fields" have it disabled.

Props LenLay, sooskriszta, jeffsayre, boonebgorges.
Fixes <a href="http://buddypress.trac.wordpress.org/ticket/787">#787</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcbpxprofileadminjsadminjs">trunk/src/bp-xprofile/admin/js/admin.js</a></li>
<li><a href="#trunksrcbpxprofilebpxprofileadminphp">trunk/src/bp-xprofile/bp-xprofile-admin.php</a></li>
<li><a href="#trunksrcbpxprofilebpxprofilecssjsphp">trunk/src/bp-xprofile/bp-xprofile-cssjs.php</a></li>
<li><a href="#trunksrcbpxprofilebpxprofilefiltersphp">trunk/src/bp-xprofile/bp-xprofile-filters.php</a></li>
<li><a href="#trunksrcbpxprofileclassesclassbpxprofilefieldphp">trunk/src/bp-xprofile/classes/class-bp-xprofile-field.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcbpxprofileadminjsadminjs"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-xprofile/admin/js/admin.js</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-xprofile/admin/js/admin.js   2016-02-08 09:31:52 UTC (rev 10556)
+++ trunk/src/bp-xprofile/admin/js/admin.js     2016-02-08 16:52:44 UTC (rev 10557)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -76,13 +76,24 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @param {string} forWhat Value of the field to show options for
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function show_options( forWhat ) {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        var do_autolink;
+
</ins><span class="cx" style="display: block; padding: 0 10px">         for ( var i = 0; i < XProfileAdmin.supports_options_field_types.length; i++ ) {
</span><span class="cx" style="display: block; padding: 0 10px">                document.getElementById( XProfileAdmin.supports_options_field_types[i] ).style.display = 'none';
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( XProfileAdmin.supports_options_field_types.indexOf( forWhat ) >= 0 ) {
</span><span class="cx" style="display: block; padding: 0 10px">                document.getElementById( forWhat ).style.display = '';
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                do_autolink = 'on';
+       } else {
+               jQuery( '#do-autolink' ).val( '' );
+               do_autolink = '';
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       // Only overwrite the do_autolink setting if no setting is saved in the database.
+       if ( '' === XProfileAdmin.do_autolink ) {
+               jQuery( '#do-autolink' ).val( do_autolink );
+       }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> function hide( id ) {
</span></span></pre></div>
<a id="trunksrcbpxprofilebpxprofileadminphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-xprofile/bp-xprofile-admin.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-xprofile/bp-xprofile-admin.php       2016-02-08 09:31:52 UTC (rev 10556)
+++ trunk/src/bp-xprofile/bp-xprofile-admin.php 2016-02-08 16:52:44 UTC (rev 10557)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -415,6 +415,15 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                        bp_xprofile_delete_meta( $field_id, 'field', 'signup_position' );
</span><span class="cx" style="display: block; padding: 0 10px">                                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                // Save autolink settings.
+                               if ( 1 != $field_id ) {
+                                       if ( isset( $_POST['do_autolink'] ) && 'on' === wp_unslash( $_POST['do_autolink'] ) ) {
+                                               bp_xprofile_update_field_meta( $field_id, 'do_autolink', 'on' );
+                                       } else {
+                                               bp_xprofile_update_field_meta( $field_id, 'do_autolink', 'off' );
+                                       }
+                               }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                                 /**
</span><span class="cx" style="display: block; padding: 0 10px">                                 * Fires at the end of the process to save a field for a user, if successful.
</span><span class="cx" style="display: block; padding: 0 10px">                                 *
</span></span></pre></div>
<a id="trunksrcbpxprofilebpxprofilecssjsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-xprofile/bp-xprofile-cssjs.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-xprofile/bp-xprofile-cssjs.php       2016-02-08 09:31:52 UTC (rev 10556)
+++ trunk/src/bp-xprofile/bp-xprofile-cssjs.php 2016-02-08 16:52:44 UTC (rev 10557)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -52,6 +52,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                // "please enter options for this field" section.
</span><span class="cx" style="display: block; padding: 0 10px">                $strings = array(
</span><span class="cx" style="display: block; padding: 0 10px">                        'supports_options_field_types' => array(),
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        'do_autolink' => '',
</ins><span class="cx" style="display: block; padding: 0 10px">                 );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                foreach ( bp_xprofile_get_field_types() as $field_type => $field_type_class ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -61,6 +62,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                // Load 'autolink' setting into JS so that we can provide smart defaults when switching field type.
+               if ( ! empty( $_GET['field_id'] ) ) {
+                       $field_id = intval( $_GET['field_id'] );
+
+                       // Pull the raw data from the DB so we can tell whether the admin has saved a value yet.
+                       $strings['do_autolink'] = bp_xprofile_get_meta( $field_id, 'field', 'do_autolink' );
+               }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                 wp_localize_script( 'xprofile-admin-js', 'XProfileAdmin', $strings );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre></div>
<a id="trunksrcbpxprofilebpxprofilefiltersphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-xprofile/bp-xprofile-filters.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-xprofile/bp-xprofile-filters.php     2016-02-08 09:31:52 UTC (rev 10556)
+++ trunk/src/bp-xprofile/bp-xprofile-filters.php       2016-02-08 16:52:44 UTC (rev 10557)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -328,8 +328,12 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * - Not run on datebox field types.
</span><span class="cx" style="display: block; padding: 0 10px">  * - Not run on values without commas with less than 5 words.
</span><span class="cx" style="display: block; padding: 0 10px">  * - URL's are made clickable.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * - To disable: remove_filter( 'bp_get_the_profile_field_value', 'xprofile_filter_link_profile_data', 9, 2 );
</del><span class="cx" style="display: block; padding: 0 10px">  *
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * To disable globally:
+ *     remove_filter( 'bp_get_the_profile_field_value', 'xprofile_filter_link_profile_data', 9, 3 );
+ *
+ * To disable for a single field, use the 'Autolink' settings in Dashboard > Users > Profile Fields.
+ *
</ins><span class="cx" style="display: block; padding: 0 10px">  * @since 1.1.0
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @param string $field_value Profile field data value.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -337,7 +341,12 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @return string
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function xprofile_filter_link_profile_data( $field_value, $field_type = 'textbox' ) {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        global $field;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        if ( ! $field->get_do_autolink() ) {
+               return $field_value;
+       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( 'datebox' === $field_type ) {
</span><span class="cx" style="display: block; padding: 0 10px">                return $field_value;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span></span></pre></div>
<a id="trunksrcbpxprofileclassesclassbpxprofilefieldphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-xprofile/classes/class-bp-xprofile-field.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-xprofile/classes/class-bp-xprofile-field.php 2016-02-08 09:31:52 UTC (rev 10556)
+++ trunk/src/bp-xprofile/classes/class-bp-xprofile-field.php   2016-02-08 16:52:44 UTC (rev 10557)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -130,6 +130,15 @@
</span><span class="cx" style="display: block; padding: 0 10px">        protected $allow_custom_visibility;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         * Whether values from this field are autolinked to directory searches.
+        *
+        * @since 2.5.0
+        *
+        * @var bool
+        */
+       public $do_autolink;
+
+       /**
</ins><span class="cx" style="display: block; padding: 0 10px">          * Field type option.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 2.0.0
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -792,6 +801,31 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $this->allow_custom_visibility;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Get whether the field values should be auto-linked to a directory search.
+        *
+        * Lazy-loaded to reduce overhead.
+        *
+        * Defaults to true for multi and default fields, false for single fields.
+        *
+        * @since 2.5.0
+        *
+        * @return bool
+        */
+       public function get_do_autolink() {
+               if ( ! isset( $this->do_autolink ) ) {
+                       $do_autolink = bp_xprofile_get_meta( $this->id, 'field', 'do_autolink' );
+
+                       if ( '' === $do_autolink ) {
+                               $this->do_autolink = $this->is_default_field() || $this->type_obj->supports_options;
+                       } else {
+                               $this->do_autolink = 'on' === $do_autolink;
+                       }
+               }
+
+               return $this->do_autolink;
+       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">         /* Static Methods ********************************************************/
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1138,6 +1172,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                                        // Output the field visibility metaboxes.
</span><span class="cx" style="display: block; padding: 0 10px">                                                        $this->visibility_metabox();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                                        // Output the autolink metabox.
+                                                       $this->autolink_metabox();
+
+
</ins><span class="cx" style="display: block; padding: 0 10px">                                                         /**
</span><span class="cx" style="display: block; padding: 0 10px">                                                         * Fires after XProfile Field sidebar metabox.
</span><span class="cx" style="display: block; padding: 0 10px">                                                         *
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1411,6 +1449,41 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         * Private method used to output autolink metabox.
+        *
+        * @since 2.5.0
+        *
+        * @return void If default field id 1.
+        */
+       private function autolink_metabox() {
+
+               // Default field cannot have custom visibility.
+               if ( true === $this->is_default_field() ) {
+                       return;
+               }
+
+               ?>
+
+               <div class="postbox">
+                       <h2><label for="do-autolink"><?php esc_html_e( 'Autolink', 'buddypress' ); ?></label></h2>
+                       <div class="inside">
+                               <p class="description"><?php esc_html_e( 'On user profiles, link this field to a search of the Members directory, using the field value as a search term:', 'buddypress' ); ?></p>
+
+                               <p>
+                                       <label>
+                                               <select name="do_autolink" id="do-autolink">
+                                                       <option value="on" <?php selected( $this->get_do_autolink() ); ?>><?php esc_html_e( 'Enabled', 'buddypress' ); ?></option>
+                                                       <option value="" <?php selected( $this->get_do_autolink(), false ); ?>><?php esc_html_e( 'Disabled', 'buddypress' ); ?></option>
+                                               </select>
+                                       </label>
+                               </p>
+                       </div>
+               </div>
+
+               <?php
+       }
+
+       /**
</ins><span class="cx" style="display: block; padding: 0 10px">          * Output the metabox for setting what type of field this is.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 2.3.0
</span></span></pre>
</div>
</div>

</body>
</html>