[ Index ]

PHP Cross Reference of BuddyPress

title

Body

[close]

/src/bp-xprofile/classes/ -> class-bp-xprofile-field-type-checkbox-acceptance.php (source)

   1  <?php
   2  /**
   3   * BuddyPress XProfile Classes.
   4   *
   5   * @package BuddyPress
   6   * @subpackage XProfileClasses
   7   * @since 8.0.0
   8   */
   9  
  10  // Exit if accessed directly.
  11  defined( 'ABSPATH' ) || exit;
  12  
  13  /**
  14   * Checkbox Acceptance xProfile field type.
  15   *
  16   * @since 8.0.0
  17   */
  18  class BP_XProfile_Field_Type_Checkbox_Acceptance extends BP_XProfile_Field_Type {
  19  
  20      /**
  21       * Checkbox Acceptance field's visibility setting.
  22       *
  23       * Defaults to 'adminsonly'. This property enforces Field's default visibility.
  24       *
  25       * @since 8.0.0
  26       *
  27       * @return string The Checkbox Acceptance field's visibility setting.
  28       */
  29      public $visibility = 'adminsonly';
  30  
  31      /**
  32       * Supported features for the Checkbox Acceptance field type.
  33       *
  34       * @since 8.0.0
  35       * @var bool[] The WordPress field supported features.
  36       */
  37      public static $supported_features = array(
  38          'switch_fieldtype'        => false,
  39          'required'                => true,
  40          'do_autolink'             => false,
  41          'allow_custom_visibility' => false,
  42          'member_types'            => false,
  43      );
  44  
  45      /**
  46       * Constructor for the Checkbox Acceptance field type.
  47       *
  48       * @since 8.0.0
  49       */
  50  	public function __construct() {
  51          parent::__construct();
  52  
  53          $this->name     = _x( 'Checkbox Acceptance', 'xprofile field type', 'buddypress' );
  54          $this->category = _x( 'Single Fields', 'xprofile field type category', 'buddypress' );
  55  
  56          $this->supports_options    = false;
  57          $this->do_settings_section = true;
  58          $this->accepts_null_value  = false;
  59  
  60          $this->set_format( '/^.+$/', 'replace' );
  61  
  62          /**
  63           * Fires inside __construct() method for bp_xprofile_field_type_checkbox_acceptance class.
  64           *
  65           * @since 8.0.0
  66           *
  67           * @param BP_XProfile_Field_Type_Checkbox_Acceptance $this Current instance of the Checkbox Acceptance field type.
  68           */
  69          do_action( 'bp_xprofile_field_type_checkbox_acceptance', $this );
  70  
  71          // Make sure it's not possible to edit an accepted Checkbox Acceptance field.
  72          add_filter( 'bp_xprofile_set_field_data_pre_validate', array( $this, 'enforce_field_value' ), 10, 2 );
  73      }
  74  
  75  
  76      /**
  77       * Output the edit field HTML for this field type.
  78       *
  79       * Must be used inside the {@link bp_profile_fields()} template loop.
  80       *
  81       * @since 8.0.0
  82       *
  83       * @param array $raw_properties Optional key/value array of
  84       * {@link http://dev.w3.org/html5/markup/textarea.html permitted attributes}
  85       *  that you want to add.
  86       */
  87  	public function edit_field_html( array $raw_properties = array() ) {
  88          $user_id   = bp_displayed_user_id();
  89          $required  = false;
  90          $default_r = array();
  91  
  92          if ( isset( $raw_properties['user_id'] ) ) {
  93              $user_id = (int) $raw_properties['user_id'];
  94              unset( $raw_properties['user_id'] );
  95          }
  96  
  97          if ( bp_get_the_profile_field_is_required() ) {
  98              $default_r['required'] = 'required'; // HTML5 required attribute.
  99              $required              = true;
 100          }
 101  
 102          $r = bp_parse_args(
 103              $raw_properties,
 104              $default_r,
 105              'checkbox_acceptance'
 106          );
 107          ?>
 108          <legend>
 109              <?php bp_the_profile_field_name(); ?>
 110              <?php bp_the_profile_field_required_label(); ?>
 111          </legend>
 112  
 113          <?php
 114          /** This action is documented in bp-xprofile/bp-xprofile-classes */
 115          do_action( bp_get_the_profile_field_errors_action() );
 116  
 117          $r['user_id'] = $user_id;
 118          bp_the_profile_field_options( $r );
 119          ?>
 120  
 121          <?php if ( bp_get_the_profile_field_description() ) : ?>
 122              <p class="description" tabindex="0"><?php bp_the_profile_field_description(); ?></p>
 123          <?php endif;
 124      }
 125  
 126      /**
 127       * Field html for Admin-> User->Profile Fields screen.
 128       *
 129       * @since 8.0.0
 130       *
 131       * @param array $raw_properties properties.
 132       */
 133  	public function admin_field_html( array $raw_properties = array() ) {
 134          $page_id   = bp_xprofile_get_meta( bp_get_the_profile_field_id(), 'field', 'bp_xprofile_checkbox_acceptance_page', true );
 135          $page      = null;
 136          $default_r = array( 'type' => 'checkbox' );
 137  
 138          if ( bp_get_the_profile_field_is_required() ) {
 139              $default_r['required'] = 'required'; // HTML5 required attribute.
 140          }
 141  
 142          $r = bp_parse_args(
 143              $raw_properties,
 144              $default_r,
 145              'checkbox_acceptance'
 146          );
 147  
 148          if ( $page_id ) {
 149              $page = get_post( $page_id );
 150          }
 151          ?>
 152  
 153          <?php if ( $page instanceof WP_Post ) : ?>
 154              <label for="<?php bp_the_profile_field_input_name(); ?>">
 155                  <input <?php echo $this->get_edit_field_html_elements( $r ); ?>>
 156                  <?php
 157                  printf(
 158                      /* translators: %s: link to the page the user needs to accept the terms of. */
 159                      esc_html__( 'I agree to %s.', 'buddypress' ),
 160                      '<a href="' . esc_url( get_permalink( $page ) ) . '">' . esc_html( get_the_title( $page ) ) . '</a>'
 161                  );
 162                  ?>
 163              </label>
 164          <?php endif;
 165      }
 166  
 167      /**
 168       * Admin new field screen.
 169       *
 170       * @since 8.0.0
 171       *
 172       * @param BP_XProfile_Field $current_field Profile field object.
 173       * @param string            $control_type  Control type.
 174       */
 175  	public function admin_new_field_html( BP_XProfile_Field $current_field, $control_type = '' ) {
 176          $type = array_search( get_class( $this ), bp_xprofile_get_field_types() );
 177  
 178          if ( false === $type ) {
 179              return;
 180          }
 181  
 182          $class   = $current_field->type != $type ? 'display: none;' : '';
 183          $page_id = bp_xprofile_get_meta( $current_field->id, 'field', 'bp_xprofile_checkbox_acceptance_page', true );
 184          ?>
 185  
 186          <div id="<?php echo esc_attr( $type ); ?>" class="postbox bp-options-box" style="<?php echo esc_attr( $class ); ?> margin-top: 15px;">
 187              <h3><?php esc_html_e( 'Select the page the user needs to accept the terms of:', 'buddypress' ); ?></h3>
 188              <div class="inside">
 189                  <p>
 190                      <?php
 191                      echo wp_dropdown_pages(
 192                          array(
 193                              'name'             => 'bp_xprofile_checkbox_acceptance_page',
 194                              'echo'             => false,
 195                              'show_option_none' => __( '&mdash; Select &mdash;', 'buddypress' ),
 196                              'selected'         => $page_id ? $page_id : false,
 197                          )
 198                      );
 199  
 200                      $page = null;
 201                      if ( $page_id ) {
 202                          $page = get_post( $page_id );
 203                      }
 204                      ?>
 205  
 206                      <?php if ( $page instanceof WP_Post ) : ?>
 207  
 208                          <a href="<?php echo esc_url( get_permalink( $page ) ); ?>" class="button-secondary" target="_bp">
 209                              <?php esc_html_e( 'View', 'buddypress' ); ?> <span class="dashicons dashicons-external" aria-hidden="true" style="vertical-align: text-bottom;"></span>
 210                              <span class="screen-reader-text"><?php esc_html_e( '(opens in a new tab)', 'buddypress' ); ?></span>
 211                          </a>
 212  
 213                      <?php endif; ?>
 214                  </p>
 215              </div>
 216          </div>
 217          <?php
 218      }
 219  
 220      /**
 221       * Save settings from the field edit screen in the Dashboard.
 222       *
 223       * @since 8.0.0
 224       *
 225       * @param int   $field_id ID of the field.
 226       * @param array $settings Array of settings.
 227       * @return bool True on success.
 228       */
 229  	public function admin_save_settings( $field_id, $settings ) {
 230          if ( isset( $_POST['bp_xprofile_checkbox_acceptance_page'] ) ) {
 231              bp_xprofile_update_meta( $field_id, 'field', 'bp_xprofile_checkbox_acceptance_page', absint( wp_unslash( $_POST['bp_xprofile_checkbox_acceptance_page'] ) ) );
 232          }
 233  
 234          return true;
 235      }
 236  
 237      /**
 238       * Profile edit/register options html.
 239       *
 240       * @since 8.0.0
 241       *
 242       * @param array $args args.
 243       */
 244  	public function edit_field_options_html( array $args = array() ) {
 245          $field_id            = (int) $this->field_obj->id;
 246          $params              = bp_parse_args(
 247              $args,
 248              array(
 249                  'user_id' => bp_displayed_user_id(),
 250              )
 251          );
 252          $checkbox_acceptance = (int) maybe_unserialize( \BP_XProfile_ProfileData::get_value_byid( $field_id, $params['user_id'] ) );
 253  
 254          if ( ! empty( $_POST[ 'field_' . $field_id ] ) ) {
 255              $new_checkbox_acceptance = (int) wp_unslash( $_POST[ 'field_' . $field_id ] );
 256  
 257              if ( $checkbox_acceptance !== $new_checkbox_acceptance ) {
 258                  $checkbox_acceptance = $new_checkbox_acceptance;
 259              }
 260          }
 261  
 262          $r = array(
 263              'type'     => 'checkbox',
 264              'name'     => bp_get_the_profile_field_input_name(),
 265              'id'       => bp_get_the_profile_field_input_name(),
 266              'value'    => 1,
 267              'class'    => 'checkbox-acceptance',
 268          );
 269  
 270          if ( bp_get_the_profile_field_is_required() ) {
 271              $r['required'] = 'required'; // HTML5 required attribute.
 272          }
 273  
 274          if ( 1 === $checkbox_acceptance ) {
 275              $r['checked']  = 'checked';
 276              $r['readonly'] = 'readonly';
 277              $r['onclick']  = 'return false;';
 278          }
 279  
 280          $page_id = bp_xprofile_get_meta( $field_id, 'field', 'bp_xprofile_checkbox_acceptance_page', true );
 281          $page    = null;
 282          $html    = '';
 283  
 284          if ( $page_id ) {
 285              $page = get_post( $page_id );
 286          }
 287  
 288          if ( $page instanceof WP_Post ) {
 289              $html = sprintf(
 290                  '<div class="bp-xprofile-checkbox-acceptance-field"><input %1$s />%2$s</div>',
 291                  $this->get_edit_field_html_elements( $r ),
 292                  sprintf(
 293                      /* translators: %s: link to the page the user needs to accept the terms of. */
 294                      esc_html__( 'I agree to %s.', 'buddypress' ),
 295                      '<a href="' . esc_url( get_permalink( $page ) ) . '">' . esc_html( get_the_title( $page ) ) . '</a>'
 296                  )
 297              );
 298          }
 299  
 300          /**
 301           * Filter here to edit the HTML output.
 302           *
 303           * @since 8.0.0
 304           *
 305           * @param string $html                The HTML output.
 306           * @param int    $field_id            The field ID.
 307           * @param array  $r                   The edit field HTML elements data.
 308           * @param int    $checkbox_acceptance The field value.
 309           */
 310          echo apply_filters( 'bp_get_the_profile_field_checkbox_acceptance', $html, $field_id, $checkbox_acceptance );
 311      }
 312  
 313      /**
 314       * Enforces the field value if it has been already accepted.
 315       *
 316       * As it's always possible to edit HTML source and remove the `readonly="readonly"` attribute
 317       * of the checkbox, we may need to enforce the field value.
 318       *
 319       * @since 8.0.0
 320       *
 321       * @param mixed             $value Value passed to xprofile_set_field_data().
 322       * @param BP_XProfile_Field $field Field object.
 323       * @return mixed The field value.
 324       */
 325  	public function enforce_field_value( $value, BP_XProfile_Field $field ) {
 326          if ( 'checkbox_acceptance' === $field->type && 1 !== (int) $value && 1 === (int) $field->data->value ) {
 327              $value = 1;
 328          }
 329  
 330          return $value;
 331      }
 332  
 333      /**
 334       * Check if field is valid?
 335       *
 336       * @since 8.0.0
 337       *
 338       * @param string|int $values value.
 339       * @return bool
 340       */
 341  	public function is_valid( $value ) {
 342          if ( empty( $value ) || 1 === (int) $value ) {
 343              return true;
 344          }
 345  
 346          return false;
 347      }
 348  
 349      /**
 350       * Modify the appearance of value.
 351       *
 352       * @since 8.0.0
 353       *
 354       * @param string $field_value Original value of field.
 355       * @param int    $field_id field id.
 356       *
 357       * @return string   Value formatted
 358       */
 359  	public static function display_filter( $field_value, $field_id = 0 ) {
 360          $page_id = bp_xprofile_get_meta( $field_id, 'field', 'bp_xprofile_checkbox_acceptance_page', true );
 361          $page    = null;
 362          $html    = esc_html__( 'No', 'buddypress' );
 363  
 364          /* translators: %s: link to the page the user needs to accept the terms of. */
 365          $acceptance_text = esc_html__( 'I did not agree to %s', 'buddypress' );
 366  
 367          if ( $page_id ) {
 368              $page = get_post( $page_id );
 369          }
 370  
 371          if ( ! empty( $field_value ) ) {
 372              $html = esc_html__( 'Yes', 'buddypress' );
 373  
 374              /* translators: %s: link to the page the user needs to accept the terms of. */
 375              $acceptance_text = esc_html__( 'I agreed to %s.', 'buddypress' );
 376          }
 377  
 378          if ( $page instanceof WP_Post ) {
 379              $html = sprintf(
 380                  $acceptance_text,
 381                  '<a href="' . esc_url( get_permalink( $page ) ) . '">' . esc_html( get_the_title( $page ) ) . '</a>'
 382              );
 383          }
 384  
 385          return $html;
 386      }
 387  }


Generated: Sat Apr 27 01:00:55 2024 Cross-referenced by PHPXref 0.7.1