AnkietyGO/questions/components/core/form.php

409 lines
12 KiB
PHP
Raw Permalink Normal View History

<?php
/**
* Form base class
*
* Init Forms with this class to get information about it
*
* @author awesome.ug <contact@awesome.ug>
* @package Questions
* @version 2015-04-16
* @since 1.0.0
* @license GPL 2
*
* Copyright 2015 rheinschmiede (contact@awesome.ug)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2, as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class Questions_Form extends Questions_Post{
/**
* @var int $id Form Id
* @since 1.0.0
*/
public $id;
/**
* @var string $title Title of form
* @since 1.0.0
*/
public $title;
/**
* @var array $elements All elements of the form
* @since 1.0.0
*/
public $elements = array();
/**
* @todo Getting participiants out of form and hooking in
* @var array $participiants All elements of the form
* @since 1.0.0
*/
public $participiants = array();
/**
* @var int $splitter_count Counter for form splitters
* @since 1.0.0
*/
public $splitter_count = 0;
/**
* Constructor
* @param int $id The id of the form
* @since 1.0.0
*/
public function __construct( $id = NULL ) {
parent::__construct( $id );
if ( NULL != $id ) {
$this->populate( $id );
}
}
/**
* Populating class variables
*
* @param int $id The id of the form
* @since 1.0.0
*/
private function populate( $id ) {
$this->elements = array();
$form = get_post( $id );
$this->id = $id;
$this->title = $form->post_title;
$this->elements = $this->get_elements();
$this->participiants = $this->get_participiants();
}
/**
* Getting all element objects
*
* @param int $id The id of the form
* @return array $elements All element objects of the form
* @since 1.0.0
*/
public function get_elements( $id = NULL ) {
global $questions_global, $wpdb;
if ( NULL == $id ) {
$id = $this->id;
}
if ( '' == $id ) {
return FALSE;
}
$sql = $wpdb->prepare(
"SELECT * FROM {$questions_global->tables->questions} WHERE questions_id = %s ORDER BY sort ASC", $id
);
$results = $wpdb->get_results( $sql );
$elements = array();
// Running all elements which have been found
if ( is_array( $results ) ):
foreach ( $results AS $result ):
if ( class_exists( 'Questions_FormElement_' . $result->type ) ):
$class = 'Questions_FormElement_' . $result->type;
$object = new $class( $result->id );
$elements[ ] = $object; // Adding element
if ( $object->splits_form ):
$this->splitter_count ++;
endif;
else:
// If class do not exist -> Put in Error message here
endif;
endforeach;
endif;
return $elements;
}
/**
* Getting participiants
* @return array All participator ID's
*/
public function get_participiants(){
global $wpdb, $questions_global;
$sql = $wpdb->prepare( "SELECT user_id FROM {$questions_global->tables->participiants} WHERE survey_id = %d", $this->id );
$participiant_ids = $wpdb->get_col( $sql );
return $participiant_ids;
}
/**
* Get number of splits in survey
*
* @param int $form_id
* @return int $splitter_count
* @since 1.0.0
*/
public function get_step_count() {
return (int) $this->splitter_count;
}
/**
* Dublicating a form
* @param bool $copy_meta True if meta have to be copied
* @param bool $copy_comments True if comments have to be copied
* @param bool $copy_questions True if elements have to be copied
* @param bool $copy_answers True if answers of elements have to be copied
* @param bool $copy_participiants True if participiants have to be copied
* @param bool $draft True if dublicated form have to be a draft
* @return int
*/
public function duplicate( $copy_meta = TRUE, $copy_taxonomies = TRUE, $copy_comments = TRUE, $copy_elements = TRUE, $copy_answers = TRUE, $copy_participiants = TRUE, $draft = FALSE ){
$new_form_id = parent::duplicate( $copy_meta, $copy_taxonomies, $copy_comments, $draft );
if( $copy_elements ):
$this->duplicate_elements( $new_form_id, $copy_answers );
endif;
if( $copy_participiants ):
$this->duplicate_participiants( $new_form_id );
endif;
do_action( 'questions_duplicate_survey', $this->post, $new_form_id, $this->question_transfers, $this->answer_transfers );
return $new_form_id;
}
/**
* Dublicate Elements
* @param int $new_form_id Id of the form where elements have to be copied
* @param bool $copy_answers True if answers have to be copied
* @param bool $copy_settings True if settings have to be copied
* @return bool
*/
public function duplicate_elements( $new_form_id, $copy_answers = TRUE, $copy_settings = TRUE ){
global $wpdb, $questions_global;
if( empty( $new_form_id ) )
return FALSE;
// Dublicate answers
if( is_array( $this->elements ) && count( $this->elements ) ):
foreach( $this->elements AS $element ):
$old_question_id = $element->id;
$wpdb->insert(
$questions_global->tables->questions,
array(
'questions_id' => $new_form_id,
'question' => $element->question,
'sort' => $element->sort,
'type' => $element->slug
),
array(
'%d',
'%s',
'%d',
'%s'
)
);
$new_question_id = $wpdb->insert_id;
$this->question_transfers[ $old_question_id ] = $new_question_id;
// Dublicate answers
if( is_array( $element->answers ) && count( $element->answers ) && $copy_answers ):
foreach( $element->answers AS $answer ):
$old_answer_id = $answer[ 'id' ];
$wpdb->insert(
$questions_global->tables->answers,
array(
'question_id' => $new_question_id,
'answer' => $answer[ 'text' ],
'section' => $answer[ 'section' ],
'sort' => $answer[ 'sort' ]
),
array(
'%d',
'%s',
'%s',
'%d'
)
);
$new_answer_id = $wpdb->insert_id;
$this->answer_transfers[ $old_answer_id ] = $new_answer_id;
endforeach;
endif;
// Dublicate Settings
if( is_array( $element->settings ) && count( $element->settings ) && $copy_settings ):
foreach( $element->settings AS $name => $value ):
$wpdb->insert(
$questions_global->tables->settings,
array(
'question_id' => $new_question_id,
'name' => $name,
'value' => $value
),
array(
'%d',
'%s',
'%s'
)
);
endforeach;
endif;
do_action( 'questions_duplicate_form_question', $element, $new_question_id );
endforeach;
endif;
}
/**
* Dublicating participiants
* @param int $new_form_idint Id of the form where participiants have to be copied
* @return bool
*/
public function duplicate_participiants( $new_form_id ){
global $wpdb, $questions_global;
if( empty( $new_form_id ) )
return FALSE;
// Dublicate answers
if( is_array( $this->participiants ) && count( $this->participiants ) ):
foreach( $this->participiants AS $participiant_id ):
$wpdb->insert(
$questions_global->tables->participiants,
array(
'survey_id' => $new_form_id,
'user_id' => $participiant_id
),
array(
'%d',
'%d',
)
);
endforeach;
endif;
}
/**
* Deleting all results of a survey
* @return mixed
*/
public function delete_responses(){
global $wpdb, $questions_global;
$sql = $wpdb->prepare( "SELECT id FROM {$questions_global->tables->responds} WHERE questions_id = %s", $this->id );
$results = $wpdb->get_results( $sql );
// Putting results in array
if ( is_array( $results ) ):
foreach ( $results AS $result ):
$wpdb->delete( $questions_global->tables->respond_answers, array( 'respond_id' => $result->id ) );
endforeach;
endif;
return $wpdb->delete( $questions_global->tables->responds, array( 'questions_id' => $this->id ) );
}
/**
* Delete form
* @since 1.0.0
*/
public function delete() {
global $wpdb, $questions_global;
/**
* Responses
*/
$this->delete_responses();
$sql = $wpdb->prepare( "SELECT id FROM {$questions_global->tables->questions} WHERE questions_id=%d", $this->id );
$elements = $wpdb->get_col( $sql );
/**
* Answers & Settings
*/
if ( is_array( $elements ) && count( $elements ) > 0 ):
foreach ( $elements AS $question_id ):
$wpdb->delete(
$questions_global->tables->answers,
array( 'question_id' => $question_id )
);
$wpdb->delete(
$questions_global->tables->settings,
array( 'question_id' => $question_id )
);
do_action( 'questions_delete_element', $question_id, $this->id );
endforeach;
endif;
/**
* Elements
*/
$wpdb->delete(
$questions_global->tables->questions,
array( 'questions_id' => $this->id )
);
do_action( 'questions_delete_survey', $this->id );
/**
* Participiants
*/
$wpdb->delete(
$questions_global->tables->participiants,
array( 'survey_id' => $this->id )
);
}
}
/**
* Checks if a survey exists
* @param int $survey_id Survey id
* @return boolean $exists TRUE if survey exists, FALSE if not
*/
function qu_form_exists( $form_id ) {
global $wpdb;
$sql = $wpdb->prepare( "SELECT COUNT( ID ) FROM {$wpdb->prefix}posts WHERE ID = %d and post_type = 'questions'", $form_id );
$var = $wpdb->get_var( $sql );
if ( $var > 0 ) {
return TRUE;
}
return FALSE;
}