955 lines
29 KiB
PHP
955 lines
29 KiB
PHP
|
|
<?php
|
||
|
|
/*100% match*/
|
||
|
|
|
||
|
|
defined( 'ABSPATH' ) or die( "you do not have acces to this page!" );
|
||
|
|
|
||
|
|
if ( ! class_exists( "cmplz_tc_wizard" ) ) {
|
||
|
|
class cmplz_tc_wizard {
|
||
|
|
private static $_this;
|
||
|
|
public $position;
|
||
|
|
public $total_steps = false;
|
||
|
|
public $last_section;
|
||
|
|
public $page_url;
|
||
|
|
public $percentage_complete = false;
|
||
|
|
|
||
|
|
function __construct() {
|
||
|
|
if ( isset( self::$_this ) ) {
|
||
|
|
wp_die( sprintf( '%s is a singleton class and you cannot create a second instance.',
|
||
|
|
get_class( $this ) ) );
|
||
|
|
}
|
||
|
|
|
||
|
|
self::$_this = $this;
|
||
|
|
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) );
|
||
|
|
|
||
|
|
//callback from settings
|
||
|
|
add_action( 'cmplz_tc_terms-conditions_last_step', array( $this, 'wizard_last_step_callback' ), 10, 1 );
|
||
|
|
|
||
|
|
//link action to custom hook
|
||
|
|
add_action( 'cmplz_tc_terms-conditions_wizard', array( $this, 'wizard_after_step' ), 10, 1 );
|
||
|
|
|
||
|
|
//process custom hooks
|
||
|
|
add_action( 'admin_init', array( $this, 'process_custom_hooks' ) );
|
||
|
|
add_action( 'complianz_tc_before_save_terms-conditions_option', array( $this, 'before_save_wizard_option' ), 10, 4 );
|
||
|
|
add_action( 'complianz_tc_after_save_terms-conditions_option', array( $this, 'after_save_wizard_option' ), 10, 4 );
|
||
|
|
add_action( 'cmplz_tc_after_saved_all_fields', array( $this, 'after_saved_all_fields' ), 10, 1 );
|
||
|
|
add_action( 'cmplz_tc_last_step', array( $this, 'last_step_callback' ) );
|
||
|
|
}
|
||
|
|
|
||
|
|
static function this() {
|
||
|
|
return self::$_this;
|
||
|
|
}
|
||
|
|
|
||
|
|
public function process_custom_hooks() {
|
||
|
|
do_action( "cmplz_wizard_terms-conditions" );
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Initialize a page in the wizard
|
||
|
|
* @param $page
|
||
|
|
*/
|
||
|
|
public function initialize( $page ) {
|
||
|
|
$this->last_section = $this->last_section( $page, $this->step() );
|
||
|
|
$this->page_url = cmplz_tc_settings_page();
|
||
|
|
//if a post id was passed, we copy the contents of that page to the wizard settings.
|
||
|
|
if ( isset( $_GET['post_id'] ) ) {
|
||
|
|
$post_id = intval( $_GET['post_id'] );
|
||
|
|
//get all fields for this page
|
||
|
|
$fields = COMPLIANZ_TC::$config->fields( $page );
|
||
|
|
foreach ( $fields as $fieldname => $field ) {
|
||
|
|
$fieldvalue = get_post_meta( $post_id, $fieldname, true );
|
||
|
|
if ( $fieldvalue ) {
|
||
|
|
if ( ! COMPLIANZ_TC::$field->is_multiple_field( $fieldname ) ) {
|
||
|
|
COMPLIANZ_TC::$field->save_field( $fieldname, $fieldvalue );
|
||
|
|
} else {
|
||
|
|
$field[ $fieldname ] = $fieldvalue;
|
||
|
|
COMPLIANZ_TC::$field->save_multiple( $field );
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Some actions after the last step has been completed
|
||
|
|
*/
|
||
|
|
public function last_step_callback() {
|
||
|
|
if ( ! $this->all_required_fields_completed( 'terms-conditions' ) ) {
|
||
|
|
echo '<div class="cmplz-wizard-intro">';
|
||
|
|
_e( "Not all required fields are completed yet. Please check the steps to complete all required questions", 'complianz-terms-conditions' );
|
||
|
|
echo '</div>';
|
||
|
|
} else {
|
||
|
|
echo '<div class="cmplz-wizard-intro">' . __( "You're done! Here are some tips & tricks to use this document to your full advantage.", 'complianz-terms-conditions' ) . '</div>';
|
||
|
|
echo cmplz_tc_get_template('wizard/last-step.php');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Process completion of setup
|
||
|
|
*
|
||
|
|
* */
|
||
|
|
|
||
|
|
public function wizard_after_step() {
|
||
|
|
if ( ! cmplz_tc_user_can_manage() ) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
//clear document cache
|
||
|
|
COMPLIANZ_TC::$document->clear_shortcode_transients();
|
||
|
|
|
||
|
|
//when clicking to the last page, or clicking finish, run the finish sequence.
|
||
|
|
if ( isset( $_POST['cmplz-finish'] )
|
||
|
|
|| ( isset( $_POST["step"] ) && $_POST['step'] == 3
|
||
|
|
&& isset( $_POST['cmplz-next'] ) )
|
||
|
|
) {
|
||
|
|
$this->set_wizard_completed_once();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Do stuff before a page from the wizard is saved.
|
||
|
|
*
|
||
|
|
* */
|
||
|
|
|
||
|
|
public function before_save_wizard_option(
|
||
|
|
$fieldname, $fieldvalue, $prev_value, $type
|
||
|
|
) {
|
||
|
|
|
||
|
|
update_option( 'cmplz_tc_documents_update_date', time() );
|
||
|
|
|
||
|
|
//only run when changes have been made
|
||
|
|
if ( $fieldvalue === $prev_value ) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Handle some custom options after saving the wizard options
|
||
|
|
*
|
||
|
|
* After all fields have been saved
|
||
|
|
* @param $posted_fields
|
||
|
|
*/
|
||
|
|
|
||
|
|
public function after_saved_all_fields($posted_fields){
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Handle some custom options after saving the wizard options
|
||
|
|
* @param string $fieldname
|
||
|
|
* @param mixed $fieldvalue
|
||
|
|
* @param mixed $prev_value
|
||
|
|
* @param string $type
|
||
|
|
*/
|
||
|
|
|
||
|
|
public function after_save_wizard_option( $fieldname, $fieldvalue, $prev_value, $type ) {
|
||
|
|
//only run when changes have been made
|
||
|
|
if ( $fieldvalue === $prev_value ) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
//if languages have been changed, we update the withdrawal form, if those should be generated.
|
||
|
|
if ( $fieldname === 'language_communication' || $fieldname === 'address_company' || $fieldname === 'multilanguage_communication' ) {
|
||
|
|
$languages = cmplz_tc_get_value('multilanguage_communication');
|
||
|
|
if ( !empty($languages) ) {
|
||
|
|
$languages = array_filter($languages);
|
||
|
|
update_option( 'cmplz_generate_pdf_languages', $languages );
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( $fieldname === 'language_communication' ) {
|
||
|
|
$languages = array(cmplz_tc_sanitize_language( get_locale() ));
|
||
|
|
$languages = array_filter($languages);
|
||
|
|
update_option( 'cmplz_generate_pdf_languages', $languages );
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get the next step with fields in it
|
||
|
|
* @param string $page
|
||
|
|
* @param int $step
|
||
|
|
*
|
||
|
|
* @return int
|
||
|
|
*/
|
||
|
|
public function get_next_not_empty_step( $page, $step ) {
|
||
|
|
if ( ! COMPLIANZ_TC::$field->step_has_fields( $page, $step ) ) {
|
||
|
|
if ( $step >= $this->total_steps( $page ) ) {
|
||
|
|
return $step;
|
||
|
|
}
|
||
|
|
$step ++;
|
||
|
|
$step = $this->get_next_not_empty_step( $page, $step );
|
||
|
|
}
|
||
|
|
|
||
|
|
return $step;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get the next section which is not empty
|
||
|
|
* @param string $page
|
||
|
|
* @param int $step
|
||
|
|
* @param int $section
|
||
|
|
*
|
||
|
|
* @return int|bool
|
||
|
|
*/
|
||
|
|
public function get_next_not_empty_section( $page, $step, $section ) {
|
||
|
|
if ( ! COMPLIANZ_TC::$field->step_has_fields( $page, $step,
|
||
|
|
$section )
|
||
|
|
) {
|
||
|
|
//some keys are missing, so we need to count the actual number of keys.
|
||
|
|
if ( isset( COMPLIANZ_TC::$config->steps[ $page ][ $step ]['sections'] ) ) {
|
||
|
|
$n = array_keys( COMPLIANZ_TC::$config->steps[ $page ][ $step ]['sections'] ); //<---- Grab all the keys of your actual array and put in another array
|
||
|
|
$count = array_search( $section, $n ); //<--- Returns the position of the offset from this array using search
|
||
|
|
|
||
|
|
//this is the actual list up to section key.
|
||
|
|
$new_arr = array_slice( COMPLIANZ_TC::$config->steps[ $page ][ $step ]['sections'], 0, $count + 1, true );//<--- Slice it with the 0 index as start and position+1 as the length parameter.
|
||
|
|
$section_count = count( $new_arr ) + 1;
|
||
|
|
} else {
|
||
|
|
$section_count = $section + 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
$section ++;
|
||
|
|
|
||
|
|
if ( $section_count > $this->total_sections( $page, $step ) ) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
$section = $this->get_next_not_empty_section( $page, $step, $section );
|
||
|
|
}
|
||
|
|
|
||
|
|
return $section;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get previous step which is not empty
|
||
|
|
*
|
||
|
|
* @param string $page
|
||
|
|
* @param int $step
|
||
|
|
*
|
||
|
|
* @return int
|
||
|
|
*/
|
||
|
|
public function get_previous_not_empty_step( $page, $step ) {
|
||
|
|
if ( ! COMPLIANZ_TC::$field->step_has_fields( $page, $step ) ) {
|
||
|
|
if ( $step <= 1 ) {
|
||
|
|
return $step;
|
||
|
|
}
|
||
|
|
$step --;
|
||
|
|
$step = $this->get_previous_not_empty_step( $page, $step );
|
||
|
|
}
|
||
|
|
|
||
|
|
return $step;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get previous section which is not empty
|
||
|
|
* @param string $page
|
||
|
|
* @param int $step
|
||
|
|
* @param int $section
|
||
|
|
*
|
||
|
|
* @return false|int
|
||
|
|
*/
|
||
|
|
public function get_previous_not_empty_section( $page, $step, $section
|
||
|
|
) {
|
||
|
|
|
||
|
|
if ( ! COMPLIANZ_TC::$field->step_has_fields( $page, $step,
|
||
|
|
$section )
|
||
|
|
) {
|
||
|
|
$section --;
|
||
|
|
if ( $section < 1 ) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
$section = $this->get_previous_not_empty_section( $page, $step,
|
||
|
|
$section );
|
||
|
|
}
|
||
|
|
|
||
|
|
return $section;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Lock the wizard for further use while it's being edited by the current user.
|
||
|
|
*
|
||
|
|
*
|
||
|
|
* */
|
||
|
|
|
||
|
|
public function lock_wizard() {
|
||
|
|
$user_id = get_current_user_id();
|
||
|
|
set_transient( 'cmplz_wizard_locked_by_user', $user_id, apply_filters( "cmplz_wizard_lock_time", 2 * MINUTE_IN_SECONDS ) );
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Check if the wizard is locked by another user
|
||
|
|
*
|
||
|
|
*
|
||
|
|
* */
|
||
|
|
|
||
|
|
public function wizard_is_locked() {
|
||
|
|
$user_id = get_current_user_id();
|
||
|
|
$lock_user_id = $this->get_lock_user();
|
||
|
|
if ( $lock_user_id && $lock_user_id != $user_id ) {
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get user which is locking the wizard
|
||
|
|
* @return false|int
|
||
|
|
*/
|
||
|
|
public function get_lock_user() {
|
||
|
|
return get_transient( 'cmplz_wizard_locked_by_user' );
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Render wizard
|
||
|
|
* @param string $page
|
||
|
|
* @param string $wizard_title
|
||
|
|
*/
|
||
|
|
public function wizard( $page, $wizard_title = '' )
|
||
|
|
{
|
||
|
|
|
||
|
|
if (!cmplz_tc_user_can_manage()) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if ($this->wizard_is_locked()) {
|
||
|
|
$user_id = $this->get_lock_user();
|
||
|
|
$user = get_user_by("id", $user_id);
|
||
|
|
$lock_time = apply_filters("cmplz_wizard_lock_time",
|
||
|
|
2 * MINUTE_IN_SECONDS) / 60;
|
||
|
|
|
||
|
|
cmplz_tc_notice(sprintf(__("The wizard is currently being edited by %s",
|
||
|
|
'complianz-terms-conditions'), $user->user_nicename) . '<br>'
|
||
|
|
. sprintf(__("If this user stops editing, the lock will expire after %s minutes.",
|
||
|
|
'complianz-terms-conditions'), $lock_time), 'warning');
|
||
|
|
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
//lock the wizard for other users.
|
||
|
|
$this->lock_wizard();
|
||
|
|
|
||
|
|
|
||
|
|
$this->initialize($page);
|
||
|
|
|
||
|
|
$section = $this->section();
|
||
|
|
$step = $this->step();
|
||
|
|
|
||
|
|
if ($this->section_is_empty($page, $step, $section)
|
||
|
|
|| (isset($_POST['cmplz-next'])
|
||
|
|
&& !COMPLIANZ_TC::$field->has_errors())
|
||
|
|
) {
|
||
|
|
if (COMPLIANZ_TC::$config->has_sections($page, $step)
|
||
|
|
&& ($section < $this->last_section)
|
||
|
|
) {
|
||
|
|
$section = $section + 1;
|
||
|
|
} else {
|
||
|
|
$step++;
|
||
|
|
$section = $this->first_section($page, $step);
|
||
|
|
}
|
||
|
|
|
||
|
|
$step = $this->get_next_not_empty_step($page, $step);
|
||
|
|
$section = $this->get_next_not_empty_section($page, $step,
|
||
|
|
$section);
|
||
|
|
//if the last section is also empty, it will return false, so we need to skip the step too.
|
||
|
|
if (!$section) {
|
||
|
|
$step = $this->get_next_not_empty_step($page,
|
||
|
|
$step + 1);
|
||
|
|
$section = 1;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (isset($_POST['cmplz-previous'])) {
|
||
|
|
if (COMPLIANZ_TC::$config->has_sections($page, $step)
|
||
|
|
&& $section > $this->first_section($page, $step)
|
||
|
|
) {
|
||
|
|
$section--;
|
||
|
|
} else {
|
||
|
|
$step--;
|
||
|
|
$section = $this->last_section($page, $step);
|
||
|
|
}
|
||
|
|
|
||
|
|
$step = $this->get_previous_not_empty_step($page, $step);
|
||
|
|
$section = $this->get_previous_not_empty_section($page, $step,
|
||
|
|
$section);
|
||
|
|
}
|
||
|
|
|
||
|
|
$menu = $this->wizard_menu( $page, $wizard_title, $step, $section );
|
||
|
|
$content = $this->wizard_content($page, $step, $section );
|
||
|
|
|
||
|
|
$args = array(
|
||
|
|
'page' => 'terms-conditions',
|
||
|
|
'content' => $menu.$content,
|
||
|
|
);
|
||
|
|
echo cmplz_tc_get_template('admin_wrap.php', $args );
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Render Wizard menu
|
||
|
|
* @param string $page
|
||
|
|
* @param string $wizard_title
|
||
|
|
* @param int $active_step
|
||
|
|
* @param int $active_section
|
||
|
|
*
|
||
|
|
* @return false|string
|
||
|
|
*/
|
||
|
|
public function wizard_menu( $page, $wizard_title, $active_step, $active_section )
|
||
|
|
{
|
||
|
|
$args_menu['steps'] = "";
|
||
|
|
for ($i = 1; $i <= $this->total_steps($page); $i++)
|
||
|
|
{
|
||
|
|
$args['title'] = $i . '. ' . COMPLIANZ_TC::$config->steps[$page][$i]['title'];
|
||
|
|
$args['active'] = ($i == $active_step) ? 'active' : '';
|
||
|
|
$args['completed'] = $this->required_fields_completed($page, $i, false) ? 'complete' : 'incomplete';
|
||
|
|
$args['url'] = add_query_arg(array('step' => $i), $this->page_url);
|
||
|
|
if ($this->post_id())
|
||
|
|
{
|
||
|
|
$args['url'] = add_query_arg(array('post_id' => $this->post_id()), $args['url']);
|
||
|
|
}
|
||
|
|
$args['sections'] = ($args['active'] == 'active') ? $this->wizard_sections($page, $active_step, $active_section) : '';
|
||
|
|
|
||
|
|
$args_menu['steps'] .= cmplz_tc_get_template( 'wizard/step.php' , $args);
|
||
|
|
}
|
||
|
|
$args_menu['percentage-complete'] = $this->wizard_percentage_complete(false);
|
||
|
|
$args_menu['title'] = !empty( $wizard_title ) ? '<div class="cmplz-wizard-subtitle"><h2>' . $wizard_title . '</h2></div>': '' ;
|
||
|
|
|
||
|
|
return cmplz_tc_get_template( 'wizard/menu.php', $args_menu );
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @param string $page
|
||
|
|
* @param int $step
|
||
|
|
* @param int $active_section
|
||
|
|
*
|
||
|
|
* @return string
|
||
|
|
*/
|
||
|
|
public function wizard_sections( $page, $step, $active_section ) {
|
||
|
|
$sections = "";
|
||
|
|
|
||
|
|
if ( COMPLIANZ_TC::$config->has_sections( $page, $step )) {
|
||
|
|
|
||
|
|
for ($i = $this->first_section( $page, $step ); $i <= $this->last_section( $page, $step ); $i ++) {
|
||
|
|
$icon = cmplz_tc_icon('circle', 'disabled', '', 11);
|
||
|
|
|
||
|
|
if ( $this->section_is_empty( $page, $step, $i ) ) continue;
|
||
|
|
if ( $i < $this->get_next_not_empty_section( $page, $step, $i ) ) continue;
|
||
|
|
|
||
|
|
$active = ( $i == $active_section ) ? 'active' : '';
|
||
|
|
if ( $active == 'active' ) {
|
||
|
|
$icon = cmplz_tc_icon('chevron-right', 'default', '', 11);
|
||
|
|
} else if ($this->required_fields_completed( $page, $step, $i )) {
|
||
|
|
$icon = cmplz_tc_icon('check', 'success', '', 11);
|
||
|
|
}
|
||
|
|
|
||
|
|
$completed = ( $this->required_fields_completed( $page, $step, $i ) ) ? "cmplz-done" : "cmplz-to-do";
|
||
|
|
$url = add_query_arg( array('step' => $step, 'section' => $i), $this->page_url );
|
||
|
|
if ( $this->post_id() ) {
|
||
|
|
$url = add_query_arg( array( 'post_id' => $this->post_id() ), $url );
|
||
|
|
}
|
||
|
|
|
||
|
|
$title = COMPLIANZ_TC::$config->steps[ $page ][ $step ]['sections'][ $i ]['title'];
|
||
|
|
$regions = $this->get_section_regions( $page, $step, $i );
|
||
|
|
$title .= $regions ? ' - ' . implode( ' | ', $regions ) : '';
|
||
|
|
$args = array(
|
||
|
|
'active' => $active,
|
||
|
|
'completed' => $completed,
|
||
|
|
'icon' => $icon,
|
||
|
|
'url' => $url,
|
||
|
|
'title' => $title,
|
||
|
|
);
|
||
|
|
$sections .= cmplz_tc_get_template( 'wizard/section.php', $args );
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return $sections;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Render wizard content
|
||
|
|
* @param string $page
|
||
|
|
* @param int $step
|
||
|
|
* @param int $section
|
||
|
|
*
|
||
|
|
* @return false|string
|
||
|
|
*/
|
||
|
|
public function wizard_content( $page, $step, $section ) {
|
||
|
|
|
||
|
|
$args['title'] = '';
|
||
|
|
if (isset(COMPLIANZ_TC::$config->steps[$page][$step]['sections'][$section]['title'])) {
|
||
|
|
$args['title'] = COMPLIANZ_TC::$config->steps[$page][$step]['sections'][$section]['title'];
|
||
|
|
$regions = $this->get_section_regions($page, $step, $section);
|
||
|
|
$args['title'] .= $regions ? ' - ' . implode(' | ', $regions) : '';
|
||
|
|
} else {
|
||
|
|
$args['title'] .= COMPLIANZ_TC::$config->steps[$page][$step]['title'];
|
||
|
|
}
|
||
|
|
$args['flags'] = '';
|
||
|
|
$args['save_notice'] = '';
|
||
|
|
$args['save_as_notice'] = '';
|
||
|
|
$args['learn_notice'] = '';
|
||
|
|
$args['cookie_or_finish_button'] = '';
|
||
|
|
$args['previous_button'] = '';
|
||
|
|
$args['next_button'] = '';
|
||
|
|
$args['save_button'] = '';
|
||
|
|
if ( isset( $_POST['cmplz-save'] ) ) {
|
||
|
|
$args['save_notice'] = cmplz_tc_notice( __( "Changes saved", 'complianz-terms-conditions' ), 'success', true , false);
|
||
|
|
}
|
||
|
|
|
||
|
|
$args['intro'] = $this->get_intro( $page, $step, $section );
|
||
|
|
$args['page_url'] = $this->page_url;
|
||
|
|
$args['page'] = $page;
|
||
|
|
$args['post_id'] = $this->post_id() ? '<input type="hidden" value="' . $this->post_id() . '" name="post_id">' : '';
|
||
|
|
|
||
|
|
ob_start();
|
||
|
|
COMPLIANZ_TC::$field->get_fields( $page, $step, $section );
|
||
|
|
$args['fields'] = ob_get_clean();
|
||
|
|
|
||
|
|
$args['step'] = $step;
|
||
|
|
$args['section'] = $section;
|
||
|
|
|
||
|
|
if ( $step > 1 || $section > 1 ) {
|
||
|
|
$args['previous_button'] = '<input class="button button-link cmplz-previous" type="submit" name="cmplz-previous" value="'. __( "Previous", 'complianz-terms-conditions' ) . '">';
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( $step < $this->total_steps( $page ) ) {
|
||
|
|
$args['next_button'] = '<input class="button button-primary cmplz-next" type="submit" name="cmplz-next" value="'. __( "Next", 'complianz-terms-conditions' ) . '">';
|
||
|
|
}
|
||
|
|
|
||
|
|
$other_plugins = "";
|
||
|
|
if ( $step > 0 && $step < $this->total_steps( $page )) {
|
||
|
|
$args['save_button'] = '<input class="button button-secondary cmplz-save" type="submit" name="cmplz-save" value="'. __( "Save", 'complianz-terms-conditions' ) . '">';
|
||
|
|
} else if ($step === $this->total_steps( $page )) {
|
||
|
|
$other_plugins = cmplz_tc_get_template('wizard/other-plugins.php');
|
||
|
|
$page_id = COMPLIANZ_TC::$document->get_shortcode_page_id('terms-conditions');
|
||
|
|
$link = get_permalink($page_id);
|
||
|
|
if ( !$link ) {
|
||
|
|
$link = add_query_arg(array( 'step' => 3), cmplz_tc_settings_page());
|
||
|
|
$args['save_button'] = '<a class="button button-primary cmplz-save" href="'.$link.'" type="button" name="cmplz-save">'. sprintf(__( "Create %s", 'complianz-terms-conditions' ) , __("Terms & Conditions", "complianz-terms-conditions")). '</a>';
|
||
|
|
} else {
|
||
|
|
$args['save_button'] = '<a class="button button-primary cmplz-save" target="_blank" href="'.$link.'" type="button" name="cmplz-save">'. sprintf(__( "Open %s", 'complianz-terms-conditions' ) , __("Terms & Conditions", "complianz-terms-conditions")). '</a>';
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return cmplz_tc_get_template( 'wizard/content.php', $args ).$other_plugins;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* If a section does not contain any fields to be filled, just drop it from the menu.
|
||
|
|
* @return bool
|
||
|
|
*
|
||
|
|
* */
|
||
|
|
|
||
|
|
public function section_is_empty( $page, $step, $section ) {
|
||
|
|
$section_compare = $this->get_next_not_empty_section( $page, $step,
|
||
|
|
$section );
|
||
|
|
if ( $section != $section_compare ) {
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Enqueue assets
|
||
|
|
* @param $hook
|
||
|
|
*/
|
||
|
|
public function enqueue_assets( $hook ) {
|
||
|
|
$minified = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
|
||
|
|
|
||
|
|
if ( strpos( $hook, 'terms-conditions' ) === false ) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
wp_register_style( 'cmplz-tc-terms-conditions', cmplz_tc_url . "assets/css/wizard$minified.css", false, cmplz_tc_version );
|
||
|
|
wp_enqueue_style( 'cmplz-tc-terms-conditions' );
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Foreach required field, check if it's been answered
|
||
|
|
* if section is false, check all fields of the step.
|
||
|
|
* @param string $page
|
||
|
|
* @param int $step
|
||
|
|
* @param int $section
|
||
|
|
*
|
||
|
|
* @return bool
|
||
|
|
*/
|
||
|
|
|
||
|
|
|
||
|
|
public function required_fields_completed( $page, $step, $section ) {
|
||
|
|
//get all required fields for this section, and check if they're filled in
|
||
|
|
$fields = COMPLIANZ_TC::$config->fields( $page, $step, $section );
|
||
|
|
|
||
|
|
//get
|
||
|
|
$fields = cmplz_tc_array_filter_multidimensional( $fields, 'required',
|
||
|
|
true );
|
||
|
|
foreach ( $fields as $fieldname => $args ) {
|
||
|
|
//if a condition exists, only check for this field if the condition applies.
|
||
|
|
if ( isset( $args['condition'] )
|
||
|
|
|| isset( $args['callback_condition'] )
|
||
|
|
&& ! COMPLIANZ_TC::$field->condition_applies( $args )
|
||
|
|
) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
$value = COMPLIANZ_TC::$field->get_value( $fieldname );
|
||
|
|
if ( empty( $value ) ) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
public function all_required_fields_completed_wizard(){
|
||
|
|
return $this->all_required_fields_completed('terms-conditions');
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Check if all required fields are filled
|
||
|
|
* @return bool
|
||
|
|
*
|
||
|
|
* */
|
||
|
|
|
||
|
|
public function all_required_fields_completed( $page ) {
|
||
|
|
for ( $step = 1; $step <= $this->total_steps( $page ); $step ++ ) {
|
||
|
|
if ( COMPLIANZ_TC::$config->has_sections( $page, $step ) ) {
|
||
|
|
for (
|
||
|
|
$section = $this->first_section( $page, $step );
|
||
|
|
$section <= $this->last_section( $page, $step );
|
||
|
|
$section ++
|
||
|
|
) {
|
||
|
|
if ( ! $this->required_fields_completed( $page, $step,
|
||
|
|
$section )
|
||
|
|
) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
if ( ! $this->required_fields_completed( $page, $step,
|
||
|
|
false )
|
||
|
|
) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
*
|
||
|
|
* Get the current selected post id for documents
|
||
|
|
* @return int
|
||
|
|
*
|
||
|
|
* */
|
||
|
|
|
||
|
|
public function post_id() {
|
||
|
|
$post_id = false;
|
||
|
|
if ( isset( $_GET['post_id'] ) || isset( $_POST['post_id'] ) ) {
|
||
|
|
$post_id = ( isset( $_GET['post_id'] ) )
|
||
|
|
? intval( $_GET['post_id'] ) : intval( $_POST['post_id'] );
|
||
|
|
}
|
||
|
|
|
||
|
|
return $post_id;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get a notice style header with an intro above a step or section
|
||
|
|
*
|
||
|
|
* @param string $page
|
||
|
|
* @param int $step
|
||
|
|
* @param int $section
|
||
|
|
*
|
||
|
|
* @return string
|
||
|
|
*/
|
||
|
|
|
||
|
|
public function get_intro( $page, $step, $section ) {
|
||
|
|
//only show when in action
|
||
|
|
$intro = '';
|
||
|
|
if ( COMPLIANZ_TC::$config->has_sections( $page, $step ) ) {
|
||
|
|
if ( isset( COMPLIANZ_TC::$config->steps[ $page ][ $step ]['sections'][ $section ]['intro'] ) ) {
|
||
|
|
$intro .= COMPLIANZ_TC::$config->steps[ $page ][ $step ]['sections'][ $section ]['intro'];
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
if ( isset( COMPLIANZ_TC::$config->steps[ $page ][ $step ]['intro'] ) ) {
|
||
|
|
$intro .= COMPLIANZ_TC::$config->steps[ $page ][ $step ]['intro'];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( strlen( $intro ) > 0 ) {
|
||
|
|
$intro = '<div class="cmplz-wizard-intro">'
|
||
|
|
. $intro
|
||
|
|
. '</div>';
|
||
|
|
}
|
||
|
|
|
||
|
|
return $intro;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Retrieves the region to which this step applies
|
||
|
|
*
|
||
|
|
* @param $page
|
||
|
|
* @param $step
|
||
|
|
* @param $section
|
||
|
|
*
|
||
|
|
* @return array|bool
|
||
|
|
*/
|
||
|
|
public function get_section_regions( $page, $step, $section ) {
|
||
|
|
//only show when in action
|
||
|
|
$regions = false;
|
||
|
|
|
||
|
|
if ( COMPLIANZ_TC::$config->has_sections( $page, $step ) ) {
|
||
|
|
if ( isset( COMPLIANZ_TC::$config->steps[ $page ][ $step ]['sections'][ $section ]['region'] ) ) {
|
||
|
|
$regions
|
||
|
|
= COMPLIANZ_TC::$config->steps[ $page ][ $step ]['sections'][ $section ]['region'];
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
if ( isset( COMPLIANZ_TC::$config->steps[ $page ][ $step ]['region'] ) ) {
|
||
|
|
$regions
|
||
|
|
= COMPLIANZ_TC::$config->steps[ $page ][ $step ]['region'];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( $regions ) {
|
||
|
|
if ( ! is_array( $regions ) ) {
|
||
|
|
$regions = array( $regions );
|
||
|
|
}
|
||
|
|
|
||
|
|
foreach ( $regions as $index => $region ) {
|
||
|
|
if ( ! cmplz_has_region( $region ) ) {
|
||
|
|
unset( $regions[ $index ] );
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if ( count( $regions ) == 0 ) {
|
||
|
|
$regions = false;
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
if ( $regions ) {
|
||
|
|
$regions = array_map( 'strtoupper', $regions );
|
||
|
|
}
|
||
|
|
|
||
|
|
return $regions;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
public function get_type( $post_id = false ) {
|
||
|
|
$page = false;
|
||
|
|
if ( $post_id ) {
|
||
|
|
$region = COMPLIANZ_TC::$document->get_region( $post_id );
|
||
|
|
$post_type = get_post_type( $post_id );
|
||
|
|
$page = str_replace( 'cmplz-', '', $post_type ) . '-'
|
||
|
|
. $region;
|
||
|
|
}
|
||
|
|
if ( isset( $_GET['page'] ) ) {
|
||
|
|
$page = str_replace( 'cmplz-', '',
|
||
|
|
sanitize_title( $_GET['page'] ) );
|
||
|
|
}
|
||
|
|
|
||
|
|
return $page;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
public function wizard_completed_once() {
|
||
|
|
return get_option( 'cmplz_wizard_completed_once' );
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
public function set_wizard_completed_once() {
|
||
|
|
update_option( 'cmplz_wizard_completed_once', true );
|
||
|
|
}
|
||
|
|
|
||
|
|
public function step( $page = false ) {
|
||
|
|
$step = 1;
|
||
|
|
if ( ! $page ) {
|
||
|
|
$page = 'terms-conditions';
|
||
|
|
}
|
||
|
|
|
||
|
|
$total_steps = $this->total_steps( $page );
|
||
|
|
|
||
|
|
if ( isset( $_GET["step"] ) ) {
|
||
|
|
$step = intval( $_GET['step'] );
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( isset( $_POST["step"] ) ) {
|
||
|
|
$step = intval( $_POST['step'] );
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( $step > $total_steps ) {
|
||
|
|
$step = $total_steps;
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( $step <= 1 ) {
|
||
|
|
$step = 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
return $step;
|
||
|
|
}
|
||
|
|
|
||
|
|
public function section() {
|
||
|
|
$section = 1;
|
||
|
|
if ( isset( $_GET["section"] ) ) {
|
||
|
|
$section = intval( $_GET['section'] );
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( isset( $_POST["section"] ) ) {
|
||
|
|
$section = intval( $_POST['section'] );
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( $section > $this->last_section ) {
|
||
|
|
$section = $this->last_section;
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( $section <= 1 ) {
|
||
|
|
$section = 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
return $section;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get total number of steps for a page
|
||
|
|
*
|
||
|
|
* @param $page
|
||
|
|
*
|
||
|
|
* @return int
|
||
|
|
*/
|
||
|
|
|
||
|
|
public function total_steps( $page ) {
|
||
|
|
return count( COMPLIANZ_TC::$config->steps[ $page ] );
|
||
|
|
}
|
||
|
|
|
||
|
|
public function total_sections( $page, $step ) {
|
||
|
|
if ( ! isset( COMPLIANZ_TC::$config->steps[ $page ][ $step ]['sections'] ) ) {
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
return count( COMPLIANZ_TC::$config->steps[ $page ][ $step ]['sections'] );
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
public function last_section( $page, $step ) {
|
||
|
|
if ( ! isset( COMPLIANZ_TC::$config->steps[ $page ][ $step ]["sections"] ) ) {
|
||
|
|
return 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
$array = COMPLIANZ_TC::$config->steps[ $page ][ $step ]["sections"];
|
||
|
|
|
||
|
|
return max( array_keys( $array ) );
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
public function first_section( $page, $step ) {
|
||
|
|
if ( ! isset( COMPLIANZ_TC::$config->steps[ $page ][ $step ]["sections"] ) ) {
|
||
|
|
return 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
$arr = COMPLIANZ_TC::$config->steps[ $page ][ $step ]["sections"];
|
||
|
|
$first_key = key( $arr );
|
||
|
|
|
||
|
|
return $first_key;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
public function remaining_time( $page, $step, $section = false ) {
|
||
|
|
|
||
|
|
//get remaining steps including this one
|
||
|
|
$time = 0;
|
||
|
|
$total_steps = $this->total_steps( $page );
|
||
|
|
for ( $i = $total_steps; $i >= $step; $i -- ) {
|
||
|
|
$sub = 0;
|
||
|
|
|
||
|
|
//if we're on a step with sections, we should add the sections that still need to be done.
|
||
|
|
if ( ( $step == $i )
|
||
|
|
&& COMPLIANZ_TC::$config->has_sections( $page, $step )
|
||
|
|
) {
|
||
|
|
|
||
|
|
for (
|
||
|
|
$s = $this->last_section( $page, $i ); $s >= $section;
|
||
|
|
$s --
|
||
|
|
) {
|
||
|
|
$subsub = 0;
|
||
|
|
$section_fields = COMPLIANZ_TC::$config->fields( $page,
|
||
|
|
$step, $s );
|
||
|
|
foreach (
|
||
|
|
$section_fields as $section_fieldname =>
|
||
|
|
$section_field
|
||
|
|
) {
|
||
|
|
if ( isset( $section_field['time'] ) ) {
|
||
|
|
$sub += $section_field['time'];
|
||
|
|
$subsub += $section_field['time'];
|
||
|
|
$time += $section_field['time'];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
$fields = COMPLIANZ_TC::$config->fields( $page, $i, false );
|
||
|
|
|
||
|
|
foreach ( $fields as $fieldname => $field ) {
|
||
|
|
if ( isset( $field['time'] ) ) {
|
||
|
|
$sub += $field['time'];
|
||
|
|
$time += $field['time'];
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return round( $time + 0.45 );
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
*
|
||
|
|
* Check which percentage of the wizard is completed
|
||
|
|
* @param bool $count_warnings
|
||
|
|
*
|
||
|
|
* @return int
|
||
|
|
* */
|
||
|
|
|
||
|
|
|
||
|
|
public function wizard_percentage_complete( $count_warnings = true )
|
||
|
|
{
|
||
|
|
//store to make sure it only runs once.
|
||
|
|
if ( $this->percentage_complete !== false ) {
|
||
|
|
return $this->percentage_complete;
|
||
|
|
}
|
||
|
|
$total_fields = 0;
|
||
|
|
$completed_fields = 0;
|
||
|
|
$total_steps = $this->total_steps( 'terms-conditions' );
|
||
|
|
for ( $i = 1; $i <= $total_steps; $i ++ ) {
|
||
|
|
$fields = COMPLIANZ_TC::$config->fields( 'terms-conditions', $i, false );
|
||
|
|
foreach ( $fields as $fieldname => $field ) {
|
||
|
|
//is field required
|
||
|
|
$required = isset( $field['required'] ) ? $field['required'] : false;
|
||
|
|
if ( ( isset( $field['condition'] ) || isset( $field['callback_condition'] ) ) && ! COMPLIANZ_TC::$field->condition_applies( $field )
|
||
|
|
) {
|
||
|
|
$required = false;
|
||
|
|
}
|
||
|
|
if ( $required ) {
|
||
|
|
$value = cmplz_tc_get_value( $fieldname, false, false );
|
||
|
|
$total_fields ++;
|
||
|
|
if ( ! empty( $value ) ) {
|
||
|
|
$completed_fields ++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
$pages = COMPLIANZ_TC::$document->get_required_pages();
|
||
|
|
foreach ( $pages as $region => $region_pages ) {
|
||
|
|
foreach ( $region_pages as $type => $page ) {
|
||
|
|
if ( COMPLIANZ_TC::$document->page_exists($type) ) {
|
||
|
|
$completed_fields ++;
|
||
|
|
}
|
||
|
|
$total_fields ++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
$percentage = round( 100 * ( $completed_fields / $total_fields ) + 0.45 );
|
||
|
|
$this->percentage_complete = $percentage;
|
||
|
|
return $percentage;
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
} //class closure
|